基本上,内核如何阻止我做这样的事情?
char *p = (char *) 0xfea80650; // or any random point in memory
*p = 0;
我想要的是,一次只能在处理器上运行一件事。那么当这个程序转向时,有什么能阻止它呢?
答案 0 :(得分:3)
现代机器使用虚拟内存管理将程序使用的地址映射到DRAM中的实际地址。因此,如果您没有在该地址分配内存,则地址转换表中不会有任何条目,虚拟内存管理器将引导您离开系统。
答案 1 :(得分:2)
在某种程度上,你是对的。除非处理器具有阻止您这样做的功能,否则内核无法阻止您这样做 - 在这种情况下,内核可以激活处理器功能。所有现代桌面/笔记本电脑/服务器计算机都具有这些功能的处但不是所有计算机 - 嵌入式处理器(在洗碗机等设备中非常常用)不需要任何保护功能。
在每次访问内存之前,处理器在名为" page table"的数据结构中查找内存地址。每个进程都有自己的页表。页表确定哪些虚拟地址(程序使用的是什么)映射到哪些物理地址(哪些RAM芯片的哪些部分)。
在您的示例中,处理器将在页面表中查找0xfea80650
。可能会看到未分配该虚拟地址 - 即,没有告知哪个RAM芯片的哪个部分对应于该地址。所以它会破坏你的程序。实际上,处理器不会使您的程序崩溃。处理器只调用内核中的函数,因此内核知道访问了无效地址的程序。内核将停止你的程序并打印一条错误信息,因为除此之外别无他法。
或者,内核可能正在使用地址0xfea80650
。处理器将在页表中查找地址,并看到只允许内核访问它,并且看到你不是内核。结果相同。
答案 2 :(得分:1)
如上所述user3386109
,您将使用虚拟内存。虚拟内存由硬件处理。当您的机器尝试访问不在其虚拟内存转换表中的内存时,它将生成硬件中断。这将阻止您的用户空间程序立即运行,并将执行切换到中断处理程序。中断处理程序依次安排Linux下半部分运行。 Bottom Half知道用户空间程序试图访问无效的内存位置,因此它会杀死用户空间应用程序,并使调度程序重新安排下一个最高优先级的用户空间应用程序。因此,当下半部分退出时,原始用户空间应用程序将永远不会再次运行。
答案 3 :(得分:0)
内核不会阻止您修改它,处理器会阻止您根据内核将其保留在称为页表的受保护数据结构中的指令来修改某些内存位置。当当前执行的代码违反这些规则之一时,处理器切换回保护模式并告诉内核允许内核随意执行。