linux的ioremap

1.ioremap主要干了2件事情,检查传入地址的合法性,建立页表(包括访问权限),类似wince的地址绑定。

2.我们写驱动的时候访问一些外设,这些地址不是内存地址范围,所以不在内核初始化页表范围内,所以要自己建立页表

3.request_mem_region不过是告诉内核需要占用一块地址,只是声明占有。

4.貌似只有x86构架是mem核IO分开寻址的,ARM核PPC等都是内存映射式的,但是为了兼容,在移植的时候已经做了处理,所以IO端口方式也可以访问。

5.一般驱动访问寄存器的方法是定义全局的变量或结构体,ioremap后把地址赋给它,别的模块声明一下就可以了,这样整个驱动模块都能访问到了,当然只能在内核里直接使用指针,对用户空间操作还是需要间接访问的。

6.由驱动又联想到另外一个问题,中断函数能访问内核空间么?答案是肯定的,驱动模块里定义的全局变量等资源完全可以直接访问,因为它一直在内核空间里啊(.ko的模块就是放在内核里的,它也是从内核的一级中断处理函数跳转来的),不过就是有自己的堆栈寄存器什么的罢了,但是它确实不能访问用户空间,因为没有页表(尽管current宏确实是当前进程的)

7.ioremap后得到的地址理论上可以直接当指针使用的,不过推荐系统提供的函数

*((int *)(mem_addr+4))=23;
 iowrite32(20,mem_addr+4);     经过测试都可以。

8.补充一点,remap_pfn_range只能映射保留或者物理内存空间以外的物理地址,不能重新映射常规内存地址。这个意思是只能映射linux启动时传进来的保留的内存,其余的内存空间已经在启动的时候全都建立页表了,不能再映射了,或者外设的物理空间也是可以的。如果要重新映射已经建立页表的内存只能使用别的函数和方法了。

 

你可能感兴趣的:(linux,IO,测试,WinCE,X86,联想)