小编use*_*294的帖子

为什么Linux内核ZONE_NORMAL限制为896 MB?

一个新手问题.我正在进行一些内核研究,并对ZONE_NORMAL的896MB大小限制感到困惑.我不明白为什么内核无法直接将4G物理内存映射到内核空间.一些文档提到了页面映射的大小限制.但考虑到4G内存有2 ^ 20页,每个"struct page"是4个字节,mem_map只有4MB.这应该不是问题.希望你能给我一些启示.

谢谢

linux kernel

11
推荐指数
2
解决办法
4997
查看次数

为什么linux内核使用陷阱门来处理divide_error异常?

在内核2.6.11.5中,除零异常处理程序设置为:

set_trap_gate(0,&divide_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陷阱代码划分处理的.

linux x86 kernel interrupted-exception

9
推荐指数
3
解决办法
3186
查看次数

标签 统计

kernel ×2

linux ×2

interrupted-exception ×1

x86 ×1