⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mem.c

📁 从dos下装载内核
💻 C
字号:

     #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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -