在计算的发展的初期,intel 8086是16位的cpu,它只能运行在实模式下。在该模式下其寄存器是16位的,但是为了可以寻址20位的地址空间,所以采用了内存的分段模式。
物理内存地址=段基址×16+偏移 这样可以寻址20位的地址空间。
关于现代计算机内存的分段机制,也是为了向下兼容的需要。单纯的向下兼容或许还不够有说服力,因为在现代cpu中产生的就是32的地址,而由分段机制产生的线性地址也是32位的。32位的地址完全可以访问4G内存的任何一个地方,看上去分段机制好像完全没有了作用,其实不然。在多线程,多任务的 *** 作系统中,一个地址能否被一个进程写入,能被什么优先级的进程访问,是否允许执行这些问题有出来了。而解决这些问题需要在地址上添加一些属性,也就是说其地址应该还是高于32位的。这时候有体现了分段机制的作用。
关于分页机制。由分页机制产生线性地址,加入没有分页,这个线性地址就是物理地址。而分页机制就是把线性地址装换成物理地址。关于其原因,一方面在进程产生子进程的时候,会复制内存页,而父子进程无论是代码数据还是产生的地址都是一样的,这样为创建进程提供了便利,可以不必考虑进程在内存中分布的情况而产生地址,至于父子进程的真实物理地址在哪里,那是mmu(内存控制单元)的问题。另一方面,由于进程不知道真实的物理地址子啊什么地方,也为 *** 作系统提高了安全性。
C语言程序编写、调试、优化都在Linux,那么当Linux的 *** 作系统中被C语言调用的某一个控件的代码文件没了,Linux系统是能运行的但是C程序生存的"*.*"文件就不能执行了,得必须返回到C语言或反汇编中检查调用调试系统文件情况。比如在C++里有句dos语句"system("md
book")",在当前目录建立"book"文件夹,那么就是C++调用 *** 作系统的dos模块命令集中"md"建文件夹的命令,那么加入某个Linux
*** 作系统内有dos模块,那这句可以运行,那么,问题来了,有些Windows *** 作系统已经把dos模块优化了,当然"system("md
book")"这句在系统里找dos的"md"命令就是空命令了。该例子与内存机制无关,当然也有有关的。
总之,C语言编写、调试、优化需要在多种系统内验证,否则还是存在一些移植性的问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)