标签: linux-device-driver

使用modprobe"致命:模块未找到错误"

我有一个modprobe命令问题...我编译了hello world模块并加载它insmod,它工作正常,当我这样做时lsmod,我可以在输出列表中看到它.但是当我使用插入此模块时,我modprobe收到致命错误:

root@okapi:/home/ravi# modprobe ./hello.ko 
FATAL: Module ./hello.ko not found.
root@okapi:/home/ravi#
Run Code Online (Sandbox Code Playgroud)

这是模块代码:

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

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
        printk(KERN_ALERT "Hello, world\n");
        return 0;
}
static void hello_exit(void)
{
        printk(KERN_ALERT "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);
Run Code Online (Sandbox Code Playgroud)

和Makefile

obj-m += hello.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)

c linux kernel linux-device-driver linux-kernel

23
推荐指数
2
解决办法
14万
查看次数

是否可以将CFLAGS设置为Linux内核模块Makefile?

例如:通用设备模块的Makefile

obj-m:=jc.o

default:
    $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:
    $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules clean
Run Code Online (Sandbox Code Playgroud)

我考虑是否可以将CFLAGS设置为该文件.当我将默认部分更改为

$(MAKE) -O2 -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
Run Code Online (Sandbox Code Playgroud)

但它没有用.

有帮助吗?非常感谢.

makefile linux-device-driver linux-kernel

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

Linux内核/驱动程序开发新手

最近,我开始开发运行linux的嵌入式设备的驱动程序.

到目前为止,我只阅读了关于linux内部的内容.
没有先前的驾驶员开发经验,我发现我的第一步很难落地.

  • 我已经下载了内核源代码(v2.6.32).
  • 我读过(吝啬)Linux设备驱动程序(3e)
  • 我在StackOverflow上阅读了一些相关的帖子.
  • 我知道linux有一个"单片"的方法.
  • 我已经构建了内核(在menuconfig中包含现有的驱动程序等)
  • 我知道kconfig和makefile文件的基础知识,所以这不应该是一个问题.

有人可以描述
内核源代码中各种目录的结构(即链接间).

换句话说,给定一个源代码文件,
它将引用相关代码的其他文件

("#include"-s提供了部分想法)

有人可以帮助我获得一个更好的主意吗?
任何帮助将不胜感激

谢谢.

linux kernel linux-device-driver linux-kernel

21
推荐指数
2
解决办法
8768
查看次数

内核虚拟地址和内核逻辑地址之间的区别?

我无法区分内核逻辑地址和虚拟地址.在Linux设备驱动程序书中它说所有逻辑地址都是内核虚拟地址,而虚拟地址没有任何线性映射.但是当我们说这是合乎逻辑的时候逻辑明智,当我们说虚拟时,我们在哪种情况下使用这两个?

linux-device-driver linux-kernel

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

了解file_operations的loff_t*offp

我正在设计一个只读取和写入字符缓冲区的设备驱动程序.然而,我的问题是file_operations结构read和结构中的两个功能write.我真的不明白究竟loff_t *offp是什么.我知道对于*offp文件偏移的读取和写入操作都意味着文件的当前读/写位置,但是我甚至不确定写入或读取设备文件意味着什么.

从我收集的内容来看,这就是我写作和从我的设备中读取的方式是我创建了一个代表我所称的设备的结构,my_char_struct如下所示.

struct my_char_structure{
    struct cdev my_cdev;
    struct semaphore sem;
    char *data;
    ssize_t data_size;
    unsigned int access_key;
    unsigned long size;
};
Run Code Online (Sandbox Code Playgroud)

这是一个静态结构,在我的驱动程序是insmod这样的时候初始化并指向它.

static dev_t dev_num;
static struct my_char_structure Dev;

int start_mod(void){
    //Because we are dealing with a fictitious device, I want
    //the driver to create my two devices with arbitrarily 
    //assigned major numbers.
    struct my_char_structure *my_dev = &Dev;
    int err;

    alloc_chrdev_region(&dev_num, FIRST_MINOR, COUNT, DEVICE_NAME);

    sema_init(&(my_dev->sem),1); …
Run Code Online (Sandbox Code Playgroud)

c linux kernel linux-device-driver linux-kernel

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

如何找出哪个Linux驱动程序占用了我的GPIO?

我的电路板上有一个多用作GPIO的焊盘.当我尝试通过/ sys/class/gpio/export导出它时,我得到了

-sh: echo: write error: Device or resource busy
Run Code Online (Sandbox Code Playgroud)

我的猜测是其他一些司机在我得到这个机会之前要求这个垫子.我怎样才能找到保留它的内容?

linux-device-driver gpio

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

linux内核中的函数调用者

有没有办法在linux内核中获取函数调用?我知道__ func __返回正在执行的函数名.我正在寻找名为" __ func __ "的函数

kernel linux-device-driver linux-kernel embedded-linux kernel-mode

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

make命令中的M选项,Makefile

make -C ~/kernel-2.6 M=`pwd` modules
Run Code Online (Sandbox Code Playgroud)

M ='pwd'在上面的行中是什么意思?

我无法理解这个解释:

在尝试构建模块目标之前,M =选项会使makefile移回模块源目录.

你能说得更清楚吗?

c linux makefile linux-device-driver linux-kernel

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

很难理解MODULE_DEVICE_TABLE(usb,id_table)的用法

我很难理解其确切用法 MODULE_DEVICE_TABLE(usb, id_table)

AFAIK这将生成将在以后modprobe插入新设备时使用的映射文件,它将与这些映射文件匹配并在模块匹配时加载模块.

但我的误解是"不是模块加载了吗?"

我的意思是我已经装好了insmod module-name.还是我错过了什么?

linux linux-device-driver linux-kernel

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

Linux内核:为什么'subclass'结构将基类信息放在最后?

我正在阅读Linux内核上的Beautiful Code中的章节,作者讨论了Linux内核如何在C语言中实现继承(以及其他主题).简而言之,定义了一个"基础"结构,为了从中继承,"子类"结构将基类的副本放在子类结构定义的末尾.然后,作者花了几页来解释一个聪明而复杂的宏,以确定要从对象的基本部分转换为对象的子类部分需要多少字节.

我的问题:在子类struct中,为什么不将struct struct声明为struct中的第一个东西,而不是最后一个

首先放置基础结构的主要优点是从基类转换到子类时根本不需要移动指针 - 实际上,执行转换只是告诉编译器让代码使用'额外'子类struct在基类定义的东西之后放置的字段.

只是为了澄清我的问题,让我抛出一些代码:

struct device { // this is the 'base class' struct
     int a;
     int b;
     //etc
}
struct usb_device { // this is the 'subclass' struct
    int usb_a;
    int usb_b;
    struct device dev; // This is what confuses me - 
                       // why put this here, rather than before usb_a?
}
Run Code Online (Sandbox Code Playgroud)

如果碰巧有一个指向usb_device对象内部的"dev"字段的指针,那么为了将其强制转换回该usb_device对象,需要从该指针中减去8.但是如果"dev"是usb_device中的第一个东西,那么指针根本就​​不需要移动指针.

任何有关这方面的帮助将不胜感激.甚至关于在何处找到答案的建议也会受到赞赏 - 我不太确定谷歌如何为这样的决定背后的架构原因.我在StackOverflow上找到的最接近的是: 为什么要使用这些奇怪的嵌套结构

而且,要明确一点 - 我知道很多聪明的人已经在Linux内核上工作了很长时间,所以很明显这样做是有充分理由的,我只是无法弄清楚它是什么.

c pointers linux-device-driver linux-kernel data-structures

20
推荐指数
3
解决办法
1226
查看次数