说明:1、本次源代码阅读,以Linux 最新的稳定版本(2.6)为主;
2、源代码下载地址:
在官方站点 www.kernel.org 上最新稳定版本是 2.6.13.2;
在清华的 ftp 上随时都可以下载到:
ftp.tsinghua.edu.cn/mirror/kernel.org/linux/kernel/v2.6/
3、源代码阅读辅助工具:
在Windows 环境下推荐SourceInsight3.5
在Linux 环境下推荐SourceNavigator 5
这两个软件都已经上传课程论坛
4、参考书目:
《深入理解Linux 内核》,陈莉君,冯锐、牛欣源译,中国电力出版社
《Linux 内核源代码情境分析》,毛德操,胡希明著,湖南大学出版社
该书的电子稿大家可以在课程论坛上下载
(这些大多是针对2.4 及以前的版本,所以关于2.6 版本的新特色,同
学们还得自己多查阅一些新的资料)
5、本文对知识点的要求中,凡是前面带“***”的要求都可能被列为考点,在期末
考试中进行考查,所以请大家一定要认真读懂。
6、第四部分“设备管理”是选读部分,感兴趣有精力的同学可以多读一读,这部分
中标注“**”的知识点,可能作为考试的附加题出现。
7、Linux 源代码阅读仍然以4 人小组为单位进行,建议大家合理分工阅读,积极交
流讨论。后半学期鼓励有心得的小组做相关的presentation,自由报名。
一、内存管理
1. 地址映射和物理内存管理
[要求]
(1)***理解x86 的地址映射过程
(2)***理解内核符号的线性地址和物理地址的相互转换
(3)***理解物理页面的管理,内核维护描述物理页面的数据结构的作用和意义
(4)***理解内核对全局变量page 或map 的初始化,理解物理页面大致的分配情况
[代码]
(1)\linux\mm\mmap.c
精读:vma 相关的管理函数;
泛读:***L 数据结构相关函数;
(2)\linux\mm\memory.c
精读:页表和页目录操作函数,含有许多体系结构方面的知识;
(3)\linux\mm\page_io.c 和\linux\mm\page_alloc.c
精读:物理页面的分配过程
(4)\linux\mm\swap.c
精读:页面换入换出的管理,注意对页表页目录的操作,及其意义
泛读:换入换出的策略和算法;
2. 用户地址空间管理
[要求]
(1)***理解内核中维护的代表用户地址空间的数据结构
(2)***掌握用户地址空间的扩展和页故障的处理(结合物理页面映射)
(3)***理解用户地址空间共享
(4)***理解内核中对堆空间的管理,slab 块的管理(单纯的内存管理,不涉及系统
其它部分)
(5)***理解fork 系统调用时对用户地址空间的管理
[代码]
(1)\linux\mm\slab.c
精读:内核堆空间的管理函数;
泛读:涉及多处理器的部分;
(2)\linux\i386\mm\fault.c
精读:do_page_fault 函数,注意对页表以及vma 的操作;
二、Linux 中断、系统调用、时钟、定时器
1、X86CPU 对中断的硬件支持
【要求】
(1)了解X86CPU 保护模式下中断的响应机制
(2)***中断门的概念与作用
(3)***系统响应中断时,中断服务程序入口的寻址机制
【代码】无代码阅读要求,但要查阅相关资料,掌握原理性知识,这是阅读代码必需的
背景知识
2、中断向量表IDT 的初始化
【要求】
其中针对每个中断向量的一个结构数组irq_desc[ ]的设置和处理可以多了解。
(1)了解系统初始化中断机制的时机,这可能需要查阅相关资料或者阅读系统初
始化相关的代码;
(2)了解中断描述表idt_table 的表项是如何被设置的
【代码】
(1)arch/i386/kernel/i8259.c
精读:init_IRQ();
泛读:IRQ(x, y);IRQLIST_16(x);
Challenge:BULID_16_IRQS(x);BULID_IRQ(nr);
(2)arch/i386/kernel/traps.c
泛读:trap_int( ); set_intr_gate(…);_set_gate(…);
(3)include/asm-i386/irq.h
里面提供了一些相关常量的宏定义
3、中断请求队列的初始化
【要求】
了解中断服务程序是如何登记到系统中并进行相关初始化的。
(1)理解中断请求队列的意义,理解irq_desc[ ]结构中主要字段的含义
(2)***中断服务程序是通过怎样的途径挂入到中断请求队列中的
(3)区分“中断请求号”和中断向量的概念
【代码】
(1) include/linux/irq.h
泛读:数据结构irq_desc[]
(2)include/linux/interrupt.h
泛读:数据结构struct irqaction
(3)arch/i386/kernel/i8259.c
精读:init_ISA_irqs( );
(4)arch/i386/kernel/irq.c
精读:request_irq(); setup_irq()
4、中断的响应和服务
【要求】
(1)***公共响应入口common_interrupt 需要完成的工作
(2)了解中断响应前后系统堆栈的变化
(2)***系统如何根据中断号找到并执行响应的中断服务程序
(3)***Linux 中为何引入Bottom Half 机制
(4)中断返回时操作系统需要做哪些相关工作
【代码】
(1)include/asm-i386/hw_irq.h
精读:common_interrupt();
(2)arch/i386/kernel/irq.c
精读:do_irq(); handle_IRQ_event( );
(3)arch/i386/kernel/entry.S
精读:ret_from_intr
5、Bottom half
【要求】
(1)***理解Linux 引入Bottom half 机制的意义;
(2)比较Linux 2.6 版本和Linux 2.4 版本在该机制上的异同
(3)了解Bottom half 机制的框架和执行特点;
【代码】
(1)kernel/softirq.c
泛读:softirq_init();
(2)include/linux/interrupt.h
泛读:mark_bh(int nr)
(3)kernel/softirq.c
泛读:do_softirq();
6、时钟中断
【要求】
(1)***明确区分“系统时钟”、“实时时钟”、“jiffies”的概念;
(2)系统时钟的初始化;
(3)时钟中断的处理
(4)***定时器(timer)的实现
【代码】
(1)include/linux/time.h
了解相关的数据结构
(2)include/asm-386/param.h
了解相关的数据结构
(3)arch/i386/kernel/time.c
精读:time_init()
(4)kernel/timer.c
精读:do_timer( )
7、系统调用
【要求】
(1)系统调用的处理流过程是怎样的(包括响应、处理和返回)
(2)***与普通函数调用的区别
(3)***系统调用与中断的异同
【代码】
arch/i386/kernel/entry.S
精读system_call( );ret_from_sys_call();
三、进程部分
1. Linux 中的进程
[要求]
(1)了解进程和轻量级进程的概念和区别
(2)***掌握进程描述符
(3)***了解该结构中重点字段的含义
[代码]
文件名:sched.h
精读:进程描述符task_struct
2.Linux 中进程的创建
[要求]
(1)***掌握Linux 中使用该创建进程的过程
(2)***掌握相关的数据结构和相关的系统调用
(3)***了解其执行的内存变动和硬件的相关变化
[代码]
(1)文件名:fork.c
精读:do_fork()
泛读:get_pid();copy_files();copy_fs();copy_sighand();copy_mm()
(2)文件名:mm/memory.c
精读:copy_page_range()
(3)文件名:arch/i386/kernel/process.c
泛读:copy_segments();copy_thread()
3.Linux 中进程的转变
[要求]
(1)***了解通过一个新的进程覆盖原来的内存空间实现进程转变的过程
(2)***掌握其相关的数据结构和相关的系统调用
(3)了解其执行的内存的变动以及硬件相关的变化
[代码]
文件名:exec.c
精读do_execve()
泛读open_exec();search_binary_handler
4.进程的撤销
[要求]
***掌握进程是如何撤销的,比如撤销的时机,撤销的过程等
[代码]
文件名:exit.c
精读:do_exit()
泛读:sem_exit();exit_notify();forget_original_parent
5.进程的调度
[要求]
(1)***掌握Linux 进程的调度时机
(2)***掌握Linux 进程的调度策略
[代码]
文件名:sched.c
精读 :schedule();
泛读: sched.c 中的其他进程
6.进程间通信-管道、共享内存、信号、消息队列
[要求] 此部分四人一组,每人从这四种进程间通信方式选一种进行阅读
(1)***了解使用管道进行进程间通信的方法,掌握管道的创建和读写过程等
(2)***了解使用共享内存进行进程间通信的方法,掌握共享内存区的创建方法,以
及对共享内存区的控制和管理
(3)*** 了解使用信号进行进程间通信的方法,掌握信号的发送,接收和处理过程
(4)***了解使用消息队列进行进程间通信的方法,掌握消息缓冲区、消息结构、消
息队列结构,以及相关的系统调用
[代码]
(1)文件名:pipe.c
精读:do_pipe();read_pipe();write_pipe()
泛读:该文件中其余函数
(2)文件名:shm.c
精读:数据结构shmget();shmat();shmctl()
泛读:shm.c 中其他函数
(3)文件名:signal.c
精读:signal();sigaction();pause();alarm();kill()
泛读:signal.c 中其他的函数
(4)文件名:msg.c
精读:msgget();msgsnd();msgsnd()
泛读:文件中其他函数
7.进程间通信-信号量
[要求]
(1)***了解使用信号量进行进程间通信的方法
(2)***掌握信号量的创建方法、信号量的操作以及对信号量的控制和管理
[代码]
sem.c
精读:semget();semop();semctl()
泛读:sem.c 中其他函数
四、设备管理(选读)
1. 层次设备驱动实例
[要求]
(1)了解tty 设备的高级操作
(2)以tty 设备为例,理解内核意义下的设备和硬件设备的区别
(3)理解高级设备与低级设备的分工,高级设备与低级设备之间的控制权转移
[代码]
(1)\linux\drivers\char\console.c
精读:内核堆空间的管理函数;
泛读:涉及多处理器的部分;
(2)\linux\drivers\char\keyboard.c
精读:do_page_fault 函数,注意对页表以及vma 的操作;
(3)\linux\drivers\char\tty_io.c 和\linux\drivers\char\tty_ioctl.c
精读:tty 设备的高级操作,注意与其它设备的联系,以及提供的机制
泛读:操作过于细节的部分;
2. 设备文件系统devfs
[要求]
(1)**掌握用户态下通过devfs 访问设备
(2)理解devfs 挂载到文件系统中的过程,以及遍历devfs 定位目标设备的过程
(3)**理解devfs 与一般的文件系统的区别
[代码]
(1)\linux\fs\devfs\base.c 和\linux\fs\devfs\util.c
精读:设备文件系统devfs 的管理;注意devfs 与普通fs 在管理上的差别
3. 磁盘存储管理
[要求]
(1)**理解磁盘物理结构,分区信息和超级块的位置,及其内容
(2)**理解加电启动时BIOS 的默认行为,以及对磁盘的操作
(3)理解磁盘逻辑结构,文件操作转化为对磁盘的操作的过程,磁盘操作涉及的DMA
机制
[代码]
(1)\linux\kernel\dma.c
泛读:注意DMA 的工作原理,将原理与代码相互对照理解
(2)\linux\drivers\ide\hd.c
精读:硬件中断的分派和处理;
泛读:硬盘的底层操作;
(3)\linux\drivers\ide\ide_dma.c 和\linux\drivers\ide\ide_disk.c
泛读:IDE 硬盘的相关操作;硬盘DMA 相关操作;将原理与编程实践结合
转载于:https://www.cnblogs.com/RbtreeLinux/articles/2241546.html