linux 帧 数据结构,linux – 什么是陷阱帧?陷阱框架和task_struct有什么区别?

task_struct用于存储CPU的状态和陷阱帧做同样的事情,它们如何区别?陷阱框架是数据结构还是公正和概念?

解决方法:

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

这是task struct,它存储上下文和陷阱框架:

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,并从下一个任务加载新的寄存器集:

注意下面例子中的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时)

标签:unix,linux,linux-kernel,xv6

来源: https://codeday.me/bug/20190701/1348143.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值