導航:首頁 > 源碼編譯 > 源碼樹外編譯內核驅動

源碼樹外編譯內核驅動

發布時間:2022-10-03 20:42:25

❶ 為什麼要構造內核源碼樹編寫驅動程序時必須建立內核樹

首先回答:
已經下載了最新的源碼,編譯之後不會對本機已經安裝的linux系統有影響嗎?

不會有影響,只是佔用了一點存儲空間。

這里的內核源碼樹指的是什麼?

就是源碼樹中有相應的頭文件和函數的實現,沒有源碼樹,自己寫的應用程序就沒辦法執行起來。

我的電腦明明裝的就是linux,為什麼還要下載源碼(不都已經安裝完成了嗎)
我們做linux開發一般在PC機上編譯好了,下到板子上去運行,板子上的linux內核和PC機上的linux版本很多時候都是不一樣的,比如pc機上的是linux2.6,板子上的是linux3.1,這個時候就要下linux3.1的內核,用它編譯的驅動模塊在板子上才能載入上,不然會出錯。在編譯內核模塊時可以指定是用PC自帶的linux內核,還是自己下載的linux內核;這個在Makefile文件中設置的,比如KERN_DIR=/usr/src/linux-headers-3.2.0-29-generic-pae
如果不設置就是用系統自帶的;

如果就在PC機上運行,不下到板子上就不用下載linux內核源碼樹了。
不知解釋清楚了沒,親

❷ 如何在Ubuntu上安裝內核對應的源碼來編譯驅動

如何在Ubuntu上安裝內核對應的源碼來編譯驅動?
最近在學驅動模塊,平台是ARM,因為課上老師講的有點顯淺,所以打算自己再深入研究一下。
所以在虛擬機裡面裝了ubuntu,打算用來深入學習。
目前的版本是
# uname -a
Linux ubuntu-ldm 4.4.0-28-generic #47-Ubuntu SMP Fri Jun 24 10:09:13 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

我已經安裝了以下的包
# dpkg -l | grep linux
ii console-setup-linux 1.108ubuntu15 all Linux specific part of console-setup
ii libselinux1:amd64 2.4-3build2 amd64 SELinux runtime shared libraries
ii linux-base 4.0ubuntu1 all Linux image base package
ii linux-firmware 1.157.2 all Firmware for Linux kernel drivers
ii linux-generic 4.4.0.28.30 amd64 Complete Generic Linux kernel and headers
ii linux-headers-4.4.0-28 4.4.0-28.47 all Header files related to Linux kernel version 4.4.0
ii linux-headers-4.4.0-28-generic 4.4.0-28.47 amd64 Linux kernel headers for version 4.4.0 on 64 bit x86 SMP
ii linux-headers-generic 4.4.0.28.30 amd64 Generic Linux kernel headers
ii linux-image-4.4.0-28-generic 4.4.0-28.47 amd64 Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii linux-image-extra-4.4.0-28-generic 4.4.0-28.47 amd64 Linux kernel extra moles for version 4.4.0 on 64 bit x86 SMP
ii linux-image-generic 4.4.0.28.30 amd64 Generic Linux kernel image
ii linux-libc-dev:amd64 4.4.0-28.47 amd64 Linux Kernel Headers for development
ii linux-sound-base 1.0.25+dfsg-0ubuntu5 all base package for ALSA and OSS sound systems
ii linux-source 4.4.0.28.30 all Linux kernel source with Ubuntu patches
ii linux-source-4.4.0 4.4.0-28.47 all Linux kernel source for version 4.4.0 with Ubuntu patches
ii util-linux 2.27.1-6ubuntu3.1 amd64 miscellaneous system utilities

並且將/usr/src/linux-source-4.4.0.tar.bz2解壓到/home/test/WorkSpace/Kernel/linux-source-4.4.0下
然後寫了一個小小的測試程序
#include <linux/init.h>
#include <linux/mole.h>

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init (void) {
printk (KERN_ALERT "Hello, World\n");
return 0;
}

static void hello_exit (void) {
printk (KERN_ALERT "Goodbye, cruel world\n");
}

mole_init (hello_init);
mole_exit (hello_exit);

Makefile
obj-m += mole.o

mole-objs := hello.o

all:
make moles M=`pwd` -C /home/test/WorkSpace/Kernel/linux-source-4.4.0

clean:
make moles clean M=`pwd` -C /home/test/WorkSpace/Kernel/linux-source-4.4.0

令我不解的是
# sudo insmod mole.ko
insmod: ERROR: could not insert mole mole.ko: Invalid mole format

實在想不通為何沒法裝載這個內核模塊?
是因為我用錯了版本的源碼嘛?
難道是要用自己編譯的uImage來啟動系統才可以嘛?
要如何自己手動編譯替換Ubuntu的內核?

❸ Linux內核源碼如何編譯

首先uname -r看一下你當前的linux內核版本

1、linux的源碼是在/usr/src這個目錄下,此目錄有你電腦上各個版本的linux內核源代碼,用uname -r命令可以查看你當前使用的是哪套內核,你把你下載的內核源碼也保存到這個目錄之下。
2、配置內核 make menuconfig,根據你的需要來進行選擇,設置完保存之後會在當前目錄下生成.config配置文件,以後的編譯會根據這個來有選擇的編譯。
3、編譯,依次執行make、make bzImage、make moles、make moles
4、安裝,make install
5、.創建系統啟動映像,到 /boot 目錄下,執行 mkinitramfs -o initrd.img-2.6.36 2.6.36
6、修改啟動項,因為你在啟動的時候會出現多個內核供你選擇,此事要選擇你剛編譯的那個版本,如果你的電腦沒有等待時間,就會進入默認的,默認的那個取決於 /boot/grub/grub.cfg 文件的設置,找到if [ "${linux_gfx_mode}" != "text" ]這行,他的第一個就是你默認啟動的那個內核,如果你剛編譯的內核是在下面,就把代表這個內核的幾行代碼移到第一位如:
menuentry 'Ubuntu, with Linux 3.2.0-35-generic' --class ubuntu --class gnu-linux --class gnu --class os {

recordfail
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 9961c170-2566-41ac-8155-18f231c1bea5
linux/boot/vmlinuz-3.2.0-35-generic root=UUID=9961c170-2566-41ac-8155-18f231c1bea5 ro quiet splash $vt_handoff
initrd/boot/initrd.img-3.2.0-35-generic
}
當然你也可以修改 set default="0"來決定用哪個,看看你的內核在第幾位,default就填幾,不過我用過這種方法,貌似不好用。

重啟過後你編譯的內核源碼就成功地運行了,如果出現問題,比如滑鼠不能用,usb不識別等問題就好好查查你的make menuconfig這一步,改好後就萬事ok了。

最後再用uname -r看看你的linux內核版本。是不是你剛下的那個呢!有沒有成就感?
打字不易,如滿意,望採納。

❹ linux驅動中內核源碼樹和載入模塊的問題

恩? 理解不全,要重新編譯一個內核來使用,要注意兩點:
a,安裝 LKMs 到 /lib/moles 的子目錄下;
b,將新的內核映像拷貝到 /boot 分區中,並配置 grub/lilo;

centos/redhat 發行版中的內核版本有自己很多的補丁修改,不同於主流的
從 kernel.org 中下載下來的內核。你只是簡單的修改版本名稱那是不行的,
mod version 內部還是會被認為是兩個不同的內核(實際上也是不同的)。

在 centos/redhat 上為本機運行著的內核開發驅動,實際上可以不用去下載
任何版本的內核代碼樹,你只需要安裝 相對應的 kernel-devel rpm 包即可。
當然,為了更方便,你可以直接從 centos 官網下載合適的源碼包來重新編
譯後再開發你的驅動程序。

更多問題,可以上巨立安郵件列表中進行交流。
巨立安技術是你在arm/x86下學習 linux 開發的上佳指導。

❺ linux 驅動程序開發,為什麼要編譯內核源碼樹

您好,這樣的情況建議您下載最新版本的驅動精靈,或是直接在線升級一下驅動精靈。希望可以幫到您。

❻ Android源碼編譯在真機上運行時為什麼要同時編譯驅動

模擬器也需要驅動啊,是goldfish,真機沒有驅動(針對硬體的),運行不起來的。源碼是不帶驅動源碼的,驅動源碼要另外下載,源碼里的是已經編譯好的kernel。

❼ linux顯卡驅動怎麼編譯進內核

一、 驅動程序編譯進內核的步驟
在 linux 內核中增加程序需要完成以下三項工作:
1. 將編寫的源代碼復制到 Linux 內核源代碼的相應目錄;
2. 在目錄的 Kconfig 文件中增加新源代碼對應項目的編譯配置選項;
3. 在目錄的 Makefile 文件中增加對新源代碼的編譯條目。

bq27501驅動編譯到內核中具體步驟如下:
1. 先將驅動代碼bq27501文件夾復制到 ti-davinci/drivers/ 目錄下。
確定bq27501驅動模塊應在內核源代碼樹中處於何處。
設備驅動程序存放在內核源碼樹根目錄 drivers/ 的子目錄下,在其內部,設備驅動文件進一步按照類別,類型等有序地組織起來。
a. 字元設備存在於 drivers/char/ 目錄下
b. 塊設備存放在 drivers/block/ 目錄下
c. USB 設備則存放在 drivers/usb/ 目錄下。

❽ 如何編譯一個linux下的驅動模塊

首先,我們要了解一下模塊是如何別被構造的。模塊的構造過程與用戶空間
的應用程序的構造過程有顯著不同;內核是一個大的、獨立的程序
,
對於它的各
個部分如何組合在一起有詳細的明確的要求。
Linux2.6
內核的構造過程也與以
前版本的內核構造過程不同;
新的構造系統用起來更加簡單,
並且可產生更加正
確的結果
,
但是它看起來和先前的方法有很大不同。內核的構造系統非常復雜
,
我們所看到的只是它的一小部分。
如果讀者想了解更深入的細節,
則應閱讀在內
核源碼中的
Document/kbuild
目錄下的文件。

在構造內核模塊之前,
有一些先決條件首先應該得到滿足。
首先,
讀者要保證你
有適合於你的內核版本的編譯器、模塊工具
,
以及其他必要工具。在內核文檔目
錄下的文件
Documentation/Changes
里列出了需要的工具版本;
在開始構造內
核前,
讀者有必要查看該文件,
並確保已安裝了正確的工具。
如果用錯誤的工具
版本來構造一個內核
(
及其模塊
)
,可能導致許多奇怪的問題。另外也要注意
,
使
用太新版本的編譯器偶爾可能也會導致問題。

一旦做好了上面的准備工作之後
,
其實給自己的模塊創建一個
makefile
則非常
簡單。實際上
,
對於本章前面展示的
" hello world"
例子
,
下面一行就夠了
:
obj-m := hello.o
如果讀者熟悉
make

但是對
Linux2.6
內核構造系統不熟悉的話
,
可能奇怪這個
makefile
如何工作。畢竟上面的這一行不是一個傳統的
makefile
的樣子。問
題的答案當然是內核構造系統處理了餘下的工作。上面的賦值語句
(
它利用了由
GNU make
提供的擴展語法
)
說明有一個模塊要從目標文件
hello.o
構造,而從
該目標文件構造的模塊名稱為
hello.ko.
如果我們想由兩個源文件
(
比如
file1.c

file2.c )
構造出一個名稱為
mole.ko
的模塊
,
則正確的
makefile
可如下編寫
:
obj-m := mole.o
mole-objs := file1.o file2.o
為了讓上面這種類型的
makefile
文件正常工作
,
必須在大的內核構造系統環境
中調用他們。假設讀者的內核源碼數位於
~/kernel-2.6
目錄
,
用來建立你的模
塊的
make
命令
(
在包含模塊源代碼和
makefile
的目錄下鍵入
)
應該是
:
make -C ~/kernel-2.6 M=`pwd` moles
這個命令首先是改變目錄到用
-C
選項指定的位置
(
即內核源代碼目錄
)
,其中保
存有內核的頂層
makefile
文件。這個
M=
選項使
makefile
在構造
moles

標前
,
返回到模塊源碼目錄。
然後,
moles
目標指向
obj-m
變數中設定的模塊,
在上面的例子里,我們將該變數設置成了
mole.o


上面這樣的
make
命令對於多個文件的編譯顯得不是很方便
,
於是內核開發者就
開發了一種
makefile
方式
,
這種方式使得內核樹之外的模塊構造變得更加容易。
代碼清單
1.4
展示了
makefile
的編寫方法:

代碼清單
1.4 makefile
ifeq ($(KERNELRELEASE),)

KERNELDIR ?= /source/linux-2.6.13
PWD := $(shell pwd)

moles:
$(MAKE) -C $(KERNELDIR) M=$(PWD) moles

moles_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) moles_install

clean:
rm -rf *.o *~ core .depend .*. *.ko *.mod.c .tmp_versions

.PHONY: moles moles_install clean

else
obj-m := hello.o
endif
我們再次看到了擴展的
GNU
make
語法在起作用。在一個典型的構造過程中,這

makefile
將被讀取兩次。當從命令行中調用這個
makefile ,
它注意到
KERNELRELEASE
變數尚未設置。我們可以注意到,已安裝的模塊目錄中存在一
個符號連接,
它指向內核的構造樹,
這樣這個
makefile
就可以定位內核的源代
碼目錄。如果讀者時間運行的內核並不是要構造的內核,則可以在命令行提供
KERNELDIR=
選項或者設置
KERNELDIR
環境變數
,
或者修改
makefile
中設置
KERNELDIR
的那一行。在找到內核源碼樹
,
這個
makefile
會調用
default:


,
這個目標使用先前描述過的方法第二次運行
make
命令
(
注意,在這個
makefile

make
命令被參數化成
$(MAKE))
,以便運行內核構造系統。在第二
次讀取
makefile
時,
它設置了
obj-m,
而內核的
makefile
負責真正構造模塊。

這種構造模塊的機制看起來很繁瑣,可是,一旦我們習慣了使用這種機制
,
則會
欣賞內核構造系統帶給我們的便利。需要注意的是
,
上面
makefile
並不完整,
一個真正的
makefile
應包含通常用來清除無用文件的目標
,
安裝模塊的目標等
等。一個完整的例子可以參考例子代碼目錄的
makefile

❾ 如何把自己的驅動編譯進內核或模塊

我們知道若要給Linux內核添加模塊(驅動)有如下兩種方式:
(1)動態方式:採用insmod命令來給運行中的linux載入模塊。
(2)靜態方式:修改linux的配置菜單,添加模塊相關文件到源碼對應目錄,然後把模塊直接編譯進內核。
對於動態方式,比較簡單,下面我們介紹如何採用靜態的方式把模塊添加到內核。
最終到達的效果是:在內核的配置菜單中可以配置我們添加的模塊,並可以對我們添加的模塊進行編譯。
一. 內核的配置系統組成
首先我們要了解Linux 2.6內核的配置系統的原理,比如我們在源碼下運行「make menuconfig 」為神馬會出現一個圖形配置菜單,配置了這個菜單後又是如何改變了內核的編譯策略滴。
內核的配置系統一般由以下幾部分組成:
(1)Makefile:分布在Linux內核源代碼中的Makefile,定義Linux內核的編譯規則。
(2)配置文件(Kconfig):給用戶提供配置選項,修改該文件來改變配置菜單選項。
(3)配置工具:包括配置命令解釋器(對配置腳本中使用的配置命令進行解釋),配置用戶界面(提供字元界面和圖形界面)。這些配置工具都是使用腳本語言編寫的,如Tcl/TK、Perl等。
其原理可以簡述如下:這里有兩條主線,一條為配置線索,一條為編譯線索。配置工具根據kconfig配置腳本產生配置菜單,然後根據配置菜單的配置情況生成頂層目錄下的.config,在.config里定義了配置選擇的配置宏定義,如下所示:

如上所示,這里定義的這些配置宏變數會在Makefile里出現,如下所示:

然後make 工具根據Makefile里這些宏的賦值情況來指導編譯。所以理論上,我們可以直接修改.config和Makefile來添加模塊,但這樣很麻煩,也容易出錯,下面我們將會看到,實際上我們有兩種方法來很容易的實現。

二. 如何添加模塊到內核
實際上,我們需要做的工作可簡述如下:
(1)將編寫的模塊或驅動源代碼(比如是XXOO)復制到Linux內核源代碼的相應目錄。
(2)在該目錄下的Kconfig文件中依葫蘆畫瓢的添加XXOO配置選項。
(3)在該目錄的Makefile文件中依葫蘆畫瓢的添加XXOO編譯選項。
可以看到,我們奉行的原則是「依葫蘆畫瓢」,主要是添加。
一般的按照上面方式又可出現兩種情況,一種為給XXOO驅動添加我們自己的目錄,一種是不添加目錄。兩種情況的處理方式有點兒不一樣哦。

三. 不加自己目錄的情況
(1)把我們的驅動源文件(xxoo.c)放到對應目錄下,具體放到哪裡需要根據驅動的類型和特點。這里假設我們放到./driver/char下。
(2)然後我們修改./driver/char下的Kconfig文件,依葫蘆添加即可,如下所示:

注意這里的LT_XXOO這個名字可以隨便寫,但需要保持這個格式,他並不需要跟驅動源文件保持一致,但最好保持一致,等下我們在修改Makefile時會用到這個名字,他將會變成CONFIG_LT_XXOO,那個名字必須與這個名字對應。如上所示,tristate定義了這個配置選項的可選項有幾個,help定義了這個配置選項的幫助信息,具體更多的規則這里不講了。

(3)然後我們修改./driver/char下的Makefile文件,如下所示:

這里我們可以看到,前面Kconfig里出現的LT_XXOO,在這里我們就需要使用到CONFIG_XXOO,實際上邏輯是醬汁滴:在Kconfig里定義了LT_XXOO,然後配置完成後,在頂層的.config里會產生CONFIG_XXOO,然後這里我們使用這個變數。
到這里第一種情況下的添加方式就完成了。
四. 添加自己目錄的情況
(1)在源碼的對應目錄下建立自己的目錄(xxoo),這里假設為/drivers/char/xxoo 。
(2) 把驅動源碼放到新建的xxoo目錄下,並在此目錄下新建Kconfig和Makefile文件。然後給新建的Kconfig和Makefile添加內容。
Kconfig下添加的內容如下:

這個格式跟之前在Kconfig里添加選項類似。
Makefile里寫入的內容就更少了:

添加這一句就可以了。
(3)第三也不復雜,還是依葫蘆畫瓢就可以了。
我們在/drivers/char目錄下添加了xxoo目錄,我們總得在這個配置系統里進行登記吧,哈哈,不然配置系統怎麼找到們呢。由於整個配置系統是遞歸調用滴,所以我們需要在xxoo的父目錄也即char目錄的Kconfig和Makefile文件里進行登記。具體如下:
a). 在drivers/char/Kconfig中加入:source 「drivers/char/xxoo/Kconfig」
b). 在drivers/char/Makefile中加入:obj-$(CONFIG_LT_XXOO) += xxoo/
添加過程依葫蘆畫瓢就可以了,灰常滴簡單。

❿ 如何在Ubuntu上安裝內核對應的源碼來編譯驅動

1、不同的版本而已,其實是更加的細分架構。2、當然沒有,因為你沒裝,這兩個是當前內核的開發 C Header 。因為某些驅動、程序的原因,他們會固定的到這里找對應內核版本的開發頭文件,所以這些個 Header 就放在了這里。一般來說,你不需要管他們的用處,這是發行版的設計,你只需要使用這個系統就行了。*-header-* 就是頭文件,驅動和某些和內核功能關聯的東西都要調用當前內核版本的對應頭文件才能正確的編譯出來而且可以使用。所以有些發行版就製作了專用的 header 包來讓需要的程序調用。這種包只有 header 文件,沒有其他無關開發的內容。linux-* 一般才是真正的內核源代碼,不過也不絕對的。

閱讀全文

與源碼樹外編譯內核驅動相關的資料

熱點內容
小天才app怎麼升級v242 瀏覽:544
簡單手工解壓玩具製作大全 瀏覽:926
免費編程電子書 瀏覽:869
想玩游戲什麼app最合適 瀏覽:560
安卓手機如何用airportspro 瀏覽:448
怎麼清理idea編譯緩存 瀏覽:951
鏡頭app怎麼推廣 瀏覽:437
什麼app隨便看電視劇 瀏覽:307
2021程序員薪酬 瀏覽:708
糖豆廣場怎麼下載app 瀏覽:213
qtvs2019選哪個編譯器 瀏覽:124
壓縮空氣管能焊嗎 瀏覽:284
linux中yum命令 瀏覽:397
在職演算法工程師 瀏覽:706
電碼加密函數方法有幾種 瀏覽:802
後綴是pdf 瀏覽:720
pr導出壓縮 瀏覽:32
命令語氣 瀏覽:245
脊柱解剖pdf 瀏覽:714
plc入門編程題目及答案 瀏覽:383