内核驱动开发记录
文章平均质量分 89
内核驱动开发记录
最佳损友1020
xdu 计科毕业
xjtu 计科在读
种一棵树的最好时机是十年前,其次是现在
展开
-
fio下发的请求大小不确定
在使用blk_queue_max_hw_sectors设置最大扇区后,本以为全部搞定了,但用fio测试块设备速度时,却发现速度有时候180MB,有时候700MB,开启驱动打印后发现虽然bs设置为1M,但有时候执行下发的请求大小就不是1M,是一些奇奇怪怪的数字,nlb为3d8,6ef之类的,而且如果刚开始不是7ff,则一直不是7ff,如果刚开始是7ff,则一直是7ff。然后在nvme驱动中插入打印语句,看nvme驱动有没有类似情况,没发现这种情况,倒是结束时会出现一些其他大小的请求。原创 2023-06-12 10:30:39 · 781 阅读 · 1 评论 -
内核调试工具crash使用
在编写内核驱动的过程中,时不时就导致内核崩溃,也没啥好的调试方法,要么dmesg打印内核日志,要么搭建kgdb环境调试,但kgdb比较繁琐,dmesg有时候也不能打印内核堆栈,故调试内核纯看运气,如果是能稳定复现的bug还好调试,最怕的就是测试程序刚开始跑的好好的,突然鼠标动不了了,这个时候就知道糟了。之前的思路是一直时快速刷新dmesg以求能看到内核崩溃时日志打印,但没有成功过。后面有一次面试的时候面试官提到了crash这一内核调试工具,看起来还挺有用,故记录一下使用过程。原创 2023-05-21 17:39:40 · 1902 阅读 · 0 评论 -
fio引发的一些问题
,加载自己写的模块,加载nvme-core模块时没出现啥问题,加载nvme模块时显示内核地址访问错误,__slab_alloc not-present page,这有可能与模块的签名,小版本不符合之类的问题有关,但懒得研究了,直接源码编译内核然后切换。却发现驱动的请求队列处理函数的请求字节数为130560,也就是255扇区,这是一个莫名其妙的数字,甚至不是4k的倍数,后逐渐增大bs查看下发的请求大小,发现超过128k后扇区数就会成许多个255,例如2个128k会拆分成255+1,原创 2023-05-20 18:10:52 · 1034 阅读 · 0 评论 -
linux UIO驱动实践
想了想,还是自己写一个简单的demo,加深一下印象。由于没有实际的设备,为了触发驱动的探测函数,就需要借助platform设备与platform驱动。一直以为使用镜像安装的Ubuntu没有内核源码,不能编译驱动,只能由源码编译内核后切换内核才能编译驱动,没想到一安装完就可以编译了,错误的印象。用户态代码首先读取内存数据,而后写入一些数据,驱动在设备移除函数中读取内存数据,验证用户程序是否成功写入。相较于platform的demo,只是加入了一些uio_info相关的代码,函数构成一致。原创 2023-03-07 22:25:33 · 1318 阅读 · 0 评论 -
内核驱动开发记录
推荐阅读:《C和指针》 《C专家编程》 《C陷阱与缺陷》《Linux设备驱动程序》 《linux内核设计与实现》 《深入理解linux内核》《Debug Hacks中文版—深入调试的技术和工具》第一要义:学会放弃第二要义:不要修改代码屎山第三要义:遇到无法解决的问题/BUG,备份代码后重构代码第四要义:若BUG实在无法解决,尝试不同的实现方式,不过于追求简洁与优雅相关驱动:块设备驱动,网卡驱动内核版本:5.4/4.19驱动开发背景:块设备驱动特点:一次只能发送一条指令,需同时实现协议栈原创 2022-10-01 21:56:28 · 3384 阅读 · 0 评论 -
驱动虚拟环境搭建记录
在华为镜像站中下载Ubuntu镜像,第一次我下载的是Ubuntu22,其版本太高,使得我安装deb包时就出现错误,linux-headers-4.19.100-0419100-genericDependslibssl1.1(>=1.1.0)butitisnotinstallable,而系统安装的应该是openssl。由于要求的内核版本是4.19,故基本的思路是使用deb包先将内核版本降到4,而后使用源码编译将内核切换成4.19。安装fish,敲命令更方便。.........原创 2022-07-16 11:09:54 · 320 阅读 · 0 评论 -
NVMe驱动学习记录-2
NVMe驱动学习记录-2参考源代码变量函数结构体参考源码地址:https://mirrors.tuna.tsinghua.edu.cn/kernel/v4.x/linux-4.19.90.tar.gzlinux-4.19.90\drivers\nvme\host源码阅读环境:Windows 搭建 opengrok|极客教程 (geek-docs.com)书籍:《LINUX设备驱动程序》初始化参考链接:linux里的nvme驱动代码分析(加载初始化) nvme_reset_work()函数后原创 2022-05-12 16:34:08 · 4205 阅读 · 1 评论 -
NVMe驱动 请求路径学习记录
NVMe驱动 DMA学习记录由深入浅出SSD 6.5节trace分析可知,主机读请求的执行流程如下:主机准备好命令放在SQ主机通过写SQ的Tail DB,通知SSD来取命令(Memory Write TLP)SSD收到通知,去主机端的SQ取指令(Memory Read TLP)SSD执行命令,把数据传给主机(Memory Write TLP)SSD往主机的CQ中返回状态SSD采用中断的方式告诉主机去处理CQ主机处理相应CQ,更新CQ Head DB(Memory Write TLP)可原创 2022-05-25 21:05:52 · 1615 阅读 · 1 评论 -
NVMe驱动学习记录-1
NVMe驱动学习记录-1初始化nvme-core模块解释nvme模块解释初始化nvme-core模块创建工作队列分配设备号创建class类型的对象解释工作队列workqueue是对内核线程封装的用于处理各种工作项的一种处理方法, 由于处理对象是用链表拼接一个个工作项, 依次取出来处理, 然后从链表删除,就像一个队列排好队依次处理一样, 所以也称工作队列所谓封装可以简单理解一个中转站, 一边指向“合适”的内核线程, 一边接受你丢过来的工作项, 用结构体 workqueue_srtuc原创 2022-05-12 16:30:45 · 1261 阅读 · 0 评论 -
r8169驱动源码阅读记录
源码地址:linux-4.19.90\drivers\net\ethernet\realtek\r8169.c源码阅读环境:Windows 搭建 opengrok|极客教程阅读网卡驱动源码第一步,简要看一下发送描述符,接收描述符,发送缓存区,接收缓冲区定义与初始化// 发送描述符596 struct TxDesc {597 __le32 opts1;598 __le32 opts2;599 __le64 addr;600 };// 接收描述符602 struct RxD原创 2022-05-30 20:51:57 · 1949 阅读 · 0 评论 -
块设备文件读取实验记录
块设备文件读取实验记录添加实验设备分区测试文件: 一个linux文件就是一个字节序列,所有的IO设备(例如网络,磁盘和终端)都被模型化为文件,而所有的的输入和输出都被当做相应文件的读和写来执行。这种将设备优雅地映射为文件的方式,允许linux内核引出一个简单,低级的应用接口,称为Unix I/O,这使得所有的输入和输出都能以一种统计且一致的方式来执行。(选自csapp)文件描述符: 文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,用于指代被打开的文件,对文件所原创 2022-04-05 11:09:08 · 1997 阅读 · 0 评论 -
内核版本切换记录
内核版本切换记录 由于需要切换内核版本(4.19)并使用相应版本源代码编译内核模块,故在当前版本(5.10.3)下尝试编译内核,参考博客如何编译 Linux 内核下载源代码进行编译,但当前版本过高,复制当前版本的config文件后make总是会出现一系列奇怪的错误,这可能是有些内核选项只适用于当前版本,而低版本不适用,故高版本的配置文件是不可用的。cp /boot/config-$(uname -r) .config 所以采用另外一种方法进行内核编译:先安装版本近似的的内核安装包,而后进行源码编原创 2022-04-13 22:31:43 · 623 阅读 · 0 评论 -
内核模块编译记录
1 基本的模块编译问题obj-m+=hello.oall: make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modulesclean: make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean在vscode终端使用最简单的模块进行编译,发现既没有报错,也没有hello.ko文件产生。可以看到M= modules,没有显示当前文件夹ech原创 2022-04-14 16:32:24 · 635 阅读 · 0 评论 -
BAR空间测试代码
BAR空间访问原创 2022-04-18 10:21:53 · 1289 阅读 · 0 评论