剛上郵箱的時候發現一位網友向我詢問這個問題,同時傳送了乙個鏈結給我了。
上去一看,上面還留有我以前同樣的提問,看看時間,都幾年前在別人的帖子裡面的提問了。貌似當時我遇到同樣問題的時候也是到處發帖回帖詢問來著的,問的地方有點多,要不是這位朋友給我鏈結,早不記得那個鏈結也有訪問過,呵呵。
不過再往下看了後才發現,這個問題依然沒有給出明確的回答,很多朋友給出的都是應用層庫的鏈結,這和期望的核心層的鏈結是不一樣的。
所以我把自己的一點理解寫出來,給後面的朋友參考,期望對後來的朋友有所幫助。
1.首先保證你正確生成了核心庫檔案,而非應用程式庫檔案; 2.
其次是除去靜態庫之外的驅動檔案的正確性,包括核心庫函式的呼叫和標頭檔案的申明; 3.
正確修改驅動的makefile
;
這幾個方面都正確之後,就能正確地將核心庫編譯進指定的驅動中去。
**目錄結構如下:
driverentry.c
makefile
lib
myalib.c
myalib.c
makefile
1.
核心靜態庫檔案的生成
核心庫包含乙個myalib.c
和myalib.h
檔案,**如下:
//myalib.c
void test(void)
//myalib.h
void test(void);
# this is the makefile for parse.
rm = rm -f
ccflags = -c
arflag = -rc
cc = gcc
ar = ar
lib_objects = myalib.o
lib_source = myalib.c
lib = libtest.a
libtest.a:$(lib_objects)
$(ar) $(arflag) -o $@ $^
$(lib_objects):$(lib_source)
$(cc) $(ccflags) -o $@ $^
clean:
$(rm) $(lib_objects.o)
$(rm) $(lib)
在輸入終端下執行」make」
命令即可生成正確的核心庫檔案。
2.
驅動檔案的準備
驅動**包括乙個driverentry.c
檔案。
#include
#include
#include "./lib/myalib.h"
module_license("dual bsd/gpl");
int init_module(void)
void cleanup_module(void)
可以看到,在驅動初始化中呼叫了庫檔案中的test()
函式,並且包含其標頭檔案。
3.
makefile
的修改
修改驅動makefile
檔案,加入核心庫檔案的編譯鏈結。
這個地方的修改比較簡單,只需核心庫檔案當做.o
檔案一樣去進行編譯鏈結即可。
# makefile
ifneq ($(kernelrelease),)
obj-m := drv.o $(lib)
drv-objs := driverentry.o lib/libtest.a
else
kdir := /lib/modules/$(shell uname -r)/build
pwd := $(shell pwd)
$(objdir)/%.o: $(srcdir)/%.c
$(cc) -o $@ $(cflags) -c $<
default:
$(make) -c $(kdir) m=$(pwd) modules
clean:
rm -f *.o *.ko *.o.cmd *.mod.c *.symvers
endif
ok,最後終端下執行」make」
命令即可成功地將核心庫檔案和目標驅動檔案鏈結到一起。
然後就可以裝載驅動進行驗證了。
最後說明下,以上只是個最簡單的演示版**,在這個基礎上,大家可以根據自己的需要豐富核心庫和驅動的內容,從而達到真正的專案用途的目的。
如何將驅動程式靜態編譯進核心
驅動模組可以核心編譯好後動態載入進去,也可以在編譯核心的時候就直接新增。下面是將驅動程式靜態編譯進核心的方法 以乙個字元裝置為例 1.修改 drivers char下的kconfig檔案 在kconfig中增加如下 config my hello bool this is test a.儲存後回到核...
如何將乙個驅動編譯進核心
將乙個驅動編譯進核心 驅動和核心成為乙個整體,即驅動程式在zimage 或uimage 在核心啟動過程中,會自動安裝驅動。1 將驅動原始碼放在linux核心的原始碼包中 drivers char leds gec210 led.c 在drivers char 下建立了乙個目錄leds,將gec210...
如何將LCD顯示屏連線到Arduino開發板
使用arduino連線乙個lcd顯示屏,為您的專案提供顯示。將字元lcd顯示屏連線到arduino開發板,為您的專案新增了乙個很好的可讀性元素。世界上許多最好的arduino專案都有液晶顯示器。這些lcd可用於顯示arduino或連線到它的任何感測器的資訊。例如,您可以建立乙個溫度監控系統,顯示ar...