Linux内核学习--转
linux体系结构
一个完整的操作系统包括4部分:硬件,操作系统内核,操作系统服务,和用户应用程序。内核分2种模式:单内核,微内核。单内核,结构紧凑,速度快,但层次性不强。linux0.11是单内核。
用户态-核心态
在内核态下运行的进程不能被其它进程抢占,而且一个进程不能改变另一个进程的状态。为了避免进程切换时造成内核数据错误,在执行临界区代码时,禁止中断。只有当进程从“ 内核运行态” 转移到“ 睡眠状态”时,内核才会进行进程切换操作。
linux内核包括5个模块:进程调度,内存管理,文件系统,进程间通信,网络接口进程调度是对cpu资源的控制内存管理是对存储资源的控制所有的模块都依赖于进程调度。
为了有效使用系统内存,内存分成不同的功能区域。内核程序占据物理内存开始部分。
linux内核源代码的目录结构
boot->系统引导
fs-〉文件系统
include
init
kenerl/blk_drv,chr_drv,sys
lib
mm
linux采用intel cpu的内存分页管理机制(1页4k物理内存),使用虚拟线形地址和实际物理地址映射的方法让同时执行的程序共同使用有限的内存。使用这种方法,每个执行中的程序可以使用比实际内存大得多的地址空间。
linux0.11虚拟地址空间是4G=64M*64, 每个任务(进程)有64M虚拟地址空间,最多64个任务.
每个虚拟地址空间,头部是代码区,紧接着数据区,尾部是堆栈区.
boot目录下有3个汇编文件,是内核源文件中最先被编译的程序。
主要功能是计算机上电时阴道内核启动,将内核代码加载到内存中,并作进入32位保护模式前的系统初始化工作。
bootsect.s,setup.s 需要as86来编译,使用的是as86汇编语言格式,head.s需要as编译,使用的是AT&T格式的汇编。
bootsect.s 磁盘引导块程序,编译后驻留在磁盘第一个扇区MBR。pc上电bios自检后,被bios加载到地址0x7c00处执行。
setup.s 读取机器的硬件配置参数,并把内核模块system移到合适的内存地址。
head.s 被编译连接在system模块的最前部分,做硬件探测工作,和内存管理的初始配置工作。
fs文件系统目录
包含了17个文件,诸如
buffer.c 对内存高速缓冲区的处理
file_table.c 定义了文件句柄
ioctrl.c 定义了io控制功能
exec.c exec函数簇
fcntl.c 文件i/o控制
open.c 修改,创建文件
char_dev.c 定义了字符设备读写函数
pipe.c 定义了管道读取
file_dev.c 文件读写函数
block_dev.c 块读写
truncate.c 删除文件时释放文件占用的设备空间
inode.c i节点操作
bitmap.c i节点和逻辑数据块
super.c 超级块
文件系统程序本身并不直接跟块设备的驱动打交道,而是通过高速缓冲区。
所有对文件系统中数据的访问,都需要首先读取到高速缓冲区.
include头文件主目录
kernel目录下有12个代码文件
asm.s 处理系统硬件异常引起的中断,在中断处理过程中,分别调用traps.c的处理函数
exit.c 处理进程终止的调用
fork.c 使用了2个c函数:find_empty_process, copy_process
mktime.c 时间函数mktime()
panic.c 显示内核出错信息并停机
printk.c 内核专用打印函数printk
sched.c 调度
signal.c 信号处理
sys.c 很多系统函数
system_calls.c INT 0x80 调用的系统处理
vsprintf.c 字符串格式化函数