资源预览内容
第1页 / 共49页
第2页 / 共49页
第3页 / 共49页
第4页 / 共49页
第5页 / 共49页
第6页 / 共49页
第7页 / 共49页
第8页 / 共49页
第9页 / 共49页
第10页 / 共49页
亲,该文档总共49页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
内存 目目 录录 1. 内存 1. 内存管理子系统导读 from aka 2. 用户态 3. 内核页目录的初始化 4. 内核线程页目录的借用 5. 用户进程内核页目录的建立 6. 内核页目录的同步 7. mlock 代码分析 8. memory.c 1. copy_page 2. clear_page_tables 3. oom 4. free_page_tables 5. new_page_tables 6. copy_one_pte 7. copy_pte_range 8. copy_pmd_range 9. copy_page_range 10. free_pte 11. forget_pte 12. zap_pte_range 13. zap_pmd_range 14. zap_page_range 15. zeromap_pte_range 等 16. remap_pte_range 等 17. put_dirty_page 18. handle_mm_fault 9. mmap.c 10. 伙伴(buddy)算法 11. 页目录处理的宏 12. MM 作者的文章 内存内存 内存管理系统是操作系统中最为重要的部分,因为系统的物理内存总是少于系统所需要的内存数量。虚拟内存就是为了克服这个矛盾而采用的策略。系统的虚拟内存通过在各个进程之间共享内存而使系统看起来有多于实际内存的内存容量。 虚拟内存可以提供以下的功能: *广阔的地址空间。 系统的虚拟内存可以比系统的实际内存大很多倍。 *进程的保护。 系统中的每一个进程都有自己的虚拟地址空间。这些虚拟地址空间是完全分开的,这样一个进程的运行不会影响其他进程。并且,硬件上的虚拟内存机制是被保护的,内存不能被写入,这样可以防止迷失的应用程序覆盖代码的数据。 *内存映射。 内存映射用来把文件映射到进程的地址空间。在内存映射中,文件的内容直接连接到进程的虚拟地址空间。 *公平的物理内存分配。 内存管理系统允许系统中每一个运行的进程都可以公平地得到系统的物理内存。 *共享虚拟内存。 虽然虚拟内存允许进程拥有自己单独的虚拟地址空间,但有时可能会希望进程共享内存。 linux 仅仅使用四个段 两个代表 (code 和 data/stack)是内核空间从0xC000 0000 (3 GB)到0xFFFF FFFF (4 GB) 两个代表 (code 和 data/stack)是用户空间从0 (0 GB) 到 0xBFFF FFFF (3 GB) _ 4 GB-| | | | Kernel | | 内核空间 (Code + Data/Stack) | | _| 3 GB-|-| _ | | | | | | 2 GB-| | | | Tasks | | 用户空间 (Code + Data/Stack) | | | 1 GB-| | | | | | |_| _| 0x00000000 内核/用户 线性地址 linux 可以使用 3 层页表映射,例如在高级的 I64 服务器上,但是 i386 体系结构下只有 2 层有实际意义: - 线性地址 - _/ _/ _/ PD 偏移 PF 偏移 Frame 偏移 10 bits 10 bits 12 bits | | | | | - | | | | Value |-|- | | | | |-| /| | | | | | | | | | | | | | | | | | | Frame 偏移 | | | | | | | |/ | | | | | |-|_| 物理地址 | | |/ | | x 4096 | | | CR3 |-| | | | |_| | . | | . | | | | | 页目录表 页表 Linux i386 分页 注意内核(仅仅内核)线性空间就等于内核物理空间,所以如下: _ _ | 其他内核数据 |_ | | | |-| | |_| | | 内核 | |_| 实际的其他 | 3 GB -|-| | 内核数据 | | | | | | _|_|_ Real | | Tasks | | Tasks | | _|_|_ Space | | | | | | | |-| | | | 实际内核空间 | |_| |_| 逻辑地址 物理地址 内存实时分配 |copy_mm |allocate_mm = kmem_cache_alloc |_kmem_cache_alloc |kmem_cache_alloc_one |alloc_new_slab |kmem_cache_grow |kmem_getpages |_get_free_pages |alloc_pages |alloc_pages_pgdat |_alloc_pages |rmqueue |reclaim_pages copy_mm kernel/fork.c allocate_mm kernel/fork.c kmem_cache_alloc mm/slab.c _kmem_cache_alloc kmem_cache_alloc_one alloc_new_slab kmem_cache_grow kmem_getpages _get_free_pages mm/page_alloc.c alloc_pages mm/numa.c alloc_pages_pgdat _alloc_pages mm/page_alloc.c rm_queue reclaim_pages mm/vmscan.c 内存交换线程 kswapd |kswapd |/ initialization routines |for (;) / Main loop |do_try_to_free_pages |recalculate_vm_stats |refill_inactive_scan |run_task_queue |interruptible_sleep_on_timeout / we sleep for a new swap request | kswapd mm/vmscan.c do_try_to_free_pages recalculate_vm_stats mm/swap.c refill_inactive_scan mm/vmswap.c run_task_queue kernel/softirq.c interruptible_sleep_on_timeout kernel/sched.c 内存交换机制:出现内存不足的 Exception | Page Fault Exception | cause by all these conditions: | a-) User page | b-) Read or write access | c-) Page not present | | - |do_page_fault |handle_mm_fault |pte_alloc |pte_alloc_one |_get_free_page = _get_free_pages |alloc_pages |alloc_pages_pgdat |_alloc_pages |wakeup_kswapd / We wake up kernel thread kswapd do_page_fault arch/i386/mm/fault.c handle_mm_fault mm/memory.c pte_alloc pte_alloc_one include/asm/pgalloc.h _get_free_page include/linux/mm.h _get_free_pages mm/page_alloc.c alloc_pages mm/numa.c alloc_pages_pgdat _alloc_pages wakeup_kswapd mm/vmscan.c 目录 内存管理子系统导读内存管理子系统导读 from aka 我的目标是导读 ,提供linux 内存管理子系统的整体概念,同时给出进一步深入研究某个部分时的辅助信息(包括代码组织,文件和主要函数的意义和一些参考文档)。之所以采取这种方式,是因为我本人在阅读代码的过程中,深感“读懂一段代码容易,把握整体思想却极不容易” 。而且,在我写一些内核代码时,也觉得很多情况下,不一定非得很具体地理解所有内核代码,往往了解它的接口和整体工作
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号