关于mm_struct和内核线程,在Linux kernel Development ( Robert Love)一书中提到的一些要点是:
内核线程没有进程地址空间,因此没有相关的内存描述符。因此,内核线程的进程描述符的mm字段为NULL。
“由于内核线程在用户空间中没有任何页面,它们实际上不值得拥有自己的内存描述符和页表(页表将在本章后面讨论)。尽管如此,内核线程仍需要一些数据,例如页表,甚至需要访问内核内存。”
内核线程没有地址空间,并且mm为NULL。因此,当调度内核线程时,内核会注意到mm为NULL,并保持前一个进程的地址空间已加载。然后,内核会更新内核线程的进程描述符中的active
在32位Linux(或windows等)中,用户进程不能访问内核地址空间。例如0xC0100000 ( 3:1拆分,如linux)或0x80E00000 (1:1拆分,如windows)。
我知道用户应用程序中的以下代码将引发分段错误。
int* a = 0xC0100000;
int b = *a;
然而,我不是100%确定真正的原因。我假设,如果我们尝试执行上面的代码,MMU将会抛出segfault,因为虚拟地址0xC0100000的相应页表条目具有管理器位标志。这是100%正确的吗?如果这是正确的,操作系统如何阻止进程通过TLB缓存访问内核虚拟地址?
我还认为,使用分段,可以实现相同的限
看完Mel Gorman的书“Understanding the Linux Virtual Memory Manager”后,我有几个问题。4.3 Process Address Space Descriptor一节说,kernel threads never page fault or access the user space portion. The only exception is page faulting within the vmalloc space。下面是我的问题。
肯雷尔线程从不发生页面错误:这是否意味着只有用户空间代码才会触发页面错误?如果调用了kmalloc()或v