- 论坛徽章:
- 0
|
10可用积分
书中的一个经典的有关字符设备驱动的例子,有些困惑
struct globalmem_dev
{
struct cdev cdev; /*cdev结构体*/
unsigned char mem[GLOBALMEM_SIZE]; /*全局内存*/
};
struct globalmem_dev *globalmem_devp; /*设备结构体指针*/ //指针变量globalmem_devp并未赋值,所以它暂时是乱指向的
/*文件打开函数*/
int globalmem_open(struct inode *inode, struct file *filp)
{
/*将设备结构体指针赋值给文件私有数据指针*/
filp->private_data = globalmem_devp; //问题1:globalmem_devp没有确定地址,怎么能给其它变量赋值??
return 0;
}
/*读函数*/
static ssize_t globalmem_read(struct file *filp, char __user *buf, size_t size,
loff_t *ppos)
{
unsigned long p = *ppos;
unsigned int count = size;
int ret = 0;
struct globalmem_dev *dev = filp->private_data; /*获得设备结构体指针*/ //问题2:在globalmem_open()函数中,filp->private_data是被赋值的,到了这里的read函数,怎么变成赋值给局部变量了??
/*分析和获取有效的写长度*/
if (p >= GLOBALMEM_SIZE)
return count ? - ENXIO: 0;
if (count > GLOBALMEM_SIZE - p)
count = GLOBALMEM_SIZE - p;
/*内核空间->用户空间*/
if (copy_to_user(buf, (void*)(dev->mem + p), count))
{
ret = - EFAULT;
}
else
{
*ppos += count;
ret = count;
printk(KERN_INFO "read %d bytes(s) from %d\n", count, p);
}
return ret;
}
书上说:"在globalmem_open()函数中通过filp->private_data = globalmem_devp语句将设备结构体指针赋值给文件私有数据指针"
"在globalmem_read() 、globalmem_write()、globalmem_llseek()和globalmem_ioctl()函数中通过
struct globalmem_dev *dev = filp->private_data语句获得设备结构体指针"
问题3:我理解:这个驱动的功能是使用户空间能够访问内核空间的一片内存(大小有设定),可是,为什么从程序上看不出这片内存的起始地址??谁设定的??
[ 本帖最后由 todayrw 于 2009-4-14 16:45 编辑 ] |
最佳答案
查看完整内容
globalmem_devp是一个指针,指向globalmem_dev这个指针是存在的,但是它所指的globalmem_dev结构是空的~ 也就是说这个指针还没有指向一个globalmem_dev 结构然后filp的private_data是一个void类型的指针,它指向了globalmem_devp这个指针然后在struct globalmem_dev *dev = filp->private_data;中dev这个指针所指的globalmem_dev结构其实就是globalmem_devp所指的globalmem_dev结构这个结构的主要内存就是struct globalmem_dev ...
|