免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
71 [报告]
发表于 2012-03-26 11:06 |只看该作者
1. 重定位章节:
接着得刡当前重定位符号的最终目标地址:
  u64   val = sym->st_value + rel.r_addend;
1)这个rel.r_addend是怎么计算出来的呢?在文章中没有找到?
2)难道所有的重定位后的地址都是加一个固定偏移?
我记得应用层的重定位有好几种情况。在内核加载模块这里,为什么只有这一种情况。

2. 模块参数那节
使读者对module_param宏建立一个具体的印象,module_param(dolphin, int, 0)展开后如下:
  param_check_int(dolphin, &( dolphin));   
  static int __param_perm_check_dolphin  __attribute__((unused)) =  \
  static const char __param_str_dolphin[] = " dolphin ";    \
红色那行的宏展开明显错误。

论坛徽章:
0
72 [报告]
发表于 2012-03-26 13:02 |只看该作者
1. 重定位章节:
接着得刡当前重定位符号的最终目标地址:
  u64   val = sym->st_value + rel.r_addend;
1)这个rel.r_addend是怎么计算出来的呢?在文章中没有找到?
2)难道所有的重定位后的地址都是加一个固定偏移?
我记得应用层的重定位有好几种情况。在内核加载模块这里,为什么只有这一种情况。

2. 模块参数那节
使读者对module_param宏建立一个具体的印象,module_param(dolphin, int, 0)展开后如下:
  param_check_int(dolphin, &( dolphin));   
  static int __param_perm_check_dolphin  __attribute__((unused)) =  \
  static const char __param_str_dolphin[] = " dolphin ";    \
红色那行的宏展开明显错误。

===================================
重定位的问题这里我不想再多说了,参考ELF的重定位部分,这部分跟处理器关系比较大。 模块参数的展开,等下回头我看看,初略看一下没发现问题。你看得蛮仔细的。。。

论坛徽章:
0
73 [报告]
发表于 2012-03-26 14:01 |只看该作者
本帖最后由 GFree_Wind 于 2012-03-26 14:10 编辑

回复 72# MagicBoy2010


不知道为什么那个红色的没有显示出来。
是这句static int __param_perm_check_dolphin  __attribute__((unused)) =  \
下一句static const char __param_str_dolphin[] = " dolphin ";    \

原来的宏是
static int __param_perm_check_##name __attribute__((unused)) = \
BUILD_BUG_ON_ZERO((perm) < 0 || (perm) > 0777 || ((perm) & 2))  \
+ BUILD_BUG_ON_ZERO(sizeof(""prefix) > MAX_PARAM_PREFIX_LEN); \
static const char __param_str_##name[] = prefix #name;    \

且不论BUILD_BUG_ON_ZERO的展开形式。
至少static int __param_perm_check_dolphin  __attribute__((unused)) =  x+y;\



呵呵,我看的这么仔细。早知道参加你那个试读送书的活动了。。。。。

论坛徽章:
0
74 [报告]
发表于 2012-03-26 19:27 |只看该作者
本帖最后由 MagicBoy2010 于 2012-03-26 19:28 编辑
GFree_Wind 发表于 2012-03-26 14:01
回复 72# MagicBoy2010


我又仔细看了一下宏定义的代码,你说对了,那个被我作为调试相关的东西给移除了,从"unused"看,这个__param_perm_check_x变量是用不到的,在这个宏定义当中,主要用作对宏参数做静态检查。。。

代码看得够细,这个patch我收了

论坛徽章:
0
75 [报告]
发表于 2012-03-26 21:50 |只看该作者
回复 74# MagicBoy2010

争取明天路上把你的第二章看完,然后决定是否买本书看看呵

也不奖我本书。。。。

论坛徽章:
0
76 [报告]
发表于 2012-03-26 22:16 |只看该作者
GFree_Wind 发表于 2012-03-26 21:50
回复 74# MagicBoy2010

争取明天路上把你的第二章看完,然后决定是否买本书看看呵


我的都散光了啊,出版社也没给我多少,我自己去买的话,也只能给打7折。商人,你懂的

论坛徽章:
0
77 [报告]
发表于 2012-03-26 22:18 |只看该作者
GFree_Wind 发表于 2012-03-26 21:50
回复 74# MagicBoy2010

争取明天路上把你的第二章看完,然后决定是否买本书看看呵


本来你读得这么细,还提交了几个patch,打算给你第2版,上下两篇的架构  

论坛徽章:
0
78 [报告]
发表于 2012-03-27 10:23 |只看该作者
本帖最后由 GFree_Wind 于 2012-03-27 10:25 编辑

总算拜读完了第2章。

问个粗浅的问题:
1. 当驱动是使用模块的形式加载后,是否一定要执行mknod来创建设备节点呢?
2. 当使用动态设备号的时候,设备号由系统分配,我们并不知道设备号是什么?那么在mknod 的时候如何指定设备号呢?
    难道在加载的时候,把设备号打印到log中,通过dcmsg查看得知?感觉不太方便啊。
    是否可以在加载模块的时候,直接创建设备节点呢,从而避免mknod这一步骤?


对了。准备买本书看看了。你的书有一个很好的优点,就是方便实践练习呵。

论坛徽章:
0
79 [报告]
发表于 2012-03-27 11:34 |只看该作者
GFree_Wind 发表于 2012-03-27 10:14
回复 77# MagicBoy2010


没戏弄你,第2版的确到目前还没有具体计划,但是新的构思是有的。。。

论坛徽章:
0
80 [报告]
发表于 2012-03-27 11:43 |只看该作者
问个粗浅的问题:
1. 当驱动是使用模块的形式加载后,是否一定要执行mknod来创建设备节点呢?
2. 当使用动态设备号的时候,设备号由系统分配,我们并不知道设备号是什么?那么在mknod 的时候如何指定设备号呢?
     难道在加载的时候,把设备号打印到log中,通过dcmsg查看得知?感觉不太方便啊。
     是否可以在加载模块的时候,直接创建设备节点呢,从而避免mknod这一步骤?

===================================
1.是否创建设备节点要看你是否给应用程序使用,自己在内核里玩玩,我自己从来不创建设备节点。。。
2. 你不知道?如果你手动创建节点你应该而且有途径知道,这是你(设备驱动程序员)要干的活,而不是应用程序员。直接创建设备节点是很常见也是很流行的做法,所以不需要为手动创建设备节点太费心思。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP