linux驱动设备节点失踪之迷雾围城

news2024/11/24 17:18:50

前言

        参考文章:无法生成设备节点

        最后证实:是bootargs配置错误导致的,不过中间发现也是可以通过mdev -s间接解决的,算是学习经验吧。

        misc驱动框架是linux内核驱动中最简单实用的框架了。记录一下今天调试misc驱动的问题。misc驱动主要就是注册和注销函数,还有struct miscdevice结构体的初始化赋值,如果注册成功,会在/proc/misc文件中看到新注册的主设备号是10,次设备号如果配置MISC_DYNAMIC_MINOR,那就是随机分配的。

        先引入一个问题,我的根文件系统使用的mdev,在udev机制的根文件系统的我的驱动是能正常工作的。

然后,创建的misc设备在/dev目录下看不到。我通过两个地方确认了该设备确实注册成功了

/sys/class/misc目录 

        该目录中确实有我的文件:video1,可能有人会疑问了,这个不是V4L2驱动框架中的摄像头吗?没错,只不过,我将V4L2框架重写了o(* ̄︶ ̄*)o,还有点小骄傲,不存在的,咱很谦虚的。

root@host:/sys/class/misc# ls
apm_bios            memory_bandwidth    rfkill
autofs              mxc_asrc            ubi_ctrl
cpu_dma_latency     network_latency     video1
fuse                network_throughput  watchdog
hw_random           ov9281              wsinput
loop-control        pxp_device          wskey
root@host:/sys/class/misc#

查看/proc/misc文件

mymisc前面的52表示次设备号。

root@host:~# cat /proc/misc
 52 video1
 53 ov9281
 54 wskey
 55 wsinput
 56 ubi_ctrl
 57 pxp_device
 58 memory_bandwidth
 59 network_throughput
 60 network_latency
 61 cpu_dma_latency
 62 mxc_asrc
130 watchdog
237 loop-control
183 hw_random
134 apm_bios
229 fuse
235 autofs
 63 rfkill
root@host:~#

然后我使用mknode /dev/mymisc c 10 52

root@host:~#mknod /dev/video1 c 10 52
root@host:~# ls /dev/video1 -ls
     0 crw-rw-rw-    1 root     root       10,  52 Jan  1 00:10 /dev/video1
root@host:~#

        测试以后发现,这样可行,但是每次mknod显示是不行的,所以要研究mdev为什么不支持设备节点创建?到底是哪里配置出了问题。

一 dev节点的原理

        dev目录下的节点不是由驱动本身生成的,是由文件系统中的工具mdev生成的;当系统启动后,加载完内核再去加载文件系统,执行文件系统中的脚本,脚本会执行mdev -s命令(即执行mdev程序,在博文《设备模型》中有说到,此处不赘述),该命令会去遍历/sys/class下的所有文件,寻找所有名为dev的文件,dev文件保存了每个驱动的主设备号、次设备号,以及驱动名。

        这段文件写的太好了。重启设备,然后insmod完驱动以后,执行mdev -s命令,然后设备节点出现了。

root@host:/sys/class/misc# mdev -s
root@host:/sys/class/misc# ls /dev/video1 -ls
     0 crw-rw----    1 root     root       10,  52 Jan  1 00:03 /dev/video1
root@host:/sys/class/misc#

       假如将这个作为解决方案使用的话,那就在应用程序中执行如下语句:

system("/sbin/mdev -s");

NAME
       system - execute a shell command

SYNOPSIS
       #include <stdlib.h>

       int system(const char *command);

测试小代码:

#include <stdlib.h>
#include <stdio.h>

#define DEBUG_INFO(format,...)  printf("line=%d:"format"\n",\
    __LINE__,##__VA_ARGS__)

int main(int argc,char *argv[])
{
    int ret;
    char *cmd;
    cmd = "/bin/ls -ls /dev/video*";
    ret = system(cmd);
    DEBUG_INFO("cmd = %s,ret = %d,%s",cmd,ret,ret == 0?"ok":"error");
    cmd = "/sbin/mdev -s";
    ret = system(cmd);
    DEBUG_INFO("cmd = %s,ret = %d,%s",cmd,ret,ret == 0?"ok":"error");
    cmd = "/bin/ls -ls /dev/video*";
    ret = system(cmd);
    DEBUG_INFO("cmd = %s,ret = %d,%s",cmd,ret,ret == 0?"ok":"error");

    return 0;
}

编译:

arm-linux-gnueabihf-gcc mdevs.c -o mdevs

执行结果:这勉强算是解决的问题吧。

root@host:~# ./mdevs
line=12:cmd = /sbin/mdev -s,ret = 0,ok
     0 crw-rw----    1 root     root       81,   0 Jan  1 00:00 /dev/video0
     0 crw-rw----    1 root     root       10,  52 Jan  1 00:01 /dev/video1
line=15:cmd = /bin/ls -ls /dev/video*,ret = 0,ok
root@host:~#

二 挂载到NFS

        我前面测试使用的是ramdisk,后来我将这个根文件系统挂载到了NFS上,这时,奇迹出现了,insmod xxx.ko后,/dev/video1出现了,经过排查后发现是bootargs的问题。原来的写法:这种写法,也能正常启动,为什么,因为mmcblk1p2分区也有一个根文件系统。

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'

挂载/dev/mmcblk1p2到//mmcblk1p2目录:mount -t ext4 /dev/mmcblk1p2  /mmcblk1p2 

正确的写法:

setenv bootargs 'console=ttymxc0,115200 root=/dev/ram0 rootfstype=ext2 rootwait rw'

三 假如这时还是不行

        参考 无法生成设备节点 一文。可能是UEVENT_HELPER_PATH没配置。在我的内核.config文件中搜索这个宏:如下所示:

lkmao@ubuntu:~/imx/linux/linux-imx$ grep -rn UEVENT_HELPER_PATH .config
879:CONFIG_UEVENT_HELPER_PATH=""
lkmao@ubuntu:~/imx/linux/linux-imx$

        虽然我的问题并非如此,但是我还是准备配置它,看看配置后的运行状态。make menuconfig ,然后搜索UEVENT_HELPER_PATH

注意配置树的层次关系

 

 

 保存配置,编译内核,然后启动内核,看看系统会不会出问题。

... ...

好了系统启动了,表面上状态和配置之前一样。

小结

        我以为的问题,并不是我以为的问题,这个就是知识的局限性,学海无涯苦作舟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

笔试强训48天——day19

文章目录一. 单选1.二分查找的时间复杂度&#xff08;&#xff09;2. 有一个单向链表中有一个A、B两个相邻元素&#xff0c;有一个指针p指向元素A&#xff0c;现将一个指针r指向的S元素要插入3. 双向链表中有两个指针域,llink和rlink分别指向前驱和后继,设p指向链表中的一个结点…

spark底层原理理解--高级进阶

概念概念理解和解释备注窄依赖窄依赖指1个父RDD分区数据只被1个子RDD的分区使用&#xff0c;即一对一或多对一的关系。 分为两种映射情况&#xff1a;一个父RDD的分区对应于一个子RDD的分区&#xff0c;或者多个父RDD的分区对应于一个子RDD的分区。 1个子RDD的分区对应于1个父R…

深入理解JS作用域链与执行上下文

变量提升&#xff1a; 变量提升&#xff08; hoisting &#xff09;。 我可恨的 var 关键字&#xff1a; 你读完下面内容就会明白标题的含义&#xff0c;先来一段超级简单的代码&#xff1a; <script type"text/javascript">var str Hello JavaScript hoi…

【K8S】初探Kubernetes

文章目录什么是容器编排什么是KubernetesK8s 和 Docker 之间的关系Kubernetes的整体架构Master 里的组件构成Work Node 里的组件构成总结K8s 组件工作流程结束语什么是容器编排 在《Docker 进阶指南&#xff08;下&#xff09;- 使用Docker Compose编排多个容器》文章当中&…

文件缓冲区

本期介绍&#x1f356; 主要介绍&#xff1a;什么是文件缓冲区&#xff0c;文件缓冲区存在的意义是什么&#xff0c;文件缓冲区的证明&#x1f440;。 一、什么是文件缓冲区 每一个正在使用的文件&#xff0c;操作系统都会为其在内存中开辟一块区域&#xff0c;称之为&#xff…

【数据结构】带头双向链表的简单实现

目录前言链表的实现List.hList.c**ListCreate()****LTInit()****ListPushBack()****ListPopBack()****ListPrint()****ListPushFront()****ListPopFront()****ListFind()****ListInsert()****ListErase()**ListErase()test.c前言 该篇博客主要讲解了带头双向链表的实现和一些细…

Cadence Allegro DXF结构图的导入详细教程

很多消费类板卡的结构都是异形的&#xff0c;由专业的CAD结构工程师对其进行精准的设计&#xff0c;PCB布线工程师可以根据结构工程师提供的2D图&#xff08;DWG或DXF格式&#xff09;进行精准的导入操作&#xff0c;在PCB中定义板型结构。 同时&#xff0c;对于一些工控板或者…

Ajax--跨域与JSONP--案例-淘宝搜索

要实现的UI效果 获取用户输入的搜索关键词 为了获取到用户每次按下键盘输入的内容&#xff0c;需要监听输入框的 keyup 事件&#xff0c;示例代码如下&#xff1a; // 监听文本框的 keyup 事件$(#ipt).on(keyup, function() {// 获取用户输入的内容var keywords $(this).val…

支撑向量机

1、支持向量机算法原理 支持向量机&#xff08;Support Vetor Machine&#xff0c;SVM&#xff09;由Vapnik等人于1995年首先提出&#xff0c;在解决小样本、非线性及高维模式识别中表现出许多特有的优势&#xff0c;并推广到人脸识别、行人检测和文本分类等其他机器学习问题中…

HTML期末作业:基于html+css+javascript+jquery实现古诗词网页 学生网页设计作品 web前端开发技术 web课程设计 网页规划与设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

初学C语言有什么建议?

什么&#xff1f;开玩笑&#xff0c;新手学C语言&#xff1f; 确实新手不学C语言学什么呢&#xff1f;为什么这么推荐新手学C语言呢具体看看下面的解释吧&#xff1f; C的重要性 我总结了网上很多人的说法如下&#xff1a; C语言是计算机界公认的有史以来最重要的语言。C语…

R语言偏相关和典型相关

本文首发于公众号&#xff1a;医学和生信笔记&#xff0c;完美观看体验请至公众号查看本文。 文章目录偏相关&#xff08;partial correlation&#xff09;偏相关散点图典型相关&#xff08;Canonical Correlation&#xff09;使用R语言实现偏相关分析和典型相关分析&#xff0…

一个对C#程序混淆加密,小巧但够用的小工具

对于我们程序员来说&#xff0c;平常开发的桌面应用程序&#xff0c;如果不进行一定程度的加密、混淆&#xff0c;是很容易通过反编译手段进行破解的&#xff0c;特别是一些商业用途的C#软件&#xff0c;更是容易被破解。 所以今天给大家推荐一个对C#程序加密混淆项目&#xf…

脱离CRUD苦海 !性能优化全栈小册来了!

性能优化 随着互联网的高速发展&#xff0c;互联网行业已经从IT时代慢慢步入到DT时代。对于Java程序员的要求越来越高&#xff0c;只是单纯的掌握CRUD以不足以胜任互联网公司的相关职位&#xff0c;大量招聘岗位显示&#xff1a;如果是面试中高级的Java岗&#xff0c;基本上都…

flex1时内容溢出

目标效果&#xff1a;右边黄色部分填充减去红色部分的剩余部分 原理: flex: 1 代码&#xff1a; <div class"box"><div class"inner-left"></div><div class"inner-right"><span class"inner-right-content&…

RK3568平台开发系列讲解(NPU篇)让 NPU 跑起来

🚀返回专栏总目录 文章目录 一、在 Android 系统中使用 NPU1.1、下载编译所需工具1.2、修改编译工具路径1.3、更新 RKNN 模型1.4、编译 demo沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍如何让NPU跑起来。 一、在 Android 系统中使用 NPU 下载 rknpu2 …

Hadoop的eclipse搭建(客观莫划走,留下来看一眼(适用人群学生初学,其他人看看就行))

前言&#xff1a;Hadoop的eclipse搭建是建立在Hadoop的安装之后进行的&#xff0c;因为Linux上的Hadoop和Windows上的Hadoop版本要求一致&#xff0c;不一致可能会出现某些问题 准备工作&#xff1a;Java的安装包、eclipse的安装包、Hadoop的包&#xff08;Windows的Hadoop安装…

基于Socket编程下 实现Linux-Linux、Linux-Windows udp通信

文章目录一、通信实现二、Linux-Linux1. 服务器 Server2. 客户端 Client三、Linux-Windows1. 服务器 Linux_Server2. 客户端 Windows_Client程序源码一、通信实现 1. Linux-Linux 在虚拟机下开启俩个终端&#xff0c;分别运行服务器和客户端程序(服务器运行在前&#xff0c;客…

栈的简单实现及应用

栈的简单实现及其应用什么是栈&#xff1f;栈的分类栈的数据结构栈的基本操作栈的初始化栈的销毁入栈操作出栈和栈空的判断获取栈顶元素获取栈的元素个数头文件总结栈的应用什么是栈&#xff1f; 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除…

【毕业设计】垃圾邮件(短信)分类算法研究与实现 - 机器学习

文章目录1 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后1 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#…