Presentation is loading. Please wait.

Presentation is loading. Please wait.

Linux核心編譯與模組管理 2013/01/19.

Similar presentations


Presentation on theme: "Linux核心編譯與模組管理 2013/01/19."— Presentation transcript:

1 Linux核心編譯與模組管理 2013/01/19

2 gcc與make GNU Complier Collection make
GNU專案所開發的重要工具之一,包含了C / C++ / Obj-c / Fortran / Java / Ada / Go 編譯/直譯器 此編譯器原要設計給GNU OS使用,目前已成為linux 核心的主要編譯工具 make 自動化編譯工具,主要功能為呼叫相關程式以完成將 程式碼轉為標的(物件檔, 可執行檔)的工作 程式設計者常撰寫一個名為Makefile文本,再執行 make以執行此文本中的編譯步驟。

3 gcc編譯流程 編譯(compilation)
將原始碼(高階程式語言)轉換成目的碼(可執行的機器 碼)的過程,一個完整的編譯流程可能包含了前置處 理、編譯、優化、匯編、連結 *.a *.so Pre-processing (cpp) Compilation (gcc) Assembly (as) Src code (*.c) Linking (ld) *.i *.s *.o Header (*.h) *.a *.so pre-processed file assembly file object file

4 gcc程式編譯常用命令 – 1/2 編譯原始檔成為可執行檔 編譯原始檔成為物件檔(*.o) (不連結凾式庫)
編譯原始檔成為組合語言(*.s) ~$ gcc hello.c -o hello ~$ gcc hello.c -c ~$ gcc hello.c -S

5 gcc程式編譯常用命令 – 2/2 增加標頭檔(*.h)參考的位置 增加函式庫(*.a, *.so)的位置 -I[路徑]
– L[路徑] –l[函式庫名稱] or ~$ gcc –I/my/include hello.c -o hello ~$ gcc hello.c -o hello –L/my/lib –lm ~$ gcc hello.c -o hello –Llibm.a

6 Makefile 範例 Makefile固定格式 CC=gcc INCL_DIR=. LIB=-lm all:
${CC} –c hello.c –I${INCL_DIR} ${CC} –c world.c –I${INCL_DIR} ${CC} *.o -o app ${LIB} hello: ${CC} –c hello.c world: ${CC} –c world.c clean: rm -f app *.o *~ 範例檔:

7 Linux核心 簡介 介於軟體和硬體之間,也就是作業系統(Operating System),負責處理所有系統指令。包括硬碟的控制、記 憶體管理、行程管理、檔案系統、網路功能等等。

8 Linux核心原始碼 – 1/2 取得核心原始碼 Linux kernel

9 Linux核心原始碼 – 2/2 核心原始碼資料夾 名稱 說明 arch 各廠牌CPU的驅動程式支援 block
所有SCSI與外接區塊裝置的驅動程式與策略管理 crypto 所有作業系統與驅動程式需要的編碼函式庫。舉例來說:ISCSI驅動程式可能需要CRC32c、Linux本身則需要MD5, SHA-128等等… drivers 各種作業系統提供的實體或虛擬裝置的驅動程式 firmware 提供一些沒有原始碼的驅動程式。例如RAID、網路卡等等 net, sound 各廠牌網路卡/音效卡驅動程式 mm, virt 虛擬記憶體管理策略 lib 基本作業系統需要的C語言函式庫,例如:memcpy, printk等 kernel 作業系統的主程式碼 init 開機後第一支程序init的程式碼 security Linux的使用者權限管理程式碼

10 編譯前的準備 – 1/2 下載核心原始碼檔案 安裝編譯工具 cd /usr/src ~$ sudo wget [核心位址].tar.gz
# 解壓縮 ~$ sudo tar -xvzf [核心].tar.gz 或 sudo tar -xvjf [核心].tar.bz2 # 準備核心的設定檔.config ~$ sudo cp /boot/config-’uname -r’ .config 安裝編譯工具 ~> sudo apt-get install build-essential kernel-package libncurses5-dev fakeroot

11 編譯前的準備 – 2/2 加上更新檔(patch檔) 如何製作自己的更新檔?
對Linux的核心而言,patch檔通常是放在核心原始碼的 目錄中,然後執行(以核心3.7.2為例): 如果要還原更新檔更新的部分,則使用: 如何製作自己的更新檔? diff -uN [舊檔案] [新檔案] > test.patch ~/usr/src/linux-3.7.2#> patch -p1 < patch ~/usr/src/linux-3.7.2#> patch -RE -p1 < patch

12 編譯核心 – UBUNTU Way (1) 設定核心編譯選項 (2) 編譯核心前需先清除先前可能已編過的物件檔
~$ make menuconfig # 在 menuconfig 選單內,讀進剛複製的.config作為範本 (2) 編譯核心前需先清除先前可能已編過的物件檔 ~$ fakeroot make-kpkg clean (3) 編譯核心並製成Debian封裝檔 ~$ fakeroot make-kpkg --initrd kernel_image kernel_headers # 得到核心安裝檔 (4) 安裝核心 ~$ sudo dpkg –i *. deb (5) 建立initrd檔案並更新GRUB ~$ sudo update-initramfs -c -k [核心版本] ~$ update-grub

13 模組編譯與使用 – 1/3 (1) 設定模組編譯選項 (2) 編譯模組 (3) 安裝編好的模組 ~# make menuconfig
# 在menuconfig的選單中,將想編成模組的功能標為<M> (2) 編譯模組 ~# make modules (3) 安裝編好的模組 ~# sudo make install modules

14 模組編譯與使用 – 2/3 模組的載入(insmod)與移除(rmmod) 檢視模組 範例:載入一個模組 範例:移除一個模組
檢視所有已安裝的模組(分散於/lib/modules/$(uname -r)中) 檢視目前被使用的模組 ~# insmod [模組檔案] ~# modprobe [模組名稱] ~# rmmod [模組名稱] ~# modprobe -l ~# lsmod

15 模組編譯與使用 – 3/3 編譯單一模組 在下載的核心原始碼目錄中,使用指令:
例如:要編譯fat模組讓Linux支援Windows的FAT16格 式,指令如下: ~# make modules SUBDIRS=[模組相對路徑] ~# cd /usr/src/linux-3.7.2/ ~# make modules SUBDIRS=driver/i2c

16 實作專題01 試著將XFS編成模組,並在開機時載入使Linux支 援XFS檔案系統


Download ppt "Linux核心編譯與模組管理 2013/01/19."

Similar presentations


Ads by Google