免费注册 查看新帖 |

Chinaunix

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

支持两个globalmem设备的globalmem驱动 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-15 09:28 |只看该作者 |倒序浏览
5可用积分
支持两个globalmem设备的globalmem驱动

struct globalmem_dev                                    
{                                                        
  struct cdev cdev; /*cdev结构体*/                       
  unsigned char mem[GLOBALMEM_SIZE]; /*全局内存*/        
};

struct globalmem_dev *globalmem_devp; /*设备结构体指针*/


/*设备驱动模块加载函数*/
int globalmem_init(void)
{
  int result;
  dev_t devno = MKDEV(globalmem_major, 0);

  /* 申请设备号*/
  if (globalmem_major)
    result = register_chrdev_region(devno, 2, "globalmem");
  else  /* 动态申请设备号 */
  {
    result = alloc_chrdev_region(&devno, 0, 2, "globalmem");
    globalmem_major = MAJOR(devno);
  }  
  if (result < 0)
    return result;
   
  /* 动态申请2个设备结构体的内存*/
  globalmem_devp = kmalloc(2*sizeof(struct globalmem_dev), GFP_KERNEL);
  if (!globalmem_devp)    /*申请失败*/
  {
    result =  - ENOMEM;
    goto fail_malloc;
  }
  memset(globalmem_devp, 0, 2*sizeof(struct globalmem_dev));
  
  globalmem_setup_cdev(&globalmem_devp[0], 0);  
  globalmem_setup_cdev(&globalmem_devp[1], 1);

  return 0;

  fail_malloc: unregister_chrdev_region(devno, 2);
  return result;
}

static void globalmem_setup_cdev(struct globalmem_dev *dev, int index)
{
...
}

为什么引用这两个设备的地址时用的是&globalmem_devp[0]、&globalmem_devp[1]??
1.globalmem_devp本身就是指针,引用应该是globalmem_devp啊?为什么还带地址符?
2.没有定义globalmem_devp是数组指针,为什么用了[0]、[1]??

本人C语言水平有限,谁能帮忙解答一下?


[ 本帖最后由 todayrw 于 2009-4-15 09:29 编辑 ]

最佳答案

查看完整内容

struct globalmem_dev *globalmem_devp; /*设备结构体指针*/和struct globalmem_dev  globalmem_devp[]; 等价。两个问题都解决了。看看C基本。

论坛徽章:
0
2 [报告]
发表于 2009-04-15 09:28 |只看该作者

回复 #1 todayrw 的帖子

struct globalmem_dev *globalmem_devp; /*设备结构体指针*/


struct globalmem_dev  globalmem_devp[]; 等价。

两个问题都解决了。
看看C基本。

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
3 [报告]
发表于 2009-04-15 09:51 |只看该作者
globalmem_devp是指针
*globalmem_devp是指针首地址处的内容
&是globalmem_devp的地址
可以这么去理解

**globalmem_devp的是在*globalmem_devp处的,*globalmem_devp是在globalmem_devp处的,globalmem_devp是在&globalmem_devp处的

所以&globalmem_devp[0]是没问题的

论坛徽章:
0
4 [报告]
发表于 2009-04-15 10:39 |只看该作者

回复 #3 tacoe 的帖子

int *a;  a是指针变量,存放着地址
int a[];  a是数组名,但数组名a也代表数组首元素的地址,那么a能够正确引用为一个指针变量,即a指向数组a[]的首元素,就是说:int *a;那么一旦它指向一个int型数组,则数组名也可以是a,引用数组a的元素可以用a[0],&a[0]就表示第一个单元里的int型数据所在的地址。

所以,我们得到结论,定义一个指针变量,一旦它指向一个数组的首元素,那么首元素的地址可以用&指针变量名[0]来表达;第n个元素的地址可以用&指针变量名[n-1]来表达。

但是有一个问题,在int a[]后,没有指明几个单元内容,内存怎么分配?这种写法是否错误??
经检验,编译错误
那就是说只能把int *a;看作是int a[];现实中不能这么写


编一个例子,验证一下
#include "stdio.h"

int main()
{
        char *a="i love you!";
        printf("a[0]=%c a[1]=%c a[2]=%c\n",a[0],a[1],a[2]);
        printf("a=%x &a[0]=%x &a[2]=%x\n",a,&a[0],&a[2]);
}
编译,运行:
a[0]=i a[1]=  a[2]=l
a=80484b0 &a[0]=80484b0 &a[2]=80484b2

这里要强调的是:C语言中没有字符串变量,字符串常量的保存是通过字符数组来实现的。所以指针a指向的是一个字符数组。

所以:
struct globalmem_dev *globalmem_devp; /*设备结构体指针*/


struct globalmem_dev  globalmem_devp[]; 等价。

所以就有了:
globalmem_setup_cdev(&globalmem_devp[0], 0);  
globalmem_setup_cdev(&globalmem_devp[1], 1);

[ 本帖最后由 todayrw 于 2009-4-15 16:24 编辑 ]

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
5 [报告]
发表于 2009-04-15 11:05 |只看该作者
char **a={"hello1","hello2","hello3"};
可以这样用的吧?
那就可以这样用
*a[0]="hello1";
*a[1]="hello2";
*a[2]="hello3";
也就是说,可以这样
char *a={"hello1","hello2","hello3"};

&a[0]="hello1";
&a[1]="hello2";
&a[2]="hello3";
同理,赋值指向的话更没有问题了

评分

参与人数 1可用积分 +9 收起 理由
dreamice + 9 我很赞同

查看全部评分

论坛徽章:
0
6 [报告]
发表于 2009-04-15 11:16 |只看该作者

回复 #5 T-bagwell 的帖子

这个思路好像绕远了,目前我的想法是:定义一个指针变量,一旦它指向一个数组的首元素,那么首元素的地址可以用&指针变量名[0]来表达;第n个元素的地址可以用&指针变量名[n-1]来表达。

和tacoe老兄说的差不多,int *a;等价于int a[];

但是,现在的疑问是在int a[]后,没有指明几个单元内容,内存怎么分配?这种写法是否错误??

[ 本帖最后由 todayrw 于 2009-4-15 11:18 编辑 ]

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
7 [报告]
发表于 2009-04-15 12:14 |只看该作者
原帖由 todayrw 于 2009-4-15 11:16 发表
这个思路好像绕远了,目前我的想法是:定义一个指针变量,一旦它指向一个数组的首元素,那么首元素的地址可以用&指针变量名[0]来表达;第n个元素的地址可以用&指针变量名[n-1]来表达。

和tacoe老兄说的差不多 ...


知道main的整体写法是什么样的吗?

int main(int argc,char **argv,char **env)吧?
或者
int main(int argc,char *argv[],char **env)吧?
这个要是不理解,我也不知道咋给你解释了,还有
我之前给你说的没有绕远,是你不理解罢了

论坛徽章:
0
8 [报告]
发表于 2009-04-15 12:28 |只看该作者

回复 #3 tacoe 的帖子

int a[];编译错误

那就是说只能把int *a;看作是int a[];现实中不能这么写

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
9 [报告]
发表于 2009-04-15 13:37 |只看该作者
是不能这么写
但是可以把指针指过去的

论坛徽章:
0
10 [报告]
发表于 2009-04-15 15:27 |只看该作者

回复 #9 T-bagwell 的帖子

恩,对,谢谢!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP