You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OSdev Bare Bones教程中vga相关函数使用位移运算符的原因

VGA文本模式位运算逻辑说明

VGA文本模式是x86架构下的默认字符显示模式,硬件层面有固定的存储规则,这两个函数的位移操作完全是匹配硬件约定的实现:

  • VGA文本模式下每个显示字符对应16位(2字节)的连续存储单元,内存映射起始地址为0xB8000
  • 16位单元的比特位分配规则固定:
    • 低8位:存储要显示字符的ASCII编码
    • 高8位:存储字符的颜色属性,其中高4位为背景色、低4位为前景色(字体颜色)
    • 所有颜色的取值范围是0~15,刚好可以用4个比特位存储

vga_entry_color函数位移逻辑

static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg) 
{
    return fg | bg << 4;
}

这个函数的作用是把前景色、背景色两个4位的独立值,拼接成一个8位的颜色属性值:

  • bg << 4:把4位的背景色值左移4位,直接放到8位变量的高4位位置
  • 按位或|操作:把4位的前景色值放到8位变量的低4位位置,两个值互不干扰,不需要额外的算术运算,不会出现进位溢出问题

举个实际例子:前景色选浅灰(值为7,二进制0111)、背景色选黑色(值为0,二进制0000),计算过程为0111 | (0000 << 4) = 00000111,对应颜色值0x07,就是教程里默认的黑底浅灰显示样式。


vga_entry函数位移逻辑

static inline uint16_t vga_entry(unsigned char uc, uint8_t color) 
{
    return (uint16_t) uc | (uint16_t) color << 8;
}

这个函数的作用是把8位的ASCII字符、8位的颜色属性,拼接成一个16位的VGA存储单元:

  • (uint16_t) color << 8:先把8位的颜色属性强转为16位变量,再左移8位,直接放到16位变量的高8位位置
  • 按位或|操作:把8位的ASCII字符值放到16位变量的低8位位置,直接生成符合硬件要求的存储值

举个实际例子:要显示的字符是A(ASCII码0x41,二进制01000001)、颜色值为0x07,计算过程为0000000001000001 | (00000111 << 8) = 0000011101000001,对应16位值0x0741,写入VGA缓冲区后硬件就会自动显示为黑底浅灰的A。


位移+按位或是底层硬件交互代码的常规实现,优势非常明确:既可以精准控制每个比特位的取值,完全匹配硬件的约定规则,又属于CPU的基础指令,执行效率几乎没有开销,非常适合内核这种对稳定性、性能要求极高的场景。

内容的提问来源于stack exchange,提问作者Witut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 06:45:01