一个关于ProcID的问题

1687阅读 0评论2007-11-06 yunyuaner
分类:

三星s3c2410a ARM9处理器的协处理器CP15 C13寄存器是一个用于标识进程ID的寄存器(Process identifier)。规则是:由ARM9TDMI核产生的地址范围在0-32M的虚地址会经由CP15 Register13做如下变换,即地址A变换为A+ProcID*32MB。而Cache和MMU得到的正是这个经过变换后的虚地址。与此同时,大于32MB的虚地址不转换,如下图所示:
“CP15 Register13用7位表示ProcID,这么以来,使得64*32MB个进程可以被同时映射,如果ProcID为0,例如在复位的时候,那么在ARM9TDMI与Cache和MMU之间就有一个直接的映射(Flat Mapping)”

这样的设计,显然是CPU对OS进程内存空间管理的一种指令级支持,但自己不是很明白其中的一些原理,对此提出一些疑问。Manual上说Cache和MMU得到的是Modified Memory Address(MVA),这意味着是这个MVA而非Virtual Address(ARM9TDMI产生)将要通过Translation Table实现虚地址与物理地址之间的变换。而cpu将不同ProcID进程地址空间前32MB转化成了MVA相邻而不重叠的64个32MB的块,用意何在?是否可以认为MVA被所有的进程共享,而OS创建进程的时候,将与该进程号对应的MVA中的那个32M的块加入进程的地址空间。

页表是Physical Address和Virtual Address之间的一种映射,更确切的说,是物理页框和虚页之间的一种映射。根据这里的所显示的,OS仅仅需要维护一张页表(4096 Entries),其中定义SDRAM Page Frame到VMA中Page的一种映射关系。由于嵌入式系统中一般不采用虚存,这大大简化了我所讨论的问题。

上面的问题究竟是一个OS设计策略上的问题,还是基本概念性的问题,我还在苦苦思考中,但类比Linux进程地址空间管理,可以得到一些启示,他基本印证了我的观点,现将其概述如下:

Linux内存描述符mm_struct结构中包含一个由vm_area_struct结构组成的链表,其中每个节点与一个线性内存区域相对应,同时任意两个内存区域不能重叠。进程在必要时申请线性区结构并将其纳入自身的地址空间。而线性区和页框之间则通过页表建立映射。

这个线性内存区域跟上述MVA有些神似,但新的问题是,既然线性内存区唯一,任何进程的地址空间是它的一个子集,那么为何要给每个进程都维护一张页表呢?
这几天被这个问题搞昏头了,以至于说了半天也不知道自己在说什么...
上一篇:没有了
下一篇:小谈一下Bootloader的原理与实现