例子是從《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 "而不是在arch/arm/kconfig中。drivers/freg/kconfig
"
如果直接回車進入子選單,發現前面是---,是不能被修改的:
我以為是自己的核心版本有問題,倒騰了半天才明白:應該在一級介面中先對enable loadable module support按下y,使之選中:
然後再回車進入才能看到並修改子項內容:
一萬頭草泥馬奔騰而過,害老子研究半天……
我把模組編譯到核心中,起初卻在/dev下面找不到freg檔案,必須要除錯**看在哪一步出了錯。freg.c原始碼多出呼叫printk函式寫了日誌,我在每條日誌字串頭部加了[freg]的字樣,如下:
printk(kern_alert"以便在浩瀚的核心日誌中篩選出freg的日誌。[freg]initializing freg device.\n
");
$ 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...