免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2701 | 回复: 3
打印 上一主题 下一主题

solaris如何进行进程context switch? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-02 14:54 |只看该作者 |倒序浏览
看solaris internal时一直有这个疑问,自己看了一下ultra sparc的指令集,但那里面并没有把mmu寄存器讲的很清楚;

另外,在sparc体系结构中,由用户态转入内核态时,内核及处理器要做什么工作?

有没有人对这些有了解的?

论坛徽章:
0
2 [报告]
发表于 2008-05-03 15:45 |只看该作者
汗~~~么有人知道啊。。没有人研究solaris内核么?sparc体系结构也满酷啊。。。

论坛徽章:
0
3 [报告]
发表于 2009-09-14 16:38 |只看该作者

回复 #1 lunight 的帖子

简单地说,不象x86 在进程切换时,需要重新load 页表(重置cr3),从而导致整个tlb被刷新,sparc上的进程切换不需要刷新tlb。但是,sparc有它特殊的地方。就是在tlb的tag中除了虚拟地址的信息之外,还有一个context信息。相对应,每个进程在放到cpu上运行时,会分配一个context号,需要写入mmu的寄存器中(指令:stxa    cnum, [tmp1]ASI_MMU_CTX)。这样,即便不同的进程的相同虚拟地址映射项同时在tlb中,硬件也知道哪个是当前要使用的。切换函数resume()调用sfmmu_alloc_ctx()实现此功能
另外当tlb不能命中时,tlb miss trap 处理函数会自动到tsb(tsb在内存中,可以看作是庞大的页表和tlb之间的缓存)中去找,因此需要把tsb的物理地址告诉硬件。每个进程有自己的tsb,因此在进程切换时,也需要把这个信息(即当前要运行的进程的tsb物理地址)写入mmu相应的寄存器中。切换函数resume()调用函数sfmmu_load_mmustate()实现此功能 (#define        LOAD_TSBREG(tsbreg, tmp1, tmp2) 用于设置mmu寄存器)。

顺便,在sparc上,每个地址空间都有一个ASI(address space identifier)和一个offset构成。具体mmu,它的ASI指就是ASI_MMU_CTX,而context和tsb基址寄存器有不同的offset。

至于“由用户态转入内核态时,内核及处理器要做什么工作?”,具体硬件做了什么,如果有时间去docs.sun.com上下载sparc汇编文档,看看trap一节,有详细的寄存器变化说明,我在这里简单从软件角度说一下发生了什么。

我们可以把软件运行的状态分为三种:用户态,nulceus态和内核态。用户态运行时,寄存器pstate.priv = 0, tl = 0。如果在用户态发生系统调用,最终通过一个trap指令,进入nulceus态,此时寄存器pstate.priv = 1, tl > 0(如果nucleus发生trap,tl寄存器要加1,所以用>0表示)。在nulceus时调用的函数不能用C写,只能用汇编,因此需要把 trap level下降回0,所以在trap的人口函数中设置tnpc 寄存器为可以用C实现的系统调用内核态实现函数,然后通过done/retry指令退出trap,进入内核态,此时寄存器pstate.priv = 1, tl = 0. 处理完以后通过user_rtt() 重新把tl 上升为1, 然后通过done/retry指令返回用户态。

中断的处理方法与系统调用trap的处理方法类似。
另外,操作系统总是运行在内核态,即寄存器pstate.priv = 1, tl = 0。因此可以用C代码实现。

论坛徽章:
0
4 [报告]
发表于 2009-09-14 17:49 |只看该作者
这么深呀 搞不懂了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP