自己动手写操作系统吧 关注:71贴子:281
  • 6回复贴,共1

《一个操作系统的实现》第六章进程切换的 tss.esp0 的大问题

只看楼主收藏回复

在《一个操作系统的实现》第六章中,有一个重大的问题:
在 restart() 函数运行之前,系统一直是运行在内核态的。第一次执行 restart() 之后,TestA() 进程开始运行,系统处在 ring1 。之后,中断发生,由于是 ring1 -> ring0 ,所以存在栈的切换。所以,问题就来了,因为此时 tss.esp0 还没有初始化,所以 此时 tss.esp0 的值是垃圾值,tss.esp0 被赋值是在 hwint00 执行之后才有的。那么,既然是这样,为什么会没有事?
求解!


1楼2014-11-06 16:56回复
    刚来贴吧没想到隔了20小时还能抢到二楼,前排还是我的,火钳刘明


    IP属地:浙江来自Android客户端2楼2014-11-07 13:30
    收起回复
      2026-01-01 15:22:37
      广告
      不感兴趣
      开通SVIP免广告
      在jmp xxx:xxx的时候做了两个操作当前寄存器全部保存在tss,jmp处的tss读取到寄存器,完成切换,切换回来时tss已经有值了,个人猜想


      IP属地:美国来自Android客户端4楼2016-11-06 18:18
      回复
        初始化了啊,在protect.c 里的init_prot方法
        /* 填充 GDT 中 TSS 这个描述符 */
        memset(&tss, 0, sizeof(tss));
        tss.ss0= SELECTOR_KERNEL_DS;
        init_descriptor(&gdt[INDEX_TSS],
        vir2phys(seg2phys(SELECTOR_KERNEL_DS), &tss),
        sizeof(tss) - 1,
        DA_386TSS);
        tss.iobase= sizeof(tss);/* 没有I/O许可位图 */


        5楼2020-05-16 13:50
        回复