今天看了一下在嵌入式Linux过程中,需要在宿主机上交叉编译内核和制作根文件系统(定制占容量较小的嵌入式根文件系统)
但是对一个问题很不明白:交叉编译的内核怎么和根文件系统对应起来??其实也就是make uImage生成的zImage内核镜像,怎么和make modules生成的可加载模块联系起来?我们知道如果是直接在电脑上换内核的话,直接make uImage, make modules, make modelus_install(会把模块拷贝到/lib/modules/ 这个相应的目录下)然后再设置从这个新编译的内核启动就行。。。。
于是制作移植的文件系统是不是也要把modules拷入到相应目录下?
参考一下这篇博客写的就是类似我的想法。来自:http://yangjie199.blog.163.com/blog/static/750892020122119254708/
嵌入式linux内核及根文件系统的制作过程
2012-03-11 21:02:54| 分类: 嵌入式 | 标签: |字号大中小 订阅
前提:
1、从友善官网下载已移植好的用于mini2440开发板的linux内核源码
2、从http://www.busybox.net/downloads/下载busybox工具。这里我们选择busybox- 1.13.4.tar.bz2
3、下载国嵌做的etc.tar.gz
总思路:
首先制作根文件系统下各目录的内容。
然后配置linux内核,其中内核要支持initramfs文件系统。
最后编译linux内核,得到一个内核及根文件系统合为一体的二进制文件,下载到开发板中运行
制作过程(安装必要的编译器等工具就不做介绍,本人是在编译过程中,发现缺少什么工具时再安装,以下过程可能会出现一些编译出错的情况,因为我最后编译成功写这个总结时,只是记录了一个总体过程):
******************制作根文件系统*********************
1、在/usr目录下新建一个文件夹,名为rootfs
mkdir rootfs
2、进入rootfs文件夹,执行以下命令
mkdir bin dev etc lib proc sbin sys usr mnt tmp var
mkdir usr/bin usr/lib usr/sbin lib/modules
3、进入/dev目录,执行以下命令
sudo mknod -m 666 console c 5 1
sudo mknod -m 666 null c 1 3
sudo mknod fb0 c 29 0
sudo mknod ts0 c 13 128 、
sudo mknod tty0 c 4 0
sudo mknod tty1 c 4 1
sudo mknod tty2 c 4 2
sudo mknod tty3 c 4 3
sudo mknod tty4 c 4 4
4、安装/etc
sudo tar -xf etc.tar.gz
cd etc
复制该目录下的所有文件到/usr/rootfs/etc目录下,这些文件是fstab inittab profile init.d init.d/rcS
5、拷贝一份.config文件作为模板到内核根目录下,执行以下命令,根据需要配置linux内核
make menuconfig ARCH=arm
6、编译内核,执行以下命令
make uImage ARCH=arm CROSS_COMPILE=arm-linux-
7、编译内核模块,执行以下命令
make modules ARCH=arm CROSS_COMPILE=arm-linux-
6、安装内核模块,执行以下命令
make modules_install ARCH=arm INSTALL_MOD_PATH=/usr/rootfs
7、配置busybox,进入busybox目录,修改Makefile 164行 CROSS_COMPILE=arm-linux-( 注:在后面的配置菜单中也可以增加这个内容)
执行:make menuconfig
a、进入Busybox Setting -> build Options->
选中“Build busybox as a static binary” 静态连接
Cross Compiler prefix(arm-linux-)
b、installation Option->
选中"Don't use /usr",选中该项可以避免busybox被安装到宿主系统的/usr目录下,破坏宿主系统
c、Busybox installation Prefix(/xxx/rootfs)
该选项表明编译后的busybox安装位置
8、编译、安装busybox,执行以下命令:
make ARCH=arm CROSS_COMPILE=arm-linux-
make install
9、查看rootfs文件目录下sbin目录下,是不是有init这个文件,如果没有系统是无法启动的
*************配置linux内核使其支持initramfs文件系统***********************
10、配置linux内核,使其支持initramfs
选中general setup->initial RAM filesystem and ram disk
11、指定路径
在内核配置菜单中设置initramfs source file的值为根文件系统的路径(/xxx/rootfs)
12、进入制作好的根文件系统中,执行
ln -s ./bin/busybox init
13、修改内核的.config配置文件,启动命令参数(即.config文件中是CONFIG_CMDLINE的值)为
console=ttySAC0 mem=64M
***********重新编译linux内核,得到一个将根文件与内核合二为一的二进制文件********
14、重新编译linux内核,得到的zImage文件可以直接下载到板子上运行
*********************其它*********************************************
注:如果想在编译内核时添加自己编写的驱动程序,可以以上步骤4、5之间插入以下步骤,然后在第5步配置linux内核时,选中自己加入的驱动程序相应选项
a、将驱动程序源文件(hello.c)拷贝到drivers/(目标文件夹)目录下,并修改该目录下的Makefile和Kconfig文件
#Makefile增加以下内容
obj-$(CONFIG_HELLODRV) += hello.o
#Kconfig增加以下内容
menu USER_DEVICE_DRIVERS
config HELLODRV
tristate "Hello"
---help---
This is a sample driver programme.
注意,如果Kconfig文件中的"tristate"写成"bool",则该模块只能选为Y(编译进内核)或N(不选择),不能选为M(编译为模块,可动态加载)
b、修改drivers/目录下的Makefile文件和Kconfig文件
#Makefile增加以下内容
obj-y += (目标文件夹)
#Kconfig增加以下内容
source "drivers/(目标文件夹)/Kconfig"