标签: kernel-module

编译linux内核(2.6)模块,包括非内核头文件

是否有可能编译包含非内核包含的功能的linux内核(2.6)模块?

例如:


kernelmodule.h

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>   // printk()
// ...
#include <openssl/sha.h>
// ...
Run Code Online (Sandbox Code Playgroud)

Makefile文件

obj-m := kernelmodule.o
all:
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` modules

clean:
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` clean
    $(RM) Module.markers modules.order
Run Code Online (Sandbox Code Playgroud)

我编写并尝试编译的内核模块包含许多openssl包含文件中的功能.

上面提到的标准makefile不允许包含在linux头文件之外.是否可以包含此功能,如果可以,请指出我正确的方向.

谢谢,迈克

linux makefile kernel-module static-libraries linux-kernel

7
推荐指数
2
解决办法
3134
查看次数

如何从linux内核模块中剥离本地符号而不破坏它?

如果我这样做,--strip-debug或者--strip-unneeded我有.ko列出所有函数名称nm,如果我这样做,strip foo.ko我有一个拒绝加载的内核模块.

有没有人知道如何删除模块加载不需要的所有符号的快捷方式,以便人们无法对API进行反向工程设计?

PS:对于所有开源bigots传教士; 这是一般公众在任何情况下都不会使用的东西,因此不需要将问题变成GPL火焰战争.

strip kernel-module linux-kernel

7
推荐指数
3
解决办法
2万
查看次数

如何从Linux内核模块获取使用计数?

我正在开发内核模块的使用计数有问题.我想打印它以进行调试.如何从模块代码中获取它?

有问题的内核版本 - Linux 2.6.32

linux kernel-module

7
推荐指数
1
解决办法
1432
查看次数

插入外部交叉编译的SPARC Linux模块时重定位错误

首先:我不是专家,所以请原谅我试图解释自己的任何错误.

我正在尝试使用Sparc-为SPARC机器交叉编译外部Linux模块Linux-GCC-4.4.2.Linux内核的版本是2.6.36.4-00037-g059aa91-dirty.它已经使用LEON处理器中的一些文件进行了修补.构建流程提供给我和它使用LinuxBuild,BuildrootBusybox.我正在尝试制作32位操作系统.

一切似乎都有效,但在我编译模块并尝试将其发送到SPARC系统后,我收到此错误:

module hellok:  Unknown relocation: 6
Run Code Online (Sandbox Code Playgroud)

这个错误来自于~/linuxbuild-1.0.3/linux/linux-2.6-git/arch/sparc/kernel/module.c 我将为完整性提供整个方法:

int apply_relocate_add(Elf_Shdr *sechdrs,
           const char *strtab,
           unsigned int symindex,
           unsigned int relsec,
           struct module *me)
{
unsigned int i;
Elf_Rela *rel = (void *)sechdrs[relsec].sh_addr;
Elf_Sym *sym;
u8 *location;
u32 *loc32;

for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
    Elf_Addr v;

    /* This is where to make the change */
    location = (u8 *)sechdrs[sechdrs[relsec].sh_info].sh_addr
        + …
Run Code Online (Sandbox Code Playgroud)

sparc cross-compiling relocation kernel-module linux-kernel

7
推荐指数
1
解决办法
687
查看次数

实际存储在文件描述符中的信息量是多少?

这可能听起来像一个奇怪的问题,但当我去打开文件时:

int fd;
fd = open("/dev/somedevice", O_RDWR);
Run Code Online (Sandbox Code Playgroud)

我究竟回到了什么地方?我可以看到手册页说:
The open() function shall return a file descriptor for the named file that is the lowest file descriptor not currently open for that process

但是这样吗?它只是一个int或是否在幕后附加了数据?我问的原因是我找到了一些代码(Linux/C),我们从用户空间打开文件:

//User space code:
int fdC;

if ((fdC = open(DEVICE, O_RDWR)) < 0) {
    printf("Error opening device %s (%s)\n", DEVICE, strerror(errno));
    goto error_exit;
}
while (!fQuit) {
    if ((nRet = read(fdC, &rx_message, 1)) > 0) {
Run Code Online (Sandbox Code Playgroud)

然后在内核端,该模块的文件操作(提供fd)映射读取到n_read()函数:

struct file_operations can_fops = { 
    owner:      THIS_MODULE, …
Run Code Online (Sandbox Code Playgroud)

c linux file-descriptor kernel-module linux-kernel

7
推荐指数
1
解决办法
4241
查看次数

无法"rmmod"模块

我正在使用涉及内核和用户空间代码的大型嵌入式软件(ARM处理器,嵌入式Linux 2.6.31,busybox).首先加载一个内核模块,然后守护进程与模块建立netlink套接字.

这里的问题是在杀死守护进程后,我无法再从内存中卸载模块:

% rmmod _module.ko
% rmmod: _module.ko: Resource temporarily unavailable
Run Code Online (Sandbox Code Playgroud)

分析表明,错误(返回值是-11,即EAGAIN?)是try_stop_module()在syscall delete_module()定义中调用的kernel/module.c.函数try_stop_module()依次调用stop_machine(),这就是我卡住的地方,

我不确定那里到底发生了什么.我认为根本原因是守护进程中的某个地方打开了与模块的连接,显然是其他东西并且在退出时没有正确关闭/清理(显然有些引用/锁没有被释放?)

有没有人知道还有什么可以看和探测?

linux kernel-module linux-kernel

7
推荐指数
1
解决办法
3万
查看次数

内核模块在从一个进程调用时,从另一个进程写入页面

我正在编写一个内核模块,由进程p1调用以覆盖属于目标进程p2的数据页.

首先,在内核模块内部并且在响应p1发出的proc文件系统的写事件时.我使用目标进程的进程id(p2)来搜索后者的任务结构(p2_task).

要搜索我使用的特定页面get_user_pages(),显然在(p2_task->mm)上调用它.然后我调用了kmap()上一个函数返回的页面.一旦我得到指针,我就使用典型的内存函数(memset())来写入该内存.最后叫了kunmap().

但是,一旦进程再次开始运行,我就可以看到我所做的对目标进程p2没有影响.

我不确定我做错了什么.有人可以帮忙吗?

我怀疑在回应来自p2的请求时,某种程度上你无法写入内存属于进程p2.从这里开始,我们处于不同的背景下.

这是真的,如果不是我能检查的其他内容.如果是问题,反正我可以解决这个问题吗?

memory-management kernel-module virtual-memory linux-kernel

7
推荐指数
1
解决办法
396
查看次数

可以延迟导出符号的加载吗?

我正在使用一些Linux内核模块,并且有一个与循环加载问题相关的问题.

模块A首先加载并导出许多符号,供模块B或C使用.然后,模块B或C被加载,并且符号存在供其使用.

但是,我现在发现模块A需要来自模块B或C的符号,但仅在运行时期间,而不需要初始化模块.所以当A加载时,它发现该符号尚不存在.我甚至在模块A中将符号标记为extern,但这也没有用.

加载模块A后是否可以延迟加载符号,但在加载B或C之前它仍然不存在?

kernel kernel-module linux-kernel

7
推荐指数
1
解决办法
237
查看次数

转储移动内存

我想用石灰倾倒我的手机内存,但在这个过程中我遇到了一些问题.1.Downloaded内核源码和构建,创建了zImage.

2.改变石灰的Makefile作为指导说,然后我做石灰.(尽管我的案例已创建lime.ko文件和lime-3.8.0-29-generic.ko文件,但在此步骤中出现问题)

3.命令./adb push~/lime-forensics/src/lime-3.8.0-29-generic.ko /sdcard/lime.ko成功推送

4.Rooted phone接受以root身份访问adb shell,并且lime insmod命令失败以转储内存

问题是当在adb shell类型命令insmod /sdcard/lime.ko"path =/sdcard/ram.lime format = lime"时出现此错误

 # insmod /sdcard/lime.ko "path=/sdcard/ram.lime format=lime>
insmod: init_module '/sdcard/lime.ko' failed (Exec format error).
Run Code Online (Sandbox Code Playgroud)

我犯了什么可能的错误以及如何解决此错误并继续?

memory android kernel-module adb galaxy

7
推荐指数
1
解决办法
717
查看次数

__init和__exit属性的用法

如果在初始化和退出模块中使用__init和__exit属性会发生什么,如果我不使用它们会发生什么.示例如下所示.

使用属性

static __init int myinit(void)
{}
static __exit void myexit(void)
{}
Run Code Online (Sandbox Code Playgroud)

Witout属性

static int myinit(void)
{}
static void myexit(void)
{}
Run Code Online (Sandbox Code Playgroud)

operating-system kernel kernel-module linux-device-driver

6
推荐指数
1
解决办法
1121
查看次数