LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1898|回复: 1

我写的一个基于MMU的操作系统,用在ARM9上

[复制链接]
发表于 2005-6-20 04:48:53 | 显示全部楼层 |阅读模式
代码很少,几乎行行有注释,如果想了解ARM体系结构,我想,看这些代码是有帮助的。希望各位喜欢。

一个基于MMU的操作系统的实现
   具有MMU功能的ARM CPU,使用虚拟地址寻址公式为:
        if VA < 32M then
        MVA = VA + PID*32M
        else
        MVA = VA

   VA: virtual address,供CPU使用,CPU是看不到MVA的
  MVA: modified virtual address,MMU将VA根据上述公式计算出MVA,使用MVA去查询页表获得物理地址

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模式发生时,保存的是被中断时用户态的状态(进程上下文),在管理模式发生时,保存的是本模式下当前的运行状态。
本系统使用优先级进行时间片轮转
先写这么多吧,最近休息了很久,该找工作了。以后再补充。最新消息在我的blog上:http://dswei.blogchina.com/

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2005-6-30 18:11:32 | 显示全部楼层
牛人 亚 !!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表