使用uboot去挂载根文件系统
- 格式:doc
- 大小:633.00 KB
- 文档页数:12
根文件系统(rootfs)展开全文一、根文件系统的作用是linux挂载的第一个文件系统,rootfs包含shell命令、linux系统配置文件(文件系统的挂载、网络服务、用户名、主机名、用户密码、环境变量...)、linux应用程序、应用程序处理的数据、独立的驱动模块(*.ko)。
根文件系统,相当于linux内核外围的一个应用环境。
====================================== ========================================= =========================二、控制台输出:[ 4.183226] yaffs: dev is 32505860 name is "mtdblock4" rw //存放rootfs的设备名字mtdblock4 ,rw可读写[ 4.183291] yaffs: passed flags ""[ 4.337878] VFS: Mounted root (yaffs filesystem) on device 31:4. //31:4 --》主设备:次设备号[ 4.338028] Freeing init memory: 536K ---->rootfs挂载成功,释放内核中一些初始化函数所占用的内存[ 4.357023] usb 1-1: New USB device found, idVendor=1a40, idProduct=0101[ 4.357083] usb 1-1: New USB device strings: Mfr=0, Product=1, SerialNumber=0[ 4.357145] usb 1-1: Product: USB 2.0 Hub[ 4.357747] hub 1-1:1.0: USB hub found[ 4.357852] hub 1-1:1.0: 4 ports detected[ 5.886184] smdkc110-rtc smdkc110-rtc: rtc disabled, re-enabling[ 6.086924] eth0: link down[ 6.087198] ADDRCONF(NETDEV_UP): eth0: link is not ready[root@YueQian /]#[root@YueQian /]#[root@YueQian /]#[root@YueQian /]#最小的根文件系统的内容:# ls /bin home media proc sys usrdev lib mnt root tmp varetc lost+found opt sbin====================================== ========================================= =========================三、根文件系统启动过程1、uboot的启动参数:init=/linuxrcinit是linux运行时的第一个进程,该进程执行的是/linuxrc 其中linuxrc -> bin/busyboxinit=/sbin/init 其中:init -> ../bin/busybox--------------------------------------------------------------------------------------------------------2、内核启动后,首先通过vfs去挂在rootfs,然后再执行init=/linuxrc ,linuxrc是busybox这个工作生成的文件。
《uboot环境变量:详谈bootcmd和bootargs》1.uboot中的环境变量bootdelay:执⾏⾃动启动的等候秒数baudrate:串⼝控制台的波特率netmask:以太⽹接⼝的掩码ethaddr:以太⽹卡的⽹卡物理地址bootfile:缺省的下载⽂件bootargs:传递给内核的启动参数bootcmd:⾃动启动时执⾏的命令serverip:服务器端的ip地址ipaddr:本地ip 地址stdin:标准输⼊设备stdout:标准输出设备stderr:标准出错设备 以上是⼀些基本的环境变量。
uboot中⼀般会有⼀些缺省的环境变量。
在启动uboot后会将参数放在特定的FLASH区域,之后由kernel去获取解析。
还有另⼀种⽅法设置环境变量就是在uboot启动后进⼊命令⾏模式,设置环境变量,然后执⾏saveenv后,会将设置的环境变量保存到特定区域的FLASH中,由kernel去获取解析。
其中bootargs和bootcmd相对⽐较重要。
2.bootargs解析root: ⽬前很多新的开发板都是使⽤FLASH作为存储。
因为很多都直接使⽤MTD驱动程序。
MTD 驱动程序的主要优点在于 MTD 驱动程序是专门为基于闪存的设备所设计的,所以它们通常有更好的⽀持、更好的管理和基于扇区的擦除和读写操作的更好的接⼝。
Linux 下的 MTD驱动程序接⼝被划分为两类模块:⽤户模块和硬件模块。
有两个流⾏的⽤户模块可启⽤对闪存的访问: MTD_CHAR 和 MTD_BLOCK 。
MTD_CHAR 提供对闪存的原始字符访问,⽽ MTD_BLOCK 将闪存设计为可以在上⾯创建⽂件系统的常规块设备(象 IDE 磁盘)。
与MTD_CHAR 关联的设备是 /dev/mtd0、mtd1、mtd2(等等),⽽与 MTD_BLOCK 关联的设备是 /dev/mtdblock0、mtdblock1(等等)。
由于 MTD_BLOCK 设备提供象块设备那样的模拟,通常更可取的是在这个模拟基础上创建象 FTL 和 JFFS2 那样的⽂件系统。
uboot命令U-boot基础现在为Linux开放源代码Bootloader有很多,blob、redboot 及U-BOOT等,其中U-BOOT是目前用来开发嵌入式系统引导代码使用最为广泛的Bootloader。
它支持POWERPC、ARM、MIPS和 X86等处理器,支持嵌入式操作系统有Linux、Vxworks及NetBSD等。
2.1 U-boot源代码目录结构|-- board 平台依赖,存放电路板相关的目录文件|-- common 通用多功能函数的实现|-- cpu 平台依赖,存放cpu相关的目录文件|-- disk 通用。
硬盘接口程序|-- doc 文档|-- drivers 通用的设备驱动程序,如以太网接口驱动|-- dtt|-- examples 应用例子|-- fs 通用存放文件系统的程序|-- include 头文件和开发板配置文件,所有开发板配置文件放在其configs 里|-- lib_arm 平台依赖,存放arm架构通用文件|-- lib_generic 通用的库函数|-- lib_i386 平台依赖,存放x86架构通用文件|-- lib_m68k 平台依赖|-- lib_microblaze 平台依赖|-- lib_mips 平台依赖|-- lib_nios 平台依赖|-- lib_ppc平台依赖,存放ppc架构通用文件|-- net 存放网络的程序|-- post 存放上电自检程序|-- rtc rtc的驱动程序`-- tools 工具详细实例:board:开发板相关的源码,不同的板子对应一个子目录,内部放着主板相关代码。
Board/at91rm9200dk/at91rm9200.c, config.mk, Makefile, flash.c ,u-boot.lds等都和具体开发板的硬件和地址分配有关。
common:与体系结构无关的代码文件,实现了u-boot所有命令,其中内置了一个shell脚本解释器(hush.c, a prototype Bourne shell grammar parser), busybox中也使用了它。
烧写ARM开发板系统教程-----uboot、内核以及⽂件系统⼀、sd启动将u-boot镜像写⼊SD卡,将SD卡通过读卡器接上电脑(或直接插⼊笔记本卡槽),通过"cat /proc/partitions"找出SD卡对应的设备,我的设备节点是/dev/sdb.(内存卡的节点)。
当有多个交叉编译器是,不⽅便设置环境变量时,可以在编译命令中指定交叉编译器,具体如下:在源码中操作以下步骤:make distcleanmake ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- mrpropermake ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- tiny210_configmake ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- all spl编译出tiny210-uboot.bin,注意交叉编译⼯具路径执⾏下⾯的命令$sudo dd iflag=dsync oflag=dsync if=tiny210-uboot.bin of=/dev/sdb seek=1把内存卡插⼊开发板,使⽤串⼝⼯具设置环境变量:setenv gatewayip 192.168.1.1(电脑⽹关)setenv ipaddr 192.168.1.102(开发板ip,不要与虚拟机和电脑ip冲突)setenv netmask 255.255.255.0setenv serverip 192.168.1.10(虚拟机ip)saveenv⼆、nand启动烧写Uboot:通过SD卡启动的u-boot for tiny210 将u-boot镜像写⼊nandflash在虚拟机下重启tftp sudo service tftpd-hpa restart开发板终端下执⾏下⾯的命令:[FriendlyLEG-TINY210]# tftp 21000000 tiny210-uboot.bin[FriendlyLEG-TINY210]# nand erase.chip[FriendlyLEG-TINY210]# nand write 21000000 0 3c1f4 (写⼊长度)内核的烧写位置是0x600000开始的区域,⽂件系统烧写位置为0xe00000开始的区域。
嵌入式系统工程师常见面试题在嵌入式系统工程领域,面试是企业筛选合适人才的重要环节。
以下是一些常见的嵌入式系统工程师面试题,涵盖了硬件、软件、操作系统等多个方面。
一、硬件相关1、请简述一下电阻、电容、电感的基本特性及其在电路中的作用。
电阻主要用于限制电流、分压和产生热量。
电容可以存储电荷,用于滤波、耦合和定时等电路。
电感则能储存磁场能量,常用于滤波、谐振和变压器等。
2、解释一下什么是 PCB(印刷电路板)布线的阻抗控制,以及为什么它很重要?PCB 布线的阻抗控制是确保信号在传输过程中保持稳定和减少反射的关键。
不同的信号速率和频率对阻抗有特定要求。
如果阻抗不匹配,会导致信号失真、噪声增加和传输错误,影响系统的性能和可靠性。
3、谈谈你对ADC(模数转换器)和DAC(数模转换器)的理解,包括它们的工作原理和主要性能指标。
ADC 将模拟信号转换为数字信号,工作原理有逐次逼近型、积分型等。
主要性能指标包括分辨率、转换精度、转换速度等。
DAC 则相反,将数字信号转换为模拟信号。
其性能指标类似 ADC,但还包括建立时间等。
4、如何降低系统的功耗,特别是在嵌入式设备中?可以从多个方面入手,如选择低功耗的芯片和器件,优化电路设计,合理设置电源管理模式,采用动态电压频率调整技术,以及在软件中控制硬件模块的电源开关等。
二、软件相关1、解释一下什么是中断,以及在嵌入式系统中如何处理中断?中断是指 CPU 在执行正常程序时,由于外部事件或内部异常而暂停当前程序,转而去执行相应的中断服务程序。
在嵌入式系统中,需要设置中断向量表,配置中断优先级,编写中断服务程序,并确保中断处理的及时性和准确性。
2、描述一下你对实时操作系统(RTOS)的理解,以及它与普通操作系统的区别。
实时操作系统强调任务的确定性和及时性,能在规定的时间内完成关键任务。
与普通操作系统相比,它具有更短的中断响应时间、更严格的任务调度策略和更高的可靠性。
3、谈谈你对 C 和 C++在嵌入式系统开发中的应用和优缺点。
凌FL2440超详细U-BOOT作业(UBoot介绍+H-jtag使用+Uboot使用)Bootloader是高端嵌入式系统开发不可或缺的部分。
它是在操作系统内核启动之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
现在主流的bootloader有U-BOOT、vivi、Eboot等。
本次作业先做Uboot的烧写吧。
希望通过这个帖子,能让更多的初学者朋友了解一些UBoot的知识,也希望高手朋友对我的不足予以斧正。
首先说一下什么是Uboot:U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。
从FAD SROM、8xxROM、PPCBOOT逐步发展演化而来。
其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。
但是U-Boot不仅仅支持嵌入式Linu x系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。
其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。
这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。
这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。
我的EasyARM-i.MX283学习笔记1、前记 .......................................................................................................................... - 1 -初学第一阶段计划 (1)2、关于IMX283A开发板 ............................................................................................... - 3 -3、EASYARM-I.MX283学习-----5个月我学了什么? ....................................................... - 5 -关于接下来该学习什么,怎么学习做一个规划: (6)4、EASYARM-I.MX283学习之点亮LED灯....................................................................... - 6 -1、按照教程安装好ECLIPSE:参照10.4节的做法 (6)2、操作步骤 (6)1、前记对于ARM9没有什么基础,硬要说对ARM了解的话,我会STM32,也算对ARM半个入门了。
去年看到ZLG的IMX283开发套件时,那时很想买,但终究没买。
究其原因,当时正在学习STM32。
其实我作为硬件工程师(自诩),学习过很多单片机,例如51、MSP430、STM32,当然还有专业课上的FPGA当然,已有一年多没接触了。
这些芯片,可要说会也不是特别精通,可要说不会但毕竟也学过一段时间。
这一路过来,反正也是懵懵懂懂,图个新鲜感。
很多东西学过后就忘记了,现在呢就养成了写一些自学笔记的习惯。
然而大多说自学笔记都是以初学者的眼光和思维去看待和解决问题。
Fedora14下烧写uboot到sd卡,烧写内核代码到nangflash ,挂载ntfs文件系统到s5pv210前几天在老师的指导下完成了s5pv210的u-boot及内核代码的烧写和挂载netfs文件系统,今天抽时间再总结一下,主要是对中间出现的问题及解决方案。
希望对有需要的人有所帮助。
环境:fedora 14 s5pv210开发板vwarm9.0需要准备的:uImage 、tiny210v2-uboot.bin 、rootfs_qtopia_qt4.img一.首先先把u-boot 烧到sd卡里面代码:dd iflag= dsync oflag=dsync if= tiny210v2-uboot.bin of=/dev/sdb seek=1说明:这一步比较简单,没什么问题烧写完毕后,开发板上电,以root权限进入minicom进入u-boot 界面。
二、准备烧写内核代码1、配置TFTP服务器为了安装TFTp服务器及客户端,需要连接网络,为方便起见,本人建议,开启虚拟机之前首先调节网络模式为NET模式,这样主机只要能连上网,虚拟机就能上网,可以通过YUN 工具进行TFTP服务器的安装代码:#yum install tftp-server //安装TFTP服务器# yum install –y tftp //安装TFTP客户端–y 参数表示同意下载配置TFTP环境创建共享目录:#mkdir /var/lib/tftpboot打开修改配置文件:#vim /etc/xinetd.d/tftp修改如下:server-args = -s /var/lib/tftpboot –c启动TFTP服务器:#service xinetd restart测试是否启动TFTP服务器:# netstat –a | grep tftp如果没有打开:#chkconfig tftp on# /etc/init.d /xinetd restart关闭防火墙:Setup 进入设置(这里不在多说)注意:接下来虚拟机下必须设置网络模式为桥接模式(烧写uImage时候的网络模式),我曾经试过在NET模式下和HOST-ONLY模式都没有成功。
bootm命令在U-Boot 中是用来启动Linux 内核或者Flat Device Tree (FDT) 格式的设备树以及可能包含的根文件系统镜像的命令。
bootm命令执行的流程通常涉及以下步骤:1.加载内核与设备树:在bootm执行前,通常需要使用fatload、ext2load或其他加载命令将Linux 内核映像(例如zImage 或uImage)、设备树blob(dtb 文件)加载到内存中预定义的位置。
2.验证与解析镜像头:bootm命令首先会检查指定内存区域的内容是否符合Multi-Component Boot (MCB) 格式,该格式允许在一个单一的二进制块中包含多个可启动组件的信息。
如果找到合法的MCB 头,它会进一步解析内核镜像和其他组件的相关信息。
3.设置环境变量:U-Boot 会根据加载的内核类型设置必要的环境变量,如bootargs(传递给内核的启动参数),fdtcontroladdr(设备树的加载地址)等。
4.初始化板级硬件:在启动内核前,确保所有必要的外设和SOC 功能已经被正确初始化,以便内核能够顺利接管控制权。
5.调用启动例程:最后,bootm命令会调用相关的启动例程来启动内核。
这个过程通常涉及到跳转到特定的启动函数,该函数会配置CPU 进入特定模式以运行ARM Linux 内核,然后调用内核的入口点开始执行内核代码。
具体来说,bootm命令在U-Boot 源代码中对应的实现部分主要包括:•cmd_bootm.c文件中包含了do_bootm()函数,它是bootm命令的主要执行体。
•在do_bootm()函数内部,会按照不同类型的镜像(单内核、多组件)分别处理。
•如果内核支持flattened device tree,会加载并验证设备树数据,并将其地址写入适当的寄存器或内存位置供内核启动时获取。
•设置栈指针、CPU模式、以及重定位向量表等,为内核启动做准备。
•最终,bootm调用类似boot_jump_linux()函数来跳转到内核的入口点开始执行。
u-boot 技术文档1.U boot 命令详解1.1查看帮助命令使用help 或者?1.2环境变量打印环境变量:printenv设置环境变量:setenv(不会保存)保存环境变量:saveenv这个时候就有了1.3nandflash命令使用nand查看nandflash 所有指令擦除nand erase1.4norflash命令查看Flash信息命令: flinfo加/解写保护命令: protect擦除命令: erase1.5内存命令nm1.5USB指令使用help usb 查看usb具体指令使用usb 启动使用usb tree查看信息f atls usb 0 罗列u盘信息1.5.1实例演练usb指令烧写1.6实例演练ftp指令烧写环境变量中体现了开发板上的IP地址为192.168.0.2,网关为192.168.0.1,要求电上的tftp 服务器的IP为192.168.0.1;运行电脑上tftp服务器,指定好根目录,将内核和根文件系统放在根目录下。
注:线接上后,电脑上的本地连接可能是显示网络电缆没插好,这很正常!在使用过程中它们会自动去连接!<2>分别下载内核和根文件系统到内存0x30008000开始的空间先检查坏块nand bad再擦除坏块清理某个区域0x560000 0x3b22c00将根文件系统加载到0x30008000然后再将根文件系统写到0x560000 0x3b22c00这个位置然后重启:重复上面的步骤:nand erase 0x60000 0x267000将内核文件保存到0x60000 0x267000这块区域运行1.8系统重启指令2.U boot 内核移植在cpu/arm920t/start.S中添加以下代码在修改并添加为以下代码在include/configs/mini2440.h修改为如下:将以下代码修改为:将以下代码修改为:将以下代码修改为:在drivers/mtd/nand/s3c2410_nand.h 在最后下面代码上添加如下带码:。
1、根文件系统的制作
1)创建根文件系统主目录:
mkdir rootfs
2)创建根文件系统的子目录
cd rootfs
mkdir bin dev etc lib proc sbin sys usr mnt tmp var 3)然后创建usr下的子目录
mkdir usr/bin usr/lib usr/sbin lib/modules
4)创建设备文件
内核在引导时设备节点console,null必须存在
cd dev/
注:该目录为/mini2440/nfsroot/rootfs 下的dev目录mknod –m 666 console c 5 1
mknod -m 666 null c 1 3
c:表明类型为字符设备
第一个数字(5,1):主设备号
第二个数字(1,3):次设备号
这两个设备文件设备号是固定的
5)安装etc
etc目录主要是一些启动时的脚本文件一般不需要修改
tar etc.tar.gz –C /xxx/rootfs
这个命令可能不给用改为:
tar xvzf etc.tar.gz –C /xxx/rootfs
6)编译内核模块
内核模块保存在lib下面的module下
配置内核:*直接编译到zimage m不链接到zimage而是编译成模块到.o就停住
进入Linux内核目录(linux-2.6.32.2)
make modules ARCH=arm CROSS_COMPILE=arm-linux- 添加了ARCH=arm表示现在编译的是arm架构的内核
CROSS_COMPILE=arm-linux-表示使用交叉编译工具链
安装内核模块到根文件系统:
make modules_install ARCH=arm
INSTALL_MOD_PATH=/xxx/rootfs
7)配置busybox
因为Linux很多命令都是通过软连接实现的,所以无法直接将这些命令复制到根文件系统中。
Busybox是一个工具集合,根文件系统很多命令都可以通过busybox编译得到,如命令ls,cd,mkdir。
Busybox相当于一个命令解析器,根文件中命令被软连接到
busybox,由busybox进行命令解析。
a) 解压busybox
tar xvzf busybox-1.13.3
b) 配置busybox
make menuconfig
进入busybox settings-->
进入Build options
选中Build busybox as a static binary, 静态链接
还有就是要把交叉编译工具链使用arm-linux-
进入busybox settings--> Installation option-->
选中“Don’t use /usr”选中该项可以避免busybox被安装到宿主系统的/usr目录下,破坏宿主系统
将busybox被安装到/mini2440/nfsroot/rootfs
退出busybox,保存;
c)编译busybox
make ARCH=arm CROSS_COMPILE=arm-linux-
d) 安装busybox
make install
至此根文件系统制作完成。
2、nfs 共享根文件系统
1)配置nfs
在/etc/exports配置文件,添加代码如下:
其中/mini2440/nfsroot/rootfs 是文件系统所在目录
192.168.1.* 设置文件共享的网段
rw 读写权限
sync 同步回写
no_root_squash 设置是否具有root权限no表示没有root权限
2) 重启nfs服务
8、使用uboot去挂载根文件系统
准备工作:
启动超级终端:
输入printenv检查PC IP地址是否正确:
若不正确,用命令setenv serverip 192.168.1.11设置PC机IP:
设置完后要对配置进行保存:saveenv:
用命令ping 192.168.1.11 查看与PC机是否成功连接:
出现alive表示与PC机成功连接,如出现not alive:
1)检查PC机IP是否设置正确
2)检查网线是否联通
3)检查无线网是否关掉
都没有问题后进行以下内容:
1)将制作好的uImage 烧写到nand flash 对应的内核分区:(1):运行命令“tftp 0x30000000 192.168.1.11:uImage”,将内核镜像uImage 下载到内存0x30000000地址处:
如不能下载:
1)检查IP是否与PC机IP一致
2)检查PC机/tftpboot下是否有uImage
(2):运行命令“nand erase 0x00060000 0x00500000”檫除nand flash 中位于0x60000地址处的整个kernel 分区:
(3):运行命令“nand write 0x30000000 0x00060000 400000”将位于0x30000000出的内核镜像烧写到nand flash的整个内核分区:
(4):改变bootcmd 的值,让uboot 在加载模式下能自动启动内核:
setenv bootcmd ‘nboot 0x30007fc0 0 0x00060000;bootm’
保存配置:
saveenv
4.设置启动参数让uboot 能挂在根文件系统:
set bootargs root=/dev/nfs console=ttySAC0 nfsroo t=192.168.1.11:/mini2440/nfsroot/rootfs ip=192.168.
1.70:19
2.168.1.11:192.168.1.1:255.255.255.0::eth0:off 如不能挂载:
1)检查nfsroot=192.168.1.11:/mini2440/nfsroot/rootfs中I P是否与PC机IP一致
2)检查nfsroot=192.168.1.11:/mini2440/nfsroot/rootfs冒号后面的目录是否是PC机上的根文件目录
3)如以上都没有问题,检查PC上/etc/exports中设置的目录是否是根文件目录
5.重新启动挂载成功:
8、进行交叉编译
需要两个库文件支持在根目录下:
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib libc.so.6 ld-linux.so.3
2 用arm-linux-gcc编译:
PC机上:
超级终端上:。