内存到内存

didijiji 2012-11-05 03:44:21


哪个说法是正确的?
...全文
307 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyp41226 2012-11-07
  • 打赏
  • 举报
回复
引用 9 楼 didijiji 的回复:
引用 8 楼 mydo 的回复: 后者不完全正确。 主要是前者,效率为先。毕竟效率与灵活不能兼顾。 你好,还有就是我第二个问题怎么解释啊? 还有就是“由于段可以重叠 所以一个物理地址可用多个逻辑地址来表示”,怎么理解? 多个不同的段可以共用一段存储空间么?那如果那段空间两个段都同时要用的话,那段空间只能存一份数据啊?这样的话不会冲突吗?一份数据是怎么做到在两个不同的段里面表示各自……
同一段数据主要是看CPU中寄存器的设置,即CS IP DS SS SP的指向.可以有不同的含义 可以看一下王爽汇编第69页 比如我们将10000H-1001FH安排为代码段,并在里面存储如下代码: mov ax,1000h mov ss,ax mov sp,0020h ;初始化栈顶 mov ax,cs mov ds,ax ;设置数据段段地址 mov ax,[0] add ax,[2] mov bx,[4] add bx,[6] push ax add ax,[2] mov bx,[4] add bx,[6] push ax push bx pop ax pop bx 设置CS = 1000H,IP=0,这段代码将得到执行.可以看到在这段代码中,又将10000H-1001FH安排为栈段和数据段.10000H-1001FH这段内存,既是代码段,又是栈段和数据段
子善旬 2012-11-06
  • 打赏
  • 举报
回复
段重叠 可以这样形象化的理解 地址A区域:1M~2M 地址B区域:1.5M~3M 段重叠就可以理解为1.5M~2M之间A和B重叠,当然这个A和B的表达在现代x86结构中是在不同的页表项中描述的,这个在OS的开发中通常是会避免这个重叠的问题的。 如果在早期的x86+dos年代,段重叠问题就如7#所说。
大熊猫侯佩 2012-11-06
  • 打赏
  • 举报
回复
引用 9 楼 didijiji 的回复:
还有就是“由于段可以重叠 所以一个物理地址可用多个逻辑地址来表示”,怎么理解? 多个不同的段可以共用一段存储空间么?那如果那段空间两个段都同时要用的话,那段空间只能存一份数据啊?这样的话不会冲突吗?一份数据是怎么做到在两……
段重叠不懂?实模式下段模式如何形成物理地址的? 冲突?思路灵活点,如11楼所说。
zara 2012-11-06
  • 打赏
  • 举报
回复
内存到内存的操作,不仅仅是 DMA 了,普通的指令里就有些特例的,比如 push/pop m16/m32 这类指令,它们操作的是内存单元和堆栈,堆栈也是在内存的,事实上就是内存到内存的动作。
yh_no_code 2012-11-06
  • 打赏
  • 举报
回复
引用 9 楼 didijiji 的回复:
引用 8 楼 mydo 的回复:后者不完全正确。 主要是前者,效率为先。毕竟效率与灵活不能兼顾。 你好,还有就是我第二个问题怎么解释啊? 还有就是“由于段可以重叠 所以一个物理地址可用多个逻辑地址来表示”,怎么理解? 多个不同的段可以共用一段存储空间么?那如果那段空间两个段都同时要用的话,那段空间只能存一份数据啊?这样的话不会冲突吗?一份数据是怎么做到在两……
逻辑地址0000:0123和0012:0003是一个指向同一个物理地址吗?显然是同一个地址,但是他们一个是段地址为0偏移量是123,而另一个是段地址12偏移量是3的逻辑地址,所以,一个物理地址可用多个逻辑地址来表示。
yh_no_code 2012-11-06
  • 打赏
  • 举报
回复
引用 6 楼 enlinux 的回复:
关于lz的第一个问题, 其实不光x86,在arm、mips、一些dsp系统上,都是禁止内存到内存的数据传输的。由于我不是搞cpu开发,只能猜测原因: RAM从src地址的数据直接发送给dest地址,不通过cpu的寄存器的话,这个需要ram能够不依赖于cpu而能够自己传输数据,如果ram有这个功能,还要cpu干吗 :),所以需要cpu发出ram的读写操作时序,来驱动ra……
说法一是比较靠谱的。说法二是错误的,不是还有DMA吗?
didijiji 2012-11-06
  • 打赏
  • 举报
回复
引用 8 楼 mydo 的回复:
后者不完全正确。 主要是前者,效率为先。毕竟效率与灵活不能兼顾。
你好,还有就是我第二个问题怎么解释啊? 还有就是“由于段可以重叠 所以一个物理地址可用多个逻辑地址来表示”,怎么理解? 多个不同的段可以共用一段存储空间么?那如果那段空间两个段都同时要用的话,那段空间只能存一份数据啊?这样的话不会冲突吗?一份数据是怎么做到在两个不同的段里面表示各自意思的?
子善旬 2012-11-06
  • 打赏
  • 举报
回复
关于lz的起点问题: 说法1:正确 1)涉及多次访存,效率降低。 这个看法正确,cpu比ram速度快,需要等待ram操作结束,此时cpu需要在等待和查询,(没有听说过ram会有外部事件主动通知cpu的),在等待中如果有外部中断怎么办? 效率降低是主要指cpu的效率,包括cpu响应外部中断之类的效率,不是指cpu执行指令的效率降低。 2)有关指令格式、候选名单的说法,如果有大牛们存在,能否给我们说道说道? 说法2:正确 1)首先,独立看RAM,必然是需要外部事件来驱动干活,所以外部时钟和时序访问不可或缺,并且都是由外部控制器(例如cpu)控制的 2)其次,cpu端,最关键的资源是系统总线,x86上看起来貌似不涉及cpu操作的情况如下:DMA,rep movs,pop mem等操作,可以这样分解来认识 DMA:基本都集成在cpu上,cpu可以获得系统总线,只要控制住dma的时序分片 rep movs:指令需要cpu寄存器si di参与 pop mem:指令需要cpu寄存器ss sp参与 mov mem_addr1[0x100000],mem_addr2[0x100000] 这个系统总线一直被RAM使用,直到0x100000传递结束,如果ram传输1M的数据需要50us,那cpu在50us内就不用干事了,外部中断、异常也传递不进来,通常这就意味着丢失这些事件。
大熊猫侯佩 2012-11-05
  • 打赏
  • 举报
回复
后者不完全正确。 主要是前者,效率为先。毕竟效率与灵活不能兼顾。
hyp41226 2012-11-05
  • 打赏
  • 举报
回复
引用 1 楼 didijiji 的回复:
还有就是“由于段可以重叠 所以一个物理地址可用多个逻辑地址来表示”,怎么理解? 多个不同的段可以共用一段存储空间么?那如果那段空间两个段都同时要用的话,那段空间只能存一份数据啊?这样的话不会冲突吗?一份数据是怎么做到在两个不同的段里面表示各自意思的?
“由于段可以重叠 所以一个物理地址可用多个逻辑地址来表示” 物理地址= 段地址*16+偏移地址 比如说 10000h = 1000h*16+0000h 10000h = 0fffh*16+0010h 以上两个例子,说明同一个物理地址10000h可以由不同的逻辑地址(段地址*16+偏移地址)来表达,访问的都是同一地址(10000h),而且随着段地址和偏移地址的变化,还有许多种可以表示物理地址10000h的不同组合.
子善旬 2012-11-05
  • 打赏
  • 举报
回复
关于lz的第一个问题, 其实不光x86,在arm、mips、一些dsp系统上,都是禁止内存到内存的数据传输的。由于我不是搞cpu开发,只能猜测原因: RAM从src地址的数据直接发送给dest地址,不通过cpu的寄存器的话,这个需要ram能够不依赖于cpu而能够自己传输数据,如果ram有这个功能,还要cpu干吗 :),所以需要cpu发出ram的读写操作时序,来驱动ram干活。
子善旬 2012-11-05
  • 打赏
  • 举报
回复
引用 1 楼 didijiji 的回复:
还有就是“由于段可以重叠 所以一个物理地址可用多个逻辑地址来表示”,怎么理解? 多个不同的段可以共用一段存储空间么?那如果那段空间两个段都同时要用的话,那段空间只能存一份数据啊?这样的话不会冲突吗?一份数据是怎么做到在两个不同的段里面表示各自意思的?
4# 已经说得比较明白了,在686,特别是petium体系结构出来后,段地址被用于三级页表的索引,而页表是用于MMU管理的,所以对于“一个物理地址可用多个逻辑地址来表示”,表示一个物理地址在这个pgd的段(例如FS段)的页表入口时地址A,在另外的pgd(例如GS段)中是地址B。所以逻辑地址的段索引不同,段地址也会由于实际映射而不同。
HMGuardian 2012-11-05
  • 打赏
  • 举报
回复
引用 1 楼 didijiji 的回复:
还有就是“由于段可以重叠 所以一个物理地址可用多个逻辑地址来表示”,怎么理解? 多个不同的段可以共用一段存储空间么?那如果那段空间两个段都同时要用的话,那段空间只能存一份数据啊?这样的话不会冲突吗?一份数据是怎么做到在两个不同的段里面表示各自意思的?
首先要明白一点程序是分段的,至于为什么要分段,那是因为早期的程序如实模式下的dos程序,只能访问64K的内存。为了访问更大的程序,系统采用了段地址+偏移地址的形式来增加程序能够访问的地址空间。 所以真实的物理内存都是由段地址+偏移地址来访问的,所以同一个物理内存可以有多个逻辑地址来表示。当然存储的数据只有一份,程序员写程序的时候要明白里面放的是什么,由程序员去解决访问上的冲突问题。
didijiji 2012-11-05
  • 打赏
  • 举报
回复
引用 2 楼 zara 的回复:
哪个说法是正确的?倾向于“说法1”。寻址方式的编码位数决定了寻址模式的个数,不同组合超出了这个范围,只能按照当时设计人员的想法将它们排序,优先选用更常用的模式了。不幸的是,内存到内存的操作落选了,虽然现在看起来还是有不少的需求的;但实际上确实远不如其它的寄存器和寄存器/内存间的几率大。 段重叠的问题,这是 16 位实模式下的吧。由于 EA=SEG*16+OFF,所以一个……
你好,那我说的“一份数据是怎么做到在两个不同的段里面表示各自意思的”这个问题怎么解释啊,谢谢。
zara 2012-11-05
  • 打赏
  • 举报
回复
哪个说法是正确的?倾向于“说法1”。寻址方式的编码位数决定了寻址模式的个数,不同组合超出了这个范围,只能按照当时设计人员的想法将它们排序,优先选用更常用的模式了。不幸的是,内存到内存的操作落选了,虽然现在看起来还是有不少的需求的;但实际上确实远不如其它的寄存器和寄存器/内存间的几率大。 段重叠的问题,这是 16 位实模式下的吧。由于 EA=SEG*16+OFF,所以一个地址 EA 就可能有许多不同的 SEG 和 OFF 的组合;必然 EA=20000=2000:0000=1fff:0010 之类。不同的段可能指向同一内存空间,所以确实会发生冲突,这就是这种内存模式的脆弱甚至是要命之处,所以 dos 是非常容易崩溃的。后来的保护模式就有改进了,内存段有大小和访问控制,轻易不会被冲突,系统也因此强壮了许多。
didijiji 2012-11-05
  • 打赏
  • 举报
回复
还有就是“由于段可以重叠 所以一个物理地址可用多个逻辑地址来表示”,怎么理解? 多个不同的段可以共用一段存储空间么?那如果那段空间两个段都同时要用的话,那段空间只能存一份数据啊?这样的话不会冲突吗?一份数据是怎么做到在两个不同的段里面表示各自意思的?

21,459

社区成员

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

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