页管理是通过内核中的mem_map数组进行管理的,表示对应物理页资源已被占用;
缓冲块是内存和外存的转接层、mem_map是物理地址和线性地址之间的转接层;
首先是文件读取过程:
文件读取就是依据各个目录文件获取到目标文件的i节点编号,然后根据这个i节点编号得到需要的inode,该结构中包含目标文件数据所在的数据块位置,如果使用read或者write访问的时候,那么直接根据访问位置即可明确要访问位置然后触发页故障错误,将对应外存的页通过驱动加载到内存的缓冲块,然后访问缓冲区这样的操作;
而对于一个可执行文件的话,先进行fork,将对应可执行文件的页权限改为只读页,而后在写的时候触发页复制操作(写时复制技术);对于内存中没有的而CPU要读取应该也是页错误然后导致页加载;
首先,读取线性地址才会中断触发页加载,那么读取文件和执行文件的加载他是怎么和线性地址或者说逻辑地址扯上关系的?
读取文件:直接读取,然后将硬盘读取到物理页数据读取到缓冲区后,将缓冲区数据直接读取到待读取位置;
可执行文件:首先获取inode节点信息,然后设置当前可执行文件节点为inode节点,接着设置可执行文件入口;那么现在有个问题,就是说当执行可执行文件的时候,当可执行文件不在内存中,他是一个怎么样的触发方式?
整个程序运行过程中,对于内存,无非就是CPU根据指定地址去获取对应内存地址的数据,而如果对应内存位置没有页映射的话,就会触发页故障错误,在该错误中断中根据当前可执行文件的代码、数据段长度判断是否是要获取代码数据,或者是堆空间,从而进行分别操作,对于前者就是通过bread读取块设备的代码文件数据到物理页并进行一个映射,这样就可以正常执行代码!