题目:
编写一个内核模块,用递归的方法计算一个数的阶乘。先用较小的数字 (例如 3) 验证程序的正确性,然后用较大的数字(例如 100000)实验,看会发生什么,并解释观察到的现象。
实验结果分析
在进行递归的方法计算 100000 的阶乘的时候,代码编译完成后,加载内核,电脑瞬间卡死,CapsLk 键不停的闪烁,鼠标没有反应。第一次等待了近两个小时,电脑还是卡死,没有恢复,强制关机重启后,再次进行编译安装,还是卡死,我认为这不是一次偶然事件,应该是数字太大引起的卡死。后来与老师课上探讨,发现实验的结果真的是卡死了,原因是操作系统溢出无保护,每个进程只能分配大概 4K 的内存空间,数字过大就会导致内核站的溢出,从而导致崩溃。因为电脑卡死了,所以没有 100000 的阶乘的实验截图。
代码
//阶乘10
#include #include MODULE_LICENSE("Dual1 BSD/GPL");
int factorial(int n){
if(n==0)
return 1;
else
n=factorial(n-1)*n ;
return n;
}
static int factorial_10(void)
{
printk(KERN_ALERT "10 10 10 %d",factorial(10));
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye , cruel world!10\n");
}
module_init (factorial_10);
module_exit (hello_exit);
//阶乘10000
#include #include MODULE_LICENSE("Dual1 BSD/GPL");
int factorial(int n){
if(n==0)
return 1;
else
n=factorial(n-1)*n ;
return n;
}
static int factorial_100000(void)
{
printk(KERN_ALERT "100000 %d",factorial(100000));
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye , cruel world!100000\n");
}
module_init (factorial_100000);
module_exit (hello_exit);