在宋宝华的《linux设备驱动开发详解》的第六章的例子globalmem中有这么一段:
static int globalmem_major = GLOBALMEM_MAJOR;
/*globalmem设备结构体*/
struct globalmem_dev
{
struct cdev cdev; /*cdev结构体*/
unsigned char mem[GLOBALMEM_SIZE]; /*全局内存*/
};
struct globalmem_dev *globalmem_devp; /*设备结构体指针*/
这时候在驱动模块中定义的全局变量,用户空间可见么?还是说是保存在内核栈中?
static struct globalmem_dev *globalmem_devp;
这时候呢?用户空间可见么
wucongdonglai 于 2011-01-20 08:43:31发表:
6# deepwhite 恩,这就比较清楚了,呵呵,多谢white兄
deepwhite 于 2011-01-19 13:49:49发表:
实现、以及驱动中和内核中的数据结构,用户一无所知。
wucongdonglai 于 2011-01-19 13:26:23发表:
4# deepwhite
我知道open是系统调用,这个还是勉强知道的!哈
你说用户对此看不到应该是指看不到是如何实现的吧?
deepwhite 于 2011-01-19 12:58:48发表:
你反复提到的 open 就是系统调用之一。
Unix/Linux 里面,every thing is a file, 设备也是如此。既然它是一个文件,就需要遵循普通的文件模型,例如,需要支持诸如 open, read, write, seek, close 之类的基本的系统调用。
那么,从用户的角度来讲,用户根本不需要和你提到的那些数据结构来打交道。举个简单的例子,用户需要从一个串口中读取数据,那么他只需要打开这个串口,然后按照一定的波特率去读就可以了。用户不需要关心内核里面是怎么完成的。
而从驱动编写的角度来看,驱动模型中的这些 operations , 可以被内核所使用,进而关联到相关的系统调用。驱动在这里成为了 用户和内核的中间层。
回到你的例子,你提到的驱动代码我没看过,我对字符驱动也没怎么看过。但是从一般意义上来讲, 把 globalmem_devp 挂载到 filp 中去,这个操作是内核空间中的,用户空间中还是没有办法看到。
对用户来说,它看到的仅仅是设备,对设备的操作通过驱动提供的通用接口来实现。无论驱动或者你反复提到的 open 等等的内核代码中做了什么,用户空间中永远是看不见的。
wucongdonglai 于 2011-01-19 10:34:41发表:
2# deepwhite
那也就是说
struct globalmem_dev *globalmem_devp
在用户空间是看不到的,要进行读写就必须得通过open什么的了!而比如open里采用
filp->private_data=globalmem_devp;
也是为了使用户空间可见该变量!
是这么理解,没错吧!
deepwhite 于 2011-01-18 12:09:52发表:
用户空间不能直接访问内核空间的内存,这和变量是否为 static 无关。
也就是说,用户没办法直接访问驱动的内存空间。
用户想要和内核交互,要么通过一些系统调用,要么通过内核在 proc 或者 sysfs 文件系统中暴露出的文件来做。