打印

dos 下C对内存怎么操作。

[复制链接]
2218|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jakey0225|  楼主 | 2007-12-10 16:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
xwj| | 2007-12-10 16:30 | 只看该作者

这个说来话长了.

这个说来话长了. 
8086体系的CPU一开始是20根地址线, 寻址寄存器是16位, 16位的寄存器可以访问64K的地址空间, 如果程序要想访问大于64K的内存, 就要把内存分段, 每段64K, 用段地址+偏移量的方法来访问. 

后来386CPU出来之后, 采用了32条地址线, 地址寄存器也扩为32位, 这样就可以不用分段了, 直接用一个地址寄存器来线性访问4G的内存了. 这就叫平面模式. 

为了和16位的软件保持兼容, 386的线性内存访问功能只在一种叫"保护模式"的状态上使用, 在这种状态下, 一切程序都可以用线性地址(不分段)访问自己所拥有的4G的内存空间, 但是不能访问其他程序的空间. 如果有程序要访问不该访问的内存(一般只有病毒才会这么作), 就会出系统错误, CPU就用中断通知OS, 这样的进程会被OS发现, 并杀死, 不会影响其他程序. 在windows里常见的系统错误"某某内存不能读写"就是这种问题, 这都不是windows的问题, 而是一些破程序的问题. 

在这种情况下, 实际是CPU和OS一起保护了程序的内存, 因此叫做保护模式. 

实际上当时内存是不可能有4个G的, 而且是每个程序都要有4G的空间. 为了为每个程序都提供4G内存, 386及以后的CPU采用"页"的方式来管理内存, 把内存分为一个个的页, 页的物理地址与每个程序虚拟的4G线性地址用一个表格保存. 

程序用线性地址访问内存. 如果这个内存还没有用过, 就找一个内存页来假装涉及的线性内存段. 如果这个内存长期不用, 操作系统就把内存页存到硬盘上去, 就叫虚存交换文件. 如果这个内存所在的页已经分配过, 但是没有在实存里, 那么CPU就出现一个缺页中断, 由操作系统把硬盘交换文件里的页内数据读出来, 在实存中找一块写进去, 修改页地址和线性地址的对应表格, 然后请程序继续运行. 

386可以假装自己是一个16位的CPU, 用16位的分段方式工作, 和保护模式相对的, 这种模式就叫做实模式. 

使用特权

评论回复
板凳
xwj| | 2007-12-10 16:45 | 只看该作者

再说说保护模式

保护模式概述
顾名思义,就是对程序的运行加以保护。我们知道在实模式下通常只能寻址1M的内存空间,且只能是单任务,就是说同一时间不能有两个任务被激活。从8086/8088的20根地址线,80286的24根地址线到80386的32根地址线,直至今天Puntium4已经发展到了36根地址线,它们分别可以寻址1M、16M、4G、64G的内存空间,然而在实模式下,通常的寻址范围还是1M。也就是对于在纯DOS下运行的Puntium4也只能是一个快速的8086。

前面已经说了,保护模式就是对程序的运行加以保护,所以说保护模式较实模式的增强的最主要体现还不是寻址能力而是对多任务的支持,所提到的保护就是对不同任务间和同一任务内的程序加以保护,使它们的运行不受对方“有意”或“无意”影响,但同时也要对两个任务都要用到的部分代码实现共享。另外一个重要的增强就是对虚拟存储器的支持,从一定意义上说可以使程序设计人员不必考虑物理内存的大小。

因此,只有拥有MMU(存储器管理单元)的CPU,才可以跑出真正安全的多用户操作系统,因为在MMU管理下对于程序来说没有授权的内存访问是非法的,你根本看不到别人的内存、数据。

 INTEL出品的80386CPU或者更新的CPU中都集成有MMU. 可以提供32BIT共4G的地址空间.

ARM和X86 MMU使用上有很多的差异,就不细说了。

LZ感兴趣可以去搜索相关关键字,网上很多很多资料的

使用特权

评论回复
地板
李冬发| | 2007-12-25 13:47 | 只看该作者

一般是通过保护模式存取1M以上内存

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

45

帖子

0

粉丝