专题3-嵌入式Linux内核制作

一.内核简介:

1.系统架构
(1)Linux是由用户空间和内核空间构成的
 
(2)用户空间主要是用户应用程序以及一些C库文件,配置文件。一般是看得见的。
 
(3)内核空间主要是系统调用接口,狭义上的内核,处理器架构相关的代码。
 
(4)划分两个空间的理由:处理器有不同的工作模式,不同的模式权限不一样,可以运行的指令不一样。两个空间对应不同的工作模式(操作级别),程序执行的两种不同的状态。可以起到系统保护作用。比如用户空间级别较低,内核空间级别高。
 
(5)通过系统调用和硬件中断可以在两种空间相互切换。
 
 
2.内核架构(狭义上内核,纯代码)
(1)系统调用接口
(2)进程管理(创建进程---fork,exec,停止进程--kill,exit,控制通信---signal,POSIX机制,共享CPU--进程调度)
(3)内存管理(内存分配,回收,控制多个进程安全的共享内存区域)
(4)体系结构相关代码(为的是提高至移植性)
(5)设备驱动程序
(6)网络协议栈(只是协议,与硬件无关)
(7)虚拟文件系统(隐藏各种文件系统的具体操作细节,提供统一的文件操作接口)
 
3.源代码目录简介(源代码下载官网:www.kernel.org)
(1)ARCH(architecture):存放体系结构相关的代码。下设子目录,分别对应具体的CPU,没格子目录还有boot,mm,以及kernel三个子目录,分别对应系统引导以及存储管理,和系统调用
 
(2)documentation:内核文档,包含帮助信息,修改信息等
 
(3)drivers:设备驱动目录
 
(4)include:内核所需要的头文件目录。与平台无关的头文件在/include/linux子目录下。平台相关的则放在include相应的子目录中。
 
(5)fs:存放各种文件系统的实现代码。每个子目录对应一种文件系统。公用的源代码则用于实现VFS。
 
(6)net:网络协议的实现目录。
 
(7)管理源代码:SourceInsight软件。
 
 
二.内核配置
1.配置原因:根据嵌入式系统软硬件可裁剪的特性,即根据你项目软硬件的实际需求,对内核的相关模块进行裁剪。
 
2.配置命令:
(1)make  config-----》交互式
(2)make   menuconfig----》菜单式
(3)运行配置和编译命令都是在顶层目录进行的。
 
3.一般要用到的大项
(1)处理器类型(Process type)
                              --process family
                                   --具体CPU
(2)Networking Suport
 
(3)Devices  Drivers
 
(4)File  Systems
 
4.利用已存在的配置文件(一般在已存在的Linux系统的/boot目录下),来提高配置效率,一般在arch/$cpu/configs子目录(或者使用默认的配置文件)。
 
5.<>---对应三种取值方式
(1)*-------编译进uImage(内核映像文件运行在内存里面,一开机就调进内存)
(2)空格----舍弃不用该功能
(3)M-------编译成模块(.ko)存放在硬盘,等到系统需要的时候再调用,节省内存。
 
6.[]-----只有两个取值,*和空格。
 
7.配置结果保存在.config文件,默认情况是隐藏的。
(1)后面的Y对应选择时候的*
(2)M对应选择时候的M
(3)可在menuconfig中选中某一项然后通过help选项可以查看该项在.config文件中的对应项。且是双向对应的,即可以修改.config文件来改变menuconfig的菜单界面的选择。
 
8.解压tar.xz文件

有两种解压方法:

1
2
3
4
xz -d **.tar.xz
tar -xv -f **.tar
#######################################################################
tar -Jxv -f **.tar.xz(大写的J)
 
 
9.配置当前系统准备升级的内核
 
(1)备份原来的.config文件
mv  ./.config  ./.config——bak
 
(2)复制当前系统配置文件
cp /boot/config-2.6.32-279.el6.i686  ./.config
 
 
三.内核编译
 
1.编译命令
(1)make  zImage -----只能用于小于512K的内核
(2)make  bzImage  ---通用性较强
(3)如果想要在编译过程中显示详细信息,则需要在后面加上 V=1选项。
(4)编译好的内核映像文件在/arch/$cpu/boot目录下
 
四.模块编译
1.编译模块:make  modules
2.将编译好的内核模块从内核源代码目录复制到当前系统的/lib/modules下的**,为打包做准备。
make  modules_install
之后便会自动新建一个目录,就是我们要的$version以及**。
 
 
 
五.制作ramdisk
运行命令:#mkinitrd   initrd-$version  $version
而$version可以通过查看/lib/modules目录下的文件得到。
 
六.安装新内核:
1.复制编译出来的内核映像到启动目录
cp arch/$cpu/boot/bzImage   /boot/vmlinuz-$version
 
2.复制内核模块压缩包到启动目录
cp  initrd-$version  /boot/
(这里不需要在initrd-$version前面加上路径,系统会自动搜索,但是不要在内核源代码目录执行,最好在home执行,则会在当前路径产生一个ramdisk文件。)
 
3.修改/etc/grub.conf文件,从titile一直复制到最后,然后修改版本相关信息以及内核模块打包的文件名。为的是在启动的时候可以选择用什么版本的内核启动。
 
4.下次启动的时候要快速按下回车键,进入启动选择菜单,然后选择新安装的版本启动。进入系统以后用#uname  -r查看当前使用的内核版本。
 
七。清理内核
1.只清理中间的.o文件,用make  clean即可
 
2.要把所有中间文件.(o文件生成的bzImage和.ko文件)和配置文件都清除,就要用make  distclean
 
3.建议在拿到一套新代码的时候都做一下make  distclean再进行配置和编译。
 
 
八.嵌入式内核制作
1.清除原有配置和中间文件
make  distclean
 
2.配置内核
make  menuconfig(参考已有的配置文件)ARCH=arm(因为默认是X86平台)
 
3.编译内核
make  uImage  ARCH=arm  CROSS_COMPILE=arm-linux-
 
4.如果提示说缺少工具,就把之前编译uboot/tools的mkimage复制到当前操作系统的/bin目录。用来加文件头。
posted @ 2014-12-11 08:21  生活需要深度  阅读(195)  评论(0)    收藏  举报