网站关键字推广/五行seo博客
看肯定是能看懂,经常忘记,若能背下来,那是更好。看书又要从头看,肯定是要总结一个云笔记那就是这篇博客
struct cdev {struct kobject kobj;struct module *owner;struct file_operations *ops;struct list_head list;dev_t dev; //设备号unsigned int count;
};---------------------------------------------------------
void cdev_init(struct cdev*, struct file_operations *);struct cdev *cdev_alloc(void);void cdev_put(struct cdev *p);// 添加一个字符设备到系统
int cdev_add(struct cdev *, dev_t, unsigned);// 从系统移除一个字符设备
void cdev_del(struct cdev *);int register_chrdev_region(dev_t from, unsigned count, const char* name);int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char* name);-------------
fops:read()函数用于读取数据,成功时返回读取的字节数,出错时返回一个负值。read() ----> ssize_t read(int fd, void *buf, size_t count)----> size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)write()函数向设备发送数据,成功时返回写入的字节数。write() ---> ssize_t write(int fd, void *buf, size_t count);---> ssize_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
无情插入tips:
1. read()和write() 如果返回0, 则暗示 end_of_file(EOF)
2. .unlocked_ioctl 和 .compat_ioctl区别:很多驱动里都有一个宏 CONFIG_COMPAT,这个宏理解起来啥意思呢,我也没看到在哪里看到说明,比如这个:static const struct file_operations fops = {.owner = THIS_MODULE,.unlocked_ioctl = my_ioctl,.open = my_open,.release = my_release,#ifdef CONFIG_COMPAT.compat_ioctl = my_compat_ioctl,
#endif.mmap = my_mmap,
};32位cpu, msm8909, 应用层调用ioctl, 进入的是unlocked_ioctl 。64位cpu,应用层调用ioctl,进入的应该是compat_ioctl。CONFIG_COMPAT宏的话,在32位的机器上应该是未定义的。
然后下一个函数mmap():mmap()函数将设备内存映射到进程的虚拟地址空间中。与用户空间的void *mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset)函数对应。最近看的binder,binder驱动里进程通信就是mmap实现的。---------------------------------想写个驱动例子,搞一搞,理解下,暂时没看到例程,后面再看一看
下一个关注的是read()和write()中系统调用函数:unsigned long copy_from_user(void *to, const void __user *from, unsigned long count);unsigned long copy_to_user(void __user *to, const void *from, unsigned long count);成功返回0, 失败返回负值。
然后关注的是ioctl()函数:关注幻数的生成(32位)内核定义了_IO(), _IOR(), _IOW()和_IOWR()辅助生成命令,先自定义一个MAGIC_NUM,然后自定cmd参数:设备类型字段,序列号, 数据长度字段
---------------------
#define MY_MAGIC_NUM 0XA0#define CHAO_COMMAND_ONE _IOW(MY_MYGIC_NUM, 1, int)
#define CHAO_COMMAND_TWO _IOW(MY_MYGIC_NUM, 2, int)
#define CHAO_COMMAND_TEN _IOW(MY_MYGIC_NUM, 10, int)