嵌入式 Linux 内核制作

来源:互联网 发布:西宁大数据软件公司 编辑:程序博客网 时间:2024/05/21 17:29

Linux 内核简介

Linux系统架构:
Linux系统分为用户空间内核空间两大部分。
如下图所示:
这里写图片描述

Linux采用两层结构的原因:
ARM有7种工作模式:
这里写图片描述

每种工作模式下有不同的权限。
这里写图片描述

用户空间和内核空间是程序执行的两种不同状态,通过 系统调用硬件中断 可以完成从用户空间到内核空间的转换。

Linux内核的架构:
这里写图片描述

下载Linux内核可以访问官方网站:
www.kernel.org

这里写图片描述

内核源代码中部分关键文件夹说明
这里写图片描述

这里写图片描述

这里写图片描述

使用SourceInsight软件查看linux内核源代码
新建工程:
输入工程位置和名字。
这里写图片描述
选择 project has its own configuration file 点击 OK。

点击project菜单选择向工程中添加或删除文件,
这里写图片描述
大约会由3万多个文件会添加进入工程中。
添加结束后,点击close。

然后进行同步:
点击如下图所示的按钮进行同步
这里写图片描述
这样就可以查看不同文件下相同名称的函数。

Linux 内核配置与编译

配置内核:
为什么要配置内核:
1、基于硬件的需求。如果linux内核要安装在arm平台上,则内核安装映像中就不需要包含mips、x86有关的代码。
2、基于软件的需求。例如如果linux系统仅仅需要ipv4协议,就不需要安装ipv6协议的内容。
基于以上两点,在编译linux内核之前需要对内核进行配置,选出需要的,去掉不要的。

内核配置方法:
make config:基于文本模式的交互式配置。
make menuconfig:基于文本模式的菜单型配置

通常采用第二种配置方式,比较直观简便和高效。
在内核源代码根目录下输入“make menuconfig”,然后回车,如下图所示:
这里写图片描述
得到如下的界面:
这里写图片描述

界面中会有操作提示,通过回车上下左右按键来选择配置的内容。
配置选项:通过空格键来选择

[ * ] / < * > :本次编译要选择该功能,将.c文件编译成.o文件,然后连接成为zImage文件,即内核映像文件。设备启动后,存放在内存中。

< M > :本次编译要选择该功能,为module的缩写,内核模块,.o文件会存放在某文件夹中,存放在硬盘中,当系统需要使用某一模块,就加载到内存中,这样可以节约内存空间。

[ ] / < > :本次编译不选择该功能。

内核配置结果保存位置:
输入ls -a 命令,可以查看隐藏文件,看到 .config 文件,即为配置保存结果。在很熟悉.config文件的前提下,直接修改该文件也可以对内核进行配置。

可以参考已有的配置结果文件:
内核配置通常在一个已有的配置文件基础上,通过修改得到新的配置文件,Linux内核提供了一系列可供参考的内核配置文件,位于Arch/cpu对应的文件夹/configs文件夹下
对于不清楚的配置项,可以直接采用默认配置。

这里写图片描述
这里写图片描述
在上图的位置中,配置菜单的最下方,可以输入配置文件的路径和文件名,装载某一个参考配置。

编译内核:
分为3个部分:编译内核映像、编译内核模块、将内核模块打包制作ramdisk

1、编译内核映像:

执行命令 “ make bzImage V=1 ”,V=1是编译选项,可以显示编译过程中的信息。

也可以执行命令“make zImage V=1”,但是在x86平台上,zImage只能用于小于512K的内核,而且在一些新的版本中已经不再支持该命令。

编译好的内核位于arch/< 相关的cpu >/boot/目录下。
例如:
这里写图片描述

2、编译内核模块

编译内核模块,执行“make modules”命令,对内核模块进行编译。编译好之后,编译生成的.ko文件散落在各个目录之中。

将编译好的内核模块,从内核源代码目录复制至 虚拟机的目录/lib/modules下,为打包做好准备。
方法:执行“make modules_install”命令
命令名字虽然是install但是实际上是移动。

3、打包内核模块,制作ramdisk

方法:mkinitrd initrd-xxxx xxxx
例如:mkinitrd initrd-2.6.39 2.6.39
xxxx 与目录 /lib/modules 下的内核文件夹名称相同
其中 initrd-xxxx 是打包之后生成的包的名字,这个名字可以自己随意取,最后2.6.39是内核文件夹名称不能随便写。

安装内核:
如下是在x86平台上安装linux内核的方法,在arm平台上不采用。

1、cp 内核代码/arch/x86/boot/bzImage /boot/vmlinuz-$xxxx 其中xxxx为版本号
2、cp ramdisk文件 /boot/
3、修改/etc/grub.conf

这里写图片描述

重启linux,在倒计时时按下回车键,会选择启动哪一个linux内核,这样就完成了在x86平台上的安装。

使用 uname -r 命令可以查看当前运行的内核版本。

在更换内核之后,重新启动系统,会发现系统界面和文件等都没有发生改变,linux分为用户空间和内核空间,内核是在内存中,文件系统在硬盘中,只更换内核不会改变跟文件系统,因此界面没有改变。

清理内核:
在编译过程中产生了 .o 文件 和 .ko 文件, 在配置过程中产生了 .config 文件。

两个指令:
make clean 清空 .o .ko 文件
make distclean 清空 .o .ko 文件和 .config 文件

嵌入式 Linux 内核制作

需要下载对应于开发板的linux内核。
制作嵌入式平台使用的Linux内核,方法和制作PC平台的Linux内核基本一致。

1、清除原有配置与中间文件
x86: make distclean
arm: make distclean

2、配置内核
x86: make menuconfig
arm: make menuconfig ARCH=arm
如果要运行在mips或ppc平台上,则写ARCH=mips或ARCH=ppc

3、编译内核
x86: make bzImage
arm: make uImage ARCH=arm CROSS_COMPILE=arm-linux-

注意:在缺少根文件系统时,linux系统的内核无法继续运行。