嵌入式Linux内核制作

一.  Linux内核简介

1.  系统架构
  1.1   Linux系统架构
      Linux系统由用户空间和内核空间两部分构成,用户空间包括用户应用程序和C库,而内核空间包含了系统调用接口、狭义上的内核以及体系结构相关代码。

  1.2   Linux内核架构
      现代CPU通常实现了不同的工作模式,如ARM实现7种工作模式(usr、fiq、irq、svc、abt、sys、und)。X86实现4个不同的级别,从ring0-ring3,其中ring0具有最高权限。Linux系统采用了CPU的这一特性,使用了其中的两级分别运行Linux内核与应用程序,这使得操作系统本身得到充分的保护。如用户代码运行在ring3,内核代码运行在ring0。
      内核空间与用户空间是程序执行的两种不同状态,通过系统调用和硬件中断能够完成从用户空间到内核空间的转移。

      kernel的七个部分,包括:系统调用接口、进程管理、内存管理、虚拟文件系统、网络协议栈、设备驱动以及体系结构相关代码。


2.   Linux内核源代码

 2.1  如何下载

     下载地址官网:www.kernel.org(V2.6.39)

 2.2目录结构

      Linux内核源代码采用树形结构进行组织,非常合理地把功能相关的文件放到同一子目录下,是的程序更具可读性。

      arch目录:存放architecture相关文件,内核所支持的每种CPU体系都放在该目录下,每种CPU的子目录有进一步分为boot、mm、kernel等子目录,包含控制系统引导、内存管理以及系统调用等。

      documentaion目录:内核的文档。

      drivers目录:存放设备驱动程序。

      include目录:存放内核所需头文件,与平台无关的头文件放在include/linux子目录下,与平台有关的头文件放在相应的子目录下。

      fs目录:存放各种文件系统的实现代码。每个子目录对应一种文件系统的实现,公用的源程序用于实现虚拟文件系统vfs。

      net目录:存放网络协议栈的实现代码。

 2.3   代码管理

      使用sourceinsight对内核代码进行管理。


二.  Linux内核的配置与编译

1.  配置内核
  1.1  为什么需要配置内核
      根据硬件和软件的需求,选出需要的,去掉不要的内核功能或模块。
  1.2  如何配置内核
      所有配置和编译内核的命令需在内核源代码的顶层目录上运行。
      make config:基于交互式一问一答的配置模式,一般不采用。
      make menuconfig:基于菜单性配置模式,一般采用该模式。
      主要的配置选项包括:
      1.2.1   Processor type and features->Processor
 family(处理器型号)
      1.2.2   Networking support(网络协议)
      1.2.3   Device Drivers(设备驱动)
      1.2.4   File System(文件系统)
    配置选择方式包括:“空”、*和M,[ ]只能取“空”和*,而<>可以取“空”、*和M,通过空格键来选择
      “空”:不选择该功能项
      *:编译时把该项集成到zImage中,当内核启动时直接加载进内存。
      <M>:改选项作为模块,编译后产生.ko文件,当需要调用时再从硬盘或者Flash中加载到内存中,不需要的时候可以卸载掉。
  1.3  内核配置结果
    内核配置的结果将保存为源代码顶层目录的“.config”文件。
    (.XXXX为Linux系统隐藏文件,可通过ls -a来查看)
    .config中的每一行,对应配置中的每一项,可直接修改进行配置。
  1.4  简化配置过程
      (大量现有配置文件存放于内核源码的arch/arm/configs中)
      使用现有内核配置文件简化配置过程。在PC机上现有Linux系统/boot/下有现有系统的配置文件(如:config-2.6.23-279.el6.i686),把该文件拷贝到源文件顶层目录中,在menuconfig中选择Load an Alternate Configuration File,加载现有配置文件,稍作修改后进行保存。


2.  编译内核
  2.1  编译内核(编译选择为[*]的文件)
    make zImage V=1:用于低版本的小于512K的内核,新版内核一般不用。
    make bzImage V=1:新版本内核采用该方式进行镜像制作。
    [V=1]:该选项显示编译内核过程中的信息提示。
    编译好的内核位于arch/<cpu>/boot/bzImage。
  2.2  编译内核模块(编译选择为<M>的文件,并复制文件至指定目录下)
    make modules:编译内核模块
    make modules_install:编译完成后的内核模块将散落在内核源码目录的各个地方,用该命令把编译好的内核模块(.ko文件)从内核源码目录复制至/lib/modules/<内核版本号>目录中。
  2.3  制作ramdisk
    格式为:mkinitrd rd-$version $version
   ($version为编译好的内核版本号,位于/lib/modules/目录下)
    如:     mkinitrd rd-2.6.39 2.6.39
    打包完成后,在运行命令时的目录中将产生名为“re-2.6.39的文件”
3.  安装内核(运行于PC机中的Linux系统)
    3.1 cp arch/<cpu>/boot/bzImage /boot/vmlinuz-$version
    3.2 cp rd-2.6.39 /boot/
    3.3 修改/etc/grub.conf
      1.从以“title”开头的行开始,复制四行(4yy)至原来启动项的下方。
      2.把第一行和第三行中的“2.6.32-279.el6.i686”修改成“2.6.39”。
      3.把第四行中“initrramfs 2.6.32-279.el6.i686.img”修改成“re-2.6.39”。
      4.保存并重启Linux系统,选择2.6.39的新内核进行启动。可运行菜单。。“uname -r”命令来查看当前Linux内核版本号。
4.  清理内容
    make clean
      清除内核源码目录下的所有“.o”文件。
    make distclean
      清除内核源码目录下的所有“.o”文件以及生成出来的“.config”文件。

三.  内核制作

1.  内核制作步骤
  1.1  把开发板厂商提供的Linux内核源码包以及配置文件复制进smb。
      (使用天嵌提供的Linux-2.6.30.4版本的内核)
  1.2  解压源码包后,清除原有配置与中间文件
      x86: make distclean
      arm: make distclean
  1.3  确保/bin目录中存放有mkimage文件(用于给uImage加头的工具,源文件存放于uboot/tools里面)
  1.4  配置内核
      x86: make menuconfig
      arm: make menuconfig ARCH=arm
    (载入厂商提供的配置文件进行配置,或直接把配置文件保存为内核源码顶层目录中的“.config”)
  1.5  编译内核
      x86: make bzImage
      arm: make uImage ARCH=arm CROSS_COMPILE=arm-linux-
    (产生出来的uImage文件存放于内核源码的/arch/arm/boot/中)


2.  把内核镜像下载到开发板中进行测试(步骤参考《UBoot新手入门》)
    下载完uImage后,系统不断重启,是因为缺乏根文件系统。

猜你喜欢

转载自blog.csdn.net/u012308586/article/details/89491295