基本介绍
我们知道,在linux操作系统中,CPU在执行一个进程的时候,都会访问内存。
但CPU并不是直接访问
物理内存地址
,而是通过
虚拟地址空间
来间接的访问物理内存地址。
所谓的虚拟地址空间,是操作系统为每一个正在执行的进程分配的一个
逻辑地址
,在32位机上,其范围从0 ~ 4G-1。操作系统通过将虚拟地址空间和物理内存地址之间建立映射关系,让CPU间接的访问物理内存地址。
通常将虚拟地址空间以512Byte ~ 8K,作为一个单位,称为
页
,并从0开始依次对每一个页编号。这个大小通常被称为
页面
将物理地址按照同样的大小,作为一个单位,称为
框
或者
块
,也从0开始依次对每一个框编号。
操作系统通过维护一张表,这张表上记录了每一对页和框的映射关系。如图:
这张表,称为
页表
。
在windows系统下,页面为4k,这里我们以4k为例。
一个4G虚拟地址空间,将会产生1024*1024个页,页表的每一项存储一个页和一个框的映射,所以,至少需要1M个
页表项
。如果一个页表项大小为1Byte,则至少需要1M的空间,所以页表被放在物理内存中,由操作系统维护。
当CPU要访问一个虚拟地址空间对应的物理内存地址时,先将具体的虚拟地址A/页面大小4K,结果的商作为页表号,结果的余作为业内地址偏移。
例如:
CPU访问的虚拟地址:A
页面:L
页表号:(A/L)
页内偏移:(A%L)
CPU中有一个页表寄存器,里面存放着当前进程页表的起始地址和页表长度。将上述计算的页表号和页表长度进行对比,确认在页表范围内,然后将页表号和页表项长度相乘,得到目标页相对于页表基地址的偏移量,最后加上页表基地址偏移量就可以访问到相对应的框了,CPU拿到框的起始地址之后,再把页内偏移地址加上,访问到最终的目标地址。如图:
注意,每个进程都有页表,页表起始地址和页表长度的信息在进程不被CPU执行的时候,存放在其PCB内。
按照上述的过程,可以发现,CPU对内存的一次访问动作需要访问两次物理内存才能达到目的,第一次,拿到框的起始地址,第二次,访问最终物理地址。CPU的效率变成了50%。为了提高CPU对内存的访问效率,在CPU第一次访问内存之前,加了一个快速缓冲区寄存器,它里面存放了近期访问过的页表项。当CPU发起一次访问时,先到TLB中查询是否存在对应的页表项,如果有就直接返回了。整个过程只需要访问一次内存。如图:
这种方式极大的提高了CPU对内存的访问效率。将近90%。
然而这样的方式还是存在弊端,在物理内存中需要拿出至少1M的连续的内存空间来存放页表。可以通过多级页表的方式,将页表分为多个部分,分别存放,这样就不要求连续的整段内存,只需要多个连续的小段内存即可。
把连续的页表拆分成多个页表称之为一级页表,再创建一张页表,这张页表记录每一张一级页表的起始地址并按照顺序为其填写页表号。
通过这样的方式,CPU从基地址寄存器中拿到了一级页表的地址,从地址结构中取出一级页表的页表号,找到二级页表的起始物理地址;然后结合地址结构中的中间10位(二级页表上的页表号),可以找到对应的框的起始地址,最后结合页内偏移量,就可以计算出最终目标的物理地址。如图:
8.4.2 为INET BSD Socket绑定地址 99
8.4.3 建立INET BSD Socket连接 99
8.4.4 INET BSD Socket侦听 100
8.4.5 接受连接请求 100
8.5 IP层 100
8.5.1 套接字缓冲区 100
8.5.2 接收IP报文 101
8.5.3 发送IP报文 102
8.5.4 数据分片 102
8.6 地址解析协议 103
8.7 IP路由 104
第9章 内核机制与模
块
107
9.1 内核机制 107
9.1.1 Bottom Half控制 107
9.1.2 任务队列 108
9.1.3 定时器 109
9.1.4 等待队列 110
9.1.5 自旋锁 110
9.1.6 信号量 110
9.2 模
块
111
9.2.1 模
块
载入 112
9.2.2 模
块
卸载 113
第10章 处理器 115
10.1 X86 115
10.2 ARM 115
10.3 Alpha AXP处理器 115
第11章
Linux
内核源代码 117
11.1 怎样得到
Linux
内核源码 117
11.2 内核源码的编排 117
11.3 从何处看起 118
第12章
Linux
数据结构 120
附录A 有用的Web和FTP站点 138
附录B 词汇表 139
第二部分
Linux
内核模
块
编程指南
第1章 Hello, World 145
1.1 内核模
块
的Makefiles文件 146
1.2 多重文件内核模
块
147
第2章 字符设备文件 149
第3章 /proc文件系统 158
第4章 把/proc用于输入 162
第5章 把设备文件用于输入 170
第6章 启动参数 182
第7章 系统调用 185
第8章 阻塞处理 190
第9章 替换printk 199
第10章 任务调度 202
第11章 中断处理程序 207
第12章 对称多处理 211
第13章 常见错误 212
附录A 2.0和2.2之间的差异 213
附录B 其他资源 214
附录C 给出你的评价 215
第三部分
Linux
程序员指南
第1章
Linux
操作系统 219
第2章
Linux
内核 220
第3章
Linux
libc包 221
第4章 系统调用 222
第5章 “瑞士军刀”:ioctl 223
第6章
Linux
进程间通信 224
6.1 介绍 224
6.2 半双工Unix管道 224
6.2.1 基本概念 224
6.2.2 用C语言创建管道 225
6.2.3 简便方法 229
6.2.4 管道的原子操作 233
6.2.5 关于半双工管道需要注意的几个
问题 233
6.3 命名管道 234
6.3.1 基本概念 234
6.3.2 创建FIFO 234
6.3.3 FIFO操作 235
6.3.4 FIFO上的阻塞动作 236
6.3.5 SIGPIPE信号 237
6.4 系统V IPC 237
6.4.1 基本概念 237
6.4.2 消息队列 239
6.4.3 信号量 251
6.4.4 semtool:交互式信号量操作
程序 260
6.4.5 共享内存 267
第7章 声音编程 274
7.1 内部扬声器编程 274
7.2 声卡编程 274
第8章 字符单元图形 276
8.1 libc中的I/O函数 277
8.1.1 格式化输出 277
8.1.2 格式化输入 278
8.2 termcap库 278
8.2.1 前言 278
8.2.2 获得终端描述 279
8.2.3 查看终端描述 279
8.2.4 termcap权能 280
8.3 Ncurses简介 280
8.4 初始化 282
8.5 窗口 283
8.6 输出 284
8.6.1 格式化输出 285
8.6.2 插入字符/行 286
8.6.3 删除字符/行 286
8.6.4 方
框
和直线 287
8.6.5 背景字符 287
8.7 输入 288
8.8 选项 289
8.8.1 输出选项 289
8.8.2 输入选项 290
8.8.3 终端属性 291
8.8.4 使用选项 291
8.9 更新终端 292
8.10 视频属性与颜色 293
8.11 光标和屏幕坐标 294
8.12 滚动 294
8.13 小键盘 295
8.14 软标签 295
8.15 杂项 295
8.16 低级访问 296
8.17 屏幕转储 296
8.18 Termcap模拟 296
8.19 Terminfo函数 296
8.20 调试函数 297
8.21 Terminfo权能 297
8.21.1 布尔型权能 297
8.21.2 数值型权能 298
8.21.3 字符串型权能 299
8.22 [N]Curses函数概述 306
第9章 I/O端口编程 307
9.1 鼠标编程 307
9.2 调制解调器编程 308
9.3 打印机编程 308
9.4 游戏杆编程 308
第10章 把应用程序移植到
Linux
上 309
10.1 介绍 309
10.2 信号处理 309
10.2.1 SVR4、BSD和POSIX.1下
的信号 310
10.2.2
Linux
信号选项 310
10.2.3
Linux
下的信号 310
10.2.4
Linux
支持的信号 311
10.3 终端I/O 311
10.4 进程信息和控制 311
10.4.1 kvm过程 312
10.4.2 ptrace和/proc文件系统 312
10.4.3
Linux
下的进程控制 312
10.5 可移植条件编译 313
10.6 补充说明 314
附录 以字母顺序排列的系统调用 315
第四部分
Linux
内核概念系统结构
摘要 323
前言 324
第1章 系统结构 325
1.1 系统概述 325
1.2 内核的目标 325
1.3 内核结构的概述 325
1.4 支持多个开发人员 327
1.5 系统数据结构 328
1.5.1 任务列表 328
1.5.2 内存映射 328
1.5.3 索引节点 328
1.5.4 数据连接 329
第2章 子系统的系统结构 330
2.1 进程调度程序系统结构 330
2.1.1 目标 330
2.1.2 模
块
330
2.1.3 数据表达 331
2.1.4 依赖性、数据流和控制流 331
2.2 内存管理程序系统结构 331
2.2.1 目标 331
2.2.2 模
块
331
2.2.3 数据表示 331
2.2.4 数据流、控制流和依赖性 332
2.3 虚拟文件系统系统结构 333
2.3.1 目标 333
2.3.2 模
块
333
2.3.3 数据表示 333
2.3.4 数据流、控制流和依赖性 334
2.4 网络接口系统结构 334
2.4.1 目标 334
2.4.2 模
块
334
2.4.3 数据表示 335
2.4.4 数据流、控制流和依赖性 335
2.5 进程间通信系统结构 335
第3章 结论 336
附录A 术语定义 337
附录B 参考文献 338
第五部分
Linux
内核具体系统结构
摘要 341
第1章 前言 342
1.1 目标 342
1.2
Linux
介绍 342
1.3 软件系统结构的背景知识 342
1.4 方法与途径 343
1.5 适用本书的读者 344
1.6 本部分的章节安排 344
第2章 系统结构 345
第3章 子系统结构 346
3.1 进程调度程序 346
3.1.1 目标 346
3.1.2 外部接口 346
3.1.3 子系统描述 346
3.1.4 数据结构 347
3.1.5 子系统结构 348
3.1.6 子系统依赖性 348
3.2 内存管理程序 348
3.2.1 目标 348
3.2.2 外部接口 349
3.2.3 子系统描述 349
3.2.4 数据结构 350
3.2.5 子系统结构 350
3.2.6 子系统依赖性 351
3.3 虚拟文件系统 352
3.3.1 目标 352
3.3.2 外部接口 352
3.3.3 子系统描述 353
3.3.4 设备驱动程序 353
3.3.5 逻辑文件系统 354
3.3.6 模
块
354
3.3.7 数据结构 355
3.3.8 子系统结构 355
3.3.9 子系统依赖性 355
3.4 进程间通信 355
3.4.1 目标 355
3.4.2 外部接口 357
3.4.3 子系统描述 357
3.4.4 数据结构 358
3.4.5 子系统结构 359
3.4.6 子系统依赖性 359
3.5 网络接口 360
3.5.1 目标 360
3.5.2 外部接口 361
3.5.3 子系统描述 361
3.5.4 数据结构 362
3.5.5 子系统结构 363
3.5.6 子系统依赖性 363
第4章 结论 365
附录A 术语定义 366
附录B 参考文献 368
第六部分 附 录
附录A
Linux
文档工程拷贝许可证 372
附录B GNU通用公共许可证 374
8.4.2 为INET BSD Socket绑定地址 99
8.4.3 建立INET BSD Socket连接 99
8.4.4 INET BSD Socket侦听 100
8.4.5 接受连接请求 100
8.5 IP层 100
8.5.1 套接字缓冲区 100
8.5.2 接收IP报文 101
8.5.3 发送IP报文 102
8.5.4 数据分片 102
8.6 地址解析协议 103
8.7 IP路由 104
第9章 内核机制与模
块
107
9.1 内核机制 107
9.1.1 Bottom Half控制 107
9.1.2 任务队列 108
9.1.3 定时器 109
9.1.4 等待队列 110
9.1.5 自旋锁 110
9.1.6 信号量 110
9.2 模
块
111
9.2.1 模
块
载入 112
9.2.2 模
块
卸载 113
第10章 处理器 115
10.1 X86 115
10.2 ARM 115
10.3 Alpha AXP处理器 115
第11章
Linux
内核源代码 117
11.1 怎样得到
Linux
内核源码 117
11.2 内核源码的编排 117
11.3 从何处看起 118
第12章
Linux
数据结构 120
附录A 有用的Web和FTP站点 138
附录B 词汇表 139
第二部分
Linux
内核模
块
编程指南
第1章 Hello, World 145
1.1 内核模
块
的Makefiles文件 146
1.2 多重文件内核模
块
147
第2章 字符设备文件 149
第3章 /proc文件系统 158
第4章 把/proc用于输入 162
第5章 把设备文件用于输入 170
第6章 启动参数 182
第7章 系统调用 185
第8章 阻塞处理 190
第9章 替换printk 199
第10章 任务调度 202
第11章 中断处理程序 207
第12章 对称多处理 211
第13章 常见错误 212
附录A 2.0和2.2之间的差异 213
附录B 其他资源 214
附录C 给出你的评价 215
第三部分
Linux
程序员指南
第1章
Linux
操作系统 219
第2章
Linux
内核 220
第3章
Linux
libc包 221
第4章 系统调用 222
第5章 “瑞士军刀”:ioctl 223
第6章
Linux
进程间通信 224
6.1 介绍 224
6.2 半双工Unix管道 224
6.2.1 基本概念 224
6.2.2 用C语言创建管道 225
6.2.3 简便方法 229
6.2.4 管道的原子操作 233
6.2.5 关于半双工管道需要注意的几个
问题 233
6.3 命名管道 234
6.3.1 基本概念 234
6.3.2 创建FIFO 234
6.3.3 FIFO操作 235
6.3.4 FIFO上的阻塞动作 236
6.3.5 SIGPIPE信号 237
6.4 系统V IPC 237
6.4.1 基本概念 237
6.4.2 消息队列 239
6.4.3 信号量 251
6.4.4 semtool:交互式信号量操作
程序 260
6.4.5 共享内存 267
第7章 声音编程 274
7.1 内部扬声器编程 274
7.2 声卡编程 274
第8章 字符单元图形 276
8.1 libc中的I/O函数 277
8.1.1 格式化输出 277
8.1.2 格式化输入 278
8.2 termcap库 278
8.2.1 前言 278
8.2.2 获得终端描述 279
8.2.3 查看终端描述 279
8.2.4 termcap权能 280
8.3 Ncurses简介 280
8.4 初始化 282
8.5 窗口 283
8.6 输出 284
8.6.1 格式化输出 285
8.6.2 插入字符/行 286
8.6.3 删除字符/行 286
8.6.4 方
框
和直线 287
8.6.5 背景字符 287
8.7 输入 288
8.8 选项 289
8.8.1 输出选项 289
8.8.2 输入选项 290
8.8.3 终端属性 291
8.8.4 使用选项 291
8.9 更新终端 292
8.10 视频属性与颜色 293
8.11 光标和屏幕坐标 294
8.12 滚动 294
8.13 小键盘 295
8.14 软标签 295
8.15 杂项 295
8.16 低级访问 296
8.17 屏幕转储 296
8.18 Termcap模拟 296
8.19 Terminfo函数 296
8.20 调试函数 297
8.21 Terminfo权能 297
8.21.1 布尔型权能 297
8.21.2 数值型权能 298
8.21.3 字符串型权能 299
8.22 [N]Curses函数概述 306
第9章 I/O端口编程 307
9.1 鼠标编程 307
9.2 调制解调器编程 308
9.3 打印机编程 308
9.4 游戏杆编程 308
第10章 把应用程序移植到
Linux
上 309
10.1 介绍 309
10.2 信号处理 309
10.2.1 SVR4、BSD和POSIX.1下
的信号 310
10.2.2
Linux
信号选项 310
10.2.3
Linux
下的信号 310
10.2.4
Linux
支持的信号 311
10.3 终端I/O 311
10.4 进程信息和控制 311
10.4.1 kvm过程 312
10.4.2 ptrace和/proc文件系统 312
10.4.3
Linux
下的进程控制 312
10.5 可移植条件编译 313
10.6 补充说明 314
附录 以字母顺序排列的系统调用 315
第四部分
Linux
内核概念系统结构
摘要 323
前言 324
第1章 系统结构 325
1.1 系统概述 325
1.2 内核的目标 325
1.3 内核结构的概述 325
1.4 支持多个开发人员 327
1.5 系统数据结构 328
1.5.1 任务列表 328
1.5.2 内存映射 328
1.5.3 索引节点 328
1.5.4 数据连接 329
第2章 子系统的系统结构 330
2.1 进程调度程序系统结构 330
2.1.1 目标 330
2.1.2 模
块
330
2.1.3 数据表达 331
2.1.4 依赖性、数据流和控制流 331
2.2 内存管理程序系统结构 331
2.2.1 目标 331
2.2.2 模
块
331
2.2.3 数据表示 331
2.2.4 数据流、控制流和依赖性 332
2.3 虚拟文件系统系统结构 333
2.3.1 目标 333
2.3.2 模
块
333
2.3.3 数据表示 333
2.3.4 数据流、控制流和依赖性 334
2.4 网络接口系统结构 334
2.4.1 目标 334
2.4.2 模
块
334
2.4.3 数据表示 335
2.4.4 数据流、控制流和依赖性 335
2.5 进程间通信系统结构 335
第3章 结论 336
附录A 术语定义 337
附录B 参考文献 338
第五部分
Linux
内核具体系统结构
摘要 341
第1章 前言 342
1.1 目标 342
1.2
Linux
介绍 342
1.3 软件系统结构的背景知识 342
1.4 方法与途径 343
1.5 适用本书的读者 344
1.6 本部分的章节安排 344
第2章 系统结构 345
第3章 子系统结构 346
3.1 进程调度程序 346
3.1.1 目标 346
3.1.2 外部接口 346
3.1.3 子系统描述 346
3.1.4 数据结构 347
3.1.5 子系统结构 348
3.1.6 子系统依赖性 348
3.2 内存管理程序 348
3.2.1 目标 348
3.2.2 外部接口 349
3.2.3 子系统描述 349
3.2.4 数据结构 350
3.2.5 子系统结构 350
3.2.6 子系统依赖性 351
3.3 虚拟文件系统 352
3.3.1 目标 352
3.3.2 外部接口 352
3.3.3 子系统描述 353
3.3.4 设备驱动程序 353
3.3.5 逻辑文件系统 354
3.3.6 模
块
354
3.3.7 数据结构 355
3.3.8 子系统结构 355
3.3.9 子系统依赖性 355
3.4 进程间通信 355
3.4.1 目标 355
3.4.2 外部接口 357
3.4.3 子系统描述 357
3.4.4 数据结构 358
3.4.5 子系统结构 359
3.4.6 子系统依赖性 359
3.5 网络接口 360
3.5.1 目标 360
3.5.2 外部接口 361
3.5.3 子系统描述 361
3.5.4 数据结构 362
3.5.5 子系统结构 363
3.5.6 子系统依赖性 363
第4章 结论 365
附录A 术语定义 366
附录B 参考文献 368
第六部分 附 录
附录A
Linux
文档工程拷贝许可证 372
附录B GNU通用公共许可证 374
【
页表
缓存】:CPU 内存管理单元(MMU),处理器制造厂商在内存管理单元中增加的一个高速缓存(称为
页表
缓存)。作用将虚拟地址转换成物理地址。【
页表
】:特殊数据结构,存放系统空间的
页表
区域(存放逻辑
页
与物理
页
帧的对应关系)。每个进程都有自己的
页表
,PCB 表中有指针指向
页表
。(1)逻辑地址(
页
号,偏移量),逻辑地址就是虚拟地址。(2)物理地址(
页
框
号,偏移量)。【
页
框
】:内存中的
块
。【
页
】:进程中的
块
。
本书对
Linux
操作系统及其编程作了整体的介绍,以支持用于开发软件的公开源码模型。对内存管理、进程及其通信机制、PCI、内核模
块
编程及内核系统结构作了详细的解释,且附有很多程序代码实例。对深入研究
Linux
下的编程有很大的帮助。
目 录
Linux
文档工程小组“公告”
第一部分
Linux
内核
第1章 硬件基础与软件基础 6
1.1 硬件基础 6
1.1.1 CPU 7
1.1.2 存储器 8
1.1.3 总线 8
1.1.4 控制器和外设 8
1.1.5 地址空间 9
1.1.6 时钟 9
1.2 软件基础 9
1.2.1 计算机语言 9
1.2.2 什么是操作系统 11
1.2.3 内核数据结构 13
第2章 内存管理 15
2.1 虚拟内存抽象模型 15
2.1.1 请求调
页
17
2.1.2 交换 17
2.1.3 共享虚拟内存 18
2.1.4 物理寻址模式和虚拟寻址模式 18
2.1.5 访问控制 18
2.2 高速缓存 19
2.3
Linux
页表
20
2.4
页
分配和回收 21
2.4.1
页
分配 22
2.4.2
页
回收 22
2.5 内存映射 22
2.6 请求调
页
23
2.7
Linux
页
缓存 24
2.8
页
换出和淘汰 25
2.8.1 减少缓冲区和
页
缓存大小 25
2.8.2 换出System V共享内存
页
26
2.8.3 换出和淘汰
页
27
2.9 交换缓存 27
2.10
页
换入 28
第3章 进程 29
3.1
Linux
进程 29
3.2 标识符 31
3.3 调度 32
3.4 文件 34
3.5 虚拟内存 35
3.6 创建进程 36
3.7 时间和定时器 37
3.8 执行程序 38
3.8.1 ELF 39
3.8.2 脚本文件 40
第4章 进程间通信机制 41
4.1 信号机制 41
4.2 管道 42
4.3 套接字 44
4.3.1 System V的进程间通信机制 44
4.3.2 消息队列 44
4.3.3 信号量 45
4.3.4 共享存储区 47
第5章 PCI 49
5.1 PCI的地址空间 49
5.2 PCI配置头 50
5.3 PCI的I/O和存储地址空间 51
5.4 PCI-ISA桥 51
5.5 PCI-PCI 桥 51
5.5.1 PCI-PCI桥:PCI I/O和存储地址空间的窗口 51
5.5.2 PCI-PCI桥:PCI配置周期和PCI总线编号 52
5.6
Linux
PCI初始化 53
5.6.1
Linux
内核PCI数据结构 53
5.6.2 PCI设备驱动程序 53
5.6.3 PCI的BIOS函数 56
5.6.4 PCI修正过程 57
第6章 中断处理与设备驱动程序 60
6.1 中断与中断处理 60
6.1.1 可编程中断控制器 61
6.1.2 初始化中断处理数据结构 61
6.1.3 中断处理 62
6.2 设备驱动程序 63
6.2.1 测试与中断 64
6.2.2 直接存储器访问(DMA) 65
6.2.3 存储器 66
6.2.4 设备驱动程序与内核的接口 66
6.2.5 硬盘 69
6.2.6 网络设备 74
第7章 文件系统 77
7.1 第二个扩展文件系统EXT2 78
7.1.1 EXT2系统的inode节点 79
7.1.2 EXT2系统的超级
块
80
7.1.3 EXT2系统的组描述符 80
7.1.4 EXT2系统的目录 81
7.1.5 在EXT2文件系统中查找文件 81
7.1.6 在EXT2文件系统中改变文件的大小 82
7.2 虚拟文件系统 83
7.2.1 VFS文件系统的超级
块
84
7.2.2 VFS文件系统的inode节点 84
7.2.3 注册文件系统 85
7.2.4 装配文件系统 85
7.2.5 在虚拟文件系统中查找文件 87
7.2.6 卸载文件系统 87
7.2.7 VFS文件系统的inode缓存 87
7.2.8 目录缓存 88
7.3 缓冲区缓存 88
7.3.1 bd
有效位:标识该
页表
项对应的虚
页
面有没有读进内存,否则在磁盘
访问位:引用位,标识该
页
面有没有被访问过
修改位:此
页
面在内存中有没有被修改过,如果被修改过,将来是要被持久化到磁盘上的,该标志位就是这个目的
保护位:标识该
页
面的读写等权限
页表
项一般是由硬件设计的,因为地址转换时大多数是由硬件完成的。
代码阅读工具:vim+ctags+cscope
通用操作系统,通常都会开启mmu来支持虚拟内存管理,而
页表
管理是在虚拟内存管理中尤为重要,本文主要以回答几个
页表
管理中关键性问题来解析
Linux
内核
页表
管理,看一看
页表
管理中那些鲜为人知的秘密。
2.
页表
的作用是什么?
1)地址转换
将虚拟地址转换..
我们的指令和数据,都必须先加载到内存,才会被CPU拿去执行。但是程序并不能直接访问到物理内存。从这里可以知道,程序是怎么装载到内存中执行的。
我们的内存需要被分成固定大小的
页
(Page),然后才通过虚拟内存地址到物理内存地址的地址转换,才能到达实际存放数据的物理内存位置。而我们的程序看到的内存地址,都是虚拟内存地址。
那么,这些虚拟内存地址究竟是怎么转换成物理地址的呢?
简答
页表
想要把虚拟内存地址,映射到物理内存地址,最直观的方法,就是来键一张映射表。这个映射表,能够实现虚拟内存里面的
页
,到物理内存里面
固定分区,会产生
页
内碎片等缺点,为此引入了动态分区方式。但动态分区又产生了外部碎片,导致内存的利用率也不理想。为了进一步提高内存的利用率,所以就产生了离散的分配方式。(理论来源于实际问题,这很好的体现在计算机科学中)
离散分配首先要解决的是分配的基本单位问题。通常,分配的基本单位是
页
与段。
页
:固定大小的片段。 段:长度可变,用户自己定义的一段数据集合。
逻辑地址:是程序编译后,生成的目标模
块
进行编址时都是从0号开始编址,称之为目标模
块
的相对地址,即逻辑地址。
虚拟地址:计算机处理器的地址有32位和64位的两种,对应的虚拟地址的空间大小分别是2^32字节和2^64字节,字节用B表示。
页
:分
页
存储管理将进程的逻辑地址空间划分为若干
页
(面),并且对其编号,号数从0开始,每个
页
(面)的大小称为
页
面大小,且大小应为2的幂。
物理
块
:将内存的物理地址...
同任何缓存一样,虚拟内存系统必须有某种方法来判定一个虚拟
页
是否缓存在DRAM 中的某个地方。如果是,系统还必须确定这个虚拟
页
存放在哪个物理
页
中。如果不命中,系统必须判断这个虚拟
页
存放在磁盘的哪个位置,在物理内存中选择一个牺牲
页
,并将虚拟
页
从磁盘复制到 DRAM 中,替换这个牺牲
页
。
这些功能是由软硬件联合提供的,包括操作系统软件、内存管理单元中的地址翻译硬件和一个存放在物理内存中叫做
页表
的数据结构,
页表
将虚拟
页
映射到物理
页
。每次地址翻译硬件将一个虚拟地址转换为物理地址时,都会读取
页表
。操作系
逻辑地址:是程序编译后,生成的目标模
块
进行编址时都是从0号开始编址,称之为目标模
块
的相对地址,即逻辑地址。
虚拟地址:计算机处理器的地址有32位和64位的两种,对应的虚拟地址的空间大小分别是2^32字节和2^64字节,字节用B表示。
页
:分
页
存储管理将进程的逻...