⑴ linux為什麼寫好一個內核模塊要依靠內核源碼的的makefile來編譯
編譯還是用 gcc編譯,make只是根據文件依賴的關系,構建出一個DAG,然後按照拓撲排序的順序,編譯源文件,如果源文件比它的依賴文件老,則會自動編譯。make不是編譯器,它只是調用gcc自動完成編譯,省得你一行行的敲gcc命令。尤其是大型工程,需要這種自動編譯的工具。理解了嗎?
⑵ 關於Linux內核編譯中的Makefile
Makefile分析需要先找到它的目標,目標下面就是生成這個目標的依賴文件,clean後面目標依賴為空,所以它後面的命令只有在執行make
clean
的時候才會進入其中,執行刪除操作。
⑶ makefile文件中包含哪三方面
1. 配置系統的基本結構Linux內核的配置系統由三個部分組成,分別是:
1. Makefile:分布在 Linux 內核源代碼中的 Makefile,定義 Linux 內核的編譯規則;
2. 配置文件(config.in):給用戶提供配置選擇的功能;
3. 配置工具:包括配置命令解釋器(對配置腳本中使用的配置命令進行解釋)和配置用戶界面(提供基於字元界面、基於 Ncurses 圖形界面以及基於 Xwindows
圖形界面的用戶配置界面,各自對應於 Make config、Make menuconfig 和 make xconfig)。
這些配置工具都是使用腳本語言,如 Tcl/TK、Perl 編寫的(也包含一些用 C 編寫的代碼)。本文並不是對配置系統本身進行分析,而是介紹如何使用配置系統。所以,除非是配置系統的維護者,一般的內核開發者無須了解它們的原理,只需要知道如何編寫
Makefile 和配置文件就可以。所以,在本文中,我們只對 Makefile 和配置文件進行討論。另外,凡是涉及到與具體 CPU 體系結構相關的內容,我們都以
ARM 為例,這樣不僅可以將討論的問題明確化,而且對內容本身不產生影響。
2. Makefile
2.1 Makefile 概述Makefile
的作用是根據配置的情況,構造出需要編譯的源文件列表,然後分別編譯,並把目標代碼鏈接到一起,最終形成 Linux 內核二進制文件。
由於 Linux 內核源代碼是按照樹形結構組織的,所以 Makefile 也被分布在目錄樹中。Linux 內核中的 Makefile 以及與 Makefile 直接相關的文件有:
1. Makefile:頂層 Makefile,是整個內核配置、編譯的總體控制文件。
2. .config:內核配置文件,包含由用戶選擇的配置選項,用來存放內核配置後的結果(如 make config)。
3. archMakefile 還作了擴充。
⑷ Linux Kernel Makefiles介紹
本文介紹 Linux 內核 Makefiles 的一些基礎內容。
Makefiles 包括:
Linux 內核頂層的 Makefile 文件遞歸訪問內核源代碼的子目錄。
每個子目錄都有一個 kbuild Makefile 文件,根據 .config 文件內容構建內置或模塊化目標。
arch/$(ARCH)/Makefile 文件向頂層 Makefile 提供特指定的體系結構信息。
scripts/Makefile.* 文件定義了 kbuild Makefile 構建內核的所有定義和規則等。
Linux 內核編譯完成後,最終生成 vmlinux 和 moles 。
Linux 內核中的大多數 Makefile 都使用 kbuild 基礎結構, kbuild 文件的首選名稱是 Makefile 。如果 Makefile 和 kbuild 文件都存在,則使用 kbuild 文件。
目標定義是 kbuild Makefile 里的核心部分,定義了要構建的文件、特殊的編譯選項和遞歸輸入的任何子目錄。
例:
kbuild Makefile 將編譯所有 $(obj-y) 文件,然後調用 $(AR)rcSTP 將這些文件合並到 built-in.a 文件中。
built-in.a 中不包括符號表,稍後將通過 scripts/link-vmlinux.sh 腳本鏈接到 vmlinux 文件中。
在 Linux 內核引導期間,將按照鏈接順序調用某些函數(例: mole_init() 等)。
參考:
Documentation/kbuild/makefiles.txt
⑸ 不修改Linux內核文件,直接用makefile編譯驅動,是不是要先把內核編譯一遍
不需要重新編譯內核。需要重新製作文件系統,如果你的文件系統是nfs掛載的,那麼你只需要將
micro2440_leds.ko復制過去,然後insmod進去。
⑹ linux內核中makefile的使用
obj-$(CONFIG_EXT2_FS) += ext2.o :表來示當 CONFIG_EXT2_FS 為 y 是 ext2.0 將會編譯進內核,自CONFIG_EXT2_FS 是你自己配置linux(make menuconfig)時選擇是 y,還是其他的,如果不理解的話,你 一下linux kconfig 文件。
ext2-y := balloc.o bitmap.o ....:表示 ext2.o 由後面的那些 .o 文件鏈接而來。
ext2-$(CONFIG_EXT2_FS_POSIX_ACL) += acl.o :$(CONFIG_EXT2_FS_POSIX_ACL) 和上面解釋的一樣的意思,如果為 y 則把 acl.o 也鏈接進 ext2.o ,注意:+= 表示在原有的基礎上增加。
obj-$(CONFIG_ISDN) += isdn.o:同上。
isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o:isdn.o是由後面的文件鏈接而來。
⑺ linux內核makefile問題:
內核配置完畢後,會在你源碼樹的根目錄下生成.config文件。
用Vi打開可以看到所有的配置選項。
⑻ linux內核模塊編譯-通過Makefile重命名.ko文件名和模塊名
假設模塊的源文件為hello.c,源碼如下:
使用該文件編譯內核模塊。
正常情況下,Makefile文件內容如下:
執行 make 命令,生成hello.ko文件。
執行 sudo insmod hello.ko 命令,安裝該模塊。
執行 lsmod 命令,查看安裝的模塊。就會看到第一行的就是hello模塊。
但是,如果想自定義模塊名稱為 xmole ,而不是默認的 hello ,如何實現呢?方法如下:
在Makefile中重命名obj-m並將obj-m的依賴關系設置為原始模塊(hello)
修改後的Makefile文件內容如下:
將obj-m設置為 xmole .o,並使 xmole .o依賴於 hello .o.
執行 make 命令後,生成 xmole .ko, 而不是 hello .ko,
安裝命令: sudo insmod xmole.ko
查看命令: lsmod ,就會看到被安裝名為 xmole 的模塊。
⑼ Linux中編寫了內核模塊的C源程序之後怎麼編寫makefile文件的內容
make命令執行時,需要一個 Makefile 文件,以告訴make命令需要怎麼樣的去編譯和鏈接程序。
首先,我們用一個示例來說明Makefile的書寫規則。以便給大家一個感興認識。這個示例來源於GNU的make使用手冊,在這個示例中,我們的工程有8個C文件,和3個頭文件,我們要寫一個Makefile來告訴make命令如何編譯和鏈接這幾個文件。我們的規則是:
1)如果這個工程沒有編譯過,那麼我們的所有C文件都要編譯並被鏈接。
2)如果這個工程的某幾個C文件被修改,那麼我們只編譯被修改的C文件,並鏈接目標程序。
3)如果這個工程的頭文件被改變了,那麼我們需要編譯引用了這幾個頭文件的C文件,並鏈接目標程序。
只要我們的Makefile寫得夠好,所有的這一切,我們只用一個make命令就可以完成,make命令會自動智能地根據當前的文件修改的情況來確定哪些文件需要重編譯,從而自己編譯所需要的文件和鏈接目標程序。
一、Makefile的規則
在講述這個Makefile之前,還是讓我們先來粗略地看一看Makefile的規則。
target ... : prerequisites ...
command
...
...
target也就是一個目標文件,可以是Object File,也可以是執行文件。還可以是一個標簽(Label),對於標簽這種特性,在後續的「偽目標」章節中會有敘述。
prerequisites就是,要生成那個target所需要的文件或是目標。
command也就是make需要執行的命令。(任意的Shell命令)
這
是一個文件的依賴關系,也就是說,target這一個或多個的目標文件依賴於prerequisites中的文件,其生成規則定義在command中。說
白一點就是說,prerequisites中如果有一個以上的文件比target文件要新的話,command所定義的命令就會被執行。這就是
Makefile的規則。也就是Makefile中最核心的內容。
說到底,Makefile的東西就是這樣一點,好像我的這篇文檔也該結束了。呵呵。還不盡然,這是Makefile的主線和核心,但要寫好一個Makefile還不夠,我會以後面一點一點地結合我的工作經驗給你慢慢到來。內容還多著呢。:)
二、一個示例
正如前面所說的,如果一個工程有3個頭文件,和8個C文件,我們為了完成前面所述的那三個規則,我們的Makefile應該是下面的這個樣子的。
edit : main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o
反
斜杠(/)是換行符的意思。這樣比較便於Makefile的易讀。我們可以把這個內容保存在文件為「Makefile」或「makefile」的文件中,
然後在該目錄下直接輸入命令「make」就可以生成執行文件edit。如果要刪除執行文件和所有的中間目標文件,那麼,只要簡單地執行一下「make
clean」就可以了。
在這個makefile中,目標文件(target)包含:執行文件edit和中間目標文件(*.o),依賴文件
(prerequisites)就是冒號後面的那些 .c 文件和 .h文件。每一個 .o 文件都有一組依賴文件,而這些 .o 文件又是執行文件
edit 的依賴文件。依賴關系的實質上就是說明了目標文件是由哪些文件生成的,換言之,目標文件是哪些文件更新的。
在定義好依賴關系
後,後續的那一行定義了如何生成目標文件的操作系統命令,一定要以一個Tab鍵作為開頭。記住,make並不管命令是怎麼工作的,他只管執行所定義的命
令。make會比較targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的
日期要新,或者target不存在的話,那麼,make就會執行後續定義的命令。
這里要說明一點的是,clean不是一個文件,它只不過
是一個動作名字,有點像C語言中的lable一樣,其冒號後什麼也沒有,那麼,make就不會自動去找文件的依賴性,也就不會自動執行其後所定義的命令。
要執行其後的命令,就要在make命令後明顯得指出這個lable的名字。這樣的方法非常有用,我們可以在一個makefile中定義不用的編譯或是和編
譯無關的命令,比如程序的打包,程序的備份,等等。