# tobyos **Repository Path**: toby_lai/tobyos ## Basic Information - **Project Name**: tobyos - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-02-03 - **Last Updated**: 2022-02-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TobyOS ## boot.asm -> boot.bin ```bash nasm -f bin boot.asm -o boot.bin ``` ## 创建硬盘镜像 ```bash bximage -q -hd=16 -func=create -sectsize=512 -imgmode=flat tobyos.img ``` The following line should appear in your bochsrc: `ata0-master: type=disk, path="tobyos.img", mode=flat` ### 将boot.bin 写入主引导扇区 ```bash dd if=boot.bin of=tobyos.img bs=512 count=1 conv=notrunc ``` > notrunc 指不要截断,tobyos.img有16M,若去掉`conv=notrunc`会把超过512字节的地方删去,这并不是想要的效果 *编译用Makefile就行了* # 主引导扇区 ## BIOS `Basic Input Output System` 的缩写 BIOS 加电自检 -> 检查这个计算机的硬件功能是否完整 BIOS 在加电自检将主引导扇区读 `0x7c00` 位置,并跳转到这里执行 ```asm int 0x10 ; BIOS 系统调用,显示器相关的功能[这里用它来清除屏幕] ``` ## 实模式 又叫`8086模式`,CPU是*16位*的, 相对的叫`保护模式`。 - Real Mode - Protected Mode 此处要写的是要实模式进入保护模式 实模式代码 ```asm ; 0xb8000 是文本显示器的内存区域 mov ax,0xb800 mov ds,ax mov byte [0],'H' ``` 至于为什么注释写`0xb8000`而代码写了`0xb800`,这和实模式的寻址方式有关。 ## 实模式的寻址方式 > 有效地址 = 段地址 * 16 + 偏移地址 EA = 0xb800 * 0x10 + 0 = 0x8b000 0x10 是16 +0 是因为 `mov byte [0],'H'` EA 是 `Effective Address`的缩写,就是`有效地址` ### 原因 > 只有16bit,需要访问1M内存,但实模式需要访问1M内存要20bit地址线 > 20 - 16 = 4 >剩下的4个由段地址提供了 `段地址 << 4` 提供了剩下4根地址线 ## 保护模式 保护模式寄存器有32bit,可以访问4G内存,也就不需要上面实模式的寻址方式了 ## 主引导扇区的结构 一个扇区512个字节 - 代码 446字节 - 硬盘分区表:64个字节 = 4 * 16个字节 - 也就是说硬盘最多只可以分成4个区(4个主分区),一个主分区信息占16个字节 - 最后两个字节叫 `魔数`,也就是 `0xaa55` 或 `0x55 0xaa` ## 主要功能 读取内核加载器,并执行 # 实模式print - ah: 0x0e - al: 字符 - int 0x10 ```asm mov si, booting call print ; 阻塞程序 jmp $ print: mov ah,0x0e .next: mov al,[si] cmp al,0 jz .done int 0x10 inc si jmp .next .done: ret booting: db "Booting TobyOS...",10,13,0 ; 10是ascii的\n,13是ascii的\r ``` # 硬盘 - 扇区:硬盘读写的最小单位,最少一个,最多256个扇区 - 机械臂的寻道时间是硬盘性能的主要瓶颈 - 一般情况下一个磁道有63个扇区,主要是由于BIOS最大支持这么多 - 磁道从外侧计数,所以一般情况下电脑 `C盘` 的读写速度最快 ## IDE / ATA PIO Mode PIO: Port Input Output 端口输入输出模式 端口是外部设备的寄存器; - `IDE`: Intergrated Drive Electronics 集成电子驱动器 - `ATA`: Advanced Technology Attachment - `SATA` / `PATA` ## 硬盘读写 - CHS模式 / Cylinder / Head / Sector - LBA模式 / Logical Block Address LBA28最多可以访问`128G`的磁盘空间 - 0x1F0:16bit端口,用于读写数据 - 0x1F1:检测前一个指令的错误 - 0x1F2:读写扇区的数量 - 0x1F3:起始扇区的`0~7`位 - 0x1F4:起始扇区的`8~15`位 - 0x1F5:起始扇区的`16~23`位 - 0x1F6: - 0~3:起始扇区的24~27 - 4:0主盘,1从盘 - 6:0 CHS,1 LBA - 5~7:固定为1 - 0x1F7:out - 0xEC:识别硬盘 - 0x20:读硬盘 - 0x30:写硬盘 - 0x1F7:in / 8bit - 0 ERR - 3 DRQ 数据准备完毕 - 7 BSY 硬盘是否繁忙