国外网站空间租用费用,网站播放mp3代码,近期新闻,网站推广的常用途径有哪些一.硬编码/静态重定向 我们先来观察下没有地址分段时代CPU是怎么和内存们打交道#xff0c;在8086CPU以前的老大哥们#xff0c;访问内存时通常就是实打实的“指哪打哪”#xff0c;程序指定要放在哪个地址#xff0c;那就老老实实地放在哪个地址#xff0c;比如程序A要放…一.硬编码/静态重定向 我们先来观察下没有地址分段时代CPU是怎么和内存们打交道在8086CPU以前的老大哥们访问内存时通常就是实打实的“指哪打哪”程序指定要放在哪个地址那就老老实实地放在哪个地址比如程序A要放在以0XC100为起始的地址那么如果内存中没有其他程序的情况下程序A 就毫不客气地放进去 这种指哪打哪的方式有个专业的名词来形容它硬编码也可以叫做静态重定向。程序首次装入内存后就不能再次在内存中移动了在这个前提下再牛逼的操作系统也无法高效的完成内存的回收和分配这种硬编码会导致的两个问题
会导致内存碎片化会导致程序长时间处于等待状态 内存碎片化很好理解因为程序是固定地址的如果下一个程序再来的时候一看哎呦不够地方放了 又或者说程序B也想从0XC100开始但是恰好程序A也在 这时候程序B只能站在一边扣着手指头等一直等待程序A运行完之后主动让出空间来。眼看着程序的队伍排得越来越长CPU开发工程师熬白了头发终于发明了“段基址段内偏移地址”的内存访问形式并且首次应用于8086CPU中从此8086CPU就称为了CPU界的里程碑后续的286、386、586等x86CPU中“x”其实指代的是Inter的86系列CPU。
二.动态重定向 为了支持分段机制CPU新增了诸如cs、ds以及es等段寄存器。CS段基址寄存器与IP逻辑地址寄存器组合在一起实现程序的动态重定向。动态重定向的程序在逻辑地址上还是按照静态重定向的方式不变区别在于动态重定向的程序在编译链接时会在逻辑地址上加上段基址用两者相加的结果作为实际的寻址地址进行内存寻址。该方法可以使得程序在内存中任意移动比如前面出现的例子 就可以通过动态重定向将程序A进行程序重定向 进行内存空间管理避免内存碎片化程序B就有足够的空间放入内存 采用“段基址逻辑地址”的方法实现了即使程序的逻辑地址如程序A和程序B都是以0x0000开头相同程序也能被放置在内存的不同位置提高了CPU的运行效率。 再到后来研发人员在分段机制的基础上将程序分解成立代码段数据段栈段堆段巴拉巴拉将连续的逻辑地址空间分解成非连续的物理空间也算是内存分配的一种优化 三.8086CPU实模式下的段基址为啥左移四位 在实模式下进行CS:IP的地址偏移运算时通常需要将CS的地址左移四位再和IP里面的地址进行相加这是为什么呢 原因在于实模式下8086的CPU地址总线一共有20位A0~A1920位1048576个字节1MB最大地址转换成16进制表示为0XFFFFF也就是说20位的地址空间总共有1MB大小的地址空间而寄存器一般为16位也就是最大只能找到64KB的地址宽度最大地址转换成16进制表示位0XFFFF这也就说明了使用单个寄存器无法找到全部的地址总线。一个寄存器不行那就用两个行不行对不起还是不行用两个寄存器我们给他们起个名字叫段基址寄存器和逻辑地址寄存器就算是两个寄存器都取最大值0XFFFF两者相加的结果是0X1FFFE 这个结果也只能到达17位还不够16位两个n位的数无论多大其相加的结果也不会超过n1位原因很简单因为即使n位的数能表示的最大数相加也只是相当于乘以2数值上与往左移动了1位而已虽说直接使用立即数手动指定20位的地址也可以但那是利用了程序员自身的软件办法来补了硬件的这个坑但是作为一个严谨的CPU硬件如果寄存器确实不支持1MB的寻址空间那就写不支持就好但是既然写了寄存器寻址支持1MB的寻址宽度那么就得自圆其说。 那么最后CPU的研发人员采用了什么方法呢方法就是将段基址左移四位便可以解决问题比如段基址0XFFFF左移四位就相当于乘以10H得出0XFFFF0 再与偏移地址0XFFFF相加结果是0X10FFEF 这个结果虽然可以访问20位的地址空间但是也有点溢出了原因是段基址如果取最大值0XFFFF的话往左偏移4位结果为0XFFFF0这个结果由地址加法器算出来后直接往控制电路方向送如果对这部分感兴趣的可以参考以前写过的一篇文章【汇编语言】CS:IP寄存器那么偏移地址最大也只能等于0XF而现在偏移地址是0XFFFF整整多出来0XFFF0这么多的空间也就是64K-16B而这部分的内存有个专业的名称叫做高端内存区。 那么这个多出来的部分要怎么处理呢事实上不用任何处理。你可以思考下地址空间一共也就20位而0X10FFEF一共有21位比地址总线还多出来1位那多出来的哪位能干什么用呢什么用都没有直接扔掉也就相当于把地址对1MB取模了。 最后举个例子0XFFFFF2理论上结果为0X10001因为地址总线只有20位所以实际上的结果为0x00001这种超出最大范围后又从0重新计数的技术叫做回卷。