虚拟地址--物理地址的映射关系

虚拟地址--物理地址的映射关系

ID:14291490

大小:49.00 KB

页数:18页

时间:2018-07-27

虚拟地址--物理地址的映射关系_第1页
虚拟地址--物理地址的映射关系_第2页
虚拟地址--物理地址的映射关系_第3页
虚拟地址--物理地址的映射关系_第4页
虚拟地址--物理地址的映射关系_第5页
资源描述:

《虚拟地址--物理地址的映射关系》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、虚拟地址--物理地址的映射关系虚拟地址--物理地址的映射关系这里只分析分配连续物理地址的函数。对于vmalloc()这种分配非连续物理地址的函数不在本记录范围之内。1、kmalloc()分配连续的物理地址,用于小内存分配。2、__get_free_page()分配连续的物理地址,用于整页分配。至于为什么说以上函数分配的是连续的物理地址和返回的到底是物理地址还是虚拟地址,下面的记录会做出解释。kmalloc()函数本身是基于slab实现的。slab是为分配小内存提供的一种高效机制。但slab这种分配机制又不是独立的,它本身也

2、是在页分配器的基础上来划分更细粒度的内存供调用者使用。也就是说系统先用页分配器分配以页为最小单位的连续物理地址,然后kmalloc()再在这上面根据调用者的需要进行切分。关于以上论述,我们可以查看kmalloc()的实现,kmalloc()函数的实现是在__do_kmalloc()中,可以看到在__do_kmalloc()代码里终极调用了__cache_alloc()来分配一个slab,实在kmem_cache_alloc()等函数的实现也是调用了这个函数来分配新的slab。我们按照__cache_alloc()函数的调用

3、路径一直跟踪下往会发现在cache_grow()函数中使用了kmem_getpages()函数来分配一个物理页面,kmem_getpages()函数中调用的alloc_pages_node()终极是使用__alloc_pages()来返回一个structpage结构,而这个结构正是系统用来描述物理页面的。这样也就证实了上面所说的,slab是在物理页面基础上实现的。kmalloc()分配的是物理地址。__get_free_page()是页面分配器提供给调用者的最底层的内存分配函数。它分配连续的物理内存。__get_free_

4、page()函数本身是基于buddy实现的。在使用buddy实现的物理内存治理中最小分配粒度是以页为单位的。关于以上论述,我们可以查看__get_free_page()的实现,可以看到__get_free_page()函数只是一个非常简单的封状,它的整个函数实现就是无条件的调用__alloc_pages()函数来分配物理内存,上面记录kmalloc()实现时也提到过是在调用__alloc_pages()函数来分配物理页面的条件下进行的slab治理。那么这个函数是如何分配到物理页面又是在什么区域中进行分配的?回答这个题目只能

5、看下相关的实现。可以看到在__alloc_pages()函数中,多次尝试调用get_page_from_freelist()函数从zonelist中取得相关zone,并从其中返回一个可用的structpage页面(这里的有些调用分支是由于标志不同)。至此,可以知道一个物理页面的分配是从zonelist(一个zone的结构数组)中的zone返回的。那么zonelist/zone是如何与物理页面关联,又是如何初始化的呢?继续来看free_area_init_nodes()函数,此函数在系统初始化时由zone_sizes_ini

6、t()函数间接调用的,zone_sizes_init()函数填充了三个区域:ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM。并把他们作为参数调用free_area_init_nodes(),在这个函数中会分配一个pglist_data结构,此结构中包含了zonelist/zone结构和一个structpage的物理页结构,在函数最后用此结构作为参数调用了free_area_init_node()函数,在这个函数中首先使用calculate_node_totalpages()函数标记pglist_data

7、相关区域,然后调用alloc_node_mem_map()函数初始化pglist_data结构中的structpage物理页。最后使用free_area_init_core()函数关联pglist_data与zonelist。现在通以上分析已经明确了__get_free_page()函数分配物理内存的流程。但这里又引出了几个新题目,那就是此函数分配的物理页面是如何映射的?映射到了什么位置?到这里不得不往看下与VMM相关的引导代码。在看VMM相关的引导代码前,先来看一下virt_to_phys()与phys_to_virt这

8、两个函数。顾名思义,即是虚拟地址到物理地址和物理地址到虚拟地址的转换。函数实现十分简单,前者调用了__pa(address)转换虚拟地址到物理地址,后者调用__va(addrress)将物理地址转换为虚拟地址。再看下__pa__va这两个宏到底做了什么。#define__pa(x)((unsignedl

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

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

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