Chinaunix

标题: Linux设备驱动可以是没有module,直接通过地址+偏移量访问设备寄存器吗? [打印本页]

作者: qinpanke    时间: 2013-03-03 11:28
标题: Linux设备驱动可以是没有module,直接通过地址+偏移量访问设备寄存器吗?
       通常来说Linux系统下设备驱动程序都是通过  module_init(...);  module_exit(...);  来加载到内核中运行的。 如果,该设备直接连接的CPU的地址&数据总线上,Linux系统下设备驱动程序是否可以通过直接操作 “地址+偏移量” 的方式实现对该设备的访问与操作。(就像VxWorks系统那样)。谢谢。
作者: qinpanke    时间: 2013-03-03 15:16
没人知道吗?
作者: amarant    时间: 2013-03-03 20:07
我想楼主的理解可能有点偏了。
module_init(...);这个并不是对驱动的访问
在include/linux/init.h中有对他定义:
#define module_init(x)  __initcall(x);
之后的展开我就不写了,简单地说就是在start_kernel以后会运行这个module_init。
所以,module_init只是做一件事,就是把这个函数加到需要初始化的数组里。
那么对设备的访问呢,一般都是硬件上接好了,使得某一个物理地址映射到一个设备的寄存器空间。那么可以通过任何的访存指令读写这个地址
你说的地址加偏移量只是其中一种寻址方式,无论什么寻址方式都可以

作者: 灌水菜鸟    时间: 2013-03-04 13:46
楼上的正解。
init/exit_module是加载/卸载内核模块的接口,如果硬件驱动程序也搞成内核模块,肯定也是通过这个接口来加载的。但是这个跟硬件的实际访问是两码事。

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

而地址加偏移量这种访问方式,跟硬件和操作系统都没有关系,根本原因就是这样写容易理解容易维护而已。映射一块空间,然后弄几个宏定义,这样的代码无论读还是维护都比较方便。
作者: 帅绝人寰    时间: 2013-03-04 14:59
可以,但是你不可能这么玩 。
作者: qinpanke    时间: 2013-03-04 16:19
回复 3# amarant


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

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

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


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




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2