免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2109 | 回复: 6
打印 上一主题 下一主题

怎么根据不同的设备分配不同的缓冲区大小 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-16 21:16 |只看该作者 |倒序浏览
小菜学习Linux内核驱动,想以scull字符设备驱动为原型实现自己的一个驱动。

这个驱动需要生成几个不同的设备,比如生成5个不同的字符设备,这5个设备都要使用到我编写的驱动。

我想要让这几个不同设备的内存缓冲区大小不一样,比如第一个设备分配的缓冲区大小:1kb    第二个设备: 2kb 。。依次类推

驱动的子设备号是 0,1,2,3,4

我想在open_my_device函数即打开设备驱动的时候,分配这些不同大小的缓冲区,这样子的话我需要怎么操作呢?条件编译?还是怎么弄呢?

麻烦各位,谢谢了

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2010-11-16 21:28 |只看该作者
那么你得有一种机制,什么样的设备分配多大内存,然后让驱动可以获取到你的设备名,并根据设备名决定分配多大的内存。

论坛徽章:
0
3 [报告]
发表于 2010-11-16 21:57 |只看该作者
回复 2# Godbach


额,这个。。。我目前只生成一个内核module,这个module的名称是"dev_demo",并且需要借助这个内核module生成5个设备,这5个设备的唯一区别就是分配的缓冲区大小不一样

设备名?是不是设备节点?我有点菜

生成设备节点的话,需要加载进内核以后才可以通过mknod生成,/dev/demo1  /dev/demo2  ......  后续的操作我不太清楚需要怎么做了,麻烦您指点一下吧?


btw:我还有一种想法就是不在open_my_device时分配内存,直接在初始化struct cdev的时候 根据不同的子设备编号0,1,2,3,4 分配好对应的内存缓冲区大小,这是可以做到的。上面的方法我只是想尝试一下,麻烦您再指点一下。。谢谢了

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2010-11-16 22:30 |只看该作者
btw:我还有一种想法就是不在open_my_device时分配内存,直接在初始化struct cdev的时候 根据不同的子设备编号0,1,2,3,4 分配好对应的内存缓冲区大小,这是可以做到的。上面的方法我只是想尝试一下,麻烦您再指点一下。。谢谢了

可以按照不同的子设备号测试一下

论坛徽章:
0
5 [报告]
发表于 2010-11-18 17:19 |只看该作者
可以采用一个主设备,几个次设备的办法来实现,其中在open的时候,可以根据inode节点来判断是哪个次设备。从而开辟不同的缓冲,用filp->private_data来保存开辟内存的首地址,供write,read等操作的使用。还有设备节点现在一般都不手建的,一般采用device_create来实现节点的建立,其中节点的parent指向pdev->device

论坛徽章:
0
6 [报告]
发表于 2010-11-18 21:58 |只看该作者
回复 4# Godbach


    在给设备分配好设备号以后,直接初始化我自定义设备里面的响应域:char * buffer 根据子设备号由kmalloc分配不同的大小,已经测试通过,运行良好

论坛徽章:
0
7 [报告]
发表于 2010-11-18 22:04 |只看该作者
回复 5# steven_miao


    恩,通过filp->private_data域来保持分配的缓冲区的首地址挺好的,打开不同的子设备,也就有不同的inode与之对应,也就确定了唯一性。

   我刚刚开始接触linux驱动不久,建立节点还是通过手动mknod的方式。。不过还是多谢谢你,又学习了,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP