Linux kernel 用户和内核页面

Linux kernel 用户和内核页面,linux-kernel,kernel,Linux Kernel,Kernel,是否有人知道,如果有一种方法可以确定物理页面是用户页面还是内核页面。内核页面总是在内核中访问,用户进程不可用。基本上,如果所讨论的地址高于低内存范围,那么它实际上就是用户地址(内存)。内核只能使用低内存,并且它总是保留供内核使用。 cat/proc/meminfo将为您提供有关内存分区的详细信息 如果要以编程方式执行此操作 find_vmap_area(addr); 此函数获取您的地址并返回vmarea结构。当获得vmarea结构时,可以查找标志 area->flags |= VM_US

是否有人知道,如果有一种方法可以确定物理页面是用户页面还是内核页面。内核页面总是在内核中访问,用户进程不可用。

基本上,如果所讨论的地址高于低内存范围,那么它实际上就是用户地址(内存)。内核只能使用低内存,并且它总是保留供内核使用。 cat/proc/meminfo将为您提供有关内存分区的详细信息

如果要以编程方式执行此操作

find_vmap_area(addr);
此函数获取您的地址并返回vmarea结构。当获得vmarea结构时,可以查找标志

area->flags |= VM_USERMAP;
如果设置了此标志,则显示其用户地址


这是一种方法。可以有更好的方法,甚至可以有一个函数来完成所有这些。事实上,我模模糊糊地记得见过一个。但是,现在找不到。

所以,内核不能为任何用户进程分配低内存。这是真的吗?如果我启动一个只有128MB内存的来宾虚拟机,在这种情况下,用户进程将没有可用内存。128MB是物理内存;他说的是一个虚拟地址。编辑了我的答案,并提供了更多关于编程的详细信息。你想了解更多关于此的详细信息吗?如果你感到满意,并认为这是一个正确的答案,你可以这样标记它。可能对其他人有帮助。我深入研究了内核代码,发现用户页面通常使用GFP_用户标志进行分配。但是linux内核对待GFP_内核和GFP_用户是一样的。您的建议是,如果用户使用vmalloc_user分配一些内存,那么它会找到它,但有几个实例中,用户使用其他原语分配内存。无论如何,你的回答帮助我调试代码的某些部分。谢谢