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
  • 相关阅读:
    再次或多次格式化导致namenode的ClusterID和datanode的ClusterID之间不一致的问题解决办法
    Linux安装aria2
    POJ 3335 Rotating Scoreboard 半平面交
    hdu 1540 Tunnel Warfare 线段树 区间合并
    hdu 3397 Sequence operation 线段树 区间更新 区间合并
    hud 3308 LCIS 线段树 区间合并
    POJ 3667 Hotel 线段树 区间合并
    POJ 2528 Mayor's posters 贴海报 线段树 区间更新
    POJ 2299 Ultra-QuickSort 求逆序数 线段树或树状数组 离散化
    POJ 3468 A Simple Problem with Integers 线段树成段更新
  • 原文地址:https://www.cnblogs.com/cnlmjer/p/4099895.html
Copyright © 2011-2022 走看看