字元驅動涉及的資料結構及方法

2021-07-11 12:11:52 字數 2190 閱讀 3561

一、獲取主裝置號的原始碼:

if (***_major) 

else

if (retsult < 0)

二、以下將給出三個驅動程式操作涉及的核心資料結構,其中struct file_operations結構體儲存了

字元驅動的方法,struct file 表示乙個開啟的檔案, struct inode 表示乙個磁碟檔案。

1)、struct file_operations結構體:

struct file_operations結構體中的成員函式是字元裝置驅動的主體內容,在系統呼叫時會最終被

核心呼叫,它定義了字元裝置驅動提供給虛擬檔案系統的介面函式。例如:

struct file_operations ;
其中方法poll、epoll、select這三個系統呼叫可用來查詢某個或多個檔案描述符上的讀取或是寫入是否會被阻塞,

ioctl方法提供了一種執行裝置特定命令的方法(比如格式化軟盤的某個磁軌,這既不是讀操作也不是寫操作)

以上兩個函式包含__user字串,是一種形式的文件而已,表明指標是乙個使用者空間位址,因此不能

被直接引用,可以通過copy_to_user()、copy_from_user()等函式來實現。

2)、file 結構體:

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;

atomic_t f_count;

unsigned int f_flags;

mode_t f_mode;

loff_t f_pos;

struct fown_struct f_owner;

unsigned int f_uid, f_gid;

struct file_ra_state f_ra;

unsigned long f_version;

#ifdef config_security

void *f_security;

#endif

/* needed for tty driver, and maybe others */

void *private_data;

#ifdef config_epoll

/* used by fs/eventpoll.c to link all the hooks to this file */

struct list_head f_ep_links;

spinlock_t f_ep_lock;

#endif /* #ifdef config_epoll */

};

其中void  *private_data; private_data用來儲存跨系統呼叫時儲存的狀態資訊的非常有用的資源,

原始碼中通過struct globalmem_dev *dev = filp->private_data;來獲取globalmem_dev的例項指標。

實際上,大多數linux驅動都遵循乙個潛規則,那就是將檔案的私有資料private_data指向裝置結構體,

再用read()、write()等函式通過private_data訪問裝置結構體。

struct cdev ;
完成cdev的初始化並新增到系統中的原始碼如下:
static void scull_setup_cdev(struct scull_dev *dev, int index)

四、read和write實現:
1)、read實現

static ssize_t globalmem_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)

else

return ret;

}2)、write實現

static ssize_t globalmem_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)

else

return ret;

}

Redis內部涉及 的資料結構

redis就是記憶體中維持乙個巨大的字典,字典的key節點及value節點是乙個個資料結構。在這裡簡單介紹一下redis用到的資料結構。b 1.簡易動態字串 sds b redis沒有使用傳統的c字串形式,取而代之的是自己實現了乙個簡單動態字串簡易動態字串結構,簡稱為sds dynamic stri...

驅動主要資料結構

驅動物件 driver object typedef struct driver object driver object typedef struct driver object pdriver object n is 結構圖 裝置物件 deviceobject typedef struct de...

hash map的資料結構剖析及相關方法

hash map是個很有用的索引結構,對於大規模資料檢索的時候,用處大大的。本文基於原始碼的基礎上,從資料結構開始剖析,進而介紹一些常用的方法。hash map是基於hash table基礎上封裝的方法類,下面看看hash table的資料結構 template,class equalkey equ...