||
if VA < 32m then
MVA = VA
else
MVA = PID*32M + VA
ARM9的4G虚拟地址可分成128个进程空间,每个32M。虽然它们的地址都是0-(32M-1),但是对应的MVA不一样,设置MVA指向不同物理地址就可以很方便地让各进程运行空间相互隔开。开发本系统的开发板含64M SDRAM,0-1M用于内核及任务0;1M-63M供用户使用,可建立62个进程,每个进程1M;63M-64M用于放置中断向量表,IRQ模式下运行时的堆栈也放在此处。本系统虚拟地址的划分为:
1、 SDRAM物理地址0x30000000-0x30100000的虚拟地址也是0x30000000-0x34000000。这是内核与进程0的空间
2、 本系统中断向量影射到虚拟地址0xffff0000,对应的物理地址为SDRAM最后1M
3、 s3c2410 SFR的物理地址范围0x48000000-0x60000000,为了方便,我让其虚拟地址也是0x48000000-0x60000000
4、 每个用户进程使用1M内存,物理地址为0x30000000+PID*0x100000到0x30000000+(PID+1)*0x100000,虚拟地址都是0-1M,MVA由上面公式计算,按照PID大小向上分配
5、 由于每个进程只有1M的空间,为了访问其它进程,把中断向量虚拟地址下面的64M空间,影射到物理地址0x30000000-0x34000000。这个在从进程0创建用户进程时很有用。
本系统参考linux0.11和UCOS-II写成,进程状态分为用户态、内核态。用户进程使用的空间划分如下:
1、0-(1M-1K):代码存放地址从0开始,用户态堆栈从(1M-1K)向下扩展;
2、(1M-1K)-1M:运行参数
3、内核态堆栈位与本进程任务数据结构末端
当开始调度之后,整个系统运行状态可分为3种(对应ARM的三种模式):
1、IRQ模式:时间中断发生时就运行于此模式,每此进入中断处理程序时,IRQ模式堆栈都一样,退出中断不用保存任何东西。时间中断处理do_timer再此判断是否进行任务切换
2、用户模式——进程用户态:
3、管理模式——进程内核态:在用户态使用swi n指令进入此状态,内核根据n值提供各种服务。现在实现了exit、sleep、write三种系统调用。
进程的切换发生在:IRQ的do_timer函数,swi n中的exit和sleep。在IRQ模式发生时,保存的是被中断时用户态的状态(进程上下文),在管理模式发生时,保存的是本模式下当前的运行状态。
本系统使用优先级进行时间片轮转
代码很少,几乎行行有注释,如果想了解ARM体系结构,我想,看这些代码是有帮助的。希望各位喜欢。