實現核心驅動程式模組

2021-07-10 02:35:20 字數 2549 閱讀 7887

例子是從《android系統源**情景分析》第二章抄過來的,在學習的過程中還是遇到了不少的問題。

個人體會:在學習第二章之前應該把《linux裝置驅動程式》這本書至少前四章要讀一遍,理解一些基礎概念和背景知識,不過這本書還是略舊,比如sysfs就沒有解釋,多google吧。

本書第二章要理解透了再往下進行,因為這個簡單的例子從下往上貫穿了android系統各層,是理解後面各章的基礎。

下面列出我遇到的問題和解決辦法。

它實現了proc檔案系統介面、傳統的裝置檔案系統介面和devfs檔案系統介面。

類unix系統有一條基本的設計哲學:幾乎所有的資料實體都被抽象成統一的介面——檔案來看待。procfs、devfs和sysfs都是這種設計的體現。

/dev目錄下每乙個檔案對應乙個裝置,通過操作這些檔案可以實現與核心的互動,但devfs存在一些缺點,如命名不靈活,不能任意指定檔名,而且所有檔案都在/dev/根目錄下。進而演生出sysfs,它把實際連線到系統上的裝置組織成乙個分級的檔案體系,比devfs更清晰更便於管理,sysfs掛載在/sys下面。

因此我打算只實現傳統裝置檔案系統介面的部分,sysfs和procfs暫不實現。我認為依然可以完整地正常工作。

$ cd working_directory

$ source build/envsetup.sh

$ lunch aosp_arm-eng

$ cd kernel

$ cd goldfish

$ export arch=arm

$ export subarch=arm

$ export cross_compile=arm-eabi-$ export path=working_directory/prebuilts/gcc/darwin-x86/arm/arm-eabi-4.8/bin:$path

$ make

goldfish_armv7_defconfig

$ make

menuconfig

$ make -j8

$ emulator -kernel arch/arm/boot/zimage &

sema_init(&(dev->sem), 1);

source "

drivers/freg/kconfig

"

而不是在arch/arm/kconfig中。

如果直接回車進入子選單,發現前面是---,是不能被修改的:

我以為是自己的核心版本有問題,倒騰了半天才明白:應該在一級介面中先對enable loadable module support按下y,使之選中:

然後再回車進入才能看到並修改子項內容:

一萬頭草泥馬奔騰而過,害老子研究半天……

我把模組編譯到核心中,起初卻在/dev下面找不到freg檔案,必須要除錯**看在哪一步出了錯。freg.c原始碼多出呼叫printk函式寫了日誌,我在每條日誌字串頭部加了[freg]的字樣,如下:

printk(kern_alert"

[freg]initializing freg device.\n

");

以便在浩瀚的核心日誌中篩選出freg的日誌。

$ adb shell

$ dmesg | grep

"\[freg\]

"[freg]initializing freg device.

[freg]succeeded to initialize freg device.

$ emulator -kernel arch/arm/boot/zimage -show-kernel &
當在make menuconfig中選擇了動態載入模組,編譯、啟動emulator,需要通過adb把.ko模組push到emulator:

# 啟動emulator

$ emulator -kernel arch/arm/boot/zimage 把剛剛編譯的freg.ko拷貝到emulator的/data下

$ adb push drivers/freg/freg.ko /data

$ adb shell

ls -l /data/freg.ko

-rw-rw-rw- root root 5281

2016-02-21

01:45

freg.ko

# 載入freg.ko模組

$ adb shell

insmod /data/freg.ko

linux下自動載入裝置驅動程式模組

模組載入的兩種方式 1 動態載入 動態載入是將驅動模組載入到核心中,而不能放入 lib modules 下。在2.4核心中,載入驅動命令為 insmod 刪除模組為 rmmod 在2.6以上核心中,除了insmod和rmmod外,載入命令更有modprobe insmod和modprobe不同之處 ...

測試Linux核心驅動程式

在編寫linux核心驅動程式中,我們介紹了如何在ubuntu上為android系統編寫linux核心驅動程式。在這個名為hello的linux核心驅動程式中,建立三個不同的檔案節點來供使用者空間訪問,分別是傳統的裝置檔案 dev hello proc系統檔案 proc hello和devfs系統屬性...

核心 驅動 字元裝置驅動程式 3

open和release open方法 提供給驅動程式以初始化的能力,open方法應完成以下工作 檢查裝置特定的錯誤 如果裝置是首次開啟,則對其進行初始化工作 如有必要,更新f op元件 分配並填寫置於filp private data裡的資料結構 int open struct inode ino...