- 博客(398)
- 收藏
- 关注
原创 IO——poll 函数
在单个线程中,select 函数能够监视的文件描述符数量有最大的限制,一般为 1024,可以修改内核将监视的文件描述符数量改大,但是这样会降低效率!这个时候就可以使用 poll 函数,poll 函数本质上和 select 没有太大的差别,但是 poll 函数没有最大文件描述符限制,虽然poll解决了select中监听fd的上限,但是poll中还是要遍历所有的FD,且如果fd监听过多会导致性能下降。要监视的文件描述符集合以及要监视的事件,为一个数组,数组元素都是结构体。poll 函数要监视的文件描述符数量。
2023-12-22 20:15:00 487
原创 IO——select 函数
在调用 select 函数后,可以通过检查 readfds,writefds 和 exceptfds 集合的状态,以确定哪些文件描述符准备好进行 I/O 操作。然后,程序可以根据文件描述符的状态来执行相应的读、写或异常处理操作。它们都是由 fd_set 类型表示的位图结构。
2023-12-22 12:51:48 662
原创 非阻塞 IO(NIO)
程序使用时,阻塞 IO 和非阻塞 IO 的区别在于文件打开的时候是否使用了。所以驱动中需要判断文件打开标志是否支持非阻塞方式。文件打卡时,文件打开标志存放在文件结构体。,使用等待队列头实现了阻塞 IO。如果文件读取失败,循环读取。
2023-12-22 08:39:00 907
原创 阻塞 IO(BIO)
等待队列以循环链表为基础结构,链表头和链表项分别为。等待队列是内核实现阻塞和唤醒的内核机制。宏一次性完成等待队列头的定义和初始化。整个等待队列由等待队列头进行管理。等待队列头的初始化有两种方法。等待队列头使用结构体。等待队列项使用结构体。
2023-12-21 21:42:31 524
原创 linux 驱动——杂项设备驱动
在 linux 中,将无法归类的设备定义为杂项设备。相对于字符设备来说,杂项设备的主设备号固定为 10,而字符设备不管是动态分配还是静态分配设备号,都会消耗一个主设备号,比较浪费主设备号。杂项设备会自己调用和来自动创建设备节点。所以可以将杂项设备看成是字符设备的一种。但是比平时写的字符设备降低了难度并节约了主设备号。杂项设备的次设备号 minor 一般使用宏,表示自动分配次设备号。杂项设备主要依赖次设备号来管理不同的杂项设备。杂项设备的头文件为。
2023-12-20 21:27:26 438
原创 音频——S/PDIF
双相符号编码(Biphase Mark Code),简称BMC,属于一种相位调制(phase modulation)的编码方法,是将时钟讯号和数据讯号混合在一起传输的编码方法。如果要传输的比特是逻辑 1,则符号的第二个状态与第一个状态不同。如果要传输的比特是逻辑 0,则符号的第二个状态与第一个状态相同。一个符号的第一个状态总是不同于前一个符号的第二个状态。每个要传输的比特由一个符号表示,该符号由。BMC 编码示例如下图。
2023-11-25 20:15:00 903
原创 linux 驱动——原子操作
Linux 内核定义了叫做atomic_t的结构体来完成整型数据的原操作,在使用是使用原子变量来代替整型变量。此结构体定义在也可以在定义原子变量的时候给原子变量赋初值,如下所示相应的也提供了 64 位原子变量的操作 API 函数,和上表用法一样,只是将 atomic_ 前缀换为 atomic64_ 将 int 换为 long long。如果使用的是 64 位的 SOC,那么就要使用 64 位的原子操作函数。
2023-11-22 21:47:49 204
原创 linux 驱动——将模块编译进内核
前面两节介绍的驱动都是以模块的形式,需要手动加载,本节介绍如何将模块编译进内核。将上一节中的模块源码拷贝到。
2023-11-06 21:31:10 519
原创 linux 驱动——字符设备驱动(自动生成设备节点文件)
linux 自动创建设备节点之后,就不用手动创建了,可以直接查看 /dev 目录下已经生成了设备节点文件。dev 目录下的节点不是由驱动本身生成的,是由文件系统中的工具 mdev 生成的;当系统启动后,加载完内核再去加载文件系统,执行文件系统中的脚本,脚本会执行。文件保存了每个驱动的主设备号、次设备号,以及驱动名。配置 linux 内核使之自动创建设备节点文件。这里文件是有的,这个时候执行。可以看到设备节点文件自动创建了。下的所有文件,寻找所有名为。生成设备节点的依赖有两个。程序),该命令会去遍历。
2023-11-05 21:59:31 419 1
原创 linux 驱动——字符设备驱动
创建设备节点起始就是在 /dev 目录下创建一个文件,这样。就可以访问这个文件了。创建完成以后就会存在。查看模块文件是否存在。查看当前系统中的设备。
2023-11-05 11:15:03 214
原创 VScode clangd 插件浏览 linux 源码
VScode clangd 插件浏览代码却决于文件生成该文件有很多种方法这里只介绍 bear 和 linux 内核脚本。
2023-10-30 20:43:28 986
原创 linux 模块安装与卸载
网卡没有处于 AP 模式,处于 Managed 模式的无线网卡没有足够多的信息做网桥,只能转换成。解决方法就是在内核顶层的 Makefile 直接定义这两个变量(有点粗暴),这样直接将编译的 ko 放到网络文件系统中,直接启动内核即可。之后,将生成的 ko 文件拷贝到根文件目录下,然后重新打包。这个有点复杂,超出了研究 linux driver 的目的。模块编译好之后,最好的方法就是将 rootfs 设置为。的形式,如果想让 qemu 联网,需要建立网桥,但是。脚本传进去的,编译模块的时候又没有指定这些。
2023-10-29 11:30:03 727
原创 u-boot 通过 SD 卡启动 Linux(三)
将 kernel + dtb + rootfs 打包到一个 SD 卡镜像中。可以看到分区 1 为 kernel + dtb。分区2 为 rootfs。前面几节中,分别介绍了。
2023-10-25 21:33:38 869
原创 Linux+SD卡(rootfs)(二)
镜像中就包含了 rootfs 目录下的所有内容,此时linux的根文件系统就已经制作完成,下一步就是使用这个 rootfs.ext3 镜像来启动 linux 内核。上述步骤执行完后在 busybox 根目录生成了一个 _install 文件夹。busybox 下载链接 https://busybox.net/随便找一个目录,来创建 linux 的根文件系统。这里比之前多指定了一个 sd 镜像。上面的步骤执行完后,linux 启动文件。linux 启动日志。
2023-10-16 22:13:08 1147
原创 qemu 运行 linux(一)
从日志中可以看到,挂载 VFS 文件系统失败,导致内核 panic。下节将介绍 rootfs。可以在浏览器中点击下载,也可以使用命令行下载。在根目录 linux-6.5.7 执行。在根目录 linux-6.5.7 执行。在根目录 linux-6.5.7 执行。linux 内核下载地址。
2023-10-15 21:04:04 508
原创 qemu基础篇——VSCode 配置 GDB 调试
qemu 启动选项多了 -s -S ,表示启动之后就 stop 等待 GDB 连接,在启动调试之前先启动 qemu ,让其等待 GDB 连接。上一节中直接使用 GDB 命令行调试,本节介绍如何使用 VSCode 来进行调试。选择 Node.js,此时在当前工作区域会新建一个 launch.json 文件。如果找不到 Node.js 模块,使用如下命令安装。Node.js 安装。
2023-10-14 20:35:13 2471
原创 【GDB】使用 GDB 自动画红黑树
前面几节中介绍了 gdb 的 python 扩展,参考并且 python 有 graphviz 模块,那么可以用 gdb 调用 python,在 python 中使用 graphviz 绘图。
2023-09-30 10:03:51 189
原创 【GDB】用 python 扩展 gdb
gdb.parse_and_eval 接受一个字符串作为表达式,并以 gdb.Value 的形式返回表达式求值的结果。那么 gdb.parse_and_eval(‘i + 1’) 的结果是一个 gdb.Value 的实例,其 value 属性的值为 4。如果想把输出结果转存到字符串中,设置 to_string 为 True:gdb.execute(cmd, to_string=True)。当我们通过 python 接口跟这些值打交道时,gdb 会把它们包装成一个 gdb.Value 对象。
2023-09-29 21:10:17 1029
原创 【GDB】常用操作
不过在调试真正的程序时,watch 断点非常实用,尤其当你对相关代码不熟悉时。另外结合 debugger 运行时修改值的能力,你可以在值变化的下一刻设置目标值,观察走不同路径会不会出现类似的问题。一个办法是给内存的分配和释放加上日志,再编译,然后重新运行程序,谋求复现内存泄露的场景。也即是说,就算不退出 gdb,每次运行的也会是当前最新的版本。若如果用 print 大法,就在 binary_search 中插入几个 print,运行后扫一眼,看看 target=5 的时候运行流是怎样的。
2023-09-29 17:11:59 167
原创 【GDB】 command 命令
这样会提示你输入你要执行的命令,以 end 结束。这个 bread_id 就是用 info b 打印出的结果,其实就是当前已经设置的断点序号。2 个断点都加了 command 命令。当断点被触发时,这些命令会被执行,这样的好处是不需要手动敲 c 来将程序继续执行下去,方便调试。command 命令是一个很好用的调试命令,它配合断点使用,可以在指定的断点执行预先设置的命令。在断点 1 设置了命令。在断点 2 设置了命令。
2023-09-29 11:59:21 320
原创 【GDB】命令脚本
另外 gdb 还提供了很多输出命令。比方说 echo 命令,如果仅仅是输出一段文本,echo 命令特别方便。此外还有和 C 语言很相似的支持格式化输出的 printf 命令,等等。因为这样做会使 gdb 按照相应的脚本语言去解析命令脚本,结果自然是不对的。首先对于命令脚本的命名,其实 gdb 没有什么特殊要求,只要文件名。脚本文件的注释也是以 # 开头的,这个同很多其它脚本语言都一样。命令脚本:新建一个文件。python 文件内容。编译并调试 C 代码。编译并调试 C 代码。
2023-09-27 22:14:08 285
原创 【GDB】自定义命令
.gdbinit 文件的使用示例 脚本中输入如下内容运行https://blog.csdn.net/weixin_41572450/article/details/124883629
2023-09-27 21:33:38 155
原创 【GDB】 .gdbinit 文件
这个文件,并把它的内容作为gdb命令进行解释,所以如果我把脚本命名为。gdb 在启动的时候通常想加入一下自己的命令,例如。gdb 在启动的时候,会在你的当前工作目录下查找。,这样在启动的时候就会处理一些你常用的命令。1、在/home/tyustli 下添加一个。(即你要Debug的目录)下,同样添加一个。实际使用时,会存在一个问题,比如你需要在。写代码, 因此,你想在当前目录下添加。, 默认GDB初始化时会调用这个文件。新建一个 shell 脚本。, 然后调用 GDB。
2023-09-27 21:15:56 868
原创 dot 绘图
当然,在编写好. dot 或者. gv 的文件之后,需要有专门的程序处理这些文件并将其渲染成为图片,dot 就是其中一款程序,它可以将 DOT 语言描述的图形渲染成. png、.jpg、.pdf 等多种类型。当然,作为工具,dot 本身是很原始的,就像 gcc 之于 c 代码,g++ 之于 cpp 代码一样,或许某些程序员会热衷于在终端使用这些工具,但也有很多人喜欢交互式的界面,所以就有了 gvedit 之类的工具,它提供交互式的窗口来使用 dot 等工具渲染 DOT 语言描述的图形。
2023-09-27 16:36:42 436
原创 python 绘制 graphviz
只安装 python 的包是不够的,还需要安装。, python 要想使用还需安装 pip 包。上一节中在本地安装了。
2023-09-27 16:36:05 164
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人