开始看《
Linux
内核完全注释》,不局限于此书,期望将以前不懂或不甚明白的地方弄通。不考虑时间,只培养自己的兴趣。能力有限,尽力而为
感谢 赵炯老师公开这本书,另外对他的辛勤工作表示崇高的敬意!
内核版本: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 。
当一个中断请求从 IR0 到 IR7 中的某根线到达 IMR 时, IMR 首先判断此 IR 是否被屏蔽,如果被屏蔽,则此中断请求被丢弃;否则,则将其放入 IRR 中。
在此中断请求不能进行下一步处理之前,它一直被放在 IRR 中。一旦发现处理中断的时机已到, Priority Resolver 将从所有被放置于 IRR 中的中断中挑选出一个优先级最高的中断,将其传递给 CPU 去处理。 IR 号越低的中断优先级别越高,比如 IR0 的优先级别是最高的。
8259A 通过发送一个 INTR(Interrupt Request) 信号给 CPU ,通知 CPU 有一个中断到达。 CPU 收到这个信号后,会暂停执行下一条指令,然后发送一个 INTA(Interrupt Acknowledge) 信号给 8259A 。 8259A 收到这个信号之后,马上将 ISR 中对应此中断请求的 Bit 设置,同时 IRR 中相应的 bit 会被 reset 。比如,如果当前的中断请求是 IR3 的话,那么 ISR 中的 bit-3 就会被设置, IRR 中 IR3 对应的 bit 就会被 reset 。这表示此中断请求正在被 CPU 处理,而不是正在等待 CPU 处理。
随后, CPU 会再次发送一个 INTA 信号给 8259A ,要求它告诉 CPU 此中断请求的中断向量是什么,这是一个从 0 到 255 的一个数。 8259A 根据被设置的起始向量号(起始向量号通过中断控制字 ICW2 被初始化)加上中断请求号计算出中断向量号,并将其放置在 Data Bus 上。比如被初始化的起始向量号为 8 ,当前的中断请求为 IR3 ,则计算出的中断向量为 8+3=11 。
CPU 从 Data Bus 上得到这个中断向量之后,就去 IDT 中找到相应的中断服务程序 ISR ,并调用它。如果 8259A 的 End of Interrupt (EOI) 通知被设定位人工模式,那么当 ISR 处理完该处理的事情之后,应该发送一个 EOI 给 8259A 。
8259A 得到 EOI 通知之后, ISR 寄存器中对应于此中断请求的 Bit 会被 Reset 。
如果 8259A 的 End of Interrupt (EOI) 通知被设定位自动模式,那么在第 2 个 INTA 信号收到后, 8259A ISR 寄存器中对应于此中断请求的 Bit 就会被 Reset 。
在此期间,如果又有新的中断请求到达,并被放置于 IRR 中,如果这些新的中断请求中有比在 ISR 寄存中放置的所有中断优先级别还高的话,那么这些高优先级别的中断请求将会被马上按照上述过程进行处理;否则,这些中断将会被放在 IRR 中,直到 ISR 中高优先级别的中断被处理结束,也就是说知道 ISR 寄存器中高优先级别的 bit 被 Reset 为止 .
在一个 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 。
当一个中断请求从 IR0 到 IR7 中的某根线到达 IMR 时, IMR 首先判断此 IR 是否被屏蔽,如果被屏蔽,则此中断请求被丢弃;否则,则将其放入 IRR 中。
在此中断请求不能进行下一步处理之前,它一直被放在 IRR 中。一旦发现处理中断的时机已到, Priority Resolver 将从所有被放置于 IRR 中的中断中挑选出一个优先级最高的中断,将其传递给 CPU 去处理。 IR 号越低的中断优先级别越高,比如 IR0 的优先级别是最高的。
8259A 通过发送一个 INTR(Interrupt Request) 信号给 CPU ,通知 CPU 有一个中断到达。 CPU 收到这个信号后,会暂停执行下一条指令,然后发送一个 INTA(Interrupt Acknowledge) 信号给 8259A 。 8259A 收到这个信号之后,马上将 ISR 中对应此中断请求的 Bit 设置,同时 IRR 中相应的 bit 会被 reset 。比如,如果当前的中断请求是 IR3 的话,那么 ISR 中的 bit-3 就会被设置, IRR 中 IR3 对应的 bit 就会被 reset 。这表示此中断请求正在被 CPU 处理,而不是正在等待 CPU 处理。
随后, CPU 会再次发送一个 INTA 信号给 8259A ,要求它告诉 CPU 此中断请求的中断向量是什么,这是一个从 0 到 255 的一个数。 8259A 根据被设置的起始向量号(起始向量号通过中断控制字 ICW2 被初始化)加上中断请求号计算出中断向量号,并将其放置在 Data Bus 上。比如被初始化的起始向量号为 8 ,当前的中断请求为 IR3 ,则计算出的中断向量为 8+3=11 。
CPU 从 Data Bus 上得到这个中断向量之后,就去 IDT 中找到相应的中断服务程序 ISR ,并调用它。如果 8259A 的 End of Interrupt (EOI) 通知被设定位人工模式,那么当 ISR 处理完该处理的事情之后,应该发送一个 EOI 给 8259A 。
8259A 得到 EOI 通知之后, ISR 寄存器中对应于此中断请求的 Bit 会被 Reset 。
如果 8259A 的 End of Interrupt (EOI) 通知被设定位自动模式,那么在第 2 个 INTA 信号收到后, 8259A ISR 寄存器中对应于此中断请求的 Bit 就会被 Reset 。
在此期间,如果又有新的中断请求到达,并被放置于 IRR 中,如果这些新的中断请求中有比在 ISR 寄存中放置的所有中断优先级别还高的话,那么这些高优先级别的中断请求将会被马上按照上述过程进行处理;否则,这些中断将会被放在 IRR 中,直到 ISR 中高优先级别的中断被处理结束,也就是说知道 ISR 寄存器中高优先级别的 bit 被 Reset 为止 .
p18
:
PC/AT
IBM PC/AT
IBM PC AT
是世界著名计算机公司美国国际商用机器公司
(IBM)
于
1984
年发布的个人电脑产品,正式名称是
IBM 5170 PC AT
。
AT
是英文
“
先进技术
”(Advanced Technology)
的缩写,这是由于它引入了标准的
16
位
ISA
总线以及采用了当时最新的英特尔
80286
处理器。
PC/AT
是
IBM
公司自
PC
机发布后的第二代升级产品
(
也有人认为在此之前发布的
PC/XT
是第二代产品
)
。尽管早期的产品存在着磁盘存储部件相关的瑕疵,它最终还是迅速流行于商用及普通用户市场,成为了
PC
工业最持久的事实标准。至今,由于软件兼容性的原因,最新的
PC
系统都还支持
PC/AT
机的总线结构。
努力!