免费注册 查看新帖 |

Chinaunix

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

[硬件及驱动] Linux设备驱动可以是没有module,直接通过地址+偏移量访问设备寄存器吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-03 11:28 |只看该作者 |倒序浏览
       通常来说Linux系统下设备驱动程序都是通过  module_init(...);  module_exit(...);  来加载到内核中运行的。 如果,该设备直接连接的CPU的地址&数据总线上,Linux系统下设备驱动程序是否可以通过直接操作 “地址+偏移量” 的方式实现对该设备的访问与操作。(就像VxWorks系统那样)。谢谢。

论坛徽章:
0
2 [报告]
发表于 2013-03-03 15:16 |只看该作者
没人知道吗?

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
3 [报告]
发表于 2013-03-03 20:07 |只看该作者
我想楼主的理解可能有点偏了。
module_init(...);这个并不是对驱动的访问
在include/linux/init.h中有对他定义:
#define module_init(x)  __initcall(x);
之后的展开我就不写了,简单地说就是在start_kernel以后会运行这个module_init。
所以,module_init只是做一件事,就是把这个函数加到需要初始化的数组里。
那么对设备的访问呢,一般都是硬件上接好了,使得某一个物理地址映射到一个设备的寄存器空间。那么可以通过任何的访存指令读写这个地址
你说的地址加偏移量只是其中一种寻址方式,无论什么寻址方式都可以

论坛徽章:
0
4 [报告]
发表于 2013-03-04 13:46 |只看该作者
楼上的正解。
init/exit_module是加载/卸载内核模块的接口,如果硬件驱动程序也搞成内核模块,肯定也是通过这个接口来加载的。但是这个跟硬件的实际访问是两码事。

至于如何访问,那是硬件的事,操作系统只能遵从,不能修改。

而地址加偏移量这种访问方式,跟硬件和操作系统都没有关系,根本原因就是这样写容易理解容易维护而已。映射一块空间,然后弄几个宏定义,这样的代码无论读还是维护都比较方便。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
5 [报告]
发表于 2013-03-04 14:59 |只看该作者
可以,但是你不可能这么玩 。

论坛徽章:
0
6 [报告]
发表于 2013-03-04 16:19 |只看该作者
回复 3# amarant


    谢谢您的回复,对我帮助很大。我想是这样的,在Linux系统中,所有的硬件设备都被抽象成为一个文件。我的理解是module_init(...) 这个过程,其实就是把硬件设备
抽象成文件的一个过程,同时定义了文件的“打开”、“读”、“写”等方式。  然后,我们在上层的应用层访问该设备的时候,首先是打开“文件”(其实就是开始操作这个设备),
内存映射。然后才是通过“读写”文件的方式,来操作设备。

   我想再问一个的是,我现在就没有将设备抽象成文件这个过程了。  怎么会还能通过操作文件的方式操作设备?  难道是硬件物理连接好了以后,内存映射就不需要我们做了,
指针指向内存地址(基地址+偏移量),就直接是设备的寄存器地址了?
   非常非常感谢。

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
7 [报告]
发表于 2013-03-04 18:56 |只看该作者

打开、读、写是虚拟文件系统一层一层下来的,初始化的过程就是做了一个绑定的过程


   我想再问一个的是,我现在就没有将设备抽象成文件这个过程了。  怎么会还能通过操作文件的方式操作设备?  难道是硬件物理连接好了以后,内存映射就不需要我们做了,
指针指向内存地址(基地址+偏移量),就直接是设备的寄存器地址了?
   非常非常感谢。
这个也是可以的,你可以通过ioremap的方法直接对设备的地址空间读写,具体的百度下ioremap吧

论坛徽章:
0
8 [报告]
发表于 2013-03-04 19:57 |只看该作者
可以,pci设备就可以直接访问,不过要提升权限
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP