【问题标题】:What is trap frame? And what is difference between trap frame and task_struct?什么是陷阱框架?陷阱框架和task_struct有什么区别?
【发布时间】:2017-12-17 03:28:00
【问题描述】:

task_struct 用于存储 CPU 的状态,trap frame 做同样的事情,那么它们有什么不同呢?陷阱框架是数据结构还是正义和概念?

【问题讨论】:

    标签: linux unix linux-kernel xv6


    【解决方案1】:

    cpu 状态 - 是关于上下文切换,而 trapframe 保存在异常或 irq 出现后保存在 tcb 中的用户空间状态。

    我的解释将基于self-written OS for raspberry pi 2 (ARMv7)

    这里是任务结构,它存储上下文和陷阱帧:

    class task {
    private:
    public:
        uint32_t pid;
        pde_t *pgd;
        tstate state;
        uint32_t *kstack;
        context *ctx;
        trapframe *tf;
        task() {};
        void init_vm();
        int load_binary(char *binary_obj);
    };
    

    上下文是一组被调用者保存的寄存器,代表任务在被其他任务抢占之前的状态(上下文切换)

    struct context {
        uint32_t    r4;
        uint32_t    r5;
        uint32_t    r6;
        uint32_t    r7;
        uint32_t    r8;
        uint32_t    r9;
        uint32_t    r10;
        uint32_t    r11;
        uint32_t    r12;
        uint32_t    lr;
    };
    

    当调度程序发生上下文切换时,当前任务将其寄存器保存到*ctx in class task,并从下一个任务加载新的寄存器集:

    请注意,下例中的 R0 是 THIS 指针,因为我们调用特定对象的方法。所以参数是 R1 和 R2

    void scheduler::swtch(struct context **oldctx, struct context *newctx)
    {
        /* r0-r3 are not preserved during call, no need to save them */
        asm volatile("push {r4-r12, lr}");
        /* save current kernel thread sp to oldctx */
        asm volatile("str r13, [r1]");
        /* Load newctx (new sp) to sp register */
        asm volatile("mov r13, r2");
        /* Load all other registers from new ctx,
         *  refer struct context format for details */
        asm volatile("pop {r4-r12, lr}");
    }
    

    现在关于trapframe:

    struct trapframe {
        uint32_t   sp_usr;     // user mode sp
        uint32_t   lr_usr;     // user mode lr
        uint32_t   sp_svc;
        uint32_t   lr_svc;
        uint32_t   spsr;
        uint32_t   r[N_GEN_REGS];
        uint32_t   pc;         // (lr on entry) instruction to resume execution
    };
    

    Trapframe 存储在出现异常期间保存的寄存器集,因此使用 Trapframe 我们可以返回并继续执行(当将处理异常或 irq 时)

    【讨论】:

      【解决方案2】:

      为了澄清,task_struct 包含进程的信息,而不是 CPU。操作系统可以管理多个进程,因此task_struct可能有多个实例

      Trapframe 保存用户空间寄存器。当 cpu 从用户模式变为内核模式时,它会保存用户空间寄存器(例如supervisor mode in xv6-riscv)。

      当然trapframe是一种数据结构。

      您可以在下面的链接中查看 Trapframe 的外观,请参阅 proc.hproc.c

      https://github.com/mit-pdos/xv6-public

      【讨论】:

        猜你喜欢
        • 2011-03-10
        • 2011-12-13
        • 1970-01-01
        • 2011-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多