关于mm_struct和内核线程,在Linux kernel Development ( Robert Love)一书中提到的一些要点是:
内核线程没有进程地址空间,因此没有相关的内存描述符。因此,内核线程的进程描述符的mm字段为NULL。
“由于内核线程在用户空间中没有任何页面,它们实际上不值得拥有自己的内存描述符和页表(页表将在本章后面讨论)。尽管如此,内核线程仍需要一些数据,例如页表,甚至需要访问内核内存。”
内核线程没有地址空间,并且mm为NULL。因此,当调度内核线程时,内核会注意到mm为NULL,并保持前一个进程的地址空间已加载。然后,内核会更新内核线程的进程描述符中的active
我对内核或系统编程非常陌生,
我有几个关于虚拟记忆的问题。主要涉及静态和运行时,即ELF和加载/链接等,特定于Linux86。
我的理解可能完全错误..。
我知道虚拟内存,它是分裂的1G/3G。在用户模式下进程不能访问PAGE_OFFSET以上的地址- PAGE_OFFSET是虚拟地址.
在静态时间ELF定义过程虚拟空间?
如果ELF定义虚拟地址空间,那么ELF是否也定义了内核虚拟地址空间?多么?我假设内核虚拟地址空间在运行时是动态映射的?
如果内核地址空间映射到进程地址空间,那么为什么进程大小(虚拟)也不包括内核大小?
- When and How this kernel a
假设linux中有两个进程P1,P2(这是一种病毒)。P2可以访问P1的本地变量(例如x)吗?
在web上搜索时,我发现由于进程中使用的地址是逻辑地址,所以P2无法访问P1的局部变量'x‘。
但我想知道P2是否生成随机地址,其中一个地址解析为'x‘的物理地址,那么它不能访问它吗?
P2真的有可能访问P1的“x”吗?
如果是,怎么做?(如果可以通过任何技巧访问,请告诉我)
如果没有,为什么?
P1代码:
int main() {
int x = 20;
return 0;
}
p2代码:
int main() {
/*
generate random addres
我在同一台机器上的两个进程(Linux CPU shmget和朋友)之间实现了IPC,并且我试图最大化这两个进程之间的数据吞吐量:例如,我限制这两个进程只能在同一个x86_64上运行,以便利用硬件缓存。
我的问题是,每个进程在虚拟地址空间中放置共享对象的位置重要吗?例如,将对象映射到两个进程中的相同位置是否有利?为什么或者为什么不?
众所周知,MMIO空间被映射(例如,通过/dev/mem,通过调用remap_pfn_range()作为单个PTE来映射,这样就没有struct页面了。
在使用ioremap_wc()时也是这样吗,还是ioremap_wc()创建了一个由页面和许多PTE组成的结构?
操作系统: Linux x86_64