Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >中断描述符表

中断描述符表

作者头像
shysh95
发布于 2021-09-24 03:27:07
发布于 2021-09-24 03:27:07
84311
代码可运行
举报
文章被收录于专栏:shysh95shysh95
运行总次数:1
代码可运行

Hi~朋友,码字不易,点点关注呗

摘要

  1. 中断描述符表
  2. 中断描述符寄存器
  3. 中断细节
  4. 中断错误码

中断描述符表

什么是中断描述符表?

中断描述符表是保护模式下用于存储中断处理程序的数据结构。CPU在接收到中断时,会根据中断向量在中断描述符表中检索对应的描述符。

中断描述符表中的描述符有哪些类型?

中断描述表中的主要包含以下类型:

  • 任务门描述符
  • 中断门描述符
  • 陷阱门描述符
  • 调用门描述符

任务门描述符结构如下:

任务门需要和任务状态段(TSS)配合使用,这是Intel处理器在硬件一级提供的任务切换机制。任务门可以存在于全局描述符GDT、局部描述符表LDT以及中断描述符表IDT中。

中断门描述符结构如下:

中断门包含中断处理程序所在的段选择子和段内偏移地址,当通过此方式进入中断后,标志寄存器eflags中的IF位自动置0,表示把中断关闭,避免中断嵌套。中断门只存在于中断描述符表IDT。

陷阱门描述符结构如下:

通过陷阱门进入中断,标志寄存器eflags的IF位不会自动置0,陷阱门只允许存在于IDT中。

调用门描述符结构如下:

调用门是用户进程用来进入0特权级的方式,其DPL为3。调用门可以在GDT和IDT中存在的,只能使用call和jmp指令调用。

中断描述符表存储的位置不固定。

中断描述符寄存器

如何找到中断描述符表?

CPU内部有个中断描述符寄存器IDTR,该寄存器的结构图如下图:

第0~15位是表界限,即IDT减1,可容纳8192个中段描述符;第16~47位是IDT的基地址。

通过lidt 48位内存数据指令便可将中断描述符表的信息加载到IDTR寄存器中。

中断细节

中断处理过程包含哪两部分?

CPU外部:外部设备的中断由中断代理芯片接收,处理后将该中断的中断向量号发送给CPU

CPU内部:CPU执行该中断向量号的中断处理程序

如何在中断描述表中定位中断描述符?

每个中断描述符号占用8字节,所以使用中断向量号与8相乘,相当于得到偏移地址,然后从IDTR寄存器中取出中断描述符表的基址,将两个地址相加,便能定位到中断描述符的地址。

中断门处理器如何进行特权级检查?

对于内部中断来说,要求检查当前特权级CPL和中断门描述符DPL及门描述符对应的的代码段的DPL,在数值上满足以下关系:

目标代码段DPL < 当前特权级CPL < 门描述符DPL

对于外部中断,检查当前特权级CPL和目标代码段的DPL,在数值上满足以下关系:

目标代码段DPL < 当前特权级CPL

如何执行中断处理程序?

将门描述符中的目标代码段描述符选择子加载到代码段寄存器CS中,把门描述中中断处理程序的偏移地址加载到EIP,便开始执行中断程序。

如何确定使用新栈还是旧栈?

程序的运行需要栈,由于不同的特权级需要使用不同的栈,因此当涉及到特权级变化后,便需要开启新栈。

使用新栈时需要压入哪些信息?

  • 旧栈环境下SS和ESP的值
  • 标志寄存器EFLAGS的值
  • 备份CS和EIP的值
  • ERROR_CODE中断错误码

特权级不发生变化时,不需要压入旧栈环境下SS和ESP的值。

中断处理程序执行完成以后执行返回指令时,CPU会将上述值从栈中弹出,但是ERROR_CODE需要我们手动弹出。

为什么要保存CS和EIP的值?

当我们中断处理程序在返回时,检查备份的CS选择子,根据其RPL和DPL做特权级检查,如果通过,则需要更新寄存器CS和EIP,这样才可以恢复到中断之前的代码段。

该特权级检查的结果还决定了是否需要恢复SS和ESP的值,如果特权级没有发生变化,不需要恢复,因为中断处理程序和我们的应用程序是同一个栈,否则便需要恢复栈。

中断错误码

中断错误码只是用来指明中断发生在哪个段上,结构如下图:

EXT用来指明中断源来自处理器内部还是外部,1代表中断源是不可屏蔽中断或外部设备。

IDT表示选择子是否指向中断描述表,1表示执行IDT,否则指向GDT或LDT。

当IDT为1:TI为0表示从GDT中检索描述符,为1表示从LDT检索描述符。

选择子高13位索引就是用来索引描述符用的下标。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员修炼笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
大佬,遇到一个问题,执行 $ headscale namespaces create default 创建命名空间时,返回 FTL ../home/runner/work/headscale/headscale/cmd/headscale/cli/utils.go:122 > Could not connect: context deadline exceeded error="context deadline exceeded" 这个有啥解么
大佬,遇到一个问题,执行 $ headscale namespaces create default 创建命名空间时,返回 FTL ../home/runner/work/headscale/headscale/cmd/headscale/cli/utils.go:122 > Could not connect: context deadline exceeded error="context deadline exceeded" 这个有啥解么
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
贫苦家庭与野生公有云之间的 WireGuard Mesh 组网策略
熟悉我的小伙伴都知道我是一名与时俱进的 WireGuard 舔狗,我早就把所有的跨云组网都换成了 WireGuard。
米开朗基杨
2021/11/10
4.7K0
【Tailscale】自建境内Headscale实现点对点直连异地组网——以双栈腾讯云轻量为例
Tailscale是一个与ZeroTier、Netbird等工具类似的异地组网工具,支持通过STUN打洞实现客户端点对点直连,互联协议基于go实现的WireGuard,兼具高效与安全的特性。
LMSKK
2024/10/13
4.4K0
【Tailscale】自建境内Headscale实现点对点直连异地组网——以双栈腾讯云轻量为例
【里程碑】WireGuard系列文章(七):使用WireGuard和Netmaker创建Full Mesh网络
2.WireGuard 系列文章(二):WireGuard 简介 - 快速、现代、安全的 V** 隧道[2]
东风微鸣
2022/04/22
5K0
【里程碑】WireGuard系列文章(七):使用WireGuard和Netmaker创建Full Mesh网络
WireGuard 全互联模式终极指南(上)!
大家好,我是米开朗基杨。 关注我的读者应该都还记得我之前写过一篇 👉WireGuard 全互联模式 (full mesh) 的配置指南,限于当时还没有成熟的产品来帮助我们简化全互联模式的配置,所以我选择了使用可视化界面 👉wg-gen-web 来达成目的。但 👉wg-gen-web 的缺陷也很明显,它生成的每一个客户端的配置都要手动调整,终究还是不够便利。 今天我将为大家介绍一种更加完美的工具来配置 WireGuard 的全互联模式,这个工具就是 Netmaker[1]。 由于篇幅原因,本系列文章将会分成两
米开朗基杨
2021/10/27
8.6K1
WireGuard 全互联模式终极指南(上)!
Headscale搭建P2P内网穿透
究其根本因素在于, 在传统架构中如果两个位于多层 NAT(简单理解为多个路由器)之后的设备, 只能通过一些中央 (VPN / 远程软件) 中转服务器进行链接, 这时网络连接速度取决于中央服务器带宽和速度; 这种网络架构我这里简称为: 星型拓扑
入门笔记
2022/11/14
6.1K1
Headscale搭建P2P内网穿透
自建 DERP 中继服务器,从此 Tailscale 畅通无阻
原文链接🔗 https://fuckcloudnative.io/posts/custom-derp-servers/ 👉上篇文章介绍了如何使用 Headscale 替代 Tailscale 官方的控制服务器,并接入各个平台的客户端。本文将会介绍如何让 Tailscale 使用自定义的 DERP Servers。可能很多人都不知道 DERP 是个啥玩意儿,没关系,我先从中继服务器开始讲起。 STUN 是什么 Tailscale 的终极目标是让两台处于网络上的任何位置的机器建立点对点连接(直连),但现实世
米开朗基杨
2022/04/11
29.8K1
自建 DERP 中继服务器,从此 Tailscale 畅通无阻
比 Tailscale 更好的内网穿透方案 - Headscale
headscale[1] 是一款今年 2021 年出现的一款 Tailscale 控制服务器的开源实现。也是唯一的一款。望能发展壮大。
公众号: 云原生生态圈
2022/04/08
7.2K1
比 Tailscale 更好的内网穿透方案 - Headscale
WireGuard 系列文章(四):WireGuard 快速上手
2.WireGuard 系列文章(二):WireGuard 简介 - 快速、现代、安全的 V** 隧道[2]
东风微鸣
2022/04/22
6.6K0
WireGuard 系列文章(四):WireGuard 快速上手
Openwrt 使用 Wireguard 异地组网(远程家庭网所有设备)
最近入手了一款友善 Nano pi (型号 FriendlyElec NanoPi R2S (CpuMark : 20651.944334 Scores)),直接作为家庭内网的主路由使用,各项性能比之前的 新路由3 要好太多了。
宋天伦
2023/10/20
13.5K0
Openwrt 使用 Wireguard 异地组网(远程家庭网所有设备)
Tailscale ACL 访问控制策略完全指南!
❝原文链接🔗:https://icloudnative.io/posts/tailscale-acls/ 大家好,我是米开朗基杨。 前面几篇文章给大家给介绍了 Tailscale 和 Headscale,包括 👉Headscale 的安装部署和各个平台客户端的接入,以及如何打通各个节点所在的局域网。同时还介绍了👉如何自建私有的 DERP 服务器,并让 Tailscale 使用我们自建的 DERP 服务器。 还没看的赶紧去看!👇 芜湖,Tailscale 开源版本让你的 WireGuard 直接起飞~ 自建
米开朗基杨
2023/01/09
3.8K0
下一代VPN工具:体验TailScale的简便和高效
tailscale管理端:https://login.tailscale.com/admin/machines
小尘要自信
2023/11/16
8.9K0
下一代VPN工具:体验TailScale的简便和高效
NAS新福音,“Tailscale”解决你的公网安全焦虑的新方案!(免费+开源+不限流量+内网穿透)
近期阿祥发表的文章“如何让自己家里NAS硬盘的小电影不被发现?现在就教你涨知识了!”引发了很多粉丝的关注和支持。而其中关于“使用桥接获取公网ip的方式”引发很多粉丝的争论,有些粉丝认为公网ip获取不到,有些粉丝认为获取了公网ip,也是存在一定的安全风险。这里想说的是条条道路通罗马,需求不同就会有不同的解决方式。既然有不同的需求场景,那阿祥就用两期的文章介绍内网穿透工具tailscale和szrotier,这两工具可以使个人在外地就能访问访问家里的电脑和NAS,来解决粉丝们公网和安全方面的顾虑。本文先介绍第一个工具tailscale。
ICT系统集成阿祥
2024/12/03
6.5K1
NAS新福音,“Tailscale”解决你的公网安全焦虑的新方案!(免费+开源+不限流量+内网穿透)
WireGuard 系列文章(六):Netmaker 安装
2.WireGuard 系列文章(二):WireGuard 简介 - 快速、现代、安全的 V** 隧道[2
东风微鸣
2022/04/22
4K0
WireGuard 系列文章(六):Netmaker 安装
基于 WireGuard 和 OpenVPN 的混合云基础架构建设
可以找一台能联网的 centos7 测试一下这个端口,如果没有 nc 工具可以yum install nc安装下。:
米开朗基杨
2021/04/23
8.1K1
基于 WireGuard 和 OpenVPN 的混合云基础架构建设
netmarker安装部署
Netmaker 是一个用来配置 WireGuard 全互联模式的可视化工具,它的功能非常强大,不仅支持 UDP 打洞、NAT 穿透、多租户,还可以使用 Kubernetes 配置清单来部署,客户端几乎适配了所有平台,包括 Linux, Mac 和 Windows,还可以通过 WireGuard 原生客户端连接 iPhone 和 Android。
吴易娃
2024/07/23
6470
netmarker安装部署
OpenWRT搭建WireGuard服务器
By HKL, on Friday 2019-11-29 15:25, tagged: 🏷️Networking 🏷️Operating
hiplon
2023/10/18
4.7K0
OpenWRT搭建WireGuard服务器
【运维】Wireguard+OpenVPN解决跨地区VPN的连接稳定性问题
UDP在实际使用上可能会被QOS限速,但是在长距离、高延迟的VPN环境中还是可以发挥不错的效果,不容易出现TCP经常断连的情况。
正汰
2024/01/16
4.5K0
【运维】Wireguard+OpenVPN解决跨地区VPN的连接稳定性问题
Nomad 系列-Nomad+Traefik+Tailscale 集成实现零信任安全
•Nomad 系列文章[1]•Traefik 系列文章[2]•Tailscale 系列文章[3]
东风微鸣
2023/09/14
6290
Nomad 系列-Nomad+Traefik+Tailscale 集成实现零信任安全
Fedora33下搭建WireGuard虚拟专用网
WireGuard 是一个易于配置、快速且安全的开源 Virtual Private Network,它利用了最新的加密技术。目的是提供一种更快、更简单、更精简的通用 Virtual Private Network,它可以轻松地在树莓派这类低端设备到高端服务器上部署。
yuanfan2012
2020/12/31
2.4K0
Fedora33下搭建WireGuard虚拟专用网
Tailscale 构建私有网络访问家中设备
在此前,我都是通过一些硬件设备来构建一个私有网络,并且能有一个稳定的公网 IP,外部可以通过设备厂商对应的外部资源来构建一个私有网络,随时随地访问家中设备,如:NAS 。但,人生无常,大肠包小肠,最近很不稳定,于是准备了一个后手方案,防止意外。
LinkinStar
2023/10/18
1.6K0
推荐阅读
相关推荐
贫苦家庭与野生公有云之间的 WireGuard Mesh 组网策略
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验