字符设备驱动1
- vi X86_64-linux-gnu/asm/unistd.h
函数的调用 |
---|
open |
SYSCALL_DEFINE3() |
sys_open(char *filename,inflag) |
do_sys_open() |
do_file_open() |
path_openat |
do_tmpfile \return fd |
finish_open |
do_dentry_open |
open = inode->fops->open |
1. open用户空间调用软中断时会产生一个软中断
- 查看软中断号
cd /usr/include/i386-linux-gnu/asm/unistd_32.h
13 __NR_open 5
2.
- cd
、
/usr/include/asm-generic/unistd.h
707 #define __NR_OPEN 1024 __SYSCALL(__NR_open,sys_open)
3.
cd /usr/include/i386-linux-gnu/bits/syscall.h
- #define SYS_open NR_open
自动分配设备号
- alloc_chrdev_region()
int alloc_chrdev_region(dev_t \*dev,unsigned baseminor,unsigned count,const char \*name);
//参数
//dev_t *dev 申请设备号
//unsigned baseminor 申请的第一个次设备号
//unsigned count 申请次设备号的个数
//const char *name 设备或驱动的名字
- ioremap()
static inline void __iomem *ioremap(phys_add_t offset,unsiged long size)
inline
- iounmap()
自动创建设备结点
mdev -s
-> sys/class/目录/文件 -> /dev/文件
sysfs:内核和用户交互的统一接口
cat uevent –>
ls /dev/console l
需要在class的目录下创建类名(目录的名字)
class_createstruct class *cls;
class_create(THIS_MODULE,”fs4412”);在类名下创建节点
device_create- 创建类的返回值
- NULL
- 设备号
- 传的数据 (void)
- 创建设备名
device_create(cls,NULL,devno,NULL,”led”);
销毁设备
void device_destory();销毁类
void class_destory();
.owner = THIS_MODULE //指向当前模块
次设备号的识别
1. iminor
static inline unsigned iminor(const struct inode *inode);