Linux驅動開發筆記(三):基於ubuntu的驅動、makefile編寫以及編譯載入流程

21497936發表於2023-05-12

前言

  前面學習了驅動的基礎框架,上一篇編譯了gcc7.3.0,那麼為了方便很好的熟悉流程,本篇,將使用ubuntu18.04,直接編譯ubuntu18.04的驅動,然後做好本篇文章的相關實戰測試。

Ubuntu虛擬機器準備

步驟一:安裝虛擬機器

  本次使用之前rk3568的ubuntu18.04,筆者沒有重新弄了,安裝虛擬機器的過程請自行搜尋查詢完成。
   在這裡插入圖片描述

步驟二:獲取核心版本號

  獲取核心版本號是為了確認核心版本號一致。

sudo cat /proc/version

   在這裡插入圖片描述

步驟三:校準編譯器版本

  前面獲取了核心的編譯器版本是gcc7.3.0,但是本機是gcc7.5,需要變更版本:
   在這裡插入圖片描述

步驟四:下載核心原始碼

sudo cat /proc/versionsudo apt-cache search linux-sourcesudo apt-get install linux-source-4.15.0

  檢視到本ubuntu的核心版本,然後下載對應的版本:
   在這裡插入圖片描述
  以上準備好的核心原始碼和編譯器則可以開始編譯核心。

核心編譯

  注意1:ubuntu的/usr/src下有核心的標頭檔案可編譯直接使用。
  注意2:本標題章節所編譯的核心然後使用該核心編譯的驅動是不可相容的。
   在這裡插入圖片描述

步驟一:下載解壓

   在這裡插入圖片描述
  發現其實系統自帶了header標頭檔案。(PS: -header- 就是標頭檔案,驅動和某些和核心功能關聯的東西都要呼叫當前核心版本的對應標頭檔案才能正確的編譯出來而且可以使用。所以有些發行版就製作了專用的 header 包來讓需要的程式呼叫。這種包只有 header 檔案,沒有其他無關開發的內容。

cd linux-source-4.18.0/sudo tar xvf linux-source-4.18.0.tar.bz2

   在這裡插入圖片描述

步驟二:核心配置

cd linux-source-4.18.0sudo make menuconfig

   在這裡插入圖片描述
  進入了配置:
   在這裡插入圖片描述
  不做任何配置變動,退出。

步驟三:直接編譯

make -j8

   在這裡插入圖片描述
  半小時左右編譯完成:
   在這裡插入圖片描述

驅動編譯

  把驅動編譯城模組,然後載入到核心裡面。

步驟一:使用前面編寫的驅動和makefile

   在這裡插入圖片描述

驅動程式碼檔案

   在這裡插入圖片描述

#include <linux/init.h>#include <linux/module.h>static int hello_init(void){
    // 在核心裡面無法使用基礎c庫printf,需要使用核心庫printk
    printk(“Hello, I’m hongPangZi\n”);
    return 0;}static void hello_exit(void){
    printk(“bye-bye!!!\n”);}MODULE_LICENSE(“GPL”);module_init(hello_init);module_exit(hello_exit);

驅動makefile

   在這裡插入圖片描述
  這裡make過不去,發現這裡不能是空格,如下圖,才可以:
   在這裡插入圖片描述

obj-m += helloworld.o
KDIR:=/usr/src/linux-source-4.18.0/linux-source-4.18.0PWD?=$(shell pwd)all:    make -C $(KDIR) M=$(PWD) modules

步驟二:編譯make

make

  直接在驅動工程目錄編譯:
   在這裡插入圖片描述

  這裡是makefile的m要大寫,修改後可編譯:
   在這裡插入圖片描述

  應該是windows複製 過來字元編碼啥的變了(雙引號),這裡更正一下:
   在這裡插入圖片描述
   在這裡插入圖片描述
  然後再編譯:
   在這裡插入圖片描述
  編譯成功
   在這裡插入圖片描述

步驟三:載入解除安裝驅動測試

  將驅動複製到開發板或者目標系統,然後使用載入指令:

insmod helloworld.ko

  會列印入口載入的printk輸出。
   在這裡插入圖片描述

  出現問題可能原因一是核心編譯使用的編譯器和模組使用的編譯器版本不一致。
  這裡我們核對過是一樣的,所以此處暫時也不知道如何,如下圖:
   在這裡插入圖片描述

  那麼懷疑問題二:編譯模組時選擇的Linux標頭檔案目錄與當前執行的系統版本不匹配(可能是配置吧,明顯大版本和子版本是一致的)
  所以這裡我們重新配置一下makefile,直接引用linux-header如下:

   在這裡插入圖片描述
  編譯透過:
   在這裡插入圖片描述

  繼續載入、檢視和解除安裝測試:
   在這裡插入圖片描述

  發現ubuntu中printk終端無列印的問題,是重定向問題,打入核心日誌訊息了,可以使用dmesg進行檢視:

   在這裡插入圖片描述

  至此,會發現作為ubuntu來說,自帶的/usr/src下的就是核心的標頭檔案編譯直接使用就可以了,無需編譯核心,但是編譯器還是需要的。
  本文章核心編譯保留,因為編譯核心是一個準備條件。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010283/viewspace-2951645/,如需轉載,請註明出處,否則將追究法律責任。

相關文章