标签: kernel-module

open()返回"没有这样的设备"错误,但是有这样的设备(linux)

我正在尝试使用一个有点旧的DAQ,并且不得不跳过一些箍来获得一个旧的(大约2004年)设备驱动程序来编译它(DTI-DT340 Linux-DAQ-PCI).

我已经达到了编译的程度,我可以加载内核模块,找到卡片,然后我可以使用mknod创建角色设备.

但我似乎无法打开这些设备并继续获得errno 19(ENODEV)'没有这样的设备'当我尝试

open("/dev/dt340/0",O_RDWR);
Run Code Online (Sandbox Code Playgroud)

但是mknod没有关于制作它的抱怨,它就在那里:

# ls -l /dev/dt340/
total 0
crw-rw-r-- 1 root staff 250, 0 2009-04-23 11:02 0
crw-rw-r-- 1 root staff 250, 1 2009-04-23 11:02 1
crw-rw-r-- 1 root staff 250, 2 2009-04-23 11:02 2
crw-rw-r-- 1 root staff 250, 3 2009-04-23 11:02 3
Run Code Online (Sandbox Code Playgroud)

有什么我忽略的事情吗?什么可能是开放失败的原因?

这是我用来加载驱动程序和制作设备的脚本.

#!/bin/bash
module="dt340"
device="dt340"
mode="664"

# invoke modprobe with all arguments we were passed
#/sbin/modprobe -t misc -lroot -f -s $module.o $* || exit 1
insmod …
Run Code Online (Sandbox Code Playgroud)

c linux kernel-module linux-device-driver linux-kernel

5
推荐指数
1
解决办法
2万
查看次数

如何制作一个Linux内核模块依赖于另一个带有depmod的外部模块?

我正在编写一个依赖于一个现有内核模块的内核模块.我正在从树中构建我的模块(作为外部模块).

如何声明依赖项,以便depmod识别它?

linux kernel-module linux-kernel

5
推荐指数
1
解决办法
7243
查看次数

Linux内核模块编译

我尝试编译简单的linux内核模块:

#include <linux/module.h>    
#include <linux/kernel.h>       

int init_module(void)
{
        printk("Hello world 1.\n");
        return 0;
}

void cleanup_module(void)
{
        printk(KERN_ALERT "Goodbye world 1.\n");
}
Run Code Online (Sandbox Code Playgroud)

我的makefile:

obj-m = testmodule.o
KVERSION = $(shell uname -r)
all:
        make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
        make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)

现在我的.c文件中没有错误.

但是当我在终端尝试make时:make:没有什么可以为'all'做的.

怎么了?

谢谢.

c linux kernel kernel-module

5
推荐指数
1
解决办法
1838
查看次数

内核模块参数更改(使用/ sys/module)

我对linux中的/ sys/module /有一些疑问

1)/ sys/module是否包含内核的所有模块

2)/ sys/module/xxx /参数是否包含内核模块xxxx的所有参数

3)/ sys/module/xxx/parameters/yyyy是否包含内核模块xxxx的参数yyyy的实时值

4)如果在给定内核模块中更改参数,如何在RealTime中检测此更改?我想开发一个C应用程序(用户空间)或shell脚本,它实时检测给定内核模块参数的变化.

c linux kernel-module linux-kernel

5
推荐指数
2
解决办法
7987
查看次数

在linux内核模块中设置线程关联

因为大多数C程序员都知道libc为线程cpu亲和性调优提供了一个非可移植的函数(pthread_attr_setaffinity_np()).但是,我真正不知道的是在实现内核模块时如何做到这一点.任何提及或重定向到一些真实示例的答案都会非常有用.

kernel-module setthreadaffinitymask

5
推荐指数
1
解决办法
3420
查看次数

通过netlink将结构从内核发送到userland

我试图将一个结构从LKM发送到userland,基于这个答案:使用3.X linux内核的C中的Netlink套接字

答案本身的代码是完全可编译的,但是当我尝试发送struct而不是a时char *,我会在userland中获得段错误.

这是我改变的:

netlinkKernel.c

我加:

typedef struct test{
    int a;
    char *b;
} s_test;
Run Code Online (Sandbox Code Playgroud)

并替换

char *msg = "Hello from kernel";

---

msg_size = strlen(msg);

---

strncpy(nlmsg_data(nlh),msg,msg_size);
Run Code Online (Sandbox Code Playgroud)

s_test x;
x.a = 42;
x.b = "The answer";

---

msg_size(sizeof(x));

---

memcpy(nlmsg_data(nlh), &x, msg_size);
Run Code Online (Sandbox Code Playgroud)

netlinkUser.c

我添加相同的结构和替换

printf("Received message payload: %s\n", (char *)NLMSG_DATA(nlh));
Run Code Online (Sandbox Code Playgroud)

s_test *x = (s_test *)NLMSG_DATA(nlh);
printf("Received message payload: %d - %s\n", x->a, x->b);
Run Code Online (Sandbox Code Playgroud)

问题出在哪儿?

c linux kernel kernel-module netlink

5
推荐指数
1
解决办法
1758
查看次数

如何使用EXPORT_SYMBOL或等效的方法在两个内核模块之间导出结构?

我有一个内核模块,其结构如下:

struct test {
    int a;
    int b;
    .....
}
Run Code Online (Sandbox Code Playgroud)

我已经创建了这个结构的一个实例数组:

struct test foo[8];
Run Code Online (Sandbox Code Playgroud)

我想在其他内核模块中使用EXPORT_SYMBOL和访问此结构或数组"foo" foo[0].a.

我尝试EXPORT_SYMBOL(foo);从提供程序模块和extern struct test * foo;接收器模块,但我无法访问该变量.请指出我犯错的地方.

这是一些代码:

内核模块1:

#include <....>
#include "test_config.h"
....
MODULE_LICENSE("GPL");

struct test {
int a;
int b;
.....
}

test_t foo[8];
//EXPORT_SYMBOL(foo);

/*Code to create sysctl variables out of these members of the struct test*/

int init_module(void)
{
    printk(KERN_INFO "Hello World\n");
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Goodbye Cruel World\n");
}
Run Code Online (Sandbox Code Playgroud)

Kerne模块2:

#include …
Run Code Online (Sandbox Code Playgroud)

c struct kernel-module linux-kernel

5
推荐指数
2
解决办法
9510
查看次数

如何使用Linux内核模块中的Linux系统调用

我在Linux内核模块内调用系统调用时遇到一些困难.系统调用已经过测试,并且可以从标准的c用户空间程序中正常工作,但我似乎无法获得内核模块来编译和运行它们.

在我的用户程序中,我包含以下代码,系统调用有效:

#include <linux/unistd.h>   
#define __NR_sys_mycall 343

extern long int _syscall(long int_sysno,...)__THROW;

//and then a simple call is done as such
long value = syscall(__NR_sys_mycall);

printf("The value is %ld\n",value);
Run Code Online (Sandbox Code Playgroud)

但是当我在我的Linux内核模块中尝试相同的事情时,我得到了一堆错误,或者说错误:隐式声明函数'syscall'(如果我不包括_syscall定义)或一长串关于语法的错误if我...所以我的假设是我需要内核空间版本来调用系统调用.我是对还是错?

//My LKM code
#include <linux/module.h>
#include <linux/unistd.h>
#define __NR_sys_mycall 343

static int start_init(void)
{
   long value = syscall(__NR_sys_mycall);
   printk("The value is %ld\n",value);

   return 0;
}

static void finish_exit(void)
{
      printk("Done!\n");
}

module_init(start_init);
module_exit(finish_exit);
Run Code Online (Sandbox Code Playgroud)

c system-calls kernel-module linux-kernel

5
推荐指数
2
解决办法
5327
查看次数

Linux proc模块中的虚拟地址到物理地址转换

我正在尝试在Linux上创建自己的proc节点"os_pagemap"(使用odroid)

该节点的目标是打印所有物理内存页面的信息.(sudo cat/proc/os_pagemap)

像这样 :

[PHY] Virt 483252 Phy 266908 VMA 0 PID 5773 PNAME com.sec.android.app.keyboard
[PHY] Virt 483253 Phy 266909 VMA 0 PID 5773 PNAME com.sec.android.app.keyboard
[PHY] Virt 483254 Phy 266910 VMA 0 PID 5773 PNAME com.sec.android.app.keyboard
[PHY] Virt 398391 Phy 266920 VMA /dev/ashmem/dalvik-bitmap-1 PID 5773 PNAME com.sec.android.app.keyboard
Run Code Online (Sandbox Code Playgroud)

其中VMA是指VMA名称

为了实现目标,我的设计是这样的:

1. read_lock(&tasklock)
2. for_each_process(p) => get pids
3. read_unlock(&tasklock)
4. Loop for each pid
   1)task = get_pid_task(pid)
   2)if task==NULL => skip
   3)mm=task->mm
   4)down_read(&mm->mmap_sem)
   5)Loop for each vma in mm …
Run Code Online (Sandbox Code Playgroud)

c memory-management kernel-module linux-kernel

5
推荐指数
0
解决办法
656
查看次数

FreeBSD模块调试 - 无法访问内存地址

我试图破解/理解nullfs内核模块(在FreeBSD上)所以为此,我做了以下事情:

在目标机器上: kldstat给出:

Id Refs Address            Size     Name
 1   10 0xffffffff80200000 17e10c8  kernel
 2    1 0xffffffff819e2000 4cf0     vmxnet.ko
 3    1 0xffffffff819e7000 16e0     echo.ko
 4    1 0xffffffff81c11000 23dc     vmmemctl.ko
 5    1 0xffffffff81c14000 641b     nullfs.ko

nm /boot/kernel/nullfs.ko | grep mount
00000000000018f0 t null_getwritemount
0000000000000540 t nullfs_mount
0000000000000930 t nullfs_unmount
                 U vfs_mountedfrom
                 U vop_getwritemount_desc
Run Code Online (Sandbox Code Playgroud)

在通过充当串行控制台的命名管道(我正在使用虚拟机)连接到目标的本地计算机上:

(kgdb) tr0
kdb_sysctl_enter (oidp=<value optimized out>, arg1=<value optimized out>,
arg2=0xfffffe004e7cc7f0,
    req=<value optimized out>) at /usr/src/sys/kern/subr_kdb.c:446
446                     kdb_why = KDB_WHY_UNSET;
Current language:  auto; currently minimal
(kgdb) getsyms
During …
Run Code Online (Sandbox Code Playgroud)

debugging freebsd kernel-module kgdb

5
推荐指数
0
解决办法
406
查看次数