第1个问题是:在页式虚拟存储器中,一个作业被分解到N个页框架上执行,那么计算机是怎么知道本指令执行完后这个页面执行完了?(因为只有知道页面执行完才能跳到下一个页面)
第2个问题:
作业应该由作业调度程序把作业分页后放置在内存和外存的页框架上,请问之后经过进程调度后该作业执行并且是在某个页面上执行,我想问系统是怎么知道下一条指令是在内存还是外存??(书上说 当程序所要访问的页面未在内存时,回发生中断;那么计算机是怎么知道所要访问的页面未在内存时,从而发生中断)
CPU只知道按顺序来执行指令,即:如果页面A执行完了,他应该执行紧接着A页面下一条指令
------解决方案--------------------------------------------------------
处理器做的是 寻址、取指令、执行,如果一个地址对应的页面不在物理内存中,就会产生page fault(INT 0Dh),在异常处理中可以把页面从交换文件中取出来,或者---如果页面根本不存在的话---就显示一个错误。
------解决方案--------------------------------------------------------
//page fault应该是异常14(INT 0Dh),异常15并没有使用,被intel标记为“保留”。
老大,0xe到底等于14还是15?
------解决方案--------------------------------------------------------
CPU是由很多器件组成的,它们可以并行的进行运算。
指令执行器件只能看见线性地址,它根本就不在乎,它发出的指令会在哪个页上面。
MMU负责把线性地址转换到物理地址,没有集成MMU的CPU就不支持页转换。
指令执行器件和操作系统,平时是看不见页的。
只有当页不在内存时,MMU会自动产生一个硬件中断,通知指令执行器件进行处理。
------解决方案--------------------------------------------------------
楼主很是认真,我实在佩服!这里都是高人,不敢班门弄斧,只谈谈我的拙见!
首先,楼主的思路,我赞同,借用DelphiGuy() 大哥的话:
=================================================
处理器做的是 寻址、取指令、执行
=================================================
CPU执行的指令肯定要通过寻址才能得到的。
其次,现代的CPU(80286后)引入虚拟内存机制,造成其寻址异常复杂,在这过程中需要操作系统的大力干预,一个应用程序(或者说是作业)在具有分页管理的CPU上被加载运行的大致过程是这样的:操作系统将程序加载到虚拟内存(注意是虚拟内存---由内外存联合构成)的N个页上,在这过程中操作系统会填写相应的表格(包括页表,页目录表等等),这些表格都是用于CPU寻址用的,当程序的第一条指令进入CPU执行时,为了要找第二条指令,CPU的EIP会自动指向第二条指令所在的逻辑地址空间的偏移(注意这里是逻辑地址空间),由此通过CS:EIP就可产生第二条指令的线性地址(注意这里是线性地址),然后CPU再将线性地址进行“解读”,去查相关的表(页表,页目录表),最终产生第二条指令的内存物理地址,这时如果该页表或页目录表的描述符中的P位为0时表示该页不在内存,那么就会产生楼上几位大哥说的INT 0DH异常。
所以正如DelphiGuy() 大哥所说:
=============================================
页面对于应用程序是不可见的,根本不用考虑。
=============================================
指令的寻址都是CPU通过操作系统提供的相应信息自动完成的!
另外,楼主提到的“指令执行到该页面的最后”的情况,为什么还要再加上INT 21H去执行操作系统例程呢?程序的下条指令的地址已经在页表中有了,CPU只管接着往下找就行了,当然碰到页面失效是要调用操作系统例程的。
最后,建议楼主再看看《80X86汇编语言程序设计教程》,上面结合具体的CPU讲的比较清楚。