Linux虚拟内存管理
文章平均质量分 67
gxfan
平平淡淡,从从容容
展开
-
Linux常用内核态内存分配方式总结
Linux常用内核态内存分配方式总结一、 alloc_pages类此类函数主要包括:struct page * alloc_page(unsigned int gfp_mask)——分配一页物理内存并返回该页物理内存的page结构指针。struct page * alloc_pages(unsigned int gfp_mask, unsigned原创 2008-07-28 11:14:00 · 7999 阅读 · 0 评论 -
Linux内存线性地址空间布局解析
Linux内存线性地址空间布局解析适用平台:i386 Linux内存线性地址空间大小为4GB,分为2个部分:用户空间部分(通常是3G)和内核空间部分(通常是1G)。在此我们主要关注内核地址空间部分。内核通过内核页全局目录来管理所有的物理内存,由于线形地址前3G空间为用户使用,内核页全局目录前768项(刚好3G)除0、1两项外全部为0,后256项(1G)用来管理所有原创 2008-07-28 11:31:00 · 8141 阅读 · 2 评论 -
关于kmalloc、vmalloc及kmap
1、 kmalloc()是内核中最常见的内存分配方式,它最终调用伙伴系统的__get_free_pages()函数分配,根据传递给这个函数的flags参数,决定这个函数的分配适合什么场合,如果标志是GFP_KERNEL则仅仅可以用于进程上下文中,如果标志GFP_ATOMIC则可以用于中断上下文或者持有锁的代码段中。kmalloc返回的线形地址是直接映射的,而且用连续物理页满足分配请求,原创 2008-07-28 12:00:00 · 25150 阅读 · 3 评论 -
Linux虚拟内存组织结构浅析(一)
众所周知,linux内核支持绝大多数体系结构,因此linux内核必须采取一种与具体体系结构无关的方法来描述物理内存的组织结构,这个问题就是本系列文章要讨论的话题。 要理解linux虚拟内存在逻辑上的组织结构,我们首先要明白两个概念:UMA(Uniform Memory Access)、NUMA(Non Uniform Memory Access)。UMA指一致性内存访问,这是单CPU机器常原创 2008-09-20 10:48:00 · 4832 阅读 · 0 评论 -
Linux虚拟内存组织结构浅析(二)
Linux虚拟内存组织结构浅析(二)在前一篇文章中我们介绍了Linux虚拟内存在逻辑上的组织结构,现在就让我们从源代码入手,从程序级仔细看看各个数据结构体的内部组成如何,源代码来自于最新的kernel2.6.26.5,分析过程中主要参考了《Understanding the linux virtual memory》这本书,有兴趣的朋友可以去阅读一下。 一、节点的数据表示在内核中,原创 2008-09-21 17:19:00 · 4147 阅读 · 0 评论 -
linux虚拟内存管理简要总结
<!-- @page { size: 21cm 29.7cm; margin: 2cm } P { margin-bottom: 0.21cm } --> 以下讨论仅限i386平台,一般考虑典型情况linux内核对整个系统的物理内存是通过类型为struct page的数组mem_map来管理的。系统中的伙伴系统分配算法最终是通过操作这个数原创 2008-10-22 09:28:00 · 7680 阅读 · 2 评论 -
分配连续物理内存的原因
在分配内存时,系统会尽量给我们分配连续的物理内存,这样有什么好处呢?我知道的有如下2条:1、DMA不使用页表机制,因此必须分配连续的物理内存。2、使用连续物理内存可以提高系统整体性能。上面第1条很容易理解,我主要说明下第2条: 在分页机制打开的情况下,系统访问内存的典型流程为: 1、根据提供的线性地址访问系统TLB,看是否能够命中(hit)。2、若访问TLB命中(hit),则可以直接得到原创 2008-10-22 09:31:00 · 3840 阅读 · 0 评论 -
linux内核地址空间与用户地址空间的差别
本文仅限在i386平台下讨论一般情况。1、用户线性地址空间范围0-3G,内核线性空间范围3G-4G。2、内核总是立即满足内核空间的物理内存分配,并且分配结果对所有进程可见;而对于用户空间的内存分配请求,linux总是先保留用户线性地址空间的一段区域,然后修改页表项使这段线性区域都指向一页内容全为0的全局只读物理页。当进程写入这段线性区域时,将会产生一个缺页异常,这时系统才会为对应的线性地址分配物理原创 2008-10-29 09:17:00 · 5512 阅读 · 0 评论 -
linux启动代码之detect_memory()函数
本篇笔记主要针对平台i386进行讨论,我也是新手,不当之处,敬请指正。以下讨论中“/”代表“/内核源代码根目录/arch/x86/boot/”目录,我用到的内核源代码版本为2.6.26.5。在被bootloader加载到内存后, cpu最初执行的linux内核代码是/header.S文件中的setup函数,这个函数在做了一些准备工作后会跳转到boot目下文件main.c的main函数执行,原创 2008-10-13 15:34:00 · 5387 阅读 · 0 评论