Uboot、kernel、rootfs、安装模块整套流程

时间:2022-07-30 16:01:06

Uboot过程

(1)uboot源代码进行完修改(修改内容根据自己的理解和分析来修改)

(2)make distclean然后make x210_sd_config(配置文件)然后make

(3)编译完成得到u-boot.bin,然后去烧录。

烧录过程:

第一步:进入sd_fusing目录下

第二步:make clean

第三步:make

第四步:插入sd卡,ls /dev/sd*得到SD卡在ubuntu中的设备号(一般是/dev/sdb,注意SD卡要连接到虚拟机ubuntu中,不要接到windows中)

第五步:./sd_fusing.sh /dev/sdb完成烧录(注意不是sd_fusing2.sh

细节1sd_fusing目录下生成的sd_fusing.sh里面需要改动,扇区为49uboot在烧录到SD卡的时候,先截取uboot.bin的前16KB(实际脚本截取的是8KB)烧录到SD卡的block1bolck32;然后将整个uboot烧录到SD卡的某个扇区中(譬如49扇区))和改动路径为../u-boot.bin因为我们makefile指定生成的是u-boot.bin。之前是uboot-iNand.bin,这是三星之前编译过的。

细节2:移植好的uboot烧录到SD卡中,我们要先破坏iNandsd0uboot底下如何擦除ubootmovi write u-boot 0x30000000)中的uboot,才会从sd2启动。

Uboot一般大小180kb400kb

 

Kernel过程

用上面编译好的uboot去启动kernelkernel来自其他qt_x210v3_160807.tar.bz2kerneluboot等)里面有所有的代码,是九鼎做好的,解压出来,得到kernel,编译过程:

1、先确认Makefile

(1)主要是检查交叉编译工具链有没有设置对。CROSS_COMPILE   ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-

(2)确认ARCH = arm。主要目的是为了编译时能找到arch/arm目录。

2、两步配置

     第一步配置:make x210ii_qt_defconfig最后只要出现:configuration written to .config这句话,就证明我们的操作是正确的。

     第二步配置:make menuconfig,具体的用法和配置意义在后面课程讲。我们这里因为是九鼎已经移植过的,所以第二步配置是可以不做的,直接退出即可。make编译完成后得到的内核镜像不在源码树的根目录下,在arch/arm/boot这个目录下。得到的镜像名是zImage,最后将zImage复制到tftfpboot去下载启动,tftp方式避免反复烧录镜像到inand中,对磁盘有损害,所有tftp去加载启动。

 补充:内核的配置原理1
1、配置的关键是得到.config文件
(1).config以.开头,是一个隐藏文件,因此平时是看不到的,需要ls -a来看
(2)当我们make distclean后(也就是说默认情况下)是没有.config文件的,我们配置的两步过程就是为了得到内容合适的.config文件
(3).config文件是linux内核在编译过程中很重要的一个文件,其作用类似与uboot中的include/configs/x210_sd.h,内核在编译过程中会读取.config中的配置项,并且用这些配置项去指导整个编译链接过程。
(4).config文件的格式类似于脚本文件,其中内容为类似于于:CONFIG_ARM=y的一个一个的配置项。这些配置项就类似于脚本文件中定义的一个一个变量,所以这一行可以被理解为定义了一个变量CONFIG_ARM,这个变量的值为y。
(5).config文件中每一行都是一个配置项,从.config文件的规模可以看出linux内核的可配置项有两三千个。所以linux内核是高度可配置的,而且linux内核的所有配置项很难全部搞明白。因为linux内核的配置项太多太繁杂超出了人的大脑能够记忆和处理的数量级,因此linux内核不像uboot那样直接手工配置,而是发明了一个图形化的配置工具menuconfig。
2、make xx_defconfig和make menuconfig相配合
(1)我们为了对.config文件中的两三千个配置项做逐一合适的配置,专门发明了两步结合的配置方式。
(2)其实只要人的记忆足够好,大脑足够厉害,完全可以手工去书写/修改.config文件完成内核配置,最终只要.config中内容是正确的,就不影响编译过程。
(3)第一步:make xxx_defconfig解决的问题是大部分的配置项(这一步结束后99%的配置项就已经正确了),下来就是对个别不同的针对我们的开发板进行细节调整,细节调整就通过make menuconfig来完成。
(4)make xxx_defconfig这一步其实是参考别人已经做好的,这样做有很多好处:减少很多工作量,避开了很多自己不懂的配置项(譬如对内存管理的、调度系统的等模块的配置项),我们只用管自己需要管的。
(5)make menuconfig其实就是读取第一步得到的.config,然后给我们一个图形化的界面,让我们可以更加容易的找到自己想要修改的配置项,然后更改配置他。
3、make xx_defconfig到底做了什么?
(1)make x210ii_qt_defconfig其实相当于:cp arch/arm/configs/x210ii_qt_defconfig .config
(2)arch/arm/configs目录下的这么多个xxx_defconfig哪里来的?其实这些文件都是别人手工配置好适合一定的开发板的.config文件后自己把.config文件保存过去的。譬如说我们用S5PV210这个SoC,针对这个SoC的开发板的最初配置肯定是三星的工程师去做的。


rootfs过程

前导:我们在刷机刷QT4.8的时候刷了三个镜像:ubootzImage-qtrootfs-qt.ext3

rootfs-qt.ext3它包含了跟文件系统中的所有文件,就是内核挂载了根文件系统后/#下的所有东西,最初我们在主机ubuntu随便新建一个文件夹,将它包含特定的内容(etcbinlib等),变成根文件系统(它可以被kernel通过nfs方式远程挂载使用),再用专用的工具软件(mke2fs,是ubuntu默认安装的制作镜像工具)制作成可烧录的镜像文件,如rootfs-qt

(1)制作过程:在root@ubuntu:~/porting_x210/rootfs#下进行

Uboot、kernel、rootfs、安装模块整套流程

dd if=/dev/zero of=rootfs.ext2 bs=1024 count=2048  做个2M大小的空文件如图:Uboot、kernel、rootfs、安装模块整套流程

losetup  /dev/loop1 rootfs.ext2

mke2fs -m 0 /dev/loop1 2048

mount -t ext2 /dev/loop1 ./rootfs/       这一步是把刚刚做的2M大小的rootfs.ext挂载到poring_x210/rootfs/rootfs中,即rootfs文件夹中,现在进入rootfs相当于进入rootfs.ext,我们就可以写东西进去了。

(2)卸载掉,然后镜像就做好了。

umount /dev/loop1

losetup -d /dev/loop1      

这里说的卸载是,将rootfs这个文件夹窗口关闭,取消挂载,因为我们要写的东西已经通过aston_rootfs写入到了rootfs.ext,最后我们卸载,rootfs里面就什么都没有了。

(3)将制作的rootfs.ext复制到windowfastboot下,去烧录,和以前刷机一样:

    fastboot flash system rootfs.ext

    fastboot reboot

这样我们就烧录到了inand。然后SD2ubootset bootargs console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext2)启动tftp下载的kernel,我们会看到挂载成功,但是执行/linuxrc失败,因为我们没有添加那些特定的文件夹

 Uboot、kernel、rootfs、安装模块整套流程

nfs挂载rootfs与 制作rootfs镜像

按照文档搭建nfs服务器,再导出到我们的nfs服务器的共享文件夹中,目的是为了挂载主机ubuntu上文件夹形势的根文件系统。如果我们用镜像直接下载,是不需要nfs挂载的(需要配置bootargs按照nfs方式),看2.18.4.zhu

nfs 挂载主机环境变量的设置

setenv bootargs root=/dev/nfs nfsroot=202.193.74.70:/root/porting_x210/rootfs/rootfs ip=202.193.74.20:202.193.74.70:ga202.193.74.254:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200

Uboot、kernel、rootfs、安装模块整套流程

制作过程:

移植busybox

        网上下载一个busybox源码,www.busybox.net,修改Makefile

 Uboot、kernel、rootfs、安装模块整套流程

(1) ARCH = arm

(2) CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin//arm-none-linux-gnueabi-

(3)配置make menuconfig参照网盘中章节目录下的《busybox menuconfig配置.txt》文件中的记录进行配置。

(4)make 然后 make install  make install执行的时候其实是在执行busybox顶层目录下的一个目标install。目的就是将编译生成的可执行程序及其依赖的库文件、配置文件、头文件安装到当前系统中指定(一般都可以自己指定安装到哪个目录下,如果不指定一般都有个默认目录)的目录下,这里的默认目录就是busybox-1.24.1/_install,像bin/里面都是应用程序如cpwhichls等。最后我们要挂载的是根文件系统,用的不是这个文件,所有我们要安装到我们需要安装的位置(/root/porting_x210/rootfs/rootfs)。我们要将install目录下的所有文件弄到rootfs里面。

Uboot、kernel、rootfs、安装模块整套流程

       (5)更改安装目录

 Uboot、kernel、rootfs、安装模块整套流程

Uboot、kernel、rootfs、安装模块整套流程

 Uboot、kernel、rootfs、安装模块整套流程

让后再次去make install,如下:

 Uboot、kernel、rootfs、安装模块整套流程

(6)etc/下的inittab

mkdir etc,添加这个inittab,当前制作的最小rootfs成功了。进入了/#命令行

inittab的工作原理就是被/linuxrc(也就是busybox)执行时所调用起作用。

inittab/etc目录下,所以属于一个运行时配置文件,是文本格式的(内容是由一系列的遵照一个格式组织的字符组成的),实际工作的时候busybox会(按照一定的格式)解析这个inittab文本文件,然后根据解析的内容来决定要怎么工作。

 Uboot、kernel、rootfs、安装模块整套流程

 (7)添加rcSfstab等文件

作用看2.19.6

Uboot、kernel、rootfs、安装模块整套流程

自己制作rootfs挂载点目录,启动后去看procsys文件夹,文件里有东西说明挂载成功,在串口启动后的/#下看

Uboot、kernel、rootfs、安装模块整套流程

(8)添加动态链接库

动态连接的hello程序中调用到了printf函数,而printf函数在动态连接时要在运行时环境(开发板的rootfs)中去寻找对应的库文件(开发板rootfs中部署的动态链接库中包含了printf函数的那个库文件)。如果找到了则printf函数就会被成功解析,然后hello_dynamic程序就会被执行;如果找不到则程序就不能被执行

Uboot、kernel、rootfs、安装模块整套流程

动态链接库so文件中包含了调试符号信息,这些符号信息在运行时是没用的(调试时用的),这些符号会占用一定空间。在传统的嵌入式系统中flash空间是有限的,为了节省空间常常把这些符号信息去掉。这样节省空间并且不影响运行。

去掉符号命令:arm-linux-strip *so*

实际操作后发现库文件由3.8M变成了3.0M,节省了0.8M的空间。

Uboot、kernel、rootfs、安装模块整套流程