Documentation/x86/entry_64.txt

2023-11-05

Chinese translated version of Documentation/x86/entry_64.txt

If you have any comment or update to the content, please contact the
original document maintainer directly.  However, if you have a problem
communicating in English you can also ask the Chinese maintainer for
help.  Contact the Chinese maintainer if this translation is outdated
or if there is a problem with the translation.

Chinese maintainer:Luo Yangyang <794436342@qq.com>
---------------------------------------------------------------------
Documentation/x86/entry_64.txt的中文翻译

如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文
交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻
译存在问题,请联系中文版维护者。

中文版维护者: 罗秧秧  <794436342@qq.com>
中文版翻译者: 罗秧秧  <794436342@qq.com>
中文版校译者: 罗秧秧  <794436342@qq.com>

以下为正文
---------------------------------------------------------------------

This file documents some of the kernel entries in
arch/x86/kernel/entry_64.S.  A lot of this explanation is adapted from
an email from Ingo Molnar:

http://lkml.kernel.org/r/<20110529191055.GC9835%40elte.hu>

此文件记录了一些在arch/x86/kernel/entry_64.S中的
内核条目。有诸多这样的解释是改编自
一封来自Ingo Molnar的邮件:

http://lkml.kernel.org/r/ < 20110529191055.GC9835 % 40elte.hu >

The x86 architecture has quite a few different ways to jump into
kernel code.  Most of these entry points are registered in
arch/x86/kernel/traps.c and implemented in arch/x86/kernel/entry_64.S
and arch/x86/ia32/ia32entry.S.

x86架构有相当多的不同的方式进入
内核编码。这些入口点大多数在
arch/x86/kernel/traps.c中被注册,并且在arch/x86/kernel/entry_64.S
和arch/x86/ia32/ia32entry.S中被实现 。

The IDT vector assignments are listed in arch/x86/include/irq_vectors.h.
Some of these entries are:
 - system_call: syscall instruction from 64-bit code.
 - ia32_syscall: int 0x80 from 32-bit or 64-bit code; compat syscall
   either way.
 - ia32_syscall, ia32_sysenter: syscall and sysenter from 32-bit
   code
 - interrupt: An array of entries.  Every IDT vector that doesn't
   explicitly point somewhere else gets set to the corresponding
   value in interrupts.  These point to a whole array of
   magically-generated functions that make their way to do_IRQ with
   the interrupt number as a parameter.
 - APIC interrupts: Various special-purpose interrupts for things
   like TLB shootdown.
 - Architecturally-defined exceptions like divide_error.


IDT(中断描述符表)向量分配是在arch/x86/include/irq_vectors.h中被列出的。
其中的一些条目是:
 - system_call:64位编码的系统调用指令。
 - ia32_syscall :32位或64位编码的INT 0x80; 任意方式的兼容性系统调用。
 - ia32_syscall,ia32_sysenter :32位编码的系统调用和快速系统调用。
 - 中断:条目的数组。每个不
   明确指向别的地方的IDT向量被设置成相应的
   在中断值。这些指向 magic标记化的生成函数的整组

   最后使do_IRQ以中断号作为参数。

 - APIC中断:给像TLB(页表缓冲)击落这样的各种特殊用途
   的中断。
 (在一个多处理器系统中,当一个处理器改变了一个页表或页目录的条目,
  这个改变必须要通知所有其它的处理器。这个过程通常称为"TLB shootdown"。)
 - 总体定义异常,如divide_error 。

There are a few complexities here.  The different x86-64 entries
have different calling conventions.  The syscall and sysenter
instructions have their own peculiar calling conventions.  Some of
the IDT entries push an error code onto the stack; others don't.
IDT entries using the IST alternative stack mechanism need their own
magic to get the stack frames right.  (You can find some
documentation in the AMD APM, Volume 2, Chapter 8 and the Intel SDM,
Volume 3, Chapter 6.)

在这里有一些复杂性。不同的x86-64的条目
有不同的调用约定。系统调用和快速系统调用
指令有它们自己特有的调用约定。一些
IDT条目将错误代码推入堆栈;另外一些不这样。
使用IST替代堆栈机制的IDT条目需要有自己
magic标记来获取堆栈帧的权利。 (你可以在文档AMD APM ,
第2卷,第8章和Intel SDM ,第3卷,第6章中找到一些参考资料。)

Dealing with the swapgs instruction is especially tricky.  Swapgs
toggles whether gs is the kernel gs or the user gs.  The swapgs
instruction is rather fragile: it must nest perfectly and only in
single depth, it should only be used if entering from user mode to
kernel mode and then when returning to user-space, and precisely
so. If we mess that up even slightly, we crash.

处理swapgs指令尤其棘手。无论GS是内核GS还是用户GS,Swapgs都会切换。 
这swapgs指令是相当脆弱不稳定的:它必须完美嵌套,只有在惟一的深度下,
它应该只被使用在从用户模式进入内核模式,然后返回到用户空间的时候,
的确是这样的。如果我们轻微地把它搞砸了,我们就失败了。

So when we have a secondary entry, already in kernel mode, we *must
not* use SWAPGS blindly - nor must we forget doing a SWAPGS when it's
not switched/swapped yet.

Now, there's a secondary complication: there's a cheap way to test
which mode the CPU is in and an expensive way.

所以,当我们已经有一个在内核模式下的二次项时,我们
*绝不能*盲目地使用SWAPGS - 当它尚未被改变/被交换时,
我们也不能忘记进行SWAPGS。

现在,有一个次要的并发症:有一种廉价的
方式和一种昂贵的方式来测试CPU处在哪种??模式下。

The cheap way is to pick this info off the entry frame on the kernel
stack, from the CS of the ptregs area of the kernel stack:
xorl %ebx,%ebx
testl $3,CS+8(%rsp)
je error_kernelspace
SWAPGS


The expensive (paranoid) way is to read back the MSR_GS_BASE value
(which is what SWAPGS modifies):
movl $1,%ebx
movl $MSR_GS_BASE,%ecx
rdmsr
testl %edx,%edx
js 1f   /* negative -> in kernel */
SWAPGS
xorl %ebx,%ebx
1: ret

and the whole paranoid non-paranoid macro complexity is about whether
to suffer that RDMSR cost.

廉价的方式是从内核堆栈ptregs区的代码段中
选择内核堆栈上的入口帧的信息:
        xorl %ebx,%ebx
testl $3,CS+8(%rsp)
je error_kernelspace
SWAPGS

昂贵的(偏执的)方式是回读MSR_GS_BASE的值
(这是SWAPGS修改的地方):
        movl $1,%ebx
movl $MSR_GS_BASE,%ecx
rdmsr
testl %edx,%edx
js 1f   /* negative -> in kernel */
SWAPGS
xorl %ebx,%ebx
1: ret

并且整个偏执的非偏执的宏复杂性与是否
受到RDMSR代价有关。

If we are at an interrupt or user-trap/gate-alike boundary then we can
use the faster check: the stack will be a reliable indicator of
whether SWAPGS was already done: if we see that we are a secondary
entry interrupting kernel mode execution, then we know that the GS
base has already been switched. If it says that we interrupted
user-space execution then we must do the SWAPGS.

如果我们在一个中断或user-trap/gate-alike边界,那么我们可以
使用更快的检查:堆栈将会是一个判断SWAPGS是否已经完成的
可靠的指标:如果我们知道我们是一个使内核模式执行中断的
次要条目,那么我们就知道了GS基数已经被切换。如果说,我们使
用户空间执行被中断,那么我们就必须执行SWAPGS。

But if we are in an NMI/MCE/DEBUG/whatever super-atomic entry context,
which might have triggered right after a normal entry wrote CS to the
stack but before we executed SWAPGS, then the only safe way to check
for GS is the slower method: the RDMSR.

但是,如果我们是在NMI/MCE/DEBUG/whatever超原子项
上下文中时,刚好在一个正常的条目写CS到堆栈后,
但在我们执行SWAPGS之前可能已经触发,那么检查
GS的唯一安全方式是更慢的方式:RDMSR。

So we try only to mark those entry methods 'paranoid' that absolutely
need the more expensive check for the GS base - and we generate all
'normal' entry points with the regular (faster) entry macros.

因此,我们尝试只标记那些'偏执'的输入法,绝对
需要为GS基数进行更昂贵的检查 - 并且我们生成所有
带有更常规(更快)切入宏的“正常”切入点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Documentation/x86/entry_64.txt 的相关文章

  • 函数和存储过程区别

    Waiting 转载于 https www cnblogs com Tim Liu archive 2011 04 26 2029500 html
  • 组合分类方法——装袋(bagging);提升(boosting)和AdaBoost;随机森林

    此篇文章仅作为个人学习笔记之用 内容来之数据挖掘技概念与技术 第三版 一书 由于编辑很是麻烦 我直接截图WPS下编辑好的内容 二 提升 boosting 和AdaBoost 三 随机森林
  • Linux Tips · VMWare上Linux运行很慢的解决

    目前的主流PC运行虚拟机 问题不是很大 然而在VMware上安装的有的Linux 比如Suse 10 2 却运行暴慢 文字明显是一行一行往上移的 其实这并不是因为程序运行慢 主要原因是启用了较高的显示设置 这些LINUX发行版主要目标是桌面
  • 线程池的主要处理流程及常用方法

    线程池的主要处理流程及常用方法 更多优秀文章 请扫码关注个人微信公众号或搜索 程序猿小杨 添加 一 主要处理流程 当调用线程池execute 方法添加一个任务时 threadPoolExecutor execute 具体代码如下 priva
  • cocos2dx opengl入门系列二-画一个三角形

    运行环境 mac10 12 2 xcode Version 8 2 1 cocos2dx x 3 13 1 代码 新建cocos2dx项目 具体操作官网有教程 新建好后 新建Test cpp 代码如下 Test cpp FirstTrian
  • 时序预测

    时序预测 MATLAB实现基于EMD GRU时间序列预测 EMD分解结合GRU门控循环单元 目录 时序预测 MATLAB实现基于EMD GRU时间序列预测 EMD分解结合GRU门控循环单元 效果一览 基本描述 模型描述 程序设计 参考资料
  • 【MySQL】数据处理函数

    函数 文本处理函数 日期和时间处理函数 数值处理函数 函数 SQL支持利用函数来处理数据 但是函数的可移植性不强 如果决定使用函数应该保证做好代码注释 以便以后能确切地知道所编写SQL代码的含义 大多SQL实现支持以下类型的函数 用于处理文
  • com.aspose.words 类LoadOptions

    com aspose words 类LoadOptions java lang Object com aspose words LoadOptions 直接已知子类 HtmlLoadOptions PdfLoadOptions RtfLoa
  • react native 上拖拽元素

    1 给一张效果图 2 具体代码如下 使用的就是react native里面的PanResponder 具体使用看 官网 这里主要两个知识点Animated 和 panResponder 我在componentDidMount初始 panRe
  • 企微外部群Api

    个人微信开发API 文档地址 wkteam gitbook io 所有个人号模块分析 登录模块 登录微控平台 member login 获取微信二维码 user login 执行微信登录 getIPadLoginInfo 获取联系人列表 群
  • Xpath和CSS选择器的使用详解

    Xpath与CSS选择器在爬虫中非常常见 下列我将描述一下它们的使用详情 安装Xpath和CSS选择器 Windows平台 pip install lxml Ubuntu平台 sudo apt get install python3 lxm
  • js的作用域和vue的作用域

    js有两种作用域 全局作用域和局部作用域 1 全局作用域 如果一个变量在所有函数外声明 那么就定义了一个全局作用域 2 局部作用域 有两种 函数作用域和块级作用域 函数作用域顾名思义就是在函数内定义的变量 而块级作用域则是 内let声明的变
  • 【Linux】几种典型的IO模型

    几种典型的IO模型 常见IO场景 输入和输出 读写文件 read write fread fwrite 网络接收与发送 send recv sendto recvfrom 上述两种场景都有一个共同点 就是最终都会和操作系统打交道 IO过程
  • python高级特性总结之切片 迭代 生成器 迭代器

    切片 gt gt gt L list range 100 gt gt gt L 0 1 2 3 99 gt gt gt L 10 0 1 2 3 4 5 6 7 8 9 gt gt gt L 10 90 91 92 93 94 95 96
  • PlantCV 农业自动化中的机器视觉库

    PlantCV 农业自动化中的机器视觉库 2020年下半年 各大互联网巨头纷纷进军社区买菜市场 我身边的朋友同事很多都开始通过新的电商生鲜渠道购买蔬菜 当时我就觉得 大资本即将涌入我们的第一产业 农业 果不其然 2020年12月31号 正值
  • Dell PowerEdge R740xd解析:服务器只看参数那就错了

    昨天写了 Dell PowerEdge R940解析 四路顶配服务器维护平民化 今天继续 对于R7x0这样的2U主力服务器机型 说实话我觉得不是特别好写 一方面不如四路有特点 另外又是互联网等行业消耗最多的 可以说乃服务器厂商必争之地 正如
  • Ubuntu下安装Chrome浏览器

    一 下载包 通过直接下载安装Google Chrome浏览器deb包 打开Ubuntu终端 以下为32位版本 使用下面的命令 wget https dl google com linux direct google chrome stabl
  • 模拟相机视频输入方案-----模拟转MIPI /DVP方案

    技术交流 请加微信video D 概述 由于模拟相机在监控领域的优势 以及模拟相机成本优势 目前模拟相机方案需求还是很多的 具体模拟解码芯片介绍 目前接触的有以下几种 1 Nextchip系列 韩国NEXTCHIP系列 主攻ISP AHD
  • 开发微信公众号支付代码

    一 url传入当前页面url地址或者微信公众平台配置的域名根目录 使用window location href方法获取 二 下面代码请结合微信公众号开发文档 微信公众号开发文档 function test url uni request u
  • 如何在Linux下安装vim编辑器

    目前的Ubuntu版本都安装了vi编辑器 vim编辑器可以看做vi编辑器的升级版 可以识别特殊字符 显示不同颜色 目录 第一步 第二步 第三步 第四步 第一步 在terminal里面输入vi命令后按下tab键可以看到当前vi可以执行的命令

随机推荐

  • 算法的时间及空间复杂度

    简介 java系列技术分享 持续更新中 初衷 一起学习 一起进步 坚持不懈 如果文章内容有误与您的想法不一致 欢迎大家在评论区指正 希望这篇文章对你有所帮助 欢迎点赞 收藏 留言 更多文章请点击 文章目录 一 什么是算法 二 算法初体验 案
  • C++ String替换&分割指定字符串

    C String替换 分割指定字符串 1 C String替换指定字符串 C 的string对象提供了replace方法来实现字符串的替换 本文实现对于将字符串中某个字符串全部替换的功能 string replace all string
  • MOOC清华《程序设计基础》第5章:求n的阶乘(用递推法做)

    使用递推思想 求解正整数的阶乘 本算法的数学模型为 n n 1 n include
  • CCF CSP 202206-3角色授权【70分】

    include
  • ts文件服务器端加密,加密ts文件解密

    EXTM3U EXT X VERSION 3 EXT X MEDIA SEQUENCE 0 EXT X ALLOW CACHE YES EXT X TARGETDURATION 13 EXT X KEY METHOD AES 128 URI
  • Linux动态库(.so)搜索路径

    Linux动态库 so 搜索路径 众所周知 Linux动态库的默认搜索路径是 lib和 usr lib 动态库被创建后 一般都复制到这两个目录中 当程序执行时需要某动态库 并且该 动 态库还未加载到内存中 则系统会自动到这两个默认搜索路径中
  • 网站无法访问的一些问题与解决

    最近阿里云的服务器上跑的博客出现了一些问题 上阿里云官网看了一下 原来是忘记续费了 也没给我发邮件 悄摸的给我停了 续费之后 问题依旧 可以使用xshell5进行远程连接 但是在浏览器上不能进行访问 会显示这个 很尴尬 在本地ping主机是
  • cuda异步并行执行

    异步函数使得主机端与设备端并行执行 控制在设备还没有完成前就被返回给主机线程 包括 kernel启动 以Async为后缀的内存拷贝函数 device到device内存拷贝函数 存储器初始化函数 比如cudaMemset cudaMemset
  • simulink中积分环节、惯性环节、比例环节

    第一步 第二步 第三步 注 适当修改参数即可变成所需环节 如下所示 修改为 或者为 抑或
  • hadoop搭建好,启动服务后,无法从web界面访问50070

    在hadoop完全分布式搭建好以后 从主节点启动正常 使用jps查看启动的进程 正常 在几个从节点上使用jps查看 显示正常 但从web上输入下面网址 http 主节点IP 50070 无法正常连接显示 试了若干网上查到的方法 是通过下面方
  • 怎样选择合适的循环体(do&while、while和for)

    我们都知道 循环体可以有五种 while do while for goto和递归 虽然理论上任何循环都可以用其他四种转换 但是因为goto在安全性以及在功能上能够被取代的特点 所以一般不会用到 而递归的特殊性和编写的困难性使递归的登场次数
  • 今天带你体验79毫秒启动一个SpringBoot项目

    大家好 我是雷小帅 今天来个项目实战 先抛一个问题 大家在自己电脑上启动一个 spring boot 项目需要花费多久 根据项目大小和机器环境 花费几秒到几十秒的人应该都有 最近 spring 官方推出了一项技术可以将项目的启动时间缩短到
  • 荒野行动服务器维护啥时好,荒野行动服务器真的极差

    说起 荒野行动 这个游戏 我想大家都不陌生 毕竟这个是在端游吃鸡出现不到三个月的时间 就由网易出品的一款吃鸡手游 可以说这个是第一款吃鸡手游 我玩了快半年的 荒野行动 了 先不说这个游戏咋样 咱们先说一说官网的态度 当真是不想让我们在继续玩
  • Vue2.0与Vue3.0的区别

    Vue2 0 Vue3 0 双向绑定 利用ES5的ApiObject defineProperty 对数据进行劫持 并结合发布订阅模式的方式实现 利用Es6的Proxy 对数据进行代理的方式实现 根节点 根节点只能是一个 根节点可以是多个
  • nginx之反向代理服务器

    本文摘抄自 深入理解Nginx 模块开发与架构解析 反向代理 reverse proxy 方式是指用代理服务器来接受Internet上的连接请求 然后将请求转发给内部网络中的上游服务器 并将从上游服务器上得到的结果返回给Internet上请
  • QGuiApplication底层鼠标处理(一)使用QSocketNotifier建立侦听连接

    QGuiApplication底层鼠标处理 一 使用QSocketNotifier建立侦听连接 读取外设信息 建立外设连接 init plugins QEvdevMousePlugin QEvdevMouseManager QEvdevMo
  • vmware 最近 win10 更新补丁后,需要更新后才能使用

    preface 最近准备换工作 在搭建自己的项目 一直未更新博文 等到 稳定后就把 项目流程 相关 发布出来 项目都是 搭建在 vmware 的 centos 中 尴尬的是 昨天 vmware 不能打开了 不能打开并且提示需要更新 vmwa
  • Unity实现UI在屏幕边缘跟随并指向视野外敌人

    最终效果 实现 心急的小伙伴可以直接跳到文章末尾查看最终代码 如果有问题再来看下思路 首先我们需要确定实现思路 我想到的方案是将玩家和敌人的世界坐标转换为UI坐标 然后求玩家和敌人坐标的线段与Canvas边界的交点即为箭头坐标 下面是求出交
  • 学习笔记TF043:TF.Learn 机器学习Estimator、DataFrame、监督器Monitors

    线性 逻辑回归 input fn 建立简单两个特征列数据 用特证列API建立特征列 特征列传入LinearClassifier建立逻辑回归分类器 fit evaluate 函数 get variable names 得到所有模型变量名称 可
  • Documentation/x86/entry_64.txt

    Chinese translated version of Documentation x86 entry 64 txt If you have any comment or update to the content please con