登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

DOS编程技术

讨论在纯DOS下的编程技术

 
 
 

日志

 
 
关于我

1984年大学毕业,1985年底有机会开始接触PC机,1986年开始在PC机上做开发工作,曾接触过MS-DOS、CP/M、UNIX、VMS、LINUX、iRMX等众多的操作系统并在上面从事技术开发,擅长做底层与硬件相关的软件开发,目前主要在DOS和LINUX平台下工作,主要从事软件,在硬件开发上也有一定造诣,亦有在8051系列、6502系列(凌阳)、z80系列、ARM、X86等各类平台下开发软硬件的经历。更详细情况可以参考http://resume.whowin.net

内存控制块MCB说明  

2008-08-28 09:01:34|  分类: dos资料 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
    DOS使用内存控制块来控制和管理内存,这是一个占16字节的结构,位于每个分配得到的内存块的起始地址再向前16个字节这样说可能不是太清楚,过一会再继续说。在DOS下,有两种情况会分配内存,一是使用int 21h的4bh功能加载一个程序,此时DOS会为加载的程序分配两块内存,一块是环境块,用于存放环境串信息,另一块是程序块,用于存放PSP和程序本身;第二种情况是使用int 21h的48h或3ah功能申请或修改内存块;不论用什么方法得到内存块,都会在你得到的内存前面建立一个内存控制块MCB。
    我们用int 21h的48h功能调用来说明内存控制块MCB在什么地方,该调用的使用方法如下:
    入口:AH=48H
          BX=要分配的段落数(一个段落为16字节)
          int 21h
    出口:AX=被分配内存的段地址
    这个调用完成并成功的话,你得到的内存起始点地址为:AX:0000
    那么,MCB在什么位置呐?它在:(AX-1):0000
    这个位置正好在你使用的内存块前16字节。
    内存控制块的结构如下:
    偏移    大小      描述
    ----------------------------------------------------
    00h     byte      标记,最后一块为5ah,非最后块为4dh
    01h     word      分配块段址
    03h     word      分配块段落数
    05h     11bytes   保留
    要说明的是偏移为01h的分配块段址这个字段,假如我们有个程序A,它的PSP段址为PSP-A,在程序A中申请了一块内存为B,那么B的内存控制块的偏移为1的位置存放的是PSP-A,这个概念很重要,DOS使用PSP的段址作为一个进程的ID,所以实际上这个字段表示的是这块内存的归属,上面这个例子说明内存块B是归属于PSP-A进程的,也就是程序A的,当程序A正常退出时,DOS会沿着MCB链把归属于程序A的所有内存块都释放掉,从这点上也可以看出,如果我们不想让我们程序退出时其中的某块内存也被释放掉,改变一下分配块段址这个字段就可以了。
    内存控制块是以链的形式连接在一起的,各控制块指针之间的关系可以用下面的简单公示表达:
    (控制块指针)i+1 = (控制块指针)i + (分配段落数)i + 1
   
   
  评论这张
 
阅读(2467)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018