顺义网站建设推广优化seo,wordpress去谷歌,互联网公司网站,中小企业网站建设流程【README】
1.本文内容总结自 B站 《操作系统-哈工大李治军老师》#xff0c;内容非常棒#xff0c;墙裂推荐#xff1b;
2.操作系统关于内存管理的核心是基于虚拟内存的分段和分页管理#xff1b; 3.而用内存换入和换出实现虚拟内存 #xff1b; 【1】虚拟内存
1…【README】
1.本文内容总结自 B站 《操作系统-哈工大李治军老师》内容非常棒墙裂推荐
2.操作系统关于内存管理的核心是基于虚拟内存的分段和分页管理 3.而用内存换入和换出实现虚拟内存 【1】虚拟内存
1段页同时存在的内存管理图像 2用户眼里的内存就是虚拟内存 【图解】
用户可以随意使用该内存虚拟内存就像单独拥有4G内存每个进程都有对应一个虚拟内存虚拟内存中存放了程序段包括数据段代码段栈段等虚拟内存如何映射到物理内存用户全然不知道操作系统利用虚拟内存与物理内存的映射来给用户提供这种4G内存的假象或图像
3换入 换入就是在虚拟内存与物理内存的映射上进行工作 【2】用换入换出实现大内存
问题虚拟内存4G但物理内存实际只有1G怎么办 解决方法内存换入换出
【2.1】换入实例 【图解】
用户程序都在磁盘上包括它的代码段数据段共计4G大小场景1执行到0~1G操作系统把磁盘上0~1G的代码段 换入 到物理内存并建立虚拟内存与物理内存的映射用户可以随便使用0~1G虚拟内存空间场景2执行到3G~3.5G操作系统把磁盘上3G~3.5G的数据段 换入 到物理内存并建立虚拟内存与物理内存的映射用户可以随便使用3G~3.5G虚拟内存空间
【小结】 1以上2个场景用户感觉到 可以使用 0~1G范围的内存也可以使用3G~3.5G范围的内存用户感觉机器可以使用的内存空间是0~4G但实际物理内存只有1G却给了用户4G内存的假象
2请求的时候才映射指令执行时需要寻址到3G~3.5G 请求的时候才换入用这种方法可以实现 0~4G 的一个规整的虚拟内存 【2.2】请求调页换入
1请求换入建立映射虚拟内存与物理内存的映射
即 请求调入物理内存页并建立虚拟内存与物理内存页的映射【图解】请求调页具体步骤 指令的逻辑地址为 段号偏移cs:ip;
步骤1 操作系统执行指令 load [addr], 根据逻辑地址addr的段号从段表中查询段基址虚拟内存地址步骤2 MMU根据段基址计算出逻辑页号发现逻辑页号在页表中没有记录如拿着3.5G内存地址的逻辑页号 到 0~1G中的页表查找 物理页号肯定查无记录步骤3 因为页表中没有记录缺页或MMU发现缺页则MMU发出页错误中断请求缺页中断请求设置中断请求触发器的某1位为1等待cpu处理步骤4 CPU处理中断执行中断处理程序即执行页错误处理程序步骤5 页错误处理程序从磁盘找到需要的页并读入到空闲物理内存页并建立虚拟内存与物理内存的映射关系在页表中添加一条记录步骤6 中断处理程序执行完成后即请求调页完成后CPU再次执行 load [addr] 指令就能够正确把逻辑地址 addr 翻译到物理地址了
综上应用请求调页或物理内存页换入就可以实现4G大小的虚拟内存供用户随便使用
补充1MMU是一个硬件可以代替程序把逻辑地址立即转为物理地址相比软件MMU硬件的地址翻译效率更高补充2虽然对用户来说感觉到的是4G内存但使用过程中存在系统响应慢的情况原因在于访问某些内存地址空间时由于缺页可能导致操作系统请求调页需要从磁盘读取数据到物理内存比较耗时调页需要耗费时间的
2问题采用请求调页而不是请求调段原因是什么 段比页占用内存空间更大请求调页占用内存空间小内存利用率高 当然也可以请求调段只不过性能可能偏低 【3】请求调页代码实现
1一个实际系统的请求调页 请求调页代码从缺页中断开始 14号中断是缺页中断 // 操作系统启动时初始化14号中断缺页中断的中断处理程序为 page_fault
void trap_init(void)
{set_trap_gate(14, page_fault);
}
// 修改idt表新增中断与中断处理程序的关联关系
#define set_trap_gate(n, addr)_set_gate(idt[n], 15, 0, addr); 2处理中断 page_fault 【图解】
cr2寄存器 用于存储页错误线性地址记录是哪一页缺页了线性地址就是虚拟地址Call _do_no_page: 调用缺页处理函数 _do_no_page()参数是 %cr2寄存器的值注意压栈了
3缺页函数 do_no_page() 从磁盘中找到需要的页并读入空闲的物理内存页建立虚拟内存与物理内存的映射关系页表 // 缺页函数 do_no_page()
// 在 linux/mm/memory.c 中
void do_no_page(unsigned long error_code, unsigned long address)
{ // 获取逻辑页号address 0xfffff000; tmp address - current-start_code; // 页面对应偏移量 if( !current-executagle || tmp current-end_data ) {get_empty_page(address); return ;}// 换入第1步 申请一个物理空闲页 page get_free_page();// 换入第2步 从磁盘或当前进程可执行文件所在设备 i_dev上读取缺页数据到物理空闲页 (block read) bread_page(page, current-executable-i_dev, nr); // 换入第3步 把物理页与虚拟地址建立映射在页表中新增一条映射记录 put_page(page, address);
} 补充请求调页换入的3个步骤非常重要*
步骤1申请空闲的物理内存页步骤2 从磁盘读取缺页数据到物理内存页步骤3 建立虚拟内存与物理内存页的映射关系即修改页表新增一条映射记录
4put_page() 修改页表新增一条映射记录 仅了解