内存管理-高端内存(上)

内存管理-高端内存(上)

ID:42765606

大小:567.05 KB

页数:19页

时间:2019-09-22

内存管理-高端内存(上)_第1页
内存管理-高端内存(上)_第2页
内存管理-高端内存(上)_第3页
内存管理-高端内存(上)_第4页
内存管理-高端内存(上)_第5页
资源描述:

《内存管理-高端内存(上)》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、进程可以寻址4G,貝中0~3G为用户态,3G〜4G为内核态。如果内存不超过1G那么最后这1G线性空间足够映射物理内存了,如果物理内存大于1G,为了使内核空间的1G线性地址可以访问到大于1G的物理内存,把物理内存分为两部分,0〜896MB的进行直接内存映射,也就是说存在一个线性关系:virtualaddress=physicaladdress+PAGE_OFFSET,这里的PAGE_OFFSET为3G。还剩下一个128MB的空间,这个空间作为一个窗口动态进行映射,这样就可以访问大于1G的内存,但是同一时刻

2、内核空间还是只有1G的线性地址,只是不同时刻可以映射到不同的地方。综上,大于896MB的物理内存就是高端内存,内核引入高端内存这个概念是为了通过128MB这个窗口访问大于1G的物理内存。high_memoryPAGEOFFSET1「—:1i一.更¥內1令8朋.vmallot区L恥:vma]jot区聲-内射久映永核■•►固走映貯‘的线性地址:■•存映射:::::■,■•.*#\/FIXADDRSTARTVMALLCKSTARTVMALLOCENDPKMAPBASE4G8上图是内核空间1G线性地址的布局,

3、直接映射区为PAGE_OFFSET〜PAGE_OFFSET+896MB,直接映射的物理地址末尾对应的线性地址保存在high_memory变量屮。直接映射区后边有一个8MB的保护区,冃的是用来”捕获”对内存的越界访问。然后是非连续内存区,范围从VMALLOC_START〜VMALLOC_END,出于同样的原因,每个非连续内存区之间隔着4KB。永久内核映射区从PKMAP_BASE开始,大小为2MB(启动PAE)或4MB。后边是固定映射区,范围是FIXADDR_START〜FIXADDR_TOP,至于临时内核

4、映射区是固定内核映射区里的一部分,在后边会做详细解析。下边来详细介绍高端内存的三种访问方式:非连续内存区访问,永久内核映射,临时内核映射。非连续内存区访问:1.struetvmstruct{2.voiddr;连续内存区:viewplainprint?3.大小)*ad〃内存区内第一个内存单元的线性地址非连续内存区访问会使用一个vm_struct结构来描述每个非unsignedlongsize;//内存区的大小加4096(内存区Z间的安全区间的4.unsignedlongflags;〃非连续的内存区映射的内

5、存类型5.符的指针组成structpage//指向nr_pages数组的指针,**pages;该数组由指向页描述6.unsignedintnrpages;〃内存区填充的页的个数7.unsignedlongphys_addr;//该字段为0,除非内存已被创建来映射一个硬任设备的I/O共享内存6.struetvm_struet*next;//指向下一个vm_struct结构的指针structvmstruct{voidiiuunsignodlongunsignodlongstructpageunsignedi

6、ntvm_struct与vmalloc()分配的非连续线性区有如下关系:vmlist++-->+VMALLOCSTARTI+vmstruct+—VMALLOCENDvmalloc4KBvmalloc4KBvmalloc4KBvmallocvmsruct++vmstruct+vmstruct++-NULL>+下边来看非连续内存区的分配,分配调用了vmalloc()函数:viewplainprint?1.void^vmalloc(unsignedlongsize)2.{3.return_vmalloc(si

7、ze,GFPKERNEL_GFPHTGIIMEM,PAGE_KERNEL);4.}void*vmalloc(unsignedlongsiarcturn_vmalloc(size,(Iflags标志中设置了从highmemory分配。viewplainprint?1.void*_vmalloc(unsignedlongsize,intgfpmask,pgprottprot)2.{3.structvm_struct^area;4.structpage**pages;5.6.7.8.量*/9.physpage

8、s)unsignedintnr_pages,array_size,i;/*需要分配的大小贞对齐*/~size=PAGE_ALIGN(sizc);/*需要分配的央小不能为0,也不能大于物理页的总数if(!size

9、

10、(size»PAGE_SHIFT)>num_10.returnMULL;11・/*找到一个线性区,并获得vm_struct描述符,描述符的flags字段被初始化为VM_ALLOC标志,该标志意味着通过使用vmallocO函数*/1

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。