在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例Linux内核编程 → 了解 Linux 虚拟内存管理

了解 Linux 虚拟内存管理

Linux内核编程

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.63M
  • 下载次数:8
  • 浏览次数:51
  • 发布时间:2022-09-11
  • 实例类别:Linux内核编程
  • 发 布 人:Skyhu
  • 文件格式:.pdf
  • 所需积分:2
 相关标签: Virtual Memory linux linux RTU

实例介绍

【实例简介】了解 Linux 虚拟内存管理

Understanding the Linux Virtual Memory Manage

【实例截图】

【核心代码】

Contents
1 Introduction 9
1.1 Thesis Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2 Code Management 11
2.1 Managing the Source . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.3 Submitting Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3 Describing Physical Memory 20
3.1 Nodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.2 Zones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.3 Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4 Page Table Management 30
4.1 Describing the Page Directory . . . . . . . . . . . . . . . . . . . . . . 30
4.2 Describing a Page Table Entry . . . . . . . . . . . . . . . . . . . . . . 32
4.3 Using Page Table Entries . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.4 Translating and Setting Page Table Entries . . . . . . . . . . . . . . . 35
4.5 Allocating and Freeing Page Tables . . . . . . . . . . . . . . . . . . . 36
4.6 Initialising Kernel Page Tables . . . . . . . . . . . . . . . . . . . . . . 37
5 Boot Memory Allocator 39
5.1 Representing the Boot Map . . . . . . . . . . . . . . . . . . . . . . . 39
5.2 Initialising the Boot Memory Allocator . . . . . . . . . . . . . . . . . 40
5.3 Allocating Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.4 Freeing Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.5 Retiring the Boot Memory Allocator . . . . . . . . . . . . . . . . . . 44
6 Physical Page Allocation 48
6.1 Allocator API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
6.2 Managing Free Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . 48
6.3 Allocating Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.4 Free Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.5 GFP Flags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.6 Avoiding Fragmentation . . . . . . . . . . . . . . . . . . . . . . . . . 53
2CONTENTS
3
7 Non-Contiguous Memory Allocation 58
7.1 Kernel Address Space . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
7.2 Describing Virtual Memory Areas . . . . . . . . . . . . . . . . . . . . 59
7.3 Allocating A Non-Contiguous Area . . . . . . . . . . . . . . . . . . . 60
7.4 Freeing A Non-Contiguous Area . . . . . . . . . . . . . . . . . . . . . 61
8 Slab Allocator 63
8.1 Caches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
8.2 Slabs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
8.3 Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
8.4 Sizes Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
8.5 Per-CPU Object Cache . . . . . . . . . . . . . . . . . . . . . . . . . . 84
8.6 Slab Allocator Initialisation . . . . . . . . . . . . . . . . . . . . . . . 86
8.7 Interfacing with the Buddy Allocator . . . . . . . . . . . . . . . . . . 87
9 Process Address Space 89
9.1 Managing the Address Space . . . . . . . . . . . . . . . . . . . . . . . 89
9.2 Process Address Space Descriptor . . . . . . . . . . . . . . . . . . . . 91
9.3 Memory Regions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
9.4 Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
9.5 Page Faulting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
9.6 Copying To/From Userspace . . . . . . . . . . . . . . . . . . . . . . . 117
10 High Memory Management 119
10.1 Managing the PKMap Address Space . . . . . . . . . . . . . . . . . . 120
10.2 Mapping High Memory Pages . . . . . . . . . . . . . . . . . . . . . . 120
10.3 Mapping High Memory Pages Atomically . . . . . . . . . . . . . . . . 122
10.4 Bounce Buffffers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
10.5 Emergency Pools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
11 Page Frame Reclamation 126
11.1 Pageout Daemon (kswapd) . . . . . . . . . . . . . . . . . . . . . . . . 126
11.2 Page Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
11.3 Shrinking all caches . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
11.4 Page Hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
11.5 Inode Queue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
11.6 Refifilling inactive_list . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
11.7 Reclaiming pages from the page cache . . . . . . . . . . . . . . . . . . 130
11.8 Swapping Out Process Pages . . . . . . . . . . . . . . . . . . . . . . . 132
12 Swap Management 135
12.1 Describing the Swap Area . . . . . . . . . . . . . . . . . . . . . . . . 136
12.2 Mapping Page Table Entries to Swap Entries . . . . . . . . . . . . . . 139
12.3 Allocating a swap slot . . . . . . . . . . . . . . . . . . . . . . . . . . 140
12.4 Swap Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141CONTENTS
4
12.5 Activating a Swap Area . . . . . . . . . . . . . . . . . . . . . . . . . 142
12.6 Deactivating a Swap Area . . . . . . . . . . . . . . . . . . . . . . . . 144
12.7 Swapping In Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
12.8 Swapping Out Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
12.9 Read/Writing the Swap Area . . . . . . . . . . . . . . . . . . . . . . 146
13 Out Of Memory Management 148
13.1 Selecting a Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
13.2 Killing the Selected Process . . . . . . . . . . . . . . . . . . . . . . . 149List of Figures
2.1 Example Patch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.1 Relationship Between Nodes, Zones and Pages . . . . . . . . . . . . . 21
4.1 Linear Address Bit Size Macros . . . . . . . . . . . . . . . . . . . . . 31
4.2 Linear Address Size and Mask Macros . . . . . . . . . . . . . . . . . 31
4.3 Page Table Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.4 Call Graph: paging_init . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.1 Call Graph: setup_memory . . . . . . . . . . . . . . . . . . . . . . . 41
5.2 Call Graph: __alloc_bootmem . . . . . . . . . . . . . . . . . . . . . 42
5.3 Call Graph: mem_init . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6.1 Free page block management . . . . . . . . . . . . . . . . . . . . . . . 50
6.2 Call Graph: alloc_pages . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.3 Allocating physical pages . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.4 Call Graph: __free_pages . . . . . . . . . . . . . . . . . . . . . . . . 52
7.1 Kernel Address Space . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
7.2 VMalloc Address Space . . . . . . . . . . . . . . . . . . . . . . . . . . 60
7.3 Call Graph: vmalloc . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
7.4 Call Graph: vfree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
8.1 Layout of the Slab Allocator . . . . . . . . . . . . . . . . . . . . . . . 64
8.2 Call Graph: kmem_cache_create . . . . . . . . . . . . . . . . . . . . 72
8.3 Call Graph: kmem_cache_reap . . . . . . . . . . . . . . . . . . . . . 73
8.4 Call Graph: kmem_cache_shrink . . . . . . . . . . . . . . . . . . . . 74
8.5 Call Graph: __kmem_cache_shrink . . . . . . . . . . . . . . . . . . 74
8.6 Call Graph: kmem_cache_destroy . . . . . . . . . . . . . . . . . . . 75
8.7 Page to Cache and Slab Relationship . . . . . . . . . . . . . . . . . . 76
8.8 Slab With Descriptor On-Slab . . . . . . . . . . . . . . . . . . . . . . 77
8.9 Slab With Descriptor Offff-Slab . . . . . . . . . . . . . . . . . . . . . . 78
8.10 Call Graph: kmem_cache_grow . . . . . . . . . . . . . . . . . . . . . 79
8.11 initialised kmem_bufctl_t Array . . . . . . . . . . . . . . . . . . . . 79
8.12 Call Graph: kmem_slab_destroy . . . . . . . . . . . . . . . . . . . . 81
8.13 Call Graph: kmem_cache_alloc . . . . . . . . . . . . . . . . . . . . . 81
5LIST OF FIGURES
6
8.14 Call Graph: kmalloc . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
8.15 Call Graph: kfree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
9.1 Data Structures related to the Address Space . . . . . . . . . . . . . 90
9.2 Memory Region Flags . . . . . . . . . . . . . . . . . . . . . . . . . . 99
9.3 Call Graph: sys_mmap2 . . . . . . . . . . . . . . . . . . . . . . . . . 103
9.4 Call Graph: get_unmapped_area . . . . . . . . . . . . . . . . . . . . 104
9.5 Call Graph: insert_vm_struct . . . . . . . . . . . . . . . . . . . . . . 105
9.6 Call Graph: sys_mremap . . . . . . . . . . . . . . . . . . . . . . . . 106
9.7 Call Graph: move_vma . . . . . . . . . . . . . . . . . . . . . . . . . 107
9.8 Call Graph: move_page_tables . . . . . . . . . . . . . . . . . . . . . 107
9.9 Call Graph: sys_mlock . . . . . . . . . . . . . . . . . . . . . . . . . . 108
9.10 Call Graph: do_munmap . . . . . . . . . . . . . . . . . . . . . . . . 109
9.11 Call Graph: do_page_fault . . . . . . . . . . . . . . . . . . . . . . . 113
9.12 Call Graph: handle_mm_fault . . . . . . . . . . . . . . . . . . . . . 114
9.13 Call Graph: do_no_page . . . . . . . . . . . . . . . . . . . . . . . . 114
9.14 Call Graph: do_swap_page . . . . . . . . . . . . . . . . . . . . . . . 115
9.15 Call Graph: do_wp_page . . . . . . . . . . . . . . . . . . . . . . . . 116
9.16 do_page_fault Flow Diagram . . . . . . . . . . . . . . . . . . . . . . 118
10.1 Call Graph: kmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
10.2 Call Graph: kunmap . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
10.3 Call Graph: create_bounce . . . . . . . . . . . . . . . . . . . . . . . 123
10.4 Call Graph: bounce_end_io_read/write . . . . . . . . . . . . . . . . 124
11.1 Call Graph: kswapd . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
11.2 Page Cache LRU List . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
11.3 Call Graph: shrink_caches . . . . . . . . . . . . . . . . . . . . . . . . 130
11.4 Call Graph: swap_out . . . . . . . . . . . . . . . . . . . . . . . . . . 132
12.1 Storing Swap Entry Information in swp_entry_t
. . . . . . . . . . . 139
12.2 Call Graph: get_swap_page . . . . . . . . . . . . . . . . . . . . . . . 140
12.3 Adding a Page to the Swap Cache . . . . . . . . . . . . . . . . . . . . 142
12.4 Call Graph: add_to_swap_cache . . . . . . . . . . . . . . . . . . . . 143
12.5 Call Graph: sys_writepage . . . . . . . . . . . . . . . . . . . . . . . . 146
13.1 Call Graph: out_of_memory . . . . . . . . . . . . . . . . . . . . . . 148List of Tables

实例下载地址

了解 Linux 虚拟内存管理

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警