您的位置:首页 > 运维架构 > Linux

Linux 源代码阅读知识点及要求

2016-09-06 21:14 197 查看
说明: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 相关操作;将原理与编程实践结合
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: