由上图知:Linux架构分为用户空间和内核空间
划分成用户空间与内核空间的原因?
保护操作系统,使应用程序和内核拥有不同的权限。为不同的代码制造不同的等级。。。
内核空间与用户空间是
程序执行的两种不同的状态,通过
系统调用和
硬件中断能够完成从用户空间到内核空间的转换
内核的构成:
a-->系统调用接口(SCI)、
b-->进程管理(PM)、
c-->内存管理(MM) 、
d-->关于处理器代码(arch) 、
e-->虚拟文件系统(VFS)、
f-->网络协议栈、
g-->设备驱动(DD)
关于Linux内核源代码
1、下载源代码
www.kernel.org
2、目录结构
3、工程中主要使用sourceinsight对内核源码进行管理
—————————————————————————————————————————————————————————————
1、配置内核
1.1 配置内核的原因:
--->1.1.1、硬件的需求
--->1.1.2、软件的需求;选择需要的,去掉不要的
1.2配置内核的方法(两种命令)
--->1.2.1、基于文本模式的交互式设置 make config (需逐项选择,较为麻烦)
--->1.2.2、基于菜单模式的交互式设置 make menuconfig(更为直观,此命令默认为X86平台,配置ARM平台时需指定ARCH = arm)
菜单模式下的内核配置更直观,所以选择菜单模式下配置
关于菜单选项说明:
<*>;把选中的C文件编译生成对应的中间文件(*.o),由这些(*.o)文件编译组成内核映像(zImage),启动时是将内核映像放到内存中 的
<M>:代表模块,对应的各个模块都有对应的C文件,编译时生成对应的中间文件(*.o)。并将这些中间文件放在硬盘中,等到需要用到时,就将其放置到内存中使用
<>:表示编译时不选择该功能
配置完成之后保存设置。可以看到内核根目录下多出.config文件,该文件中的每一行对应着配置的一个选项
如下图所示
注:同样可以通过修改.config文件来修改内核选项。如下
CONFIG_X86_32 is not set
由于从零开始配置内核选项较多,比较复杂。
主要配置内核的方法通常有以下两种:
第一种方法: 一般选择已有的一个内核配置文件为基础进行配置。。
譬如选择虚拟机中Linux下的配置文件进行配置。
进入内核选项配置菜单,,选择load.....如下(注:此时需将Linux的配置文件(config-2.6.32-279.el6.i686)放置内核文件夹顶层目录)
之后就可进行修改。。
第二种方法:参考内核文件目录中 /arch/arm/configs/里的不同平台的配置文件
2、 编译内核
2.1编译内核映像(同样涉及两种命令)----对应<*>选项的文件最终生成的映像文件
--->2.1.1命令 make zImage---在x86平台,zImage只能用于小于512K的内核
--->2.1.2命令 make bzImage:
若想获取详细编译信息,可使用
make zImage V=1
make bzImage V=1 ---可以列出较为完整的编译选项
根据提示;编译好的文件放在本目录下,路径:arch/x86/boot/bzImage
2.2.编译内核模块文件(以下两个命令)----对应<M>选项生成 的(.ko)文件
--->2.2.1命令 make modules---编译内核模块,时间较长
--->2.2.2命令 make modules_install---把散落在linux文件夹中的模块集中在一起--- /lib/modules目录下
2.3打包内核模块;制作init ramdisk
命令:mkinitrd initrd-$version(可任意命名) $version(此为刚编译生成的文件目录,打包此目录)
例:mkinitrd initrd-2.3-32 linux-2.3-32
3、安装内核(x86平台下才有的操作)
3.1拷贝内核:复制编译出的bzImage到启动目录下。
cp arch/$cpu/boot/bzImage /boot/vmlinuz-$version
3.2复制第二部分制作的initrd-$version到/boot/的目录下
执行cp initrd-$version /boot/
3.3修改启动配置文件,即/etc/grub.conf文件
4、清理内核
4.1命令 make clean---清除编译生成的.o文件
4.2命令 make distclean---清除编译生成的.o文件和配置文件.config