linux 內核 相關

主存中頂部分配給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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章