11 12
发新话题
打印

关于存储初始化的疑问

关于存储初始化的疑问

  初学者,一直对存储管理不甚理解,特别是初始化的部分
参照<深入理解>,还有自己的理解,画了张图,请大家看看有没有画错

附件

Fid_255/255_4988.jpg (27 KB)

2007-1-26 22:24

Fid_255/255_4988.jpg



kmalloc分配的内存是连续的,研究方法不错,加一些文字解析会更好,有助于讨论与回贴。“探究为什么?”内存管理子系统初始化的时机?由谁触发?初始化做什么工作?如何理解相应的数据结构及其联结关系?大家讨论。



基本过程:
系统调用--->触发页内存管理--->初始化页目录(PGM)、中间目录(PMD)、页表(PT)--->初始化内存管理相关数据
研究一下:mm/bootmem.c init/main.c

谢谢
其实最初的疑惑在于kmalloc()与vmalloc()分配方式的不同
1553 void * kmalloc (size_t size, int flags)
1554 {
1555         cache_sizes_t *csizep = cache_sizes;
...
1560                 return __kmem_cache_alloc(flags & GFP_DMA ?
1561                          csizep->cs_dmacachep : csizep->cs_cachep, flags);
1562         }
1563         return NULL;
1564 }

显然kmalloc分配的是通用缓冲区队列
通用缓冲区队列 是采用slab构建的,这个通用缓冲队列的创建过程是怎样的?
情景分析里专用缓冲队列介绍得比较详细,但通用的缓冲没怎么讲

vmalloc代码有些复杂,没仔细看
情景分析里说其过程与ioremap类似
我想简单问问vmalloc的过程是怎样的?ioremap对应的是用户空间的vma_area_struct
vmalloc对应的是用户空间的vm_struct?

要理解这部分内容,还需要补充什么知识或者往哪个方向努力?
vmalloc()调用图示如下:

附件

Fid_255/255_4990.png (11 KB)

2007-1-27 01:02

Fid_255/255_4990.png

研究它,一定要形成线索,<<情景分析>>是相当不错的,有一些书逻辑性太差,甚至前后不一致。
共同研究,共同进步。
当内核要分配新内存时:get_vm_area()--->vm_struct--->kmalloc()
"ioremap对应的是用户空间的vma_area_struct?vmalloc对应的是用户空间的vm_struct?"不能直接这么说。
vm_struct中有flags,能通过设它来使用vmalloc()---VM_ALLOC和ioremap()---VM_IOREMAP.
vmalloc的保留设置最大是128M;
void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags);
area = get_vm_area(size, VM_IOREMAP);
remap_page_range(vma_area_struct *vma, unsigned long from, unsigned long to, unsigned long size, pgprot_tprot);
多谢版主指点,不过还是有点晕
准备在仔细阅读<情景分析>的第二章和最后一章的基础上结合<深入理解>重新学习一遍
目前只粗看了<情景分析>的上册,看来还远远不够
 11 12
发新话题