看来,您是在谈论 32 位 x86 系统,对吧?
如果我没记错的话,内核不仅可以配置为 3Gb/1Gb 内存分布,还可以有其他变体(例如 2Gb/2Gb)。尽管如此,3Gb/1Gb 可能是 x86-32 上最常见的一种。
地址空间的内核部分应该不能从用户空间访问。从内核的角度来看,是的,内核本身占用的内存的映射总是一样的。无论如何,内核当前在哪个进程(或中断处理程序,或其他)的上下文中运行。
作为结果之一,如果您查看/proc/kallsyms
来自不同进程的内核符号的地址,您每次都会看到相同的地址。从内核的角度来看,这些正是各个内核函数、变量等的地址。
所以我想,你的第一个问题的答案是“是”,但它可能对用户空间代码不是很有用,因为内核空间内存无论如何都不能直接从那里访问。
至于第二个问题,好吧,如果内核当前在某个进程的上下文中运行,它实际上可以访问该进程的用户空间内存。我无法详细描述它,但可能是内核函数的实现,copy_from_user
可以copy_to_user
给你一些提示。请参阅内核源代码中的arch/x86/lib/usercopy_32.c
和arch/x86/include/asm/uaccess.h
。看来,在 x86-32 上,用户空间内存是在这些函数中直接访问的,使用当前进程上下文的默认内存映射。那里的“神奇”东西只与优化和检查内存区域地址的正确性有关。