assembly - MOV DS,EAX 段错误?
问题描述
当我运行时mov ds,rax
,它会抛出错误Program terminated with signal SIGSEGV, Segmentation fault
汇编代码有什么问题?
global main
main:
mov rax,0ffffH
mov ds,rax
mov rbx,6
ret
解决方案
mov
到段寄存器从GDT(全局描述符表)加载内部段基础/限制/权限的东西。(在 64 位模式下,base 和 limit 分别被视为 0 / -1,但是mov
对于段寄存器仍然具有实际效果并且仍然检查内容。你不能期望任意值不会导致问题。)
根据英特尔的手册mov
,如果“段选择器索引”(GDT 或 LDT 的索引)“超出描述符表限制” ,则会出现mov Sreg, r/m
故障。#GP(selector)
如果用户空间导致无效页面错误或任何类型的#GP
异常,Linux 会提供 SIGSEGV。
由于设置了第 2 位 ( 1<<2
),因此这是对 LDT(本地描述符表)的索引,而不是 GDT。如果您没有要求您的操作系统(Linux?)创建一个 LDT,例如使用modify_ldt()
系统调用,那么您的进程可能根本没有 LDT。
如果您清除了该位 ( mov eax, 0xfffb
),它仍然在我的 Linux 桌面上出现故障。由此我们可以推断出 Linux 并没有配置那么大的 GDT。没有理由期望它会。它只需要少数段描述符即可正常操作。例如,如果你使用info reg
,你可以看到段寄存器的值是:
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
(0
用作“空选择器”,具有保持 x86-64 的最小分段残余快乐的特殊含义;即使低 2 位是 ,它实际上也不是描述符特权级别 0(仅内核数据段)00
。低位ofcs
是预期的11
(环 3 = 用户空间)。)
其他可能的异常原因包括:“如果正在加载 DS、ES、FS 或 GS 寄存器并且指向的段不是数据或可读代码段。 ”
我假设您实际上对分段知之甚少,我也不想解释如何实际使用段寄存器。我要说明的一点是,您不能只将ds
16 位的暂存空间用作任意整数数据。
如果您想更详细地了解可以放入和不能放入的ds
内容,请阅读英特尔的手册。以及内核源代码,看看它是如何配置它的 GDT 和 LDT,或者进行modify_ldt()
系统调用的。
推荐阅读
- tensorflow - 抓取张量流预测精度
- raspberry-pi - 通过 LTE 加密狗远程 http 访问树莓派
- python - Python Pandas / Sales force SOQL:如何使用 for 循环将列表传递给 SOQL 查询?
- xamarin.forms - 删除标题视图 xamarin 表单中的左侧空格
- gmail-api - 准备应用程序进行验证 - google api
- vue.js - 在 main.js 中所需的 .js 文件中创建全局排序方法。在 Component.vue 中:单击计算属性上的调用排序。这可能吗?
- python - ImportError: DLL load failed: 安装 Nvidia GPU 后找不到指定的模块
- reactjs - 我正在通过 aboutProps 在链接标签中传递数据,但它返回此错误 TypeError: Cannot read property 'aboutProps' of undefined
- javascript - 如何在不到一小时的时间内获取格式“00:34”moment.js
- python - Python,求解变量的非线性方程