發布軟件包包括內容:
bootimage.Z - 具有美國鍵盤代碼的緊縮啟動映像文件;
rootimage.Z - 以1200kB 緊縮的根文件系統映像文件;INSTALL-0.11 - 更新過的安裝信息文件。
不足的地方:不包括有關進程等待隊列、虛擬文件系統、TCP/IP網絡等方面的1些當前非常重要的代碼。
目錄:
Linux/目錄下:各個文件夾和內核代碼的整體Makefile文件的內容。
boot/目錄下的3個匯編程序,其中包括磁盤引導程序bootsect.s、32 位運行啟動代碼程序head.s 和獲得BIOS 中參數的setup.s 匯編程序。
init/目錄中內核系統的初始化程序main.c。它是內核完成所有初始化工作并進入正常運行的關鍵地方。
kenel/目錄中的所有程序
fs/目錄中的文件系統程序
mm/目錄中的內存管理程序。要透徹地理解這方面的內容,需要對Intel 80X86 微處理器的保護模式運行方式有足夠的理解,包括有較為完全的有關80X86 保護模式運行方式的說明,這些知識基本上是從Intel 80386 http://www.vxbq.cn編程手冊(Intel 80386 Programmer's ReferenceManual) 中摘錄下來的
include/目錄中的所有頭文件進行詳細說明,基本上對每個定義、每個常量或數據
結構都進行了詳細注釋。
lib/目錄中的所有文件。由于這個版本較低,所以這里的內容其實不是很多,可以很快地看完。
tools/目錄下的build.c 程序。這個程序其實不會包括在編譯生成的內核映像(image)文件中,它僅用于將內核中的磁盤引導程序塊與其它主要內核模塊連接成1個完全了內核映像(kernelimage)文件。
在Linux 操作系統上,這些程序包括X 窗口系統、shell 命令解釋系統和那些內核編程接口等系統程序
在單內核模式的系統中,操作系統所提供服務的流程為:利用主程序使用指定的參數值履行系統調用指令(int x80),使CPU 從用戶態(User Mode)切換到核心態(Kernel Model),然后操作系統根據具體的參數值調用特定的系統調用服務程序,而這些服務程序則根據需要再底層的1些支持函數以完成特定的功能。在完成了利用程序所要求的服務后,操作系統又從核心態切換回用戶態,返回到利用程序中繼續履行后面的指令。因此概要地講,單內核模式的內核也可粗略地分為3個層次:調用服務的主程序層、履行系統調用的服務層和支持系統調用的底層函數。
Linux 內核主要由5 個模塊構成,它們分別是:進程調度模塊、內存管理模塊、文件系統模塊、進程間通訊模塊和網絡接口模塊。
進程調度模塊用來負責控制進程對CPU 資源的使用。所采取的調度策略是各進程能夠公平公道地訪問CPU,同時保證內核能正時地履行硬件操作。內存管理模塊用于確保所有進程能夠安全地同享機器主內存區,同時,內存管理模塊還支持虛擬內存管理方式,使得Linux 支持進程使用比實際內存空間更多大的內存容量。并可以利用文件系統把暫時不用的內存數據塊會被交換到外部存儲裝備上去,當需要時再交換回來。文件系統模塊用于支持對外部裝備的驅動和存儲。虛擬文件系統模塊通過向所有的外部存儲裝備提供1個通用的文件接口,隱藏了各種硬件裝備的不同細節。從而提供并支持與其它操作系統兼容的多種文件系統格式。進程間通訊模塊子系統用于支持多種進程間的信息交換方式。網絡接口模塊提供對多種網絡通訊標準的訪問并支持許多網絡硬件。
linux
├─ boot 系統引導匯編程序
├─ fs 文件系統
├─ include 頭文件(*.h)
│ ├─ asm 與CPU 體系結構相干的部份
│ ├─ linux Linux 內核專用部份
│ └─ sys 系統數據結構部份
├─ init 內核初始化程序
├─ kernel 內核進程調度、信號處理、系統調用等程序
│ ├─ blk_drv 塊裝備驅動程序
│ ├─ chr_drv 字符裝備驅動程序
│ └─ math 數學協處理器仿真處理程序
├─ lib 內核庫函數
├─ mm 內存管理程序
└─ tools 生成內核Image 文件的工具程序
碼目錄中含有14 個子目錄,總共包括102 個代碼文件
bootsect.s 程序是磁盤引導塊程序,編譯后會駐留在磁盤的第1個扇區中(引導扇區,0 磁道(柱面),0 磁頭,第1 個扇區)。在PC 機加電ROM BIOS 自檢后,將被BIOS 加載到內存0x7C00 處進行履行。
setup.s 程序主要用于讀取機器的硬件配置參數,并把內核模塊system 移動到適當的內存位置處。
head.s 程序會被編譯連接在system 模塊的最前部份,主要進行硬件裝備的探測設置和內存管理頁面的初始設置工作。
頭文件目錄中總共有32 個.h 頭文件。其中主目錄下有13 個,asm 子目錄中有4 個,linux 子目錄中有10 個,sys 子目錄中有5 個
<a.out.h> a.out 頭文件,定義了a.out 履行文件格式和1些宏。
<const.h> 常數符號頭文件,目前僅定義了i 節點中i_mode 字段的各標志位。
<ctype.h> 字符類型頭文件。定義了1些有關字符類型判斷和轉換的宏。
<errno.h> 毛病號頭文件。包括系統中各種出錯號。(Linus 從minix 中引進的)。
<fcntl.h> 文件控制頭文件。用于文件及其描寫符的操作控制常數符號的定義。
<signal.h> 信號頭文件。定義信號符號常量,信號結構和信號操作函數原型。
<stdarg.h> 標準參數頭文件。以宏的情勢定義變量參數列表。主要說明了-個類型(va_list)和
3個宏(va_start, va_arg 和va_end),用于vsprintf、vprintf、vfprintf 函數。
<stddef.h> 標準定義頭文件。定義了NULL, offsetof(TYPE, MEMBER)。
<string.h> 字符串頭文件。主要定義了1些有關字符串操作的嵌入函數。
<termios.h> 終端輸入輸出函數頭文件。主要定義控制異步通訊口的終端接口。
<time.h> 時間類型頭文件。其中最主要定義了tm 結構和1些有關時間的函數原形。
<unistd.h> Linux 標準頭文件。定義了各種符號常數和類型,并申明了各種函數。如定義了
__LIBRARY__,則還包括系統調用號和內嵌匯編_syscall0()等。
<utime.h> 用戶時間頭文件。定義了訪問和修改時間結構和utime()原型。
<asm/io.h> io 頭文件。以宏的嵌入匯編程序情勢定義對io 端口操作的函數。
<asm/memory.h> 內存拷貝頭文件。含有memcpy()嵌入式匯編宏函數。
<asm/segment.h> 段操作頭文件。定義了有關段寄存器操作的嵌入式匯編函數。
<asm/system.h> 系統頭文件。定義了設置或修改描寫符/中斷門等的嵌入式匯編宏。
<linux/config.h> 內核配置頭文件。定義鍵盤語言和硬盤類型(HD_TYPE)可選項。
<linux/fdreg.h> 軟驅頭文件。含有軟盤控制器參數的1些定義。
<linux/fs.h> 文件系統頭文件。定義文件表結構(file,buffer_head,m_inode 等)。
<linux/hdreg.h> 硬盤參數頭文件。定義訪問硬盤寄存器端口,狀態碼,分區表等信息。
<linux/head.h> head 頭文件,定義了段描寫符的簡單結構,和幾個選擇符常量。
<linux/kernel.h> 內核頭文件。含有1些內核經常使用函數的原形定義。
<linux/mm.h> 內存管理頭文件。含有頁面大小定義和1些頁面釋放函數原型。
<linux/sched.h> 調度程序頭文件,定義了任務結構task_struct、初始任務0 的數據,還有1些有關描寫符參數設置和獲得的嵌入式匯編函數宏語句。
<linux/sys.h> 系統調用頭文件。含有72 個系統調用C 函數處理程序,以'sys_'開頭。
<linux/tty.h> tty 頭文件,定義了有關tty_io,串行通訊方面的參數、常數。
<sys/stat.h> 文件狀態頭文件。含有文件或文件系統狀態結構stat{}和常量。
<sys/times.h> 定義了進程中運行時間結構tms 和times()函數原型。
<sys/types.h> 類型頭文件。定義了基本的系統數據類型。
<sys/utsname.h> 系統名稱結構頭文件。
<sys/wait.h> 等待調用頭文件。定義系統調用wait()核waitpid()及相干常數符號。
件main.c用于履行內核所有的初始化工作,然后移到用戶模式創建新進程,并在控制臺裝備上運行shell 程序。
exit.c 程序主要包括用于處理進程終止的系統調用。包括進程釋放、會話(進程組)終止和程序退
出處理函數和殺死進程、終止進程、掛起進程等系統調用函數。
fork.c 程序給出了sys_fork()系統調用中使用了兩個C 語言函數:find_empty_process()和
copy_process()。
mktime.c 程序包括1個內核使用的時間函數mktime(),用于計算從1970 年1 月1 日0 時起到開機
當日的秒數,作為開機秒時間。僅在init/main.c 中被調用1次。
panic.程序包括1個顯示內核出錯信息并停機的函數panic()。
printk.c 程序包括1個內核專用信息顯示函數printk()。
sched.c 程序中包括有關調度的基本函數(sleep_on、wakeup、schedule 等)和1些簡單的系統調
用函數。另外還有幾個與定時相干的軟盤操作函數。
signal.c 程序中包括了有關信號處理的4 個系統調用和1個在對應的中斷處理程序中處理信號的
函數do_signal()。
sys.c 程序包括很多系統調用函數,其中有些還沒有實現。
system_call.s 程序實現了linux 系統調用(int 0x80)的接口處理進程,實際的處理進程則包括
在各系統調用相應的C 語言處理函數中,這些處理函數散布在全部linux 內核代碼中。
vsprintf.c 程序實現了現在已歸入標準庫函數中的字符串格式化函數。
內核的編譯:
1,修改makefile
a. 將gas =>as, gld=>ld。現在gas 和gld 已直接改名稱為as 和ld 了。
b. as(原gas)已不用-c 選項,所以要將Makefile, 因此需要去掉其-c 編譯選項。在內核主目錄Linux下makefile 文件中,是在34 行上。
c. 去掉gcc 的編譯標志選項:-fcombine-regs、-mstring-insns 和所有子目錄中Makefile 中的這兩個選項。在94 年的gcc 手冊中就已找不到-fcombine-regs 選項,而-string-insns 是Linus 自己對gcc的修改增加的選項,所以你我的gcc 中肯定不包括這個優化選項。
d. 在gcc 的編譯標志選項中,增加-m386 選項。這樣在RedHat 9 下編譯出的內核映像文件中就不含有80486 及以上CPU 的指令,因此該內核就能夠運行在80386 機器上
2,as86 編譯程序不能辨認c 語言的注釋語句,因此需要使用!注釋掉boot/bootsect.s 文件中的C 注釋語句。
3,原來align 后面帶的數值是指對起內存位置的冪次值,而現在則需要直接給出對起的整數地址值。因此,原來的語句:
.align 3
需要修改成(2 的3 次冪值2^3=8):
.align 8
4,由于對as 的不斷改進,目前其自動化程度愈來愈高,因此已不需要人工指定1個變量需使用的CPU 寄存器。因此內核代碼中的__asm__("ax")需要全部去掉。例如s/bitmap.c 文件的第20 行、26 行上,fs/namei.c 文件的第65 行上等。在嵌入匯編代碼中,另外還需要去掉所有對寄存器內容無效的聲明。例如include/string.h 中第84 行:
:"si","di","ax","cx");
需要修改成:
: );
(32)