一、内存管理
怎么从内存向磁盘写入数据?
磁盘内部有盘片,盘片上有磁极,通过磁头修改盘片特定位置的南北极就可以更改磁盘的01序列。
物理内存中有无数个小的,最基本的可以临时存储高低电平(01)的硬件电路。所以把数据写在物理内存本质是向物理内存充放电的过程。所以这种物理内存的特点是不能断电,一旦断电存储的数据就会丢失。
所以把二进制序列从一个设备到另一个设备本质上就是电路信号从一个设备充到另一个设备。
由于文件系统IO的基本单位大小是4KB,所以我们的可执行程序被划分为一块一块的4KB大小,分块被加载到内存,所以内存也要划分为一块一块的4KB空间。
我们把IO的4KB大小称为page size,把可执行程序的一块4KB称为页帧,把内存中的一块4KB称为页框。
内存管理、文件管理、编译器等多种技术互相配合才促使了OS与文件系统交互基本单位是4KB的结论。
文件结构体struct file中有文件属性,文件是否读写和文件缓冲区,所谓文件缓冲区就是通过某种数据结构指向文件内容被加载到内存中的位置。如果要扩大文件缓冲区,无非就是在内存中再申请一个数据块,把文件某部分内容加载到这个数据块中,再把数据块添加到文件缓冲区里。如果想释放刷新缓冲区,就是把数据块内容刷新到外设里面,再把链接关系去掉。
4GB的内存中有1048576个页框(4GB),OS怎么知道哪个页框已经使用、哪个还没使用、哪个正在刷新、是否需要释放?
OS需要管理页框,先描述再组织。
struct page
{
//描述一个page的使用情况
//page的属性
}
//比如int flag用这一个整数的bit位表示page是否已经刷新过了等等
//通过定义不同的宏值表示不同的bit位来表示page属性
//如何组织起来?
struct page pages[1048576]; //定义一个大的数组,下标与每个页框映射
对page的管理就变成了对某个数组内的特定数据结构的增删查改。
所以文件缓冲区不需要指向内存地址,只需要找到pages中相关的数组下标就行了。缓冲区就转化成了一种数据结构和另一种数据结构的关系。
二、关于地址空间和内存之间的页表
地址空间有2的32次方个地址,页表中有虚拟地址(4字节)、物理地址(4字节)、读写权限、内存中是否分配有数据这些字段假设为10字节。全部映射的话内存连页表都装不下。