浅析linux工作原理

来源:互联网 发布:apache ftp http访问 编辑:程序博客网 时间:2024/05/16 14:33

Linux实验五

SA1*****256    **超

    在Linux操作系统中,到最后我们会发现,我们一直围绕这进程、中断(伴随着有另外两个概念:用户态和内核态)这两个概念进行的,然后为了使这两者能够更加合情合理的运行,才衍生出来了诸多概念。那么我们来看看如何让Linux操作系统能够顺利运行起来呢?

    我觉得一个操作系统的发展有两种推动力:一是用户需求,二是用户体验。我们在探寻各种操作系统发展道路上无一看到了这两点。

1、在系统眼中的进程。每个进程都有自己的4G的逻辑地址空间(注意,在linux中3G-4G空间为系统保留)且都会有task_struct用来标识自己的信息,相当于我们所说的PCB块,里面最多的信息是各种指针信息。实际上由于task_struct本身对于内核栈来说是比较大的(内核栈大小为8K),系统会用thread_info结构指向task_struct。在Linux中并没有特别的概念来区分线程,也是用task_struct结构进行标识,仅仅是在一些标志位不同。

2、函数调用堆栈的实现。进程由大大小小的函数调用组成,Linux和windows一样是通过函数堆栈实现的(4G逻辑地址中,windows中2G-4G空间为系统保留),CPU通过cs:eip寻找到执行指令地址,然后指令通过ebp(指向堆栈底),esp(指向堆栈顶)的变换操作堆栈。函数调用开始之后,压入并保存原来旧的ebp,调整ebp=esp,开辟新的函数堆栈空间,然后根据指令调整esp,和ebp值。具体实现过程详见我的另一篇实验博客:http://blog.csdn.net/zhaowenchaofang/article/details/8940349 。

3、中断分I/O中断、时钟中断和系统调用三种。CPU执行的操作是  a、当前eip esp 压入内核栈   b、把esp 指向内核栈,eip指向中断处理入口。我们会发现是否矛盾了呢?因为eip  esp是寄存器只能在一个时间点保存一个值,导致了上面两步是有矛盾的。实际上系统真正实现的过程中使用了一个TSS结构记录当前CPU状态来达到上面两个步骤的。所以上述两步可以理解为:a、先将esp指向内核栈,eip指向中断入口地址 b、把TSS中的eip esp压入内核栈。中断是可以嵌套的,且是有时机的。如果中断是从用户态进入到内核态,则系统会先使用save_all保存现场,进入内核态,处理中断程序,此后会继续调用schedule选择下一个进程,处理完之后会调用restore_all恢复现场并返回用户态。

4、中断上半部和下半部。之所以会有这个概念是因为并不是所有的中断处理都是紧急的,比如说一个网络信息传递过来,接受它是紧急的,但什么时候处理它并不紧急,系统就可以将处理信息的操作延后,从而让系统运行更加高效合理。如何区分上半部和下半部有以下几条规则:

a 如果一个任务对时间非常敏感,则将其放入中断处理程序中(即上半部)执行

b 如果一个任务和硬件相关,则放入上半部中。

c 如果一个任务保证不被其他中断打断,则放入上半部中。

d 其他放入下半部中


之后会有后续补充。

参考:《深入理解Linux内核》Daniel P.Bovet《LInux内核设计与实现》Robert Love