Linux内核学习

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

系统调用是程序主动发起的,硬件中断时被动的。Linux内核学习_第1张图片

Linux内核组成:系统调用接口,进程管理,内存管理,Arch,设备驱动程序,网络协议栈,虚拟文件系统。

Linux内核学习_第2张图片

内核目录结构:

(1)Arch:是architecture的缩写。内核所支持的每种CPU的体系,在该目录下都有对应的子目录。每个CPU子目录,有进一步分解为boot,mm,kernel等子目录,分别包含控制系统引导,内存管理,系统调用等。

(2)block:部分块设备驱动程序。

(3)crypto:加密、压缩、CRC校验算法。

(4)documentation:内核的文档。

(5)driver:设备驱动程序。

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

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

(8)lib目录:库文件代码。

(9)mm目录:mm目录中的文件用于实现内存管理中与体系无关的部分。

(10)net目录:网络协议实现代码。

(11)samples:一些内核编程的范例。

(12)scripts:配置内核的版本。

(13)security:SELinux的模块。

(14)sound:音频设备驱动文件。

(15)usr:cpio命令实现。

(16)virt:内核虚拟机。


嵌入式系统:以应用为中心,软硬件可裁剪,对功耗、体积、成本等严格要求的专业计算机系统。

内核配置和编译

Linux内核具有可定制的优点具体步骤如下:

1.清除临时文件、中间文件和配置文件:make clean,删除产生的文件比如说o文件,但是不能删除配置文件;

   :make mrproper,删除产生的文件和配置文件;

   :make distclean,mrproper+remove editor backup and patch files;

2.确定目标系统的软硬件配置情况,比如CPU的类型、网卡的型号,所需支持的网络协议等。

3.使用如下命令之一配置内核:(1)make config,基于文本模式的交互式配置;

  (2)make menuconfig,基于文本模式的菜单型配置(推荐使用);

  (3)make oldconfig,使用已有的配置文件,但是会询问新增的配置选项;

  (4)make xconfig,图形化配置(需要安装图形化系统)。

*和m产生->.o,而*再产生image,m只编译不链接,*编译链接

n什么也不产生 

内核配置通常在一个已有的配置文件基础上,通过修改得到新的配置文件,Linux内核提供了一些列可参考的内核配置文件,位于Arch/$cpu/configs。

4.编译内核:

(1)make zlmage

(2)make bzlmage

区别:在x86平台上,zlmage只能用于小于512k的内核。

如需获取详细的信息,可使用:

(1)make zlmage V=1

(2)make bzlmage V=1

编译好的内核位于arch//boot/目录下

5.编译内核模块:

make modules

6.安装内核模块:

make modules_install,将编译好的内核模块从内核源代码目录copy至/lib/modules下。

7.制作init ramdisk

mkinitrd initrd-$version $version

例:mkinitrd initrd-2.6.29 2.6.29

version可以通过查询/lib/modules下的目录得到。

内核安装

1.cp arch/x86/boot/bzlmage/boot/vmlinuz-$version
2.cp $initrd /boot/boot/
3.修改/etc/grub.conf或者/etc/lilo.conf
version为所编译的内核版本号。

内核模块

什么是内核模块?
Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用需要的组件呢?
(1)把所有的组件都编译进内核文件zlmage或bzlmage,但这样会导致两个问题:一时生成的内核文件过大;二是如果要添加和删除两个组件,要重新编译整个内核。
有没有一种机制让内核文件本身并不包含某组件,二是组件需要被使用的时候,动态添加进正在运行的内核呢? 有,Linux提供了一种内核模块的机制就是实现了以上的效果。
内核模块特点:(1)模块本省并不被编译进内核文件;(2)可以根据需求,在内核运行期间动态的安装和卸载。

程序机构:
1.模块加载函数(必须):安装模块时被系统自动调用的函数,通过module_init宏来指定。Linux内核学习_第3张图片
2.模块卸载函数(必须) 卸载模块时被系统自动调用的函数通过module_init宏来指定。
模块的编译,在Linux2.6下编译内核模块,通常使用makefileLinux内核学习_第4张图片

内核模块的安装和卸载:Linux内核学习_第5张图片Linux内核学习_第6张图片
模块可选信息:
Linux内核学习_第7张图片
Linux内核学习_第8张图片
Linux内核学习_第9张图片Linux内核学习_第10张图片Linux内核学习_第11张图片
Linux内核学习_第12张图片

Linux内核学习_第13张图片

Linux内核学习_第14张图片Linux内核学习_第15张图片

你可能感兴趣的:(Linux学习)