2019年6月27日 星期四

自製64位元作業系統02──檔案系統

檔案系統,對於一個作業系統非常重要。

  通常一個硬碟的存取單位是512Bytes,但是大部分的情況下,我們一個檔案會超過這個大小,所以我們就需要使用到檔案系統來讓我們一個檔案的大小超過這個限制。最簡易的檔案系統,像是FAT,是利用檔案的鏈式儲存來處理大檔案。那這篇文章預計使用常見於Linux作業系統的Ext2檔案系統。這個檔案系統是利用索引式的方法,有著不容易檔案分散,而造成效能降低的情形。
  我們這個作業系統就要利用一個「軟碟(Floppy)」來開機(順帶一提,我沒有看過可以運作的軟碟機過,這真的是歷史產物,不過透過這種裝置放入模擬機開機,會比較容易實作,因為不需要管MBR等等)。一片最新技術的軟碟(其實也很舊了),其容量是1.44MiB(以後我們都會使用中間加一個i以代表2進位的容量大小單位)。
  我們可以參考https://www.nongnu.org/ext2-doc/ext2.html,這個網頁可以提供許多有關這個檔案系統的資訊。
  在Ext2中,最基本的儲存單位叫做「塊(Block)」,每一個塊的大小都是固定的,在我的設計中,一個塊的大小是1KiB。依照上面的網頁的樣本,我們的第一個Block就是開機程式,目前暫時放著印出Hello world的程式,不過,我們還會有一個512Bytes的磁區讓我們放入其他程式,這些問題以後再說,我們今天主要要把Ext2的檔案系統準備好。
我們首先利用.org指令跳到0x400處
.org 0x400, 0x62
然後我們就開始進入superblock的部分,其實Ext2本身的結構可以利用程式生成,我們只需要了解如何在裡面找到我們需要的檔案,或是如何寫入檔案就好,所以裡面的內容一點也不重要,以後我們可能利用其他方法更快速的生成Ext2檔案系統。我們加入Ext2的程式碼如下:
# SuperBlock
.long 184 # s_inode_count
.long 1440 # s_blocks_count
.long 72 # s_r_blocks_count
.long 1411 # s_free_blocks_count
.long 174 # s_free_inodes_count
.long 1 # s_first_data_block
.long 0 # s_log_block_size
.long 0 # s_log_frag_size
.long 8192 # s_blocks_per_group
.long 8192 # s_frags_per_group
.long 184 # s_inodes_per_group
.long 0 # s_mtime
.long 0x5D0F7311 # s_wtime
.word 0 # s_mnt_count
.word 0x1e # s_max_mnt_count
.word 0xEF53 # s_magic
.word 1 # s_state
.word 1 # s_errors
.word 0 # s_minor_rev_level
.long 0x5D0F7311 # s_lastcheck
.long 0xed4e00 # s_checkinterval
.long 0 # s_creator_os
.long 1 # s_rev_level
.word 0 # s_def_resuid
.word 0 # s_def_resgid
.long 11
.word 128
.word 0
.long 0
.long 0
.long 0
.quad 0x52145214
.quad 0x52145214
.quad 0
.quad 0
.quad 0
.quad 0
.quad 0
.quad 0
.long 0

.org 0x800, 0x0
# Block Group Descriptor Table
.long 3
.long 4
.long 5
.word 1411
.word 174
.word 1
.word 0
.long
.long
.long

.org 0xC00, 0x0
# BLOCK BITMAP
.long 0x0FFFFFFF

.org 0x1000, 0x0
# INODE BITMAP
.word 0b1111111111
.org 0x1480, 0x0
# INODE TABLE
# Root directory
.word 0x41ED #i_mode
.word 0
.long 1024
.long 0
.long 0x5D0F7311
.long 0
.long 0
.word 0
.word 2
.long 2
.long 0
.long 0
# 15 blocks
.long 28
.long 0
.long 0
.long 0
.long 0
.long 0
.long 0
.long 0
.long 0
.long 0
.long 0
.long 0
.long 0
.long 0
.long 0

.long 0
.long 0
.long 0
.long 0

.long 0
.long 0
.long 0
.org 0x7000, 0x0
.long 2
.word 12
.byte 1
.byte 2
.ascii "."

.long 2
.word 12
.byte 2
.byte 2
.ascii ".."
這樣我們就可以利用Linux中的指令,來控制我們製造出來的映像檔。
我們的Makefile將會利用Linux中的指令,將我們的組合語言程式編譯好,並且可以產生一個1.44MiB的檔案,裡面將會有一個Ext2的檔案系統。
CC=gcc
LD=ld

.PHONY: all clean
all: loader.bin
loader.o: loader.S
  ${CC} -c $<
loader.bin: loader.o
  ${LD} -Tloader.ld $< -o loader.tmp
  dd if=/dev/zero of=$@ bs=512 count=2880
  dd if=./loader.tmp of=$@ bs=512 conv=notrunc
  rm -f loader.tmp
clean:
  rm -f *.o *.tmp *.bin




👉【幫我們一個忙!】👈

👋如果您喜歡這篇文章,請在下方按5個Like!
 ❤您的支持是我們最大的動力!

您只要登入帳號(Facebook、Google),在下方按5個Like,我們就會收到來自LikeCoin基金會的贊助。
您只需要支持我們,完全不會花到錢!