PS/2(I8042)协议那些事

对于软件工程这种纯软件出身的来说,对那些8254,CPU引脚,串口连接之类的话题先天不具备兴趣,想想我们软件工程做的都是高屋建瓴,纵览全局之类的大事,何必心系CPU的哪根针插到哪个洞会传送什么电波,再说,做人是要有节操的,搞完软件去搞硬件,好比泡完妞又约帅哥花前月下共品菊,实是道德难容。奈何最近搞QEMU的外围输入设备,那键盘和鼠标的问题真对得起开源软件BUG丰富的特征,当BUG查到时钟中断PORT输出之类的地方,不得不变节让我对8042的细节细细查看(非专业人士的文档,看了发现不对,你有礼貌留言的权利)。

找了找8042的文档,发现就一个由Adam Chapweske著,Roy Show翻译的PDF《PS/2技术参考》写的比较详细,这半英文半中文的翻译方式,非常喜欢,比较适合我这种英文不咋的又喜欢开着金山词霸查英文努力与国际接轨的码农。

于是,其实这篇文章就是《PS/2技术参考》的一个读书笔记。

分两块来说,一是PS/2键盘,一是PS/2鼠标。
继续阅读

GDB运行时插入代码修改进程标准输出

之前设计了一个日志模块CLOG,有几个接口默认输出到标准输出,用于临时调试,给其命名为程序员日志接口。
程序员日志接口的“日志开关”默认处于关闭状态,目的是给编码人员临时调试用,当版本发布时,因为有动态开关,这些代码也不用删除(方便今后还要打日志)。

日志开关

有编译时开关,即,代码可以在编译时就被移除掉了。通常由宏定义实现。
运行时开关,代码在打日志时,通过检查变量值,决定是否输出日志。
最常用运行时开关的当然是命令行参数读取配置
命令行参数:
好比出身之前就已指腹为婚,不管在别人肚子里的长得是否漂亮是男是女是否是人都这么定了,有生之年已成定局,从名义上怕是改不了。
读取配置:
相对灵活,启动时读取好比你出生大富人家,DD没长长就养了童养媳。当然,媳妇这东西是可以换的,只是换起来比较伤元气,特别是现代社会法律规定,换一次媳妇就要掉一半血,所以,读取配置虽然可行,但是没多少人会实时读取。

如此说来,这两种方法实时性都不好,对启动了的进程,如果想修改日志级别,那好比人生走了一半,发现日子过的有点惨淡想重新来过,那只能先跳楼再投胎。

有没有办法不用重新投胎即可焕发第二春?
继续阅读

RFB协议详解

RFB协议,用于VNC(VIRTUAL NETWORK COMPUTING)连接,主要参考http://www.rfc-editor.org/rfc/rfc6143.txt

RFB协议可以通过字节流或数据报发送。换言之,TCP UDP都是可以的,不过,我们大多喜欢可靠的连接TCP。
协议的基本数据类型有:U8, U16, U32, S8, S16, S32,U代表UNSIGNED,S代表SIGNED

握手阶段

主要协商VERSION,协商安全传输类型(如果安全类型需要密码,这里还需要输入密码)。
协议版本号,格式如下:

"RFB xxx.yyyn"

共12 bytes,例如:

RFB 003.008n

版本号协商完成后,服务端秀一下自己支持的加密方式,格式如下: 继续阅读