ldd3第二章 建立核心原始碼樹,編譯模組

2021-06-23 02:13:24 字數 4472 閱讀 6356

ubuntu編譯核心樹 

首先我實驗的hello和scull模組都不需要建立核心原始碼樹,只需系統自帶的標頭檔案就可。

ubuntu:10.04

1確認你當前使用ubuntu系統的核心版本

當模組**要鏈結至不同版本的核心時,必須要做的就是對這個模組**重新進行編譯。這是因為模組對某一版本核心中定義的一些資料結構以及函式原型等都具有很強的信賴性,而模組所訪問的核心介面因核心版本的不同而不同。所以在建立自己當前的核心樹前一定要檢視當前pc上使用的的linux核心版本,然後再建立針對此版本的核心樹。如果版本不對會出現一些錯誤,如當前我的系統核心版本為:

2.6.32-21-generic

但是我用其它版本的核心原始碼來建立核心樹,那麼會導致在我當前核心版本(即2.6.32-21-generic下)執行insmod *.ko操作時會發生如下錯誤:

error inserting './hello.ko': -1 invalid module format

切記!~~~

2如在系統的terminal中輸入:

zhm@o_o:/lib/modules$uname -r

響應:2.6.32-21-generic   //這是顯示當前系統所使用的核心版本

zhm@o_o:/lib/modules$ apt-cache search linux-source (注意,此時不能以root身份操作)

響應:linux-source - linux kernel source with ubuntu patches

linux-source-2.6.32 - linux kernel source for version 2.6.32 with ubuntu patches

zhm@o_o:/lib/modules$ sudo apt-get install linux-source-2.6.32

於是我們得到:linux-source-2.6.32.tar.bz2

4解壓

將linux-source-2.6.32.tar.bz2 核心原始碼在/usr/src中解壓:

zhm@o_o:/usr/src/$ sudo tar jxvf linux-source-2.6.32.tar.bz2

然後進入其目錄

zhm@o_o:/usr/src$   cd 

linux-source-2.6.32

zhm@o_o:/usr/src/linux-source-2.6.32$

5配置編譯核心

我採用的是最快速的配置(即預設)的方式:

zhm@o_o:/usr/src/linux-source-2.6.32$sudo make oldconfig

我用的 是 cp ../linux-headers-2.6.32-38-generic/.config .config

上面步驟完成後,開始進行make, 此步要花很長時間,你可以去幹其它事情了,一般要1-2小時吧

zhm@o_o:/usr/src/linux-source-2.6.32$

sudo make

-j4執行結束後會在當前資料夾下生成乙個vmlinux的檔案, 其屬性為-rwxr-xr-x

然後編譯模組:

zhm@o_o:/usr/src/linux-source-2.6.32$sudo make modules

最後一步,安裝模組:

zhm@o_o:/usr/src/linux-source-2.6.32$sudo make modules_install

執行成功後,緊接著會在/lib/modules下生成乙個2.6.32-21-generic資料夾,資料夾中含有build及source檔案,這兩個檔案就是我們在編譯模組時在makefile中需要用到的,它們實際上是鏈結檔案,指向我們在建立核心樹時的那個目錄:/usr/src實際上這個目錄也就是我們要建立的核心樹了,如下所示:

zhm@o_o:/lib/modules/2.6.32-21-generic$ ls -la

總用量 3712

drwxr-xr-x 3 root root   4096 2010-09-29 14:12 .

drwxr-xr-x 5 root root   4096 2010-09-29 14:09 ..

lrwxrwxrwx 1 root root     24 2010-09-29 14:09 

b uild -> /usr/src/linux-source-2.6.32

drwxr-xr-x 9 root root   4096 2010-09-29 14:11 kernel

-rw-r--r-- 1 root root 599140 2010-09-29 14:12 modules.alias

-rw-r--r-- 1 root root 576280 2010-09-29 14:12 modules.alias.bin

-rw-r--r-- 1 root root     69 2010-09-29 14:12 modules.ccwmap

-rw-r--r-- 1 root root 269377 2010-09-29 14:12 modules.dep

-rw-r--r-- 1 root root 396085 2010-09-29 14:12 modules.dep.bin

-rw-r--r-- 1 root root   1405 2010-09-29 14:12 modules.ieee1394map

-rw-r--r-- 1 root root    218 2010-09-29 14:12 modules.inputmap

-rw-r--r-- 1 root root  24732 2010-09-29 14:12 modules.isapnpmap

-rw-r--r-- 1 root root     74 2010-09-29 14:12 modules.ofmap

-rw-r--r-- 1 root root 103687 2010-09-29 14:09 modules.order

-rw-r--r-- 1 root root 405322 2010-09-29 14:12 modules.pcimap

-rw-r--r-- 1 root root   1597 2010-09-29 14:12 modules.seriomap

-rw-r--r-- 1 root root 218944 2010-09-29 14:12 modules.symbols

-rw-r--r-- 1 root root 284287 2010-09-29 14:12 modules.symbols.bin

-rw-r--r-- 1 root root 870799 2010-09-29 14:12 modules.usbmap

lrwxrwxrwx 1 root root     24 2010-09-29 14:09source -> /usr/src/linux-source-2.6.3 2

問題來了:我的/lib/modules下面有2.6.32-38-generic和2.6.32.63+drm33.26   兩個資料夾經檢視,2.6.32.63+drm33.26才是我剛建立的核心原始碼樹,那2.6.32-38-generic一定是系統自帶的頭檔案目錄了,那麼系統預設使用的還是2.6.32-38-generic,這個資料夾名稱是在原始碼根目錄下的makefile裡定義的,模組指定的目錄在makefile裡kerneldir ?= /lib/modules/$(shell uname -r)/build定義其實對應的是系統預設使用的

2.6.32-38-generic,所以不是我們編譯的。

後面的操作就簡單了,在makefile檔案中指定編譯時核心樹路徑即可,下面為一段簡單的makefile原始碼:

# if kernelrelease is defined, we've been invoked from the

# kernel build system and can use its language.

ifneq ($(kernelrelease),)

obj-m := hello.o 

# otherwise we were called directly from the command

# line; invoke the kernel build system.

else

kerneldir ?= /lib/modules/$(shell uname -r)/build

pwd  := $(shell pwd)

default:

$(make) -c $(kerneldir) m=$(pwd) modules

endif

後面的事就簡單了,寫好模組**,寫好makefile,直接在terminal輸make就可以編譯成*.ko檔案了。

LDD3讀書筆記(第二章)

從第二章開始要涉及到程式設計的內容,本章主要以模組程式設計和核心程式設計,我們將構造乙個簡單的模組。hello world hello world 是我們接觸程式設計最為簡單的程式,我們講述的是核心模組程式設計而不是應用程式程式設計,下面給大家看乙個完整的模組 include include mod...

STL原始碼第二章 allocator

ifndef pch h define pch h include include include for ptrdiff t,size t include for exit include for uint max include namespace jj return tmp template ...

菜鳥分析php原始碼 第二章

入口檔案 1 sapi cli php cli.c 619 main入口檔案 784 呼叫php cli startup 呼叫php module startup 2 main main.c 1643 php module startup 1710 zend startup zuf,null,1 3...