字元裝置驅動框架學習總結

2021-06-20 20:43:32 字數 2848 閱讀 8400

struct cdev ;
dev_t dev:裝置號,32位。高12位為主裝置號,地20位為次裝置號。

使用下面巨集獲取主次裝置號:

major(dev_t dev)

minor(dev_t dev)

由主次裝置號生成裝置號:

mkdev(int major,int minor)

2:struct file_operations

struct file_operations ;
3:struct 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;

spinlock_t f_lock; /* f_ep_links, f_flags, no irq */

#ifdef config_smp

int f_sb_list_cpu;

#endif

atomic_long_t f_count;

unsigned int f_flags;

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

/* 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;

#endif /* #ifdef config_epoll */

#ifdef config_debug_writecount

unsigned long f_mnt_write_state;

#endif

};

4:struct inode

struct inode ;

unsigned long i_ino;

atomic_t i_count;

unsigned int i_nlink;

dev_t i_rdev;//包含了真正的裝置編號

unsigned int i_blkbits;

u64 i_version;

loff_t i_size;

#ifdef __need_i_size_ordered

seqcount_t i_size_seqcount;

#endif

struct timespec i_atime;

struct timespec i_mtime;

struct timespec i_ctime;

blkcnt_t i_blocks;

unsigned short i_bytes;

struct rw_semaphore i_alloc_sem;

const struct file_operations *i_fop; /* former ->i_op->default_file_ops */

struct file_lock *i_flock;

struct address_space i_data;

#ifdef config_quota

struct dquot *i_dquot[maxquotas];

#endif

struct list_head i_devices;

union )

字元驅動框架提供的重要函式實現了驅動程式和核心的無縫連線。

int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,

const char *name);

動態申請主裝置號,第二個引數起始次裝置號,第三個引數是此裝置號數目,最後乙個引數是裝置名稱,出現在/proc/devices中。

void unregister_chrdev_region(dev_t from, unsigned count)

登出主裝置號

void cdev_init(struct cdev *, const struct file_operations *);

把裝置操作集和字元裝置關聯

int cdev_add(struct cdev *, dev_t, unsigned);

裝置號和字元裝置繫結

void cdev_del(struct cdev *);

刪除乙個字元裝置

1:申請分配主裝置號

3:把介面函式與字元裝置程式的cdev抽象關聯

4:把主裝置號和驅動程式的cdev關聯

5:在/dev和/sys下建立節點

6:初始化硬體

Linux字元裝置驅動框架總結

對於linux而言,一切皆檔案,在linux系統下,所有檔案都可以像文字檔案一樣open read write,那麼對於linux裝置驅動而言,比如現在有乙個點燈的驅動程式,它的裝置節點是 dev 當應用程式執行open read write的時候,是如何呼叫到驅動程式裡的open read wri...

字元裝置驅動框架

字元裝置驅動框架 一 linux軟體系統的層次關係 乙個應用程式操作底層驅動程式的過程 1 應用程式使用庫提供的 open函式開啟某乙個裝置檔案。2.庫根據 open函式傳入的引數執行 swi 軟體中斷 指令,這會引起 cpu異常,進入核心。3 核心的異常處理函式根據這些引數找到相應的驅動程式,返回...

字元裝置驅動框架

標頭檔案 linux cdev.h linux fs.h 描述字元裝置共性資訊的結構體 struct cdev 操作方法集 struct file operations 裝置號,本質是32位無符號整型數 dev t dev 該裝置號由兩部分組成,1.主裝置號 2.次裝置號 major dev t d...