《Linux内核完全注释》笔记(1)

来源:互联网 发布:python sys.readline 编辑:程序博客网 时间:2024/05/15 05:31
开始看《Linux内核完全注释》,不局限于此书,期望将以前不懂或不甚明白的地方弄通。不考虑时间,只培养自己的兴趣。能力有限,尽力而为
 
下载地址:http://www.oldlinux.org/download/clk011c-1.9.5.pdf
 
 感谢 赵炯老师公开这本书,另外对他的辛勤工作表示崇高的敬意!

 
内核版本:0.11(很老么?呵呵,书上有为什么用它的理由)
 
Linux 操作系统是UNIX 操作系统的一个克隆版本,作者Linus Torvalds(膜拜!),开发出FREAX(Linus最初这么叫Linux)时是赫尔辛基大学计算机科学系的二年级学生(我都22了,唉~)。当时GNU 计划 的操作系统HURD 一直在开发之中,而且看来不能在几年内完成。在通读了MINIX 操作系统后,Linus全力开发FREAX。到了1991 年的10 月5 日,Linus 在comp.os.minix 新闻组上发布消息,正式向外宣布Linux 内核系统的诞生。
 
第一章读完,感觉作者纯属在激发读者的斗志。所以只要你有足够的斗志:)看看我上面的简介就行了。
下面我们进入第二章。
 

 
 P15(这代表15页,貌似地球人都知道吧,汗,罗嗦了):
一个完整可用的操作系统主要由4 部分组成:硬件、操作系统内核、操作系统服务和用户应用程序。Linux 0.11 内核,采用的单内核模式。在单内核模式的系统中,操作系统所提供服务的流程为:应用主程序使用指定的参数值执行系统调用指令(int x80),使CPU 从用户态(User Mode)切换到核心态(Kernel Model),然后操作系统根据具体的参数值调用特定的系统调用服务程序,而这些服务程序则根据需要再底层的一些支持函数以完成特定的功能。在完成了应用程序所要求的服务后,操作系统又从核心态切换回用户态,返回到应用程序中继续执行后面的指令。
 
到这里就牵扯到一个用户态和核心态的问题。解释如下:
用户态和核心态
 
386及以上的CPU实现了4个特权级模式(WINDOWS只用到了其中两个),其中特权级0(Ring0)是留给操作系统代码,设备驱动程序代码使用的,它们工作于系统核心态;而特权极3(Ring3)则给普通的用户程序使用,它们工作在用户态。运行于处理器核心态的代码不受任何的限制,可以自由地访问任何有效地址,进行直接端口访问。而运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中I/O许可位图(I/O Permission Bitmap)中规定的可访问端口进行直接访问(此时处理器状态和控制标志寄存器EFLAGS中的IOPL通常为0,指明当前可以进行直接I/O的最低特权级别是Ring0)。以上的讨论只限于保护模式操作系统,象DOS这种实模式操作系统则没有这些概念,其中的所有代码都可被看作运行在核心态。既然运行在核心态有如此之多的优势,那么病毒当然没有理由不想得到Ring0。处理器模式从Ring3向Ring0的切换发生在控制权转移时,有以下两种情况:访问调用门的长转移指令CALL,访问中断门或陷阱门的INT指令。具体的转移细节由于涉及复杂的保护检查和堆栈切换,不再赘述,请参阅相关资料。现代的操作系统通常使用中断门来提供系统服务,通过执行一条陷入指令来完成模式切换,在INTEL X86上这条指令是INT,如在WIN9X下是INT30(保护模式回调),在LINUX下是INT80,在WINNT/2000下是INT2E。用户模式的服务程序(如系统DLL)通过执行一个INTXX来请求系统服务,然后处理器模式将切换到核心态,工作于核心态的相应的系统代码将服务于此次请求并将结果传给用户程序。
 
^_^上面的一大堆东西就牵扯出很多奇怪的名词,不管它,以后再一一解释,你只要大概明白前面三句就行了。
go on.
 
p16
Linux 内核主要由5 个模块构成,它们分别是:进程调度模块、内存管理模块、文件系统模块、进
程间通信模块和网络接口模块。
 p18
在PC/AT 系列兼容机中,使用了两片8259A芯片,共可管理15 级中断向量.
 
这里有讲到8259A,网上讲解摘抄如下:
 
8259A中断控制器
 
 
8259A是一个中断控制器。

在一个8259A芯片有如下几个内部寄存器:

Interrupt Mask Register (IMR)

Interrupt Request Register (IRR)

In Sevice Register (ISR)

IMR
被用作过滤被屏蔽的中断;IRR被用作暂时放置未被进一步处理的Interrupt;当一个Interrupt正在被CPU处理时,此中断被放置在ISR中。

除了这几个寄存器之外,8259A还有一个单元叫做Priority Resolver,当多个中断同时发生时,Priority Resolver根据它们的优先级,将高优先级者优先传递给CPU

当一个中断请求从IR0IR7中的某根线到达IMR时,IMR首先判断此IR是否被屏蔽,如果被屏蔽,则此中断请求被丢弃;否则,则将其放入IRR中。

在此中断请求不能进行下一步处理之前,它一直被放在IRR中。一旦发现处理中断的时机已到,Priority Resolver将从所有被放置于IRR中的中断中挑选出一个优先级最高的中断,将其传递给CPU去处理。IR号越低的中断优先级别越高,比如IR0的优先级别是最高的。

8259A
通过发送一个INTR(Interrupt Request)信号给CPU,通知CPU有一个中断到达。CPU收到这个信号后,会暂停执行下一条指令,然后发送一个INTA(Interrupt Acknowledge)信号给8259A8259A收到这个信号之后,马上将ISR中对应此中断请求的Bit设置,同时IRR中相应的bit会被reset。比如,如果当前的中断请求是IR3的话,那么ISR中的bit-3就会被设置,IRRIR3对应的bit就会被reset。这表示此中断请求正在被CPU处理,而不是正在等待CPU处理。

随后,CPU会再次发送一个INTA信号给8259A,要求它告诉CPU此中断请求的中断向量是什么,这是一个从0255的一个数。8259A根据被设置的起始向量号(起始向量号通过中断控制字ICW2被初始化)加上中断请求号计算出中断向量号,并将其放置在Data Bus上。比如被初始化的起始向量号为8,当前的中断请求为IR3,则计算出的中断向量为8+3=11

CPU
Data Bus上得到这个中断向量之后,就去IDT中找到相应的中断服务程序ISR,并调用它。如果8259AEnd of Interrupt (EOI)通知被设定位人工模式,那么当ISR处理完该处理的事情之后,应该发送一个EOI8259A

8259A
得到EOI通知之后,ISR寄存器中对应于此中断请求的Bit会被Reset

如果8259AEnd of Interrupt (EOI)通知被设定位自动模式,那么在第2INTA信号收到后,8259A ISR寄存器中对应于此中断请求的Bit就会被Reset

在此期间,如果又有新的中断请求到达,并被放置于IRR中,如果这些新的中断请求中有比在ISR寄存中放置的所有中断优先级别还高的话,那么这些高优先级别的中断请求将会被马上按照上述过程进行处理;否则,这些中断将会被放在IRR中,直到ISR中高优先级别的中断被处理结束,也就是说知道ISR寄存器中高优先级别的bitReset为止.
 
p18 PC/AT
 
IBM PC/AT
  
IBM PC AT是世界著名计算机公司美国国际商用机器公司(IBM)1984年发布的个人电脑产品,正式名称是IBM 5170 PC ATAT是英文先进技术”(Advanced Technology)的缩写,这是由于它引入了标准的16ISA总线以及采用了当时最新的英特尔80286处理器。PC/ATIBM公司自PC机发布后的第二代升级产品(也有人认为在此之前发布的PC/XT是第二代产品)。尽管早期的产品存在着磁盘存储部件相关的瑕疵,它最终还是迅速流行于商用及普通用户市场,成为了PC工业最持久的事实标准。至今,由于软件兼容性的原因,最新的PC系统都还支持PC/AT机的总线结构。
 
 
 
 

努力!
 
原创粉丝点击