wpxiaoaojianghu 2019-03-14
前段时间朋友让整理linux内核这一块的内容,抽空整理了下linux内核方面,主要从linux体系结构和linux内核源码两个方面来做介绍。
1. Linux体系结构(linux系统构成)
Linux可以分为两部分,分别为用户空间和内核空间具体如下图:
a) 用户空间包括:用户的应用程序、C库
b) 内核空间包括:系统调用接口、内核(狭义内核)、平台架构相关的代码
2. 为什么要分为内核空间和用户空间
我们在分析u-boot的时候就说到过,我们的cpu在不同的工作模式下可以访问的寄存器是不一样的,所以为了保护我们的操作系统,避免用户程序将内核搞崩,所以进行了内核空间和用户空间的划分。
a) Arm处理器工作模式划分:usr、FIQ、IRQ、svc、abt、und、sys
b) X86处理器工作模式划分:Ring0—Ring3,Ring0下可以执行特权指令,可以访问IO设备,Ring3则有很多的限制
注:我们可以通过系统调用和硬件中断来完成用户空间到内核空间的转移
3. Linux内核结构(广义内核)
Linux内核由七个部分构成,具体如下图:
a) 系统调用接口(SCI):open、read、write等系统调用
b) 进程管理(PM):创建进程、删除进程、调度进程等
c) 内存管理(MM):内存分配、管理等
d) 虚拟文件系统(VFS):为多种文件系统提供统一的操作接口
e) 网络协议栈:提供各种网络协议
f) CPU架构相关代码(Arch):为的是提高至移植性
g) 设备驱动程序(DD):各种设备驱动,占到内核的70%左右代码
1. 源码获取
Linux内核获取有两种方法,一种是在www.kernel.org 直接获取,另一种是使用git获取
2. 源码目录简介
其源码主要有以下目录(介绍重要目录):
a) Arch目录:存放处理器相关的代码。下设子目录,分别对应具体的CPU,每个子目录有boot,mm,以及kernel三个子目录,分别对应系统引导以及存储管理,和系统调用
b) Include目录:内核所需要的大部分头文件目录。与平台无关的在include/linux子目录下,与平台相关的则放在include相应的子目录中。
c) fs目录:存放各种文件系统的实现代码。
d) init目录:init子目录包含核心的初始化代码(不是系统的引导代码)。其包含两个文件main.c和version.c,可以用来研究核心如何工作。
e) ipc目录:包含核心进程间的通信代码。
f) kernel目录:包含内核管理的核心代码。与硬件相关代码放在arch/*/kernel目录下。
g) mm目录:包含了所有的内存管理代码。与硬件相关的内存管理代码位于arch/*/mm目录下。
h) scripts目录:包含用于配置核心的脚本文件。
i) lib目录:包含了核心的库代码,与硬件相关的库代码被放在arch/*/lib/目录下
篇幅有限,linux内核先介绍到这,后面再针对linux内核其他方面做个深入介绍,感兴趣的朋友可以关注下!