10.6临界资源及其简单保护

本文介绍了在编程中如何通过关中断(irq_disable_global)来保护临界资源,使用`irq_state_t`记录eflags值以便在中断前后恢复状态,并强调了在全局变量如GDT表上添加保护措施的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

10.6临界资源及其简单保护

在我们运行代码的过程中会出现下图现象,一个任务没有打印完任务就被CPU切换了,然后出现打印出错

串行接口输出这部分的代码(临界资源)没有被保护起来

我们保护临界资源有两种方案,PV信号量方案后面学,这次先采用关中断方案

//irq.c
/**
 * @brief 进入中断保护
 */
irq_state_t irq_enter_protection (void) {
    irq_state_t state = read_eflags();
    irq_disable_global();
    return state;
}

/**
 * @brief 退出中断保护
 */
void irq_leave_protection (irq_state_t state) {
    write_eflags(state);
}

//irq.h
typedef uint32_t irq_state_t; //因为eflags是32位,起个别名好标识
//cpu_instr.h
static inline uint32_t read_eflags (void) {
    uint32_t eflags;

    __asm__ __volatile__("pushfl\n\tpopl %%eax":"=a"(eflags)); //先压到栈里面,然后保存在一个寄存器里面
    return eflags;
}

static inline void write_eflags (uint32_t eflags) {
    __asm__ __volatile__("pushl %%eax\n\tpopfl"::"a"(eflags));//先将寄存器的值压到栈里面,然后从栈顶拿出来
}

为什么要记录eflags的原值?

因为在进入保护区前不知道是关中断还是开中断,所以要恢复到进入临界区前的状态,所以要记录进入临界区前的eflags值

然后给所有全局变量(GDT表之类的数据结构加上保护代码)

结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值