操作系统的接口以及实现

操作系统的接口以及实现

接口

接口的定义

对于用户而言,使用计算机的方式有三种:

1.命令行:linux中常用这种方式

2.图形按钮:通过鼠标点击操作实现操控,例如windows

3.应用程序

这三种方式实质上都是通过操作系统来操控计算机硬件。而操作系统为应用提供了一些重要函数,连接了应用软件和操作系统,表现为函数调用,又因由系统提供,所以称为系统调用(system_call)。

操作系统接口也具有连接两个东西、屏蔽细节、方便用户使用的特点。它连接上层应用软件和底层硬件,屏蔽细节,用户直接通过程序(应用软件)使用计算机,方便用户使用。操作系统的接口其实就是一个个函数,知道它的功能然后直接调用就行,而不用管它内核里面是怎么实现的,因为这个函数是系统调用的,所以也称为系统调用。比如:write()、read()等等

总之,什么是操作系统接口?->系统调用


系统调用的实现

直观实现

反正所想要打印的代码与系统代码都在内存里,直接跳转,直接调用不可以吗?
答:肯定是不能的。
不能随意的调用内核的数据;不能随意的jmp。如果能的话,操作系统内的很多重要的东西,比如root用户的密码,就不安全了。

计算机硬件系统并不允许我们在内存中通过jmp等跳转指令直接调用操作系统内核提供的函数,因为这样有可能会导致敏感信息的泄露

为了确保系统的安全性,计算机硬件为我们设计了内核态和用户态的模式,内核态可以访问用户态的信息,但用户态不能访问内核态。

内核(用户)态,内核(用户)段

将内核程序和用户程序隔离!!
区分内核态和用户态:一种处理器“硬件设计”

用户程序的CPL(Current Privilege Level)初始化结果是3,而操作系统内核里函数的DPL(Descriptor Privilege Level)是0,所以用户对内核的访问权限不够。

CPL寄存器表示当前程序执行在什么态,0表示内核态,3表示用户态;
DPL寄存器表示即将访问的数据在什么段,同样0表示内核段,3表示用户段。

每次访问数据的时候检查两个寄存器的大小关系,若DPL≥CPL,则可以访问,反之,则不能访问

把内存分为了操作系统内核段和用户程序用户段,把在内核段执行的代码和数据称为处于内核态,把在用户段执行的代码和数据称为处于用户态,将内核程序和用户程序隔离。所以:
内核态:处于内核态可以访问用户段和内核段的数据
用户态:处于用户态只能访问用户段的数据而不能访问内核段的数据

为了实现系统调用,操作系统为我们提供了用户程序调用内核函数的唯一方法:中断指令int。当程序执行到int指令时,int指令会将CS中的CPL修改为0,当访问内核结束之后,又将CPL重置为3继续执行用户程序。

系统调用的核心 int 0x80

(1)用户程序中包含一段包含int指令的代码 由谁做?库函数
(2)操作系统中断处理函数,获取想调程序的编号
(3)操作系统根据编号执行相应代码

posted @ 2024-06-30 18:58  _Elysia  阅读(52)  评论(0编辑  收藏  举报