【转载】 嵌入式linux内核及根文件系统的制作过程

2019-07-13 05:26发布

今天看了一下在嵌入式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"