gpt4 book ai didi

linux - 为什么linux在异常处理程序的序言中将数据段设置为__USER_DS

转载 作者:IT王子 更新时间:2023-10-29 00:32:37 24 4
gpt4 key购买 nike

我正在尝试阅读 Linux 源代码(2.6.11)

在异常处理程序中,在 entry.s 处,错误代码:

movl $(__USER_DS), %ecx
movl %ecx, %ds
movl %ecx, %es

不知道为什么要在这里加载用户数据段。由于它应该进入在内核模式下运行的异常处理程序代码,因此选择器应该是 __KERNEL_DS。

我检查了其他版本的代码,他们在这个地方也做了同样的事情。

最佳答案

如果用ds进入异常处理器和 es已经设置到数据段,除了可能延迟一微秒外,它没有任何区别。异常处理程序通常不需要很快。

但是什么可能导致转到异常处理程序?会不会是因为错误的值被加载到段寄存器然后被引用?在这种情况下,代码建立一个安全的环境很重要。 cs由异常调用设置。要防弹,ssesp也应该设置。


跟进:

查看 i386 的 2-6.22.18 内核,我不完全明白:

error_code:   /* the function address is in %fs's slot on the stack */
pushl %es
... pushes %ds, %eax, %ebp, %edi, %esi, %edx, %ecx, %ebx, %fs
... along with pseudo-ops to manage stack frame layout
movl $(__KERNEL_PERCPU), %ecx
movl %ecx, %fs
popl %ecx // retrieves saved %fs
... sets up registers for the exception function

符号__KERNEL_PERCPU是一个宏定义(在 include/asm-i386/segment.h 中)为 0对于非 SMP 机器和 (GDT_ENTRY_PERCPU * 8)对于 SMP。 8 用于 GDT 条目大小(我认为)和 GDT_ENTRY_PERCPU与每个 CPU GDT 中的条目相关。它的值为<base> + 15评论指出的是“默认用户 DS”,因此实际上是同一件事。

通过fs访问内核数据段和 ss .许多内核数据访问都在堆栈上。通过保持通过 ds 访问的用户模式描述符, 需要很少的段寄存器加载。

关于linux - 为什么linux在异常处理程序的序言中将数据段设置为__USER_DS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18306309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com