操作系统接口
什么是操作系统接口?系统调用。
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执行进入内核...
还是很晕...
操作系统历史
我们的学习任务
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!