久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Linux kernel 介紹

 todaytomo 2006-12-30

前幾天大家對(duì)Linux的啟動(dòng)有些討論。

于是整理了一下前段時(shí)間與他人交流的提綱,,希望起到拋磚引玉的作用,。

[email protected]

這是一次對(duì)Linux介紹后的整理。

對(duì)象是一些剛對(duì)Linux核心感興趣,,并且準(zhǔn)備進(jìn)一步研究和改造的同志,。

因?yàn)槭怯商峋V整理而成,有些亂,,見諒,!

 

四部分內(nèi)容:

一、Linux核心源碼結(jié)構(gòu)介紹

二、編譯和配置的過程

三,、系統(tǒng)啟動(dòng)順序的相關(guān)文件

四,、核心改造的一些經(jīng)驗(yàn)

一、

當(dāng)我們安裝好一個(gè)Linux系統(tǒng),,通常核心源碼存放在/usr/src/linux/目錄,。

下面先看看這目錄下的各個(gè)子目錄及文件。

[/]#cd /usr/src/linux

[linux]#ls -aF

./ MAINTAINERS drivers/ kernel/ scripts/

../ Makefile fs/ lib/

COPYING README include/ mm/

CREDITS Rules.make init/ modules/

Documentation/ arch/ ipc/ net/

下面我們逐一描述:

COPYING

## GPL版權(quán)申明,,看后你至少應(yīng)該知道,,你對(duì)具有GPL版權(quán)的源代碼改動(dòng)而

形成的程序,或使用GPL工具產(chǎn)生的程序,,具有使用GPL發(fā)表的義務(wù),。其中之一就是

公開源代碼。

CREDITS

## 光榮榜,,你應(yīng)當(dāng)感謝的一些人的信息,,其中的每一個(gè)人都對(duì)Linux做出過

很大貢獻(xiàn)。

Documentation/

## 文檔目錄,,可有選擇地看一下你感興趣的部分

MAINTAINERS

## 維護(hù)人員列表,,對(duì)當(dāng)前版本的內(nèi)核各部分都有誰負(fù)責(zé),如果你研究的

夠深入,,可以與他們討論

Makefile

## 如果你在UNIX編譯過程序,,可以看明白

README

## Linus 所寫,核心及其編譯配置方法簡(jiǎn)單介紹

Rules.make

## make時(shí)使用的一些共同規(guī)則

arch/

## architecture(體系結(jié)構(gòu))我關(guān)心的i386啟動(dòng)過程在其中,,

## 包括Linux在多種平臺(tái)下的實(shí)現(xiàn),。如果要移植系統(tǒng)到一個(gè)新的

##CPU環(huán)境中,這就是你要關(guān)心的目錄

drivers/

## 驅(qū)動(dòng)程序目錄,,包含大量設(shè)備驅(qū)動(dòng)的實(shí)現(xiàn),,按類別分子目錄

fs/

## 文件系統(tǒng),實(shí)現(xiàn)了當(dāng)前流行的幾乎所有文件系統(tǒng),。Cool

include/

## 嵌入文件目錄

init/

## 初始化文件,,包含main.cversion.c兩個(gè)文件。Initialize

ipc/

## ipc的實(shí)現(xiàn),,與SYS V兼容

kernel/

## 最核心代碼,,調(diào)度,中斷,,信號(hào)等的處理

lib/

## 一些工具,。

mm/

## 內(nèi)存管理,,Memory Manager,,虛擬頁(yè)、緩沖的實(shí)現(xiàn),。

modules/

## 模塊文件目錄,,用于存放編譯時(shí)產(chǎn)生的模塊目標(biāo)文件(參考編譯過程)

net/

## 網(wǎng)絡(luò)實(shí)現(xiàn),,包括TCP/IP在內(nèi)的大量網(wǎng)絡(luò)協(xié)議的實(shí)現(xiàn)。

scripts/

## 描述文件,,腳本,,用于對(duì)核心的配置。

 

二,、

構(gòu)造內(nèi)核

常用命令包括:

make config, dep, clean, mrproper, zImage, bzImage, modules, modules_install

(1) make config

核心配置,,調(diào)用./scripts/Configure 按照arch/i386/config.in 來進(jìn)行

配置。

命令執(zhí)行完后產(chǎn)生文件.config,,其中保存著配置信息,。

下一次再做make config將產(chǎn)生新的.config文件,原.config被改名為.config.old

(2)make dep

尋找依存關(guān)系,。

產(chǎn)生兩個(gè)文件.depend.hdepend

其中.hdepend表示每個(gè).h文件都包含其它哪些嵌入文件,。

.depend 文件有多個(gè),在每個(gè)會(huì)產(chǎn)生目標(biāo)文件(.o)文件的目錄下均有,,

它表示每個(gè)目標(biāo)文件都依賴哪些嵌入文件(.h),。

 

(3)make clean

清出以前構(gòu)核所產(chǎn)生的所有目標(biāo)文件、模塊文件,、核心以及一些臨時(shí)文件等,,

不產(chǎn)生任何文件

 

(4)make rmproper

刪除所有因構(gòu)核過程中產(chǎn)生的所有文件,及除了做make clean外,,還要

刪除.config,,.depend等文件,把核心源碼恢復(fù)到最原始的狀態(tài),。

下次構(gòu)核時(shí)就必須重新配置了,。

 

(5)make, make zImage, make bzImage

make:

構(gòu)核。通過各目錄的Makefile文件進(jìn)行,。

會(huì)在各個(gè)目錄下產(chǎn)生一大堆目標(biāo)文件,,若核心代碼沒有錯(cuò)誤,將

產(chǎn)生文件vmlinux,,這就是所構(gòu)的核心,。并產(chǎn)生映射文件System.map

通過各目錄的Makefile文件進(jìn)行。

.version 文件中的數(shù)加1,,表示版本號(hào)(又產(chǎn)生一個(gè)新的版本了),,讓你

明白,你已經(jīng)對(duì)核心改動(dòng)過多少次了,。

make zImage

make的基礎(chǔ)上產(chǎn)生壓縮的核心映象文件./arch/$(ARCH)/boot/zImage

以及在./arch/$(ARCH)/boot/compresed/目錄下產(chǎn)生一些臨時(shí)文件,。

make bzImage:

make 的基礎(chǔ)上產(chǎn)生壓縮比例更大的核心映象文件

./arch/$(ARCH)/boot/bzImage

以及在./arch/$(ARCH)/boot/compresed/目錄下產(chǎn)生一些臨時(shí)文件。

在核心太大時(shí)進(jìn)行。

(6)make modules

編譯模塊文件,,你在make config時(shí)所配置的所有模塊將在這時(shí)編譯,,

形成模塊目標(biāo)文件,并把這些目標(biāo)文件存放在modules目錄中,。

使用如下命令看一看,。

ls modules

(7)make modules_install

把上面編譯好的模塊目標(biāo)文件目錄/lib/modules/$KERNEL_VERSION/ 中。

比如我的版本是2.0.36,,做完這個(gè)操作后可使用下面的命令看看:

ls /lib/modules/2.0.36/

 

相關(guān)的命令還有很多,,有興趣可看相關(guān)資料和Makefile文件。

另外注意,,這兒我們產(chǎn)生了一些隱含文件

.config

.oldconfig

.depend

.hdepend

.version

它們的意義應(yīng)該很清楚了,。

三、

系統(tǒng)的啟動(dòng)順序及相關(guān)文件

仍在核心源碼目錄下,,看以下幾個(gè)文件

./arch/$ARCH/boot/bootsect.s

./arch/$ARCH/boot/setup.s

./init/main.c

 

bootsect.S setup.S

 這個(gè)程序是linux kernel的第一個(gè)程序,,包括了linux自己的bootstrap程序,

但是在說明這個(gè)程序前,,必須先說明一般IBM PC開機(jī)時(shí)的動(dòng)作(此處的開機(jī)是指

"打開PC的電源"):

  一般PC在電源一開時(shí),,是由內(nèi)存中地址FFFF:0000開始執(zhí)行(這個(gè)地址一定

ROM BIOS中,ROM BIOS一般是在FEOOOhFFFFFh),,而此處的內(nèi)容則是一個(gè)

jump指令,,jump到另一個(gè)位於ROM BIOS中的位置,開始執(zhí)行一系列的動(dòng)作,,包

括了檢查RAM,,keyboard,顯示器,,軟硬磁盤等等,,這些動(dòng)作是由系統(tǒng)測(cè)試代碼

(system test code)來執(zhí)行的,隨著制作BIOS廠商的不同而會(huì)有些許差異,,但都

是大同小異,,讀者可自行觀察自家機(jī)器開機(jī)時(shí),螢?zāi)簧纤@示的檢查訊息,。

  緊接著系統(tǒng)測(cè)試碼之后,,控制權(quán)會(huì)轉(zhuǎn)移給ROM中的啟動(dòng)程序

(ROM bootstrap routine),這個(gè)程序會(huì)將磁盤上的第零軌第零扇區(qū)讀入

內(nèi)存中(這就是一般所謂的boot sector,,如果你曾接觸過電腦病

毒,,就大概聽過它的大名),至於被讀到內(nèi)存的哪里呢? --絕對(duì)

位置07C0:0000(07C00h),,這是IBM系列PC的特性,。而位在linux開機(jī)

磁盤的boot sector上的正是linuxbootsect程序,,也就是說,bootsect

第一個(gè)被讀入內(nèi)存中并執(zhí)行的程序?,F(xiàn)在,我們可以開始來

看看到底bootsect做了什么,。

第一步

 首先,,bootsect將它"自己"從被ROM BIOS載入的絕對(duì)地址0x7C00處搬到

0x90000處,然后利用一個(gè)jmpi(jump indirectly)的指令,,跳到新位置的

jmpi的下一行去執(zhí)行,,

第二步

 接著,將其他segment registers包括DS,,ES,,SS都指向0x9000這個(gè)位置,

CS看齊,。另外將SPDX指向一任意位移地址( offset ),,這個(gè)地址等一下

會(huì)用來存放磁盤參數(shù)表(disk para- meter table )

第三步

 接著利用BIOS中斷服務(wù)int 13h的第0號(hào)功能,重置磁盤控制器,,使得剛才

的設(shè)定發(fā)揮功能,。

 

第四步

 完成重置磁盤控制器之后,bootsect就從磁盤上讀入緊鄰著bootsectsetup

程序,,也就是setup.S,,此讀入動(dòng)作是利用BIOS中斷服務(wù)int 13h的第2號(hào)功能。

setupimage將會(huì)讀入至程序所指定的內(nèi)存絕對(duì)地址0x90200處,,也就是在內(nèi)存

中緊鄰著bootsect 所在的位置,。待setupimage讀入內(nèi)存后,利用BIOS中斷服

務(wù)int 13h的第8號(hào)功能讀取目前磁盤的參數(shù),。

第五步

 再來,,就要讀入真正linuxkernel了,也就是你可以在linux的根目錄下看

到的"vmlinuz" ,。在讀入前,,將會(huì)先呼叫BIOS中斷服務(wù)int 10h 的第3號(hào)功能,

讀取游標(biāo)位置,,之后再呼叫BIOS 中斷服務(wù)int 10h的第13h號(hào)功能,,在螢?zāi)簧陷?/font>

出字串"Loading",這個(gè)字串在boot linux時(shí)都會(huì)首先被看到,,相信大家應(yīng)該覺

得很眼熟吧,。

第六步

 接下來做的事是檢查root device,之后就仿照一開始的方法,,利用indirect

jump 跳至剛剛已讀入的setup部份

比較

  把大家所熟知的MS DOS linux的開機(jī)部份做個(gè)粗淺的比較,,MS DOS 由位於

磁盤上boot sectorboot程序負(fù)責(zé)把IO.SYS載入內(nèi)存中,,而IO.SYS則負(fù)有把DOS

kernel --MSDOS.SYS載入內(nèi)存的重責(zé)大任。而linux則是由位於boot sector

bootsect程序負(fù)責(zé)把setuplinuxkernel載入內(nèi)存中,,再將控制權(quán)交給setup,。

##這幾步內(nèi)容主要參照一個(gè)臺(tái)灣同胞寫的文檔,setup.s的內(nèi)容希望有人補(bǔ)充,。

 

 

start_kernel()

當(dāng)核心被載入后,,首先進(jìn)入的函數(shù)就是start_kernel

./init/main.c 中函數(shù)start_kernel包含核心的啟動(dòng)過程及順序,。

通過它來看核心整個(gè)初始化過程,。

首先進(jìn)行一系列初始化,包括:

trap_init(); ##./arch/i386/kernel/traps.c 陷入

init_IRQ(); ##./arch/i386/kernel/irq.c setup IRQ

sched_init(); ##./kernel/sched.c 調(diào)度初始化,,并初始化bottom_half

time_init(); ##./arch/i386/kernel/time.c

init_modules(); ##模塊初始化

mem_init(memory_start,memory_end);

buffer_init(); ## ./fs/buffer.c 緩沖區(qū)

sock_init(); ## ./net/socket.c socket初始化,,并初始化各協(xié)議(TCP等)

ipc_init();

sysctl_init();

然后通過調(diào)用kernelthread()產(chǎn)生init進(jìn)程,全權(quán)交由init進(jìn)程處理,。調(diào)用cpu_idle(NULL)休息,。

感興趣又有時(shí)間的同志可以寫一個(gè)startkernel()函數(shù)的詳細(xì)分析報(bào)告。

 

 

 

下面看一看init進(jìn)程的工作:

首先創(chuàng)建進(jìn)程

bdflush ##./fs/buffer.c 緩沖區(qū)管理

kswapd ##./mm/vmscan.c 虛擬內(nèi)存管理

這兩個(gè)進(jìn)程非常重要

系統(tǒng)初始化(系統(tǒng)調(diào)用setup

系統(tǒng)初始化包含設(shè)備初始化及各文件系統(tǒng)初始化,。

sys_setup ./fs/filesystems.c

|

|-device_setup

| |

| -- chr_dev_init(); ##字符設(shè)備

| blk_dev_init(); ##塊設(shè)備

| scsi_dev_init(); ##SCSI

| net_dev_init(); ##網(wǎng)絡(luò)設(shè)備

| console_map_init(); ##控制臺(tái)

|-binfmt_setup();

|-init_nls() ##各文件系統(tǒng)初始化

|-init_ext_fs()

|-init_ext2_fs()

. .

. .

. .

|-init_autofs_fs()

--mount_root() ##mount root fs

##從這兒看看設(shè)備及文件的初始化順序,,加入我們的設(shè)備時(shí)就有了大局觀。

執(zhí)行/etc/rc ( rc.sysinit, rc.local, rc.# )

執(zhí)行/bin/sh

______________________________________________________

END

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多