【操作系统】2、操作系统接口
本文的中心内容提炼:
接口是什么? 用户用很熟悉的东西进入系统——连接两个东西、信号转换、屏蔽细节......
本文主要介绍两个点:1、操作系统接口(表面)是什么样的? 2、操作系统接口背后是什么样的(如何工作、底层原理)?
第一部分:操作系统接口
首先从命令行和图形界面来引入我们操作系统接口的介绍:
命令行是一段程序, 系统初始化完之后便进入这段程序, 这个程序是一个死循环, 不断等待着用户敲入命令。
图形界面是包括画图的C程序(C语言逻辑+重要函数),其中包括了消息处理机制:循环调用函数, 从内核里把消息取出来, 每取一个都会调用一个消息处理函数。
从上面两个例子,计算机是如何使用硬件的呢?
普通的C程序+重要函数
回到最初的问题: 什么是操作系统接口?
操作系统提供的重要函数。
起一个好听的名字——系统调用
一些具体的操作系统接口:
第二部分:系统调用的实现
(1)系统调用的实现动机
系统调用的直观想法
实现一个whoami系统调用
用户程序调用whoami, 一个字符串“lizhijun”放在操作系统中(系统引导 时载入),取出来打印
为什么不能直接访问该内存,要去操作系统中取?
——不能随意的调用数据, 不能随意的jmp。否则,可以看到root密码, 可以修改它…可以通过显存看到别人word里的内容…
(2)如何不让用户随意进入内核
内核(用户)态, 内核(用户)段
将内核程序和用户程序隔离!!!
用户态执行在用户段下,内核态执行在内核段下
特权级:数字越大,级别越低
(3)硬件提供了“主动进入内核的方法”
对于Intel x86,那就是中断指令,int 指令将使CS中的CPL改成0, “进入内核”
这是用户程序发起的调用内核代码的唯一方式 (此时,CPL=3而 DPL=0),也是系统调用的核心:
(1) 用户程序中包含一段包含int指令的代码
(2) 操作系统写中断处理,获取想调程序的编号
(3) 操作系统根据编号执行相应代码
其中 int 0x80非常重要
prinf 使用了 write
write 系统调用中 包含int指令的代码
LInux系统调用的细节:
其系统调用从 #define _syscall3(_syscall3(int, write, int, fd, const char *buf, off_t, count)) type 继续说起
显然,__NR_write是系统调用号,放在eax中
在linux/include/unistd.h中
#define __NR_write 4 //一堆连续正整数(数组下标, 函数表索引)
同时eax也存放返回值,ebx,ecx,edx存放3个参数
中断处理程序: system_call
_sys_call_table
参考:
https://blog.csdn.net/qq_53111905/article/details/119737978