Chinaunix

标题: 请问关于linux虚拟地址的问题 [打印本页]

作者: jojolin    时间: 2006-12-28 16:21
标题: 请问关于linux虚拟地址的问题
我现在写一s3c2410上的 IO 驱动,是不是我把实际地址ioremap了之后读写它就可以了呢???
   比如实际地址是0x8000000,我映射它到0xC4900000,那是否我读0xC4900000就可以读到实际0x8000000地址的东西?写只要写到0xC4900000就可以到实际地址了???

   如果是的话我操作虚拟地址用这样的方法合适吗:
#define READ_reg(x)    (*(volatile u16 *)(x))
#define WR_reg(x,y)    (*(volatile u16 *)(x)=(y))

多谢大家,辅导小菜
作者: gvim    时间: 2006-12-28 16:56
是的。
不过为什么不是u32 ,而用u16 ?
作者: jojolin    时间: 2006-12-28 16:58
多谢 确实是应该u32
作者: jojolin    时间: 2006-12-28 17:08
标题: 回复 2楼 gvim 的帖子
但愿您还在
我把0x8000000开始 ioremap了一块地方,
那我在0xC4900000+0x12是否就对应到了0x8000000+0x12 呢?
作者: gvim    时间: 2006-12-28 17:16
恩,只要是以页为单位映射。
你的例子相当于0xC4900012的变换。查查mmu的映射过程你就明白了。
作者: jojolin    时间: 2006-12-28 18:53
多谢 现在还有些问题 为什么我用WR_reg(SLOT1_FLAG,0xA5A5) ;这样的语句想往一个虚拟地址写A5A5,可是执行完这条语句这个地址里的值发生了变化,结果却是6640,不是我要的A5A5???
是不是我们应该使用Linux中特定的函数来访问I/O内存资源,而不应该通过指向核心虚地址的指针来访问??
那我因该用什么方法操作地址呢?????
作者: jojolin    时间: 2006-12-29 10:37
以上的背景可是我用如下语句想向该地址写数据的时候为什么总是不对的
u32 temp ;
SLOT1_FLAG = SLOT1 + FLAG_SHIFT ;  //申请虚拟地址后的偏移量
writel(0xA5A5,SLOT1_FLAG) ;
temp = readl(SLOT1_FLAG) ;
printk("SLOT1_FLAG is %X ---%X\n",SLOT1_FLAG,temp);
打印出来的值不是我写入的0xA5A5  ?????
我调试观察对应的物理地址里的值也不是0xA5A5  
请教各位了 不知道是怎么回事情
作者: jojolin    时间: 2006-12-29 14:10
我发现 0x8000000 映射过来的地址里面的值都不是固定的,0x8000000 是nGCS1开始的地方,我看控制nGCS1的寄存器GPA12已经选重了nGCS1,不知道为什么还是把值写不到里面去~???
作者: gvim    时间: 2006-12-29 14:19
我汗。
不知道你对"SROM"这个词是怎么理解的。
即便是对flash写入,也要有合适的方式嘛

[ 本帖最后由 gvim 于 2006-12-29 14:22 编辑 ]
作者: jojolin    时间: 2006-12-29 14:36
老大 我半道出家 对这些不是很明白 您能不能指条路 我应该怎么理解呢?????????多谢了
作者: gvim    时间: 2006-12-29 15:00
原帖由 jojolin 于 2006-12-29 14:36 发表
老大 我半道出家 对这些不是很明白 您能不能指条路 我应该怎么理解呢?????????多谢了


ROM这个单词只要是搞计算机的都应该知道吧。 Read-Only Memory ,没有特殊的方式是无法写入的。
http://www.embedon.com/aticle-show.asp?id=12
作者: jojolin    时间: 2006-12-29 15:15
原帖由 gvim 于 2006-12-29 15:00 发表


ROM这个单词只要是搞计算机的都应该知道吧。 Read-Only Memory ,没有特殊的方式是无法写入的。
http://www.embedon.com/aticle-show.asp?id=12




多谢您,我还想着是映射到了别的地址,rom也就能够直接写入了呢,多谢您我再看看
我会努力的




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