Linux核心之字元裝置驅動

2021-07-09 14:03:30 字數 3632 閱讀 1271

學習計畫:

1.vfs:虛擬檔案系統

vfs的作用就是採用標準的unix系統呼叫讀寫位於不同物理介質上的不同檔案系統。vfs是乙個可

以讓open()、read()、write()等系統呼叫不用關心底層的儲存介質和檔案系統型別就可以工作的

粘合層。在古老的dos作業系統中,要訪問本地檔案系統之外的檔案系統需要使用特殊的工具才能

進行。而在linux下,通過vfs,乙個抽象的通用訪問介面遮蔽了底層檔案系統和物理介質的差異性。

這是linux檔案系統對外的介面。任何要使用檔案系統的程式都必須經由這層介面來使用它。

2.字元裝置驅動

作業:memmove與memcopy的區別

void *memcpy(void *dst, const void *src, size_t count);

void *memmove(void *dst, const void *src, size_t count);

memcpy與memmove的目的都是將n個位元組的源記憶體位址的內容拷貝到目標記憶體位址中。

但當源記憶體和目標記憶體存在重疊時,memcpy會出現錯誤,而memmove能正確地實施拷貝,但這也增加了一點點開銷。

memmove的處理措施:

(1)當源記憶體的首位址等於目標記憶體的首位址時,不進行任何拷貝

(2)當源記憶體的首位址大於目標記憶體的首位址時,實行正向拷貝

(3)當源記憶體的首位址小於目標記憶體的首位址時,實行反向拷貝

內容:0.裝置驅動分類:

塊裝置驅動、字元裝置驅動、網路裝置驅動。

塊裝置、字元裝置都有裝置檔案,而網路裝置則是以網路套接字來實現的,如:eth0 eth1等

1.inode號:裝置編號,使用者態都是通過裝置編號來訪問裝置檔案,乙個檔案至少占用乙個邏輯塊,

一般都是乙個檔案對應多個邏輯塊

1).通過 ln -s *** *** 可在兩個檔案之間實現軟鏈結

2.字元裝置驅動

定義:是指只能乙個位元組乙個位元組讀寫的裝置,不能隨機讀取裝置記憶體中的某一資料,讀取資料需要按照先

後資料。字元裝置是面向流的裝置,常見的字元裝置有滑鼠、鍵盤、串列埠、控制台和led裝置等。:

檢視已有裝置:cat /proc/devices

字元裝置編寫步驟:

1).例項化乙個cdev裝置物件結構體

2).分配裝置號,註冊字元裝置(靜態分配和動態分配)

3).初始化字元裝置

4).將字元裝置加入到系統檔案當中

3.重要的資料結構:

file_operations, file,和 inode.

(1).inode結構體:

dev_t:字元裝置,i_rdev:裝置號;裝置號一共佔32位;

乙個字元裝置必然會對應乙個裝置,*i_cdev,void * i_private

inode包含檔案訪問許可權,屬主,屬組,大小,生成時間,訪問時間,最後修改時間等資訊,結構體如下:

struct inode ;

1.1字元裝置結構體描述:cdev

struct cdev;

1.2.linux2.6核心提供了一組函式來操作cdev結構體

void cdev_init(struct cdev *,struct file_operations *);/*初始化cdev的成員,

*並且建立cdev與file_operation的連線*/

struct cdev *cdev_alloc(void);/*動態申請乙個cdev的記憶體空間*/

void cdev_put(struct cdev *p);

int cdev_add(struct cdev*,dev_t,unsigned);/*新增乙個cdev,完成字元的註冊*/

void cdev_del(struct cdev*);/*刪除乙個cdev,完成字元的登出*/

在呼叫cdev_add函式向系統註冊字元裝置之前,應該先呼叫register_chrdev_region()

函式或是alloc_chrdev_region()函式向系統申請裝置號;模型為:

int register_chrdev_region(dev_t from,unsigned count,constchar *name);

int alloc_chrdev_region(dev_t *dev,unsignedbaseminor,unsigned count,const char *name)

在系統呼叫cdev_del函式從系統登出字元裝置後,unregister_chrdev_region()應該釋放之前申請的裝置號

該函式原型為:

unregister_chrdev_region(dev_t from,unsigned count)

(2).file結構體:

系統中每個開啟的檔案在核心空間都會有乙個關聯的struct file結構體,它由核心開啟檔案

建立,在檔案所有例項都關閉後,核心釋放這個資料結構。在核心源**中struct file結

構體的指標通常被命名為file或filp。這個結構體在核心中如下:

struct file f_u;

struct path  f_path;

#define f_dentry f_path.dentry

#define f_vfsmnt f_path.mnt

const struct file_operations *f_op;//和檔案關聯的操作,file_operations結構體是字元裝置核心

//函式操作集

spinlock_t  f_lock;

atomic_long_t  f_count;

unsigned int f_flags;//檔案標誌,也就是檔案開啟方式o_rdonly,o_wronly,ordwr等

fmode_t   f_mode;//檔案讀寫模式,也就是許可權

loff_t   f_pos;//當前讀寫位置

struct fown_struct f_owner;

const struct cred *f_cred;

struct file_ra_state f_ra;

u64   f_version;

#ifdef config_security

void   *f_security;

#endif

void   *private_data;//檔案私有資料

#ifdef config_epoll

檔案讀寫模式f_mode,標誌f_flags都是裝置驅動關心的內容,而私有資料指標*private_data在裝置驅動中廣泛

應用,大多數指向裝置驅動自定義用於描述裝置的結構體。

if(file->f_mode & fmode_write)//使用者要求可寫

if(file->f_flags & o_rdwr)//用於檢查裝置是否使用可讀寫方式開啟

4.測試驅動程式

1).載入驅動程式:insomd ***x.ko

2).檢視是否載入成功:cat /proc/devices

3).建立裝置檔案:mknod demo3 c 11 xx;

demo0:檔名,c:字元裝置檔案,11:主裝置號,xx:次裝置號(0-255)之間

4).執行裝置檔案:cat demo3

5).使用測試檔案測試驅動程式

6).寫入命令:echo 12568585 >> demo3

Linux裝置驅動之《字元裝置驅動》

linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...

Linux裝置驅動之字元裝置驅動

一 linux裝置的分類 linux系統將裝置分成三種基本型別,每個模組通常實現為其中某一類 字元模組 塊模組或網路模組。這三種型別有 字元裝置 字元裝置是個能夠像位元組流 類似檔案 一樣被訪問的裝置,由字元裝置驅動程式來實現這種特性。字元裝置可以通過檔案系統節點來訪問,比如 dev tty1等。這...

linux核心字元裝置驅動之讀操作

char rbuf 1024 分配緩衝區,儲存讀取的資料 ret read fd,rbuf,1024 讀裝置,將從裝置讀取的資料儲存在rbuf緩衝區中,要讀1024位元組 ret儲存實際讀取的位元組數 struct file operations read介面作用 用於讀取裝置,並且將讀取的資料上報...