问一个关于内存分页的问题:程序某指令被映射到两个页分开,到时执行岂不是造成指令意思变了?

pzr8888 2010-08-16 08:05:13
当一个程序被分成一个个4KB的内存页,映射到不同的物理内存页。某指令刚好被分成上部分在上个页尾,下部分在下个页首这种情况。那么在执行到上个页尾的那条指令时,岂不是指令被解释错误?
...全文
169 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
pzr8888 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cnzdgs 的回复:]
任何一条指令代码的前半部分都不可能是一条完整指令,你可以查找一下指令编码方面的资料。
[/Quote]

嗯,我昨晚在cmd里试验了,D8这个内存单元表示操作码,是它决定了要在后面的单元中取多少字节。
但是我还是有一点不明白:一个分页执行完后自然跳到另一个分页执行代码。CPU是怎么判断上个分页已经执行到页未而跳到下一分页执行的呢?毕竟这两个分页映射的物理地址可能不是连续的区域,23……谢谢~
pzr8888 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 1cctv 的回复:]
[/Quote]
终于想通了。谢谢你啊1cctv!
1cctv 2010-08-19
  • 打赏
  • 举报
回复
CPU看到的只是线性地址。
变换是由寻址机构完成的。
1cctv 2010-08-19
  • 打赏
  • 举报
回复
如果一个点与某框边界在4个像素内,那么就说此点在某框内。
取一个符合条件的点,看其是否在某框内,如果是,扩展框边界到这个点。
如果不是,添加一个框。

以线性地地0x12345678为例,
其二进制为0001001000 1101000101 011001111000,如上面所示,它实际上分了三段,
第一段10位是页目录,表示页表项在页目录中的偏移。其基址在cr3中。
第二段10位是页表,表示4K的物理页在页表的中的偏移。
第三段12位是页内偏移。

寻址时,由10位的页目录(第一段)和cr3定位到一个页表,在此页表中由10位页
表偏移(第二段)定位到一个物理页,在这个物理页中由12位页内偏移(第三段)定
位到一字节。

cr3中存储的是页目录的基址(是物理地址)。
页目录中存储的是页表的基址(是物理地址)。
页表中存储的是物理页的基址(是物理地址)。

任务可以有自己的页目录,页表,当任务切换时,把页目录的物理地址装入cr3,
这样每个进程里的线性地址0x12345678实际映射的物理页都可以是不同的,也可
以是相同的。

以windows nt为例,甚至所有进程的kernel32.dll其实在物理内存中就只有一份。
可一但有进程修改了自己地址空间里的kernel32,那么被修改的这个页面就会被
重新映射一份,虽然线性地址还是0x12345678没变,但页目录和页表中对应的项
变化了,所以映射物理页已经不是原来的了。这就是所说的写时拷贝。


以上是凭印象写的,只是个示意。
hyang16 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pzr8888 的回复:]
引用 1 楼 cnzdgs 的回复:
一条指令不需要一次取出
比如 mov ax,0123H 这条指令,机器码为3字节:D8 23 01
在启用内存分页机制情况下,如果D8 23 这两个内存单元刚好映射到某内存页的最后两个内存单元,然后01这个单元自然被分到下一个内存页的第一个内存单元。这样当指令执行到D8这里,岂不是只将D8 23这两个单元读到指令缓冲器里执行?毕竟D8 23 也能解释成汇……
[/Quote]


你真的理解 cpu 执行指令的全部过程吗?
pzr8888 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hyang16 的回复:]
引用 4 楼 pzr8888 的回复:
引用 1 楼 cnzdgs 的回复:
一条指令不需要一次取出
比如 mov ax,0123H 这条指令,机器码为3字节:D8 23 01
在启用内存分页机制情况下,如果D8 23 这两个内存单元刚好映射到某内存页的最后两个内存单元,然后01这个单元自然被分到下一个内存页的第一个内存单元。这样当指令执行到D8这里,岂不是只将D8 23这两个单元读到指令……
[/Quote]

计算机学科各方面知识相互交织,庞大而驳杂。在学着某一专业时随便一个问题都有可能拉扯出另一个计算机方面的知识。不可能全部得深究吧。
我在王爽的汇编语言里大概了解cpu 执行指令的过程。对于我现在这个问题,必定又牵引到讲CPU专门知识,比如微指令,解释器等里面的东西。每个问题都深究下去 ,学习主线猴年马月才能学完?
cnzdgs 2010-08-18
  • 打赏
  • 举报
回复
任何一条指令代码的前半部分都不可能是一条完整指令,你可以查找一下指令编码方面的资料。
ddc 2010-08-18
  • 打赏
  • 举报
回复
D8 23 01如果是机器指令,D8 23就不是。
pzr8888 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cnzdgs 的回复:]
一条指令不需要一次取出[/Quote]
比如 mov ax,0123H 这条指令,机器码为3字节:D8 23 01
在启用内存分页机制情况下,如果D8 23 这两个内存单元刚好映射到某内存页的最后两个内存单元,然后01这个单元自然被分到下一个内存页的第一个内存单元。这样当指令执行到D8这里,岂不是只将D8 23这两个单元读到指令缓冲器里执行?毕竟D8 23 也能解释成汇编指令啊!
hyang16 2010-08-17
  • 打赏
  • 举报
回复
cpu里有 預取指令队列寄存器,执行之前,已经取出来在 cpu里呆着了
goodider 2010-08-17
  • 打赏
  • 举报
回复
这个问题需要看书了。那里讲的很清除。
cnzdgs 2010-08-16
  • 打赏
  • 举报
回复
CPU是根据页映射来取指令的,一条指令不需要一次取出,所以也不需要物理地址连续。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧