标签: linux-device-driver

IOCTL Linux设备驱动程序

任何人都可以解释我,

  1. 什么是IOCTL
  2. 它是干什么用的?
  3. 我怎么用呢?
  4. 为什么我不能定义执行相同工作的新功能IOCTL

linux ioctl driver linux-device-driver linux-kernel

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

内核堆栈和用户空间堆栈

内核堆栈和用户堆栈之间有什么区别?为什么要使用内核堆栈?如果在ISR中声明了局部变量,那么它将被存储在哪里?每个进程都有自己的内核堆栈吗?然后这两个堆栈之间的进程如何协调?

linux linux-device-driver linux-kernel

94
推荐指数
3
解决办法
5万
查看次数

Linux平台驱动程序和普通设备驱动程序有什么区别?

我以前想过平台驱动程序以及普通设备驱动程序,如:

请有人解释一下.

c linux linux-device-driver linux-kernel

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

Linux内核如何知道在哪里查找驱动程序固件?

我正在Ubuntu下编译一个自定义内核,我遇到了我的内核似乎不知道在哪里寻找固件的问题.在Ubuntu 8.04下,固件与内核版本绑定的方式与驱动程序模块相同.例如,内核2.6.24-24-generic将其内核模块存储在:

/lib/modules/2.6.24-24-generic
Run Code Online (Sandbox Code Playgroud)

及其固件:

/lib/firmware/2.6.24-24-generic
Run Code Online (Sandbox Code Playgroud)

当我根据" 备用构建方法:老式Debian方式 " 编译2.6.24-24通用Ubuntu内核时,我得到了相应的模块目录,除了需要固件的设备外,我的所有设备都工作,例如我的英特尔无线网卡(ipw2200)模块).

内核日志显示,例如,当ipw2200尝试加载固件时,控制固件加载的内核子系统无法找到它:

ipw2200: Detected Intel PRO/Wireless 2200BG Network Connection
ipw2200: ipw2200-bss.fw request_firmware failed: Reason -2
Run Code Online (Sandbox Code Playgroud)

errno-base.h将此定义为:

#define ENOENT       2  /* No such file or directory */
Run Code Online (Sandbox Code Playgroud)

(返回ENOENT的函数在它前面放一个减号.)

我尝试在/ lib/firmware中创建一个符号链接,其中我的内核名称指向2.6.24-24-generic目录,但是这导致了同样的错误.此固件是非GPL,由Intel提供并由Ubuntu打包.我不相信它与特定内核版本有任何实际联系.cmp表明各个目录中的版本是相同的.

那么内核如何知道在哪里寻找固件呢?

更新

我找到了解决我遇到的确切问题的解决方案,但是它不再有效,因为Ubuntu已经淘汰/etc/hotplug.d并且不再存储其固件/usr/lib/hotplug/firmware.

UPDATE2

更多的研究提出了更多的答案.直到版本92 udev,该程序firmware_helper是固件加载的方式.从udev93 开始,这个程序被替换为一个名为firmware.sh的脚本,据我所知,它提供了相同的功能.这两个硬编码固件路径/lib/firmware.Ubuntu似乎仍在使用/lib/udev/firmware_helper二进制文件.

固件文件的名称将传递到firmware_helper环境变量中$FIRMWARE,该变量连接到路径/lib/firmware并用于加载固件.

加载固件的实际请求是由驱动程序(在我的情况下为ipw2200)通过系统调用完成的:

request_firmware(..., "ipw2200-bss.fw", ...);
Run Code Online (Sandbox Code Playgroud)

现在,在驱动程序调用request_firmwarefirmware_helper查看$FIRMWARE …

firmware linux-device-driver linux-kernel

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

.o和.ko文件之间的区别

我正在编写简单的Linux模块mod.c. 当我编译mod.c文件,它会创建两个输出文件mod.omod.ko.所以我只想知道,mod.o和mod.ko文件有什么区别?

linux-device-driver

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

如何编写简单的Linux设备驱动程序?

我需要从头开始为omap4编写SPI Linux字符设备驱动程序.我知道编写设备驱动程序的一些基础知识.但是,我不知道如何从头开始编写平台特定的设备驱动程序.

我写了一些基本的char驱动程序,我认为编写SPI设备驱动程序与它类似.Char驱动程序具有file_operations包含驱动程序中实现的功能的结构.

struct file_operations Fops = {
    .read = device_read,
    .write = device_write,
    .ioctl = device_ioctl,
    .open = device_open,
    .release = device_release,  /* a.k.a. close */
};
Run Code Online (Sandbox Code Playgroud)

现在,我将通过spi-omap2-mcspi.c代码作为参考,以便从头开始开始开发SPI驱动程序.

但是,我没有看到打开,读取,写入等功能.不知道程序从哪里开始.

c linux linux-device-driver linux-kernel embedded-linux

49
推荐指数
4
解决办法
7万
查看次数

linux内核如何管理不到1GB的物理内存?

我正在学习linux内核的内部结构,在阅读"理解Linux内核"时,有很多与内存相关的问题让我感到震惊.其中之一是,如果我的系统上安装了仅512 MB的物理内存,Linux内核如何处理内存映射.

正如我所读到的,内核将0(或16)MB-896MB物理RAM 映射到0xC0000000线性地址并可直接对其进行寻址.所以,在上面描述的情况下,我只有512 MB:

  • 内核如何从512 MB映射896 MB?在所描述的方案中,内核进行设置,以便每个进程的页表将虚拟地址从0xC0000000映射到0xFFFFFFFF(1GB),直接映射到0x00000000到0x3FFFFFFF(1GB)的物理地址.但是当我只有512 MB物理RAM时,如何将虚拟地址从0xC0000000-0xFFFFFFFF映射到物理0x00000000-0x3FFFFFFF?点是我的物理范围只有0x00000000-0x20000000.

  • 在这种情况下用户模式进程怎么样?

  • 每篇文章都只解释了这种情况,当你安装了4 GB内存并且内核将1 GB映射到内核空间时,用户进程使用剩余的RAM量.

我很感激任何帮助,以提高我的理解.

谢谢..!

kernel arm linux-device-driver linux-kernel embedded-linux

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

学习内核编程

我想学习lLinux内核编程.

那个起点是什么?什么可能是一些更简单的问题?

linux kernel linux-device-driver embedded-linux

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

如何使用netlink socket与内核模块通信?

我正在尝试编写一个使用netlink与用户进程通信的linux内核模块.我正在使用netlink,因为我想要通信的用户程序只使用套接字进行通信,我无法改变它来添加ioctl()或任何东西.

问题是我无法弄清楚如何做到这一点.我用Google搜索,但我发现所有的例子都是老喜欢这一个,不再适用于当前的内核版本.我也看了这个问题,但这里的示例使用libnl进行套接字操作,但我想坚持使用标准套接字函数(定义sys/socket.h).那么有些人可以在这里指导我一些教程或指南或一些可以帮助我理解netlink的界面和用法的东西.我非常感谢一个工作示例,没什么特别的,只是一个非常基本的例子,说明如何建立从用户程序中的套接字到内核中的套接字的连接,然后将数据从用户进程发送到内核并从内核接收回来.

另请不要告诉我查看内核代码.我已经在做了,但这需要花费很多时间,而且我没有留下很多东西.

更新: 经过大量的试验和错误后,我有以下代码将消息从用户程序发送到内核,但是从内核到用户程序的消息即使用netlink_unicast()不起作用.它不仅没有工作,呼叫挂起系统,然后我必须重新启动机器.有人可以看看,告诉我我在做什么错.该netlink_unicast()调用在以下代码中进行了注释.它应该是内核到用户程序消息的未注释.

用户程序

#include <sys/socket.h>  
#include <linux/netlink.h>  
#define NETLINK_USER 31  
#define MAX_PAYLOAD 1024  /* maximum payload size*/  

struct sockaddr_nl src_addr, dest_addr;  
struct nlmsghdr *nlh = NULL;  
struct iovec iov;  
int sock_fd;  
struct msghdr msg;  

void main()  
{  
    sock_fd=socket(PF_NETLINK, SOCK_RAW, NETLINK_USER);  
    if(sock_fd<0)  
        return -1;  

    memset(&src_addr, 0, sizeof(src_addr));  
    src_addr.nl_family = AF_NETLINK;  
    src_addr.nl_pid = getpid();  /* self pid */  
    /* interested in group 1<<0 */  
    bind(sock_fd, …
Run Code Online (Sandbox Code Playgroud)

c linux-device-driver linux-kernel netlink

45
推荐指数
3
解决办法
6万
查看次数

nl80211库和cfg80211如何工作?

我想详细了解如何工作nl80211cfg80211工作.功能流程,如何nl80211使用网络工具,如互动wpa_supplicant,iw.

Plz建议我参考一些有用的链接或书籍.

c linux-device-driver linux-kernel wifi 802.11

43
推荐指数
4
解决办法
4万
查看次数