linux0.11學習筆記(1)


公布軟件包包括內容:

bootimage.Z - 具有美國鍵盤代碼的壓縮啟動映像文件;

rootimage.Z - 以1200kB 壓縮的根文件系統映像文件;
linux-0.11.tar.Z- 內核源碼文件;
as86.tar.Z - linux bruce evans'二進制運行文件。
是16 位的匯編程序和裝入程序;

INSTALL-0.11 - 更新過的安裝信息文件。


不足之處:不包含有關進程等待隊列、虛擬文件系統、TCP/IP網絡等方面的一些當前很重要的代碼。


文件夾:

Linux/文件夾下:各個文件夾以及內核代碼的整體Makefile文件的內容。

boot/文件夾下的三個匯編程序,當中包含磁盤引導程序bootsect.s、32 位執行啟動代碼程序head.s 和獲取BIOS 中參數的setup.s 匯編程序。

init/文件夾中內核系統的初始化程序main.c。它是內核完畢全部初始化工作並進入正常執行的關鍵地方。

kenel/文件夾中的全部程序

fs/文件夾中的文件系統程序

mm/文件夾中的內存管理程序。要透徹地理解這方面的內容。須要對Intel 80X86 微處理器的保護模式執行方式有足夠的理解,包括有較為完整的有關80X86 保護模式執行方式的說明,這些知識基本上是從Intel 80386 程序猿編程手冊(Intel 80386 Programmer's ReferenceManual) 中摘錄下來的

include/文件夾中的全部頭文件進行具體說明,基本上對每個定義、每個常量或數據
結構都進行了具體凝視。

lib/文件夾中的全部文件。

因為這個版本號較低。所以這里的內容並非非常多,能夠非常快地看完。

tools/文件夾下的build.c 程序。這個程序並不會包含在編譯生成的內核映像(image)文件里。它僅用於將內核中的磁盤引導程序塊與其他主要內核模塊連接成一個完整了內核映像(kernelimage)文件。



在Linux 操作系統上,這些程序包含X 窗體系統、shell 命令解釋系統以及那些內核編程接口等系統程序


在單內核模式的系統中。操作系統所提供服務的流程為:應用主程序使用指定的參數值運行系統調用指令(int x80),使CPU 從用戶態(User Mode)切換到核心態(Kernel Model),然后操作系統依據詳細的參數值調用特定的系統調用服務程序,而這些服務程序則依據須要再底層的一些支持函數以完畢特定的功能。在完畢了應用程序所要求的服務后,操作系統又從核心態切換回用戶態,返回到應用程序中繼續運行后面的指令。

因此概要地講,單內核模式的內核也可粗略地分為三個層次:調用服務的主程序層、運行系統調用的服務層和支持系統調用的底層函數。



Linux 內核主要由5 個模塊構成,它們各自是:進程調度模塊、內存管理模塊、文件系統模塊、進程間通信模塊和網絡接口模塊。


進程調度模塊用來負責控制進程對CPU 資源的使用。

所採取的調度策略是各進程可以公平合理地訪問CPU,同一時候保證內核能正時地運行硬件操作。內存管理模塊用於確保全部進程可以安全地共享機器主內存區。同一時候。內存管理模塊還支持虛擬內存管理方式。使得Linux 支持進程使用比實際內存空間很多其他大的內存容量。並可以利用文件系統把臨時不用的內存數據塊會被交換到外部存儲設備上去。當須要時再交換回來。文件系統模塊用於支持對外部設備的驅動和存儲。虛擬文件系統模塊通過向全部的外部存儲設備提供一個通用的文件接口。隱藏了各種硬件設備的不同細節。

從而提供並支持與其他操作系統兼容的多種文件系統格式。

進程間通信模塊子系統用於支持多種進程間的信息交換方式。

網絡接口模塊提供對多種網絡通信標准的訪問並支持很多網絡硬件。



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 程序是磁盤引導塊程序,編譯后會駐留在磁盤的第一個扇區中(引導扇區。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 運行文件格式和一些宏。


<const.h> 常數符號頭文件,眼下僅定義了i 節點中i_mode 字段的各標志位。


<ctype.h> 字符類型頭文件。定義了一些有關字符類型推斷和轉換的宏。
<errno.h> 錯誤號頭文件。包括系統中各種出錯號。(Linus 從minix 中引進的)。
<fcntl.h> 文件控制頭文件。用於文件及其描寫敘述符的操作控制常數符號的定義。


<signal.h> 信號頭文件。定義信號符號常量,信號結構以及信號操作函數原型。


<stdarg.h> 標准參數頭文件。以宏的形式定義變量參數列表。

主要說明了-個類型(va_list)和
三個宏(va_start, va_arg 和va_end),用於vsprintf、vprintf、vfprintf 函數。
<stddef.h> 標准定義頭文件。

定義了NULL, offsetof(TYPE, MEMBER)。


<string.h> 字符串頭文件。

主要定義了一些有關字符串操作的嵌入函數。
<termios.h> 終端輸入輸出函數頭文件。主要定義控制異步通信口的終端接口。


<time.h> 時間類型頭文件。

當中最主要定義了tm 結構和一些有關時間的函數原形。
<unistd.h> Linux 標准頭文件。定義了各種符號常數和類型。並申明了各種函數。如定義了
__LIBRARY__。則還包含系統調用號和內嵌匯編_syscall0()等。
<utime.h> 用戶時間頭文件。定義了訪問和改動時間結構以及utime()原型。



<asm/io.h> io 頭文件。以宏的嵌入匯編程序形式定義對io port操作的函數。


<asm/memory.h> 內存拷貝頭文件。含有memcpy()嵌入式匯編宏函數。


<asm/segment.h> 段操作頭文件。定義了有關段寄存器操作的嵌入式匯編函數。

<asm/system.h> 系統頭文件。定義了設置或改動描寫敘述符/中斷門等的嵌入式匯編宏。


<linux/config.h> 內核配置頭文件。

定義鍵盤語言和硬盤類型(HD_TYPE)可選項。


<linux/fdreg.h> 軟驅頭文件。

含有軟盤控制器參數的一些定義。
<linux/fs.h> 文件系統頭文件。定義文件表結構(file,buffer_head,m_inode 等)。
<linux/hdreg.h> 硬盤參數頭文件。定義訪問硬盤寄存器port,狀態碼,分區表等信息。
<linux/head.h> head 頭文件,定義了段描寫敘述符的簡單結構。和幾個選擇符常量。
<linux/kernel.h> 內核頭文件。

含有一些內核經常使用函數的原形定義。
<linux/mm.h> 內存管理頭文件。含有頁面大小定義和一些頁面釋放函數原型。


<linux/sched.h> 調度程序頭文件,定義了任務結構task_struct、初始任務0 的數據,另一些有關描寫敘述符參數設置和獲取的嵌入式匯編函數宏語句。
<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 程序包括一個內核使用的時間函數mktime(),用於計算從1970 年1 月1 日0 時起到開機
當日的秒數,作為開機秒時間。僅在init/main.c 中被調用一次。
panic.程序包括一個顯示內核出錯信息並停機的函數panic()。


printk.c 程序包括一個內核專用信息顯示函數printk()。


sched.c 程序中包含有關調度的基本函數(sleep_on、wakeup、schedule 等)以及一些簡單的系統調
用函數。

另外還有幾個與定時相關的軟盤操作函數。
signal.c 程序中包含了有關信號處理的4 個系統調用以及一個在相應的中斷處理程序中處理信號的
函數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 的不斷改進,眼下其自己主動化程度越來越高。因此已經不須要人工指定一個變量需使用的CPU 寄存器。

因此內核代碼中的__asm__("ax")須要所有去掉。比如s/bitmap.c 文件的第20 行、26 行上。fs/namei.c 文件的第65 行上等。在嵌入匯編代碼中,另外還須要去掉所有對寄存器內容無效的聲明。比如include/string.h 中第84 行:
:"si","di","ax","cx");

須要改動成:

: );


(32)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM