Arm 如何确定页表中映射了多少虚拟地址空间?

Arm 如何确定页表中映射了多少虚拟地址空间?,arm,mmu,Arm,Mmu,我读到ARMV7ISA为一个程序提供4gig的虚拟地址空间。如果我使用一个所有代码都在4KB以内的程序,我的问题是整个4gig空间是否映射到页表中?我们采用短描述符格式来构建页表,并使用4k粒度,这将占用ram中的大量空间来保存页表。因此,我认为单个进程的整个4GB空间没有映射,但只映射了其中的一部分。这是正确的吗?如果正确,那么如何确定表中映射了多少VA?在ARM中,页面表有多个级别。据我记忆所及,第一级有4096个条目——每个条目描述一个1MB的部分 通过给一个指向第二级页面表的指针,您可以

我读到ARMV7ISA为一个程序提供4gig的虚拟地址空间。如果我使用一个所有代码都在4KB以内的程序,我的问题是整个4gig空间是否映射到页表中?我们采用短描述符格式来构建页表,并使用4k粒度,这将占用ram中的大量空间来保存页表。因此,我认为单个进程的整个4GB空间没有映射,但只映射了其中的一部分。这是正确的吗?如果正确,那么如何确定表中映射了多少VA?

在ARM中,页面表有多个级别。据我记忆所及,第一级有4096个条目——每个条目描述一个1MB的部分

通过给一个指向第二级页面表的指针,您可以将1MB部分分解为4KB大小(或更大的大小-我不记得还有什么其他大小),该页面表包含256个描述4KB部分的条目

顶级1MB部分都必须映射-它们是否必须映射到某个对象取决于操作系统。如果不需要某个区域,某些操作系统只需填写页面错误条目即可


您当然不想将整个内存空间分成4KB的块,因为页表的大小将是巨大的

这是特定于操作系统的(请说明您询问的操作系统),或者如果您自己在裸机上实现它,则由您决定。@否,如果我使用linux操作系统,并且我说我有一个存储指令,该指令将值存储在0x10000000,操作系统是否会计算出地址0x10000000将被写入,因此必须对其进行映射?操作系统如何计算出将使用多少VA?如果我有一条写入高值(比如0x10000000)的存储指令,那么操作系统是否知道它必须在表中映射0x10000000?使用这样的存储指令合法吗?每个操作系统将以不同的方式管理虚拟地址空间。操作系统没有“弄明白”任何事情。要么空间在访问之前由内核映射(在这种情况下,地址由MMU转换,内核在其访问中不再扮演进一步的角色),要么内核将其标记为无效,当它被访问时,内核再次获得控制权,在动态映射它(这称为写时复制)。