linux 源码学习计划

准备条件:必要的内核;必要的文档;必要的机器(虚拟机也可)。

 

第一周:
     1.linux和unix相比有哪些特点?
     2.内核编程和用户空间编程相比有哪些不同之处?
     3.自己编译一下内核,你编译成功了么?如果不成功,有什么问题?使用你新编译的内核,  能顺利启动么?有什么问题?
     4.linux内核源代码树中你能找到sg设备驱动是在那个文件中实现的么?sg是什么含意?
     5.清楚地了解一下内核中源代码树的结构。

 

第二周:
    主要是lkd中文版第一版第二章(英文第二版版第三章)的内容,比较重要。

     1.和进程管理相关的内核文件都有哪些?找出来大致浏览一下.
     2.什么是进程和线程?在Linux中有什么独特的地方?
     3.什么是进程描述符?怎样得到当前进程的进程描述符?进程的内核栈有多大?
     4.进程的状态都有哪些?在什么情况下发生转化?
     5.Linux中所有进程之间的关系是怎么样的?
     6.用户线程和内核线程的区别和联系?
     7.Linux是怎样创建进程和线程的?
     8.Linux怎样终结进程?
     9.对照相应的内核源代码文件,分析一下问题3、5、6、7。

 

第三周
     1.进程调度最基本的原理是什么? 
     2.列举出几个I/O消耗性和处理器消耗型的进程。 
     3.Linux都采用了哪些调度的算法?详细解释一下这些算法。 
     4.进程什么时间进入运行态?什么时间进入休眠(阻塞)状态? 
     5.了解进程抢占的算法; 
     6.讨论一下Linux进程调度的实时性怎么样,还有哪些需要提高的地方? 
     7.自己查找进程调度的相关文件,分析为题3-6。

第四周
     1、什么是系统调用?

     2、为什么需要系统调用?

     3、实现系统调用相关的代码有哪些,找出来浏览一下

     4、详细阅读getuid()这一下系统调用的实现代码

     5、如何导出sys_call_table,有几种方法,注意不同内核版本的区别

     6、尝试自己给kernel添加一个简单的系统调用。 功能要求:调用这个系统调  用,使用户的uid等于0。

     7、采用添加系统调用的方式实现一个新功能的利弊有哪些,替代方法是什么?

 

 

第六周计划:
    1、如何理解中断、中断上下文和进程上下文的区别、为何中断不能睡眠
    2、关于x86中选择子、描述符和各种门的理解
    3、查阅相关资料和内核源码理解:
              中断是如何发生以及硬件和内核是如何相应的,如何返回的;

              x86上中断发生时上下文(寄存器)如何保存以及中断返回时上下文如何恢复的,系统的第一个任务是如何启动的
    4、内核中安排下半部的理由
    5、软中断及其他的下半部策略适用于什么样的任务和场合?
    6、下半部可以睡眠么?为什么?
    7、2.4和2.6内核中下半部包括哪些部分,为何2.6内核相比2.4内核会做这样的改进
    8、阅读内核中关于软中断、tasklet以及工作队列的代码、相关书籍和资料,总结如下两个问题:
              软中断、tasklet以及工作队列是如何初始化,注册以及触发的,使用了哪些关键的数据结构及内核变量?
             软中断、tasklet以及工作队列都在什么场合下使用?

 

第七周计划: 

 内容:内核同步的理论知识。 
    1.为什么要进行内核的同步? 
    2.内核中怎么定义原子操作? 
    3.竞争产生的条件与加锁的顺序? 
    4.要保护的对象? 
    5.死锁产生的条件与解决办法? 
    6.你有什么比较好的方法来调试多线程的程序? 
    7.据一个内核中产生竞争的例子。 


第八周        

 内容:TIMERS AND TIME MANAGEMENT
    1.HZ和jiffies值的定义?
    2.内核中怎样解决jiffies的回绕?为什么这样可以解决jiffies回绕?
    3.时钟中断处理程序有哪些值得注意的地方?
    4.xtime_lock锁和seqlock锁?
    5.定时器的实现、使用和竞争条件?
    6.udelay()&mdelay()?


第九周
  内存管理
        内存管理是比较庞大的一个部分,在lkd这本书中用了很少的篇幅,从这里面我们基本能看清楚 内存管理的概貌。《情景分析》一书关于内存管理的部分讲得比较多,代码分析比较透彻也比较深入。 但是相对的难度也比较大,建议先看看lkd这本书,然后再看《情景分析》一书的内存管理。
    1.内核中内存的分页、分区;
    2.内核中有哪些函数来获得内存?内核中分配内存要注意什么?
    3.为什么使用slab?slab对象的详细分析。
    4.内核栈上内存的静态分配问题;


第十周

    虚拟文件系统
    1.为什么要设计虚拟文件系统?
    2.Linux支持哪些常见的文件系统?各有什么特点?
    3.虚拟文件系统和物理文件系统是怎么衔接起来的?
    4.虚拟文件系统的核心数据结构及其操作?
    5.分析一下用户空间中打开或者读写一个文件的时候内核中都进行了那些操作?
    6.分析一种文件系统的实现?ext2,fat32,reiserfs。

第十一周

    块I/O层
    1、什么是块设备,块设备和字符设备有什么本质区别
    2、块大小是根据什么确定的,典型值是多少?
    3、I/O调度程序的目的是什么?I/O调度和进程调度的异同?
    4、I/O调度程序如何减少磁盘寻址时间?
    5、什么是linus电梯?它是如何工作的?
    6、最终期限调度和预测调度解决了什么问题?

第十二周:

进程地址空间
    1.内存区域中的各种对象及其作用?
    2.进程描述符和内存描述符联系?内存描述符的分析和使用,在对待内存的问题上,线程和进程有什么区别?
    3.struct vm_area_struct在虚拟内存管理管理上的作用?
    4.理解/proc//map中的各种属性并自己做实验。
    5.内核中定义的内存操作函数及其使用。

第十八周

 页高速缓存和页回写
    1.你的linux系统中,RAM中的一页和磁盘上的一块大小各是多少?
          页缓存为什么要缓存一个RAM的页面大小?能不能改变一下?
   2.理解clean_pages,dirty_pages,locked_pages.
   3.提高缓存的命中率的方法通常有哪些?


第15章 调试
   1.你曾经调试过内核么?你用什么方法进行调试?
   2.调试内核的方法通常有哪些?
   3.怎么提交一个内核的bug?提交bug要注意什么 ?
   4.为什么有的人常常说printk打印不出来信息?怎么解决?
   5.自己造出一个bug,并把它调试出来。


第16章  可移植性
  1.可以从linux内核的目录结构中看出linux内核的可移植性有什么特点?
  2.数据对齐、数据类型与字节顺序在移植的时候需要注意什么?
  3.网上有大量的移植uclinux到不同平台上的文档,找一个来看看。

第十七章 补丁、开发和社区
1.如果你写的代码风格不好,怎么修改它?
2.订阅linux内核邮件列表并研究它。

注意:
LNA:Linux networking architecture
LKD:Linux kernel development
ULK:Understanding Linux kernel
lvmm:Understanding The Linux Virtual Memory Manager
情景分析:Linux内核源代码情景分析

你可能感兴趣的:(Linux,Embedded)