Linux核心開發 最簡單的Makefile

2022-10-10 05:57:07 字數 1927 閱讀 2627

最簡單的linux驅動程式**至少需要乙個makefile,乙份源**,本文簡單解釋makefile中的各個make target的意義。這裡只是介紹乙個簡單的基礎的makefile,生產環境需要更好的makefile模板和構建工具。

示例:obj-m += helloword.o

pwd := $(shell pwd)

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

all:

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

install:

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

clean:

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

乙個target的基本語法是:

target: [dependent-source-file(s)]

rule(s)

the rule(s) instances are always prefixed with a [tab] character, not white space.

obj-m:以核心模組的形式單獨編譯。

以all為例,展開後的編譯規則是:

make -c /lib/modules/$(shell uname -r)/build/ m=$(pwd) modules

-c 引數告訴make把工作目錄切換到 /lib/modules/$(shell uname -r)/build/目錄,然後首先解析該目錄下的makefile。這保證了當前編譯的模組與核心是適配的——使用相同的編譯連線引數。然後是m引數m=$(pwd),核心使用這個變數來確定要構建的外部模組的目錄,完成核心的編譯配置的讀取後,在這個目錄裡完成模組的編譯。

標頭檔案的路徑要提供給makefile,讓make知道去**找到他們。所以得先準備標頭檔案。linux發行版一般都會準備好標頭檔案。檢視當前已安裝的核心標頭檔案:

$ dpkg -l | grep linux-headers | awk ''

ii linux-headers-5.13.0-37-generic

ii linux-headers-5.13.0-39-generic

ii linux-headers-5.4.0-107

ii linux-headers-5.4.0-107-generic

ii linux-headers-generic    (這是個啥)

ii linux-headers-generic-hwe-20.04

$ apt search linux-header #a long list

$ sudo apt install linux-headers-generic

$ sudo apt install linux-headers-$(uname -r) #安裝當前核心版本的標頭檔案

安裝完成的核心檔案可以在/lib/modules/$(uname -r)/build

$ ls -l /lib/modules/$(uname -r)/

total 5552

lrwxrwxrwx 1 root root 39 nov 12 16:16 build -> /usr/src/linux-headers-

5.0.0-36-generic/

如果是自己編譯的核心,編譯完成後,在源**目錄:

$ make headers_install

或者直接引用原始碼目錄。

引用的核心檔案能直接引用「原始狀態」的原始碼包麼?不能,因為編譯驅動時需要根據具體的核心選項來決定一些**如何編譯,cpu架構,大端還是小端等,這些都要依賴核心的配置。編譯前當然要配置一下核心,生成預設配置 .config ,這個檔案是設定 cpu 架構,及很多其他驅動選項的,沒有個這個檔案無法編譯的。

linux裝置驅動開發

乙個最簡單的Linux核心模組

include include static int init hello init void static void exit hello exit module init hello init module exit hello exit module license gpl 這個最簡單的核心模...

最簡單的核心模組例子

include include include static int init hello init void static void exit hello exit void module init hello init module exit hello exit static int init...

最簡單Linux核心和驅動考試題

填空題 linux的裝置驅動分為 三類,串列埠是什麼型別裝置 2.下面的程式,在ubuntu pc的terminal執行,列印幾個hello main 3.用 連線程序的如下4個記憶體描述形式,分析它們之間的大小關係 vss rss pssrss usspss 4.下面這個程式,三次列印的data分...