[cpp]
view plain
copy
intmain(
intargc ,
char
*argv)
(1)/dev目錄下的裝置檔案基本上都是通過mdev來動態建立的。mdev是乙個使用者態的應用程式,位於busybox工具箱中。其建立過程包括:
(2)如果初始化過程中沒有呼叫device_create介面來建立裝置檔案,則需要手動通過命令列呼叫mknod介面來建立裝置檔案。
(3)mknod介面分析
(1)open裝置檔案,是為了獲取(該裝置驅動的)file_operations操作集。
[cpp]
view plain
copy
struct
file
;
(2)以下是led裝置驅動的操作介面。open("/dev/led",o_rdwr)就是為了獲得led_fops。
[cpp]
view plain
copy
static
const
struct
file_operations led_fops = ;
(3)open介面分析
通過系統呼叫後對應呼叫sys_open,其是vfs層的介面sys_open(/dev/led)
在__dentry_open()函式中有
[cpp]
view plain
copy
if(!open && f->f_op)
open = f->f_op->open;
if(open)
[cpp]
view plain
copy
const
struct
file_operations def_chr_fops = ;
(4)繼續分析chrdev_open
(1)字元裝置對應的結構體cdev
[cpp]
view plain
copy
struct
cdev
; (2)led裝置驅動初始化和裝置驅動註冊
通過第五步的字元裝置的註冊過程,應該很容易理解kobj_lookup查詢led_ops的過程(這裡不寫)。
至此,獲得led裝置驅動的led_ops。
(1)接著呼叫file->f_ops->open來呼叫led_open
(2)最後chrdev_open一步步返回
這裡以裝置寫為例,主要是控制led的亮和滅。
write(fd,val,1)系統呼叫後對應sys_write,其對應所有的檔案寫,包括目錄、一般檔案和裝置檔案。
一般檔案有位置偏移的概念,即讀寫之後,當前位置會發生變化,所以如要跳著讀寫,就需要fseek。
對於字元裝置檔案,沒有位置的概念。因此重點跟蹤vfs_write的過程。
綜上所述,字元裝置的初始化包括兩個主要環節:
(1)字元裝置驅動的註冊
(2)建立屬性檔案、裝置檔案
驅動 linux裝置驅動 字元裝置驅動開發
preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...
Linux裝置驅動之《字元裝置驅動》
linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...
Linux裝置驅動之字元裝置驅動
一 linux裝置的分類 linux系統將裝置分成三種基本型別,每個模組通常實現為其中某一類 字元模組 塊模組或網路模組。這三種型別有 字元裝置 字元裝置是個能夠像位元組流 類似檔案 一樣被訪問的裝置,由字元裝置驅動程式來實現這種特性。字元裝置可以通過檔案系統節點來訪問,比如 dev tty1等。這...