笔记:内存管理

进程使用对应内存区域的5个数据区:

代码段:代码指令,不可写

数据段:存放初始化的全局变量和静态变量(static)

BSS:存放未初始化的全局变量和静态变量(static)

堆:存放运行中动态分配的内存

栈:存放临时局部变量、函数参数、返回值

 

2.从用户到内核,内存地址从“逻辑地址”——“线性地址”——“物理地址”

逻辑地址经过段机制转化为线性地址,线性地址经过页机制转化为物理地址

linux用户进程使用的进程地址空间是4G大小,被划分为两个部分:用户空间和内核空间。用户空间从0-3G(0xC0000000)

内核空间3G-4G。每当进程切换,用户空间会跟着变化;而内核空间是内核负责映射的。并不会跟着进程变化而变化。内核

空间有自己的页表(init_mm.pgd),用户进程各有不同的页表

3.cat /proc/<pid>/maps查看进程占用的内存区域

内核中管理进程内存区域的结果是vm_area_struct。采用面向对象的方法使VMA结构体可以代表多种类型的内存区域

 

4.进程内存的分配和回收

创建进程fork()、程序载入execve()、映射文件mmap()、动态内存分配malloc()/brk()等进程相关操作都需要分配内存给进程,最后会调用到do_mmap(),该函数会将一个地址区间加入到进程的地址空间中

 

5.内存空间如何由虚到实

进程申请内存时并没有获得物理内存,只是获得一段线性地址区间的使用权。实际的物理内存只有当进程真的去访问虚拟地址时,才会由“请求页机制”产生“缺页”异常,从而进入分配实际页面的例程。

“缺页异常”虚拟内存机制的基本保证,告诉内核去真正为进程分配物理页,并建立对应的页表(nopage操作),这之后虚拟地址才实实在在的映射到物理内存

6.处理器如何根据虚拟地址找到物理内存(虚拟地址转化为物理地址)

通过查询页表。将虚拟地址分段,使每段虚拟地址作为索引指向页表,而页表项则指向下一级的页表或者最终的物理界面。每个进程都有自己的页表,进程描述符的pgd域指向的就是进程的页全局目录。

 

7.物理内存管理

分页管理。将整个内存划分为4K大小的页。get_free_page/get_free_pages

物理页有struct page描述,系统所有页面都存储在数组mem_map[]中

 

8.使用内核内存

slab:内核小块内存(远小于页)频繁的生成和释放。内存片段(小块内存)被看作对象,使用完后并不直接释放,而是缓存到存储池中,留作下次使用。kmem_cache_alloc()/kmem_cache_free()

kmalloc:内核连续内存分配,可分配32到128K字节的内存

vmalloc:非连续物理内存分配,可分配远大于128K的内存

9.内核虚拟空间布局

vmalloc分配的虚拟内存和kmalloc/get_free_pages分配的内核虚拟内存位于不同的区间,不会重叠。

进程空间地址从0到3G(其实是到PAGE_OFFSET,在x86中等于0xC0000000),3G到vmalloc_start是物理内存映射区域(包含了内核镜像,物理页面表mem_map)

kmalloc和get_free_page函数分配的连续内存都陷于物理内存映射区域,所有它们返回的虚拟地址和实际物理地址只相差一个偏移量(PAGE_OFFSET)。virt_to_phys()将内核虚拟空间中的物理映射区地址转化为物理地址

物理内存映射区中的地址与内核页表是有序对应的,系统中每个物理页面都可以找到对应的内核虚拟地址(在物理内存映射区中)

vmalloc分配的地址位于vmalloc_start和vmalloc_end之间。每一块分配的内核虚拟内存都对应一个vm_struct结构体(区别vm_area_strcut结构体是进程虚拟内存区域)。不同的内核虚拟地址被4K大小隔开,防止越界。这些虚拟地址与物理地址并没有简单的位移关系,必须用过内核页表才能转换为物理页

 

10.mmap

许多驱动程序利用内存映射功能将用户空间的一段地址关联到设备内存上

建立页表的方法:可以用remap_pange_range方法一次建立起所有映射区的页表。或者利用vma_struct的nopage方法在缺页时现场一页一页的建立页表

 

原文:https://blog.csdn.net/csdn_whb/article/details/81251713

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值