x86使用GDT表实现系统调用--用户调用系统功能

系统调用

视频讲解可以看这一个课程
GDT表相关知识

原理

注册

允许应用调用操作系统的一些函数, 主要是由于权限, 需要在特区级下面运行一些操作

页表相关设置的时候有一个设置是PDE_U位, 这时候用户就可以访问这一段地址, 否则就是需要系统操作级来进行操作

实现系统调用的话使用的是系统调用门, 也是GDT表里面的一项

image-20240207134441751

image.png

这里填写的是选择子, 指向一个代码段, 也是注册在GDT表里面

  1. 调用门描述符给出了代码段的选择子,有了段选择子,就可以访问GDT或者LDT得到代码段的基地址, 需要选择内核代码段
  2. 指的是偏移量, 实际指向的就是要运行的函数
  3. TYPE字段用于标识门的类型,1100表示调用门。
  4. P: 描述符中的P位是有效位,通常是1。当它为0时,调用这样的门会导致处理器产生异常。
  5. DPL字段指明调用门的特权级,从而指定通过调用门访问特定过程所要求的特权级。
  6. Param Count: 参数个数字段指明在发生堆栈切换时从调用者堆栈复制到新堆栈中的参数个数。
//这里是系统调用,首先不初始化任务的函数地址, 之后是系统代码段, 权限设置为3, 使用三个参数
[SYSCALL_SEG / 8] = {0x0000, KERNEL_CODE_SEG, 0xec03, 0},//设置系统调用函数的地址
gdt_table[SYSCALL_SEG / 8].limit_l = (uint16_t)(uint32_t)syscall_handler;

image-20240222115654303

参数传递

image-20240222115814460

栈里面的参数的传递, 参数的个数需要在GDT表里面登记一下

权限

需要的权限

image-20240222120542064

需要代码段的权限, 以及实际访问的时候使用的段选择子的权限比调用门的权限高
image-20240222120318424

image-20240222120338844

示例: 在屏幕显示信息

原理

void task_0(void)
{uint8_t color = 0;//这一块是显存的位置unsigned short *dest = (unsigned short *)0xb8000;dest [0] = 'a' | 0x3500;//在这个地址写入一个'a'字符,后面的数字是颜色for(;;){color++;}
}

显示一个字符, 这一块是内存的位置, 这是一个80列25行的显示区域

image-20230921161254909

有80列25行

实现一个系统调用

//系统调用, 使用func记录是第几个系统调用
//str和color是显示实际使用的参数
void do_syscall(int func, char * str, char color)
{static int row=1;if(func==2){//显示一个字符串//实际的代码实现可使用上面的显示}}

实现系统调用的参数传递

在使用的时候需要人工传递一下参数

image-20230921165941136

会按照之前设置的参数, 会自动从栈里面取出来三个参数到系统的栈里面, 这个三是系统调用设置的那一个

之后人工把这三个值复制到系统栈最前面

//这一个函数给用户使用
//使用内敛汇编实现
void sys_show(char *str, char color)
{//这个是调用门的跳转位置, 偏移量不需要, 需要一个系统调用门的GDT偏移uint32_t addr[] = {0, SYSCALL_SEG};//把这几个参数记录一下, 然后调用系统调用门__asm__ __volatile__("push %[color];push %[str];push %[id];lcalll *(%[a])"::[a]"r"(addr), [color]"m"(color), [str]"m"(str), [id]"r"(2));
}

传入使用的三个参数, 之后跳转到对应的GDT对应的位置

 //设置系统调用函数的地址gdt_table[SYSCALL_SEG / 8].limit_l = (uint16_t)(uint32_t)syscall_handler;

这个函数是在汇编文件里面实现的

之后再由汇编到C的时候传递参数使用的栈

//这里已经是特权级0了
syscall_handler://对寄存器进行保护push %dspusha//使用内核数据段mov $KERNEL_DATA_SEG, %axmov %ax, %ds//获取传进来的参数, 之后再次入栈,这是因为栈会使用最下面的几个作为C语言的参数mov %esp, %ebppush 13*4(%ebp)push 12*4(%ebp)push 11*4(%ebp)call do_syscall//把之前的三个参数取出来add $(3*4), %esppopapop %ds//由于这时候使用的特权级的栈, 返回的时候用使用这一个, 后面的参数是需要从栈里面取出来的参数个数(用户栈里面的参数需要取出来)retf $(3*4)
//这是系统调用在高权限的时候执行的函数
void do_syscall(int func, char * str, char color)
{static int row=1;if(func==2){//实际的处理代码}}
//任务1
void task_0(void)
{char * str = "task1 a:1234";uint8_t color = 0;for(;;){//在这里可以调用系统接口sys_show(str, color++);}
}

另一种系统调用int $0x80

可以使用命令int $num的方式进行调用一个中断

image-20240222150221562

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

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

相关文章

xss-跨站脚本攻击漏洞

前备知识: Cookie和Session是Web开发中用于维持用户状态、跟踪用户会话的核心技术,它们的主要目的是在无状态的HTTP协议基础上实现有状态的用户交互。 **Cookie**: - Cookie是一种由服务器发送到客户端(通常是用户的浏览器&#x…

OpenAI视频生成Sora技术简析

基本介绍 Sora是春节期间OpenAI发布的产品,主要是通过文字描述生成视频,通过大规模视频数据训练而成的生成模型,当前还没开放试用。官方发布的技术报告:https://openai.com/research/video-generation-models-as-world-simulators…

无线综合测试仪8960(E5515C)

无线综合测试仪8960(E5515C) 简述: 8960是美国安捷伦(Agilent)公司生产的手机综测仪,8960测试仪是一款E5515C主机,具有特定于技术的硬件选件和软件应用程序。有两个硬件选项,8960能…

SpringBoot 学习笔记

文章目录 一、IoC二、AOP三、bean3.1 bean 生命周期3.2 三种依赖注入方式3.3 bean 线程安全 四、SpringMVC五、常用注解5.1 Scope5.2 PostConstruct 和 PreDestroy5.3 Component 和 Bean5.4 Autowired 和 Resource 六、基于 ApplicationContextAware 实现工厂模式七、事务失效八…

阿里巴巴alibaba API商品详情接口系列(商品属性,价格,主图)阿里巴巴alibaba根据ID取商品详情 API 返回值说明

阿里巴巴Alibaba的API商品详情接口系列通常用于获取指定商品的详细信息,包括商品属性、价格、主图等。与来赞达Lazada的API类似,具体的返回值可能会根据API的版本和阿里巴巴平台的更新而有所不同。 以下是一个假设的阿里巴巴API商品详情接口的返回值示例…

[AutoSar]BSW_Com03 DBC详解 (一)

目录 关键词平台说明一、DBC 定义1.1 相关工具 二、主要组成部分介绍2.1 Networks2.2 ECUs2.3 Network nodes2.4 messages2.5 signal2.6 Value Tables 三、主要组成部分关系图 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &am…

react项目引入electron进行mac、windows桌面应用打包,通过浏览器下载安装包

打包步骤 全局安装electron npm install electron -g在react项目的根目录中,创建一个新的文件夹electron,用于存放electron相关的文件在该文件夹中,创建一个新的package.json文件,并添加以下内容: {"name"…

推荐一个 Obsidian 的 ChatGPT 插件

源码地址:https://github.com/nhaouari/obsidian-textgenerator-plugin Text Generator 是目前我使用过的最好的 Obsidian 中的 ChatGPT 功能插件。它旨在智能生成内容,以便轻松记笔记。它不仅可以在 Obsidian 中直接使用 ChatGPT,还提供了优…

二叉树高频题目(不含树形DP)

二叉树高频题 二叉树的层序遍历 . - 力扣&#xff08;LeetCode&#xff09; 按点弹出 class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>>ans;if(root!nullptr){queue<TreeNode*>q;unordered_map&…

音视频技术-电脑连接调音台时交流声的产生与消除

当电脑&#xff08;笔记本/台式机&#xff09;声卡通过音频线与调音台&#xff08;或扩音机&#xff09;连接时&#xff0c;能听到“交流声”。有时很轻微&#xff0c;有时很明显&#xff0c;甚至干扰正常的演讲或发言。 很多时候&#xff0c;我们在台上演讲时&#xff0c;都会…

Centos7.9环境源码编译安装ffmpeg6.x

1.官网ffmpeg下载源码 https://ffmpeg.org/download.html#build-windows 2.未安装x264库则先安装配置 可以先查询x264库: whereis libx264 安装编译工具和依赖库&#xff1a; sudo yum install gcc make cmake mercurial git yasm pkgconfig autoconf automake libtool sudo…

UE4 材质多张图片拼接成一张图片(此处用2×2拼接)

UE4 材质多张图片拼接成一张图片&#xff08;此处用22拼接&#xff09; //TexCoord,TextureA,TextureB,TextureC,TextureDfloat3 ReturnTexture TextureA; if(TexCoord.x < 0.5 && TexCoord.y < 0.5) {ReturnTexture TextureA; } else if(TexCoord.x > 0.5…

力扣1290. 二进制链表转整数

Problem: 1290. 二进制链表转整数 文章目录 题目描述思路复杂度Code 题目描述 思路 1.记录一个变量res初始化为0&#xff0c;指针p指向链表头&#xff1b; 2.循环每次res res * 2 p -> val;p p -> next;&#xff08;充分利用二进制数的特性&#xff1b;其中利用指针先…

C++前言..

1.前言 C主要从三个模块讲起 分别是&#xff1a;语法(包括底层汇编)、面向对象以及项目实战 C语言纯面向过程 而Java纯面向对象 但是C则是一门面向过程和面向对象都较为完善的语言 并且他能做到Java所不能做到的点就是他更能够窥探底层的汇编代码 而Java是一点都不想透露给外…

leetcode初级算法(python)- 字符串

文章目录 1.反转字符串常规算法pythonic 算法2.整数反转数学法字符串法3.字符串中的第一个唯一字符pythonic算法哈希算法4.有效的字母异位词常规算法进阶算法5.最长公共前缀1.反转字符串 输入:[‘h’,‘e’,‘l’,‘l’,‘o’] 输出:[‘o’,‘l’,‘l’,‘e’,‘h’]

LeetCode 第三题: 无重复字符的最长子串

文章目录 题目描述示例 解题思路 - 滑动窗口法Go语言实现 - 滑动窗口法算法分析 解题思路 - 优化的滑动窗口法 题目描述 给定一个字符串&#xff0c;请你找出其中不含有重复字符的最长子串的长度。 示例 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串…

VMware使用虚拟机,开启时报错:无法连接虚拟设备 0:0,因为主机上没有相应的设备。——解决方法

检查虚拟机配置文件并确保物理设备已正确连接。 操作&#xff1a; 选中虚拟机&#xff0c;打开设置&#xff0c;点击CD/DVD。在连接处选择使用ISO镜像文件

.top域名解析超过72小时ping不通

域名作为网络上网站的唯一标识&#xff0c;它可以是可视的文本字符串&#xff0c;也可以是IP地址&#xff0c;它提供了一种方便的方式来访问网站&#xff0c;而不用担心网址的改变。域名可以分为不同的类型&#xff0c;如顶级域名(TLD)、国家域名(ccTLD)、通用域名(gTLD)等。因…

怎样知道员工上班浏览了哪些网页

在数字化时代&#xff0c;员工在工作时间内上网浏览网页已经成为常态。然而&#xff0c;这也为企业带来了信息安全和工作效率的隐患。为了解决这个问题&#xff0c;许多企业开始使用域智盾这样的专业软件来监控员工的上网行为。 一、域智盾软件简介 域智盾是一款功能强大的企业…

操作系统--设备管理

一、设备控制器 我们的电脑设备可以接非常多的输入输出设备&#xff0c;比如键盘、鼠标、显示器、网卡、硬盘、打印机、音响等等&#xff0c;每个设备的用法和功能都不同。为了屏蔽设备之间的差异&#xff0c;每个设备都有一个叫设备控制器&#xff08;Device Control&#xf…