linux 内核编程 insmod错误:Unknown symbol in module

日志报错:unknown symbol usb_register_notify
网上说这是因为依赖的模块没有加载,
怎么知道自己的内核程序依赖哪些模块?

1个回答

可以参考下lsmod和modinfo这两个命令

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
加载模块是报错unknown symbol in module

写了个简单模块是可以加载的,但是想在模块内自动创建设备文件,当添加了一个class_create 和device_create 函数后,编译可以过,当使用insmod加载时报错unknown symbol in module ,这两个函数需要关联什么吗?求指教。谢了

编译好的linux驱动模块向android手机的linux内核中insmod时错误

我编写了一个helloworld.ko的驱动模块,编译成功后向手机中insmod时报错,错误提示为version magic '2.6.35.7_hi3716m mod_unload ARMv7 ' should be '3.3.6_hi3716m mod_unload ARMv7 p2v8 ',请问怎么解决?还有ARMv7后的p2v8是什么意思?

linux insmod 提示vmalloc失败

系统中有100多个ko,,,在第一次启动时我都脚本尝试加载某些驱动, 可能会由于依赖关系加载失败(Unknown symbol),但最后都会加载成功, 最后再加载一个5M左右的ko时,提示: 105.642067] vmap allocation for size 5386240 failed: use vmalloc=<size> to increase size. [ 105.642090] vmalloc: allocation failure: 5381464 bytes [ 105.642101] insmod.static: page allocation failure: order:0, mode:0xd0 [ 105.642115] CPU: 2 PID: 2963 Comm: insmod.static Not tainted 4.1.15 #3 [ 105.642124] Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree) [ 105.642156] [<c010f424>] (unwind_backtrace) from [<c010b5bc>] (show_stack+0x10/0x14) [ 105.642182] [<c010b5bc>] (show_stack) from [<c067ef2c>] (dump_stack+0x84/0xc4) [ 105.642204] [<c067ef2c>] (dump_stack) from [<c01e6a8c>] (warn_alloc_failed+0xe8/0x124) [ 105.642225] [<c01e6a8c>] (warn_alloc_failed) from [<c0215dcc>] (__vmalloc_node_range+0x1b0/0x21c) [ 105.642241] [<c0215dcc>] (__vmalloc_node_range) from [<c010c948>] (module_alloc+0x48/0x50) [ 105.642259] [<c010c948>] (module_alloc) from [<c019d118>] (module_alloc_update_bounds+0xc/0x5c) [ 105.642274] [<c019d118>] (module_alloc_update_bounds) from [<c019d77c>] (load_module+0x604/0x1a30) [ 105.642288] [<c019d77c>] (load_module) from [<c019ecdc>] (SyS_init_module+0x134/0x14c) [ 105.642308] [<c019ecdc>] (SyS_init_module) from [<c01076c0>] (ret_fast_syscall+0x0/0x3c) [ 105.642317] Mem-Info: [ 105.642339] active_anon:47416 inactive_anon:318 isolated_anon:0 [ 105.642339] active_file:14870 inactive_file:37342 isolated_file:0 [ 105.642339] unevictable:0 dirty:0 writeback:0 unstable:0 [ 105.642339] slab_reclaimable:1968 slab_unreclaimable:3020 [ 105.642339] mapped:31153 shmem:527 pagetables:3473 bounce:0 [ 105.642339] free:351240 free_pcp:832 free_cma:49751 [ 105.642378] Normal free:355336kB min:2772kB low:7188kB high:7880kB active_anon:31096kB inactive_anon:4kB active_file:13812kB inactive_file:24672kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:507904kB managed:481564kB mlocked:0kB dirty:0kB writeback:0kB mapped:19384kB shmem:28kB slab_reclaimable:7872kB slab_unreclaimable:12080kB kernel_stack:3784kB pagetables:13892kB unstable:0kB bounce:0kB free_pcp:1816kB local_pcp:252kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 105.642388] lowmem_reserve[]: 0 12416 12416 [ 105.642425] HighMem free:1049624kB min:512kB low:15092kB high:17380kB active_anon:158568kB inactive_anon:1268kB active_file:45668kB inactive_file:124696kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:1589248kB managed:1589248kB mlocked:0kB dirty:0kB writeback:0kB mapped:105228kB shmem:2080kB slab_reclaimable:0kB slab_unreclaimable:0kB kernel_stack:0kB pagetables:0kB unstable:0kB bounce:0kB free_pcp:1512kB local_pcp:12kB free_cma:199004kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [ 105.642433] lowmem_reserve[]: 0 0 0 [ 105.642450] Normal: 4*4kB (UEM) 2*8kB (E) 5*16kB (E) 2*32kB (EM) 1*64kB (M) 2*128kB (UM) 0*256kB 1*512kB (M) 2*1024kB (UM) 0*2048kB 2*4096kB (U) 2*8192kB (UE) 2*16384kB (EM) 9*32768kB (MR) = 355312kB [ 105.642536] HighMem: 6*4kB (MC) 12*8kB (MC) 24*16kB (MC) 11*32kB (MC) 7*64kB (C) 6*128kB (UC) 2*256kB (C) 1*512kB (U) 0*1024kB 1*2048kB (U) 1*4096kB (M) 1*8192kB (M) 1*16384kB (M) 31*32768kB (MRC) = 1049624kB [ 105.642622] 52750 total pagecache pages [ 105.642633] 0 pages in swap cache [ 105.642642] Swap cache stats: add 0, delete 0, find 0/0 [ 105.642648] Free swap = 307196kB [ 105.642655] Total swap = 307196kB [ 105.642663] 524288 pages RAM [ 105.642669] 397312 pages HighMem/MovableOnly [ 105.642677] 4294875577 pages reserved [ 105.642684] 98304 pages cma reserved 然而我看内存是非常充足的: root@sabresd_6dq:/cache # cat /proc/meminfo MemTotal: 2070812 kB MemFree: 1392728 kB MemAvailable: 1560808 kB Buffers: 5240 kB Cached: 205804 kB SwapCached: 0 kB Active: 246864 kB Inactive: 150712 kB Active(anon): 187356 kB Inactive(anon): 1272 kB Active(file): 59508 kB Inactive(file): 149440 kB Unevictable: 0 kB Mlocked: 0 kB HighTotal: 1589248 kB HighFree: 1040076 kB LowTotal: 481564 kB LowFree: 352652 kB SwapTotal: 307196 kB SwapFree: 307196 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 186552 kB Mapped: 124168 kB Shmem: 2108 kB Slab: 20076 kB SReclaimable: 7896 kB SUnreclaim: 12180 kB KernelStack: 3848 kB PageTables: 14444 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 1342600 kB Committed_AS: 12288032 kB VmallocTotal: 516096 kB VmallocUsed: 251268 kB VmallocChunk: 169780 kB CmaTotal: 393216 kB CmaFree: 199004 kB 请哪位专家看一下什么问题 (如果不是前面的Unknown symbol,则全部能加载成功,不会提示vmalloc问题)

内核模块卸载rmmod: ERROR: Module hacked_mkdir is in use

insmod加载模块后发现编写的模块功能好像没有起作用,使用lsmod发现模块used 1, rmmod卸载时提醒rmmod: ERROR: Module hacked_mkdir is in use, 通过查找资料写了另外一个模块force_rmmod将该模块的引用计数置为0, 后执行rmmod, 仍然 Device or resource busy错误, 此时通过lsmod查看该模块used为0, 直接查看文件/proc/modulesf发现该模块18154 0 - Unloading 0x00000000 (OX-) ,这种情况怎么解决呢

模块加载错误,提示系统内核版本和源码版本不一致

乌班图系统16.0,linux版本4.0,insmod模块的提示invalid module Format.

linux内核驱动模块ko加载时如何绕过CRC校验的问题。

基于种种原因,本人编写了一个驱动ko文件,想在天机II的系统上insmod,由于没有天机II的源码,故而我只能在nubia的内核源码树中编译ko文件,所以编译出来的ko文件在天机上面加载存在CRC校验的问题(内核源码版本不匹配?)。 现在模块加载时的ver_magic问题已经绕过,算是解决了,但是由于模块中还要用到不少内核导出函数,有些函数的CRC校验值可以在其他ko模块中找到,但也有很多找不到,所以加载不起来,很是头疼,现在该如何是好,有没有大神给予下指导。。。

ARM11开发板上insmod模块加载出错

我在PC机上先编译好模块,然后移到开发板上,首次insmod成功。 然后我rmmod模块也成功了。但是当我再次insmod同一个模块时候报错。 insmod: can't insert 'test.ko': File exists 试了多个模块都是这样的现象。

Linux内核LCD驱动某些寄存器值无法修改

为了熟悉总线驱动,便自己写内核LCD驱动,板子是4412的开发板,make menuconfig里面裁剪LCD驱动后会报很多错误所以在drivers/video下面注释掉LCD相关的驱动。注释过后重新编译kernel。dev下面已经没有fb了。 现在只是测试内核LCD显示,寄存器配置用的跟裸板一样的配置步骤,裸板上面已经测试过了,能够正常显示图片。证明寄存器的,所以寄存器配置步骤应该是没有问题的。 现在出现的问题就是,按照裸板上的配置步骤,让开发板在Linux内核模块程序中配置寄存器,insmod能够成功添加模块,但printk打印来看,某些寄存器(LCD寄存器)能够修改,某些寄存器不能修改,修改的方法是一样的。所以应该不是修改方法的问题。我看了一下/proc/iomem文件,不能修改的那段寄存器地址已经被注册了,不知道是不是这个原因导致我无法修改。 搞了几天了,个人无法解决,跪求方法 Orz

Linux Kernel Version

Problem Description Samuel is fed up with Microsoft Windows system. Instead of xp he chose to install Linux Fedora 10 in his own desktop. But Linux has various distributions with different kernel versions. Some kernels are not stable. Of course,the unstable ones is not of Samuel's choice. Samuel is never tired of reinstalling Linux,because he always wants to try the latest release version on his computer. So Samuel needs to know the kernel's version before he downloads the distribution version. Here is an easy problem for you,tell Samuel which distribution he should choose to reinstall. To make the problem easier,suppose each Linux kernel version mark is made up by a string like the format:”r.x.y”Here r represents the major version number,x will be even(stable) or odd(beta version not stable,need to be developed),y represents the time the kernel has been corrected. For instance,the kernel whose number is 2.6.7 is a stable version. However,2.5.11 is not due to the number the letter x represents is odd. As for he problem which one is the latest kernel,you can also refer to version number. When compared two version,you should first compare the r1 and r2, if r1>r2 version 1 is the latest version. If r1=r2,you need to compare x1 and x2,if x1>x2 that means the version 1 is the latest. If x1=x2,then you need to compare y1 and y2,version 1 is the newest one only if y1>y2..Not clear about my English explanation,you can see the HDOJ 1976,it has a Chinese one. Input The input will consist 2 major parts: Test cases t. Each of test case is made up of 2 minor parts: 1.The number of available distributions 2.Name of the distribution(a string,no white blanks) 3.The kernel version(also a string in the format r.x.y without any blanks) I guarantee there is no test case has the same distribution name but with different kernel version nor the same kernel version but with the different distribution name. All the information in the same test cases is totally different. Output Your task is to tell the latest version apart,and output the name of the distribution,using “The latest distribution Samuel will choose is ****.” Sample Input 2 3 SUSE 2.6.5 Fedora 2.6.7 Ubuntu 2.6.6 4 RedFlag 2.4.5 CentOS 2.5.6 Fedora 2.4.3 Debian 2.5.7 (In reality,the kernel version may not be so. The numbers are made up by myself.) Sample Output The latest distribution Samuel will choose is Fedora. The latest distribution Samuel will choose is RedFlag.

编译除本机内核版本之外的其他内核版本的驱动

请教各位大神: 我的电脑内核是3.11的,但是编译到板子的内核是2.6的,所以想编译生成2.6版本的ko文件,编译成功了,但是加载时还是说版本不匹配 OscPcie: disagrees about version of symbol module_layout insmod: error inserting 'OscPcie.ko': -1 Invalid module format 如何解决呢?

linux usb gadget 加载g_serial.ko出现 no such device

我想做一个设备侧的USB虚拟串口,使用了.../driver/usb/gadget/下的 g_serial.ko模块, 内核版本是3.16 加载的顺序是 ``` insmod u_serial.ko insmod libcomposite.ko insmod usb_f_serial.ko insmod usb_f_obex.ko insmod usb_f_acm.ko insmod g_serial.ko ``` 除最后一个模块外,都没有报错,加载最后一个g_serial.ko时,出现 "can't insert 'g_serial.ko' no such device"的报错, 我看了gedget serial的文档,加载模块时会自动创建设备文件,所以我不明白到底哪里错了. 可能是硬件的原因么?或者UDC部分出错?有没有了解的大神帮忙分析一下,我不了解usb的工作过程,不知道要在哪里调试测试,来证明哪里有问题

按键驱动安装不了 ,内核配置改了还是不行

内核配置改过了,也把新的uImage烧到开发板上了 但是安装的时候还是提示insmod: can't insert 'btn_dar.ko': Resource temporarily unavailable 请教各位大神 还有什么原因会导致这个错误出现!

insmod: error inserting 'Relay.ko': -1 Device or resource busy

// Linux Device Driver program // Relay.c #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/gpio.h> #include <linux/irq.h> #include <linux/interrupt.h> #include <linux/cdev.h> #define IMX_GPIO_NR(bank, nr) (((bank) - 1) * 32 + (nr)) #define RELAY_INPUT IMX_GPIO_NR(4, 7) // GPIO4_IO07/KEY_ROW0 pin(out1). #define RELAY_OUTPUT IMX_GPIO_NR(4, 15) // GPIO4_IO15/KEY_ROW4 pin(out2). #define COL_INTERRUPT_1 IMX_GPIO_NR(5, 1) // 地感线圈1 #define COL_INTERRUPT_2 IMX_GPIO_NR(5, 2) // 地感线圈2 #define COL_INTERRUPT_3 IMX_GPIO_NR(5, 3) // 地感线圈3 #define COL_INTERRUPT_4 IMX_GPIO_NR(5, 4) // 地感线圈4 #define SKELETON_MAJOR 231 #define SKELETON_NAME "Relay" #define MYCNT 1 struct cdev Relay_cdev; dev_t mydev; DECLARE_WAIT_QUEUE_HEAD(skeleton_wait); static irqreturn_t xyz_interrupt(int irq, void *dev) { printk("Interrupt "); return IRQ_HANDLED; } // close function - called when the "file" /dev/skeleton is closed in userspace static int Relay_release (struct inode *inode, struct file *file) { printk("Relay_releasen"); return 0; } // open function - called when the "file" /dev/skeleton is opened in userspace static int Relay_open (struct inode *inode, struct file *file) { printk("Relay_open"); // we could do some checking on the flags supplied by "open" // i.e. O_NONBLOCK // -> set some flag to disable interruptible_sleep_on in skeleton_read return 0; } // write function called when to /dev/skeleton is written static ssize_t Relay_write (struct file *file, const char *buf, size_t count, loff_t *ppos) { int i; if ( strcmp(buf, "0xff,0x01,0x01,0x01,0x03,0xee") == 0 ) { gpio_set_value(RELAY_INPUT, 1); // 进停车场继电器拉高. for ( i = 0; i < 1000; i ++ ); // 延时40ms. gpio_set_value(RELAY_INPUT, 0); // 进停车场继电器拉低. } else if ( strcmp(buf, "0xff,0x02,0x01,0x01,0x04,0xee") == 0 ) { gpio_set_value(RELAY_OUTPUT, 1); // 出停车场继电器拉高. for ( i = 0; i < 1000; i ++ ); // 延时40ms. gpio_set_value(RELAY_OUTPUT, 0); // 出停车场继电器拉低. } return 0; } // define which file operations are supported struct file_operations Relay_fops = { .owner = THIS_MODULE, .llseek = NULL, .read = NULL, .write = Relay_write, // .readdir = NULL, .poll = NULL, // .ioctl = NULL, .mmap = NULL, .open = Relay_open, .flush = NULL, .release = Relay_release, .fsync = NULL, .fasync = NULL, .lock = NULL, //.readv = NULL, //.writev = NULL, }; static int __init Relay_init_module (void) { // int i; int irq_no; int iRet; int retval; printk("initializing modulen\n"); gpio_direction_output(RELAY_INPUT, 1); // 初始化进-输出状态. gpio_direction_output(RELAY_OUTPUT, 1); // 出书画出-输出状态. gpio_set_value(RELAY_INPUT, 0); // 初始化进-继电器. gpio_set_value(RELAY_OUTPUT,0); // 初始化出-继电器. irq_no = gpio_to_irq(COL_INTERRUPT_1); //set_irq_type(irq_no, IRQF_TRIGGER_FALLING); iRet = request_irq(irq_no, xyz_interrupt, IRQF_SHARED, "interrupt", NULL); if (iRet != 0) { printk("request gpio failed \n"); return -EBUSY; } // i = register_chrdev (SKELETON_MAJOR, SKELETON_NAME, &Relay_fops); // if (i != 0) return - EIO; // 第1步:注册/分配主次设备号 mydev = MKDEV(SKELETON_MAJOR, 0); retval = register_chrdev_region(mydev, MYCNT, SKELETON_NAME);// // retval = alloc_chrdev_region(&mydev, 0, MYCNT, SKELETON_NAME); if (retval) { printk(KERN_ERR "Unable to register minors for %s\n", SKELETON_NAME); return -EINVAL; } printk(KERN_INFO "register_chrdev_region success\n"); // 第2步:注册字符设备驱动 cdev_init(&Relay_cdev, &Relay_fops); Relay_cdev.owner = THIS_MODULE; Relay_cdev.ops = &Relay_fops; kobject_set_name(&Relay_cdev.kobj, "%s", SKELETON_NAME); retval = cdev_add(&Relay_cdev, mydev, MYCNT); if (retval) { printk(KERN_ERR "Unable to cdev_add\n"); return -EINVAL; } printk(KERN_INFO "cdev_add success\n"); return 0; } static void __exit Relay_exit_module (void) { printk("cleaning up modulen"); // unregister_chrdev (SKELETON_MAJOR, SKELETON_NAME); // 第一步真正注销字符设备驱动用cdev_del cdev_del(&Relay_cdev); // 第二步去注销申请的主次设备号 unregister_chrdev_region(mydev, MYCNT); } module_init(Relay_init_module); module_exit(Relay_exit_module); MODULE_AUTHOR("Shenzhen Bobuma Tetchology co.,Ltd"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Relay drive program"); #Makefile file CROSS_COMPILE=arm-linux- ARCH:=arm CC:=arm-poky-linux-gnueabi-gcc LD:=arm-poky-linux-gnueabi-ld obj-m = Relay.o module-objs = Relay.o KDIR = /usr/local/linux-4.1.15 PWD = $(shell pwd) default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules clean: rm -rf *.o *.ko *~ *.symvers *.order

Linux 修改文件系统并编译

本学期刚学的操作系统,现在课程设计要求修改Linux内核,并对其中的ext4做修改 要求如下: 1.openSUSE desktop系统 2.ext4拿出来编译 3.read,write函数找到,在进行相关操作时在控制台输出信息,打印printk 4.用dmese方式(老师讲得太快,应该是这个意思) 之前一直没有接触过Linux,所以各种碰壁。 下载,编译内核相关知识已经自学完毕,但是在修改文件系统的时候出现了问题 1.老师对系统的选择我没有太多异议,而且适应了suse里的相关操作 2.已经在内核源代码(Linux-3.11-6-4)的/fs/ext4文件夹下找到了ext4系统的源代码,但是不知该如何下手 3.dmese方式并不是很理解,是不是记录类型的文件? 我自己设想的解决方案是这样 找到ext4中的相关函数,添加 SEQ_printf(····); 编译,加载内核 测试添加的语句是否能运行 希望前辈们指点一二,只要在老师要求的修改源码(read。write)关键的几步上点播一下就好了,剩下的我自己来,目前卡在找到相关的函数这里,源文件#include了好多,还有Linux的API,看不懂TAT

linux驱动模块加载不成功调试过程

版本:linux2.6.30 问题出现的过程: 1,我在Ubuntu环境下编译驱动模块 2,编译成功后,在板子上insmod出现了 embest_led: version magic '2.6.30 mod_unload modversions ARMv5 ' should be '2.6.30 preempt mod_unload ARMv5 ' insmod: error inserting 'embest_led.ko': -1 Invalid module format 3,我就更改了/usr/src/linux-2.6.30/include/vermagic.h文件,最终结果是用modinfo查看embest_led.ko信息是‘2.6.30 preempt mod_unload ARMv’同时在板子上insmod后没出现上述错误,而且用lsmod可以查看到embest信息,改动如下: 1 #include <linux/utsrelease.h> 2 #include <linux/module.h> 3 4 #define DEBUG 5 6 #ifdef DEBUG 7 #define CONFIG_PREEMPT 8 #define CONFIG_MODULE_UNLOAD 9 #endif 10 /* Simply sanity version stamp for modules. */ 11 #ifdef CONFIG_SMP 12 #define MODULE_VERMAGIC_SMP "SMP " 13 #else 14 #define MODULE_VERMAGIC_SMP "" 15 #endif 16 #ifdef CONFIG_PREEMPT 17 #define MODULE_VERMAGIC_PREEMPT "preempt " 18 #else 19 #define MODULE_VERMAGIC_PREEMPT "" 20 #endif 21 #ifdef CONFIG_MODULE_UNLOAD 22 #define MODULE_VERMAGIC_MODULE_UNLOAD "mod_unload " 23 #else 24 #define MODULE_VERMAGIC_MODULE_UNLOAD "" 25 #endif 26 27 #ifdef DEBUG 28 29 #ifdef CONFIG_MODVERSIONS 30 #define MODULE_VERMAGIC_MODVERSIONS "" 31 #else 32 #define MODULE_VERMAGIC_MODVERSIONS "modversions " 33 #endif 34 35 #else 36 37 #ifdef CONFIG_MODVERSIONS 38 #define MODULE_VERMAGIC_MODVERSIONS "modversions " 39 #else 40 #define MODULE_VERMAGIC_MODVERSIONS "" 41 #endif 42 43 #endif 44 45 #ifndef MODULE_ARCH_VERMAGIC 46 #define MODULE_ARCH_VERMAGIC "" 47 #endif 4,但是cat /proc/devices 时没有看到相关信息(主次设备号),在/dev/中也没有相应的节点。 5,最高不清楚的是在中断没有打印(我把中断级别调到8了),在/var/volatile/log/messages中也没有相关打印信息。 6,我怀疑是不是没有调用到源文件中module_init中的函数,就写了一个hello_world模块程序。问题是同样的。

Linux中内核版本为5.6.2 ,在开发板上插入有关中断的驱动时,插入OK,测试也OK,然后卸载驱动后重新插入就报错

我用的是linux 5.6.2版本,我写了一个开发板(exynos4412-fs4412)的按键驱动,用 insmod xxxx.ko 插入成功,测试也成功,然后用 rmmod xxxxx.ko 卸载掉,当我再次 insmod xxxx.ko 时,出现如下图片中错误 相关的函数为: static int __init key_drv_init(void){ int ret; printk("----------------%s---------------\n",__FUNCTION__); // 1 give space key_dev = kzalloc(sizeof(struct dev_desc),GFP_KERNEL); // 2 apply equip number key_dev->dev_major = register_chrdev(0,"key_dev",&key_fops); // 3 create equip node key_dev->cls = class_create(THIS_MODULE,"key_cls"); key_dev->dev = device_create(key_dev->cls,NULL,MKDEV(key_dev->dev_major,0),NULL,"key0"); // 1 get interrupt number key_dev->irqno = get_irqno_from_node(); // 2 apply interrupt // include handle function in it ret = request_irq(key_dev->irqno,key_irq_handler,IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING, "key_dev_eint_one",NULL); // IRQF_TRIGGER_FALLING if(ret!=0){ printk("request_irq error\n"); return ret; } // 4 address io key_dev->reg_virt_base = ioremap(GPX1_1DATE,8); // A: initial queue head init_waitqueue_head(&key_dev->wq_head); // one:initial tasklet or work //tasklet_init(&key_dev->mytasklet,tasklet_half_irq_func,88); //tasklet_init(&key_dev->mytasklet,tasklet_half_irq_func,88); INIT_WORK(&key_dev->mywork, work_half_irq_func); return 0; } static void __exit key_drv_exit(void){ //tasklet_kill(&key_dev->mytasklet); iounmap(key_dev->reg_virt_base); free_irq(key_dev->irqno,NULL); device_destroy(key_dev->cls,MKDEV(key_dev->dev_major,0)); //destory device class_destroy(key_dev->cls); unregister_chrdev(key_dev->dev_major,"key_dev"); //release equipment number kfree(key_dev); printk("----------------%s---------------\n",__FUNCTION__); }

请问centos6系统内安装网卡但insmod 等命令都没有怎么办

insmod lsmod 等众多命令都没有,该怎么安装这些命令在没有网络情况下。

linux 用户态调用驱动中的函数返回-1

/*****************驱动代码***************/ #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/interrupt.h> #include <linux/irqreturn.h> #include <mach/hardware.h> #include <mach/sysheap.h> #include <asm/io.h> #include <linux/spinlock.h> #include <linux/cdev.h> #include <linux/device.h> #include <linux/fs.h> #include <linux/kernel.h> #include <linux/sched.h> #include <linux/interrupt.h> #include <linux/irqreturn.h> #include <linux/slab.h> #include <asm/delay.h> #include <asm/io.h> #include <asm/uaccess.h> #include <asm/irq.h> #include <mach/irqs.h> #include <mach/sysheap.h> #include <asm/timex.h> #include "pciedrv.h" #define GLOBAL_MAJOR 133 PCIE_DRV_CONTEXT pcieContext; S32 x4orx1; #define WRITE_DMA_AND_SEND 0x100 #define READ_FROM_BUFFER 0x200 #define BUSY 0x10 #define IDLE 0x11 #define EXIT 0x12 #define GLOBALMEM_MAJOR 133 #define TRANSMIT _IOC (_IOC_READ,IOCTL_MAGIC, 3, 4 ) #define RECEIVE _IOC (_IOC_WRITE,IOCTL_MAGIC,4, 4 ) ssize_t DriverRead (struct file* stFileName, const char __user* input, size_t size, loff_t* offset); ssize_t DriverWrite (struct file* stFileName, const char __user* input, size_t size, loff_t* offset); struct file_operations globalmem_fops = { .owner = THIS_MODULE, .read = DriverRead, .write = DriverWrite, }; static globalmem_major = GLOBALMEM_MAJOR; struct globalmem_dev { struct cdev cdev; unsigned char mem[0x10000]; }; struct globalmem_dev dev; ssize_t DriverRead (struct file* stFileName, const char __user* input, size_t size, loff_t* offset) { printk("%s\n",__FUNCTION__); return 0; } ssize_t DriverWrite(struct file* stFileName, const char __user* input, size_t size, loff_t* offset) { printk("%s\n",__FUNCTION__); return 0; } static int __init_func(void) { int retValue = 0; dev_t devno = MKDEV(globalmem_major, 0); if(globalmem_major) { retValue = register_chrdev_region(devno, 1, "pciedrv"); printk(KERN_ALERT "register charactor device region\n"); } else { retValue = alloc_chrdev_region(devno, 0, 1, "pciedrv"); globalmem_major = MAJOR(devno); printk(KERN_ALERT "alloc charactor device region\n"); } if(retValue <0) { printk("Failed to register or alloc major\n"); } devno = MKDEV(globalmem_major, 0); cdev_init(&dev.cdev, &globalmem_fops); dev.cdev.owner = THIS_MODULE; dev.cdev.ops = &globalmem_fops; retValue = cdev_add(&dev.cdev,devno,1); if(retValue) printk("cdev_add return %d\n",retValue); retValue = PCIeDrvInit(PCIE0_BASEADDR, x4orx1); if(retValue == 0) printk(KERN_ALERT "PCIeDrvInit Success!\n "); else printk(KERN_ALERT "PCIeDrvInit Failed!\n"); control_buffer.status = 0; control_buffer.command = 0; printk(":D\n"); return retValue; } static void __exit_func(void) { printk(KERN_ALERT "Here is entering the exit-point of the PCIE driver!!! \n"); cdev_del(&dev.cdev); unregister_chrdev_region(MKDEV(globalmem_major, 0), 1); PCIeDrvDeinit(); } module_init(__init_func); module_exit(__exit_func); MODULE_AUTHOR("ZCTT"); MODULE_DESCRIPTION("Driver of PCIEx4"); MODULE_ALIAS("ICC Driver"); MODULE_LICENSE("GPL"); EXPORT_SYMBOL(__init_func); EXPORT_SYMBOL(__exit_func); /**************************调用函数代码***********************************/ #include <stdio.h> #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/ioctl.h> #include <string.h> #include <unistd.h> #define DEVICE_FILENAME "/bin/pciedrv.ko" #define DEVICE_TYPE (0xA4<<24) #define DEVICE_SERIAL (0x33<<16) #define DEVICE_DERICTION IOC_NON #define READ_PHY_ADDRESS 0x100 #define WRITE_PHY_ADDRESS 0x101 #define GLOBAL_MAJOR 133 #define IOCTL_MAGIC 't' typedef struct { unsigned long size; unsigned int offset; unsigned char buff [128]; }__attribute__((packed)) ioctl_read_info_t; typedef struct { unsigned long size; unsigned int offset; unsigned char buff [128]; }__attribute__((packed)) ioctl_write_info_t; ioctl_read_info_t ioctl_read_info ; ioctl_write_info_t ioctl_write_info ; int main() { char* str = "Hello Guys This is the Message!\n"; int retValue ; int dev = 0; memset (ioctl_write_info.buff, 0, 128); ioctl_write_info.size = strlen(str)+1; ioctl_write_info.offset = 0; memcpy (ioctl_write_info.buff, str, ioctl_write_info.size); /**********************************************************/ dev = open(DEVICE_FILENAME, O_RDWR); printf("dev = %d\n",dev); printf(":--\n"); while(1) { int retValue = read(dev, str, strlen(str)); printf ("retValue = %d\n",retValue); sleep(2); write(dev, str, strlen(str)); printf ("retValue = %d\n",retValue); } printf("Finished system calling! \n"); /运行结果/ 驱动部分的dmesg,事实上只打印出了init部分的内容 register charactor device region :D root@OpenWrt:~# a.out dev = 3 :-- retValue = -1 retValue = -1 retValue = -1 retValue = -1 retValue = -1 retValue = -1 retValue = -1 ^C 运行完a.out之后 demesg发现没有任何新增内容。

linux驱动加载后能找到设备,但是/dev下不能找到设备文件

linux驱动加载后能找到设备,但是/dev下不能找到设备文件,我用的是动态分配设备号,insmod也能通过,但是/dev下就是找不到设备文件,加载后也不能通过测试程序我基本上直接用的板子例程,静态动态我都试了,就是不行,日志文件里面也什么都没有,板子是2410的,主机是红帽的,希望大神能够指点迷津 /* ****************************************Copyright (c)************************************************** ** Guangzhou Zhiyuan Electronic Co.,LTD. ** graduate school ** http://www.zyinside.com ** **------------------------------------- File Info ------------------------------------------------------ ** File name: magic-leds.c ** Last modified Date: 2005-12-28 ** Last Version: 1.0 ** Descriptions: Driver for LEDs and BEEP on MagicARM2410. ** Based on Linux 2.4.18. **------------------------------------------------------------------------------------------------------ ** Created by: Chenxibing ** Created date: 2005-12-27 ** Version: 1.0 ** Descriptions: Preliminary version. ** **------------------------------------------------------------------------------------------------------ ** Modified by: ** Modified date: ** Version: ** Descriptions: ** ******************************************************************************************************** */ #ifndef __KERNEL__ #define __KERNEL__ #endif #ifndef MODULE #define MODULE #endif #include <linux/config.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/sched.h> #include <linux/devfs_fs_kernel.h> //#include <linux/poll.h> //#include <linux/spinlock.h> //#include <linux/irq.h> //#include <linux/miscdevice.h> //#include <linux/delay.h> #include<asm/arch-s3c2410/S3C2410.h> #define DEVICE_NAME "magic-leds" #define LED_MAJOR 231 //can be 231~239 or 240~254 MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Guangzhou Zhiyuan Electronic Co.,LTD.\ngraduate school\nhttp://www.zyinside.com"); MODULE_SUPPORTED_DEVICE("Linux 2.4.18 & MagicARM2410"); MODULE_AUTHOR("Chenxibing"); /* ******************************************************************************************************* ** LEDs' informations. ******************************************************************************************************* */ static unsigned long leds_table[] = { GPIO_E11, GPIO_E12, GPIO_H4, GPIO_H6, GPIO_H10, }; /* ******************************************************************************************************* ** Function name: magic_leds_ioctl() ** Descriptions : IO control function ** Input: ** inode : information of device ** filp : pointer of file ** cmd : command ** arg : additive parameter ** Output: ** 0 : OK ** other : not OK ** Created by : Chenxibing ** Created Date : 2005-12-27 **----------------------------------------------------------------------------------------------------- ** Modified by : ** Modified Date: **----------------------------------------------------------------------------------------------------- ******************************************************************************************************* */ static int magic_leds_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) { if (arg > 4) return -EINVAL; switch(cmd) { case 0: case 1: write_gpio_bit(leds_table[arg], cmd); default: return -EINVAL; } } /* ******************************************************************************************************* ** Function name: magic_leds_open() ** Descriptions : open leds ** Input: ** inode : information of device ** filp : pointer of file ** Output: ** 0 : OK ** other : not OK ** Created by : Chenxibing ** Created Date : 2005-12-27 **----------------------------------------------------------------------------------------------------- ** Modified by : ** Modified Date: **----------------------------------------------------------------------------------------------------- ******************************************************************************************************* */ static int magic_leds_open(struct inode *inode, struct file *filp) { int i; for (i = 0; i < 5; i++) { set_gpio_ctrl(leds_table[i] | GPIO_PULLUP_EN | GPIO_MODE_OUT); write_gpio_bit(leds_table[i], 1); } MOD_INC_USE_COUNT; printk(KERN_INFO DEVICE_NAME ": opened.\n"); return 0; } /* ******************************************************************************************************* ** Function name: magic_leds_release() ** Descriptions : release leds ** Input: ** inode : information of device ** filp : pointer of file ** Output: ** 0 : OK ** other : not OK ** Created by : Chenxibing ** Created Date : 2005-12-27 **----------------------------------------------------------------------------------------------------- ** Modified by : ** Modified Date: **----------------------------------------------------------------------------------------------------- ******************************************************************************************************* */ static int magic_leds_release(struct inode *inode, struct file *filp) { MOD_DEC_USE_COUNT; printk(KERN_INFO DEVICE_NAME ": released.\n"); return 0; } /* ******************************************************************************************************* ** operations of the driver ******************************************************************************************************* */ static struct file_operations magic_leds_fops = { owner: THIS_MODULE, ioctl: magic_leds_ioctl, open: magic_leds_open, release: magic_leds_release, }; /* ******************************************************************************************************* ** Function name: magic_leds_init() ** Descriptions : register driver ** Input: ** : NONE ** Output: ** 0 : OK ** other : not OK ** Created by : Chenxibing ** Created Date : 2005-12-27 **----------------------------------------------------------------------------------------------------- ** Modified by : ** Modified Date: **----------------------------------------------------------------------------------------------------- ******************************************************************************************************* */ static devfs_handle_t devfs_handle; static int __init magic_leds_init(void) { int result; printk("<0>""leds dev\n"); result = register_chrdev(LED_MAJOR, DEVICE_NAME, &magic_leds_fops); if (result < 0) { printk(KERN_ERR DEVICE_NAME ": Failed to register major.\n"); return result; } // devfs_handle = devfs_register(NULL, DEVICE_NAME, DEVFS_FL_AUTO_DEVNUM, // 0, 0, S_IFCHR | S_IRUSR | S_IWUSR, &magic_leds_fops, NULL); // printk(KERN_INFO DEVICE_NAME ": Initialize OK.\n"); // return 0; } /* ******************************************************************************************************* ** Function name: magic_leds_exit() ** Descriptions : unregister driver ** Input: ** : NONE ** Output: ** 0 : OK ** other : not OK ** Created by : Chenxibing ** Created Date : 2005-12-27 **----------------------------------------------------------------------------------------------------- ** Modified by : ** Modified Date: **----------------------------------------------------------------------------------------------------- ******************************************************************************************************* */ static void __exit magic_leds_exit(void) { // devfs_unregister(devfs_handle); unregister_chrdev(LED_MAJOR, DEVICE_NAME); } module_init(magic_leds_init); module_exit(magic_leds_exit); /* ******************************************************************************************************** ** End of File ******************************************************************************************************** */

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

String s = new String(" a ") 到底产生几个对象?

老生常谈的一个梗,到2020了还在争论,你们一天天的,哎哎哎,我不是针对你一个,我是说在座的各位都是人才! 上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。 也就是说准确答案是产生了一个或两个对象,如果常量池中原来没有 ”宜春” ,就是两个。...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

Linux面试题(2020最新版)

文章目录Linux 概述什么是LinuxUnix和Linux有什么区别?什么是 Linux 内核?Linux的基本组件是什么?Linux 的体系结构BASH和DOS之间的基本区别是什么?Linux 开机启动过程?Linux系统缺省的运行级别?Linux 使用的进程间通信方式?Linux 有哪些系统日志文件?Linux系统安装多个桌面环境有帮助吗?什么是交换空间?什么是root帐户什么是LILO?什...

Linux命令学习神器!命令看不懂直接给你解释!

大家都知道,Linux 系统有非常多的命令,而且每个命令又有非常多的用法,想要全部记住所有命令的所有用法,恐怕是一件不可能完成的任务。 一般情况下,我们学习一个命令时,要么直接百度去搜索它的用法,要么就直接用 man 命令去查看守冗长的帮助手册。这两个都可以实现我们的目标,但有没有更简便的方式呢? 答案是必须有的!今天给大家推荐一款有趣而实用学习神器 — kmdr,让你解锁 Linux 学习新姿势...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

史上最全的 python 基础知识汇总篇,没有比这再全面的了,建议收藏

网友们有福了,小编终于把基础篇的内容全部涉略了一遍,这是一篇关于基础知识的汇总的文章,请朋友们收下,不用客气,不过文章篇幅肯能会有点长,耐心阅读吧爬虫(七十)多进程multiproces...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

85后蒋凡:28岁实现财务自由、34岁成为阿里万亿电商帝国双掌门,他的人生底层逻辑是什么?...

蒋凡是何许人也? 2017年12月27日,在入职4年时间里,蒋凡开挂般坐上了淘宝总裁位置。 为此,时任阿里CEO张勇在任命书中力赞: 蒋凡加入阿里,始终保持创业者的冲劲,有敏锐的...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

新一代神器STM32CubeMonitor介绍、下载、安装和使用教程

关注、星标公众号,不错过精彩内容作者:黄工公众号:strongerHuang最近ST官网悄悄新上线了一款比较强大的工具:STM32CubeMonitor V1.0.0。经过我研究和使用之...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

大学一路走来,学习互联网全靠这几个网站,最终拿下了一把offer

大佬原来都是这样炼成的

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

什么时候跳槽,为什么离职,你想好了么?

都是出来打工的,多为自己着想

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

你期望月薪4万,出门右拐,不送,这几个点,你也就是个初级的水平

先来看几个问题通过注解的方式注入依赖对象,介绍一下你知道的几种方式@Autowired和@Resource有何区别说一下@Autowired查找候选者的...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

立即提问
相关内容推荐