不写驱动,如何在 Win10 上让主板蜂鸣器发声

Windows API 里面有一个 Beep 函数,作用是发出蜂鸣声。这个蜂鸣功能历史悠久,BIOS 的报警声就是从主板蜂鸣器里出来的,其原理是调用几乎每台机器都有的 Programmable Interval Timer (PIT)。可惜从 Windows Vista 开始,这个函数的行为变成了调用扬声器发声,而不再是使用主板蜂鸣器发声了。

如何在 Windows Vista 以上的系统里使用主板蜂鸣器发声呢?是不是必须写个 Windows 驱动呢?其实利用 WinDbg 内核调试器的功能,只需要一行代码就能搞定。下面一行代码以 800 Hz 的频率让主板蜂鸣器发声 1000 毫秒。

n 10; r $t0=800; r $t1=1000; ob 0x43 0xb6; ob 0x42 (1193180/$t0)&0xff; ob 0x42 (1193180/$t0)>>8; ob 0x61 3; .sleep $t1; ob 0x61 0

使用方法:

  1. 下载安装 WinDbg
  2. 打开内核调试。管理员权限运行
    bcdedit /debug on

    ,重启。

  3. 管理员权限打开 WinDbg,File->Kernel Debug,选择 “Local” 选项卡,确定。不出意外的话,就会进入 kernel debug session。
  4. 输入这段代码,如果你的主板蜂鸣器正常的话,应该就能听到蜂鸣声了。(可惜,截图里不带声音)

原理:

n 10;          设置十进制,默认 WinDbg 是 16 进制
r $t0=800;     设置 WinDbg 内部寄存器 t0 为 800,表示发声频率
r $t1=1000;    设置 WinDbg 内部寄存器 t1 为 1000,表示发声时长(毫秒)
ob 0x43 0xb6;  设置 PIT 输出到主板蜂鸣器的 PWM 波周期(这里的 ob 和 Linux 的 outb 相同)
ob 0x42 (1193180/$t0)&0xff;  PWM 波周期的低字节
ob 0x42 (1193180/$t0)>>8;    PWM 波周期的高字节
ob 0x61 3;     开始发声
.sleep $t1;    持续发声 $t1 这么长时间(毫秒)
ob 0x61 0;     发声结束

感谢 负一的平方根 (zzh1996) 出的题。

参考:http://wiki.osdev.org/PC_Speaker

博客启用新域名 ring0.me

2013 年 5 月 16 日,我的博客有了顶级域名 bojieli.com。2015 年 1 月 6 日,注册并启用了新域名 ring0.me(是数字 0 哦,字体看着像字母 O)。

Ring0 是 CPU 体系结构里特权级最高的保护级别,运行在 Ring0 级别的代码直接与物理硬件交互。特权级的概念可以追溯到 20 世纪 60 年代的 MULTICS。在 x86 体系结构中,ring0 代表操作系统内核和内核驱动,相对于通常运行在 ring 3 的用户态应用程序。我第一次听说 ring0 是在一篇关于 rootkits 的文章里,那时我初中,对 “黑客” 技术很好奇。惭愧的是,我至今都不会写 rootkit。

我的博客使用 ring0.me 这个域名,是为了展示我的兴趣主要在搭建起计算机系统和网络的基础研究和技术。

注册 ring0.me 是感觉姓名全拼的域名 bojieli.com 看起来不够 geek。我想过 rdma, ssh22, http80, tcp80, printk, reisub 等多个未被注册的域名,最后还是觉得 ring0 更好。

原来的 bojieli.com 已经 HTTP 301 跳转到 ring0.me 的相应页面。由于 StartSSL 的政策限制,SSL 证书需要在域名注册后三天才能申请。1 月 17 日部署了 SSL 证书。bojieli.com 将继续服务到 2016 年 5 月,之后不再续费。

博客标题由 “null != undefined” 改成了 “Ring0”,副标题由 “Seeking possibility for next-generation network” 改成了 “Fundamental research in networked systems”。希望读者喜欢 ^_^

差分磁盘:从“恢复出厂设置”说起

智能手机、路由器等很多嵌入式设备都有“恢复出厂设置”的功能。按照PC机上大家习惯的“备份”做法,似乎需要把出厂时的整个系统备份在只读的 ROM 里。如果是这样,每次恢复出厂设置,ROM 里的内容都要拷贝到 Flash 存储里,浪费大量存储空间,而且恢复出厂设置需要比较长的时间。但事实上,恢复出厂设置只是重启一下就完成了,而且刚恢复的系统里 Flash 存储基本是空的。

(感谢 BW 的评论,Android 系统的恢复出厂设置不是使用差分技术,而是简单清空数据分区,对 /system 分区的修改没有被还原,我弄错了)

Capture
继续阅读“差分磁盘:从“恢复出厂设置”说起”

算法题不是检验程序员的唯一标准

这段时间很多公司的面试都在拉开帷幕。前几天我的一位好朋友应聘一家被誉为 “工程师天堂” 的互联网公司,第一轮面试就悲剧了。原因可能是在一道关于树的算法题上耗了一个小时。我觉得凭一道算法题断定一个人的能力过于僵化了。当然,这样的公司可能应聘的人太多,没时间仔细考察每个应聘者。

IMG_20130928_201318

今晚同学带我去清华玩,顺路逛了清华科技园,也算我进过这家令无数程序猿向往的公司大门了。回来的路上,我就在思考纯算法题面试可能的弊端。在 coolshell 上看到了跟我观点类似的文章《为什么我反对纯算法面试题》《我是怎么招聘程序员的》《再谈“我是怎么招聘程序员的”》,于是鼓足勇气把自己 simple & naive 的观点拿出来与诸君分享。欢迎各种形式的拍砖。
继续阅读“算法题不是检验程序员的唯一标准”

为什么你应该学习 Linux

Note: 本文的目标读者是计算机专业学生和希望深入了解计算机的朋友们。

今天参加了微软学生夏令营的 Windows Azure Camp,大约从下午 16:00 到晚上 21:30。共有10个队,每个队分为四组,其中 Coding 组有必做题和选做题。必做题是,在 Windows Azure 云平台上,搭建一个 Web 应用,用户上传图片,把图片旋转后显示给用户,并保存到云存储上。选做题是,把用户上传的原图和旋转后的图片拼成一张图片。(我没有听题,可能不准确,见谅)

我没有在自己的队里工作,而是在场里四处乱转,跟各队选手聊聊天,看大家都在干什么。初看起来,似乎有点像 ACM 的赛场。

IMG_20130822_211248

继续阅读“为什么你应该学习 Linux”