我正在编写我的第一个Linux内核模块,它实际上是一个RAM磁盘驱动程序以及一些附加功能.当我尝试insmod模块时,发生了"分段错误".
这里是相应的内核日志,实际上是两条内核oops消息.在阅读了很多相关的教程后,我仍然对这个日志有一些疑问:
1)在通话跟踪列表中,有一些带有问号和没有问号的功能,问号"?"的特殊含义是什么?那个功能?
2)我对调用跟踪的理解是:除了底部函数之外的每个函数都应该由它下面的函数调用.但为此:
[ 397.855035] [<c05a603b>] ? exact_lock+0x0/0x16
[ 397.855035] [<f787c252>] ? diag_init+0x252/0x4bd [b2bntb_diag]
[ 397.855035] [<c0451e35>] ? __blocking_notifier_call_chain+0x42/0x4d
[ 397.855035] [<f787c000>] ? diag_init+0x0/0x4bd [b2bntb_diag]
Run Code Online (Sandbox Code Playgroud)
diag_init我编写的模块init函数.它不会调用任何命名的函数,exact_lock或者__blocking_notifier_call_chain这两个函数如何在调用跟踪中出现?
3)错误是什么以及如何解决?
顺便说一下,我正在运行的Linux内核有2.6.35.6版本.
[ 397.850955] ------------[ cut here ]------------
[ 397.851544] WARNING: at lib/kobject.c:168 kobject_add_internal+0x3a/0x1e2()
[ 397.851601] Hardware name: VirtualBox
[ 397.851639] kobject: (f4580258): attempted to be registered with empty name!
[ 397.851678] Modules linked in: b2bntb_diag(+) fuse vboxvideo drm sunrpc ip6t_REJECT nf_conntrack_ipv6 …Run Code Online (Sandbox Code Playgroud) strerror内核中是否存在类似的功能?我找不到一个,所以我的想法是否定的,但更重要的是,他们有没有讨论过这个问题?我认为它可以减少故障排除时间,因为您不必查找错误代码(并非每个人都记住了),并且可能使系统管理员和普通的日常用户(通过dmesg)更容易.
我想在邮寄LKML之前问这里.我的想法是一个双重机制,一个用于错误名称(例如,EINVAL),另一个用于描述.此外,%mglibc扩展可以添加到printk,除了它必须读取错误代码,因为glibc扩展读取errno.也许%m可以打印错误名称,同时%M可以打印错误描述?
无论如何,如果它被添加,它应该是.config选项,因为它会膨胀文本大小.只需将错误名称(当前为1到133)存储在单个字符串中,并且每个字符串之间只有一个空终止符并且只是一个慢速strerror(强制遍历字符串并计算空终止符),因为速度可以缩小.这应该不重要.内部错误512-529必须在单独的字符串中.然后,可以返回指向以null结尾的字符串的直接指针,而无需复制任何内容.根据我的计算,错误名称大约需要1322个字节,描述需要3540个字节(根据每个错误的#define之后的注释中的内容以及当前缺少的那些添加"no description").
然后,当配置禁用时,printk %m可以被解释为%d并且%M可以只打印(或者一些这样的).
总结(我们做了什么,我们尝试了什么):
基本上,目的是通过使用adb源代码在两台Linux计算机之间通过usb建立adb协议.
Envinronment是Ubuntu 16.0.4.有一个android-tools-adbd(adb守护程序)包准备在池中使用,其源可用.
此链接上的源(adbd)可与gcc选项-stc = c ++ 14兼容,默认情况下(或gcc 5.2)在16.0.4中受支持.
我们可以使用adb connect(依赖于TCP/IP)从源代码构建软件包或使用已构建的软件包成功构建软件包.如果两台计算机连接到同一网络,则通过TCP/IP进行adb连接没有问题.
不幸的是,我们无法使用A到A(两个都是)电缆在两台计算机之间设置USB连接.ADB小工具无法正常工作,并且所有设备都无法识别其他设备.除了ADB小工具之外,我们无法确定是否需要显式驱动程序.
问题是(真正的问题需要回答):
如何在两台Linux计算机之间设置USB协议,以便通过USB完成adb通信?
它有什么解决方案吗?
[ - -编辑 - -]
笔记:
日复一日,小问题离开了.对于那些想要参与的人; 我们正在遵循本指南.
(内核版本4.4.0-38-通用)
运行正确的udc(USB设备控制器)驱动程序时遇到问题.激活ConfigFS后modprobe usb_f_fs,xdg-adbd (可从源链接执行,adbd)正常工作,直到if(...)检测到udc驱动程序.我们尝试了运行,modprobe musb_hdrc但没有看到明确的驱动程序名称/sys/class/udc.
(2016年9月27日)
我正在寻找一个内核模式调用,我可以从驱动程序,用户空间实用程序,或系统调用,要求内核查看PCI总线,并完全重新运行其初始化,或初始化特定设备.具体来说,我需要内核来识别启动后添加到总线的设备,然后配置其地址空间,中断和其他配置参数,最后启用设备以便我可以为其加载驱动程序(除非全部作为驱动程序负载的一部分发生).
我为此坚持2.4.x系列内核,目前正在使用2.4.20,但如果重要的话将会转向2.4.37.发行版是一个在ram磁盘上运行的Red Hat 7.3,但我可以添加任何工具来实现这个功能(只要它们与2.4系列配合使用).
如果某些背景有助于澄清我正在尝试做什么:从冷启动,一旦在Linux中我使用GPIO编程FPGA.FPGA的一部分,一旦编程,就实现了一个简单的PCI设备.目前,在对FPGA进行编程之后,我重新启动系统并且Linux在启动后识别设备并为其加载驱动程序.
而不是需要重新启动,我想简单地要求内核在启动期间做任何事情以找到PCI设备(我已经配置了内核来自己找到PCI设备,而不是向BIOS询问该信息,所以BIOS不需要知道这个设备(我希望)).
我相信Linux能够在设备编程后但在重启之前看到设备,因为它scanpci会在我编程后显示设备,因为它会lspci -H 1.我只需要一种方法来进入/proc/pci,配置和启用.
我试图抓住键盘事件.例如,我想从头开始钻取键盘记录器.经过2个小时的战斗,我发现了以下情况
neel@pc1$ ls -l /dev/input/by-id
lrwxrwxrwx 1 root root 9 2010-05-05 21:33 usb-Plus_More_Enterprise_LTD._USB-compliant_keyboard-event-kbd -> ../event1
lrwxrwxrwx 1 root root 9 2010-05-05 21:33 usb-Plus_More_Enterprise_LTD._USB-compliant_keyboard-event-mouse -> ../event2
lrwxrwxrwx 1 root root 9 2010-05-05 21:33 usb-Plus_More_Enterprise_LTD._USB-compliant_keyboard-mouse -> ../mouse1
Run Code Online (Sandbox Code Playgroud)
但是当我努力的时候
neel@pc1$ sudo cat /dev/input/usb-Plus_More_Enterprise_LTD._USB-compliant_keyboard-event-kbd
Run Code Online (Sandbox Code Playgroud)
它没有产生任何东西,没有输出
经过多一点搜索之后我现在正在思考Xorg阻塞它的可能性.
所以更多信息?? 并且说到底如何从该文件中读取输入?或者有没有其他方法来捕捉键盘事件?
来自[linux\fs.h]的unregister_chrdev()调用如果成功则返回0,其他方面<0.但现在,在较新的内核版本中,函数的返回值已更改为void,因此它不再返回任何内容.
问题:有没有办法找出unregister_chrdev()调用是否成功?
我是否需要保护我的中断处理程序被多次调用同一个中断?
鉴于以下代码,我不确定我应该进行的系统调用.我正在使用当前的实现获得罕见的随机死锁: -
void interrupt_handler(void)
{
down_interruptible(&sem); // or use a lock here ?
clear_intr(); // clear interrupt source on H/W
wake_up_interruptible(...);
up(&sem); // unlock?
return IRQ_HANDLED;
}
void set/clear_intr()
{
spin_lock_irq(&lock);
RMW(x); // set/clear a bit by read/modify/write the H/W interrupt routing register
spin_unlock_irq(&lock);
}
void read()
{
set_intr(); // same as clear_intr, but sets a bit
wait_event_interruptible(...);
}
Run Code Online (Sandbox Code Playgroud)
interrupt_handler:down_interruptible是spin_lock_irq/ spin_lock_irqsave/ local_irq_disable?set/clear_intr:spin_lock_irq是spin_lock_irqsave/ local_irq_disable? …我知道I2C在一个非常基本的层面,它依赖于Linux内核,但没有线索来实现一个基本的I2C驱动程序.
尝试在I2C 设备驱动程序中启动.你有没有可以建议任何有源代码映射的初学者教程!
我最近在linux源代码树中运行了scripts/checkpatch.pl脚本并得到了这个警告:
WARNING: Prefer netdev_dbg(netdev, ... then dev_dbg(dev, ... then pr_debug(... to printk(KERN_DEBUG ...
printk(KERN_DEBUG "Hello World! \n");
Run Code Online (Sandbox Code Playgroud)
据我所知,pr_debug和dev_dbg提供的动态调试界面对printk有明显的优势,因此它们比printk更受欢迎.
即使在dev_dbg和pr_debug中,如果我们有一个结构设备来标准化设备信息输出以及我们的调试消息,我们更喜欢dev_dbg.它提供了从"编辑/重建/重启循环"中逃脱的功能,还允许通过dynamic_debug/control接口维护整洁的日志.
我的问题是: 为什么netdev_dbg更喜欢dev_dbg?
我正在编写一个驱动程序来控制一些自定义硬件.
在过去(即15年前),我正在这样做ioctls,但现在正在挖掘sysfs作为一种可能的选择.
mutex驱动程序进行" 保护",以便一次只能有一个应用程序写入.(我确实有一些只读'信息'条目,我希望所有人都可以随时访问这些条目).鉴于上述情况,最好的方法是什么 - ioctl或sysfs?
如果是sysfs,那我该如何实现独占访问?
如果sysfs,那么如果驱动程序没有读/写/ ioctl fops,它是否需要打开/释放?!
(这是一个'私人'司机,所以我不在乎大规模;)但是如果新的方式更适用,那么我可能会抓住它们!)
谢谢.