操作系统虚拟内存的问题

请教大家一个问题,操作系统书上写程序使用的都是虚拟地址,通过页表转换成真实的物理地址,每一个进程都有自己的页表。
Q1:每个进程都有自己的页表,操作系统是如何避免不同的进程映射的物理地址是相同的?(就是不同的虚拟地址,如何确保最终映射的物理地址不是相同的)
Q2:每个进程的页表大小是固定的还是动态变化的?(如果是大小固定的,那页表里面的内容是动态的么?比如某个页开始没有使用,后来需要使用的时候,找一块空闲的物理页映射到当前页的虚拟地址)
谢谢
全部评论
我的看法:
点赞 回复 分享
发布于 2019-06-11 20:18
1.进程的虚拟空间有起始空间,起始空间不一样,不会映射到一样的物理内存的
点赞 回复 分享
发布于 2019-06-11 20:19
页表是多级页表,不会一开始就把你4G空间都映射出来
点赞 回复 分享
发布于 2019-06-11 20:20
页表是动态分配的,物理内存内核应该会有一个位图来管理物理内存。 我的观点是申请内存的步骤是:1.申请虚拟内存2.申请物理内存3.页表中映射
点赞 回复 分享
发布于 2019-06-12 14:17
1. 两个页表中映射到同一个物理地址就行了。 2. 都是动态变化的。
点赞 回复 分享
发布于 2019-06-12 19:02

相关推荐

10-29 11:37
东北大学 C++
内存管理,介绍一下从虚拟地址到物理地址的转化过程32位的一个CPU,第一页为基础页的话,那么他是怎么把这个32位的虚拟地址找到对应的物理地址呢?那么两级页表第一级页表怎么找到第二级页表的地址4K空间其实可以存放很多int类型的数据的,第一个页表项占了一个int类型的一个空间,他怎么找到第二级页表的首地址?4K中存放了1024个地址,怎么找到某一个就是我想要找的那个二级页?内核中有哪些清洗内存的接口?基于内核栈的进程切换要做那些事情?怎么进行栈的切换?全局指针current指向当前进程的PCB,怎么获取你要切换的下一个进程的PCB的current?内核栈是放在哪里的?PCB里的吗?内核栈的栈顶指针存放在哪?PCB切换时的的汇编,切栈之前需要做哪些动作?保存现场的时候都保存了哪些寄存器?是全部寄存器吗?什么叫关键的寄存器?系统调用实现这个,你实现了什么系统调用?系统调用的话,他是怎么找到内核的那个对应的实现的?比如执行int 0x80这个系统调用,这个异常指令的时候,CPU是怎么保存现场?,int 0x80异常入口这个地方又是怎么保存现场的?它和进程切换还不一样,这里面涉及到了一个状态的改变,从用户态到内核态,它就需要把所有寄存器的现场都需要保存,那么CPU在执行这条指令做了什么操作?然后内核又做了什么操作?
联想一面157人在聊 查看17道真题和解析
点赞 评论 收藏
分享
点赞 2 评论
分享
牛客网
牛客企业服务