首页 > 代码库 > 《linux 内核分析》 第4周
《linux 内核分析》 第4周
王一 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
一、linux 系统的状态
Linux在x86平台下支持0内核态和3用户态。在内核态32位平台能访问0x00000000以上的空间,而用户态只能访问小于0xc0000000一下的地址空间
(此处的地址空间为逻辑地址)。当用户态切换到内核态的时候主要方式为中断。
1、当int128调用时,系统会自动的两个状态下的cs:eip,ss:esp,eflags(标志寄存器)到堆栈。加载当前的中断的处理入口到cs:eip和 当前堆栈段加载到ss:esp。
2、进入中断之后,会把大部分通用寄存器的值保存起来。(save_all)。相反的,在退出的时候会pop这些寄存器(restore_all).
二、系统调用
1、用户态进程调用硬件设备的一组接口。提高安全性、增强可移植性。
系统调用是中断的特殊方式
API只是函数定义,而系统调用是软中断向内核发出的请求。
系统调用对应着封装例程,封装例程会调用libc库中的API函数。
封装历程的返回值依赖于系统调用。-1表示不能满足请求。
三层调用关系:
系统调用—>(API)xyz()->int0x80(eax传递参数-系统调用号)---------进入内核态------>system_call() ->sys_xyz()->system_call()->iret
如果有多个参数输入的话,保存到其他的寄存器(ebx,ecx,edx.esi,edi,ebp最多6个)中,这些寄存器中保存着要输入的数据的内存地址。
实验采用mkdir函数创建一个文件夹:
《linux 内核分析》 第4周