当前位置: 技术问答>linux和unix
在Linux内核中,请教如何读些物理地址
来源: 互联网 发布时间:2015-08-09
本文导语: 在Linux内核中,请教如何读些物理地址 | 我来给你指条明路,你要是解决了问题.可要给我分啊^^ 我的理解是这样的,内核里头分配的地址有两种,用kmalloc和那个get_free_page得到的是一种,叫逻...
在Linux内核中,请教如何读些物理地址
|
我来给你指条明路,你要是解决了问题.可要给我分啊^^
我的理解是这样的,内核里头分配的地址有两种,用kmalloc和那个get_free_page得到的是一种,叫逻辑地址,这种地址一般来说,和物理地址之间仅仅有一个偏移量.可以用宏__pa()来得到真正的物理地址,或者直接算一下也能得到,你去查查__pa()这个东东就知道怎么用了.
逻辑地址一但分配了,在释放之前,就不会再被内存管理的相关东东打扰.你可以认为那就是分给你的真正物理地址.
还有一种,使用vmalloc分配的地址,这种地址就和物理地址不是线型映射的了.而且这种地址很有可能并不和物理地址对应,而被班到某块硬盘上去~~~.
我的理解是这样的,内核里头分配的地址有两种,用kmalloc和那个get_free_page得到的是一种,叫逻辑地址,这种地址一般来说,和物理地址之间仅仅有一个偏移量.可以用宏__pa()来得到真正的物理地址,或者直接算一下也能得到,你去查查__pa()这个东东就知道怎么用了.
逻辑地址一但分配了,在释放之前,就不会再被内存管理的相关东东打扰.你可以认为那就是分给你的真正物理地址.
还有一种,使用vmalloc分配的地址,这种地址就和物理地址不是线型映射的了.而且这种地址很有可能并不和物理地址对应,而被班到某块硬盘上去~~~.
|
我不是太明白你遇到的问题,但据我的经验来看,只要ioremap就可以了啊。
比如,你从pci卡得到的物理地址是0xD0000000,那么
只要 my_virt_add = ioremap_nocache(0xD0000000, length)就可以得到虚拟地址了啊,
然后,如果要读写这个地址段,就是*((volatile unsigned short *)(my_virt_add + offset)) = data,这样,就可以写了阿(这里假设你的偏移量是offset,是unsigned short类型)
我一直是这样做的,只是我的平台是x86,不知道是不是有区别,呵呵
还有啊,在做ioremap之前,最好做一下 request_mem_region来看看,这段内存是不是已经被别的驱动占用……
比如,你从pci卡得到的物理地址是0xD0000000,那么
只要 my_virt_add = ioremap_nocache(0xD0000000, length)就可以得到虚拟地址了啊,
然后,如果要读写这个地址段,就是*((volatile unsigned short *)(my_virt_add + offset)) = data,这样,就可以写了阿(这里假设你的偏移量是offset,是unsigned short类型)
我一直是这样做的,只是我的平台是x86,不知道是不是有区别,呵呵
还有啊,在做ioremap之前,最好做一下 request_mem_region来看看,这段内存是不是已经被别的驱动占用……