Chinaunix

标题: ioremap()函数 [打印本页]

作者: bsdhnit    时间: 2008-09-01 19:37
标题: ioremap()函数
我将一个寄存器用ioremap函数定义到驱动中,R_GPECON=ioremap(GPECON,4),我是不是可以这样对这个寄存器直接赋值:
         R_GPECON=0xffffffff还是这样*R_GPECON=0xffffffff。到底那个正确呀。
谢谢
作者: 小瓶盖儿    时间: 2008-09-02 08:11
writeb/writew/readb/readw in 2.4 kernel,
writeb(内容,地址)。
R_GPECON=ioremap(GPECON,4);
writew(0xffffffff,R_GPECON);:wink:

ioremap 将物理地址映射到内核中的一段地址,映射之后你看到的R_GPECON跟物理地址有一段偏移,所以不能直接操作~~

就是这个样子~~
作者: zclever    时间: 2008-09-04 10:01
ls的,应该是writel(0xffffffff,R_GPECON);吧?看它映射的是32位。还有,一般多用~0,而不是0xffffffff
作者: zclever    时间: 2008-09-04 10:02
ls的,应该是writel(0xffffffff,R_GPECON);吧?看它映射的是32位。还有,一般多用~0,而不是0xffffffff
作者: sep    时间: 2008-09-04 10:40
*addr = data时要用修饰词volatile
作者: bsdhnit    时间: 2008-09-04 22:40
谢谢各位的指教
作者: Cyberman.Wu    时间: 2008-09-07 13:59
原帖由 小瓶盖儿 于 2008-9-2 08:11 发表
writeb/writew/readb/readw in 2.4 kernel,
writeb(内容,地址)。
R_GPECON=ioremap(GPECON,4);
writew(0xffffffff,R_GPECON);:wink:

ioremap 将物理地址映射到内核中的一段地址,映射之后你看到的R_GP ...


一般是推荐用writeX系列函数而不是直接用指针操作,不过原因好像不是你所说的吧?主要是这个函数经常用于映射外设的一些地址空间到虚拟地址中,而外设的访问有时有一些限制,而用writeX系列比较安全。如果是映射一些不用的物理内存如系统启动时保留出来的内存,则直接做内存访问即可。
作者: 小瓶盖儿    时间: 2008-09-07 16:38
标题: 回复 #7 Cyberman.Wu 的帖子
请教,如果在驱动中~~
#define kaka      (*((volatile INT32U *) 0x01c00000))
kaka=0xfc;
可以访问成功么?
作者: .kaka    时间: 2008-09-07 19:36
原帖由 小瓶盖儿 于 2008-9-7 16:38 发表
请教,如果在驱动中~~
#define kaka      (*((volatile INT32U *) 0x01c00000))
kaka=0xfc;
可以访问成功么?


1、这段代码是驱动中的,说明执行kaka=0xfc;时享有cpu特权,此时的代码可以做内核能够做得任何事情~~
2、如果有mmu的话,cpu将0x01c00000送给mmu,mmu会查表,找出0x01c00000对应的物理地址(假设是add_temp),
3、mmu从ram中寻址add_temp
4、我也不知道到底能不能正确访问,我是新手,请高人分析一下其中的过程~~
作者: Cyberman.Wu    时间: 2008-09-07 22:01
标题: 回复 #8 小瓶盖儿 的帖子
你这样的访问编译后的指令使用的是虚拟地址,能否访问取决于这一地址有没有映射吧。
作者: .kaka    时间: 2008-09-07 22:44
标题: 回复 #10 Cyberman.Wu 的帖子
貌似内核将低范围的物理内存直接加上偏移进行映射~~而且也是连续的,但是MMU里面是怎么映射的~~

[ 本帖最后由 .kaka 于 2008-9-8 08:20 编辑 ]
作者: Cyberman.Wu    时间: 2008-09-10 12:03
标题: 回复 #11 .kaka 的帖子
是这样的,因为在内核中经常需要逻辑地址和物理地址之间的转换。不过内核代码的存取指令中使用的还是虚拟地址,需要经过MMU的处理,否则内存只有256M如何处理?存在的内核逻辑地址并不一定能对应的物理内存上。




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