美文网首页
【复制GDT】

【复制GDT】

作者: 月下蓑衣江湖夜雨 | 来源:发表于2020-11-22 17:20 被阅读0次

kernel.asm部分

    sgdt    [gdt_ptr]   ; cstart() 中将会用到 gdt_ptr
    call    cstart      ; 在此函数中改变了gdt_ptr,让它指向新的GDT
    lgdt    [gdt_ptr]   ; 使用新的GDT

使用命令将gdt地址复制到新的gdt处。

cstart.c部分

PUBLIC  t_8             gdt_ptr[6];                   // 0~15:Limit  16~47:Base
PUBLIC  DESCRIPTOR      gdt[GDT_SIZE];

char *str0 = "hello os world, last line";
char *str1 = "hello os world, line111\n";
static char buf[1024];                                // 显示用临时缓冲区

/*======================================================================*/
PUBLIC void cstart(){
    //DspStrFixPos((80*20+0)*2, str0);
    sprintf(buf, "hello os printk year is %d, month is %d, day is %d\n", 2020, 11, 8);
    memccpy_gdt();
    DspStrFixPos((80*24+0)*2, buf);
    
    //sprintf(buf, "hello os printk year is %d, month is %d, day is %d\n", 2020, 11, 8);
    //DspStrFixPos(12, buf);
    //sprintf(buf, "hello os sprintf, time is %d:%d\n", 14, 38);
    //DspStrFixPos(13, buf);
}

PUBLIC void memccpy_gdt() {
    // 将 LOADER 中的 GDT 复制到新的 GDT 中
    memcpy( &gdt,                   // New GDT
        (void*)(*((t_32*)(&gdt_ptr[2]))),   // Base  of Old GDT
        *((t_16*)(&gdt_ptr[0])) + 1     // Limit of Old GDT
        );
    // gdt_ptr[6] 共 6 个字节:0~15:Limit  16~47:Base。用作 sgdt 以及 lgdt 的参数。
    t_16* p_gdt_limit = (t_16*)(&gdt_ptr[0]);
    t_32* p_gdt_base  = (t_32*)(&gdt_ptr[2]);
    *p_gdt_limit = GDT_SIZE * sizeof(DESCRIPTOR) - 1;
    *p_gdt_base  = (t_32)&gdt;
}

memcpy

; ------------------------------------------------------------------------
; void* memcpy(void* es:pDest, void* ds:pSrc, int iSize);
; ------------------------------------------------------------------------
memcpy:
    push    ebp
    mov ebp, esp

    push    esi
    push    edi
    push    ecx

    mov edi, [ebp + 8]  ; Destination
    mov esi, [ebp + 12] ; Source
    mov ecx, [ebp + 16] ; Counter
.1:
    cmp ecx, 0      ; 判断计数器
    jz  .2      ; 计数器为零时跳出

    mov al, [ds:esi]        ; ┓
    inc esi         ; ┃
                    ; ┣ 逐字节移动
    mov byte [es:edi], al   ; ┃
    inc edi         ; ┛

    dec ecx     ; 计数器减一
    jmp .1      ; 循环
.2:
    mov eax, [ebp + 8]  ; 返回值

    pop ecx
    pop edi
    pop esi
    mov esp, ebp
    pop ebp

    ret         ; 函数结束,返回
; memcpy 结束-------------------------------------------------------------

相关文章

  • 【复制GDT】

    kernel.asm部分 使用命令将gdt地址复制到新的gdt处。 cstart.c部分 memcpy

  • GDT和LDT

    GDT 全局描述符表GDT(Global Descriptor Table)在整个系统中,全局描述符表GDT只有一...

  • 时间管理之《搞定》01

    1. 什么是GDT? GDT: get thing done 把事情做完 GDT时间管理系统 头脑是无法边存储(...

  • GDT

    “君子性非异也,善假于物也”,每日自省自己能否有办法让自己的效率提高些,再提高些,要善于利用工具,让自己能用更短时...

  • GDT

    As shown in Figure 3-1, segmentation provides a mechanism...

  • 从头写一个操作系统 07

    lesson 9 你需要自己去查: GDT 本节目标: 编写 GDT 还记得lesson 6的segmentati...

  • GDT/LDT/段是什么

    The Global Descriptor Table (GDT) is a data structure use...

  • ASO之GooglePlay谷歌市场下架与审核被拒问题

    SDK问题 一.热更新问题 1.腾讯GDT SDK 问题:您的应用程序正在使用腾讯GDT SDK包含代码以下载可执...

  • GDT与LDT

    GDT与LDT 引言全局描述符表与局部描述符表过去虽然看过,但是印象不深很深,后来看了《自己动手实现一个操作系统》...

  • GDT和LDT表

    https://zhidao.baidu.com/question/55293031.html总结: 1. GDT...

网友评论

      本文标题:【复制GDT】

      本文链接:https://www.haomeiwen.com/subject/moiuiktx.html