※ 引述《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
當然有更細緻的方式..這裡不提了..因為那些未必有效率