说明: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

Linux 源代码阅读知识点及要求相关推荐

  1. 非常好!!!Linux源代码阅读——环境准备【转】

    Linux源代码阅读--环境准备 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/0_prepare.html 目录 Linux 系统环境准备 ...

  2. 非常好!!!Linux源代码阅读——内核引导【转】

    Linux源代码阅读--内核引导 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html 目录 Linux 引导过程综述 BI ...

  3. linux 内核round-robin scheduler代码,LINUX源代码阅读报告

    进程调度代码分析 --关于LINUX源代码中进程调度部分的读书报告 在多进程的操作系统中,进程调度是一个全局性.关键性的问题,它对系统的总体设计.系统的的实现.功能设置以及各个方面的性能都有着决定性的 ...

  4. linux源代码阅读组合vim tags taglist

    vim+ctags+taglist 在linux下构建类似于windows sourceinsight的源码阅读环境 /***********************************/ /** ...

  5. linux源代码阅读笔记 find_entry分析

    78 static struct buffer_head * find_entry(struct m_inode * dir,79 const char * name, int namelen, st ...

  6. linux源码阅读神器,Ubuntu下安装LXR Linux源代码阅读利器

    1.安装apache2 sudo apt-get install apache2 2.安装lxr sudo apt-get install lxr 3. 在/etc/apache2/httpd.con ...

  7. Linux 下源代码阅读工具 —— vim + TagList + CTags

    为什么不采用 Windows 下较为著名的源代码阅读软件 SourceInsight, 其一,其在 Linux 下的安装较为繁琐: 其二,切换代码时背景色的变化会为人的眼部产生极为不舒服的感觉: 其三 ...

  8. linux源代码是用,阅读Linux源代码-使用lxr和glimpse

    折腾了两个多小时,好不容易才搭起来 以前也用,记得配置很容易做啊 1.glimpse-4.17.2-linux-i386.tar.gz 有新的,但装上不好用. 直接解压到/usr/local/bin下 ...

  9. 如何阅读linux软件程序代码,如何阅读linux源代码

    如何阅读linux源代码 随着linux的逐步普及,现在有不少人对于Linux的安装已经比较熟悉了.与Linux的蓬勃发展相适应,想深入了解Linux的也越来越多.而要想深入了解Linux,就需要阅读 ...

最新文章

  1. 《1024伐木累》-人生最高境界,长的好看
  2. XML PUBLISHER输出excel禁止自动将数字格式化处理
  3. mysql最小费用最大流问题_算法笔记_140:最小费用最大流问题(Java)
  4. 下载历史版本的 xCode
  5. 今天是我开通博客的第一天
  6. Matlab线性/非线性规划优化算法(3)
  7. 数据结构知识点大汇总(八)
  8. 设置sqlplus 显示列数和行数
  9. IIC控制设计读写EEPROM
  10. Flink 1.5重磅发布:处理模型重构,延迟更低!
  11. ansys 螺栓连接仿真思路
  12. 希捷服务器硬盘有什么用,NAS储存有什么用?配置什么硬盘?
  13. 字蛛font-spider报错,web font not found,碰到的最新问题及解决方法
  14. LabVIEW以编程方式启用IEPE激励
  15. 前端~css~基准线与行高、行距和半行距/圆角矩形~
  16. 大数据面试题集锦-Hadoop面试题(一)
  17. 为什么说Java中只有值传递
  18. 知识图谱构建(入门)
  19. 红米note1s android5,[FIRE]红米Note 1S MIUI6 5.5.29精简、绝对纯净、
  20. 隐私计算技术实现数据要素安全可信流通

热门文章

  1. OSChina 周一乱弹 ——节后突然不想上班的节奏
  2. Swift变量名的一种玩法
  3. 【ASP.NET随笔】DataRow和DataRowView
  4. 不知道能不能赶上用这技术的那一天
  5. filter导致跨域失效_Quarkus中过滤器filter和跨域cors问题(4)
  6. Spring 简化配置(了解/不推荐)
  7. gnome扩展_GNOME桌面的12个扩展
  8. graphql是什么_什么是GraphQL?
  9. swing程序 过时拉嘛_从关闭或过时的应用程序导入文件
  10. 如何检索Python函数的源代码