微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

全局描述符表的物理地址?

我正在阅读mit os内核代码的反汇编代码。 我认为内核代码应该遵循相同的规则。

我看到内核中加载全局描述符表的指令如下:lgdtl 0x10f018

我知道lgdt以GDT(16位)的长度和GDT(32位)的地址作为操作数。 但是,我不能告诉GDT的地址是什么。

我检查从0x10f0和0xf018开始的8字内存内容。 从这两个地址开始的所有8个字都是零。

ASLR和地址

无法理解下面的macros

Linux asm(“int $ 0x0”)与零除

为什么Linux程序的.text部分从0x0804800开始,栈顶从0xbffffff开始?

在没有堆栈的情况下在Linux上进行系统调用

我的问题是:什么是从lgdtl 0x10f018的GDT地址? 你怎么说的? 机器是英特尔32位。

是否有任何注册持有GDT的地址? 我使用bochs来运行操作系统,所以如果我知道寄存器,也许我可以打印出寄存器的内容

非常感谢您的帮助!

[MODIFICATION]我看了一下,发现lgdtl ADDR的意思是把ADDR的内容加载到GDTR。 所以ADDR的内容是GDT的限制和地址。 我在0x10f018打印出内存内容

<bochs:24> x /8wx 0x10f018 [bochs]: 0x0010f018 <bogus+ 0>: 0xf0000017 0x00000010 0x32311b00 0x36353433 0x0010f028 <bogus+ 16>: 0x30393837 0x09083d2d 0x72657771 0x69757974

以下是GDT的设置

################################################################### # setup the GDT ################################################################### .p2align 2 # force 4 byte alignment mygdt: SEG_NULL # null seg SEG(STA_X|STA_R,-KERNBASE,0xffffffff) # code seg SEG(STA_W,0xffffffff) # data seg mygdtdesc: .word 0x17 # sizeof(mygdt) - 1 .long RELOC(mygdt) # address mygdt

我的问题是:我怎么解释

0x0010f018 <bogus+ 0>: 0xf0000017 0x00000010 0x32311b00

得到GDT的地址?

顺便提一句,0x00f01000的内容如下。 我认为这可能是GDT,但不是。 :(任何人都可以帮忙?

<bochs:31> x /16wx 0x00f01000 [bochs]: 0x00f01000 <bogus+ 0>: 0x00000000 0x00000000 0x00000000 0x00000000 0x00f01010 <bogus+ 16>: 0x00000000 0x00000000 0x00000000 0x00000000 0x00f01020 <bogus+ 32>: 0x00000000 0x00000000 0x00000000 0x00000000 0x00f01030 <bogus+ 48>: 0x00000000 0x00000000 0x00000000 0x00000000

解决了:

<bochs:29> x /6bx 0x10f018 [bochs]: 0x0010f018 <bogus+ 0>: 0x17 0x00 0x00 0xf0 0x10 0x00

基于less数edian,该寄存器有0010f000 0017所以GDT的地址是0010f000,其长度是0017; 这通过查看0010f000中的内容得以证实:

<bochs:32> x /8wx 0x0010f000 [bochs]: 0x0010f000 <bogus+ 0>: 0x00000000 0x00000000 0x0000ffff 0x10cf9a00 0x0010f010 <bogus+ 16>: 0x0000ffff 0x10cf9300 0xf0000017 0x00000010

另外,初始esp指向GDT的起始地址0x0010f000。 当第一个函数调用时,堆栈从较高地址增加到较低地址。

内存映射如下(左边是低地址):

—程序堆栈— | GDT

Fork系统调用失败后,rax的返回值是多less?

汇编:一个简单的例子,将x86代码转换为x64

尝试执行二进制文件时出现“没有这样的文件或目录”错误

汇编:从标准input读取整数,增加它并打印到标准输出

大会 – 为什么strtol clobbers%rcx注册

GDT基本上是一个包含各种GDT条目的结构。 lgdtl是将全局描述符表加载到gdt寄存器的指令。 所以,从你的问题来回答:0x10f018是GDT的基地址。 如果您查看代码,您会发现GDT被定义为结构,0x10f018是该结构的地址(按照您的反汇编),在GDT结构中可以有多达8192个条目。

所以,是GDT寄存器保存GDT结构的基地址。 lgdt用于设置gdt,格式如下: lgdt maddr 。 而且,在设置GDT之前,打印出注册内容的计划将不起作用,因此设置GDT的唯一方法是使用lgdt 。

希望这会有所帮助! 另外请看下面的参考资料来清除GDT和LGDT的概念

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐