编写Linux内核模块实现阶乘

题目:

      编写一个内核模块,用递归的方法计算一个数的阶乘。先用较小的数字 (例如 3) 验证程序的正确性,然后用较大的数字(例如 100000)实验,看会发生什么,并解释观察到的现象。



实验结果分析

      在进行递归的方法计算 100000 的阶乘的时候,代码编译完成后,加载内核,电脑瞬间卡死,CapsLk 键不停的闪烁,鼠标没有反应。第一次等待了近两个小时,电脑还是卡死,没有恢复,强制关机重启后,再次进行编译安装,还是卡死,我认为这不是一次偶然事件,应该是数字太大引起的卡死。后来与老师课上探讨,发现实验的结果真的是卡死了,原因是操作系统溢出无保护,每个进程只能分配大概 4K 的内存空间,数字过大就会导致内核站的溢出,从而导致崩溃。因为电脑卡死了,所以没有 100000 的阶乘的实验截图。


代码

//阶乘10


#include <linux/init.h>
#include <linux/module.h>
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 <linux/init.h>
#include <linux/module.h>
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);


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值