首页 >> 知识 >> Linux驱动编写(适用WSL2)

Linux驱动编写(适用WSL2)

驱动代码架构分析

  驱动程序与内核模块的编写有着共通之处,驱动程序在内核模块的基础上补充添加更为完善的调用响应。驱动的执行过程为:

应用程序使用库提供的open(dev_name, mode)函数打开dev_name设备文件;库根据传入参数执行swi指令,这条指令将会引发CPU异常从而进入内核;内核的异常处理函数根据所提供的参数查找相应的驱动程序;执行驱动程序;返回一个文件句柄给库,进而返回给应用程序。

  其他库函数read()、write()等的执行过程类似。因此,要完成驱动程序的编写,实际上主要要完成对驱动所支持的各函数的编写。驱动所支持的函数调用结构体如下,仅选取部分重要的内容显示:

struct file_operations { struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); ... int (*open) (struct inode *, struct file *); int (*flush) (struct file *, fl_owner_t id); ...};

  struct file_operations将字符设备驱动的操作和设备号联系起来,是一系列指针的集合,每个被打开的文件都对应于一系列的操作,用来执行一系列的系统调用。

  因此笔者最终完成的驱动所使用的该结构体

网站地图