内存到内存

didijiji 2012-11-05 03:44:21


哪个说法是正确的?
...全文
323 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
  • 打赏
  • 举报
回复
还有就是“由于段可以重叠 所以一个物理地址可用多个逻辑地址来表示”,怎么理解? 多个不同的段可以共用一段存储空间么?那如果那段空间两个段都同时要用的话,那段空间只能存一份数据啊?这样的话不会冲突吗?一份数据是怎么做到在两个不同的段里面表示各自意思的?
经常使用电脑可能也遇到过了! 突然‘咚’的一声 提示 内存不能为read 这个问题我以前也遇到过不知道怎么解决 现在终于有办法了!呵呵! 我们就看看是什么原因引起的吧,另外附送一个小工具修复见下面附件 总结下大概以下9个原因 1、驱动不稳定,与系统不兼容,这最容易出现内存不能为 Read 或者文件保护(主要原因) 2、系统安装了一个或者多个流氓软件,这出现 IE 或者系统崩溃的机会也比较大,也有可能出现文件保护 3、系统加载的程序或者系统正在运行的程序之前有冲突,尤其是部分杀毒软件监控程序 4、系统本身存在漏洞,导致容易受到网络攻击。 5、病毒问题也是主要导致内存不能为 Read、文件保护、Explorer.exe 错误…… 6、如果在玩游戏时候出现内存不能为 Read,则很大可能是显卡驱动不适合(这里的不适合有不适合该游戏、不适合电脑的显卡)也有可能是 系统版本不够新或者不符合该游戏、显卡驱动 7、部分软件本身自身不足的问题 8、电脑硬件过热,也是导致内存不能为 Read 的原因之一。 9、电脑内存与主板兼容性不好也是导致内存不能为 Read 的致命原因! 以上大概就是目前可以引起系统提示 内存不能为read的原因了 另外软件是针对只是针对部分原因引起的内存不为read所做修复,不是100%有效,大家可以试试看 说下原理: 就是批处理使用 regsvr32命令 将动态链接库文件重新注册 (system32下的所有 .dll 和 .ocx 文件;) 注意:由于修复工具会重新注册 system32下的所有 .dll 和 .ocx 文件 此操作对杀毒软件来说属于敏感操作,所以建议使用修复工具的时候,请禁用杀毒软件,以免部分杀毒误报!jie

21,499

社区成员

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

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