操作系统接口
什么是操作系统接口?系统调用。
POSIX:Portable Operating System Interface of Unix(IEEE制定的一个标准族)
分类 | POSIX定义 | 描述 |
任务管理 | fork | 创建一个进程 |
execl | 运行一个可执行程序 | |
pthread_create | 创建一个线程 | |
文件系统 | open | 打开一个文件或目录 |
EACCES | 返回值,表示没有权限 | |
mode_t st_mode | 文件头结构:文件属性 |
系统调用的实现 内核(用户)态,内核(用户)段:
- 区分内核态和用户态:一种处理器“硬件设计”;
- 当前程序执行在什么态?由于CS:IP是当前指令,所以用CS的最低两位来表示:0是内核态,3是用户态;
- 内核态可以访问任何数据,用户态不能访问内核数据;
- DPL用来表示要访问的目标内存段的特权级;
- CPL用来表示当前的特权级;
- 检查DPL>=CPL,DPL>=RPL
硬件提供了“主动进入内核的方法”:对于Intel x86,那就是中断指令int(int 0x80)
- int指令将使CS中的CPL改为0,“进入内核”。这是用户程序发起的调用内核代码的唯一方式;
- 系统调用的核心:
- 用户程序中包含一段包含int指令的代码(由库函数来做)
- 操作系统写中断指令,获取想调程序的编号
- 操作系统根据编号执行相应代码
- 应用程序调用printf() --> C函数库的库函数printf() --> C函数库的库函数write() --> OS内核系统调用write()
_syscall3的3表示是三个参数;宏展开;
__asm__这块是内嵌汇编,"=a"(__res)表示将eax中的返回值赋给__res,后面""里面是空的,表示和前面一样指的是eax,即把__NR_##name表示的系统调用号赋给eax作为参数(宏展开后就是__NR_##write),后面就是把参数a b c赋给ebx ecx edx,参数都赋好后,int 0x80执行进入内核...
还是很晕...
操作系统历史
我们的学习任务
标签:__,调用,操作系统,int,笔记,学习,指令,内核 From: https://www.cnblogs.com/summerw/p/17214799.html