這是一篇比較詳盡的核心編譯說明(轉)

post0發表於2007-08-09
這是一篇比較詳盡的核心編譯說明(轉)[@more@]

Linux 核心編譯說明

1.Linux核心原始碼結構:

核心原始碼中主要包含以下子目錄:

arch :包含了與體系結構相關的程式碼

對應於每一個支援的體系結構,有一個相應的子目錄如i386、arm、alpha等。

其每個體系結構子目錄下包含幾個主要的子目錄:

kernel :包含與體系結構相關的核心程式碼

mm : 包含與體系結構相關的記憶體管理程式碼

lib : 包含與體系結構相關的庫程式碼

documentation:包含核心的文件

drivers :包含裝置驅動程式碼。每類裝置有相應的子目錄,如char 、block、net等

fs : 包含檔案系統的程式碼。每個支援的檔案系統有相應的子目錄,如 ext2、proc等

include :核心標頭檔案,對每一種體系結構,分別有相應的子目錄。

init : 包含核心初始化程式碼

lib : 包含核心的庫程式碼

mm :包含記憶體管理程式碼

kernel :包含核心管理程式碼

net :包含網路部分的程式碼

2.系統引導的過程

在pc機上系統啟動過程:

系統加電以後bois對系統完成監測設定後將控制權交給硬碟上MBR中的 BootLoader在這裡即是lilo或grub等。

BootLoader 將作業系統程式碼調入記憶體,然後將控制權交給arch/i386/boot中的Setup.S這段程式。

Setup.S 這段程式在386真實模式下對系統進行基本的檢測和設定後轉入保護模式把控制權交給Head.S

Head.S 建立記憶體管理和中斷管理的框架後呼叫init/main.c中的start_kernel()函式在start_kernel執行完成後使用者就可以登入和使用linux了。Start_kernel()函式在init/main.c 中定義。

Start_kernel的流程中的主要步驟:

setup_arch(&command_line); 用於和處理器、記憶體等最基本的硬體相關部分的初始化。 在 arch/i386/kernel/setup.c 中定義;

parse_options(command_line); 把啟動時得到的引數從命令列的字串中分離出來並賦給相應的變數。在 init/main.c 中定義;

trap_init(); 對中斷向量表進行初始化。在 arch/i386/kernel/trap.c 中定義;

init_IRQ(); 與中斷有關的初始化, 在 arch/i386/kernel/i8259.c 中定義;

sched_init(); 程式排程初始化。 在 kernel/sched.c 中定義;

softirq_init(); 在 kernel/softirq.c 中定義;

time_init(); 時間部分初始化。 在 arch/i386/kernel/time.c 中定義;

console_init(); 對終端初始化。 在 drivers/char/tty_io.c 中定義;

buffer_init(mempages); 對用於指示塊快取的buff free list 初始化。 在fs/buffer.c 中定義;

mem_init(); 記憶體管理初始化。 在 arch/i386/mm/init.c中定義;

rest_init(); 此函式中呼叫

kernel_thread(init,NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL)函式時會呼叫init/main.c中的init()函式在init()函式中將會建立dbflush、kswapd兩個新的核心執行緒。初始化tty1裝置。尋找/etc/init或/sbin/init 或/bin/init來建立一個init程式。

Init程式根據/etc/inittab檔案進行檔案系統檢查、啟動系統守護程式為聯機終端建立getty程式,執行/etc/rc下的命令檔案。

此後getty會在終端上顯示login提示符,以等待使用者登入。

3.使用make建立核心

1.使用make menuconfig命令:

使用以下編譯選項:

Processor type and features ---&gt

(Pentium-Pro/Celeron/Pentium-II) Processor family

(3GB) Maximum Virtual Memory

General setup ---&gt

(ELF) Kernel core (/proc/kcore) format

[*] Kernel support for ELF binaries

File systems ---&gt

[*] /proc file system support

[*] Second extended fs support

ATA/IDE/MFM/RLL support ---&gt

[*] ATA/IDE/MFM/RLL support

[*] Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support

[*] Include IDE/ATA-2 DISK support

Character devices ---&gt

[*] Virtual terminal

Console drivers ---&gt

[*] VGA text console

生成核心bzImage 大小為 309892 byte;

此核心可在pc上成功引導系統

此命令生成一個檔案 .config 其中根據你在menuconfig中的選擇定義了相應的變數。在Makefile檔案中將會包含這個檔案。

2.使用make dep命令 建立依賴關係。

3.使用make bzImage 命令建立核心。

如設定正確將在arch/i386/boot/目錄下生成核心bzImage檔案

4.make bzImage的流程簡單說明

當我們使用make命令時,make程式將首先找到當前目錄下的Makefile檔案。根據Makefile檔案的語法進行處理。

在主Makefile檔案中包含了arch/i386/Makefile我們make的目標bzImage即在該檔案中定:

bzImage: vmlinux

@$(MAKEBOOT) bzImage #此命令將解釋為:make -C arch/i386/boot bzImage

現在make需要先去建立目標 vmlinux 然後再執行 arch/i386/boot/ 目錄下的 make bzImae。我們現在假設vmlinux目標已生成,則 arch/i386/boot目錄下的make程式將執行如下操作:

tools/build -b bbootsect bsetup compressed/bvmlinux.out ./ bzImage

即將vmlinux 用 tools/build工具壓縮成目標檔案 bzImage(在此過程中,還會構建build 程式,將vmlinux轉換成bvmlinux.out等,可參考tools 和 compressed目錄下的Makefile檔案)。

生成vmlinux目標:

在主目錄下Makefile檔案中vmlinux生成規則如下:

vmlinux: $(CONFIGURATION) init/main.o init/version.o linuxsubdirs

$(LD) $(LINKFLAGS) $(HEAD) init/main.o init/version.o

--start-group

$(CORE_FILES)

$(DRIVERS)

$(NETWORKS)

$(LIBS)

--end-group

-o vmlinux #生成vmlinux

$(NM) vmlinux |grep –v (compiled)|(.o$$)|( [aUw] )|(..ng$$)|(LASH[RL]DI) | sort > System.map #此命令根據vmlinux生成System.map檔案

在當前設定下此ld連線命令被解釋為:

ld -m elf_i386 -T /home/arm/linux/arch/i386/vmlinux.lds -e stext arch/i386/kernel/head.o arch/i386/kernel/init_task.o init/main.o init/version.o --start-group arch/i386/kernel/kernel.o arch/i386/mm/mm.o kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o drivers/char/char.o drivers/block/block.o drivers/misc/misc.o drivers/net/net.o drivers/media/media.o drivers/ide/idedriver.o drivers/video/video.o net/network.o /home/arm/linux/arch/i386/lib/lib.a /home/arm/linux/lib/lib.a /home/arm/linux/arch/i386/lib/lib.a --end-group -o vmlinux

即連線程式ld 將各個.o檔案連線成目標檔案 vmlinux 。

此命令中用到的各個 .o檔案make程式會根據Makefile檔案的規則去自動生成,下面簡單介紹一下由ipc目錄生成ipc.o過程:

其ipc目錄下Makefile檔案內容如下:

O_TARGET := ipc.o

obj-y := util.o

obj-$(CONFIG_SYSVIPC) += msg.o sem.o shm.o

include $(TOPDIR)/Rules.make #包含的Rules.make檔案中為通用的規則;

如我們在make menuconfig時選中了SYSVIPC選項,則 .config檔案中將定義變數 CONFIG_SYSVIPC=y; 則obj-y 就等於util.o msg.o sem.o shm.o;根據Rules.make將四個.c檔案編譯為 .o檔案。再將四個.o檔案連線成 ipc.o檔案。在我們的當前設定中沒有選擇SYSVIPC;將只使用util.o一個檔案生成目標 ipc.o ;而util.o由util.c生成。

當所有需要的.o檔案生成以後,由ld將其連線生成vmlinux檔案,再將其壓縮成我們所需要的核心檔案 bzImage。Make程式就執行完了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-938845/,如需轉載,請註明出處,否則將追究法律責任。

相關文章