免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: MagicBoy2010
打印 上一主题 下一主题

《深入Linux设备驱动程序内核机制》第1章 内核模块 [复制链接]

论坛徽章:
0
81 [报告]
发表于 2012-03-27 11:55 |只看该作者
回复 80# MagicBoy2010


刚刚在China-Pub上看了老兄的个人介绍。
这就下单买一本支持!还是不错的书的。

第二版早点告诉我啊,我好看看能不能得到奖品呵。

论坛徽章:
0
82 [报告]
发表于 2012-03-27 11:57 |只看该作者
回复 81# MagicBoy2010


2. 你不知道?如果你手动创建节点你应该而且有途径知道,这是你(设备驱动程序员)要干的活,而不是应用程序员。直接创建设备节点是很常见也是很流行的做法,所以不需要为手动创建设备节点太费心思。
=======================
我的问题是动态申请设备号的时候。我是不知道系统会给驱动分的设备号的,因为在加载执行的时候,系统才会分配啊。
这样的话,是否只有通过dcmsg查看log的方式得到?有没有其它的方法呢?

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
83 [报告]
发表于 2012-03-27 14:32 |只看该作者
回复 83# GFree_Wind

内核通过uevent通知用户空间,其中会往环境变量里写MAJOR, MINOR:

在dev_uevent()里有:

add_uevent_var(env, "MAJOR=%u", MAJOR(dev->devt));
add_uevent_var(env, "MINOR=%u", MINOR(dev->devt));

所以用户空间可以知道设备号是什么!


   

论坛徽章:
0
84 [报告]
发表于 2012-03-27 15:12 |只看该作者
回复 84# asuka2001

内核通过uevent通知用户空间,其中会往环境变量里写MAJOR, MINOR:

在dev_uevent()里有:
add_uevent_var(env, "MAJOR=%u", MAJOR(dev->devt));
add_uevent_var(env, "MINOR=%u", MINOR(dev->devt));
所以用户空间可以知道设备号是什么!

===========================================
这样的话,第二次加载设备驱动的话,会覆盖掉前一次的环境变量MAJOR和MINOR?

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
85 [报告]
发表于 2012-03-27 15:21 |只看该作者
本帖最后由 asuka2001 于 2012-03-27 15:28 编辑

回复 85# GFree_Wind

这个就真的没研究那么深了,你如果感兴趣可以去看看driver/base/core.c里的这部分代码

kobject_uevent()===>kobject_uevent_env()===> kset->uevent_ops->uevent()===>dev_uevent()

我粗略的看了下估计是不会的。一次uevent事件跟着它自己的环境变量kobj_uevent_env,在代码里看到了kzmalloc()分配出env。然后应该是依靠netlink发送到用户空间去!

论坛徽章:
0
86 [报告]
发表于 2012-03-27 15:50 |只看该作者
回复 86# asuka2001

这个就真的没研究那么深了,你如果感兴趣可以去看看driver/base/core.c里的这部分代码
kobject_uevent()===>kobject_uevent_env()===> kset->uevent_ops->uevent()===>dev_uevent()
我粗略的看了下估计是不会的。一次uevent事件跟着它自己的环境变量kobj_uevent_env,在代码里看到了kzmalloc()分配出env。然后应该是依靠netlink发送到用户空间去!

======================================
thank you。如果是使用netlink发送的,就不会直接去修改用户空间的环境变量了,也就不会有覆盖的问题了

论坛徽章:
0
87 [报告]
发表于 2012-03-27 23:25 |只看该作者
明天拜读下第一章。。。

论坛徽章:
0
88 [报告]
发表于 2012-03-28 10:28 |只看该作者
GFree_Wind 发表于 2012-03-27 11:57
回复 81# MagicBoy2010


你可以在/proc/devices中得到你要的信息,这个/proc/devices在Linux初始化时就创建好了(proc_devices_init),你去cat这个文件,它就会去读(devinfo_show --> chrdev_show)chrdevs数组中存储的信息,在你的设备驱动中显然是通过alloc_chrdev_region把动态分配的设备号写进去的...所以如果你提供这样legacy的字符型设备驱动模块给你的用户,你提供一个脚本加载模块之后,接着读取/proc/devices中的major,然后mknod就可以了。总之,应用程序员只关心设备节点名。。。

论坛徽章:
0
89 [报告]
发表于 2012-03-28 10:36 |只看该作者
对于字符设备框架而言,动态创建设备节点的例子在书中P264,在cdev_add之外需要独立的class_create和device_create...
而一般常见的pci/usb设备,在device_add中直接就完成了。所以device_add本来可以把cdev_add给替换掉的,但是现在还有不少字符设备使用cdev_add接口,那么现在的情形就相当于device_add ~= cdev_add + class_create + device_create. 也许以后会统一起来。。。

论坛徽章:
0
90 [报告]
发表于 2012-03-28 12:23 |只看该作者
回复 90# MagicBoy2010


昨天已经在chinapub上订了你的书,估计这两天应该可以送到了。
一定好好拜读
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP