linux内核第一记
1.linux体系结构
从上图可知,Linux分为:用户空间和内核空间。内核空间和用户空间是程序执行的两种不同的状态,通过系统调用和硬件中断能够完成从用户空间到内核空间的转移。
www.2cto.com
2.linux内核架构
2.1系统调用接口(SCI)
SCI层为用户空间提供了一套标准的系统调用函数来访问Linux内核,搭起了用户空间到内核的桥梁。
2.2进程管理(PM)
进程管理的重点是创建进程(fork,exec),停止进程(kill,exit),并控制他们之间的通信(singal或POSIX机制),进程管理还包括控制活动进程如何共享CPU(进程调度).。
2.3内存管理(MM)
内存管理的主要作用是控制多个进程安全的共享内存区域。
2.4网络协议栈(NS)
网络协议栈为Linux提供了丰富的网络协议实现。
2.5虚拟文件系统(VFS) www.2cto.com
VFS隐藏各种文件系统的具体细节,为文件操作提供统一的接口。
2.6设备驱动(DD)
Linux内核中有大量的代码都在设备驱动程序中,他们控制特定的硬件设备。
2.7 Arch
Arch中包含内核所支持的每种CPU体系,在Arch目录中,都有每种CPU体系对应的子目录,子目录中又包含boot,mm,kenerl等子目录,分别控制系统引导,内存管理,系统调用等。如X86体系如下图:
linux内核第二记
目录结构(一般修改Arch和Drivers目录中的文件)
www.2cto.com
1.block目录
部分块设备驱动程序
2.crypto目录
加密、压缩、CRC校验算法
3.documentation
内核的文档
4.drivers目录
设备驱动程序
5.fs目录
存放各种文件系统的实现代码。每个子目录对应一中文件系统的实现,公用的源程序用于实现虚拟文件系统VFS
www.2cto.com
6.include目录
内核所需要的头文件。与平台无关的头文件在include/linux子目录下,与平台相关的都文件则放在相应的子目录中。
7.init目录
内核初始化代码
8.ipc目录
进程间通信实现代码
9.kenerl目录
Linux大多数核心功能都在这个目录实现(调度程序、进程控制、模块化)。
10.lib目录
库文件代码
11.mm目录
mm目录中的文件用于实现内存管理中与体系结构无关的部分
12.net目录
网络实现的协议代码
www.2cto.com
13.samples目录
13.samples目录
一些内核编程的范例
14.script目录
配置内核的脚本
15.security目录
SElinux的模块
16.sound目录
音频设备的驱动程序
17.usr目录
cpio命令实现
18.virt目录
内核虚拟机
linux内核第三记
Linux内核配置
Linux内核具有可定制的优点,具体步骤如下:
1.清理临时文件,中间文件和配置文件
·make clean:删除大部分产生文件(如编译中的.o文件)但是把配置保留下来。
·make mrproper:删除所有产生文件并把配置文件也删除了。
·make distclean:在make mrproper的基础上,还要删除编辑器文件和补丁文件。
2.确定目标系统的软硬件配置情况,比如CPU的型号,网卡的型号,所支持的网络协议等。
3.使下列的命令之一配置内核:
·make config:基于文本模式的交互式配置(以提问的方式配置)。
·make menuconfig:基于文本模式的菜单型配置(推荐使用)。
·make oldconfig:使用已有的配置文件(.config),但是会询问新增的配置选项。
·make xconfig:图形化的配置(需要安装图形化系统)
如果没有安装qt: www.2cto.com
sudo apt-get install libqt3-mt
sudo apt-get install libqt3-mt-dev
sudo make xconfig:
在make menuconfig后,ls -a:注意多了一个.config文件
一般情况下都用make menuconfig:如上图,y=*、n=[]、M,y或*代表的是将这个项目编译到内核中,n或空为不选择,M表示编译成模块。
[*]A.c---->A.o\
--->zimage(*要经历编译和连接)
[*]B.c---->B.o/
[M]D.c---->D.o(指编译)
[]E.c---X(不编译不连接)
配置项的选择:
参见内核配置参考.doc
常常利用已有的内核配置参考进行修改。例如进入arm中的s3c2410的配置:
把该配置拷贝到liunx内核下的.config中,然后在此基础上进行修改。
如:cp s3c2410_defconfig ../../../.config www.2cto.com
假如我要将我修改本身系统运行的内核: