给定 udev 传递给我的内核模块(可能是块设备路径)的信息,我如何将 SCSI 命令发送到块设备?(但让它正常运行,否则意味着分区已安装,没有数据丢失等)
我有一个 USB 大容量存储设备,它带有通过 SCSI 命令控制的 LED。我想编写一个 LED 驱动程序来为其提供 /sys/class/leds/* 条目。
这里的目标是让设备正常运行(安装和运行分区等),但也允许 /sys/class/leds/* 交互,发送 SCSI 命令来控制 LED。
使用 sg_raw 在用户空间发送我需要的 SCSI 命令很容易。但是我需要一个 kmod 来提供 /sys/class/leds/...
基本上我需要的是ioctl()。但是,我知道从 kmod 中调用 open()、ioct() 等通常是一个坏主意。
linux scsi kernel-module linux-device-driver usb-mass-storage
我正在尝试设置 linux 内核模块调试,使用两台机器 - 目标和主机。在目标机器上,我已经编译并安装了一个带有CONFIG_MAGIC_SYSRQ=y标志和其他标志的 3.5.0 内核,用于串行控制台调试。
当我想破坏内核以附加远程 gdb 时,我使用
$ echo g > /proc/sysrq-trigger
Run Code Online (Sandbox Code Playgroud)
但是上面的命令并没有破坏内核。
$ cat /proc/sys/kernel/sysrq"
Run Code Online (Sandbox Code Playgroud)
上面的命令返回 1,因此启用了魔法 sysrq 键。甚至“echo b > /proc/sysrq-trigger”也在工作并重新启动机器。有人可以指出我可能遗漏了什么吗?
谢谢
在 linux 内核模块中,有没有办法从unsigned int fd?
我知道这个答案:如何从内核模块内的文件描述符获取文件名?但如果我理解正确的代码,我也需要一个struct files_struct。
编辑:
请停止投票,因为它不是重复的。我正在寻求一种从内核模块以纯 C 格式获取文件名/路径的方法,而不是使用系统工具。换句话说:在 /procself/fd/ 上运行 readlink不是一个好的答案。
编辑2:
内核的系统调用读取ssize_t read(int fd, void *buf, size_t count);需要 3 个参数,其中一个是 fd。很明显,以某种方式read能够读取单个文件(而不是 inode 中的所有文件)。问题是如何。
我正在尝试从可加载的内核模块读取和写入 PCI 设备。
因此我关注了这篇文章:
pci_enable_device(dev);
pci_request_regions(dev, "expdev");
bar1 = pci_iomap(dev, 1, 0);
// void iowrite32(u32 val, void __iomem *addr)
iowrite32( 0xaaaaaaaa, bar1 + 0x060000); /* offset from device spec */
Run Code Online (Sandbox Code Playgroud)
但最终设备并没有按预期完成他的工作。然后我查看了后面的地址bar1,发现了一个非常大的值ffffbaaaaa004500。
在这一点上,我真的不明白那里发生了什么,什么是对的。我可以解释bar1为内核地址空间内的地址,该地址直接0x60000指向与 PCI 芯片选择地址偏移的基地址吗?
我写的值怎么会bar1 + offset复制到设备上?iowrite32和后面的机制是如何工作的pci_iomap?
感谢致敬
亚历克斯
PS:我成功测试了从同一地址的回读。
PCI设备的寄存器描述:
PCIBAR0PCI 基地址 0;用于内存映射配置寄存器PCIBAR1PCI 基地址 1;用于 I/O 映射的配置寄存器PCIBAR2PCI 基地址 2;用于本地地址空间 0PCIBAR3PCI 基地址 3;用于本地地址空间 1PCIBAR4 未使用的基地址PCIBAR5 …在某些用户定义的活动期间,如何在 CPU、内存或线程使用方面衡量 OS X 中 kext 的性能影响?任何可以从用户空间使用的特定方法工具?或任何可以考虑的方法/方法?
我正在尝试构建一个演示内核模块,但是当我制作时,我得到了关注,
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-47-generic'
make[2]: *** No rule to make target 'arch/x86/entry/syscalls/syscall_32.tbl', needed by 'arch/x86/entry/syscalls/../../include/generated/asm/syscalls_32.h'. Stop.
arch/x86/Makefile:199: recipe for target 'archheaders' failed
make[1]: *** [archheaders] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-47-generic'
Makefile:4: recipe for target 'all' failed
Run Code Online (Sandbox Code Playgroud)
我正在跨 linux 内核构建模块 - 4.4.0-47 版本 - 64 位操作系统。任何人都可以帮助我理解为什么我面临这个错误。提前谢谢你。
我刚刚安装了一个自定义内核模块来在我的 Macbook 上启用 SCTP 支持
我想在我的 docker 容器中加载这个内核模块。
我尝试使用--cap-add SYS_MODULE标志启动一个容器,并在容器中安装libsctp-dev lksctp-tools kmod软件包以使用“modprobe sctp”启用 sctp...但未成功:
modprobe: ERROR: ../libkmod/libkmod.c:586 kmod_search_moddep() could not open moddep file '/lib/modules/4.9.13-moby/modules.dep.bin' modprobe:
FATAL: Module SCTP not found in directory /lib/modules/4.9.13-moby
Run Code Online (Sandbox Code Playgroud)
在 linux 主机上,有些人建议这样做:Docker 加载内核模块,但它既与 macOS 不兼容,又“脏”...
所以我的问题是:有谁知道如何使用 macOs 主机在 docker 容器中使用内核模块?这甚至可能吗?
这个我的模块完美地劫持了用户的控制台:https : //pastebin.com/99YJFnaq
它是 Linux 内核 4.12,Kali 2018.1。
现在,我已经安装了最新版本的 Kali - 2019.1。它使用内核 4.19:
Linux kali 4.19.0-kali1-amd64 #1 SMP Debian 4.19.13-1kali1 (2019-01-03) x86_64 GNU/Linux
我试图捕捉任何东西,但流中不存在 fd == 0 的任何东西。
changelogs不同的资源......
我找到了这样的模块kpti,它可能会做类似的事情,但是这个模块没有安装在 Kali 2019.1 中。
请帮我找出hacked_read这段代码停止听到的确切原因sys_read():
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/syscalls.h>
#include <linux/version.h>
#include <linux/unistd.h>
#include <linux/time.h>
#include <linux/preempt.h>
#include <asm/uaccess.h>
#include <asm/paravirt.h>
#include <asm-generic/bug.h>
#include <asm/segment.h>
#define BUFFER_SIZE 512
#define MODULE_NAME "hacked_read"
#define dbg( format, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用depmod和modprobe实用程序插入内核模块以解决任何依赖关系。当我构建模块时,它会抛出“警告:modules_install:缺少‘System.map’文件。跳过depmod。 ”
后来当我尝试执行modprobe它时会抛出一个错误,说
“modprobe:致命:在目录/lib/modules/4.19.58-v7+中找不到模块i2c_eeprom_client.ko”
下面是我正在使用的make文件:
obj-m += i2c_eeprom_client.o
KDIR = /lib/modules/$(shell uname -r)/build
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
make -C $(KDIR) M=$(PWD) modules_install
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)
以下是构建的输出:
make -C /lib/modules/4.19.58-v7+/build M=/home/pi/work/eeprom modules
make[1]: Entering directory '/usr/src/linux-headers-4.19.58-v7+'
Building modules, stage 2.
MODPOST 1 modules
make[1]: Leaving directory '/usr/src/linux-headers-4.19.58-v7+'
make -C /lib/modules/4.19.58-v7+/build M=/home/pi/work/eeprom
modules_install
make[1]: Entering directory '/usr/src/linux-headers-4.19.58-v7+'
INSTALL /home/pi/work/eeprom/i2c_eeprom_client.ko
DEPMOD 4.19.58-v7+
Warning: modules_install: missing 'System.map' file. …Run Code Online (Sandbox Code Playgroud) 进入/proc/PID/maps我可以看到一些缓冲区映射到内核模块的内存:
44a00000-44b00000 rwxs 00000000 00:01 XXXX /dev/my_module
我知道它是逻辑地址,我想用dd?
dd 需要获取物理内存地址,我如何计算这个缓冲区的物理地址来转储它?
kernel-module ×10
kernel ×4
linux ×4
linux-kernel ×4
c ×3
containers ×1
dd ×1
docker ×1
insmod ×1
kgdb ×1
macos ×1
makefile ×1
mmap ×1
pci ×1
scsi ×1
system-calls ×1