Linux 0.11源码阅读笔记-总览

  • A+
所属分类:linux技术
摘要

加深对Linux操作系统的了解,了解Linux操作系统基本架构,熟悉进程管理、内存管理等主要模块知识。


Linux 0.11源码阅读笔记-总览

阅读源码的目的

加深对Linux操作系统的了解,了解Linux操作系统基本架构,熟悉进程管理、内存管理等主要模块知识。

通过阅读教复杂的代码,锻炼自己复杂项目代码的阅读能力。对于一般简短的程序,可以从main函数逐行阅读理解;对于复杂的项目,只能在了解源码主要结构的情况下,抓住某个具体的功能进行阅读。

选择较早版本的理由

Linux较新版本代码在百万行以上,而0.11版本内核不超过2万行代码。比较新版本的Linux内核源码太多且内容庞杂,自身能力不足,没有能力阅读。早期版本的代码虽然功能简陋,但基本功能都有,属于麻雀虽小五脏俱全,对于新手来说最适合不过。

不足在于0.11版本的代码中不包含专门的进程等待队列、TCP/IP网络等方面非常重要的代码,对内存的分配和使用与先进的内核也有所区别。可以在学习0.11版本代码之后,通过较新版本源码学习。

内核结构框图

内核位于用户层与硬件层之间,向下管理底层CPU、内存、磁盘等硬件,并向上通过系统调用的方式提供服务。0.11内核主要部分包括文件子系统和进程管理子系统,进程管理子系统进一步可分为内存管理、进程调度、进程通信三个主要模块。

Linux 0.11源码阅读笔记-总览

内核代码主要部分

代码文件从功能上可分为三类:

  • 硬件(异常)中断处理程序文件
  • 系统调用服务处理程序文件
  • 进程调度等通用功能文件

Linux 0.11源码阅读笔记-总览

  1. 中断处理程序

主要包括两个代码文件:

  • asm.s:实现了大部分硬件中断处理程序汇编代码
  • traps.c:实现了asm.s的中断处理过程中调用的c函数,这些c函数会在中断门中注册函数地址
  1. 系统调用处理相关程序

Linux中应用程序调用内核的功能是通过中断调用int 0x80进行的,寄存器eax中放调用号,每个调用号对应一个系统调用函数。实现系统调用的相关文件包括system_call.s、fork.c、signal.c和exit.c文件。

  • system_call.s:int 80中断调用处理程序,根据系统调用号调用相应的系统调用函数
  • fork.c、signal.c、exit.c:分别包含进程fork、信号、进程exit等相关的系统调用函数代码实现
  1. 其它通用类程序

包括schedule.c、mktime.c、panic.c、printk.c和vsprintf.c。

  • schedule.c:进程调度代码
  • mktime.c:内核使用的时间函数mktime(),仅在init/main.c中被调用一次
  • panic.c:包含panic()函数,用于内核运行出现错误时显示出错信息并停机
  • printk.c、vsprintf.c:内核显示信息的支持程序。实现了内核专用显示函数printk()和字符串格式化输出函数vsprintf()

内核函数调用关系图(Linux 2.6.26)

Linux 0.11源码阅读笔记-总览

参考

  • Linux 内核完全注释 内核版本0.11 - 赵炯