操作系统(系统调用)
一. DPL目标描述符特权级,CPL当前描述符特权级
-
DPL和CPL用于区分内核态和用户态。内核态的DPL为0,用户态的DPL为3。注意每个段寄存器都有DPL的数据段。当从用户态切换到内核态时需要把段寄存器的DPL也设置为0。
-
CPL从当前段CS寄存器的低三位读出,DPL根据将要访问段的地址从GDT或LDT表中读出。每次切换 CS 时,新的段选择子会从 GDT 或 LDT 中读取段描述符,经过权限检查后加载到 CS 寄存器,并更新 CPL。
-
DPL或CPL越小优先级越高。所以DPL>=CPL时可以进行段间访问。
4. 那么如何通过系统调用访问内核函数呢?
(1)因为中断可以进行系统调用,所以如果设置某个中断的DPL=3,那用户就可以通过该中断的中断处理函数进行系统调用了,这个中断就是int0x80。中断向量表初始化中断的DPL
(2)进入中断处理函数不代表就进入了内核态,还需要在中断函数中对用户态的ds,es等寄存器的DPL都切换为0。
- DPL设置在(1)GDT,LDT表中,用于区分内核代码和用户代码。(2)IDT表中,来设置中断的访问权限,比如在中断初始化时调用了中断门描述符宏_set_gate设置DPL为3,便于用户通过中断获得权限进行系统调用,如图:
#define set_system_gate(n,addr) \_set_gate(&idt[n],15,3,addr)
二. GDT(global Descriptor Table)和LDT表
- GDT和LDT表中包含了代码段,数据段地址,以及其对应的DPL等信息。
- GDT,LDT,IDT都是在head.s被分配内存空间。在init/main.c中被初始化。
- GDT,LDT表中包含了DPL,每次切换 CS 时,新的段选择子会从 GDT 或 LDT 中读取段描述符,经过权限检查后加载到 CS 寄存器,并更新 CPL。
三. IDT中断向量表(Interrupt Descriptor Table)
-
IDT表的作用
IDT表中绑定了中断号和其中断处理函数,当触发该中断时就会调用绑定的中断函数 -
IDT表的初始化过程
在系统启动时在head.s就为IDT分配了空间,然后在init/main.c中通过调用各种init函数进行初始化(及为每个中断绑定对应的中断函数),如图
void main(void)
{trap_init(); // 异常中断blk_dev_init(); // 块设备chr_dev_init(); // 字符设备tty_init(); // 终端(含键盘)sched_init(); // 调度(含时钟和系统调用)hd_init(); // 硬盘floppy_init(); // 软盘// ...
}
其中系统调用中断初始化在sched_init(),绑定中断处理程序system_call的地址。每个初始化函数中其实都是在asm/system.h定义的宏展开,如图:
#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))#define set_system_gate(n,addr) \ /*set_system_gate没有实际的宏展开,只是作为接口。_set_gate才
是起作用的宏展开。n为中断函数号0x80*/_set_gate(&idt[n],15,3,addr) //通过中断门描述符宏设置中断的DPL
四. 系统调用的过程
- 对用户函数根据头文件中的_syscall进行宏展开
比如用户调用用户函数int alarm(int sec);
#include <unistd.h>
_syscall1(int, alarm, int, sec);
int main{int sec;alarm(sec);
}/*根据头文件中定义的宏进行展开*/#define _syscall1(type,name,atype,a) \
type name(atype a) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \: "=a" (__res) \: "0" (__NR_##name),"b" ((long)(a))); \
if (__res >= 0) \return (type) __res; \
errno = -__res; \
return -1; \
}
-
准备通过_syscall0指定的中断int 0x80,过渡到内核态(使用int 0x80中断连接用户和内核)CPL=3 DPL=0
-
触发int 0x80中断指令,查询构建好的IDT表,找到对应的中断处理函数。这里就找到了system_call.s函数。
(1)在system_call.s中判断函数号是否越界。
(2)
/*最开始进入中断函数之前,应该先将用户态原cs,ss,sp等地址入到内核栈*/
cs用户态地址段,ss用户态栈段,sp用户态栈顶指针。系统通过ss:sp对栈顶进行寻址。
这里没有显示的进行入栈,是因为触发int中断cpu会自动做这些基本的入栈操作。
结构如上图:
栈从高地址向低地址生长,同时因为触发int 0x10中断后就进入了内核态,所以此时入的内核栈,也使用的内核sp。/*入栈保护当前用段寄存器,保证之后能回到当前段继续执行*/push %dspush %es push %fs
/*ds和es的DPL也设置为内核态0*/movl $0x10,%edx // %edx和%dx是同一个寄存器,只不过%edx是在32位情况下赋值。mov %dx,%dsmov %dx,%es
/*让fs指向用户空间,因为DPL(fs)=3>0,保证了内核可通过fs访问用户数据*/movl $0x17,%edx # 0x17低三位代表用户数据段的DPL=3mov %dx,%fs
/*通过sys.h中的sys_call_table函数表,找到函数地址,并使用call调用*/
call sys_call_table(,%eax,4)/*最后执行完系统调用后,判断进程状态是否可以执行,因为进程此时可能缺失资源会变为阻塞。还要判断是否
当前进程还有剩余时间片。以上的信息都从PCB中获取,如果不满足则执行reschedule把当前位置入栈,执行其他进程*/
reschedule:pushl $ret_from_sys_calljmp schedulecmpl $0,state(%eax) # PCB中的statejne reschedulecmpl $0,counter(%eax) # PCB中的counterje reschedule
五. PCB和TSS
PCB部分代码
// sched.h
struct task_struct {
/* these are hardcoded - don't touch */long state; /* 进程状态-1 unrunnable, 0 runnable, >0 stopped */long counter; /*进程剩余时间片*/long priority; /*进程优先级*/
TSS(TSS用于任务切换)
-
每个用户态进程都有自己的内核栈和对应的内核态栈指针esp0和内核态栈段ss。这是进程的双栈结构。这样保证了多个进程并发进入内核态时所处的地址都不同,执行时不会干扰。
-
进程双栈结构图
(1)PCB结构体指针指向PCB结构体首地址。
(2)两个栈指针分别指向两个不同的栈空间。
TSS部分代码:
struct tss_struct {long back_link; /* 16 high bits zero */long esp0; /* 内核栈指针 */long ss0; /* 内核栈段 */long esp1; /* 用户栈指针 */long ss1; /* 用户栈段 */long eflags; /* 标志寄存器 */long eax,ecx,edx,ebx; /* 通用寄存器 */long esp; /* 栈指针 */long ebp; /* 基址指针 */long esi; /* 源索引 */long edi; /* 目的索引 */long es; /* 段寄存器 */long cs; /* 代码段 */long ss; /* 栈段 */long ds; /* 数据段 */long fs; /* 附加段 */
};
相关文章:
操作系统(系统调用)
一. DPL目标描述符特权级,CPL当前描述符特权级 DPL和CPL用于区分内核态和用户态。内核态的DPL为0,用户态的DPL为3。注意每个段寄存器都有DPL的数据段。当从用户态切换到内核态时需要把段寄存器的DPL也设置为0。 CPL从当前段CS寄存器的低三位读出&#x…...
“iOS profile文件与私钥证书文件不匹配”总结打ipa包出现的问题
目录 文件和证书未加载或特殊字符问题 证书过期或Profile文件错误 确认开发者证书和私钥是否匹配 创建证书选择错误问题 申请苹果 AppId时勾选服务不全问题 总结 在上线ios平台的时候,在Hbuilder中打包遇见了问题,生成ipa文件时候,一…...
C4D细分曲面工具
细分为1,原理是连接两条临边的中点 细分为2 当对正方形进行循环切割时, 会改变临边 下图:没显示细分曲面 显示细分曲面...
FreeSWITCH 简单图形化界面34 - 网络环境安全的情况下,进行任意SIP注册
FreeSWITCH 简单图形化界面34 -网络环境安全的情况下,进行任意SIP注册 测试环境1、前言2、参数3、实践一下 测试环境 http://myfs.f3322.net:8020/ 用户名:admin,密码:admin FreeSWITCH界面安装参考:https://blog.cs…...
qt 发布简单项目
在 Qt 中将您的应用程序从调试模式发布为释放(Release)模式主要涉及到几个步骤。以下是一个简化的流程,适用于使用 Qt Creator 的用户: 1. 切换到 Release 模式 打开 Qt Creator。在左侧的项目视图中,选择您的项目。…...
SpringBoot启动流程
SpringApplication.run(XxxApplication.class, args); 加载各种配置信息,初始化容器并返回 1. 创建SpringApplication对象 (1)确认web应用类型,一般情况下是Servlet类型,将来会自动启动一个tomcat (2&am…...
Metasploit模块具体有哪些?
Metasploit框架是一个用于渗透测试和安全研究的强大工具,它提供了大量的模块,用于自动化漏洞利用、攻击和后期渗透等各类任务。Metasploit模块可以分为几种不同的类型,具体包括: 1. Exploit模块(漏洞利用)…...
【数据结构 | C++】部落
在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈。我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查任意两个人是否属…...
Kafka 数据倾斜:原因、影响与解决方案
Kafka:分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析:从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析:…...
python特殊字符序列
字符 描述 \A 只匹配字符串的开始 \b 匹配一个单词边界 \B 匹配一个单词的非边界 \d 匹配任意十进制数字字符,等价于r[0-9] \D 匹配任意非十进制数字字符,等价于r[^0-9]’ \s 匹配任意空格字符(空格符、tab制表符、换…...
银河麒麟v10 二进制kubeadm+containerd搭建k8s集群(证书100年)—— 筑梦之路
环境说明 银河麒麟v10 x86架构,cgroup v2启用 系统内核:5.4.x 源码编译安装 kubeadm 1.31.2 自编译二进制文件,证书有效期100年 containerd 版本:2.0.0 IPHostnameOS VersionKernel VersionComment192.168.10.100k8s-master…...
uniapp 选择 省市区 省市 以及 回显
从gitee仓库可以拿到demo 以及 json省市区 文件 // 这是组件部分 <template><uni-popup ref"popup" type"bottom"><view class"popup"><view class"picker-btn"><view class"left" click"…...
HashMap底层原理
jdk1.8之后hashmap底层结构 jdk1.8之后,是哈希表数据结构,也可以说是数组链表或红黑树,下图是没有添加数据的一个hashmap。 现在开始添加数据,看下面具体步骤 put操作 如下,我们来简单看看hashmap的put源码ÿ…...
【8210A-TX2】Ubuntu18.04 + ROS_ Melodic + TM-16多线激光 雷达评测
简介:介绍 TM-16多线激光雷达 在8210A载板,TX2核心模块环境(Ubuntu18.04)下测试ROS驱动,打开使用RVIZ 查看点云数据,本文的前提条件是你的TX2里已经安装了ROS版本:Melodic。 大家好,…...
C语言--分支循环编程题目
第一道题目: #include <stdio.h>int main() {//分析://1.连续读取int a 0;int b 0;int c 0;while (scanf("%d %d %d\n", &a, &b, &c) ! EOF){//2.对三角形的判断//a b c 等边三角形 其中两个相等 等腰三角形 其余情…...
Flutter:AnimatedIcon图标动画,自定义Icon通过延时Interval,实现交错式动画
配置vsync,需要实现一下with SingleTickerProviderStateMixinclass _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{// late延迟初始化 AnimationControllerlate AnimationController _controller;overridevoid initStat…...
单向链接表
# 封装普通节点的类 class Node:# 构造函数 定义节点的属性def __init__(self, data):self.data data #普通节点的数据域self.next None #普通节点的链接域 刚构造的节点该位置域为空# 封装链表的类(封装头节点) class LinkList:#构造函数def __init…...
用自由贸易去推动西安低空经济创新发展
——金庆培在中国(西安)国际低空经济发展大会上的发言 首先,我非常感谢大会组织委员会能邀请我参加今天的盛会。我代表中国自由贸易区创新发展研究联盟向大会的召开表示最热烈的祝贺在此,并预祝大会圆满成功! 我的发言…...
三开关VUE组件
一、使用效果 <template><QqThreeSwitch v-model"value" /><!-- <SqThreeSwitch v-model"value" :options"[test1, test2, test3]"><template #left-action><div style"display: flex"><IconMoon…...
介绍一下stricmp(c基础)
hi , I am 36 适合对象c语言初学者 stricmp(arr1,arr2);是不区分大小写的比较 格式 #include <string.h> strcmp (arr1,arr2); 工作原理:strcmp函数按照ACII(字符编码顺序)比较两个字符串。它从两个字符串的第一个字符开始逐个比…...
恋爱通信史之身份验证和不可抵赖性
在前文保密性中讲到:私钥就是一种身份的象征。那么,使用公钥能解密采用私钥加密的数据,就是表明该条信息就是私钥持有者发送的。那接下来就阐述一下,采用私钥加密公钥解密方式的数字签名和数字证书。 数字签名——不可抵赖性 抵…...
docker搭建私有的仓库
docker搭建私有仓库 一、为什么要搭建私有的仓库? 因为在国内,访问:https://hub.docker.com/ 会出现无法访问页面。。。。(已经使用了魔法) 当然现在也有一些国内的镜像管理网站,比如网易云镜像服务、Dao…...
苹果系统中利用活动监视器来终止进程
前言 苹果系统使用的时候总是感觉不太顺手。特别是转圈的彩虹球出现的时候,就非常令人恼火。如何找到一个像Windows那样任务管理器来终止掉进程呢? 解决办法 Commandspace 弹出搜索框吗,如下图: 输入“活动”进行搜索ÿ…...
Wekan看板安装部署与使用介绍
Wekan看板安装部署与使用介绍 1. Wekan简介 Wekan 是一个开源的看板式项目管理工具,它的配置相对简单,因为大多数功能都是开箱即用的。它允许用户以卡片的形式组织和跟踪任务,非常适合敏捷开发和日常任务管理。Wekan 的核心功能包括看板…...
Linux常用命令之passwd命令详解
passwd 命令详解 passwd 命令在 Linux 和 Unix 系统中用于更改用户的密码,以及进行账户锁定、密码失效等相关操作。它是系统管理员和普通用户日常管理用户账户安全的重要工具。以下是对 passwd 命令的详细说明,包括其语法、选项和示例。 基本语法 pas…...
【django】扩展
1. Promise 1.1 对象和状态 是什么?是前端开发时js中的一个对象(包裹)。【对象】【异步请求】# 对象中有一个状态的值,status # 创建对象,不赋值,statuspendding let v1 new Promise(function(resolve, …...
Vue3 生命周期钩子详解
Vue3 生命周期钩子详解 简介 Vue3的生命周期钩子让我们能够在组件的不同阶段执行自定义代码。与Vue2相比,Vue3的生命周期钩子在Composition API中有了新的使用方式,但整体概念保持一致。 基础知识 Vue3中的生命周期钩子可以通过两种方式使用…...
LeetCode 力扣 热题 100道(八)相交链表(C++)
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后&…...
RabbitMQ2:介绍、安装、快速入门、数据隔离
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
Docker Seata分布式事务保护搭建 DB数据源版搭建 结合Nacos服务注册
介绍 Seata(Simple Extensible Autonomous Transaction Architecture)是一个开源的分布式事务解决方案,旨在为微服务架构中的分布式系统提供事务管理支持。Seata 通过提供全局事务管理,帮助开发者在分布式环境中保持数据一致性 …...
elasticsearch7.10.2集群部署带认证
安装elasticsearch rpm包安装 下载地址 https://mirrors.aliyun.com/elasticstack/7.x/yum/7.10.2/ 生成证书 #1.生成CA证书 # 生成CA证书,执行命令后,系统还会提示你输入密码,可以直接留空 cd /usr/share/elasticsearch/bin ./elasticsearch-certutil ca#会在/usr/share/el…...
opencv-python 分离边缘粘连的物体(距离变换)
import cv2 import numpy as np# 读取图像,这里添加了判断图像是否读取成功的逻辑 img cv2.imread("./640.png") # 灰度图 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 高斯模糊 gray cv2.GaussianBlur(gray, (5, 5), 0) # 二值化 ret, binary cv2…...
UVM 验证方法学之interface学习系列文章(七)高级 《bind 操作》(4)级联
在 SystemVerilog 中,bind 操作符用于将一个模块或接口实例绑定到另一个模块或接口的层次结构中。这在很多情况下非常有用,尤其是当你需要在不修改原始模块代码的情况下,添加或替换某些组件时。bind 操作符常用于仿真和测试平台中,以便灵活地组织测试环境。 前面的文章,我…...
08 —— Webpack打包图片
【资源模块 | webpack 中文文档 | webpack中文文档 | webpack中文网】https://www.webpackjs.com/guides/asset-modules/?sid_for_share99125_3 Webpack打包图片以8KB为临界值判断 大于8KB的文件:发送一个单独的文件并导出URL地址 小于8KB的文件:导出一…...
goframe开发一个企业网站 MongoDB 完整工具包19
1. MongoDB 工具包完整实现 (mongodb.go) package mongodbimport ("context""fmt""time""github.com/gogf/gf/v2/frame/g""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options" )va…...
从ES的JVM配置起步思考JVM常见参数优化
目录 一、真实查看参数 (一)-XX:PrintCommandLineFlags (二)-XX:PrintFlagsFinal 二、堆空间的配置 (一)默认配置 (二)配置Elasticsearch堆内存时,将初始大小设置为…...
Oracle JDK(通常简称为 JDK)和 OpenJDK区别
Java 的开发和运行时环境主要由两种实现主导:Oracle JDK(通常简称为 JDK)和 OpenJDK。尽管它们都基于同一个代码库,但在一些关键点上有所区别。以下是详细的对比: 1. 基础代码 Oracle JDK: 基于 OpenJD…...
格约减技术的工作原理
1. 格基约减的定义和目标 格基约简的目标是找到一组新的基,使得这些基向量的大小满足特定的不等式,并且这些基向量更加趋于正交。 2. LLL算法的基本原理 LLL算法通过一系列变换实现向量基底的逐步优化,最终到达一个“约减”基底。这个约减…...
M|横道世之介
rating: 8.0 豆瓣: 8.8 上映时间: “2013” 类型: M剧情爱情 导演: 冲田修一 Shichi Okita 主演: 冲田修一 Shichi Okita吉高由里子 Yuriko Yoshitaka 国家/地区: 日本 片长/分钟: 160分钟 M|横道世之介 横道世之介是一个热情、纯真的人,大家…...
el-select 和el-tree二次封装
前言 本文章是本人在开发过程中,遇到使用树形数据,动态单选或多选的需求,element中没有这种组件,故自己封装一个,欢迎多多指教 开发环境:element-UI、vue2 组件效果 单选 多选 组件引用 <treeselec…...
RocketMQ: Broker 使用指南
Broker 配置参数 获取 Broker 的默认配置 $ sh mqbroker -m Broker 启劢时,如何加载配置 ### 第一步生成 Broker 默认配置模版 sh mqbroker -m > broker.p ### 第二步修改配置文件, broker.p ### 第三步加载修改过的配置文件 nohup sh mqbroker -c broker.pBrok…...
ubuntu安装ros1
以Ubuntu 18.04为例: 1.如果源没有切换到国内的建议切换 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo vi /etc/sources.list删除原来的源切换到清华大学源 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 de…...
C++ 中的模板特化和偏特化
模版特化是为特定的模版参数类型提供提供专门的实现。 当需要为特定类型的模板参数提供不同的实现时,可以使用模板特化。模板特化允许你为特定的模板参数类型编写专门的代码,而不是使用通用的模板代码。 例如,对于一个通用的模板函数&#…...
CTFHUB--yeeclass-web
复现平台CTFHUB靶机为一个完整类论坛网页,题目给了服务端完整代码 代码审计 /src/submit.php Line56-63: 可以看到提交数据存入的时候将$_SESSION["username"]."_"作为前缀,生成了一个uniqid。uniqid的生成方式即{sec:08x}{usec:0…...
GM、BP、LSTM时间预测预测代码
GM clc; clear; close all;%% 数据加载和预处理 [file, path] uigetfile(*.xlsx, Select the Excel file); filename fullfile(path, file); time_series xlsread(filename);% 确保数据是一列 time_series time_series(:);% 归一化数据 min_val min(time_series); max_v…...
2022 年中高职组“网络安全”赛项-海南省省竞赛任务书-1-B模块B-1-Windows操作系统渗透测试
前言 本章节我将带领大家一起重新模拟操作一次Windows渗透测试模块,并加固的流程。 任务概览 环境部署 我的实验复现环境: 服务器Windows server 2008 R2 攻击机Kali Linux 场景操作系统Windows 7 额外还有台交换机支持: 这里我使用的是…...
【6】STM32·FreeRTOS·列表和列表项
目录 一、列表和列表项的简介 1.1、列表 1.2、列表项 1.3、迷你列表项 1.4、列表和列表项的关系 二、列表相关API函数介绍 2.1、初始化列表vListInitialise() 2.2、初始化列表项vListInitialiseItem() 2.3、列表插入列表项vListInsert() 2.4、列表末尾插入列表项vLis…...
嵌入式硬件电子电路设计(五)MOS管详解(NMOS、PMOS、三极管跟mos管的区别)
引言:在我们的日常使用中,MOS就是个纯粹的电子开关,虽然MOS管也有放大作用,但是几乎用不到,只用它的开关作用,一般的电机驱动,开关电源,逆变器等大功率设备,全部使用MOS管…...
Leetcode 最长回文子串
目录 解法1:递归算法 解法2:Map取同字母位置法 解法3:中心扩展法 解法4:动态规划法 解法5: Manacher算法 示例 1: 输入:s "babad" 输出:"bab" 解释:&quo…...
使用ENSP实现NAT
一、项目拓扑 二、项目实现 1.路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1关闭信息中心 undo info-center enable进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为12.12.12.1/30 ip address 12.12.12.1 30进入e0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置…...