1. 程式人生 > >linux 驅動開發之核心樹構建

linux 驅動開發之核心樹構建

    在看<Linux Device Driver Third Edition>的時候,作者其中提到Setting Up Your Test System。他只是指出為2.6.X編寫模組,首先,要求你在Linux系統上構建和配置核心樹,對於2.6版本的核心來說,已有的標頭檔案已經足夠了,但是2.6的模組連結著核心原始碼樹中的物件檔案。這樣模組載入器將更健壯,但是也要求這些物件檔案存在。所以驅動開發的第一件事情就是構建核心原始碼樹。
    他沒有提到如何構建,我從網上找了一些資料,構建了自己的核心樹,寫出來大家分享一下,本人用的是Ubuntu  Linux 10.10 裝在虛擬機器裡面,要求你的虛擬機器硬碟容量最少不低於10G,本人10G,仍有提示硬碟容量不夠,但是還是完成了核心樹的構建,15G硬碟容量應該夠了。
    首先檢視自己的linux核心的版本,在終端中輸入: uname -r
    可以看到自己的核心版本,我的核心版本為:2.6.35-22-generic
   
    然後進入 usr/src/下檢視是否有linux-source 檔案,一般是沒有的,至少我的ubuntu沒有
    沒有就去網上查詢,在終端中輸入: apt-cache search linux-source
    可以看到結果:
        linux-source - Linux kernel source with Ubuntu patches
        linux-source-2.6.35 - Linux kernel source for version 2.6.35 with Ubuntu patches

    選擇同自己核心相應的linux-source版本安裝。具體的安裝方法為,在終端中輸入:
        sudo apt-get install linux-source-2.6.35
    下載完畢後在/usr/src/下有個名為linux-source-2.6.35 的資料夾,在該資料夾裡面有linux-source-2.6.35.tar.bz2    ,解壓到/usr/src/linux-source-2.6.35/目錄下。
    解壓方法,在終端中輸入: sudo -i 切換到根使用者下,定位到/usr/src/linux-source-2.6.35/目錄下,在終端中輸入:tar jxvf linux-source-2.6.35.tar.bz2
    解壓得到檔案原始碼檔案,該原始碼資料夾名稱為linux-source-2.6.35,進入該目錄,注意此時在終端中應該是這樣的:
   

[email protected]:/usr/src/linux-source-2.6.35/linux-source-2.6.35#
    因為解壓出來的原始碼資料夾位於linux-source-2.6.35下,所以有兩層。
    開始配置核心,選擇最快的原版的配置(預設)方式:在終端中輸入:make oldconfig
   
    完成後,先去配置/usr/src/linux-source-2.6.32/linux-source-2.6.35/ubuntu/omnibook/Makefile檔案。
    不然會出現ld: /ubuntu/omnibook/sections.lds: No such file: No such file or directory錯誤
    在根使用者下開啟該Makefile檔案,將其中的PWD=$(shell pwd)剪下到ifeq ($(KERNELRELEASE),) 前面。然後儲存。
   
    然後編譯模組,定位到原始碼資料夾下,在終端中輸入: make modules
    等待將近1個小時,該編譯完成。完成之後,安裝模組,在終端中輸入:make modules_install
    至此,原始碼樹構建完成,重啟系統,
    將《Linux Device Driver Third Edition》中的第一個例子執行下吧。
   
    文中程式碼:helloworld.c


Makefile檔案內容:

  

編譯,在終端中輸入:make

然後載入模組 (root使用者)

   [email protected]:/home/shana/Driver# insmod ./helloworld.ko

    按照書上的例子 會在終端顯示 hello , world 但是執行後什麼都沒有出現 (原因不解)

    [email protected]:/home/shana/Driver# insmod ./helloworld.ko

    檢視載入模組

    ro[email protected]:/home/shana/Driver# lsmod
    Module Size Used by
    helloworld 2560 0

    刪除模組

    [email protected]:/home/shana/Driver# rmmod helloworld

    書中說明,如果不出現在終端,則會寫進 syslog 檔案中

    [email protected]:~# cat /var/log/syslog |grep world
    Jan 20 10:21:23 jk1860-machine kernel: [ 1683.984471] hello world
    Jan 20 10:22:35 jk1860-machine kernel: [ 1755.752461] Goodbye, cruel world

驅動開發環境搭建完成。

可以參考http://blogold.chinaunix.net/u2/81217/showart_1330300.html

本文有借鑑和抄襲其中的內容

相關推薦

linux 驅動開發核心構建

    在看<Linux Device Driver Third Edition>的時候,作者其中提到Setting Up Your Test System。他只是指出為2.6.X編寫模組,首先,要求你在Linux系統上構建和配置核心樹,對於2.6版本的核心來說,

Linux 驅動開發核心模組開發 (二)—— 核心模組編譯 Makefile 入門

一、模組的編譯  我們在前面核心編譯中驅動移植那塊,講到驅動編譯分為靜態編譯和動態編譯;靜態編譯即為將驅動直接編譯進核心,動態編譯即為將驅動編譯成模組。 而動態編譯又分為兩種: a -- 內部編譯        在核心原始碼目錄內編譯 b -- 外部編譯        在核

linux驅動開發蜂鳴器驅動源碼分析(一)

linux 蜂鳴器 驅動 蜂鳴器的驅動源碼在/driver/char/buzzer/x210-buzzer.c文件中,源碼如下#include <linux/module.h> #include <linux/kernel.h> #include <linux

linux驅動開發framebuffer應用編程實踐(一)

linux驅動開發之framebuffer驅動 1、framebuffer應用編程 (1)打開設備文件 (2)獲取設備信息 宏定義的命令在/linux/fb.h中 不可變信息FSCREENINFO,使用ioctl參數有FBIOGET_FSCREENINFO宏名,表示用ioctl從

⑳tiny4412 Linux驅動開發MMC子系統驅動程式

本次我們來說一下SDIO子系統的控制器的開發部分,這部分也是和硬體平臺相關的,在說這個之前,我們先來了解一下相關硬體的基礎知識和概念. MMC MMC全稱MultiMedia Card,由西門子公司和SanDisk公司1997年推出的多媒體記憶卡標準。MMC卡尺寸為32mm

linux驅動開發pwm蜂鳴器

驅動開發,控制pwm蜂鳴器! 蜂鳴器有多種型別,一種是給電就叫,另一種給電了還不行,還需要freq才會叫。大概稱作有源和無源吧! 我們此時將buzzer的驅動加入到核心中去。 /* * linux/drivers/char/smart210_pwm.

Linux驅動開發主裝置號找驅動,次裝置號找裝置

一、引言   很久前接觸linux驅動就知道主裝置號找驅動,次裝置號找裝置。這句到底怎麼理解呢,如何在驅動中實現呢,在介紹該實現之前先看下核心中主次裝置號的管理:   二、Linux核心主次裝置號的管理   Linux的裝置管理是和檔案系統緊密結合的,各種裝置都以檔

Linux驅動開發模組化載入方法

目錄: 一、編寫一個最簡單的hello.c的驅動程式。 二、把此程式直接放到核心目錄下的    ......./char目錄中。應該怎樣修改Makefile以及Kconfig來實現動態的模組化載入 三、在核心目錄下的      ......./char 目錄中新建立一個he

linux驅動開發自動建立裝置節點

在有2.6系列版本中支援udev管理裝置檔案可以方便的建立裝置節點,不必使用mknod來建立,本文使用最小編碼來說明建立的幾個方法。 //主要用到的四個方法在linux/device.h定義: //建立類和釋放類的函式  建立成後將建立/sys/class/name資料

linux 驅動開發-模塊的構建

popu order ray 臨時 構建 大於 license 資源 編譯內核 1.模塊的含義 linux 是採用模塊化的方式構建的,同意內核在執行

嵌入式核心驅動開發學習筆記(十七) 裝置的定義規則和獲取方法

概述 在Linux 2.6中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥著大量的垃圾程式碼,相當多數的程式碼只是在描述板級細節,而這些板級細節對於核心來講,不過是垃圾,如板上的platform裝置、resource、i2c_board_info、sp

linux驅動開發學習--對中斷和核心定時器的學習筆記

一 中斷理解                             &nb

Linux驅動開發11:【裝置】nanopi的PWM驅動

介紹 前兩節利用裝置樹實現了nanopi的LED驅動和按鍵驅動,這一節來實現nonapi的PWM驅動。PWM驅動在核心中也有相應的實現,因此這裡只是按照要求新增裝置樹檔案即可。這一節和之前一樣,首先修改裝置樹檔案進行測試,然後分析核心相應的軟體實現。 新增裝置樹節點 因為在s

Linux驅動開發10:【裝置】nanopi的按鍵驅動

介紹 這一節在nanopi上實現按鍵驅動,和LED驅動一樣,通用的按鍵驅動在linux核心中已經實現好,我們只需要按照要求寫好裝置樹即可,不用我們自己實現按鍵驅動。這一節中首先修改裝置樹並測試按鍵驅動,然後分析drivers/input/keyboard/gpio_keys.c檔案,

《5.linux驅動開發-第5部分-5.8.input子系統基礎按鍵》

《5.linux驅動開發-第5部分-5.8.input子系統基礎之按鍵》 第一部分、章節目錄 5.8.1.什麼是input子系統 5.8.2.input裝置應用層程式設計實踐1 5.8.3.input裝置應用層程式設計實踐2 5.8.4.input子系統架構總覽1 5.8.5.input

《5.linux驅動開發-第4部分-5.4.驅動框架入門LED》

《5.linux驅動開發-第4部分-5.4.驅動框架入門之LED》 第一部分、章節目錄 5.4.1.何謂驅動框架 5.4.2.核心驅動框架中LED的基本情況 5.4.3.初步分析led驅動框架原始碼1 5.4.4.初步分析led驅動框架原始碼2 5.4.5.在核心中新增或去除某個驅動 5

嵌入式核心驅動開發學習筆記(十) 非同步通訊+中斷實現讀取資料

對於linux一切都是檔案,驅動裝置在應用層也是以檔案的形式進行讀寫。之前學了阻塞、非阻塞、多路複用的方式讀裝置,它們都需要應用主動讀取。那麼應用層有沒有一種方式,當底層將資料準備好了,應用程式自動處理這些資料?通過非同步通訊可以實現,這有寫類似硬體層的中斷概念 驅動層(準備好了資料) --&g

嵌入式核心驅動開發學習筆記(九) 多路複用+中斷實現讀取資料

使用阻塞模型雖然可以避免等待資料過程中,CPU對程序的消耗,但是僅僅是為了等待這一個結果,就讓程序進入休眠,對於還要進行其他IO操作的程序而言太“奢侈”。所以引入多路複用的概念,解決這個問題。 非阻塞:立即返回結果,如果想得到期望的結果,要不停的呼叫這個方法(輪詢),非常耗費資源 阻塞:沒有

嵌入式核心驅動開發學習筆記(八) 阻塞模式+中斷實現讀取資料

目前已經學習兩種應用層IO模型的使用 非阻塞:立即返回結果,如果想得到期望的結果,要不停的呼叫這個方法(輪詢),非常耗費資源 阻塞:沒有得到真正的資料前,不返回結果。此時,程序進入阻塞(休眠)態,直到有資料喚醒程序,這個過程不耗資源。 PS:linux應用中,大部分的函式介面都是阻塞

嵌入式核心驅動開發學習筆記(七) 非阻塞模式+中斷實現讀取資料

當中斷髮生時,驅動程式會跳轉到中斷處理的函式入口,實現了中斷的捕獲和處理,但這樣還不夠。要讓使用者能夠獲取到中斷分析的結果,我們將建立一個描述中斷事件的結構體物件。硬體產生中斷後,驅動程式碼將對中斷事件的分析結果儲存在結構體變數中,使用者需要的時候,直接通過介面函式獲取這個結構體的資料。 核心層