Linux字元裝置驅動剖析

2021-08-19 10:37:41 字數 2075 閱讀 5610

[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等。這...