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

此博客已经废弃,迁往http://blog.csdn.net/starflame

开始看《Linux内核完全注释》,不局限于此书,期望将以前不懂或不甚明白的地方弄通。不考虑时间,只培养自己的兴趣。能力有限,尽力而为

 

下载地址:http://www.oldlinux.org/download/clk011c-1.9.5.pdf

 

 


 

内核版本:0.11(很老么?呵呵,书上有为什么用它的理由)

 

Linux 操作系统是UNIX 操作系统的一个克隆版本,作者Linus Toravlds(膜拜!),开发出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)信号给 8259A 8259A 收到这个信号之后,马上将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,并调用它。如果 8259A End of Interrupt (EOI)通知被设定位人工模式,那么当ISR处理完该处理的事情之后,应该发送一个EOI 8259A

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

如果 8259A End 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机的总线结构。

p19

在Linux 0.11 内核中,PC 机的可编程定时芯片Intel 8253 被设置成每隔10 毫秒就发出一个时钟中断(IRQ0)信号。这个时间节拍就是系统运行的脉搏,我们称之为1 个系统滴答。

p20

Linux 0.11 内核系统最多可有64 个进程同时存在。除了第一个进程是“手工”建立以外,其余的都是进程使用系统调用fork 创建的新进程。。进程由可执行的指令代码、数据和堆栈区组成。进程中的代码和数据部分分别对应一个执行文件中的代码段、数据段。每个进程只能执行自己的代码和访问自己的数据及堆栈区。进程之间相互之间的通信需要通过系统调用来进行。内核通过调度程序分时调度各个进程运行。Linux内核堆栈和用户堆栈是分开的。用户堆栈用于进程在用户态下临时保存调用函数的参数、局部变量等数据。内核堆栈则含有内核程序执行函数调用时的信息。


白天努力工作,晚上努力看书!明天go on!

此博客已经废弃,迁往http://blog.csdn.net/starflame

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内核源代码为基础,介绍了完整的linux内核实现原理 ·选择早期linux内核进行介绍,排除了目前内核中复杂而庞大的实现细节 ·整个内核代码仅有14000行 ·提供可运行相关内核的完整实验系统 本书对早期的linux操作系统内核(v0.11)全部源代码文件进行了详细的注释和说明,旨在让读者能够在短时间内对linux工作机理获得全面而深刻的理解,为进一步学习和研究linux系统打下坚实的基础。书中首先介绍了linux系统的发展历史,着重说明了各个内核版本之间的重要区别,给出了选择0.11版作为研究对象的原因;然后依据内核源代码的组织结构对所有代码进行了详细注释。在注释的同时,还介绍了读者应该了解的相关知识,并给出了相关的硬件信息。本书还介绍了内核源代码的组织结构及相互关系。 本书适合作为计算机专业学生学习操作系统课程的实践教材和参考书,也适合linux操作系统爱好者自学,还可供具有一定基础的技术人员作为嵌入式开发应用的参考书。 *************************************************************** 请注意: 下载完,评论的同时,请点击评论框上方的五角星(共5个五角星),这样你的被扣的积分就可以返还了。 如果只评论,不点击小五角星,积分不会返还。 一定要先下载完,再评论。如果先评论后下载,或者在下载的过程中评论,积分同样不会返还。 *************************************************************** 更多linux、ARM和C语言资源请参考: http://blog.csdn.net/arkofnoach/archive/2010/10/23/5960560.aspx

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值