操作系统接口系统调用的实现

news2024/12/23 7:35:11

接口

连接两个东西,信号转换,屏蔽细节…

操作系统接口

连接上层用户和操作系统软件,方便了使用,屏蔽了细节。

操作系统接口的形式

为应用层提供一些重要的函数,如printf,write,read等。接口表现为函数调用,又由系统提供,所以称为系统调用(system call)。

操作系统接口的一个标准 POSIX

实现POSIX标准中要求的接口的操作系统,应用程序可以在它们之上无差别运行。
在这里插入图片描述

系统调用的实现思路

走系统调用这条路更加安全,如果对访问所有内存都不做区分,那么用户可以随意调用数据。随机jmp。甚至可以看到root密码并修改它。
操作系统将内核程序和用户程序隔离,设计出内核态和用户态。用户态必须通过系统调用才能进入内核态执行。用户态执行在用户段下
内核态执行在内核段下。
为了区分内核态和用户态,需要有一种处理器硬件设计,也就是处理器保护环:
在这里插入图片描述
硬件提供了主动进入内核的方法:
对于Intel x86,那就是中断指令:

  • int int指令将使CS中的CPL改成0, “进入内核
  • 这是用户程序发起的调用内核代码的唯一方式 (此时,CPL=3而 DPL=0)

系统调用的核心就是:

  • 用户程序中包含一段有int指令的代码
  • 操作系统中事先有中断处理函数,int指令后面就是这个处理函数所在的编号
  • 操作系统根据编号执行相应的中断处理函数

实际上 这个编号是固定的,系统调用的中断号为0x80

系统调用具体实现

以printf为例,应用程序调用printf,库函数printf内部有调用库函数write(),改函数内部会做系统调用write,在linux/lib/write.c中

#include <unistd.h>
_syscall3(int, write, int, fd, const char* buf, off_t, count)

#define _syscall3(type, name, atype,a,btype,b,ctype,c)	\
								 type name(atype a, btype b, ctype c) \
								{ 
										long __res;	\
										__asm__ volatile(
											"int 0x80"
										: "=a"(__res)
										: "" (__NR_#name),"b"((long)(a)),"c"((long)(b)), "d"((long)(c));
										:);
										if(__res >=0 )
											return (type) __resl
										errno=-__res;
										return -1;
								}

这段内嵌汇编,主要是将__NR_write放入eax中,a,b,c三个参数分别放到ebx,ecx,edx中。
__NR_write是以宏定义的形式放在unistd.h中的,值为4,这个号码指示了系统调用应该去执行write对应的处理函数。
函数处理完成后,返回值在eax中,通过__res变量拿到,最后return出去。
只要是三个参数的系统调用都可以使用_syscall3宏
现在来揭晓这段代码可以运作的前提

void sched_init(void)
{
	set_system_gate(0x80, &system_call;
}

sched_init中将0x80号中断处理函数设为system_call了。做这件事情的函数叫做set_system_gate,它的本质是设置中断向量表中的0x80所代表的表项,设置该表项中的各个字段,尤其是处理函数的入口点偏移为system_call的地址值
linux/include/asm/system.h

#define set_system_gate(n, addr)	\
		_set_gate(&idt[n], 15, 3,addr);		//idt是中断向量表的基址

#define _set_gate(gate_addr, type, dpl, addr)\
		__asm__(
			"movw %%dx, %%ax \n\t"
			"movw %0, %%dx\n\t"
			"movl %%eax, %1\n\t"
			"movl %%edx, %2"
			: 
			: "i"( (short)(0x8000+(dpl<<13)+type<<8)), "o"(*((char*)(gate_addr))), "o"(*(4+(char*)(gate_addr))),\
				 "d"((char*)(addr))), "a"(0x00080000))
		    );

在这里插入图片描述

整个过程的流程图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/126937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows Active Directory —— 常见的远程控制对比

在windows环境中,需要远程访问的时候很多,使用的工具和命令也各式各样,我把自己常用的命令和工具总结一下 远程访问方式: 1)对服务器而言,RDP这个绝对是最常见的方式,mstsc /v:remoteserver 即可打开 2)winrs和winrm,这个可以允许我们通过命令行来远程访问,远程服务…

TypeScript基础类型

目录 数字 number 字符串 string 布尔 boolean 数组 Array 元组 枚举 enum 任意值 any void Null 和 Undefined null undefined Never 数字 number let age: number 24; 虽然爆红&#xff0c;但是依然能改 字符串 string let name:string"张三" 布尔 bo…

ef参数设置说明(faiss)

1、模型参数&#xff1a;1000代表聚类中心个数 随着聚类个数的增加&#xff0c;模型索引的构建时间近似指数增加但搜索精度也线性增加&#xff0c;不影响内存占用&#xff0c;几乎不影响搜索耗时 结论&#xff1a;在 Faiss 引擎的聚类情况下&#xff0c;对于百万级别的数据大概…

B/S结构和C/S结构详细介绍

什么是c/s结构、b/s结构 1、C/S结构&#xff0c;即Client/Server(客户机/服务器)结构&#xff0c;是大家熟知的软件系统体系结构&#xff0c;通过将任务合理分配到Client端和Server端&#xff0c;降低了系统的通讯开销&#xff0c;充分利用两端硬件环境的优势。早期的软件系统…

Haploview做单倍型教程1--软件安装

大家好&#xff0c;我是邓飞&#xff0c;这里介绍一下如何使用Haploview进行单倍型的分析。 计划分为三篇文章&#xff1a; 第一篇&#xff1a;Haploview做单倍型教程1–软件安装第二篇&#xff1a;Haploview做单倍型教程2-分析教程第三篇&#xff1a;Haploview做单倍型教程3…

HCIA(1)

一. 计算机网络的诞生及发展 1946年2.14日&#xff0c;美国宾夕法尼亚大学为了美国军方用于导弹计算&#xff0c;发明了世界上第一台计算机&#xff0c;而计算机改变并且引领了世界的发展。 计算机是现代一种用于高速计算的电子计算机器&#xff0c;可以进行数值计算&#x…

『C语言』字符串的输入gets()和输出puts()

&#x1f6a9;write in front&#x1f6a9; &#x1f50e;大家好&#xff0c;我是謓泽&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f3c5;2021年度博客之星物联网与嵌入式开发TOP5&#xff5…

MATLAB-fplot绘图函数

前面介绍的plot函数是将外部输人或者通过函数数值计算得到的数据矩阵转化为二维图形。在实际的应用中&#xff0c;用户可能并不知道所要绘制的二维图形中函数随着变量变化的趋势,假如此时用plot函数来绘制图形&#xff0c;则可能会由于变量的取值间隔不合理而导致所绘制的二维图…

2022年广西最新建筑施工焊工(建筑特种作业)模拟试题及答案

百分百题库提供特种工&#xff08;焊工&#xff09;考试试题、特种工&#xff08;焊工&#xff09;考试预测题、特种工&#xff08;焊工&#xff09;考试真题、特种工&#xff08;焊工&#xff09;证考试题库等,提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻…

C++【跳表】

文章目录一、什么是跳表二、跳表的实现三、跳表性能分析一、什么是跳表 skiplist本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c;跟平衡搜索树和哈希表的价值是一样的&#xff0c;可以作为key或者key/value的查找模型。 skiplist是由William Pugh发…

rabbitmq镜像模式

rabbitmq集群模式分为两种&#xff1a;普通模式和镜像模式 如果不设置集群模式则为普通模式&#xff0c;下面是将集群修改为镜像模式 镜像集群 RabbitMQ镜像功能&#xff0c;需要基于RabbitMQ策略来实现&#xff0c;策略policy是用来控制和修改群集范围的某个vhost的队列行为…

STM32/51单片机实训day8——基于Keil5+Proteus8使用DHT11温度传感器实现温湿度采集并在LM016L液晶屏上显示

目录 任务指导 1 DHT11产品概述 2 应用领域 3 传感器性能说明 4 接口说明 5 电源引脚 6 串行接口(单线双向) 通讯过程如图3所示&#xff1a; 任务实现​​​​​​​ 内 容&#xff1a;本任务使用DHT11温度传感器实现基本的端口配置、初始化时序。 学 时&#xff1a;3…

深度学习——样式迁移(笔记)

样式迁移&#xff1a;计算机视觉应用之一 1.将样式图片中的样式&#xff08;比如油画风格&#xff09;迁移到内容图片上&#xff0c;得到合成的图片 2.基于CNN的样式迁移 ①初始化合成图像&#xff0c;将其初始化内容图像。合成图像是风格迁移过程中唯一需要更新的变量X&#…

ChatGPT一战封神,和它聊完后,我更想躺平了

11 月 30 日&#xff0c;OpenAI 发布了名为 ChatGPT 的 AI 对话模型&#xff0c;它是 InstructGPT 的衍生模型&#xff0c;是根据 GPT-3.5 系列中的一个模型微调而来的&#xff0c;于 2022 年初完成训练。 用户规模达到 100 万需要多久&#xff1f;Netflix 用了三年半时间&…

刷题记录:牛客NC26257小雨坐地铁 [分层图跑最短路]

传送门:牛客 题目描述: 题目暂略 输入: 5 2 1 4 2 2 3 1 3 5 2 1 4 2 3 4 5 输出: 7一道分层图的经典题型,可以细细体会,这道题模拟出了经典的分层图题型 主要思路: 首先我们那道这道题应该不难想到最短路(这是显然的吧).大多数人应该都是卡在了建边的部分.每一条线路各自的…

【不共视的天敌】手眼标定AX = XB

一 . 手眼标定的作用及目的 机器人视觉应用中,手眼标定是一个非常基础且关键的问题。简单来说手眼标定的目的就是获取机器人坐标系和相机坐标系的关系,最后将视觉识别的结果转移到机器人坐标系下。 手眼标定行业内分为两种形式,根据相机固定的地方不同,如果相机和机器人末…

49. 残差网络(ResNet)

1. 加更多的层总是改进精度吗&#xff1f; 对于非嵌套函数类&#xff0c;较复杂&#xff08;由较大区域表示&#xff09;的函数类不能保证更接近“真”函数&#xff08; f* &#xff09;。这种现象在嵌套函数类中不会发生。 因此&#xff0c;只有当较复杂的函数类包含较小的函…

八、可变参数、stream流、异常

可变参数 介绍 定义方法参数的一种方式&#xff0c;方法的参数类型已经确定,个数不确定,我们可以使用可变参数 格式 修饰符 返回值类型 方法名(数据类型… 变量名) { }注意事项 可变参数的变量其实是一个数组如果一个方法有多个参数&#xff0c;包含可变参数&#xff0c;…

【ESP-Matter】matter协议学习笔记--以乐鑫方案为例

matter协议学习笔记--以乐鑫方案为例0. 写在前边的话1. matter 协议基本概念2. 设备间的本地自动化交互2.1 同步控制的实例&#xff1a;2.2 异步通知&#xff08;订阅、报告&#xff09;3. 桥接设备4. thread 边界路由器5. 专业名词0. 写在前边的话 以下学习笔记均参考乐鑫官方…

一位嵌入式初学者的2022年度总结

目录 学习过程 人工智能 嵌入式 51单片机 STM32 MicroPython Arduino 其他 未来计划 RT-Thread LIUNX 其他 总结 学习过程 今年二月份才开始写博客&#xff0c;到现在一共写了131篇文章&#xff0c;其中包含了Python&#xff0c;Mysql&#xff0c;51单片机&#…