作者mayasky ( )
看板LinuxDev
标题Re: [问题] 虚拟记忆体mapping 实体记忆体
时间Fri Nov 15 02:04:00 2013
※ 引述《ICECOCA (unknow)》之铭言:
: ※ 引述《mayasky ( )》之铭言:
: : 有可能,实际上要对到哪里都可以,只要在ADDRESS LINE范围内
: 实体记忆体分高记忆体区和低记忆体区,
这是软体设计问题,如果只谈LINUX,是如此没错,但这概念是在32BITS CPU
: 若要求实体记忆体连续则会分配低记忆体区出去 比方说kmalloc()
: 或是汇流排要使用DMA,这也必须使用连续记忆体,所以也是分配这段。
一些老DMA会有ADDRESS LINE限制,现代的大多没了
: 通常会有一个offset,至於offset多少可能每个平台不一样。
: 所以1000,应该不会直接mapping到1000
您这边说的就是软体的设计了,我只说了硬体可以做到啥:)
硬体没这些限制
: 若没有特别要求要连续,则会分配高端记忆体出去,并透过page table
: 纪录虚拟位址和实体位址之间的mapping关系。
: 比方说vmalloc() 虽然在虚拟记忆体连续,但是对应到实体记忆体的位置可以不连续
: 不同process有自己的记忆体空间,也有自己的page table
: 不同process做context switch时会连同page table一起交换...
其实只是改个REGISTER,指向不同地方
: 换的时候,我不知道TLB会做什麽...? 把他全部设成dirty吗?
有ASID可以啥都不做,直到一些特殊状况(EX.ARM,MIPS,冷门的台湾芯Score..XD)
没ASID就要清光光(INVALIDATE)
我映像中..X86是TLB都清掉,有进化了吗?虽然他们都干掉还是比别人有ASID快..威武
AMD为了VIRTUALIZATION多了VMID的样子(名字可能有误),概念就是ASID
当然有更细致的方式..这里不提了..因为那些未必有效率
--
KERNEL先生。。。别整蛊我了orz
http://www.wretch.cc/blog/mayasky
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.231.97.16
※ 编辑: mayasky 来自: 61.231.97.16 (11/15 02:52)
1F:推 askacis:连续记忆体应该是DMA硬体的限制? 我知道有些DMA硬体可以 11/15 11:41
2F:→ askacis:设linking list丢给硬体,但实务上我还是拿连续记忆体喂他 11/15 11:42
3F:→ askacis:不然每次丢DMA之前还要建那串linking list table很麻烦XD 11/15 11:43
4F:→ mayasky:你说SG DMA吗?那实际上是一堆不连续片段的记忆体 11/15 12:18
5F:→ mayasky:我说address line是回应他说的low memory 11/15 12:19
6F:推 ICECOCA:感谢纠正~小弟是从欧莱礼 驱动程式那本念到的可能有些误解 11/16 01:22
7F:→ mayasky:中译本吗?XD~搞不好是翻译问题 11/16 01:45
8F:推 GTFX:台湾心是 andes 谢谢 XD 02/08 23:23
9F:→ mayasky:比ANDES有更早的欧~你可能不知道这故事XD 03/08 21:33