美文网首页
[OS64位][014]源码阅读:代码清单3-18 ~ 3-22

[OS64位][014]源码阅读:代码清单3-18 ~ 3-22

作者: AkuRinbu | 来源:发表于2019-05-16 20:10 被阅读0次

    学习笔记

    使用教材(配书源码以及使用方法)
    《一个64位操作系统的设计与实现》
    http://www.ituring.com.cn/book/2450
    https://www.jianshu.com/p/28f9713a9171

    源码文件

    • 第3章\程序\程序3-4\ loader.asm

    代码清单3-18 源码 line : 110 ~ 178 :查找内核文件kernel.bin

    • 源码与 程序3-3 loader.asm(Lable_Search_In_Root_Dir_Begin) 基本一致,只需修改要显示的字符串相关

      KernelFileName: db "KERNEL BIN",0
    • 3-3 loader.asm Lable_Search_In_Root_Dir_Begin

    [OS64位][006]源码阅读:代码清单3-7 目标文件搜索 Lable_Search_In_Root_Dir_Begin
    https://www.jianshu.com/p/2c03cdd67d4e

    代码清单3-19 源码 line : 179 ~ 256 :内核读入内存

    3-19 代码流程

    • kernel.bin文件一个扇区的数据读取至物理内存 0x7E00 ~ 0x7FFF
    • 接着马上将这512 字节数据逐字节复制到0x 1 0 0 0 0 0
    • 反复地利用 0x7E00 ~ 0x7FFF这段0x200(512)字节作为临时转存空间,从而读完内核文件kernel.bin的全部数据 ;

    3-19 源码解析:移动数据到0x100000

    3-19 源码解析:移动数据到0x100000

    代码清单 3-19 的代码结构与 代码清单3-10 是基本一致的 :
    1、在软盘根目录区被读入到缓冲区0x8000后,找到目标文件kernel.bin的目录项,可读出目标文件的初始簇号;
    2、根据初始簇号可以计算出目标文件位于软盘的起始扇区号,读一个扇区数据到内存缓冲区0x7E00
    3、之后,马上将0x7E00开始的512字节数据移动到内存地址0x100000处(上图黑色代码部分);
    4、接着,计算目标文件的下一个簇号,(期间需要将FAT表读入0x8000);
    5、循环反复,直到整个kernel.bin文件的全部扇区读取完毕、移动完毕。

    3-19 源码解析:移动数据到0x100000 内存示意图

    代码清单3-20 源码 line: 258 ~ 265 :显示字符 G

    • 当内核程序被加载到1 MB以上物理内存地址后,在屏幕正中间显示一个字符'G'
    Label_File_Loaded:
    
        mov    ax, 0B800h
        mov    gs, ax
        mov    ah, 0Fh   ; 0000: 黑底    1111: 白字
        mov    al, 'G'
        mov    [gs:((80 * 0 + 39) * 2)], ax  ; 屏幕第 0 行, 第 39 列。
    
    • mov [gs:((80 * 0 + 39) * 2)], ax ; 屏幕第 0 行, 第 39 列

    代码清单3-21 源码 line : 266 ~272 : 关闭软驱

    • Loader引导加载程序完成内核程序的加载工作后,软盘驱动器将不再使用
    • I/O端口03F2h写入数值0关闭全部软盘驱动器
    KillMotor:
        
        push    dx
        mov dx, 03F2h
        mov al, 0   
        out dx, al
        pop dx
    

    代码清单3-22 源码 line: 274 ~ 330 :保存物理地址空间信息

    • 当内核程序不再借助临时转存空间后,这块临时转存空间 0x7E00 ~ 0x7FFF将用于保存物理地址空间信息
    • 使用INT 15H来获取物理地址空间信息
    INT 15H 保存物理地址空间信息

    参考资料

    • FS寄存器

    Segment registers
    CS DS ES FS GS SS
    ES,FS,GS : These are extra segment registers available for
    far pointer addressing like video memory and such.

    x86 Registers
    http://www.eecg.toronto.edu/~amza/www.mindsec.com/files/x86regs.html

    • x86 Assembly

    https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture

    • [OS64位][010]源码阅读:代码清单3-10 从FAT12文件系统中加载loader.bin文件到内存 Label_FileName_Found

    https://www.jianshu.com/p/d772901a6be3

    • [OS64位][008]软盘文件系统分配图:根目录项结构、FAT表项结构

    https://www.jianshu.com/p/2290e05af3f2

    • [OS64位][007]源码阅读:代码清单3-8 INT 10H字符串显示,找不到loader.bin 时显示提示信息

    https://www.jianshu.com/p/cdf5cb908693

    • int 15h中断获取内存信息
     调用中断int 15h 之前,需要填充如下寄存器:
    · eax  int 15h 可以完成许多工作,主要有ax的值决定,我们想要获取内存信息,需要将ax赋值为0E820H。
    · ebx  放置着“后续值(continuation value)”,第一次调用时ebx必须为0.
    · es:di  指向一个地址范围描述结构 ARDS(Address Range Descriptor Structure), BIOS将会填充此结构。
    · ecx  es:di所指向的地址范围描述结构的大小,以字节为单位。无论es:di所指向的结构如何设置,BIOS最多将会填充ecx字节。不过,通常情况下无论ecx为多大,BIOS只填充20字节,有些BIOS忽略ecx的值,总是填充20字节。
    · edx  0534D4150h('SMAP')——BIOS将会使用此标志,对调用者将要请求的系统映像信息进行校验,这些信息被BIOS放置到es:di所指向的结构中。
    
    中断调用之后,结果存放于下列寄存器之中。
    · CF  CF=0表示没有错误,否则存在错误。
    · eax   0534D4150h('SMAP')
    · es:di  返回的地址范围描述符结构指针,和输入值相同。
    · ecx BIOS填充在地址范围描述符中的字节数量,被BIOS所返回的最小值是20字节。
    · ebx  这里放置着为等到下一个地址描述符所需要的后续值,这个值得实际形势依赖于具体的BIOS的实现,
      调用者不必关心它的具体形式,自需在下一次迭代时将其原封不动地放置到ebx中,
      就可以通过它获取下一个地址范围描述符。
      如果它的值为0,并且CF没有进位,表示它是最后一个地址范围描述符。
    

    https://blog.csdn.net/trochiluses/article/details/20078161

    相关文章

      网友评论

          本文标题:[OS64位][014]源码阅读:代码清单3-18 ~ 3-22

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