如果在任意方向上的空间移位大于我们先前设定的阈值,就按照两个方向上移动的量增加总偏差。然后将当前的基数设为现有的加速度级别。这样重复地重新初始化基数值要求用户持续超出空间移位值以增加检测到的总偏差。这允许用户在紧急模式下移动并存储 ThinkPad,从而安全地将机器送到系统管理员那里。如果仅需要侧立、倾斜和持拿 ThinkPad 以触发重新启动,请删除重新初始化设定。
测试 panicShake() 内核
要发动一种紧急情况,需要在内核中调用紧急情况子程序。创建以下 makefile:obj-m := panicCall.o,程序 panicCall.c 在编译时将使用该文件:
/* * panicCall.c - Instigate a kernel panic */
#include <linux/module.h>
/* Needed by all modules */
#lincude <linux/kernel.h>
/* Needed for KERN_INFO */
static char *pMesgStr = "PANIC SHAKE AND BAKE";
int init_module(void)
{ printk(KERN_INFO,"panicCall module loaded\n");
panic(pMesgStr); return(0);}void cleanup_module(void)
{ printk(KERN_INFO,"panicCall module unloaded, beyond possible");} |
清单 6. panicCall.c 内核模块源代码
以超级用户身份用 make -C /lib/modules/$(uname -r)/build SUBDIRS=$PWD modules 命令编译 panicCall 模块。现在就有了一个可调用的模块可以使用 insmod panicCall.ko 命令触发紧急情况。如果还没有该模块则重新引导(以激活 hdaps 紧急情况下触发启用震动的内核),并运行 insmod panicCall.ko。应当会看到类似以下内容:
panicCall: module license 'unspecified' taints kernel.
Kernel panic - not syncing: PANIC SHAKE
AND BAKE ACTIVE [<c011a32e>] panic+0x3e/0x174
[<f8a97017>] init_module+0xb/0xc [panicCall]
[<c013050a>] sys_init_module+0x1382/0x1514
[<c0152413>] do_sync_read+0xb8/0xf3
[<c012a17f>] autoremove_wake_function+0x0/0x2d
[<c01c0672>] _atomic_dec_and_lock+0x22/0x2c
[<c0169c32>] mntput_no_expire+0x11/0x6d
[<c0102bc1>] syscall_call+0x7/0xb |
清单 7. 内核紧急情况堆栈
现在拿起计算机,然后用力地晃动它,计算机将打印出 “shaking substrate” 消息并执行重新启动。如果您不希望晃动可能活动的磁盘驱动器,请以超级用户身份发出以下命令:
mkdir /tmp/ramdisk0mke2fs /dev/ram0mount
/dev/ram0 /tmp/ramdisk0/cp /root/panicCall.ko
/tmp/ramdisk0/cp /sbin/insmod /tmp/ramdisk0/ |
清单 8. RAM 磁盘创建和模块复制
现在有了将模块插入位于 RAM 磁盘的内核所需的两个文件。用以下部分更新 /etc/init.d/halt 脚本,将其放在刚好位于 fsck check 部分之下 halt execute 部分之上的位置:
echo "disks now mounted in readonly mode,
spin down in 5 seconds";/sbin/hdparm -S 1
/dev/hdaecho "spin down hda called, waiting 10 seconds";
sleep 10echo "calling panic from ramdisk
location";/tmp/ramdisk0/insmod
/tmp/ramdisk0/panicCall.ko |
清单 9. 修改 /etc/init.d/halt
以超级用户身份执行命令 init 0 以将计算机转入关闭模式中。在调用关闭程序前,计算机将把紧急情况触发模块装入内核,并调用震动检测程序。如果在系统关闭时仔细听硬盘的声音,可以听到明显比以往更长的喀哒声,然后多普勒磁盘将随着机械臂逐渐下降的 “积载” 位置而降低并且磁盘旋转停止。再过大约五秒钟后,将从 RAM 磁盘执行紧急情况模块,而物理磁盘头仍停止不动。现在,您可以随心所欲地晃动 ThinkPad 而无需考虑磁盘的运行状况。