mem.c

来自「从dos下装载内核」· C语言 代码 · 共 70 行

C
70
字号

     #include "Mem.h"
     #include "print.h"
struct GDT GdtForBios;
struct GDTPTR GdtPtrForBios;
void MoveToExtendMem(void * SrcBuf,unsigned long PhyMem,int WordSize){
        unsigned long base=0;
        GdtPtrForBios.limit=5*8;
        GdtPtrForBios.base=0;
        GdtPtrForBios.base=(unsigned long)(&GdtForBios)&0xffff;
        /*以下代码取得数据段物理地址*/
        _asm{
                push ax
                mov ax,ds
                mov word ptr base,ax
                pop ax
        }
        base=(base<<4);
        GdtPtrForBios.base=base+GdtPtrForBios.base;/*现在才是GDT表的物理地址*/
        /*下面建立数据段描述符*/
        GdtForBios.SrcDsc.BaseLow=(unsigned int)(base&0xffff);/*只取低16位*/
        GdtForBios.SrcDsc.BaseMiddle=(unsigned char)((base>>16)&0xff);/*只取中间8位*/
        GdtForBios.SrcDsc.Size=GdtForBios.DstDsc.Size=0xffff;/*最大界限*/
        GdtForBios.SrcDsc.NoUse=GdtForBios.DstDsc.NoUse=0;/*最高16位清零*/
        GdtForBios.SrcDsc.Attribute=GdtForBios.DstDsc.Attribute=0x92;
        GdtForBios.DstDsc.BaseLow=(unsigned int)(PhyMem&0xffff);
        GdtForBios.DstDsc.BaseMiddle=(unsigned char)((PhyMem>>16)&0xff);
        /*以下代码取得CS*/
        base=0;
        _asm{
                push ax
                mov ax,cs
                mov word ptr base,ax
                pop ax
        }
        base=base<<4;
        GdtForBios.BiosCS.Size=0xffff;
        GdtForBios.BiosCS.BaseLow=(unsigned int)(base&0xffff);
        GdtForBios.BiosCS.BaseMiddle=(unsigned char)((base>>16)&0xff);
        GdtForBios.BiosCS.Attribute=0x98;/*代码,0级,只执行*/
        GdtForBios.BiosCS.NoUse=0;
        /*以下取得SS*/
        base=0;
        _asm{
                push ax
                mov ax,ss
                mov word ptr base,ax
                pop ax
        }
        base=base<<4;
        GdtForBios.BiosSS.Size=0xffff;
        GdtForBios.BiosSS.BaseLow=(unsigned int)(base&0xffff);
        GdtForBios.BiosSS.BaseMiddle=(unsigned char)((base>>16)&0xff);
        GdtForBios.BiosSS.Attribute=0x92;
        GdtForBios.BiosSS.NoUse=0;
        ToProtectAndCopy(SrcBuf,WordSize);
}
unsigned int GetExMemSize(void){
/*取得扩展内存大小,以K为单位*/
        unsigned int retvalue;
        _asm{
                pusha
                mov ah,88h
                int 15h
                mov retvalue,ax
                popa
        }
        return retvalue;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?