- 论坛徽章:
- 3
|
回复 3# tc1989tc
不管是kernel thread还是normal process, 它们要使用内存都必须向memory allocator提出申请, 并不是说kernel address直接映射了, kernel thread就可以直接使用这些内存. 内存管理 , 指的是有管理者。即使是同样内核的子系统, 也必须向他申请内存. 所以不会出现你所的那种冲突的情况。 一旦申请成功, memory allocator就会标记这些分配的page frame已经分配; 提出申请者没释放之前是不可能再分配这些已分配的内存的。
其次,进程/kernel thread面向的是addresss space. 他们并不知道实际的物理内存. 比如malloc()函数, mm子系统会给他在user mode address space中分配一个VMA(virual address region), 并且分配一些物理内存给他, 然后通过page table 来记录, mm子系统就会知道进程提出的想要读取的0x8000 0000的数据,实际上是要读取物理内存0x1FFF FFFF的数据。vmalloc()函数同理. 0x8000 0000 -> 0x1FFF FFFF这个过程就是解析paging hierarchy, 间接通过paging hierarchy得到virutal address和physical address的映射。
另外可以看alloc_page()和get_user_page()
1) alloc_page() , 会向memory allocator申请1<<order个page frame, 并返回第一个块page frame的page descriptor *page. 因为page descriptor在都被分配在低端内存(属于直接映射部分)因此可以直接使用. 因此不需要转换就可以知道虚拟地址*page所在物理内存的地址。即使是高端内存也可以通过简单的计算得到其描述的page frame的地址(page_to_pfn() -- 建议不要看这个函数, 这个函数涉及到memory model 。你就当是从page descriptor得到物理内存中该page frame一个全局唯一的序号PFN) 。因此即使是高端内存的page frame, 只要得到page descriptor就可以知道分配的PFN(page frame number). 所以alloc_page才会有这个(__GFP_HIGHMEM)标志, 允许申请高端内存的物理页。
|
|