在32位Linux(或windows等)中,用户进程不能访问内核地址空间。例如0xC0100000 ( 3:1拆分,如linux)或0x80E00000 (1:1拆分,如windows)。
我知道用户应用程序中的以下代码将引发分段错误。
int* a = 0xC0100000;
int b = *a;
然而,我不是100%确定真正的原因。我假设,如果我们尝试执行上面的代码,MMU将会抛出segfault,因为虚拟地址0xC0100000的相应页表条目具有管理器位标志。这是100%正确的吗?如果这是正确的,操作系统如何阻止进程通过TLB缓存访问内核虚拟地址?
我还认为,使用分段,可以实现相同的限
我刚刚花了额外的2个小时试图在修改linux内核的时候找出bug,每次当我把模块连接到内核时都是好的,但是当我断开它的时候我的鼠标停止了工作,所以使用printk我发现了无限循环,我的问题是有人知道好的技术来检测这样的bug,有时很难找到这样的循环,并且linux变得不可预测,so how can I avoid infinite loops在内核中提前感谢。