此代码存根是从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时。
然而这似乎有效,所以我假设我错过了一些信息。 为什么这样做?
答案 0 :(得分:2)
在64位模式下,分段大多被禁用,只使用CS的属性和FS和GS的基础。