我正在编写内核模块(Linux中的C),我想更改其中的其他文件的权限.任何解决方案 因为我在内核中我不能使用chmod系统调用...并感谢您的帮助
这是我的Makefile:
> obj-m += ca.o
>
> all:
> make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
>
> clean:
> make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
> #include <linux/string.h>
> #include <linux/mm.h>
> /* Snip, tons of includes (all of them :))*/
> #include <linux/delay.h> .... int procfile_write(struct file *file,
> const char *buffer, unsigned long
> count,
> void *data) { ... sys_chmod(path, per); ... } ...
Run Code Online (Sandbox Code Playgroud)
当它发出警告时:
WARNING: "sys_chmod" [file] undefiened
当使用"sudo insmod"加载模块时,它会出现以下错误:
Unknown …
在x86系统上,我有一个Linux内核模块("观察器模块"),每次加载特定的内核模块("目标")时,它都会被内核通知.几乎任何内核模块都可以成为目标.我在我正在研究的仪器系统中使用它.
当观察者模块处理这样的通知时,如果观察者知道所加载的目标模块的ELF部分的地址,则由于某种原因可能是方便的.有关如何在内核空间中获取此信息的任何想法?
当然,我可以在/sys/module/<target_name>/sections/加载目标后立即在用户空间中获取相应文件的内容,然后以某种方式将此数据传递给观察者模块,但这太笨拙了.我想找到一种直接在内核空间中获取此信息的方法.
据我所见,在模块加载器的源代码中,它不存储段地址struct module,只是为段创建sysfs文件.也许有可能以某种方式找到与这些文件对应的内核对象并从这些对象中读取所需的数据?或者可能使用其他方法?
我有两个内核模块(比如modA和modB).modA导出符号,EXPORT_SYMBOL(symA)modB使用它.我有modA.hmodA 的标题:
...
extern void symA(int param);
...
Run Code Online (Sandbox Code Playgroud)
并在modB.c:
#include "modA.h"
...
static int __init modB_init(void)
{
symA(10);
}
...
Run Code Online (Sandbox Code Playgroud)
如果我的insmodmodB一切正常,我的modB在内核中正确链接,并symA正确调用函数.但是当我构建modB时,编译器会发出警告:symA is undefined.LKM是ELF可重定位的,为什么编译器会发出此警告?怎么可以删除?
__init在驱动程序module_init和内核的其他函数中,内核中有许多调用实例.我怀疑的是内核如何确定__init调用的顺序.更重要的是,它如何确定驱动程序module_init调用的顺序?
我尝试在nasm中编写简单的内核模块(v3.6),但insmod说我:
$ sudo insmod ./hello.ko
insmod: ERROR: could not insert module ./hello.ko: Invalid module format
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)
我编译我的代码:
$ nasm -f elf64 -o hello.m hello.asm
$ ld -m elf_x86_64 -r -o hello.ko hello.m
Run Code Online (Sandbox Code Playgroud)
和我的模块代码:
section .modinfo
__mod_kernel_version db "kernel_version=3.6.8", 0
__mod_license db "license=GPL", 0
__mod_author db "author=actics", 0
__mod_description db "description=hello world module in nasm", 0
section .data
init_mess db "init_module", 10, 0
cleanup_mess db "cleanup_module", 10, 0
section .text
global init_module
global cleanup_module
extern printk
init_module:
push …Run Code Online (Sandbox Code Playgroud) 我的系统是CentOS 6.3(运行内核版本2.6.32-279.el6.x86_64).
我有一个可加载的内核模块,它是一个管理PCIe卡的驱动程序.如果我insmod在操作系统启动并运行时手动插入驱动程序,则驱动程序会成功加载并运行.
不过,如果我尝试使用rpm安装了驱动程序,然后重新启动系统,启动操作系统卡住吐出了所有的CPU内核下面的"软锁"消息,除了一个核心是在"软锁"期间我的驱动程序创建的其中一个线程.
BUG: soft lockup - CPU#X stuck for 67s! [migration/8:36]
.......(same above message for all cores except one)
BUG: soft lockup - CPU#10 stuck for 67s! [mydriver_thread/8:36]
(one core is locked up in one of the threads in my driver).
Run Code Online (Sandbox Code Playgroud)
我在网上找了很多关于这个内核msg/bug的信息,并且有很多关于它的帖子,没有关于它的原因或如何调试.任何有关以下问题的帮助将非常感激:
我无法登录系统,我认为这是因为所有核心都处于"软锁定"状态,因此无法从shell提示符触发内核转储.我启用了SysRq,并尝试使用SysRq键组合触发内核转储,但没有运气.系统似乎没有响应键盘(甚至没有响应CapsLock按钮).关于如何在这种情况下触发内核转储的任何建议?
我可以想象我的驱动程序线程可能导致"软锁定".但是,由于我的驱动程序,"迁移"线程(内核线程)如何处于"软锁定"?
从浏览网络,"迁移"线程用于将任务从一个CPU移动到另一个CPU.有人可以帮我理解这个帖子究竟是做什么的吗?以及它如何受其他线程的影响,如果有的话.
我有一个内核模块,用于分割传入的rtp数据包和合并rtp传出数据包.程序在2/3天内崩溃一次.如果可以找到模块崩溃的确切行,对我来说会非常方便.我在下面给出了崩溃转储.是否可以从崩溃转储中找到代码中的确切行?
PID: 1256 TASK: ffff88020fc71700 CPU: 0 COMMAND: "rtpproxy"
#0 [ffff880212faf2f0] machine_kexec at ffffffff8103bb7a
#1 [ffff880212faf360] crash_kexec at ffffffff810bb968
#2 [ffff880212faf430] oops_end at ffffffff8169fad8
#3 [ffff880212faf460] die at ffffffff81017808
#4 [ffff880212faf490] do_general_protection at ffffffff8169f5d2
#5 [ffff880212faf4c0] general_protection at ffffffff8169eef5
[exception RIP: pkt_queue+388]
RIP: ffffffffa00f3fa0 RSP: ffff880212faf578 RFLAGS: 00010292
RAX: ffff8802110ae400 RBX: ffff880213a53f38 RCX: 00015d910000a20f
RDX: 497d74565cede60c RSI: 000000006df1ed57 RDI: 00000000e46e0cfc
RBP: ffff880212faf728 R8: ffff880211a8b000 R9: ffff880212fafa60
R10: ffff880212fafbc8 R11: 0000000000000293 R12: 00000000134ab2b4
R13: 000000008386615c R14: 00000000000000e3 R15: 00000000000000e3
ORIG_RAX: ffffffffffffffff …Run Code Online (Sandbox Code Playgroud) 我正在尝试在内核3.13上编译内核模块,我收到此错误:
error: implicit declaration of function 'create_proc_read_entry' [-Werror=implicit-function-declaration]
Run Code Online (Sandbox Code Playgroud)
我谷歌它并没有找到任何回应.以下是引用此错误的代码部分:
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
proc = proc_net_create(KAODV_QUEUE_PROC_FS_NAME, 0, kaodv_queue_get_info);
#else
proc = create_proc_read_entry(KAODV_QUEUE_PROC_FS_NAME, 0, init_net.proc_net, kaodv_queue_get_info, NULL);
#endif
if (!proc) {
printk(KERN_ERR "kaodv_queue: failed to create proc entry\n");
return -1;
}
Run Code Online (Sandbox Code Playgroud)
我可以得到帮助吗?我真的不知道出了什么问题.它可能是需要补丁的内核3.13.我在某处(在KERNEL 3.10上)读到内核需要补丁.任何人都可以告诉我在哪里可以得到3.13内核补丁,以最终解决问题.谢谢
我对内核如何加载到内存中有一些疑问。经过检查,/proc/kallsyms我能够找到内核中各种符号的地址。
$ cat /proc/kallsyms | head -n 10
00000000 t __vectors_start
80008240 T asm_do_IRQ
80008240 T _stext
80008240 T __exception_text_start
80008244 T do_undefinstr
80008408 T do_IPI
8000840c T do_DataAbort
800084a8 T do_PrefetchAbort
80008544 t gic_handle_irq
800085a0 T secondary_startup
Run Code Online (Sandbox Code Playgroud)
puts在 0x200 的偏移量处说函数。当加载到内存 at 说地址时0x8048000,我将能够puts在0x8048000 + 0x200. 内核也一样吗?即内核映像是否作为 1 个连续.text部分加载到内存中?我正在使用QN9021SoC controller mode(BLE蓝牙核心规范v4.0).它支持一些标准HCI命令以及一些供应商特定命令.我想把它贴在我的ubuntu笔记本电脑上.
我使用的命令是hciattach.
hciattach -s 9600 /dev/ttyUSBx any 9600 noflow nosleep
Run Code Online (Sandbox Code Playgroud)
hcidump执行时的节目sudo hciconfig hci1 up.
HCI sniffer - Bluetooth packet analyzer ver 5.37
device: hci1 snap_len: 1500 filter: 0xffffffffffffffff
> HCI Event: Command Complete (0x0e) plen 12
Read Local Supported Features (0x04|0x0003) ncmd 11
status 0x00
Features: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
> HCI Event: Command Complete (0x0e) plen 12
Read Local Version Information …Run Code Online (Sandbox Code Playgroud)