【操作系统】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

posted @ 2022-02-18 18:39  鱼儿冒个泡  阅读(337)  评论(0编辑  收藏  举报