请教skyeye源码中的几个问题
armmmu.c中translate函数中计算一级描述符地址l1addr = state->mmu.translation_table_base & 0xFFFFC000;
l1addr = (l1addr | (virt_addr >> 18)) & ~3;
...
i)translation_table_base已经是入口地址了,后面直接或上(virt_addr >> 18)应该就可以了,为什么要 & 0xFFFFC000?
ii)为什么要~3;
iii)一级描述符是个什么概念?在OS段页式访问中,一般是先查段的页表,再查页,最后将该页物理首地址+偏移得到对应的物理地址,这里二级描述符中怎么也分了页式变换以及段变换。
iv)
switch (l1desc & 3) {
case 0:
case 3:
case 1:
...
switch (l2desc & 3) {
case 0:
case 3:
...
==>l1desc/l2desc为什么要&3?这样的结果表示什么?
哪位朋友可以给我解释一下? 这里解释比较麻烦,建议看看有关arm的mmu的硬件相关文档(如ARM reference manual等)。 我去查查看
斑竹可否大致说说,让我有个大概的认识?
页:
[1]