美文网首页
[058][x86汇编语言]第16章 本章代码 平坦模式下的用户

[058][x86汇编语言]第16章 本章代码 平坦模式下的用户

作者: AkuRinbu | 来源:发表于2018-08-09 07:36 被阅读28次

    学习笔记

    《x86汇编语言:从实模式到保护模式》
    https://www.jianshu.com/p/d481cb547e9f

    代码运行

    运行截图 第16章 本章程序运行截图.PNG

    代码使用

    • nasmide.exe 编译源码文件 :加载程序c13_mbr.asm,内核程序c16_core.asm,用户程序c16.asm
    • fixvhdwr.exe 写扇区二进制.bin文件:c13_mbr.bin(逻辑扇区号LBA:0)c16_core.bin(LBA:1)c16.bin(LBA:50)
    • 运行VM virtual box.

    平坦模式下的用户任务

    代码功能

    • 显示当前任务4GB虚拟地址空间内的前88个双字,每次先显示两个空格,然后再显示双字的值,这样形成的效果是每行8个双字共11行

    完整源码 — 源码文件 c16.asm

             ;代码清单16-2
             ;文件名:c16.asm
             ;文件说明:用户程序 
             ;创建日期:2012-05-25 13:53   
    
             program_length   dd program_end          ;程序总长度#0x00
             entry_point      dd start                ;程序入口点#0x04
             salt_position    dd salt_begin           ;SALT表起始偏移量#0x08 
             salt_items       dd (salt_end-salt_begin)/256 ;SALT条目数#0x0C
    
    ;-------------------------------------------------------------------------------
    
             ;符号地址检索表
             salt_begin:                                     
    
             PrintString      db  '@PrintString'
                         times 256-($-PrintString) db 0
                         
             TerminateProgram db  '@TerminateProgram'
                         times 256-($-TerminateProgram) db 0
    ;-------------------------------------------------------------------------------
    
             reserved  times 256*500 db 0            ;保留一个空白区,以演示分页
    
    ;-------------------------------------------------------------------------------
             ReadDiskData     db  '@ReadDiskData'
                         times 256-($-ReadDiskData) db 0
             
             PrintDwordAsHex  db  '@PrintDwordAsHexString'
                         times 256-($-PrintDwordAsHex) db 0
             
             salt_end:
    
             message_0        db  0x0d,0x0a,
                              db  '  ............User task is running with '
                              db  'paging enabled!............',0x0d,0x0a,0
    
             space            db  0x20,0x20,0
             
    ;-------------------------------------------------------------------------------
          [bits 32]
    ;-------------------------------------------------------------------------------
    
    start:
              
             mov ebx,message_0
             call far [PrintString]
             
             xor esi,esi
             mov ecx,88
      .b1:
             mov ebx,space
             call far [PrintString] 
             
             mov edx,[esi*4]
             call far [PrintDwordAsHex]
             
             inc esi
             loop .b1 
            
             call far [TerminateProgram]              ;退出,并将控制权返回到核心 
        
    ;-------------------------------------------------------------------------------
    program_end:
    

    平坦模式

    1、用户程序在平坦模式之下,所有的段共享4GB虚拟内存空间

    • 下面的代码来自内核程序,源码文件c16_core.asm
    过程 [make_seg_descriptor] 位于内核程序 
    输入参数
        EAX=线性基地址
        EBX=段界限
        ECX=属性
    返回 EDX:EAX=描述符
    
    ;建立程序代码段描述符
             mov eax,0x00000000
             mov ebx,0x000fffff
             mov ecx,0x00c0f800
             call sys_routine_seg_sel:make_seg_descriptor
             mov ebx,esi
             call fill_descriptor_in_ldt
             or cx,0000_0000_0000_0011B
             
             
    ;建立程序数据段描述符
             mov eax,0x00000000
             mov ebx,0x000fffff
             mov ecx,0x00c0f200
             call sys_routine_seg_sel:make_seg_descriptor
             mov ebx,esi
             call fill_descriptor_in_ldt
             or cx,0000_0000_0000_0011B
    
    • 可以看见,代码段和数据段的线性基地址都是0x00000000,两个段的大小都是4GB,不光这两个段,栈段也要与这些段一起共享这4GB的虚拟内存空间;

    2、何为平坦模式?

    • 在平坦模式下,名义上不分段,但实际上是只分一个大段,在这种情况下,不管程序实际加载到哪里,代码段、数据段和栈段,其描述符基地址都固定为0x00000000
    • 将段的大小定义成4GB,是希望可以发出任何虚拟地址,而不会被段部件的检查机制阻挠。

    相关文章

      网友评论

          本文标题:[058][x86汇编语言]第16章 本章代码 平坦模式下的用户

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