当前位置: 技术问答>linux和unix
关于外设的物理地址 和 虚拟地址。。。
来源: 互联网 发布时间:2015-08-08
本文导语: 系统空间的地址和物理内存地址之间有一个 简单的映射关系:sys_add = phy_add + PAGE_OFFSET 现在假如系统中有一外设,它的总线(物理)地址为io_phy_add, 我在研究内核时好像它和它对应的虚拟地址(当然位于系统...
系统空间的地址和物理内存地址之间有一个
简单的映射关系:sys_add = phy_add + PAGE_OFFSET
现在假如系统中有一外设,它的总线(物理)地址为io_phy_add,
我在研究内核时好像它和它对应的虚拟地址(当然位于系统空间)就
没有上述PAGE_OFFSET的简单的偏移关系。
大虾们都有啥见解??
简单的映射关系:sys_add = phy_add + PAGE_OFFSET
现在假如系统中有一外设,它的总线(物理)地址为io_phy_add,
我在研究内核时好像它和它对应的虚拟地址(当然位于系统空间)就
没有上述PAGE_OFFSET的简单的偏移关系。
大虾们都有啥见解??
|
linux内核可以分配两种地址供使用,用kmalloc或者get_free_page分配的地址叫做逻辑地址,逻辑地址在很多体系结构上都是你说的那种sys_add = phy_add + PAGE_OFFSET,这就是说,你这么分配来的内存是和物理内存对应的,这样分来的内存一般会被保留住(比如显卡framebuffer方式),不再参加内存管理。
还有一种就是用vmalloc分来的,这种内存地址叫做虚拟地址,这种地址完全是内存管理技巧的结果,它和物理内存不是对应的关系。
还有一种就是用vmalloc分来的,这种内存地址叫做虚拟地址,这种地址完全是内存管理技巧的结果,它和物理内存不是对应的关系。
|
外设的地址不是简单的加个便宜量就可以了,是通过ioremap()
|
内核的地址0xc0000000到0xffffffff, 对应于内存物理地址的低端0-0x40000000
但外设的地址是通过另外一种途径来的吧,因为访问外设地址的时候,会被识别出来而转为访问外设
我对外设的IO地址一直搞不清楚,到底是通过什么机制映射过去的呢?
像BIOS映射到内存中,就不知道它是怎么做的
但外设的地址是通过另外一种途径来的吧,因为访问外设地址的时候,会被识别出来而转为访问外设
我对外设的IO地址一直搞不清楚,到底是通过什么机制映射过去的呢?
像BIOS映射到内存中,就不知道它是怎么做的
|
外设的物理地址是通过一个函数来映射的,iomap?
并不是简单的加上一个偏移
并不是简单的加上一个偏移
|
"系统空间的地址和物理内存地址之间有一个简单的映射关系:sys_add = phy_add + PAGE_OFFSET"
是PAGE_OFFSET吗?
是PAGE_OFFSET吗?
|
虚地址与物理内存地址并没有映射关系
虚拟地址是与 页项在页表中的偏移 有映射关系
同一虚拟地址所对应的物理地址,在进程运行的过程中动态变化
虚拟地址是与 页项在页表中的偏移 有映射关系
同一虚拟地址所对应的物理地址,在进程运行的过程中动态变化