
驱动
文章平均质量分 60
Wang20122013
喷泉有了压力才优美,滴水有了坚持才有了穿石。顶住压力,享受压力,坚持奋斗。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
sas控制器驱动之设备管理
通过此文,了解一个控制器需要管理哪些设备,后续在此基础上可以进一步学习掌握驱动及内核存储上层部分的操作流程。1.内核模块接口说明httpshttpshttpshttps。转载 2022-07-15 17:31:33 · 1566 阅读 · 0 评论 -
[已解决]Ubuntu安装libssl-dev失败
ygu@guyongqiangx:~$ sudo apt-get install libssl-devReading package lists... DoneBuilding dependency tree Reading state information... DoneSome packages could not be installed. This may mean that you haverequested an impossible situation or if yo转载 2022-05-18 10:05:28 · 2570 阅读 · 0 评论 -
一个linux驱动链表例子
Free_list初始化struct list_head free_list;struct scsiio_tracker *scsi_lookup;unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)功能:以gfp_mask的方式分配2^order个物理页面gfP_mask:分配的方式,指出如何分配在哪分配如GFP_KERNELorder:分配2^order个页面返回值:返回分配的第一个页的逻辑地址fre原创 2022-04-08 17:43:37 · 317 阅读 · 0 评论 -
scsi eh(scsi error handle)处理流程
内核文档Documentation/scsi/scsi_eh.txtscmd为scsi cmd的简称。scsi_eh_scmd_add()作用:将发生error的scmd加入到eh中。发生error有两种情况:1).scmd执行完成了,但是结果为error。2).scmd执行超时了,即一直没有返回,发生了timeout。scsi_eh_scmd_add()在两处被调用:1).scsi_times_out函数 => scmd超时处理函数,将timeout的scmd加入eh2).scsi转载 2022-03-31 10:05:57 · 2171 阅读 · 0 评论 -
如何根据lspci找到HBA在sysfs中的位置
1 基础知识lspci和sysfs对于pci的编号都是基于<domain, bus, device, 和 function>的PCI系统示意图2 开始展示如何找到对应关系图中可以看到HBA的bus是1,说明他不是直接连接到PCI bridge(00:01:0),bridge(00:01:0)会创建一个总线bus1,然后下面挂了HBA(01:00:00)所以其在sysfs中的位置为/sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0原创 2022-03-25 17:41:38 · 458 阅读 · 0 评论 -
vmlinux zImage uImage 是什么,如何区分
vmlinux是内核文件,zImage是一般情况下默认的压缩内核映像文件,压缩vmlinux,加上一段解压启动代码得到。而uImage则是使用工具mkimage对普通的压缩内核映像文件(zImage)加工而得。它是uboot专用的映像文件,它是在zImage之前加上一个长度为64字节的“头”,说明这个内核的版本、加载位置、生成时间、大小等信息;其0x40之后与zImage没区别。其实就是一个自动跟手动的区别,有了uImage头部的描述,u-boot就知道对应Image的信息,如果没有头部则需要自己手动.原创 2022-02-17 13:57:13 · 571 阅读 · 0 评论 -
RPM包管理常用命令和小知识
1 常用命令如何查看已经安装的rpm包?yum list installed |grep xxx如何查看rpm包里打包了什么?rpm -qpl packetname.rpm如何安装srpm?2 小知识原创 2022-01-10 10:48:35 · 1168 阅读 · 0 评论 -
如何下载Centos的内核源代码
1 源代码的官网:http://vault.centos.org/2 进入内核版本内部进入os/Source/Spackage 找到kernel_xxx.rpm里面解压后就有源代码。原创 2021-10-18 14:41:16 · 2185 阅读 · 0 评论 -
scsi 驱动的host channel id lun在哪里看
涉及到两个结构体1.scsi_device 里包含channel,id,lun2.Scsi_Host 里包含host_nostruct scsi_device { struct Scsi_Host *host; struct request_queue *request_queue; /* the next two are protected by the host->host_lock */ struct list_head siblings; /* list of a.原创 2021-12-29 09:43:35 · 777 阅读 · 0 评论 -
Linux中磁盘扫描流程描述
通常SCSI总线适配器作为PCI设备的形式存在,其在计算机体系结构中的位置如下图所示:在系统初始化时会扫描系统PCI总线,由于scsi host adapter挂接在pci总线上,因此会被pci扫描软件扫描得到,并且生成一个pci device(PDO)。然后扫描软件需要为该pci device加载相应的驱动程序。在linux系统中,遍历pci bus上存在的所有驱动程序,检查是否有符合要求的驱动程序存在,这里假设scsi host是marwell的设备,那么,如果存在marwell提供的scsi ho转载 2021-12-23 11:13:35 · 1151 阅读 · 0 评论 -
Linux IO系统分析(在Linux用户空间,有三种方式提交对SCSI设备请求到通用块层)
一、概述Linux内核中SCSI子系统由SCSI上层,中间层,底层驱动模块三部分组成,负责管理SCSI资源和处理其他子系统,如文件系统,提交到SCSI子系统中的IO请求。因此,理解SCSI子系统的IO处理机制对理解整个SCSI子系统至关重要,同时也有助于理解整个Linux内核的IO处理机制。二、SCSISCSI设备访问请求的提交分为两个步骤:用户空间提交请求到通用块层通用块层提交块请求到SCSI子系统 用户空间提交请求到同样块层: 在Linux用户空间,有三种方式提交对SCSI设备请转载 2021-12-23 10:46:25 · 859 阅读 · 0 评论 -
Linux Scsi子系统框架介绍(可以知道host target channel id lun的关系)
scsi是一套古老的协议,至今它还在一些硬件中存在和使用,例如基于sata协议的ssd硬盘,ufs器件等。因为scsi命令已经标准化,因此scsi子系统也成为了linux kernel众多子系统中的一份子。这篇文章以抽象硬件模型,引申出linux scsi子系统的设计框架。一、硬件建模以下描述:硬件层面的总线或者控制器,在文档里称之为总线或者控制器;硬件层面的设备在文档里称之为设备。软件层面的总线,在文档里称之为bus,对应着structbus_type类型;软件层面的设备称之为device,对转载 2021-12-22 17:46:16 · 5803 阅读 · 1 评论 -
驱动private_data的使用
转载 2021-12-20 17:58:13 · 512 阅读 · 0 评论 -
杂项设备(misc device)和字符设备(char device)区别
杂项设备(misc device)杂项设备也是在嵌入式系统中用得比较多的一种设备驱动。在 Linux 内核的include/linux目录下有Miscdevice.h文件,要把自己定义的misc device从设备定义在这里。其实是因为这些字符设备不符合预先确定的字符设备范畴, 所有这些设备采用主编号10 ,一起归于misc device,其实misc_register就是用主标号10调用register_chrdev()的。也就是说,misc设备其实也就是特殊的字符设备,可自动生成设备节点。字符设备转载 2021-12-20 13:38:14 · 3344 阅读 · 0 评论 -
__KERNEL__ macro
The KERNEL macro is defined because there is programs (like libraries) that include kernel code and there is many things that you don’t want them to include. So most modules will want the__KERNEL__ macro to be enabled.When you compile your kernel, KERNEL转载 2021-12-20 10:49:03 · 227 阅读 · 0 评论 -
linux驱动之字符设备之异步通知 fasync_struct
异步通知的全称是"信号驱动的异步IO",通过"信号"的方式,放期望获取的资源可用时,驱动会主动通知指定的应用程序,和应用层的"信号"相对应,这里使用的是信号"SIGIO"。操作步骤是应用层程序将自己注册为接收来自设备文件的SIGIO信号的进程驱动实现相应的接口,以期具有向所有注册接收这个设备驱动SIGIO信号的应用程序发SIGIO信号的能力。驱动在适当的位置调用发送函数,应用程序即可接收到SIGIO信号。整个机制的框架:应用层接收SIGIO和其他信号一样,应用层需要注册一个信号处理函数,注册的转载 2021-12-17 17:45:19 · 997 阅读 · 0 评论 -
kbuild的理解
https://blog.csdn.net/FJDJFKDJFKDJFKD/article/details/88548273https://www.linuxjournal.com/content/kbuild-linux-kernel-build-systemhttps://blog.csdn.net/wxywxywxy110/article/details/780497981.make menuconfig的界面选线来自各个文件的Kconfig文件2.在编写自己的驱动模块的时候,makefile原创 2021-12-16 17:27:24 · 438 阅读 · 0 评论 -
移植mpt3sas驱动
Fullnat的lvs内核在华为的服务器上正常运行,但在浪潮的服务器上却报如下错误,不能正常启动。[ 103.5652276 ] Kernel panic - not syncing: Attempted to kill init!而6.5版本的红帽官方内核是能正常启动的。经排查,发现是浪潮服务器主板上用了SAS卡,但Fullnat的lvs内核中因为比较老,没有这个驱动(mpt3sas)红帽内核中:lsmod | grep mpt3sas 有结果find /home/lzt/Downl转载 2021-12-16 17:22:12 · 1736 阅读 · 1 评论 -
linux驱动: 如何向模块传递参数, module_param和module_param_array
如何向模块传递参数,Linux kernel 提供了一个简单的框架.module_param(name, type, perm); name 既是用户看到的参数名,又是模块内接受参数的变量; type 表示参数的数据类型,是下列之一:byte, short, ushort, int, uint, long, ulong, charp, bool, invbool; perm 指定了在sysfs中相应文件的访问权限。访问权限与linux文件访问权限相同的方式管理,如0644,或使用stat转载 2021-12-15 15:23:57 · 526 阅读 · 0 评论 -
sysfs Linux-DEVICE_ATTR()介绍及使用示例
1.介绍使用DEVICE_ATTR,可以实现驱动在sys目录自动创建文件,我们只需要实现show和store函数即可.然后在应用层就能通过cat和echo命令来对sys创建出来的文件进行读写驱动设备,实现交互.2.DEVICE_ATTR()宏定义DEVICE_ATTR()定义位于include/linux/device.h中,定义如下所示:#define DEVICE_ATTR(_name, _mode, _show, _store) \ struct device_attribute d转载 2021-12-15 11:29:52 · 9418 阅读 · 3 评论 -
select、poll、epoll之间的区别总结[整理]
select、poll、epoll之间的区别总结[整理] select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。关于这三种IO多路复用的用法,前面三篇总结转载 2021-12-15 10:57:59 · 265 阅读 · 0 评论 -
select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型: #include <sys/time.h> #include <unistd.h> int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout);参数maxfd是需要监视的最大的文件描转载 2021-12-14 18:04:56 · 476 阅读 · 0 评论 -
两种办法解决 make: Warning: File “xxx“ has modification time yyy s in the future 的问题
一、引言最近在工作中,在本地将代码文件上传到远端服务器,在远端服务器进行 make 编译的时候,会报这样的错:make: Warning: File "xxx" has modification time yyy s in the future其中 xxx 是某一个文件的名称,yyy 是一个比较长的时间倒计时,以秒为单位。经过搜索资料,我得知,这个问题是因为你本地修改了文件,上传到服务端的时候,修改文件的时间比服务端系统的时间还要晚,导致 make 指令一直在等待到达修改文件的时间(也就是未来的某转载 2021-11-30 10:33:29 · 6238 阅读 · 2 评论 -
如何向Linux内核提交驱动
当Linux驱动程序开发到一定阶段,向kernel.org提交代码是一个很好的选择。对于很多没有向上游提交过代码的开发者来说,还是有很多疑问需要解决的。比如,究竟我们向哪里提交驱动程序?提交时我们的代码应该处于什么状态?提交的过程又如何呢?向哪里提交inux staging tree是Greg KH建立的用于提交驱动程序的git仓库。我们可以把staging tree看作是代码进入mainline内核之前的一个预科班,新增的驱动程序首先需要放到这里供社区review和测试。Staging tree是 G转载 2021-10-09 18:14:04 · 799 阅读 · 0 评论 -
linux IO Block layer 解析
早期的 Block 框架是单队列(single-queue)架构,适用于“硬件单队列”的存储设备(比如机械磁盘),随着存储器件技术的发展,支持“硬件多队列”的存储器件越来越常见(比如 NVMe SSD),传统的单队列架构也因此被改成了多队列(multi-queue)架构。早在 3.13 内核就已经加入了多队列代码,但是还不太稳定,经过多年的发展 multi-queue 越来越稳定,linux 5.0+ 已经默认使用 multi-queue。本篇文章介绍 Block 层框架及调度器相关知识,让读者对 Bloc转载 2021-09-30 11:06:42 · 1151 阅读 · 0 评论 -
Linux 块设备之Block Layer层架构演变
前言Block Layer层在整个I/O中负责承上启下,上接文件系统,下接块驱动。一、1.0版本首先我们来了解几个重要的数据结构1.1 biobio代表了一次I/0请求,代表一个块设备的一个扇区或者多个连续扇区的数据请求,扇区是块设备的最小访问单元,bio是文件系统发给Block Layer层的。1.2 requestrequest代表块设备可以处理的一次任务单元,一个request由一个bio或者多个扇区相连的bio组成。1.3 架构图二、2.0版本目前只支持单个进程访问块设备。为转载 2021-09-30 10:26:47 · 651 阅读 · 0 评论 -
bio,request,request_queue的关系
通用块层的核心数据结构称为bio描述符,它描述了块设备的io操作。每一个bio结构都包含一个磁盘存储区标识符(存储区中的起始扇区号和扇区数目)和一个或多个描述与IO操作相关的内存区段(bio_vec数组)bio结构中的字段/* * main unit of I/O for the block layer and lower layers (ie drivers and * stacking drivers) */struct bio { struct bio *bi_next; /* req转载 2021-09-30 09:48:30 · 937 阅读 · 0 评论 -
Multi-queue 架构分析
Linux上传统的块设备层(Block Layer)和IO调度器(如cfq)主要是针对HDD(hard disk drivers)设计的。我们知道,HDD设备的随机IO性能很差,吞吐量大约是几百IOPS(IOs per second),延迟在毫秒级,所以当时IO性能的瓶颈在硬件,而不是内核。但是,随着高速SSD(Solid State Disk)的出现并展现出越来越高的性能,百万级甚至千万级IOPS的数据访问已成为一大趋势,传统的块设备层已无法满足这么高的IOPS需求,逐渐成为系统IO性能的瓶颈。为了适转载 2021-09-29 13:39:23 · 891 阅读 · 0 评论 -
Linux内核io体系之磁盘io
架构图前言Linux I/O体系是Linux内核的重要组成部分,主要包含网络IO、磁盘IO等。基本所有的技术栈都需要与IO打交道,分布式存储系统更是如此。本文主要简单分析一下磁盘IO,看看一个IO请求从发起到完成到底经历了哪些流程。名词解释Buffered I/O:缓存IO又叫标准IO,是大多数文件系统的默认IO操作,经过PageCache。Direct I/O:直接IO,By Pass PageCache。offset、length需对齐到block_size。Sync I/O:同步IO,转载 2021-09-24 09:59:41 · 1197 阅读 · 0 评论 -
当nvme中只有一个中断的时候队列处理方式
当只有一个中断源的时候,nvmehost会只申请一个admin 一个io,并且这两个队列的中断源都是0,然后来中断后会枚举admin cq和io cq中的cq data看哪个有效就处理哪个。原创 2021-09-23 10:19:43 · 368 阅读 · 0 评论 -
PCIE MSIX的中断个数的协商和pendding的理解
1中断个数的协商Table Size表示设备(例如nvme ssd)支持的MSIX中断个数,但是host或者driver需要几个哪?需要driver进行配置msix的是来决定,例如nvme ssd支持12个,但是driver配置了前4个msix entry地址不一样,后面的8个地址全和第一个地址一样,说明driver只用了4个msix entry.一般情况下create sq也会只有4个。padding当msix中断被mask掉后,设备(例如nvme ssd)发送msix的时候不能发送memory原创 2021-04-16 17:49:01 · 775 阅读 · 0 评论 -
C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)
__attribute__选项 我们可以按照自己设定的对齐大小来编译程序,GNU使用__attribute__选项来设置,比如我们想让刚才的结构按一字节对齐,我们可以这样定义结构体 struct stu{ char sex; int length; char name[10]; }attribute ((aligned (1))); struct stu my_stu; 则sizeof(my_stu)可以得到大小为15。 上面的定原创 2021-04-14 17:28:31 · 441 阅读 · 0 评论 -
如何更改设备驱动的参数-安排!(module_param和)MODULE_PARM_DESC
一般用户态传递参数是通过main函数,第一个参数表示args个数,即argc,第二个参数表示具体的参数。在kernel态,无法通过这样的方式传递参数,一般使用module_param的方式,步骤如下:1.使用module_param指定模块的参数2.加载driver时给模块传递参数source code如下:#include <linux/module.h>#include <linux/init.h>#include <linux/kernel.h>#i转载 2021-01-25 16:45:26 · 786 阅读 · 0 评论 -
linux c中指针作为函数返回值-安排
static struct fw_event_work *alloc_fw_event_work(int len){ struct fw_event_work *fw_event; fw_event = kzalloc(sizeof(*fw_event) + len, GFP_ATOMIC); if (!fw_event) return NULL; kref_init(&fw_event->refcount); return fw_event;}说明这个函数返回值是原创 2021-01-01 20:45:38 · 148 阅读 · 0 评论 -
rmmod命令卸载驱动后重启后为什么驱动还在? 安排!
1原因insmod是临时加入系统的,重启后会被消除。rmmod是临时卸载的,重启后驱动还在2 linux开机时驱动的加载流程Linux系统开机后,首先加载initramfs文件中包含的驱动程序,如果相应的设备对应的驱动不在initramfs文件包含范围内,那么会去硬盘中存储的驱动库中去寻找匹配的驱动进行加载;硬盘中驱动库的位置即为:/lib/modules/“uname -r”/;所以相应的驱动只要在硬盘的驱动库或者initramfs中至少存在一个就可以正常加载,一旦在initramfs中加载成原创 2020-12-30 16:58:20 · 2604 阅读 · 0 评论 -
insmod加载驱动后开机重启后没有驱动的解决方法
为了是在命令行中执行insmod命令安装的驱动能在重启之后还有的解决方法大致有一下两种方法:(1)直接编译内核,把想安装的驱动在编译内核的时候给编译进去,这种方法比较麻烦,花的时候也比较的多,一般不采用这种方法(这种方法网上有很多资料可以参考)。(2)这种方法比较简单:就是在启动脚本中加载模块,这样每次开机启动都自动加载相应的驱动模块。具体的方式如下: 在文件/etc/rc.local中加载你想要的模块程序即可比如我想再系统启动的时候自动给我完成:卸载r8169驱动、然后安装r8168驱动、同时转载 2020-12-30 13:20:54 · 2265 阅读 · 0 评论 -
ubuntu下如何查看pci设备的VID,PID和识别的速度,lane数目
原创 2020-12-18 18:16:40 · 3191 阅读 · 1 评论