学习笔记
使用教材(配书源码以及使用方法)
《一个64位操作系统的设计与实现》
http://www.ituring.com.cn/book/2450
https://www.jianshu.com/p/28f9713a9171
源码结构
- 配书代码包 :第7章 \ 程序 \ 程序7-3
- 参考目录:7.4 U盘启动
实验操作
零、将U盘制作成 USB-FDD 启动模式 + FAT12文件系统
- 参见书本 《7.4 U盘启动》,使用软件 DiskGenius,将U盘制作成USB-FDD 启动模式 + FAT12文件系统
一、 根据U盘信息,修改配书包里的源码
- 黄色标注部分,我的U盘总容量32MB,簇大小默认是8192字节
查看自己制作好的U盘的信息
参照U盘的信息修改源码
- (
;
注释部分是配书源码的数值 以及 一些说明)
boot.asm
SectorNumOfRootDirStart equ 19 ;SectorNumOfRootDirStart equ 25 根目录区起始扇区号
SectorBalance equ 23 ;SectorBalance equ 23 其实是用不到了,后面会有代码专门算这个值
BPB_SecPerClus db 0x10 ;BPB_SecPerClus db 0x8 每簇扇区数
BPB_TotSec16 dw 0xbc43 ;BPB_TotSec16 dw 0x7d82 总扇区数
BPB_Media db 0xf0
BPB_FATSz16 dw 0x9 ;BPB_FATSz16 dw 0xc FAT扇区数
BPB_SecPerTrk dw 0x3f ;BPB_SecPerTrk dw 0x3f 每磁道扇区数
BPB_NumHeads dw 0xff ;BPB_NumHeads dw 0xff 磁头数
Label_Go_On_Loading_File:
add bx, 0x2000 ;add bx, 0x1000 ;add bx, [BPB_BytesPerSec] 这里要填入簇的大小
BPB_SecPerClus db 0x10 每簇扇区数
等于 簇大小 8192 除以 每扇区字节数512 = 16,写成十六进制0x10
- 我的U盘总容量32MB,制作成USB-FDD启动模式+FAT12文件系统之后,一簇有16个扇区,即每调用一次读软盘功能的
call Func_ReadOneSector
,都会读入16个扇区的数据,也就是十进制8192字节(0x2000),从而缓冲区的偏移在一次读操作后要add bx , 0x2000
fat12.inc
与 boot.asm 保持一致
SectorNumOfRootDirStart equ 19 ;SectorNumOfRootDirStart equ 25
BPB_SecPerClus db 0x10 ;BPB_SecPerClus db 0x8
BPB_TotSec16 dw 0xbc43 ;BPB_TotSec16 dw 0x7d82
BPB_FATSz16 dw 0x9 ;BPB_FATSz16 dw 0xc
loader.asm
每读一簇就是8192字节=2000h字节
Label_Go_On_Loading_File:
. . .
mov cx, 2000h ;mov eax, 0x1000 这里应该填入簇的大小
. . .
loop Label_Mov_Kernel
二、开启虚拟机
鼠标聚焦在虚拟机,再插入U盘,CentOS识别后,桌面会出现图标
U盘图标
- 进行命令行操作,两个
make
,一个dd
,/dev/sdb
就是U
盘设备
[anno@localhost 7-3 32MB]$ ls
bootloader kernel
[anno@localhost 7-3 32MB]$ cd bootloader
[anno@localhost bootloader]$ make
nasm boot.asm -o boot.bin
nasm loader.asm -o loader.bin
[anno@localhost bootloader]$ sudo dd if=boot.bin of=/dev/sdb bs=512 count=1 conv=notrunc
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.00673206 s, 76.1 kB/s
[anno@localhost bootloader]$ ls
boot.asm boot.bin fat12.inc loader.asm loader.bin Makefile
[anno@localhost bootloader]$ cd ../
[anno@localhost 7-3 32MB]$ cd kernel
[anno@localhost kernel]$ make
[anno@localhost kernel]$ ls
cpu.h gate.h interrupt.h linkage.h memory.h ptrace.h trap.c
entry.o head.o interrupt.o main.c memory.o system trap.h
entry.s head.s kernel.bin main.o printk.c task.c trap.o
entry.S head.S Kernel.lds Makefile printk.h task.h
font.h interrupt.c lib.h memory.c printk.o task.o
- 将生成的
loader.bin
以及kernel.bin
复制到U盘
手动复制或者使用cp命令都可以
将生成的 loader.bin 以及 kernel.bin 复制到U盘
- 完成后,选择弹出U盘
三、将真实机器的启动模式设置成 USB-FDD
- 需要注意的是,平常装系统,一般都是选择USB-HDD为首选,但是这里现在的U盘我们模拟的是USB-FDD启动模式,也就是模拟它是一个软盘,在BIOS的启动首选项里面,要选择USB-FDD启动为最优先的
将真实机器的启动模式设置成USB-FDD
四、关机状态下,插入U盘
关机状态下,插入U盘
五,再开机
看到熟悉的画面,各种信息都顺利输出了
再开机
网友评论