步骤 4 / 6
补上这一页,并重新执行
内核分一页内存填进页表,程序重新执行刚才那条指令。
内核拿一页空闲内存清零后映射过去;如果内容要从磁盘读(比如程序文件或被换出的页),就会慢很多。 只改页表、不读磁盘的叫“次要缺页”,要读磁盘的叫“主要缺页”。 内核返回后,程序重做那次访问,这次成功,完全不知道中间发生了什么。
操作系统
Linux 不会提前把内存给足,等程序真正用到时再补上,内存紧张时还可能“超卖”。
以程序 malloc 一大块内存、之后第一次写入为例。
步骤 4 / 6
内核分一页内存填进页表,程序重新执行刚才那条指令。
内核拿一页空闲内存清零后映射过去;如果内容要从磁盘读(比如程序文件或被换出的页),就会慢很多。 只改页表、不读磁盘的叫“次要缺页”,要读磁盘的叫“主要缺页”。 内核返回后,程序重做那次访问,这次成功,完全不知道中间发生了什么。
| 当前状态 | 发生了什么 |
|---|---|
| 用户态 | 内核只记账,不分配真实内存 |
| 进入内核态 | 访问未映射的页,陷入内核 |
| 内核态 | 确认地址合法,只是尚未分配 |
| 内核态 → 用户态 | 新页映射进页表,重试成功 |