前段时间发现有人在CU上问如下一段linux-0.11代码 (位于文件init/main.c):
#define CMOS_READ(addr) ({ \
outb_p(0x80|addr,0x70); \
inb_p(0x71); \
})
问题:CMOS RAM共有0x00 -- 0x7F共128个字节,0x80|addr是什么意思?我觉得应该是0x7F&addr,限制范围在[0x00,0x7F]中
赵炯的书也没给出解释。不过我正好前段时间在看xv6的代码时看到了这个问题的解答:
在操作端口0x70的时候,输入值的最高位(即0x80 = 0b10000000)控制了CPU的NMI的启用与否;
这是一个设置或者不设置的问题,没办法保持其原来的值不变
用0x80|addr表示关闭NMI
大家可以看看CU该帖子:
http://bbs.chinaunix.net/thread-3700969-1-4.html或者更详尽的CMOS相关知识:
http://wiki.osdev.org/CMOS