首页 > 代码库 > 《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周