ldd3-2 構造和運行模塊:環境搭建

来源:http://www.cnblogs.com/dcscodelife/archive/2016/08/17/5779599.html
-Advertisement-
Play Games

編程環境搭建: 因為ubuntu 12.04的內核版本已經是3.x,而目前一些講解內核驅動的書都是2.6.x。 嵌入式開發的版本一般都是基於3.14移植的,因為嵌入式是跑在開發板上的,所以開發驅動沒有問題。但是教材的例子一般都是基於PC機的2.6.x版本,雖然內核內部介面相對穩定,但是我也不太清楚。... ...


編程環境搭建:

因為ubuntu 12.04的內核版本已經是3.x,而目前一些講解內核驅動的書都是2.6.x。

嵌入式開發的版本一般都是基於3.14移植的,因為嵌入式是跑在開發板上的,所以開發驅動沒有問題。但是教材的例子一般都是基於PC機的2.6.x版本,雖然內核內部介面相對穩定,但是我也不太清楚。至於低版本的內核驅動是否直接運行在高版本的Ubuntu上,我也不是太瞭解這裡面的對應關係。為了排除無關的干擾,決定虛擬機安裝個Ubuntu 10.04 32位,它對應的內核版本是2.6.32-21,這樣一來,編寫的驅動應該就可以直接在PC上快速測試了。

由於10.04已經停止更新,為了下載軟體包,所以要做些修改,具體看這篇文章Ubuntu 無法找到更新源的問題

  • 更新源

    sudo sed -i -e 's/archive.ubuntu.com\|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list

    sudo apt-get update

    sudo apt-get upgrade 為了避免出錯,就不更新系統軟體了,也不知道是不是這樣,不既然沒出問題,那麼對系統就能不碰就不碰吧

  • 把常用軟體vim/git/ctags/cscope/裝一下
  • 安裝編譯工具

    在構造和編譯內核模塊之前,應該具備了正確版本的編譯器、模塊工具和其它必要的工具,內核文檔目錄中的Documentation/Changes文件列出了需要的工具版本;在開始構造模塊之前,應該需要查看該文件並確保已安裝了正確的工具,比如:

    sudo apt-get install build-essential kernel-package libncurses5-dev

    說明:kernel-package是Debian提供的一個編譯Linux內核的一個工具集,安裝kernel-package 會同時安裝上build-essential、libncurses-dev、linux-source等一系列工具。通過apt-cache depends kernel-package可以查看該軟體包的依賴關係:

    libncurses5這個軟體包在使用menuconfig配置內核的時候會用到。但預設情況下,apt-get並不安裝推薦和建議的軟體包。如果你沒有修改預設配置,則需要額外的安裝libncurses-dev等工具的操作。

  • 終端字體設置一下,解除ScreenSaver
  • mkdir kernel code
  • 拷貝內核壓縮包到~/kernel
  • 烏班圖對應內核版本的介紹

    5.04 2.6.10

    6.06 LTS 2.6.15

    8.04 LTS 2.6.24

    10.04 LTS 2.6.32

    12.04 LTS 3.2

    14.04 LTS 3.13

   

處理內核源碼:

  • uname -r 查看內核版本,顯示2.6.32
  • 使用apt-cache search linux-source命令可以查看可用的源碼包
  • 因為ldd3用的是linux-2.6.10,所以先下載個這個版本先用著吧,順便把2.6.32頁下載下來,kernel下載鏈接,不知道2.6.10驅動程式跑在2.6.32版本上會不會出問題,不過介面和數據結構的改動應該不大,先用用看吧
  • 或者直接下載 sudo apt-get install linux-source-2.6.32 但是我不知道這個下載下來的是不是linux原版還髮型版,因為書上建議使用原版內核而非經過修改的發行版內核
  • sudo cp linux-2.6.10.tar.xz /usr/src

    cd /usr/src/

    sudo tar xvf linux-2.6.10.tar.xz 超級用戶才能完全解壓

    因為版本問題,不知道有沒有用,順便把linux-2.6.32.tar.xz也解壓了吧。

  • 上面的幾個步驟是實驗性的,所以中途最好多拍幾個快照,防止虛擬機崩潰。

   

   

   

正確配置和構造內核樹:

ldd3上提到了構造內核樹,不過我已經糊塗了,不知道我下載的版本、開發的驅動和Ubuntu內核版本這三者之間到底是個什麼關係。

Linux驅動學習筆記1:創建Linux內核樹 這篇博客對這個講的比較清楚,具體看連接。

另外還參考的連接先列舉如下

操作步驟上面鏈接文章都說的很清楚了,待會列下,這裡主要理清一下幾個概念:

  • 下載的版本:linux版本號主要分為4部分,比如2.6.10-5,短線前面的是主要的版本號,比如Ubuntu10.04採用的2.6.32內核,Ubuntu5.04採用的2.6.10內核,也就是不同版本的Ubuntu會採用不同版本的內核。
  • Ubuntu其實可以看做類似Android的操作系統,是以linux內核為基礎的文件系統,所以重新替換內核版本,也就是保持版本號前三部分相同,第4部分可以不同,不太清楚如果前三部分的版本號不同可不可以。系統啟動後,Ubuntu是通過內核掛載上去的。
  • 原版內核和發行版內核:書上講發行版內核的API可能經過修改,所以最好還是使用原版的內核,既然Ubuntu的內核可以替換,那麼我們就可以替換成Linux官網上下載的原版內核,前提就是創建內核樹。
  • 內核樹:我的理解就是內核的源碼經過編譯的狀態就是內核樹。內核安裝主要有兩部分,一個是非模塊部分,一個是模塊部分,這個模塊應該是通用的可以直接安裝到Ubuntu上,非模塊部分就是一個鏡像用於啟動。
  • 下麵的步驟主要就是替換Ubuntu的內核為對應版本的原版內核,目前看來應該不能替換成2.6.10了,不過沒試過,不折騰了。

   

下麵是根據上面幾篇文章整理的編譯步驟和錯誤的編譯步驟(針對x86架構開發,ARM架構這裡不說)

  • 導入正確的內核配置文件

    先說標準流程,然後再說用的簡便流程:

    標準步驟:

    • sudo cp /usr/src/linux-headers-2.6.32-38-generic-pae/.config .config 導入系統自帶源碼的配置文件來,使用cp命令拷貝到當前源碼樹的跟目錄下
    • make menuconfig 使用make menuconfig來對內核配置文件進行配置

      選擇load an Alternate kernel configuration選項載入本地的.config配置文件,然後再選擇save an Alternate kernel configuration再保存退出,並退出配置環境。這樣我們的內核配置就按照原系統的配置選項配置完成。

    簡便步驟:

    • sudo make oldconfig 配置內核編譯上下文
  • 內核編譯
    • sudo make -j4 執行完成後會在當前目錄下麵生成一個文件vmlinux.o,如果對內核編譯命令不熟悉,可以在內核源碼樹跟目錄下執行make help查看內核提供的編譯選項
  • 內核核心編譯
    • make clean 先清除暫存檔,這裡不做
    • make vmlinux 未經壓縮的核心,這裡不做
    • make modules 僅核心模塊,這裡不做
    • make bzImage 經壓縮過的核心,這裡只做這個
    • make all 執行上述三個操作,這裡不做
    • 說明:常見的在 /boot/ 底下的內核文件,都是經過壓縮過的,因此,上述操作中中比較常用的是 modules 和 bzImage 這兩個。bzImage 可以製作出壓縮過後的內核
  • 內核模塊編譯和安裝,編譯完 bzImage後在編譯modules
    • make modules 僅僅編譯核心模塊
    • make modules_install 模塊安裝到系統,新內核的模塊可以在/lib/modules目錄下
  • 安裝完modules再安裝壓縮過的內核核心,內核文件安裝在/boot目錄下

    sudo make install

------------------------------------------------------------------------------------------

以下是幾個看了博文之後的錯誤步驟可以忽略,接著是步驟 6.

錯誤步驟:sudo mkinitramfs -o /boot/initrd.img.2.6.32-27 /lib/modules/2.6.32.27

   

錯誤步驟:sudo gedit /boot/grub/grub.cfg

替換32-21-generic為32.27

   

錯誤步驟:

   

   

------------------------------------------------------------------------------------------

  • 生成內核對應的RAMDISK文件,這個估計是用於啟動的

    sudo update-initramfs -c -k 2.6.32.27

  • 更新grub配置文件

    sudo update-grub

    說明:參考/boot/grub/grub.cfg文件,可以看到新內核的配置已經加到配置文件中。為避免可能出現的無法開機的情況,Grub.cfg的配置預設值不要設置為新的內核。

  • 測試新安裝的內核版本

    重啟後,開機也沒有出現選項

  • 重新安裝vmware tools因為內核改變了(vim插件也重新安裝下),因為之前安裝過一次,重覆安裝可能會耗時較長些。重啟後,保存快照。
  • 測試安裝驅動模塊,以下例子拷貝自文章:LDD3構造內核樹(on ubuntu)

    -----------------------------------------------------------

    在某一目錄下創建2個文件:hello.c和Makefile

    hello.c內容如下:

    /*

    * $Id: hello.c,v 1.5 2011/06/21 03:32:21 eric $

    */

    #include <linux/init.h>

    #include <linux/module.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");

    }

       

    module_init(hello_init);

    module_exit(hello_exit);

    Makefile內容如下:

    # To build modules outside of the kernel tree, we run "make"

    # in the kernel source tree; the Makefile these then includes this

    # Makefile once again.

    # This conditional selects whether we are being included from the

    # kernel Makefile or not.

    ifeq ($(KERNELRELEASE),)

       

    # Assume the source tree is where the running kernel was built

    # You should set KERNELDIR in the environment if it's elsewhere

    KERNELDIR ?= /lib/modules/$(shell uname -r)/build # 內核樹build目錄的位置

    # The current directory is passed to sub-makes as argument

    PWD := $(shell pwd)

       

    modules:

    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

       

    modules_install:

    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

       

    clean:

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

    # .PHONY修飾的目標就是只有規則沒有依賴

    .PHONY: modules modules_install clean

       

    else

    # called from kernel build system: just declare what our modules are

    obj-m := hello.o # 模塊目標文件

    endif

    需要註意的是Makefile的格式要正確。

       

    開始編譯模塊:

    make

    不出現錯誤的話,用ls -al查看該目錄,會產生如下文件:

    hello.c hello.mod.c hello.o modules.order

    hello.ko hello.mod.o Makefile Module.symvers

       

    現在我們就可以將編譯好的模塊hello載入到內核中去了

    sudo insmod ./hello.ko //這個命令把hello.ko載入到內核,模塊裝載觸發hello.c的init()方法

    sudo lsmod|grep hello //lsmod 這個命令可以查看當前所有的驅動模塊,結果應該顯示hello 680 0

    sudo rmmod hello //這個命令是把hello這個模塊移除掉

       

    程式的輸出結果可以在

    /var/log/syslog文件中查看

    Hello,World

    Goodbye,cruel world

    這是程式的輸出。

    -----------------------------------------------------------

   

有用的連接


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • http://stackoverflow.com/questions/4960048/python-3-and-mysql http://stackoverflow.com/questions/4960048/python-3-and-mysql up vote61down votefavorite ...
  • 上一章給大家說的是資料庫的視圖,存儲過程等等操作,這章主要講索引,以及索引註意事項,如果想看前面的文章,url如下: MYSQL入門全套(第一部) MYSQL入門全套(第二部) 索引簡介 索引是對資料庫表中一個或多個列(例如,employee 表的姓名 (name) 列)的值進行排序的結構。如果想按 ...
  • mysql的性能優化包羅甚廣:索引優化,查詢優化,查詢緩存,伺服器設置優化,操作系統和硬體優化,應用層面優化(web伺服器,緩存)等等。這裡的記錄的優化技巧更適用於開發人員,都是從網路上收集和自己整理的,主要是查詢語句上面的優化,其它層面的優化技巧在此不做記錄。查詢的開銷指標:執行時間檢查的行數返回 ...
  • 在傳統製造業,每一次產業結構的升級都是高新技術轉化為生產力的結果。換一句話說,信息化的集成應用水平一定程度左右著企業業務能力的提升和企業的未來發展。 ...
  • 摘自:http://www.cnblogs.com/hopeworld/archive/2011/04/08/2009252.html 在Windows中可以在某些路徑中查找文件,也可以設定不在某些路徑中查找文件,下麵用Linux中的find的命令結合其-path -prune參數來看看在Linux ...
  • 摘自:http://312788172.iteye.com/blog/730280 我們經常在linux要查找某個文件,但不知道放在哪裡了,可以使用下麵的一些命令來搜索。這些是從網上找到的資料,因為有時很長時間不會用到,當要用的時候經常弄混了,所以放到這裡方便使用。 which 查看可執行文件的位置 ...
  • 1. 下載Linux iso文件,官方下載鏈接中有Mirror,選擇一個合適的鏈接 http://mirrors.163.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso 2. 燒錄成光碟,使用USBWriter寫入到U盤,或者使用虛 ...
  • 最近在看u-boot、osekOS的啟動代碼,其中涉及到lds文件,通過參考其他網友的文章,希望對lds文件有個明晰的認識,為了鞏固及加深影響,特將相關博客內容重寫一遍。 原始文章: http://linux.chinaunix.net/techdoc/beginner/2009/08/12/112 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...