当前位置: 技术问答>linux和unix
在内核里如何访问这段内存?
来源: 互联网 发布时间:2015-12-14
本文导语: 内存为64M,数据放在内存0x03DE4000处 在VIVI里面,把这些数据映射到了地址为 VIVI_RAM_BASE + 0x03DE4000的内存中 VIVI_RAM_BASE为0x30000000 内核起动后,我要在内核里面访问这段内存,我是这样用的 unsigned long *map_table = (unsigned lo...
内存为64M,数据放在内存0x03DE4000处
在VIVI里面,把这些数据映射到了地址为 VIVI_RAM_BASE + 0x03DE4000的内存中
VIVI_RAM_BASE为0x30000000
内核起动后,我要在内核里面访问这段内存,我是这样用的
unsigned long *map_table = (unsigned long *)(VIVI_RAM_BASE + 0x03DE4000);
data = *(map_table+i)
可是却提示:
Unable to handle kernel paging request at virtual address 0x33de4000
换成
unsigned long *map_table = (unsigned long *)(0x03DE4000);
也提示提示:
Unable to handle kernel paging request at virtual address 0x03de4000
为什么在VIVI里面可以那样用,而内核就不行呢
内核起动后,我要在内核里面访问这段内存请问该怎麽访问呢?
在VIVI里面,把这些数据映射到了地址为 VIVI_RAM_BASE + 0x03DE4000的内存中
VIVI_RAM_BASE为0x30000000
内核起动后,我要在内核里面访问这段内存,我是这样用的
unsigned long *map_table = (unsigned long *)(VIVI_RAM_BASE + 0x03DE4000);
data = *(map_table+i)
可是却提示:
Unable to handle kernel paging request at virtual address 0x33de4000
换成
unsigned long *map_table = (unsigned long *)(0x03DE4000);
也提示提示:
Unable to handle kernel paging request at virtual address 0x03de4000
为什么在VIVI里面可以那样用,而内核就不行呢
内核起动后,我要在内核里面访问这段内存请问该怎麽访问呢?
|
内核启动后会进行地址映射,会建立自己的地址保护机制,你当然不能这么用了,需要先建立物理地址到虚拟地址的关系才能访问
|
看你给定的地址数是 虚拟地址还是实地址,
同样data = *(map_table+i)中对地址访问,在进程中是对虚拟地址的访问,这中间还需要一个映射的。
不知道我说的对不对!!
同样data = *(map_table+i)中对地址访问,在进程中是对虚拟地址的访问,这中间还需要一个映射的。
不知道我说的对不对!!
|
访问内核地址至少需要进入内核态,否则访问的都是虚拟地址,如果虚拟地址还没有映射物理内存的话,都会导致访问失败
|
应该是要用到ioremap,还有copyfromkernal之类的吧?
|
你需要在页表中加入一个0x33de4000到0x3de4000的映射,然后才能访问那段内存。ioremap是用来映射mmio空间的函数,在不同的结构上,具体map的方式不一样,但是都被ioremap封装了起来。ioremap会申请一段虚拟地址空间,建立页表,再将地址返回给调用者