自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(878)
  • 资源 (43)
  • 收藏
  • 关注

原创 方程求有理根还能这么玩

摘要:本文介绍了一种利用有理根判定定理求解一元高次方程有理根的方法。通过分析方程系数的整数因子,将可能的有理根范围缩小到有限几个候选值,再逐一验证。这种方法巧妙地将无限可能转化为有限枚举,类似于破案中的嫌疑人排查。文章以二次和三次方程为例演示了操作步骤,并指出其核心思想是"约束法"——先假设解存在并推导其必须满足的条件,从而大幅缩小搜索范围。该方法候选值有限的情况,体现了数学中化无限为有限的智慧。

2026-08-19 09:55:20 145

原创 编写简易dtc 设备树编译器

摘要 本文介绍了一个简易设备树编译器(mydtc)的实现,主要包含以下内容: 设备树编译流程:从DTS源文件到AST抽象语法树,再到DTB二进制文件的完整处理过程。 核心组件: 词法分析器将DTS文本分解为token流 语法分析器构建AST树结构(节点和属性) 语义检查(验证reg属性格式) DTB生成器将AST扁平化为二进制格式 实现验证:通过对比标准dtc工具的输出,确认了该简易编译器的正确性。 代码特点:约600行C代码,实现了基本设备树编译功能,可作为理解设备树原理的参考实现。 应用示例:展示了输入

2026-07-31 10:18:39 194

原创 设备树(dts)概念(源码理解)

本文通过代码实例介绍了设备树(dts)的基本概念和实现原理。设备树由节点组成的树形结构构成,每个节点包含名称、属性列表和子节点数组。文章详细定义了设备节点(dt_node_t)和属性(dt_prop_t)的数据结构,并实现了创建节点、添加子节点和属性的核心操作函数。通过一个简单的示例代码,演示了如何构建包含根节点和UART子节点的设备树,并输出标准的DTS格式文本。该实现帮助读者理解设备树的本质:用树形结构组织硬件设备信息,通过键值对属性描述设备特性。

2026-07-30 11:14:21 197

原创 hello_module Makefile 的执行过程.

本文通过一个简单的Linux内核模块helloworld.c及其Makefile,分析了内核模块的编译过程。作者发现实际编译会递归调用Makefile多次,于是构建了一个简化的内核Makefile模拟环境,包含kernel/Makefile和scripts下的Makefile.build、Makefile.modpost。模拟执行过程显示:内核Makefile分两个阶段处理模块——先编译构建,再进行符号处理和生成.ko文件。这种小环境模拟方法有助于理解复杂内核构建系统的核心流程,避免直接分析庞大内核Make

2026-07-26 14:32:45 155

原创 make 命令的三个修饰符@,-,+

这篇文章介绍了make命令的三个修饰符:@、-、+的用法和作用。 @(静默修饰符):隐藏命令本身,只显示输出结果; -(容错修饰符):命令执行失败时,make不终止并继续执行后续命令; +(强制执行修饰符):即使命令行指定-n/-t/-q,该命令仍会被执行,主要用于递归make(如$(MAKE))。 文章通过示例代码演示了这三种修饰符的具体应用场景,并总结它们的功能特点:@用于隐藏命令,-用于容错,+主要用于递归make时确保子目录调用完整性。

2026-07-25 10:57:51 174

原创 makefile 中为什么 make V=1 能够显示出完整编译命令

本文解释了makefile中make V=1显示完整编译命令的原理。关键点: V=1时Q变量为空,命令会显示;默认Q=@则隐藏命令输出。 另一quiet变量控制简短编译提示,默认显示"CC test.o"类信息。 示例代码通过条件判断设置这两个变量,仅用20行即实现功能:默认显示简短提示+隐藏命令,V=1时显示完整命令。测试结果验证了该机制的有效性。

2026-07-24 12:19:35 174

原创 ar 工具及 ar 库格式研究

本文研究了ar工具及其库文件(.a)的格式,重点分析了ar库中的符号索引机制。通过实例演示了如何创建带索引和不带索引的库文件,并使用nm工具观察差异。作者编写了一个解析工具ar_parse.c,详细剖析了ar文件结构:以"!<arch>\n"开头,包含多个成员文件,每个成员有固定格式的头信息。特别解析了GNU风格的符号索引表("/"成员),其中存储了符号名与成员偏移的映射关系。实验显示带索引的库会额外生成一个索引表,加速链接时的符号查找过程。该研究深入揭示了ar库的二进制组织方式及其索引机制原理。

2026-07-12 11:54:14 238

原创 访问设备文件与调用驱动函数是怎样关联的?

本文通过一个应用层模拟程序,展示了Linux设备驱动如何通过内核虚拟文件系统(VFS)实现函数回调机制。程序分为三层架构:驱动层实现具体设备操作(open/read/write/release),内核层维护设备映射表并转发系统调用,应用层通过模拟系统调用访问设备。当用户操作设备文件时,VFS根据注册的设备名称找到对应的驱动操作集,并转发调用请求。该模拟清晰地揭示了内核如何通过设备注册和函数指针实现驱动回调的核心机制,帮助理解实际Linux驱动中file_operations结构体与系统调用的关联原理。

2026-06-15 10:50:36 164

原创 让内核模块程序与用户进行实时数据交互.

本文介绍了两种实现内核模块与用户程序实时数据交互的方法:通过/proc文件系统和字符设备文件。 /proc文件系统方法: 创建/proc/mytest文件,设置0222权限允许非root用户写入 用户通过echo命令写入数据,内核模块通过copy_from_user获取数据 内核模块被动响应,通过proc_create注册回调函数 适合轻量级数据交互,如设备仿真 字符设备文件方法: 创建/dev/char_dev字符设备(主设备号222) 实现read/write函数完成双向数据传输 需要mknod创建设备

2026-06-14 12:42:15 181

原创 buildroot Makefile include *.mk 的玄机.

本文解析了Buildroot中Makefile动态包含*.mk文件的机制。通过分析发现,pkgname变量并非手动设置,而是借助MAKEFILE_LIST自动获取:当包含.mk文件时,make会将该文件名加入MAKEFILE_LIST,通过$(lastword $(MAKEFILE_LIST))可提取文件路径并计算包名。作者通过简化实验验证了这一机制,展示了如何利用延迟展开特性,在包含每个.mk文件时动态生成对应的host-目标。这种设计实现了自动化包名推导,避免了手工维护变量,体现了Makefile的灵活

2026-06-12 23:02:15 415

原创 buildroot 入门介绍

Buildroot 是一款用于构建嵌入式系统板载软件的工具,能够一键生成包括bootloader、内核、根文件系统及应用在内的完整BSP包。它支持通过make menuconfig配置不同硬件平台的定制化选项,并提供了多种预设模板(如qemu_x86_64_defconfig)简化配置流程。用户可通过make list-defconfigs查看所有内置模板,通过make命令完成编译。文章还深入解析了list-defconfigs和qemu_x86_64_defconfig命令的底层实现原理,包括Makefi

2026-06-12 22:52:25 281

原创 自己编写手提power-button 驱动

本文介绍了一个自编写的手提电脑电源按键驱动开发过程,重点分析了驱动加载和运行机制。作者通过编写powerbtn.ko模块,实现了对ACPI电源按键事件的捕获和处理。文章详细解释了驱动加载后sysfs目录结构变化、platform设备与驱动绑定过程、input设备注册机制以及电源按键事件上报原理。特别指出ACPI固件会区分长按(4秒)和短按,长按时会直接物理断电。该驱动可作为学习原生ACPI电源按键驱动原理的实践案例,代码已编译通过并测试可用。

2026-05-29 14:13:49 398

原创 linux 如何读取的cpu 温度? (真实平台)

本文介绍了在Linux系统中读取真实CPU温度的方法。通过读取Intel CPU特定的MSR寄存器(0x1A2和0x1B1)获取温度参考值和当前温差值,计算得出实际温度。作者实现了一个内核驱动模块,通过注册thermal_zone设备接口,将温度数据暴露在/sys/class/thermal/thermal_zoneX/temp路径下。驱动代码仅82行,包含温度读取、热区注册和卸载功能。测试表明该驱动读取的温度值与系统原有thermal_zone一致,验证了方法的正确性。文章消除了CPU温度测量的神秘性,展

2026-05-28 11:49:12 458

原创 手提电脑开盖,关盖的驱动

本文介绍了一个简单的笔记本开合盖驱动实现方案。作者通过分析ACPI协议,发现盖子设备在系统中被标识为"PNP0C0D",并利用Linux内核的ACPI子系统开发了一个仅60行的驱动程序。该驱动通过注册通知回调函数来接收盖子状态变化事件(0x80表示关闭,0x81表示打开),并打印相应日志。文中还详细说明了如何禁用系统默认的合盖休眠行为(通过修改logind.conf配置)以及如何解除原有驱动绑定。这个实现展示了如何利用标准ACPI接口简化硬件交互,只需关注设备状态变化通知而无需处理底层硬件细节。

2026-05-27 14:36:41 440

原创 linux 内核, 怎样读取温度?

本文介绍了在Linux内核中如何通过虚拟平台设备和驱动架构读取温度数据。主要内容包括: 创建虚拟platform设备"virtual-thermal"并注册到系统 实现对应的platform驱动,通过名称匹配设备 使用thermal_zone_device_register注册热区设备,生成/sys/class/thermal节点 展示了热区设备在sysfs中的各种可读写参数 该示例演示了Linux驱动架构的基本模型,包括设备注册、驱动匹配和温度子系统接口的实现。通过sysfs文件系统可以查看和配置温度相关

2026-05-26 18:12:23 405

原创 注册一个输入设备. 系统有那些改变?

本文介绍了向Linux系统注册输入设备后系统的变化。当调用input_register_device()注册设备后,系统会在/proc/bus/input/devices中新增设备记录,在/sys/devices/virtual/input/下创建对应目录,并在/dev/input/下生成字符设备节点(如event14)。这些接口文件会显示设备名称、物理地址、支持的事件类型(EV=3表示支持按键事件)和按键码(KEY=800表示支持按键0)。移除模块后,这些文件会自动消失。测试代码不足百行,通过编译为.ko

2026-05-26 09:33:56 703 1

原创 ubuntu系统 usbmouse 驱动代码分析

本文分析了在Ubuntu系统中使用usbmouse驱动替代默认usbhid驱动的过程。通过修改系统文件并更新initramfs成功禁用usbhid驱动后,加载自定义编译的usbmouse.ko模块驱动USB鼠标。文章详细探讨了usb_mouse_probe函数的调用机制,比较了"先插设备后装驱动"和"先装驱动后插设备"两种情况的调用栈差异,并解释了该函数的工作原理。分析表明,probe函数通过匹配接口类(HID)、子类(boot)和协议(鼠标)来识别设备,并检查接口端点数量是否符合要求。整个过程展示了USB

2026-05-20 20:40:56 443 2

原创 多个源文件编译成一个模块注意Makefile 书写

摘要:本文分析了Linux内核模块编译时printk无法输出的问题,发现是由于Makefile语法错误导致目标文件未正确链接。通过对比错误和正确的Makefile示例,指出关键点在于:obj-m指定模块名(.ko文件),模块名-objs指定组成模块的.o文件。正确的写法应明确列出所有需要链接的目标文件,如"myprint-objs := print.o abc.o"。该问题耗费较多调试时间,最终通过理解Makefile语法规则得以解决。

2026-05-19 13:44:03 44

原创 虚拟键盘,platform总线,键盘驱动框架(附c代码)

本文介绍了基于Linux平台的虚拟键盘设备与驱动开发框架。通过platform总线连接虚拟键盘设备和驱动,实现键盘事件的模拟与处理。虚拟键盘设备(vkb_dev.c)通过/proc文件系统接收用户输入,模拟8042键盘寄存器状态。驱动部分通过platform_driver结构体注册,与设备进行绑定。该框架展示了platform总线的基本用法、内核定时器应用以及/proc文件系统的交互方式,为后续真实键盘驱动开发奠定了基础。代码示例包含设备私有数据结构、平台设备注册、proc接口实现等关键部分,采用查询模式处

2026-05-18 10:10:33 391

原创 usb 串行口驱动庖丁解牛4: 数据收发的实现

本文分析了USB串行口驱动中数据收发的实现过程,重点剖析了PL2303驱动的最小化实现。作者发现仅需40行代码即可替代原厂1079行的驱动代码,核心功能均由Linux内核的usb_serial子系统完成。文章展示了精简后的PL2303驱动代码,包含设备ID匹配表、端口数量计算和基本端点配置。通过实际测试验证了该精简驱动能正常工作,并解答了关于读写操作机制的问题:写操作通过URB控制块发送数据,读操作则从USB控制器自动填充的缓冲区获取数据。作者指出这种精简实现揭示了USB串口驱动的本质,而原厂驱动包含大量冗

2026-05-17 16:20:16 398

原创 usb 串行口驱动庖丁解牛3:对设备终端进行设置

本文是《USB串行口驱动庖丁解牛》系列第三篇,重点解析设备终端设置功能。文章首先解释了tiocmget/tiocmset函数的命名由来及其在现代串口通信中的局限性(主要适用于完整modem通讯)。随后详细分析了set_termios函数的作用,包括配置波特率、数据位、校验位等参数,并指出其通过tcsetattr函数调用驱动层实现。文中还深入介绍了USB控制传输协议,通过pl2303芯片设置波特率的代码示例,展示了usb_control_msg函数参数与USB控制传输Setup包的对应关系。最后提供了PL23

2026-05-16 12:33:30 425

原创 usb 串行口驱动庖丁解牛2: 实现/dev/ttyUSB0设备文件框架

本文剖析了USB串行口驱动中/dev/ttyUSB0设备文件的生成机制。通过module_usb_serial_driver宏封装模块初始化和退出函数,重点解析了.calc_num_ports函数的作用:当返回1时会创建/dev/ttyUSB0设备节点。文章提供了PL2303驱动的简化实现代码,演示了如何定义端口计算函数并注册驱动。测试结果显示插入USB设备后成功生成设备文件,但该节点目前仅具备框架功能,尚不支持实际读写操作。这为后续驱动开发奠定了基础,后续需要添加打开、读写等操作支持。

2026-05-15 18:50:19 383

原创 usb 串行口驱动庖丁解牛1: 极简框架

本文介绍了一个极简的USB串行口驱动框架,实现了PL2303设备的探测(probe)和断开(disconnect)功能。该驱动包含模块加载/卸载函数、设备匹配表以及核心驱动结构体。通过dev_info打印设备连接状态信息,展示了驱动与设备的绑定过程。文章解析了dev_info输出内容的生成机制,包括设备名称和驱动名称的获取方式。该框架为后续功能扩展奠定了基础,是USB驱动开发的入门示例。

2026-05-15 17:47:15 381

原创 platform总线,驱动,虚拟设备(实例2)--led闪烁灯(附代码)

本文介绍了基于Linux platform总线的LED闪烁灯驱动实现。主要内容包括: 虚拟设备实现(virt_led_dev.c): 动态分配platform_device对象 定义设备私有数据结构(virt_led_dev_ctx)保存LED状态 使用kzalloc分配内存而非devm_kzalloc 通过platform_set_drvdata绑定私有数据 驱动实现(led_drv.c): 注册平台驱动并与设备匹配 实现完整的cdev接口控制LED 使用内核定时器(timer_list)实现闪烁功能 通

2026-05-11 19:17:04 543

原创 cdev 对象是个啥? (附代码说明)

本文介绍了Linux内核中字符设备驱动cdev对象的基本概念和工作原理。cdev作为用户空间与内核设备之间的桥梁,通过file_operations结构将用户请求转换为内核操作。文章详细说明了设备号分配、cdev对象初始化、自动创建设备节点等关键步骤,并提供了完整的示例代码。通过dmesg日志和sysfs文件系统验证了驱动加载和设备操作过程,帮助读者理解字符设备驱动的实现机制。

2026-05-10 11:11:13 418

原创 .ko 文件分析小工具, 简易modinfo 工具(c 代码)

本文介绍了一个简易的.ko文件分析工具modinfo,用于解析ELF64格式内核模块的.modinfo节内容。该工具仅88行C代码,通过读取ELF头部和节头表,定位.modinfo节并提取其中的字符串信息。代码实现了ELF文件的基本解析流程,包括校验ELF魔数、读取节头表和字符串表,最终输出模块的描述、许可证等元数据。编译使用简单,只需gcc编译后传入.ko文件路径即可运行。示例展示了工具输出的模块信息,包括description、license等字段。该工具虽然小巧,但需要清楚理解ELF64文件格式,可作

2026-05-09 20:41:58 79

原创 platform总线,驱动,虚拟设备I/O实例(128位I/O)

本文介绍了基于platform总线的虚拟设备驱动开发实例。主要内容包括: 驱动架构设计:通过platform总线实现驱动与虚拟设备的连接,采用分层设计实现上传下达功能。 关键功能实现: 模拟4个32位硬件寄存器读写 创建sysfs用户接口(reg0-reg3) 实现只读(reg0/1/3)和可读写(reg2)寄存器访问 内核交互机制: 使用sysfs_create_groups创建设备文件 通过DEVICE_ATTR宏定义设备属性 实现show/store函数处理用户读写请求 利用dev_get_drvda

2026-05-08 12:19:08 382

原创 驱动模型: platform总线,设备,驱动 3层架构框架

本文介绍了Linux内核中的platform总线驱动模型,采用设备、驱动、总线三层架构。虚拟设备模块仅向平台总线注册设备,不包含业务逻辑;驱动模块通过名称匹配设备,成功匹配后执行probe函数。操作顺序上,加载驱动和设备模块的先后不影响匹配,卸载顺序也无关紧要。文章详细展示了虚拟设备和驱动的代码实现,并分析了注册后在/sys文件系统中的变化,包括设备目录和符号链接的创建。最后说明了如何通过bind/unbind操作手动控制驱动与设备的绑定关系,为后续扩展probe函数实现具体功能奠定了基础。

2026-05-07 18:38:38 366

原创 简单驱动管理,内核链表宏及container_of宏演示代码

本文通过一个简单的驱动管理演示程序,解析了Linux内核中常用的三个宏:LIST_HEAD、container_of和list_for_each。作者通过预处理展开展示了这些宏的实际作用:LIST_HEAD用于初始化链表头节点,container_of通过成员指针获取所属结构体指针,list_for_each实现链表遍历。文章包含完整的测试代码和Makefile,展示了如何创建链表、添加节点并遍历打印驱动信息。通过实际运行结果验证了这些宏的正确使用方式,为理解内核链表机制提供了实用参考。

2026-05-05 07:49:38 336

原创 qemu直接启动内核+内存文件系统+双终端+文件共享+USB直通

本文介绍了一种基于QEMU的轻量级虚拟机配置方案,适用于Linux内核开发和驱动调试场景。核心特点包括:直接启动内核镜像、使用内存文件系统(initramfs)、双串口终端控制、主机-虚拟机文件共享(9p协议)以及USB设备直通功能。配置脚本详细说明了各项参数的作用,如KVM加速、CPU直通、串口重定向等。同时提供了配套的initramfs构建脚本,可快速生成包含BusyBox工具集的最小根文件系统。这种无图形界面的纯命令行方案特别适合嵌入式系统调试和内核开发,通过串口终端和共享文件夹实现了高效的开发调试环

2026-05-02 20:08:27 315

原创 最简单的设备及其设备驱动(附代码分析)

本文分析了Linux内核中最简单的字符设备/dev/zero及其驱动实现。通过ls命令查看/dev/zero、/dev/null等设备属性,发现它们共享主设备号1,由drivers/char/mem.c驱动实现。文章详细解析了zero设备的file_operations结构体,包括write、read_iter等关键操作函数,这些函数实现了零设备"永远返回0"的核心功能。同时介绍了设备号绑定机制,展示了主设备号1如何通过memory_fops注册,并最终在chr_dev_init()中完

2026-05-01 12:04:25 379

原创 彻底搞懂搞定终端设置

本文介绍了如何通过终端设置解决串口通信中的回显问题。作者通过实验发现,当使用cat和echo命令进行串口收发测试时,会出现无限循环打印现象。通过stty命令查看终端模式,发现启用了缓冲和回显功能。通过执行stty -F /dev/ttyUSB0 -echo -icanon -opost关闭相关模式后,成功实现了正常收发。文章还提供了C语言示例代码(serial_send.c和serial_recv.c),展示了如何通过编程精确控制串口属性,包括波特率设置、原始模式配置及数据收发处理,帮助读者深入理解终端控制

2026-04-30 21:08:59 368

原创 制作最简根文件系统

本文介绍了如何制作一个最小化的Linux根文件系统(rootfs)。主要内容包括:1) 根文件系统的基本概念和目录结构;2) 使用busybox创建包含bin、dev、etc等必要目录的最小根文件系统;3) 提供完整的构建脚本,包含fstab、profile、init等关键文件的配置;4) 将根文件系统打包成cpio.gz格式的initramfs;5) 使用qemu启动该根文件系统的示例和参数说明;6) 简要提及后续可用gdb调试内核的扩展功能。该方案为构建轻量级Linux系统提供了基础框架,便于后续开发和

2026-04-29 17:58:17 402

原创 制作ubuntu usb安装盘 (用dd 命令)

本文介绍了使用dd命令制作Ubuntu USB安装盘的方法。首先下载Ubuntu 26.04 LTS镜像,然后通过dd命令直接烧录到U盘(/dev/sdb)。由于Ubuntu镜像是混合启动格式(Hybrid ISO),支持BIOS和UEFI启动,因此可以直接用dd命令制作。烧录完成后,使用lsblk、fdisk和parted命令验证分区信息。最后,利用U盘剩余空间创建可读写的数据分区(格式化为FAT32),使安装盘兼具存储功能。这种方法操作简单且保留了底层细节,适用于需要同时作为安装盘和数据盘使用的场景。

2026-04-28 13:39:46 565

原创 fat32 文件系统研究(附c代码)

本文介绍了FAT32文件系统的研究过程,包括创建100MB空白磁盘镜像、格式化为FAT32格式,以及分析引导扇区数据结构。重点解析了BPB(引导参数块)的结构,通过自定义C程序读取关键参数如每簇扇区数、FAT表大小等。研究发现强制使用FAT32格式时,系统会调整簇大小以满足32位寻址要求。文章还提供了分析工具源代码,可用于深入理解FAT32底层存储机制。

2026-04-27 18:27:33 405

原创 彻底搞通UEFI, GPT, ESP 现代固件启动概念(附c代码)

本文深入解析了UEFI、GPT和ESP等现代计算机启动概念。UEFI作为64位系统的统一可扩展固件接口,取代了传统的BIOS;GPT分区表解决了MBR在64位系统中的容量限制问题;ESP则是UEFI系统专用的分区。文章通过创建100MB虚拟盘并建立GPT分区的实践演示,详细展示了GPT分区表的结构和内容,并提供了C语言代码读取GPT头信息。这些内容帮助读者全面理解现代计算机启动机制,从理论到实践掌握相关技术细节。

2026-04-26 13:06:10 391

原创 cpio 文档格式研究

本文研究了Linux内核中的cpio归档格式。通过创建测试cpio文件并分析其二进制结构,揭示了该格式的基本组成:包含文件头元数据、路径名、文件内容和填充对齐的循环结构,以"TRAILER!!!"标记结束。文章详细解析了cpio的newc格式规范,包括32位元数据结构和大文件支持特性,并提供了完整的C语言实现代码来解包cpio文件,演示了如何识别文件类型(普通文件、目录、链接)并提取内容。通过实际代码调试验证,加深了对这种轻量级归档格式的理解,特别适合内存文件系统等场景使用。

2026-04-22 17:23:53 568

原创 minix1.0 文件系统研究

本文介绍了minix1.0文件系统的研究过程。首先创建了一个1.44MB磁盘镜像并格式化为minix1.0文件系统,创建测试文件后卸载。然后分析了minix1.0的结构特点:使用1K逻辑块、7个直接指针的inode结构、14字节文件名限制,以及6个分区布局(引导块、超级块、inode位图、数据块位图、inode区和数据区)。通过010editor工具查看镜像文件,详细解析了各分区的二进制内容。最后介绍了编写代码验证文件系统的方法,包括定义超级块、inode和目录项等关键数据结构,为后续编程分析奠定基础。

2026-04-22 11:36:58 385

原创 最简单的虚拟字符设备驱动程序(附c代码)

本文介绍了一个最简单的虚拟字符设备驱动程序。该程序实现了用户空间与内核空间的数据交互,通过设备文件操作模拟真实设备通讯。主要功能包括:通过alloc_chrdev_region申请设备号,使用cdev_init初始化设备结构体,实现open/release/read/write等基本操作函数。其中read/write函数通过copy_to_user/copy_from_user在内核缓冲区与用户空间传递数据。测试时需先加载模块,创建设备节点文件,然后可通过cat/echo命令验证功能。该程序展示了字符设备驱

2026-04-21 17:34:35 447

原创 用usbmon 来抓包.

date: 2026年 04月 21日 星期二 15:27:31 CSTdescrip: 用usbmon 来抓包.

2026-04-21 16:29:49 428

build external modules

linux 2.6 内核 kbuild 文档。 讲述编译内核模块 makefile编写事项 老外写得,英文版

2013-07-12

wget for windows/dos

小巧的wget.exe 文件,单一运行文件。仅253 K bytes wget -h 获取帮助

2010-12-22

windos at 命令详解, ntcmds.chm

读完txt 文档,包你会用at. 另附ntcmds.chm, 可进一步扩充查阅其它windows 命令

2010-09-14

.net 中间语言 IL 指令集

Common Language Infrastruction partition I to VI 非常详细的IL 中间语言手册。 stardard ECMA-335 英文首册。备查。

2010-10-29

gdbinit-gdb 功能扩展插件

Public repo for gdbinit x86/x86_64 and ARM are supported simultaneously since version 8.0. To make ARM the default CPU set the $ARM var to 1 or use the "arm" command to switch. FEEDBACK: http://reverse.put.as - reverser@put.as You should read the header of the script for important information regarding some Mac OS X/iOS gdb bugs. Have fun, fG!

2015-07-10

http 协议分析代码实例

http 1.1 协议分析代码, linux 下编译,代码紧凑,very good!

2015-03-03

JSON 字符串与C 结构变量互转实例

linux c 下 json 字符串与 c 结构的相互转换, 开源软件,很有参考价值。

2015-03-03

linux 64位只读文件系统 romfs64

linux 64位只读文件系统 内核 2.6.32, 其它内核可能需要相应调整 扩展:从32位到64位 提高文件读取效率。 优化方式: 文件节点读入内存,采用数组管理,实现对分搜索,hash 搜索 性能不是很完美,仅供参考

2013-11-07

ida pro权威指南中文版

著名的ida pro权威指南, pdf 文档,我给它加了标签

2013-06-03

tr_research.tar.gz

本篇文章帮助你理解如下几个问题: 1. 翻译过程是如何进行的? 2. 翻译的上下文是指的什么? 3. 如何使用QT_TR_NOOP, QT_TRANSLATE_NOOP 4. QObject::tr() 是如何工作的. 5. lupdate 工具是如何工作的. 6. 如何提取宏定义中的字符串? 也就是说宏定义中字符串如何支持国际化? 7. 类中字符串如何支持国际化. 8. 全局变量引用字符串如何支持国际化. 详细请阅读readme.txt 和把玩代码.

2020-08-14

stl-views.gdb

gdb 打印功能扩展 # The following STL containers are currently supported: # # std::vector -- via pvector command # std::list -- via plist or plist_member command # std::map -- via pmap or pmap_member command # std::multimap -- via pmap or pmap_member command # std::set -- via pset command # std::multiset -- via pset command # std::deque -- via pdequeue command # std::stack -- via pstack command # std::queue -- via pqueue command # std::priority_queue -- via ppqueue command # std::bitset -- via pbitset command # std::string -- via pstring command # std::widestring -- via pwstring command

2016-01-23

vim plugin

vim plugin, windows 下工具集合,linux 下 plugin 也可以使用。

2015-05-10

tiny httpd

微型http 服务器, 还实现了cgi 功能

2014-11-27

uxfs 文件系统移植

uxfs 源代码是linux2.4 内核的, 将它移植到linux2.6.32内核,并做了少量修改。编译,运行良好

2013-09-04

vim73-gdb 工具

最新版vim version 73 gdb vim 和 gdb 的结合 你懂得 用 tar xvf vim73 gdb tar 解开2个压缩包 再分别解压缩 再看readme 再打补丁 编译

2015-02-07

windows 版 bochs

bochs 虚拟机 , 可以调试内核。 纯软件模拟dev

2013-06-28

gcc 函数调用探测功能

收集一个函数调用的踪迹,一种方法是通过在函数的入口处和出口处插入一个打印语句来检测。这个过程非常繁琐,而且很容易出错,通常需要对源代码进行大量的修改。 幸运的是,GNU 编译器工具链(也称为 gcc)提供了一种自动检测应用程序中的各个函数的方法。

2015-09-10

bat 的书写范例

bat 的书写范例, 可以学习不少使用的语法,技能

2014-04-23

webbench 批量web 页请求程序

批量 web 请求 知识点: 客户端程序构建http 请求字符串, 并发请求(用fork完成)。父子进程间信息交换

2015-03-04

simple encrypt decrypt algrithm

simple encrypt decrypt algrithm use xor to realize

2015-02-05

linux elf64 parser 源代码

readelf 工具就能对elf 文件进行很好的分析. 但是, ubuntu 上下载的 readelf 源码, 属于binutil 包, 依赖于很多别的库, 代码复杂,庞大, 很难看懂其中逻辑. 而这个代码, 区区几百行代码, 简单的惊掉你的下巴! 这才是真正的elf parser, 简单, 读过来就是结构数据. 注意, 只支持elf64. 读完代码,对elf结构秒通.

2025-12-27

全面介绍AVFilter 的添加和使用

readme.txt :this file filtering_video.c :用filtergraph 来验证color_screen 过滤器 read_from_vfilter.c :用通用框架验证color_screen 过滤器 vsrc_color_screen.c : color_screen filter

2025-04-22

全面介绍AVFilter 的添加和使用

ffmpeg filter的上层管理对象是 "lavfi" 对象, 它是一个AVInputFormat对象,是一个虚拟设备源, 让它的实现类匹配我们的filter,使它的数据直接从我们的filter来取. 就可以验证我们的filter. 这是标准的ffmpeg操控数据的流程,用avformat_open_input 打开文件,用avcodec_open2打开codec. 用av_read_frame 来读取数据, ffplay,ffprobe,ffmpeg也是这样处理过滤器的. 核心思想是把filter当文件使用. 第2个文件是直接使用filtergraph的例子

2025-04-22

全面介绍AVFilter 的添加和使用

ffmpeg filter的上层管理对象是 "lavfi" 对象, 它是一个AVInputFormat对象,是一个虚拟设备源, 让它的实现类匹配我们的filter,使它的数据直接从我们的filter来取. 就可以验证我们的filter. 这是标准的ffmpeg操控数据的流程,用avformat_open_input 打开文件,用avcodec_open2打开codec. 用av_read_frame 来读取数据, ffplay,ffprobe,ffmpeg也是这样处理过滤器的. 核心思想是把filter当文件使用. 第2个文件是直接使用filtergraph的例子

2025-04-22

全面介绍AVFilter 的添加和使用

ffmpeg filter的上层管理对象是 "lavfi" 对象, 它是一个AVInputFormat对象,是一个虚拟设备源, 让它的实现类匹配我们的filter,使它的数据直接从我们的filter来取. 就可以验证我们的filter. 这是标准的ffmpeg操控数据的流程,用avformat_open_input 打开文件,用avcodec_open2打开codec. 用av_read_frame 来读取数据, ffplay,ffprobe,ffmpeg也是这样处理过滤器的. 核心思想是把filter当文件使用.

2025-04-22

离散傅立叶变换DFT及其反变换IDFT c 源代码

离散傅立叶变换DFT及其反变换IDFT c 源代码 非常简洁的代码,有简洁的复数运算代码及DFT,IDFT代码 测试代码实现了从时域到频域变换,再从频域到时域变换. 验证了变换的正确性!

2024-06-28

IDA Free8.3 For Linux

是Free 版本, 支持x86, x86_64, 不支持Arm 等 支持反编译成C 语言伪代码, 开放的功能已经非常友好了.. 供学习使用还是非常不错的. linux 下版本, 我喜欢在linux 下操作. 安装: chmod +x idafree83_linux.run ./idafree83_linux.run 即可. enjoy!

2023-10-08

用SDL2.0显示图片实例代码

建议在linux下编译。 1.演示了如何显示背景图(平铺),前景图(居中)及处理键盘事件(退出)等

2022-11-02

将视频存储为一张张jpg 图片源码

利用ffmpeg 来读取视频,解压缩为一个个frame, 再利用ffmpeg 将frame 压缩成jpeg 格式存成图片. 对ffmpeg 的主要调用接口如下: 1. 打开一个文件进行解码的过程: //初始化 avformat_open_input() avformat_find_stream_info() av_find_best_stream() avcodec_find_decoder() avcodec_parameters_to_context() avcodec_open2() //循环执行 av_read_frame() avcodec_send_packet() avcodec_receive_frame() //结尾 avformat_close_input() 2. 打开一个文件进行编码的过程: //初始化 av_guess_format() avio_open(); avformat_new_stream() avcodec_find_encoder() avcodec_parameters_to_context()

2022-06-11

linux 命名管道创建及使用demo程序

1. 在程序中创建命名管道 在程序中创建命名管道,可以使用 mkfifo 函数,其原型如下: #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode); 2. 在程序中使用命名管道 pipe_fd = open(FIFO_NAME, open_mode); 3. 编译: make 4. 执行: 先在一个终端中执行生产者: ./namedpipe_produce 然后在另一个终端中执行消费者:./namedpipe_consume 结果是二者完成数据传输后都返回了 5. 删除命名管道 删除命名管道和删除一个普通文件没有什么区别: $ rm /tmp/testp

2022-06-02

监视程序的内存使用(linux c 源代码)

当你面对内存泄露的时候, 该程序时刻监视着你程序的内存使用情况. 你甚至可以用gdb 单步执行你的程序,来观察监视程序所报的内存使用量. 如此便能找到是谁(哪个函数?哪行代码)占用了内存. linux 下的程序, 有源代码, 你可以修改程序成更顺手的工具.

2022-05-04

Qt5 信号与槽研究,线程研究

QT5 信号与槽研究 ---------------------------------------- 一个主窗口给多个工作线程发信号,线程的槽函数是如何工作的? 是并行的还是串行的? 通过研究知道, 它是串行工作的. 而且纵然工作线程没有启动,它也可以工作. 各个槽函数只是signal 依次调用各线程下的槽函数而以. signal-slot 机制跟线程没有关系,只跟对象有关系. 下面贴上我的研究代码,里面还有其它thread 的相关知识. 例如:线程是并行运行的,如何停止线程和重启线程等.可以参考注释.

2022-03-12

OpenSSH for windows (64bits)

1,下载openSSH windows版(注:该版本是64位) 2,解压到C:\Program Files\OpenSSH 不要放在别的路径下,官方这样要求的 3,cmd到openSSH路径下 依次执行 1)安装sshd服务 powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1 2)开放22号端口(如果你在windows关闭了防火墙并配置了入站规则可以不执行如下命令,多执行不影响) netsh advfirewall firewall add rule name=sshd dir=in action=allow p

2020-11-09

calltree-2.3.tar.gz

makefile 用qmake 生成, 去除了测试文件,已修改了代码文件中需要修改的地方. 在ubuntu14 下已经编译通过

2019-07-02

qt 在控件上绘制图形

qt 在qlabel 上画一个叉, 用来演示如何在qt 控件上绘制图形,只要重写控件的paintEvent 方法即可!很简单.

2020-05-07

the-23-gang-of-four-design-patterns-with-cplusplus.tar.gz

c++ 23种设计模式参考代码, 帮助理解23种设计模式 源代码整理自 k_eckel 的《设计模式精解-GoF 23 种设计模式解析附 C++实现源码》 内含CMakelist.txt 文件, 方便linux 下编译运行. 我设定的积分是免费,0积分,代码公开,以后下载会不会要积分就不知道了.

2020-03-08

virtualpanel.zip

用qt4 实现的虚拟面版, 上面有几个指示灯,几个按键, 指示灯和按键数量可自己定义, 指示灯可以定义点亮状态为红,绿,蓝, 熄灭固定为灰色.

2020-07-15

buttonTable.zip

QTableWidget 是qt 提供的表格控件, 这里需要一个按键矩阵, 所以将按键作为一个单元塞到表格中,方便管理. 有一张图片显示了运行效果.

2020-07-23

Qt 4.8 Timer

qt 下简单的timer 使用 和日期,时间的更新显示

2016-09-02

LFS-BOOK-CN.html

首先,你应该知道Linux From Scratch 是干什么的,这篇文档是中文的. 由 Linux 中国 - LCTT - LFS 翻译小组 翻译 无分页,所有文档在一个页面中,方便查找. 还是看中文文档方便操作

2019-12-29

空空如也

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

TA关注的人

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