[OS64位][014]源码阅读:代码清单3-18 ~ 3-22 将内核kernel.bin读至内存0x100000

学习笔记

使用教材(配书源码以及使用方法)
《一个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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,192评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,858评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,517评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,148评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,162评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,905评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,537评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,439评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,956评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,083评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,218评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,899评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,565评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,093评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,201评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,539评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,215评论 2 358

推荐阅读更多精彩内容