- 论坛徽章:
- 0
|
原帖由 nqdgj2007 于 2009-9-27 22:09 发表 ![]()
在一个进程地址空间分配中 最后是通过mm = allocate_mm();来分配的
#define allocate_mm() (kmem_cache_alloc(mm_cachep, GFP_KERNEL))
是在内核空间采用slab来分配的
但是用户进程的地址空间是4G的也可以在用户空间啊 这个是怎么回事啊
还有__get_free_page是不是只能分配内核空间的物理内存
这个函数最后返回的是page的线形地址,等于说之前就已经映射好了的
而用户进程需要的物理内存 是动态映射的阿
首先要弄清楚内核空间和用户空间的区别
虽然内核数据、代码段跟用户数据、代码段都是从0到4GB,但实际上内核只使用3GB以上线性地址,用户进程只使用3GB以下线性地址。
准确地说,是用户空间跟内核空间共同组成了整个线性空间,只不过用户空间要切换,内核空间是不变的(高端内存特殊)。也就是说,内核空间归所有进程共享,因为进程也有内核态。
你说的allocate_mm()是内核创建进程时使用的一个函数,它用来分配mm_struct结构,此结构用来管理进程的用户空间,注意它只是一个内核结构,不是返回给用户使用的内存空间。
再说说slab,这是内核用来管理内存碎片的机制,只要不是整页分配的内存都由它来管理。用户态发出的内存分配请求最终也需要内核来分配,因为内核管理着整个内存,但是这时候,因为是用户的请求,内核分配出来的内存不会自己使用,而是将其物理地址映射到用户空间的一个线性地址,然后返回给用户。
“__get_free_page是不是只能分配内核空间的物理内存”
物理内存没有内核或者用户之分,只不过只有内核才有权去管理页表,有了页表才能正确访问到物理地址。用户无法申请也没有必要知道物理地址,内核会将物理地址映射好了返回给用户。 |
|