在长模式下amd64中的零堆栈段

时间:2015-07-26 18:22:34

标签: assembly operating-system x86-64 memory-segmentation

此代码存根是从linux内核3.18.3 arch/x86/boot/compressed/head_64.S中提取的。虽然增加了额外的评论。

所有这些代码都以长模式(64位)执行,代码段选择器:0x10和数据段选择器:0x18

xorl    %eax, %eax /* Setting up all data segments selectors to zero */
movl    %eax, %ds  /* Including stack segment */
movl    %eax, %es
movl    %eax, %ss
movl    %eax, %fs
movl    %eax, %gs

leaq    z_extract_offset(%rbp), %rbx

/* Set up the stack */
leaq    boot_stack_end(%rbx), %rsp

/* Zero EFLAGS */
pushq   $0 /* This instruction should fail since stack segment selector */
popfq      /* is zero (pointing to null descriptor) /*

据我所知,这个代码应该无法执行,因为%ss = 0x0指向gdt中的空描述符,当执行堆栈指令pushq时。

然而这似乎有效,所以我假设我错过了一些信息。 为什么这样做?

1 个答案:

答案 0 :(得分:2)

在64位模式下,分段大多被禁用,只使用CS的属性和FS和GS的基础。