一个新手问题.我正在进行一些内核研究,并对ZONE_NORMAL的896MB大小限制感到困惑.我不明白为什么内核无法直接将4G物理内存映射到内核空间.一些文档提到了页面映射的大小限制.但考虑到4G内存有2 ^ 20页,每个"struct page"是4个字节,mem_map只有4MB.这应该不是问题.希望你能给我一些启示.
谢谢
在内核2.6.11.5中,除零异常处理程序设置为:
set_trap_gate(0,÷_error);
Run Code Online (Sandbox Code Playgroud)
根据"了解Linux内核",用户模式进程无法访问英特尔陷阱门.但是用户模式进程很可能也会生成一个divide_error.那么为什么Linux以这种方式实现呢?
[编辑]我认为问题仍然是开放的,因为set_trap_gate()将IDT条目的DPL值设置为0,这意味着只有CPL = 0(读取内核)代码才能执行它,因此我不清楚如何从该处理程序调用此处理程序用户模式:
#include<stdio.h>
int main(void)
{
int a = 0;
int b = 1;
b = b/a;
return b;
}
Run Code Online (Sandbox Code Playgroud)
这是编译的gcc div0.c.输出./a.out是:
浮点异常(核心转储)
因此看起来这不是由0陷阱代码划分处理的.