作者ICECOCA (unknow)
看板LinuxDev
标题Re: [问题] 虚拟记忆体mapping 实体记忆体
时间Fri Nov 15 01:03:45 2013
※ 引述《mayasky ( )》之铭言:
: ※ 引述《shihyu (shihyu)》之铭言:
: : 有些虚拟记忆体转实体记忆体疑惑
: : 1. 虚拟记忆体位址例如是1000 MMU 也是使用实体记忆体中1000位址吗?
: 有可能,实际上要对到哪里都可以,只要在ADDRESS LINE范围内
实体记忆体分高记忆体区和低记忆体区,
若要求实体记忆体连续则会分配低记忆体区出去 比方说kmalloc()
或是汇流排要使用DMA,这也必须使用连续记忆体,所以也是分配这段。
通常会有一个offset,至於offset多少可能每个平台不一样。
所以1000,应该不会直接mapping到1000
若没有特别要求要连续,则会分配高端记忆体出去,并透过page table
纪录虚拟位址和实体位址之间的mapping关系。
比方说vmalloc() 虽然在虚拟记忆体连续,但是对应到实体记忆体的位置可以不连续
: : 2. 假设用到一样位址, 那在 multi task 系统这样同时很多个process
: : 以32bit Linux 系统来说每process 都有3G , 1G kernel 共用
: : 这样系统多个 process 运作虚拟记忆体位址会出现相同对映到实体记忆体是怎麽处理
: : ,不会有什麽冲突?
不同process有自己的记忆体空间,也有自己的page table
不同process做context switch时会连同page table一起交换...
换的时候,我不知道TLB会做什麽...? 把他全部设成dirty吗?
: 这依照ARCH不同有不同方式
: 有TLB
: HIT
: 有ASID
: 每个PROCESS的ASID不一样,即使VA同也会区别出不同的SPACE
: 没ASID
: 每次CONTEXT SWITCH要清掉TLB,也不会冲突
: MISS
: 各自爬表没冲突
: 无TLB
: 因为每次都要爬PAGE TABLE,所以VA一样没关系,表里面会对到不同PA
: 随便回答一下有省略点细节,但大致如此
: : 谢谢
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.116.169.235