红联Linux门户
Linux帮助

open的实现和全局变量

发布时间:2011-01-18 11:30:28来源:红联作者:wucongdonglai
在宋宝华的《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;
这时候呢?用户空间可见么
文章评论

共有 6 条评论

  1. wucongdonglai 于 2011-01-20 08:43:31发表:

    6# deepwhite 恩,这就比较清楚了,呵呵,多谢white兄

  2. deepwhite 于 2011-01-19 13:49:49发表:

    引用:
    4# deepwhite
    我知道open是系统调用,这个还是勉强知道的!哈
    你说用户对此看不到应该是指看不到是如何实现的吧?
    wucongdonglai 发表于 2011-1-19 13:26

    实现、以及驱动中和内核中的数据结构,用户一无所知。

  3. wucongdonglai 于 2011-01-19 13:26:23发表:

    4# deepwhite
    我知道open是系统调用,这个还是勉强知道的!哈
    你说用户对此看不到应该是指看不到是如何实现的吧?

  4. 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 等等的内核代码中做了什么,用户空间中永远是看不见的。

  5. wucongdonglai 于 2011-01-19 10:34:41发表:

    2# deepwhite
    那也就是说
    struct globalmem_dev *globalmem_devp
    在用户空间是看不到的,要进行读写就必须得通过open什么的了!而比如open里采用
    filp->private_data=globalmem_devp;
    也是为了使用户空间可见该变量!
    是这么理解,没错吧!

  6. deepwhite 于 2011-01-18 12:09:52发表:

    用户空间不能直接访问内核空间的内存,这和变量是否为 static 无关。

    也就是说,用户没办法直接访问驱动的内存空间。

    用户想要和内核交互,要么通过一些系统调用,要么通过内核在 proc 或者 sysfs 文件系统中暴露出的文件来做。