1. 程式人生 > >64位Ubuntu14.04系統下載入核心模組hello world

64位Ubuntu14.04系統下載入核心模組hello world

  1. 感謝這篇部落格,讓折騰了好久的我實現了核心模組載入
  1. 為什麼要構造原始碼樹?
我們做 Linux 開發一般是在PC機上編譯好,下到板子上去執行,板子上的 Linux 核心和 PC 機上的 Linux 版本很多時候都是不一樣的,比如:pc機上的是 Linux 2.6,板子上的系統是 Linux 3.1,這個時候就要在pc本地編譯環境中下載 Linux 3.1 的核心,用它編譯出驅動模組,從而在板子上載入,不然會因為核心版本不一致而出錯。如果只是在PC上執行,核心模組不是用在板子上去,是不用下載核心原始碼樹和編譯核心原始碼的。
  1. 驅動程式和使用者程式不一樣,它是作為一個模組連線到核心模組來執行的,執行在核心空間裡面。所以要執行我們自己構造的模組,需要自己的系統已經配置好核心樹,然後把目標模組和核心樹連線起來執行!
如何檢視自己的 ubuntu 系統中是否已經有了核心原始碼樹了?直接去檢視 /lib/modules/ 目錄下是否存在 build 目錄,如果存在,則表示我們自己的系統已經擁有核心原始碼樹了(我的本地編譯環境 ubuntu14.04 是擁有核心原始碼樹的),如下所示。
  1. 但為了熟悉整個的過程,我們也重新下載對應自己的編譯環境的“核心原始碼”並對其進行編譯,構造核心原始碼樹。首先要檢視自己使用的系統“核心版本 ”:
我用的是 Ubuntu 14.04

檢視自己 ubuntu 系統的版本:有兩種方法,第一種,cat /etc/issue ; 第二種,lsb_release -a 命令
  1. 核心原始碼樹構建步驟:
(1)安裝編譯核心所需的軟體(要用 make menuconfig 命令的話得安裝,用 make oldconfig 的話就不用安裝,不論採用哪種生成配置檔案的方式,都在系統中安裝下面的軟體) sudo apt-get install build-essential kernel-package libncurses5-dev fakeroot (2)下載核心原始碼,執行上面的命令 sudo apt-cache search Linux-source ,系統會給出適合我們所安裝系統的“核心原始碼版本 ”
(3)使用命令 sudo apt-get install linux-source-3.13.0 下載安裝該“核心原始碼 ” (4)解壓核心原始碼包:進入 /usr/src/ 目錄,能找到 linux-source-3.13.0.tar.bz2 檔案,用解壓命令 sudo tar xjvf linux-source-3.13.0.tar.bz2  解壓。要注意上面目錄下的 linux-source-3.13.0.tar.bz2 檔案並不是軟體壓縮包檔案
,而是一個軟連結,不能直接使用 tar 進行解壓。


進入 linux-source-3.13.0 資料夾,發現真正的 tar 原始碼壓縮包,解壓。
(5)對“核心原始碼”進行編譯前的配置從下面截圖可以看出,在解壓後,該資料夾下並沒有 .config 檔案。
進入原始碼解壓後的資料夾裡,為了方便,可以直接在使用 make menuconfig 命令開啟視覺化配置視窗,然後什麼都不要修改的退出。
在執行完 sudo make menuconfig 命令後並不會像上面那樣執行完畢,生成一個 .config  檔案,而是會先開啟下面的視覺化配置,畢竟我們的命令是 menuconfig(選單配置)。
什麼都不要操作,直接 Esc 退出,選擇 Save,從而可以在該資料夾下生成一個 .config 編譯配置檔案。
.config 配置檔案如下圖所示:
(6)使用 sudo make 命令進行核心編譯,當然不只是下面截圖那樣簡單,整個核心編譯過程是以小時計算的,編譯吧,linux君,我玩會再來看你。
編譯完,該資料夾下就生成了一個名為 vmlinux 的檔案了,但網上的教程大都說要執行完下面的 sudo make bzImage 命令才會生成 vmlinux 檔案。

 (7)sudo make zImage 命令在我的本地編譯環境下是不能使用的。
(8)使用命令 sudo make bzImage 後,下面兩個截圖對其過程的中間過程省略。


(9)使用 sudo make modules 命令編譯模組 (10)使用 sudo make modules_install 命令安裝模組,執行完後,會在 /lib/modules 目錄下生成一個新的目錄 /lib/modules/3.13.0/ 。至此,核心就編譯完成了。
(11)由於我的本地 ubuntu 編譯環境中的核心版本就是為 3.13.0-32-generic,所以 /lib/modules/3.13.0-24-generic 本身就存在,所以其實我們這裡的 sudo make modules 和 sudo make modules_install 這兩步是不需要執行的。
(12)但我們這裡還是執行了 sudo make modules 和 sudo make modules_install 命令,看上面的截圖也就能判斷出,其實,在我們執行完 sudo make moduels 和 sudo make modules_install 命令後編譯生成了目錄 /lib/modules/3.13.11-ckt39 
  1. 現在可以編寫 hello world 程式並載入該核心模組了
下面是 hello.c 檔案:
  1. 下面是是 Makefile (必須為這個檔名,連 makefile 都是不能直接使用 make 命令來進行編譯的)檔案,解釋下該檔案,加深理解。
(1)obj-m 的意思是將後面的東東編譯為“核心模組”,相對應的還有 obj-y 是編譯進核心,obj-n 是不編譯。 (2)KERNELDIR 是 Makefile 檔案中的一個內容標識,這裡標識核心原始碼目錄,目錄中包含了核心驅動模組所需要的各種標頭檔案及依賴。 (3)-C 表示讓 make 命令進入指定的目錄,這裡即 KERNELDIR ,是核心原始碼目錄,呼叫該目錄頂層下的 Makefile,目標為 modules。 (4)M=$(PWD) 選項是讓該 Makefile 在構造 modules 目標之前返回到模組原始碼目錄,並在當前目錄下生成 obj-m 指定的 xxx.o 目標模組。 (5)三種賦值等號的區別 ?= ,=,:= “:=”表示:它的右邊如果為變數,那麼該變數在這條語句之前就要定義好,而不能在使用這條語句之後定義的變數 “=”表示:當它右邊如果變數時,這個變數可以在這條語句之前或者之後使用 “?=”表示:當它左邊的變數在這條語句之前沒有定義過,則執行本條語句,如果已經定義了,則什麼都不做。 所以下面截圖中的 Makefile 檔案中三種賦值都是可以的。 (6)modules 和 modules_install 是 make 需要執行的命令 (7)整理到這裡????請繼續先閱讀該部落格????xxxx
(8)make 定義了很多預設變數,像常用的命令或者是命令選項之類的,什麼 CC ,什麼 CFLAGS,$(MAKE) 就是預設的 make 這個命令的名稱(或者是路徑)。make -p 可以檢視所有預定義的變數的當前值。看下面的截圖的最後一行就可以看出, $(MAKE) 變數其實就是 make 命令。
  1.  對驅動程式進行編譯的時候,發現 /lib/modules/ 目錄下的兩個庫資料夾都是能用的(在前面說過,其實安裝好的 ubuntu本地編譯環境是擁有核心原始碼樹的)。
(1)在寫好 Makefile 檔案的驅動程式目錄下,可以直接使用使用者許可權執行 make 命令編譯。 (2)CC是編譯 (3)LD是連結
  1. 編譯後,本來資料夾內只有 hello.c 和 Makefie 檔案,當執行完 sudo make 命令後會出現:


==================== 參考以下部落格:

相關推薦

64Ubuntu14.04系統載入核心模組hello world

感謝這篇部落格,讓折騰了好久的我實現了核心模組載入 為什麼要構造原始碼樹?我們做 Linux 開發一般是在PC機上編譯好,下到板子上去執行,板子上的 Linux 核心和 PC 機上的 Linux 版本很多時候都是不一樣的,比如:pc機上的是 Linux 2.6,板子上的系統

Ubuntu14.04系統Kinect v2點雲圖的生成

Kinect v2為深度相機,能夠額外得到影象的深度資訊。如下圖 ,最近在Ubuntu14.04系統下,成功連線上了Kinect v2.   參考了下面的部落格,但是過程並不順利。 http://www.cnblogs.com/hitcm/p/5118196.h

Ubuntu14.04系統安裝OpenCV 4.0.0開發環境全過程

最近研究一個專案時需要用到OpenCV,於是自己嘗試在Ubuntu 14.04系統下安裝了這個開發環境。下面就將具體的過程記錄一下,便於後期查閱和同行分享。 〇、開發環境 首先介紹一下我的開發環境: 物理系統:Win 10 64位; 虛擬工具:Virtualbo

ubuntu14.04系統mips交叉編譯環境搭建

1.安裝必要軟體 2.下載解壓buildroot 3.配置編譯 4.設定環境變數 1.安裝必要軟體    sudo apt-get install build-essential bison flex 2.下載解壓 buildroot    http://buildro

如何在64的Win10系統安裝.NET Framework 3.0

微軟的.NET Framework大家都很熟悉了,在Win XP,Win 2000,Win 7以及Win 10等系統上都很常見。但是,最近我的64位的Win 10系統上安裝.NET Framework 3.0時,卻遇到了很奇怪的問題,錯誤程式碼0x800F081

Ubuntu14.04系統無法連線Wi-Fi無線網以及安裝BCM43142網絡卡驅動的解決方案

1.問題描述 博主近日開始學習ROS,首先必裝Linux作業系統,選擇的是Ubuntu14.04,安裝過程略過,直接講問題。安裝完系統之後發現一個重要問題,沒法使用Wi-Fi,只能使用有線網路,而且網

ubuntu14.04系統torch框架安裝hdf5方法

1.執行如下命令:sudo apt-get install libhdf5-serial-dev hdf5-tools如圖所示:2.依次執行如下三條命令:git clone https://github

用了一年ubuntu14.04系統,整理常用的shell語句

文章目錄 因為要做深度學習,所以不可避免要使用linux系統,常用的就是ubuntu了。這裡可能寫的比較零碎,權當做學習記錄吧 一、對ubuntu系統的認識 最開始就是安裝ubuntu系統,14.04需要自行配置每個盤的空間,這個可以在網上搜到(比如

Ubuntu14.04+eclipsecocos2d-x3.0正式版環境的搭建

div 新版 文件中 function ngs method ont alt src 環境: ubuntu14.04 adt-bundle-linux-x86_64 android-ndk-r9d-linux-x86_64 cocos2d-x-3.0正式版 apach

ubuntu14.04系統中virtualbox安裝Oracle VM VirtualBox Extension Pack包

默認 .so -m targe 控制 站點 clas data- ref ubuntu14.04系統中virtualbox默認不支持usb設備,須要安裝Oracle VM VirtualBox Extension Pack才行,但必須安裝下面版本號才幹夠成功安裝:Ora

Ubuntu16.04系統 解決“無法獲得鎖 /var/lib/dpkg/lock -open (11:資源暫時不可用)、無法鎖定管理目錄(/var/lib/dpkg/),是否有其他進程正占用它?”的方法

方法 div 終端 例如 解決辦法 all -o 強制 安裝 在Ubuntu16.04下安裝軟件,例如:sudo apt-get install lrzsz時提示:   無法獲得鎖 /var/lib/dpkg/lock - open (11: 資源暫時不可用)  無法鎖定

影象腐蝕-ubnutu16.04系統

檔案結構 [email protected]:~/opencv_test/1$ tree -L 1 . ├── build ├── CMakeLists.txt ├── main.cpp └── ubuntu.png main.cpp檔案

Ubuntu14.04環境Qt5.5以上版本無法輸入中文的解決教程

參考:https://www.cnblogs.com/gcl0909031172/p/8676470.html 1、前言 由於Qt5.4之後對之前的Qt5版本不再二進位制相容,所以網上很多簡單的舊的辦法已經失效了,所以本教程的辦法是重新編譯fcitx-qt5,生成最新的libfcitxplatf

Ubuntu 16.04系統MySQL的安裝

1.伺服器端安裝 安裝伺服器端:在終端中輸入如下命令,回車後,然後按照提示輸入 sudo apt-get install mysql-server 啟動服務 當前使用的ubuntu映象

Ubuntu 16.04 系統安裝 FoxitReader

第一步:官網下載安裝包 網址:https://www.foxitsoftware.cn/products/reader/ 注:Ubuntu系統下安裝軟體的格式有三種:.bundle檔案、.tar類檔案、.deb檔案。 詳見(http://blog.csdn.net/su

騰訊雲伺服器ubuntu16.04系統安裝Python版本管理工具pyenv

一、 系統環境   騰訊雲提供的系統是ubuntu 16.04 LTS,系統預設的Python版本是2.7.12,我想要安裝3.6和其他的版本。   比較方便的是騰訊雲已經預設安裝好了git和curl命令,可以很方便的下載安裝軟體 二、 pyenv的安裝 第一步 下載並安裝pyenv $ g

Ubuntu16.04系統漢字顯示為方框解決辦法

問題詳情: 問題分析: 今天一開啟Ubuntu系統,竟然不支援中文顯示了。開始時以為是中文輸入法的問題,後面重灌了也不行。 然後我就一直在網上搜“Ubuntu系統不支援中文”,“Ubunt

用Buildroot製作樹莓派64精簡嵌入式系統

使用Buildroot 2018.08.1 1、make raspberrypi3_64_defconfig 2、make menuconfig toolchain中修改選項,將c library改為glibc,以適應更多的第三方開發 System configura

ubuntu14.04系統中root許可權的獲取

 作為剛學習Linux的新人,我在獲取root許可權時候竟然遇到了問題,解決之後特地來總結一下 一般不推薦直接以root身份登入,而是先以使用者登入,在用命令切換成root。 一.如果是第一次登入root       首先要設定

折騰記錄——Ubuntu14.04系統安裝NvidiaCUDA7.5並搭建

引言 最近幾天一直嘗試搭建Theano深度學習開發環境,並安裝英偉達CUDA Toolkit。這期間,有想過在Windows上搭建的,但是從網上了解後,發現還是在linux環境下更加合適。在搭建這個開發環境的過程中,其實入了不少坑,有點曲折。本不打算寫搭建過程的,因為網