x86使用内敛汇编实现简单的临界段保护

临界资源保护

实现方法

  • 禁用中断
__attribute__((used)) static inline uint32_t read_eflags (void){
   
    uint32_t eflags;
    ASM_V("pushf\n\tpop %%eax":"=a"(eflags));
    return eflags;
}
__attribute__((used)) static inline void write_eflags (uint32_t eflags){
   
    ASM_V("push %%eax\n\tpopf"::"a"(eflags));
}

EFLAGS的位9是IF位, 为1的时候开启中断, 0屏蔽中断
image-20240217155639448

//临界区管理
irq_state_t irq_enter_protection (void){
   
    //记录一下之前的中断是开启的还是关闭的
	irq_state_t state = read_eflags();
	state |= EFLAGS_IF;
	irq_disable_global();
	return state;
}
void irq_leave_protection (irq_state_t state){
   
    //恢复之前的IF状态
	state |= read_eflags();
	write_eflags(state);
}

实际使用

//打印的时候串口是一个临界资源
void log_printf(const char * fmt, ...){
   
    
    char str_buf[128];
    va_list args;
    //格式化处理
    kernel_memset(str_buf, '\0', sizeof(str_buf));
    va_start(args, fmt);
    kernel_vsprintf(str_buf, fmt, args);
    va_end(args);
    const char *p = str_buf;
    irq_state_t state = irq_enter_protection(); //进入临界

    while(*p != '\0')
    {
   
        //等待串口忙标志
        while((inb(COM1_PORT+ 5) & (1<<6))== 0);
        outb(COM1_PORT, *p++);
    }
    //自动换行
    outb(COM1_PORT, '\r');
    outb(COM1_PORT, '\n');
    irq_leave_protection(state);//退出临界区
}

相关推荐

  1. x86汇编描述符解析器

    2024-02-19 17:10:01       28 阅读
  2. GCC编译器技巧--在C语言里面使用使用汇编

    2024-02-19 17:10:01       24 阅读
  3. 使用汇编和反汇编引擎写一个x86任意地址hook

    2024-02-19 17:10:01       46 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-19 17:10:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-19 17:10:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-19 17:10:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-19 17:10:01       18 阅读

热门阅读

  1. (力扣记录)199.二叉树的右视图

    2024-02-19 17:10:01       24 阅读
  2. Linux中精简卷对Oracle的影响

    2024-02-19 17:10:01       33 阅读
  3. Oracle触发器

    2024-02-19 17:10:01       27 阅读
  4. 索引失效的 12 种情况

    2024-02-19 17:10:01       30 阅读
  5. C++/Python/MATLAB检查内存使用情况

    2024-02-19 17:10:01       35 阅读
  6. Python爬虫开发:Scrapy框架与Requests库

    2024-02-19 17:10:01       30 阅读
  7. 力扣_字符串10—重复的DNA序列

    2024-02-19 17:10:01       26 阅读
  8. 《数学建模》专栏导读

    2024-02-19 17:10:01       36 阅读
  9. Pytorch-SGD算法解析

    2024-02-19 17:10:01       35 阅读
  10. Python如何用双重循环输出金字塔?

    2024-02-19 17:10:01       30 阅读