20135316王剑桥Linux内核学习笔记第四周
20135316王剑桥 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC 1000029000
1、内核态:在高执行级别,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态。而在相应的低级别执行状态下,代码的掌控范围会受到限制。只能在对应级别允许的范围内活动。从而保证真个系统更稳定。
2、Intel x86的CPU有四种不同执行级别0—3,Linux只使用其中的0和3来分别表示内核态和用户态。
3、Cs寄存器的最低两位表示当前代码的特权级别。
4、0xc0000000以上的地址空间只能在内核态下被访问;0x00000000-0xbfffffff的地址空间在两种状态下都能被访问。(逻辑地址)
5、中断处理是从用户态进入内核态的主要方式。
6、系统调用是一种特殊的中断。
7、从用户态切换到内核态时必须保存用户态的寄存器上下文。中断/int指令会在堆栈寄存器上保存一些寄存器的值。(用户态栈顶地址、当时的状态字、当时的cs:eip的值)
8、中断发生之后第一件事就是保存现场。保护现场就是进入中断程序,保存需要用到的寄存器的值,恢复现场就是退出中断程序,回复保存寄存器的数据。中断处理结束最后一件事就是恢复现场。
9、操作系统为用户态进程与硬件设备进行交互提供了一组接口—系统调用:把用户从底层的硬件编程中解放出来;极大地提高了系统的安全性;使用户程序具有可移植性。
10、应用编程接口API(一个函数),不是每一个API都对应一个系统调用。
11、系统调用的三层皮:xyz,system-call和sys-xyz。
12、当用户态进程调用一个系统调用时,CPU切换到内核态并开始执行一个内核函数
13、系统调用号使用eax寄存器。每个系统调用至少有一个参数。
14、寄存器传递参数的限制:每个参数的长度不能超过寄存器的长度(32位)、在系统调用号(eax)之外,参数的个数不能超过六个(ebx,ecx,edx,esi,edi,ebp)。如果超过六个则将某一个寄存器参数作为一个指针,指向一块内存。
实验过程:
1、库函数API使用系统调用
2、C代码中嵌入汇编代码使用系统调用
3、实验结果
总结:通过这次课的学习以及对实验的操作,使我认识到,系统调用大大致过程:应用程序在用户态调用API函数,该函数将对应的系统调用号及参数保存,触发软中断,然后陷入内核态,system_call根据系统调用号调用对应的内核函数,内核函数执行完毕后将结果存放的eax中并返回给程序,程序返回的用户态。