您的位置:首页 > 运维架构 > Linux

浅谈Linux内核移植

2016-03-11 13:58 337 查看

Linux内核简介:

1.系统架构

(1)Linux是由用户空间和内核空间构成的

(2)用户空间主要是用户应用程序以及一些C库文件,配置文件。一般是看得见的。

(3)内核空间主要是系统调用接口,狭义上的内核,处理器架构相关的代码。

(4)划分两个空间的理由:处理器有不同的工作模式,不同的模式权限不一样,可以运行的指令不一样。两个空间对应不同的工作模式(操作级别),程序执行的两种不同的状态。可以起到系统保护作用。比如用户空间级别较低,内核空间级别高。

(5)通过系统调用和硬件中断可以在两种空间相互切换。

2.内核架构(狭义上内核,纯代码)

(1)系统调用接口

(2)进程管理(创建进程—fork,exec,停止进程–kill,exit,控制通信—signal,POSIX机制,共享CPU–进程调度)

(3)存储管理(内存分配,回收,控制多个进程安全的共享内存区域)

(4)CPU架构相关代码(为的是提高至移植性)

(5)设备驱动程序

(6)网络协议栈(只是协议,与硬件无关)

(7)虚拟文件系统(隐藏各种文件系统的具体操作细节,提供统一的文件操作接口)

3.源代码目录简介

(1)ARCH:存放体系结构相关的代码。下设子目录,分别对应具体的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-versionversion version

而$version可以通过查看/lib/modules目录下的文件得到。

六.安装新内核:

1.复制编译出来的内核映像到启动目录

cp arch/cpu/boot/bzImage/boot/vmlinuz−cpu/boot/bzImage /boot/vmlinuz-version

2.复制内核模块压缩包到启动目录

cp initrd-version/boot/(这里不需要在initrd−version /boot/
(这里不需要在initrd-version前面加上路径,系统会自动搜索,但是不要在内核源代码目录执行,最好在home执行,则会在当前路径产生一个ramdisk文件。)

3.修改/etc/grub.conf文件,从titile一直复制到最后,然后修改版本相关信息以及内核模块打包的文件名。为的是在启动的时候可以选择用什么版本的内核启动。

4.下次启动的时候要快速按下回车键,进入启动选择菜单,然后选择新安装的版本启动。进入系统以后用#uname -r查看当前使用的内核版本。

七。清理内核

1.只清理中间的.o文件,用make clean即可

2.要把所有中间文件和配置文件都清除,就要用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目录。用来加文件头。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: