zoukankan      html  css  js  c++  java
  • 内存控制块MCB说明

    内存控制块MCB说明

        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
  • 相关阅读:
    bzoj3505 数三角形 组合计数
    cogs2057 殉国 扩展欧几里得
    cogs333 荒岛野人 扩展欧几里得
    bzoj1123 BLO tarjan求点双连通分量
    poj3352 road construction tarjan求双连通分量
    cogs1804 联合权值 dp
    cogs2478 简单的最近公共祖先 树形dp
    cogs1493 递推关系 矩阵
    cogs2557 天天爱跑步 LCA
    hdu4738 Caocao's Bridge Tarjan求割边
  • 原文地址:https://www.cnblogs.com/cnlmjer/p/4099895.html
Copyright © 2011-2022 走看看