操作系统的核心功能
1、内存管理
2、进程调度
3、硬件设备管理
4、文件系统
操作系统的一些拓展功能
协议栈
应用程序包
内核根目录下的主要文件介绍
1、Kbuild (kernel build) 即是内核编译,是linux内核编译体现需要的。
2、Makefile 用来管理整个工程,内核的总Makefile 。
目录介绍
1、arch 不同架构CPU的目录。
2、block 在linux中block表示块设备。
3、crypto 加密。这个目录下放了一些各种常见的加密算法的C语言代码实现。 譬如crc32、md5、sha1等。
4、Documentation。里面放了一些芯片介绍等。
5、drivers 驱动目录,里面分别列出了linux内核支持的所有硬件设备的驱 动源代码。
6、firmware 固件,什么是固件?固件其实是软件,不过这个软件是固化到IC 里面运行的叫固件。就像S5PV210里的iROM代码。
7、fs。fs就是file system,文件系统,里面列出了linux支持的各种文件系 统的实现。
8、include 头文件目录,公共的(各种CPU架构共用的)头文件都在这里。每 种CPU架构特有的一些头文件在arch/arm/include目录及其子目录下。
9、init 这个目录下的代码就是linux内核启动时初始化内核的代码。
10、ipc (inter process commuication)进程间通信。
11、kernel 内核
12、lib 库,这里面都是一些公用有用的库函数,注意这里的库函数和C语言的库函数不一样的。在内核编程中是不能用C语言标准库函数,这里的lib目录下的库函数就是用来替代那些标准库函数的。譬如在内核中要把字符串转成数字用atoi,但是内核编程中只能用lib目录下的atoi函数,不能用标准C语言库中的atoi。譬如在内核中要打印信息时不能用printf,而要用printk,这个printk就是我们这个lib目录下的。
13、mm (memory management)内存管里。
14、net 网络相关协议
15、scripts 脚本,这些脚本文件不是linux内核工作时使用的,而是用来辅助 对linux内核进行配置编译生产的
16、security。安全相关的代码。
17、sound。音频处理相关的。
18、tools linux中一些有用工具。
19、usr 目录下是initramfs相关的,和linux内核的启动有关。
20、virt 内核虚拟机相关的,暂时不用管。
主要目录:arch和drivers目录。还有include、block、mm、net、lib等目录。
内核配置
1、先确认根目录下的总Makefile
(1)主要是检查交叉编译工具链是否设置正确。CROSS_COMPILE ?= /usr/local/mushan_arm/arm-2009q3/bin/arm-none-linux-gnueabi-
(2)确认ARCH = arm。主要目的是为了编译时能找到arch/arm目录。
2、make x210ii_qt_defconfig
最后只要出现:configuration written to .config说明配置正确,否则错 误。
3、make menuconfig
在执行该命令之前,事先正确安装ucurses库,安装方法:apt-get install libncurses5-dev 屏幕要调大。
4、make
编译完成后得到的内核镜像不在源码树的根目录下,在arch/arm/boot
目录下。得到的镜像名是zImage。
内核的配置原理
配置关键:.config文件
.config文件是在执行make x210ii_qt_defconfig命令后产生的,其作用类似与uboot中的include/configs/x210_sd.h,内核在编译过程中会读取.config中的配置项,并且用这些配置项去指导整个编译链接过程。由于配置项很多,不易配置,所以make menuconfig相配合配置(图形化的配置工具menuconfig)。
make manuconfig
linux内核中一个功能模块有三种编译方法:一种是编入、一种去去除、一种是模块化。所谓编入就是将这个模块的代码直接编译连接到zImage中去,去除就是将这个模块不编译链接到zImage中,模块化是将这个模块仍然编译,但是不会将其链接到zImage中,会将这个模块单独链接成一个内核模块.ko文件,将来linux系统内核启动起来后可以动态的加载或卸载这个模块。
在menuconfig中选项前面的括号里,*表示编入,空白表示去除,M表示模块化。
menuconfig的工作原理
ncurses库是linux中用来实现文字式的图形界面,linux内核中使用了ncurses库来提供menuconfig。scripts\kconfig\lxdialog目录下的一些c文件就是用来提供menuconfig的那些程序源代码。
menuconfig在我们make menuconfig打开时,会读取.config文件,并且用.config文件中的配置选择结果来初始化menuconfig中各个菜单项的选择值。
菜单项的项目内容从Kconfig文件来,菜单项的选择值从.config文件来。
config SND_AT73C213_TARGET_BITRATE
int "Target bitrate for AT73C213"
depends on SND_AT73C213
menuconfig或者config后面空格隔开的大写字母表示的类似于SND_AT73C213_TARGET_BITRATE 的就是这个配置项的配置项名字,这个字符串前面添加CONFIG_后就构成了.config中的配置项名字。内核源码目录树中每一个Kconfig都会source引入其所有子目录下的Kconfig,从而保证了所有的Kconfig项目都被包含进menuconfig中。
tristate和bool的含义
tristate意思是三态(3种状态,对应Y、N、M三种选择方式),bool是要么真要么假(对应Y和N)。所以tristate的意思就是这个配置项可以被三种选择,bool的意思是这个配置项只能被2种选择。
Depends依赖:本配置项依赖于另一个配置项。如果那个依赖的配置项为Y或者M,则本配置项才有意义;如果依赖的哪个配置项本身被设置为N,则本配置项根本没有意义。
Kconfig和.config文件和Makefile三者的关联
(1)配置项被配置成Y、N、M会影响.config文件中的CONFIG_XXX变量的配置值。
(2)这个.config中的配置值(=y、=m、没有)会影响最终的编译链接过程。