📄 vmalloc.c.txt
字号:
any problems,send email to sindybear@163.com
相关文件
/include/asm-i386/pgtable.h
/include/asm-i386/fixmap.h
******************************vmalloc基本函数********************************
这个函数是内核态的程序进行虚存分配时所使用的函数,和用户态所使用的malloc没有什么联系。
其基本原理就是使用3G+phyical_mm+8m-------------4G-8m这一段虚存地址进行映射
(1)void * __vmalloc (unsigned long size, int gfp_mask, pgprot_t prot)
size = PAGE_ALIGN(size); //页对齐
if (!size || (size >> PAGE_SHIFT) > num_physpages) { //进行地址检测
BUG();
return NULL;
}
area = get_vm_area(size, VM_ALLOC); //得到一段虚存地址
(1)struct vm_struct * get_vm_area(unsigned long size, unsigned long flags)
//这个函数分配一个大小为size的虚拟内存空间
area = (struct vm_struct *) kmalloc(sizeof(*area), GFP_KERNEL); //分配一个vm结构
size += PAGE_SIZE; //每一段的虚拟空间段的最后都加上一个4k大小的hole来进行内存泄露检测
addr = VMALLOC_START; //这个页一样,内存虚地址的分配从phyical_mm + 8M开始
for (p = &vmlist; (tmp = *p) ; p = &tmp->next) {
if ((size + addr) < addr)
goto out;
if (size + addr <= (unsigned long) tmp->addr)
break;
addr = tmp->size + (unsigned long) tmp->addr;
if (addr > VMALLOC_END-size) //VMALLOC_END也不是就是4G的顶,也留有一定的空隙
goto out;
} //再vm列表中找到一个空闲的地方来进行我们的地址存放
…… //对分配的地址进行初始化
**********************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -