自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(612)
  • 收藏
  • 关注

原创 在驱动中,利用Makefile增加宏定义

即在驱动源代码当中添加了DEBUG宏定义。即在驱动源代码当中添加了DEBUG宏定义。可以通过增加打印进行验证。可以通过增加打印进行验证。

2024-03-25 16:59:20 182

原创 ubuntu环境下openssl库的简单使用

编译:gcc aes.c -lssl -lcrypto -o aes。

2024-02-22 20:46:43 616

原创 linux deadline调度算法源码阅读记录

内核版本:3.13deadline-iosched.c#include <linux/kernel.h>#include <linux/fs.h>#include <linux/blkdev.h>#include <linux/elevator.h>#include <linux/bio.h>#include <linux/module.h>#include <linux/slab.h>#include &

2023-12-26 10:43:03 154

原创 linux block noop调度算法源码阅读记录

【代码】linux block noop调度算法源码阅读记录。

2023-12-21 15:19:32 111

原创 linux block-plug形式的io合并代码分析

具体的合并代码就不分析了,比较重要的是,合并过程当中还有考虑一些值的限制情况,在符合这些值的限制下,才会进行合并,如果合并不了,则要重新分配一个request了。

2023-12-15 16:27:01 123

原创 struct queue_limits结构体参数学习

参考:内核版本:4.19.1内核提供了相关的API接口去设置这些相关的参数,在blk-settings.c文件。

2023-12-05 18:02:07 124

原创 linux内核bio子系统学习记录一:

主要源码目录 :block/bio.c include/linux/bio.h内核版本:4.19.1这部分先总结下bio子系统的初始化部分,后续再总结bio的申请以及释放,还有其它api的使用等介绍。bio的涉及到频繁的内存申请以及释放,包括bio结构体本身以及它比较重要的成员bi_io_vec*的内存申请和释放,所以初始化部分主要是相关的内存池的初始化,用于后面bio和bi_io_vec的内存申请和释放。defined。

2023-12-03 16:37:14 205

原创 blk_mq_init_queue函数学习记录

blk-mq编程,主要要调用两个函数进行初始化工作,blk_mq_init_queue这是第二个。该函数先是申请了struct request_queue结构,这个请求队列后面用于赋值给磁盘那个结构体的相应成员。

2023-11-24 11:04:05 226

原创 linux 3.13版本nvme驱动阅读记录四

调用完以后在dev目录下也可以看到相关的设备节点了。

2023-11-08 17:09:26 264

原创 linux 3.13版本nvme驱动阅读记录三

在调用完这个函数以后,就可以在dev目录下看到响应的设备了。

2023-11-08 16:54:43 175

原创 linux 3.13版本nvme驱动阅读记录二

内核3.13版本。该函数主要做了4减事情。1:nvme_dev_map,主要就是pci bar 那一套编程套路2:管理队列的配置3:dev_list?4:io队列的配置。

2023-11-06 09:17:10 280

原创 linux 3.13版本nvme驱动阅读记录一

2:dev->entry申请内存,大小是num_possible_cpus() * sizeof(*dev->entry),后面用于保存向量的相关信息,因为nvme是支持多队列的,所以后面可以将队列和特定的中断向量进行绑定,这个后面遇到相关代码再说。5:nvme_set_instance函数的调用,里面怎么实现的不用管,主要知道调用完它以后,dev->instance得到一个值就行了,这个值用于磁盘的命名,比如在dev目录下看到的/dev/nvmexxx就和这个值有关系。

2023-11-02 17:33:22 326

原创 简单的块设备驱动例程

代码在linux3.13版本下可以编译通过,装载驱动以后,可以用fio工具进行读写测试。

2023-10-16 15:21:39 143

原创 scsi READ CAPACITY (10)命令总结

READ CAPACITY(10)命令(参见表119)请求设备服务器将描述直接访问块设备的容量和介质格式的8字节参数数据传输到数据缓存中。这个命令可以被处理,就好像它有一个HEAD OF QUEUE任务属性。如果逻辑单元支持保护信息,应用客户端应使用READ CAPACITY(16)命令,而不应使用theREAD CAPACITY(10)命令。

2023-10-12 18:06:21 366

原创 scsi MODE SENSE(6)命令 和 MODE SENSE(10)命令总结

MODE SENSE(6)命令(参见表73)为设备服务器向应用程序客户机报告参数提供了一种方法。它是MODE SELECT(6)命令的补充命令。执行MODE SENSE(6)命令的设备服务器也应执行MODE SELECT(6)命令。

2023-10-12 16:58:23 602

原创 nvme prp模型代码处理流程分析

一般来说,如果sge只有1个时,那么只需要在下发的nvme rw命令时填写prp1字段的值,这个值是64bit的,所以这个64bit的字段即需要有dma的地址,也需要有传输的长度,这个64bit所以它需要一些特定的bit记录地址,一些特定的bit记录长度,同理prp2也是。2:需要多个prp时,因为prp_list是只记录地址的,但是有时候一个IO请求时,数据量没那么巧怎么办?1:怎么知道prp2记录的是数据的地址还是prp_list的起始地址?最后看一下,关于选择sgl还是prp的依据。

2023-09-22 09:35:56 207

原创 nvme_queue_rq函数分析一

先说结论,这个是为了后面通过pool申请内存时记录这些内存用的,因为这些内存地址是64位的所以这里要用 sizeof(__le64 *) 乘以 nvme_pci_npages_sgl(nseg),至于nvme_pci_npages_sgl(nseg)这个函数不多说了,自己看看也很容易理解,这里要说的是NVME_MAX_KB_SZ和NVME_MAX_SEGS值的大小是可以调整的。接着先看nvme_pci_setup_sgls函数,然后在看nvme_pci_setup_prps函数。这个值是怎么来的呢?

2023-09-21 18:07:24 248

原创 nvme各模块间的关系总结

其中,在nvme-core.ko当中,trace.c,multipath.c, multipath.c fault_inject.c是可选的。目录:driver/host/nvme/makefile。

2023-09-20 09:53:47 149

原创 中断和cpu的绑定,驱动代码实现

最后通过irq_set_affinity_hint函数,将cpumask设置到中断向量号里,这样就完成了,中断和特定cpu的绑定。所以,zalloc_cpumask_var函数是为cpu_mask变量申请内存的,如果cpumask_set_cpu(1, cpu_mask);其中cpu_mask变量的类型为cpumask_var_t。那么cpu_mask的值变为2,,也就是第1个bit是1。而cpumask_set_cpu函数,来看看怎么使用吧。该函数调用完以后,cpu_mask变量的值为0.

2023-09-02 12:26:00 438

原创 linux scatterlist阅读三

函数实现比较复杂,还涉及了struct sg_mapping_iter 结构体,这里比较重要的是skip参数,是指拷贝时跳过的字节数。

2023-08-26 11:40:02 798 1

原创 virt_to_page和page_address使用总结

其余的还有类似于页帧号转struct page结构的函数。内核逻辑地址转struct page 结构体指针。truct page 结构体指针转内核逻辑地址。

2023-08-26 00:12:22 201

原创 is_vmalloc_addr函数总结

【代码】is_vmalloc_addr函数总结。

2023-08-23 08:43:06 124

原创 linux异步信号驱动

参考:https://www.cnblogs.com/mrlayfolk/p/15858989.html。

2023-08-15 09:46:48 199

原创 register_chrdev函数简单使用

在/proc目录下,cat device时可以看到该megaraid_sas_ioctl字符设备的设备号,但是由于该设备文件还没有设备节点,所以还无法执行到对应的read等回调函数,所以可以利用函数或者mknod命令创建相应的设备节点,比如,register_chrdev函数网上介绍的文章比较多,就不概述了。然后就可以对mega进行cat,echo了。

2023-08-12 15:16:57 214

原创 dma_mmap_coherent函数的使用

需要注意的是,使用remap_pfn_range映射dma地址虽然没有报错,但是在应用程序操作的好像不是同一个dma地址。buf_addr 是内核态的虚拟地址,dma_addr是dma地址,它们都1对应同一段物理地址,即,已经建立了映射关系。在相应的字符设备驱动的mmap回调函数里,可以这样处理,这样在用户态,就可以通过mmap函数操作dma地址了。

2023-08-11 10:42:30 704

原创 NVM Command学习

ubuntu系统安装nvme-cli,可以在应用层发起命令。内核当中描述描述coommand的结构体。

2023-08-05 15:50:25 1070

原创 blk_mq_alloc_tag_set函数struct blk_mq_tag_set结构体学习

后面再分析每个成员的作用。

2023-08-01 23:49:53 436

原创 linux scatterlist阅读二

page_link ,offset,length的值,其中page_link 保存的是经过转换以后的物理地址,在使用sg_init_one函数的例子当中,buf传入的是内核虚拟地址。可以看到这个函数的作用就是将sgl起始地址的一段空间清零,然后设置最后一个元素的page_link 值,由于是最后一个元素,所以page_link 的第一个bit被设置为1。而像dma_length,dma_address一类成员的值的设置就要使用dma相关的函数去设置了,设置以后,记录的就是设备认识的dma地址了。

2023-07-22 17:51:45 201

原创 linux scatterlist源码阅读记录

linux scatterlist结构体学习

2023-07-22 14:27:29 301

原创 linux内核自旋锁理解总结

比如一开始是禁止了中断,然后调用spin_lock_irq和spin_unlock_irq,在调用spin_unlock_irq结束后会开启中断,本来一开始是禁止中断的,但是最后开启了中断,这显然是不对的。主要是spin_lock_irq和spin_lock_irqsave的区别理解,,一个会记住在调用函数时中断是否使能,

2023-05-21 21:12:59 81

原创 rdma rxe驱动ack包状态机解析

如果收到了ack包就会进行一系列的处理,如下,红色的代表走的是正常逻辑。文件:rxe_comp.c的rxe_completer函数。

2023-04-19 19:03:18 210

原创 rdma IBV_SEND_FENCE标记位理解

qp->req.wait_fence设置为1,然后返回NULL,所以rxe_requester函数直接退出了,不会进行这个wqe的处理,那么什么时候可以处理呢?只有等到这个设置了IBV_SEND_FENCE标记位的上一个wqe收到了最后一个ack以后,才会对当前设置了IBV_SEND_FENCE标记位的wqe进行处理。在rxe_comp.c里do_complete函数的最后有相应的设置,并且在设置之前,已经产生了cqe,即ack已经得到了相应的处理。在函数的最后有个判断,参考rxe驱动代码,

2023-04-18 18:57:36 617

原创 rdma rxe ack超时处理原理

那么state的变化为COMPST_GET_WQE->COMPST_EXIT->COMPST_ERROR_RETRY->COMPST_ERROR_RETRY,在int rxe_requester(void *arg)发包函数的最后会调用update_state函数,触发retrans_timer定时器。然后从skb队列里取出skb包,如果超时取出的skb为NULL,说明定时器到期以后,还没有ack过来,从而,在定时器到期以后会调度到rxe_completer函数,到了req的调度以后,

2023-04-17 19:22:26 240

原创 rdma cq的同步事件通知机制

调度会调用到rxe_send_complete函数,通过cq->ibcq.comp_handler(&cq->ibcq, cq->ibcq.cq_context);使用例程:https://www.rdmamojo.com/2013/03/16/ibv_ack_cq_events/我想,如果不调用ibv_ack_cq_events的话,在销毁cq时,应该是会阻塞的,可以自己写代码验证下。这个时候,ibv_get_cq_event函数的read就会返回,ibv_req_notify_cq函数要重复的调用。

2023-04-11 16:17:43 757

原创 rdma ack包 Syndrome字段含义总结

5,6bit为11表示这是一个NAK包,01表示RNR NAK包,00是正常情况,代表正确的收到了一个ack包。在rxe的驱动代码里,体现在rxe_comp.c文件的check_ack函数里。NAK包又细分为以下几种情况,以0-4bit代表不同的情况。该字段占一个字节,最高位(7bit)是保留的。

2023-04-04 18:51:48 453

原创 rdma max_dest_rd_atomic和max_rd_atomic字段含义总结

首先是max_rd_atomic字段,如果发送端要发起read或者atomic操作,那么这个字段通常要设置为1,如果设置为0,那么即使你发起了read或者atomic操作也是不起作用的,而对于发送端来说max_dest_rd_atomic字段可以设置为0(当然,条件是它此时不会做为接收端来接收read请求或者atomic请求),max_rd_atomic字段设置为1,就说明它只能处理一次读请求或者原子请求么?所以一般给1就可以。

2023-03-30 19:00:23 204

原创 rdma struct ibv_qp_attr属性timeout,retry_cnt,rnr_retry等字段含义。

没有收到ack,此时由于将接收端的发送函数注释了,所以不会收到ack包,由于此时将timeout设置为0,所以不会将数据进行重新发送。含义:远程QP在报告错误之前发送RNR NACK时,QP将尝试重发数据包的总次数7为特殊值,表示在RNR情况下重试无限次。这个值是对端给你回复nack包时,你要重新发送数据包的次数,那我们可以模拟一下对端回复nack的情况。驱动底下是用一个3bit的值表示的,所以最大的值可以给7,给7的意思是重新发送无限次。含义:远端没有应答而报告错误之前,QP将尝试重发数据包的总次数。

2023-03-28 17:29:09 892

原创 linux内核红黑树

相关结构体定义如下:使用案例:

2023-03-19 17:35:51 106

原创 linux内核链表的基本操作

一:链表的头插法参考:

2023-03-18 20:43:33 69

原创 linux kernel常用的对齐函数总结

内核字节对齐函数

2023-03-10 18:15:11 384

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除