主存中頂部分配給ROM BIOS(256KB-2MB),640KB-1MB的空間留作其他用途.包括顯示緩衝區,ROM BIOS映射區...
BIOS啟動過程:從記憶體的oxFFFFFFF0開始,這個地址有一條JMP命令跳到Flash ROM中的BIOS程式中執行,將其中的64KB代碼複製到記憶體oxF0000-ox100000作為ROM BIOS映射區,並從這裡開始進入實模式工作.
CMOS(互補性氧化金屬半導體)儲存空間容量很小,用於儲存即時鐘資訊和系統硬體設定資訊.
as86彙編編譯器用以編譯開機磁區程式bootsect.s和配置程式setup.s.其它原始碼由GNU as彙編和gcc編譯.
處理器的系統寄存器包括標誌寄存器,記憶體管理寄存器(GDTR,IDTR,LDTR,TR),控制寄存器(CR0,CR1,CR2,CR3).
段寄存器(CS,DS,ES,SS,FS,GS),EIP寄存器中存放段內位移地址,所以CS:[EIP]表示要執行的代碼邏輯地址.
80x86將邏輯地址根據分段規則轉為線性地址,再將線性地址根據分頁規則轉為物理地址.
rep表示在CX不為0的情況下,不斷迴圈.
movw表示移動一個字
jmpi go,INITSEG 表示間接跳轉.
seg 取段地址
ah=0x08 int 0x13 表示取磁碟機參數
.word 0 表示定義值為0的變數
總結:ROM BIOS (0x7c00) ->bootsect.S移動到0X90000執行,setup.S移動到0x90200, System模組移動到0x10000 -> setup.S再執行->System模組移動到0x00000->執行head.S
main.c的主要功能:
1.讀取head.S執行後的系統配置參數,分配記憶體空間
2.trap_init() 設定陷阱門
3.blk_dev_init() 塊裝置初始化
4.chr_dev_init() 字元裝置初始化
5.tty_init() tty初始化
6.time_init() 系統時間初始化
7.sched_init() 進程調度初始化
8.buffer_init() 緩衝區初始化
9.hd_init() 硬碟初始化
10.floppy_init() 磁碟片初始化
11.sti() 開啟中斷
12.move_to_user_mode() 轉到使用者模式
13.fork() 建立進程0,如果建立成功轉init()函數
14.init()函數中讀取硬碟資訊setup(***),開啟tty0,建立子進程用以開啟rc和sh,再建立子進程以setsid().
總結:main.c的主要工作是:分配記憶體->初始化->開啟中斷->轉到使用者模式(保護模式)->建立進程0,1以讀取硬碟資訊,開啟rc和sh.
//////////
asm.s的主要功能是:處理硬體中斷
C函數地址入棧->中斷返回地址與C函數地址交換入棧->寄存器入棧->出錯碼入棧->
trap.c的主要功能:初始化陷阱門,asm.s中的中斷處理在trap.c中,主要是顯示出錯的位置,寄存器...
////////////////////////
system_call.s
總結:system_call.s主要功能是實現系統調用,還包括時鐘中斷,硬碟中斷,磁碟片中斷,並行中斷,其它底層...
_syscall0宏調用system_call.s->system_call.s根據中斷號到sys.h中的system_call_table數組中找->找到後對應函數在sys.c中
所以添加使用者系統調用的步驟應該在sys.c中定義新函數->將新函式宣告到sys.h及unstd.h中->system_call.s中修改系統調用的總數(+1)
////////////
mktime.c的主要功能是計算從1970.1.1到開機時間所經過的秒數
////////////
sched.c 的主要功能是進程調度演算法,還有其它的一些程式,如軟碟機程式,sleep_on... , 根據從就緒狀況的進程中,選取signal->count最大的優先,同時重新計數全部的signal->count=signal->count/2+signal->priority