我对内核或系统编程非常陌生,
我有几个关于虚拟记忆的问题。主要涉及静态和运行时,即ELF和加载/链接等,特定于Linux86。
我的理解可能完全错误..。
我知道虚拟内存,它是分裂的1G/3G。在用户模式下进程不能访问PAGE_OFFSET以上的地址- PAGE_OFFSET是虚拟地址.
在静态时间ELF定义过程虚拟空间?
如果ELF定义虚拟地址空间,那么ELF是否也定义了内核虚拟地址空间?多么?我假设内核虚拟地址空间在运行时是动态映射的?
如果内核地址空间映射到进程地址空间,那么为什么进程大小(虚拟)也不包括内核大小?
- When and How this kernel a
我知道,如果我试图打印一个数组元素的地址,它将是一个来自虚拟内存的地址,而不是来自真实内存(物理内存),即DRAM的地址。
printf ("Address of A[5] and A[6] are %u and %u", &A[5], &A[6]);
我发现地址是连续的(假设元素是字符)。实际上,它们可能不是连续的,至少在DRAM中不是。我想知道真正的地址。我该怎么做呢?
无论是Windows还是Linux,我都需要知道这一点。
关于mm_struct和内核线程,在Linux kernel Development ( Robert Love)一书中提到的一些要点是:
内核线程没有进程地址空间,因此没有相关的内存描述符。因此,内核线程的进程描述符的mm字段为NULL。
“由于内核线程在用户空间中没有任何页面,它们实际上不值得拥有自己的内存描述符和页表(页表将在本章后面讨论)。尽管如此,内核线程仍需要一些数据,例如页表,甚至需要访问内核内存。”
内核线程没有地址空间,并且mm为NULL。因此,当调度内核线程时,内核会注意到mm为NULL,并保持前一个进程的地址空间已加载。然后,内核会更新内核线程的进程描述符中的active