求教insmod错误的解决办法
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/init.h>
- #include <linux/fs.h>
- #include <linux/cdev.h>
- #include <linux/device.h>
- MODULE_LICENSE ("GPL");
- int hello_major = 120;
- int hello_minor = 0;
- int number_of_devices = 1;
- struct cdev cdev;
- static dev_t dev;
- struct file_operations hello_fops = {
- .owner = THIS_MODULE
- };
- static void char_reg_setup_cdev (void)
- {
- int error;
- cdev_init (&cdev, &hello_fops);
- cdev.owner = THIS_MODULE;
- cdev.ops = &hello_fops;
- error = cdev_add (&cdev, dev, 1);
- if (error)
- printk (KERN_NOTICE "Error %d adding char_reg_setup_cdev", error);
- }
- struct class *my_class;
- static int __init hello_2_init (void)
- {
- int result;
- dev = MKDEV(hello_minor, hello_minor);
- result = register_chrdev_region (dev, number_of_devices, "hello");
- if (result<0) {
- printk (KERN_WARNING "hello: can't get major number %d\n", hello_major);
- return result;
- }
- char_reg_setup_cdev ();
- /* create your own class under /sysfs */
- my_class = class_create(THIS_MODULE, "my_class");
- if(IS_ERR(my_class))
- {
- printk("Err: failed in creating class.\n");
- return -1;
- }
- /* register your own device in sysfs, and this will cause udev to create corresponding device node */
- device_create( my_class, NULL, dev, "hello%d", 0 );
- printk (KERN_INFO "Registered character driver\n");
- return 0;
- }
- static void __exit hello_2_exit (void)
- {
- cdev_del (&cdev);
- device_destroy(my_class, dev);
- class_destroy(my_class);
- unregister_chrdev_region (dev, number_of_devices);
- printk (KERN_INFO "char driver cleaned up\n");
- }
- module_init (hello_2_init);
- module_exit (hello_2_exit);
复制代码成功编译后,insmod hello.ko,只提示"killed".
若再次insmod hello.ko则会提示insmod error inserting 'hello.ko ':-1 file exists。运行lsmod |grep hello,显示
hello 2849 1
如果rmmod hello.ko,则提示ERROR: Module hello is in use
内核版本为2.6.38.2
希望本版的前辈帮帮忙,困扰了很久。多谢了
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
没仔细看,应该是init函数出问题了,貌似只能重启
你的那个模块存在了 你再insmod 当然不行啦。。 错误信息不是告诉你了吗
回复 3# april88416
是的,rmmod是后续的操作,最关键的是insmod以后,系统马上提示"killed"。
回复 2# amarant
的确只能重启才能解决问题,不知道代码错哪里了,麻烦帮忙看看
回复 1# createwindow
After insmoding the module ,run command 'dmesg|tail ' to check what to print .Maybe you can fix it then!
每个函数的返回值都看下,看看到底出错在哪
回复 6# alexbuaa
这个是信息
[ 364.950023] [<c04078ed>] device_create+0x2d/0x30
[ 364.950028] [<f80b20f2>] hello_2_init+0xf2/0x106 [hello]
[ 364.950034] [<c0101135>] do_one_initcall+0x35/0x170
[ 364.950037] [<f80b2000>] ? hello_2_init+0x0/0x106 [hello]
[ 364.950044] [<c0180cb6>] sys_init_module+0x116/0x1090
[ 364.950048] [<c010301f>] sysenter_do_call+0x12/0x28
[ 364.950050] Code: 00 00 00 00 c7 45 f0 00 00 00 00 0f 88 d1 03 00 00 8b 45 e0 03 45 dc 89 45 e4 73 0f 8b 55 e0 c7 45 e4 ff ff ff ff f7 d2 89 55 dc <0f> b6 07 8b 5d e0 84 c0 74 7b 90 8d 74 26 00 8d 55 ec 89 f8 e8
[ 364.950081] EIP: [<c0361681>] vsnprintf+0x41/0x430 SS:ESP 0068:eb851e3c
[ 364.950086] CR2: 0000000000000000
[ 364.950089] ---[ end trace 5aeedd94db89d742 ]---
就是你在执行模块初始化的时候出错了
本帖最后由 createwindow 于 2011-05-12 22:03 编辑
发现device_create的调用影响了这个结果,深层次原因还不清楚,删除该句则不会出错。
大家有没有什么建议