23 类型的封装(内核里的继承)
2017-06-09 17:30
176 查看
#include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/cdev.h> #include <linux/slab.h> #include <asm/uaccess.h> #define MYMA 1234 #define MYMI 7788 #define COUNT 1 //为了方便重用和维护,把驱动所用到的数据封装成一个类型。 typedef struct { dev_t devid; struct cdev mycdev; u8 *data; //驱动数据缓冲区 int dlen; //驱动数据缓冲区长度 }mydev_t; ssize_t myread(struct file *fl, char __user *buf, size_t len, loff_t *off) { struct cdev *cdev = fl->f_path.dentry->d_inode->i_cdev; //这里可能得到mydev_t对象的mycdev成员地址 mydev_t *dev = container_of(cdev, mydev_t, mycdev);//通过mycdev成员的地址得到mydev_t对象的首地址 int len_copy, ret; if ((fl->f_pos + len) > strlen(dev->data)) len_copy = strlen(dev->data) - fl->f_pos; else len_copy = len; ret = copy_to_user(buf, dev->data+fl->f_pos, len_copy); *off += len_copy - ret; return len_copy - ret; } struct file_operations fops = { .owner = THIS_MODULE, .read = myread, }; mydev_t *dev; static int __init test_init(void) { int ret, i; dev = kzalloc(sizeof(*dev), GFP_KERNEL); dev->devid = MKDEV(MYMA, MYMI); ret = register_chrdev_region(dev->devid, COUNT, "mydev"); if (ret < 0) goto err0; cdev_init(&(dev->mycdev), &fops); dev->mycdev.owner = THIS_MODULE; ret = cdev_add(&(dev->mycdev), dev->devid, COUNT); if (ret < 0) goto err1; dev->dlen = 26; dev->data = kzalloc(dev->dlen, GFP_KERNEL); for (i = 0; i < 26; i++) dev->data[i] = 'A' + i; return 0; err1: unregister_chrdev_region(dev->devid, COUNT); err0: return ret; } static void __exit test_exit(void) { unregister_chrdev_region(dev->devid, COUNT); cdev_del(&(dev->mycdev)); kfree(dev->data); kfree(dev); } module_init(test_init); module_exit(test_exit); MODULE_LICENSE("GPL");
相关文章推荐
- 21 类型的封装(内核里的继承)
- java笔记之封装、继承、重写、多态以及类型转换
- 一切皆对象之两个方法概括js,无函数签名(无多态),原型,闭包,封装,引用类型,继承……
- java笔记之封装、继承、重写、多态以及类型转换
- OC学习:OC_中基本数据类型和结构体的封装(NSNumber继承与NSValue)
- day33 序列类型,绑定方法,类方法,静态方法,封装继承和多态
- 20140729 while((*pa++=*pb++)!='\0') 合并数组代码 C++类型转换关键字 封装 多态 继承
- java语言基础(23)——面向对象三大特性(封装、继承、多态)
- java基础(2)-基础类型和语法(static、内部类、final、抽象类、接口、封装)(并将这些基础知识与java的三大特征关联(继承、多态、封装))
- java笔记之封装、继承、重写、多态以及类型转换
- 黑马程序员---OC基础---封装、继承、多态、@property、id类型、实例变量修饰符
- Classes in JScript – Part III 类的继承与封装
- 封装,继承,多态
- 面向对象的三大特点(封装,继承,多态)
- ACE封装——使用继承提高设计清晰和可扩性
- 内核内存分配类型
- C++ FAQ Lite[23]--继承(你所不知道的)(更新)
- 类,对象,封装,接口,多态,继承
- 面向对象设计三大原则(封装变化点,对接口进行编程,多使用组合而不是继承)
- 面向对象的三个基本特征:封装、继承、多态