原文地址:http://freesoftman.iteye.com/blog/954058
今天在看《Linux设备驱动程序》里面的第十五章“内存映射和DMA”
里面的一大堆地址类型弄得我云里去雾里来的。
如:
用户虚拟地址
物理地址
总线地址
内核逻辑地址
内核虚拟地址
linux这个操作系统真是事情多啊,地址都搞这么多名堂的。我以前对地址的理解就是:
逻辑地址:相对于进程4G空间来说的,为了隔离物理地址与程序直接交互,减轻程序员的负担。通过段映射,页映射可以转换成物理地址。
物理地址:就是CPU通过地址总线发送的信号,可以连接到实际内存。
虚拟地址:就是为了在小内存的系统中运行大的应用程序而出现的一种机制。这里就牵涉到了页中断,就是在某个进程不用的时候,把其中的内存存放到硬件中,等需要使用的时候,产生一个页中断把它重新调回到内存中。当然,它牺牲了时间。典型的“以时间换空间”的做法。
但是总线地址是个什么概念呢?
它出现的理由是什么啊! 区别的标准是什么呢?
通过google的search发现有个解释还不错。原文如下:
PCI设备总线地址与CPU物理地址的区别
1 域的概念
之所以把PCI设备和CPU加红色高亮,是因为这里有个域的概念对理解总线地址和物理地址很重要,区分这两个域是理解两个地址的基础。
PCI设备域包括: PCI设备,PCI设备上的DMA Enginer, CPU端的DMA 控制器。
CPU域包括: CPU
2 物理地址到总线地址的映射
物
理地址和总线地址一一映射,而且在绝大多数平台上,为了简便,总线地址和物理地址起始地址也是一样的。虽然方便,但是很多开发者弄不清楚某个具体值到底是物理地址还是总线地址。有了域的概念,就好理解多了,如设备的PCI config space中的BAR地址就是总线地址,因为它是给设备用的。而调kernelAPIpci_resource_start(dev,...)
返回的值则是CPU域的物理地址。
=========================完===================================
我的理解就是,物理地址一般与CPU有关系,是给CPU指令使用的。而总线地址主要是给设备使用的,是设备中的一些内存资源。如果要CPU的物理地址连接上设备上的总线地址就需要使用mmapi映射,这样就能将物理地址与总线地址链接在一起。
也不知道我这样理解对么? 不管对与错,先把我自己的观点抛出来在说。
OK,在深入理解点。希望大牛么给个更好的解释,同时我也会关注这个话题。
文章评论(0条评论)
登录后参与讨论