据我所知,linux内核是单片的。这意味着如果任何内核模块崩溃,整个系统应该崩溃。但是,我没有看到同样的情况。这是我的越野车计划? 为什么我的机器没有崩溃?如何修改程序以使系统崩溃?
#include <linux/init.h>
#include <linux/module.h> /** needed by all modules **/
#include <linux/kernel.h> /** This is for KERN_ALERT **/
MODULE_LICENSE("SJ BSD/GPL");
int t = 100;
static int hello_init(void)
{
printk(KERN_ALERT "Hello SJ\n");
t = t *10;
t = t/0;
printk(KERN_ALERT "The value of t is %d\n",t);
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye..SJ\n");
}
module_init(hello_init);
module_exit(hello_exit);
这是我得到的输出 -
# insmod ./hello.ko
Segmentation fault
#uname -a
2.6.32.26-175.fc12.i686.PAE #1 SMP Wed Dec 1 21:45:50 UTC 2010 i686 i686 i386 GNU/Linux
dmesg尾巴是
id: 20883, comm: insmod Tainted: P (2.6.32.26-175.fc12.i686.PAE #1) OptiPlex 990
EIP: 0060:[<f7e9e02f>] EFLAGS: 00010246 CPU: 4
EIP is at param_init+0x1a/0x27 [param]
EAX: 00000000 EBX: f7e9e0b0 ECX: c0aa8e60 EDX: 00000000
ESI: 00000000 EDI: f7e9e015 EBP: f2d39f84 ESP: f2d39f7c
DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
Process insmod (pid: 20883, ti=f2d38000 task=f6630000 task.ti=f2d38000)
Stack:
f7e9e079 00000000 f2d39f9c c040305b 00000000 f7e9e0b0 00000000 bfe0ed78
<0> f2d39fac c04716da 09932018 00000000 f2d38000 c040903b 09932018 000169c9
<0> 09932008 00000000 bfe0ed78 bfe0ed98 00000080 0000007b 0000007b 00000000
Call Trace:
[<c040305b>] ? do_one_initcall+0x51/0x13f
[<c04716da>] ? sys_init_module+0xac/0x1e2
[<c040903b>] ? sysenter_do_call+0x12/0x28
Code: 1f 44 00 00 68 66 e0 e9 f7 e8 cf 93 90 c8 58 c9 c3 55 89 e5 0f 1f 44 00 00 ff 35 18 e2 e9 f7 68 79 e0 e9 f7 e8 b4 93 90 c8 31 c0 <c7> 05 00 00 00 00 64 00 00 00 c9 c3 90 04 00 00 00 14 00 00 00
EIP: [<f7e9e02f>] param_init+0x1a/0x27 [param] SS:ESP 0068:f2d39f7c
我希望整个系统崩溃。但是,机器没有崩溃或重新启动。只是特定模块崩溃了。我想让整个系统失效。理想情况下应该是因为内核是单片的。内核中的任何问题都应该关闭整个机器。但是,我没有看到相同的情况。有什么问题?你可以请点亮一下吗?我的观念在这里不正确吗?
答案 0 :(得分:2)
我使用旧方法编写函数,它可靠地崩溃了我的VM内核。
虚拟机正在运行Red Hat Enterprise Linux Server release 6.3
。
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
int t = 100;
int init_module(void)
{
printk(KERN_ALERT "Hello SJ\n");
t = t *10;
t = t/0;
printk(KERN_ALERT "The value of t is %d\n",t);
}
void cleanup_module(void)
{
}
根据您的更新,我最好的猜测是insmod
工具在将函数插入内核之前编译并运行这些函数,这就是insmod
命令本身段错误的原因。原因是您的dmesg
输出表明它是Process insmod
已经发生了分段错误。要验证这一点,您必须查看系统的insmod
源代码。
确定insmod
是否在内核模式或用户模式下运行模块的一个有趣的实验是将一些特权指令(例如rdmsr
)作为内联汇编程序放入模块中,看看是否insmod
会扼杀它。