读取磁盘:LBA方式 以及 CHS方式
https://www.cnblogs.com/mlzrq/p/10223060.html
LBA簡介
磁盤讀取發展
IO操作讀取硬盤的三種方式:
-
chs方式 :小于8G (8064MB)
-
LBA28方式:小于137GB
-
LBA48方式:小于144,000,000 GB
LBA方式訪問使用了data寄存器,LBA寄存器(總共3個),device寄存器,command寄存器來完成的。
LBA28和LBA48方式:
LBA28方式使用28位來描述一個扇區地址,最大支持128GB的硬磁盤容量。
LBA28的寄存器
| data寄存器 | 0x1F0 | 已經讀取或寫入的數據,大小為兩個字節(16位數據) 每次讀取1個word,反復循環,直到讀完所有數據 |
| features寄存器 | 0x1F1 | 讀取時的錯誤信息 寫入時的額外參數 |
| sector count寄存器 | 0x1F2 | 指定讀取或寫入的扇區數 |
| LBA low寄存器 | 0x1F3 | lba地址的低8位 |
| LBA mid寄存器 | 0x1F4 | lba地址的中8位 |
| LBA high寄存器 | 0x1F5 | lba地址的高8位 |
| device寄存器 | 0x1F6 | lba地址的前4位(占用device寄存器的低4位) 主盤值為0(占用device寄存器的第5位) 第6位值為1 LBA模式為1,CHS模式為0(占用device寄存器的第7位) 第8位值為1 |
| command寄存器 | 0x1F7 | 讀取,寫入的命令,返回磁盤狀態 1 讀取扇區:0x20 寫入扇區:0x30 磁盤識別:0xEC |
IDE通道1,讀寫0x1f0-0x1f7號端口
IDE通道2,讀寫0x170-0x17f號端口
CHS方式:
寫0x1f1: 0
寫0x1f2: 要讀的扇區數
寫0x1f3: 扇區號W
寫0x1f4: 柱面的低8位
寫0x1f5: 柱面的高8位
寫0x1f6: 7~5位,101,第4位0表示主盤,1表示從盤,3~0位,磁頭號
寫0x1f7: 0x20為讀, 0x30為寫
讀0x1f7: 第4位為0表示讀寫完成,否則要一直循環等待
讀0x1f0: 每次讀取1個word,反復循環,直到讀完所有數據
24-bit LBA方式:
寫0x1f1: 0
寫0x1f2: 要讀的扇區數
寫0x1f3: LBA參數的0~7位
寫0x1f4: LBA參數的8~15位
寫0x1f5: LBA參數的16~23位
寫0x1f6: 7~5位,111,第4位0表示主盤,1表示從盤,3~0位,LBA參數的24~27位
寫0x1f7: 0x20為讀, 0x30為寫
讀0x1f7: 第4位為0表示讀寫完成,否則要一直循環等待
讀0x1f0: 每次讀取1個word,反復循環,直到讀完所有數據
48-bit LBA方式:
寫兩次0x1f1端口: 0
寫兩次0x1f2端口: 第一次要讀的扇區數的高8位,第二次低8位
寫0x1f3: LBA參數的24~31位
寫0x1f3: LBA參數的0~7位
寫0x1f4: LBA參數的32~39位
寫0x1f4: LBA參數的8~15位
寫0x1f5: LBA參數的40~47位
寫0x1f5: LBA參數的16~23位
寫0x1f6: 7~5位,010,第4位0表示主盤,1表示從盤,3~0位,0
寫0x1f7: 0x24為讀, 0x34為寫
LBA和CHS的的對應關系
雖然LBA和CHS的兩種定位方式不同,但其實兩者間還是有一個轉換關系的。
讀取硬盤
1)sector count寄存器寄存器寫入讀取的扇區數
2)LBA low寄存器,LBA mid寄存器,LBA high寄存器寫入lba地址
3)device寄存器寫入lba地址和讀取模式
4)command寄存器寫入寫入命令
5)讀取兩個字節數據,多次循環直到讀取完扇區數據。
代碼
boot.asm
引導文件,初始化屏幕后,讀取硬盤并加載4個扇區到內存位置[0x90000]處。然后跳轉到0x90000處執行指令。
loader.asm
被引導扇區加載到0x90000位置,執行輸出hello in loader文字
運行
創建Makefile文件,并執行make命令
# tools PLATFORM=Linux NASM=nasm QEMU=qemu-system-x86_64 QEMU-IMG=qemu-img BOCHS=bochs BX-IMG=bximage# args boot=boot build=buildtarget: prepare img $(BOCHS) -f bochsrc.meimg: $(build)/ratsos.img @echo "build img completed"$(build)/ratsos.img:$(build)/boot.bin $(build)/loader.bin $(BX-IMG) -hd -mode=flat -size=32 -q $(build)/ratsos.imgsleep 1dd if=$(build)/boot.bin of=$(build)/ratsos.img bs=512 count=1 conv=notruncdd if=$(build)/loader.bin of=$(build)/ratsos.img bs=512 count=1 seek=1 conv=notrunc$(build)/%.bin: $(boot)/%.asm$(NASM) -f bin -o $(build)/$*.bin $(boot)/$*.asm prepare: $(build)@echo "prepare dir $(build)"ifeq ($(build), $(wildcard $(build)))@echo "build directory exist..."elsemkdir -p $(build)endifclean:@echo "clean dir $(build)"rm -rf $(build)/*platform:@echo $(PLATFORM)運行結果
?
總結
以上是生活随笔為你收集整理的读取磁盘:LBA方式 以及 CHS方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cap Stone:Section 15
- 下一篇: python数据分析与应用选择题答案_尔