自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 字符设备驱动读写操作实现

本文介绍了Linux字符设备驱动中读写操作的实现方法。主要包括:1) read函数通过copy_to_user将内核数据拷贝到用户空间;2) write函数通过copy_from_user将用户数据写入内核;3) 使用put_user/get_user处理简单数据类型;4) 通过struct mychar_dev封装设备信息避免全局变量。文中给出了完整的代码实现,包括设备初始化、文件操作结构体定义、以及读写函数的具体实现逻辑。重点说明了如何管理缓冲区位置指针和剩余空间,以及错误处理机制。

2025-11-27 10:44:19 518

原创 注册字符设备

本文介绍了Linux字符设备驱动的开发流程。主要内容包括:1)定义字符设备结构体struct cdev及其关键成员;2)实现文件操作接口struct file_operations;3)设备注册流程(申请设备号、初始化cdev、添加设备);4)验证步骤(创建设备节点、测试应用);5)提供示例代码mychar.c和testmychar_app.c。重点阐述了mydev(设备身份)与myops(操作手册)的关系,强调二者缺一不可,并详细解释了内核通过"三道锁"(设备号注册、操作绑定、设备添加

2025-11-24 21:21:39 766

原创 设备分类、设备号申请与注销

本文介绍了Linux设备管理的关键概念。Linux将设备分为字符设备(按字节流访问)、块设备(按数据块访问)和网络设备三类。设备号(32位)由主设备号(标识驱动类型)和次设备号(标识具体设备)组成,可通过MKDEV/MAJOR/MINOR宏操作。用户空间使用mknod命令或系统调用创建设备文件。内核提供了register_chrdev_region(静态分配)和alloc_chrdev_region(动态分配)两种设备号申请方式,以及unregister_chrdev_region释放接口。这些机制构成了L

2025-11-23 21:58:28 287

原创 内核与用户空间

本文摘要: 文章首先介绍了操作系统内存管理的核心概念,包括虚拟地址空间的划分(用户空间与内核空间)及其映射机制。其次详细分析了计算机系统中的执行流分类,区分了任务流和异常流的不同特性。然后对比了内核模块编程与应用程序编程的关键差异,包括API来源、运行空间、权限、编译方式等方面的不同。最后提供了内核接口头文件的查询方法。全文系统性地阐述了操作系统底层原理和内核开发的基本概念,为理解系统级编程提供了理论基础。

2025-11-12 12:35:45 331

原创 内核模块参数与依赖

内核模块传参与依赖管理摘要 模块参数传递: 使用module_param和module_param_array定义模块参数,支持多种数据类型 参数可通过insmod命令传递,权限通过perm参数设置 MODULE_PARM_DESC宏用于添加参数描述 模块依赖关系: 导出符号(函数/变量)使用EXPORT_SYMBOL宏 依赖模块需按顺序编译和加载(先导出者,先加载) 跨目录模块需共享Module.symvers文件 符号表位于/proc/kallsyms和/boot/System.map,可通过nm命令查

2025-11-12 12:16:34 246

原创 内核模块

本文解析了Linux内核模块的基础知识。内核模块是Linux内核的动态扩展机制,能够在不重启系统的情况下加载/卸载代码。文章详细介绍了内核模块的三大要素:入口函数(__init)、出口函数(__exit)和许可证声明(MODULE_LICENSE)。同时说明了模块开发中的关键技术点:使用printk替代printf、多文件编译方法以及模块信息宏(MODULE_AUTHOR等)。内核模块既提升了系统扩展性,又面临稳定性挑战,必须遵循GPL协议开发。

2025-11-12 11:00:07 535

原创 内核模块——编译方法(同目录、不同目录)

本文介绍了Linux内核模块开发的基本方法:1.动态加载方式通过编译独立.ko模块文件实现新功能扩展,分为内核源码同目录和不同目录两种编译方式;2.详细说明了主机Ubuntu和开发板环境下.ko模块的加载(insmod)、查看(lsmod)、卸载(rmmod)操作流程;3.强调模块名与.ko文件的区别,并解释了不同平台(ARM/x86)的编译注意事项。内核模块开发实现了内核功能的动态扩展与卸载。

2025-11-11 23:41:33 890

原创 静态加载法

摘要:本文介绍了Linux内核新功能的静态加载方法。关键步骤包括:1)将新功能源码(myhello.c)放入内核目录;2)配置Kconfig文件添加tristate选项;3)修改Makefile添加编译规则;4)通过makemenuconfig选择新功能为<*>编译进内核;5)生成uImage并测试。该方法通过Kconfig-Makefile联动机制,将新功能代码与内核一起编译到uImage中,启动后可通过printk输出验证功能是否生效。

2025-11-11 23:24:02 407

原创 交叉编译工具链

摘要:本文介绍了交叉编译的基本原理和开发板启动过程。机器码和汇编语言不可移植,而C语言通过编译器可生成不同架构的代码。推荐使用BSP板级开发包获取交叉编译工具链,包含ARM架构库和编译工具(gcc、readelf等)。ELF是Linux标准二进制格式,包含多段信息;BIN文件仅含CPU可执行指令。常用交叉编译工具包括size查看段大小、nm列出符号表、strip删除符号、objdump反汇编和objcopy格式转换,后者可将ELF转为纯二进制BIN文件。这些工具对嵌入式开发至关重要。

2025-10-29 15:31:16 865

原创 地址映射表

硬件控制原理:CPU通过地址映射间接控制硬件,各硬件控制器寄存器被映射到CPU地址空间,使CPU能像访问内存一样读写这些寄存器。处理器的地址映射表将Flash、RAM和寄存器等存储设备分配到不同地址段,实现对各硬件的访问与控制。SOC系统中,CPU通过这种地址映射机制实现对寄存器的操作,从而间接控制外部硬件。

2025-09-14 16:54:35 250

原创 状态寄存器传送指令

本文介绍了ARM汇编中的符号分类、指令类型及栈操作原理。汇编符号分为指令、伪指令和伪操作三类;ARM指令包括数据处理、跳转、内存访问等6种类型。重点讲解了栈的四种类型(FD/FA/ED/EA),其中ARM采用满减栈(FD)。通过叶子函数和非叶子函数的调用示例,说明栈操作规则:叶子函数不保存LR寄存器,非叶子函数必须压栈保护LR。文中提供了STMFD/LDMFD指令模板和"编号升序压,降序出"的速记口诀,并给出实际代码演示栈保护现场和恢复现场的过程。

2025-09-14 16:49:56 560

原创 ARM Load/Srore指令

汇编中的符号@ 1.指令: 能够编译生成一条32位的机器码,且能被CPU识别和执行@ 2.伪指令:本身不是指令,编译器可以将其替换成若干条等效指令@ 3.伪操作:不会生成代码,只是在编译之前告诉编译器怎么编译@ ARM指令@ 1.数据处理指令: 数学运算、逻辑运算@ 2.跳转指令: 实现程序的跳转,本质就是修改了PC寄存器@ 3.Load/Srore指令: 访问(读写)内存。

2025-09-14 15:29:39 570

原创 ARM跳转指令

本文总结了ARM汇编中的跳转指令及其应用。主要内容包括:1) 跳转指令的三种实现方式(直接修改PC、无返回跳转、带返回跳转);2) 条件跳转指令及其执行逻辑(BEQ/BNE/BGT等);3) 条件执行指令的特性;4) 通过比较指令实现if-else逻辑的汇编模板。文章还提供了具体的代码示例,包括如何用汇编实现数值比较和条件分支等常见编程结构,特别演示了通过减法循环实现两数比较的过程。这些内容系统介绍了ARM架构下程序流程控制的核心机制。

2025-09-14 15:05:14 482

原创 数据处理指令

汇编中的符号@ 1.指令: 能够编译生成一条32位的机器码,且能被CPU识别和执行@ 2.伪指令:本身不是指令,编译器可以将其替换成若干条等效指令@ 3.伪操作:不会生成代码,只是在编译之前告诉编译器怎么编译@ ARM指令@ 1.数据处理指令: 数学运算、逻辑运算@ 2.跳转指令: 实现程序的跳转,本质就是修改了PC寄存器@ 3.Load/Srore指令: 访问(读写)内存。

2025-09-14 14:52:08 543

原创 ARM异常处理

本文介绍了ARM处理器的异常处理机制。异常是指处理器在执行程序时遇到的不正常事件,需要暂停当前程序进行处理后再返回。ARM的异常源包括FIQ、IRQ、复位等7种类型,处理器会切换到对应的5种异常模式。异常响应时自动完成状态寄存器备份、模式切换和返回地址保存等操作。异常向量表存储跳转指令指向处理程序入口。异常返回需手动恢复状态寄存器和程序计数器。多个异常同时发生时按优先级顺序处理,其中FIQ响应最快,具有专用寄存器和更高优先级。整个机制确保异常事件能高效处理并恢复原程序执行。

2025-09-12 15:39:19 734

原创 ARM架构与计算机硬件基础全解析

本文系统介绍了计算机硬件基础和ARM体系结构理论。在计算机硬件部分,阐述了操作系统分层架构(应用开发与底层开发)、计算机组成(输入输出设备、存储器、CPU等)、多级存储结构(Cache/主存/辅存)及CPU工作原理(取指-译码-执行)。在ARM体系部分,重点讲解了RISC处理器特性、ARM指令集(32位ARM指令与16位Thumb指令)、存储模型(数据类型与字节序)、8种工作模式(User/FIQ/IRQ等)及其权限分类,以及37个ARM寄存器(31个通用寄存器和6个状态寄存器)的组织结构,包括PC、LR、

2025-09-10 20:31:15 1006

原创 select/poll/epoll 全对比

本文对比了select、poll和epoll三种I/O多路复用机制。select使用位图方式,存在1024个fd的上限;poll采用数组结构,突破了select的fd限制;epoll通过红黑树和就绪链表实现了高性能事件驱动。在时间复杂度上,select和poll都是O(n),而epoll为O(1)。触发模式方面,select和poll仅支持水平触发,epoll还支持边缘触发。选择建议:少量连接优先考虑select/poll,高并发场景应使用epoll,其中LT模式通用,ET模式适合追求极限性能。epoll是

2025-09-10 10:12:32 692

原创 多路复用---->(epoll)

fd: 服务器监听套接字epfd: epoll 实例的文件描述符newfd: 客户端连接的套接字events[]: epoll 返回的事件数组addr: 客户端地址信息结构体这次事件是哪个 fd 触发的?是监听套接字,还是某个客户端?在 poll 中,fds[0]永远是监听套接字,客户端 fd 不会覆盖它;比较就是判断这次事件是不是监听套接字触发。

2025-09-10 09:59:39 785

原创 多路复用--->(select ) 2

fd_set;通常是1024,表示最多可以监视 1024 个文件描述符。fd_set本质上是一个位图(bitmask),每一位对应一个文件描述符。比如第 5 位为 1,表示文件描述符 5 被加入集合。这是一个非常关键的细节,涉及到select的工作方式nfds是最大的文件描述符加 1,因为select()会遍历 [0, nfds) 范围内的所有整数,检查它们是否在fd_set中被置位。如果你用epoll,就不需要手动传这个值了,因为它是事件驱动而不是轮询。

2025-09-10 09:32:31 507

原创 多路复用--->(select)

这段循环写成i++)只是因为select的接口限制,不得不线性扫描;当并发量上去后,应改用epoll等现代事件通知机制,才能从根本上避免浪费。不会。accept()返回的新描述符一定 ≥ 当前已打开的最大描述符 + 1,这是 POSIX 的规定:也就是说内核总是**挑最小的“空闲号”**发给你。只要监听套接字fd自己还占着那个号码,后面所有accept()得到的newfd必然落在fd+1 …区间里,绝不会倒回去填充比fd小的空洞。因此++i)

2025-09-10 09:28:14 579

原创 多路复用--->(poll)

这条if只有在“监听 socket 上有新连接请求”时才会成立,不是每次都能运行成功。数组前移导致“下一个元素”落到了当前下标位置;如果不回退i,这个元素就会被跳过。因此必须i--。

2025-09-10 09:02:57 764

原创 四种IO模型

IO(输入/输出)是计算机与外部设备交换数据的过程,包括从设备读取数据到内存(输入)或将内存数据写入设备(输出)。Linux系统中,进程通过系统调用请求内核完成IO操作,内核会为每个IO设备维护缓冲区。网络IO包含两个阶段:数据从网卡到内核缓冲区,再从内核复制到用户空间。IO模型分为同步(阻塞、非阻塞、多路复用、信号驱动)和异步两类。多路复用(如epoll)是高性能服务器的核心,而异步IO则通过回调机制实现真正的非阻塞。不同模型在资源占用、响应速度等方面各有优劣。

2025-08-24 15:05:28 929

原创 UNIX套接字

UNIX 域用户数据报套接字的流程可参考 UDP 套接字。四、UNIX域数据报套接字(服务器端、客户端)

2025-08-24 10:35:03 347

原创 IP协议与ethernet协议

IP协议是互联网通信的基础,它通过路由器实现网络互联,使不同网络的主机能够透明通信。IP数据报首部包含多个关键字段:版本、首部长度、区分服务、总长度等。其中标识、标志和片偏移三个字段专门用于数据包分片处理:标识字段(16位)标记同一数据包的所有分片;标志字段(3位)控制分片行为,包含DF(禁止分片)和MF(更多分片)标记;片偏移字段(13位)指示分片在原始数据包中的位置(以8字节为单位)。当数据包超过路径上的MTU(如以太网1500字节)时,路由器会根据这些字段进行分片传输,确保大数据包能通过较小MTU的网

2025-08-24 09:49:58 758

原创 TCP连接与UDP协议

摘要:TCP通过三次握手(SYN→SYN-ACK→ACK)建立可靠连接,四次挥手(FIN→ACK→FIN→ACK)安全释放连接,确保数据传输完整性。UDP提供无连接服务,面向报文传输,具有首部开销小、无拥塞控制等特点,适合实时应用但不可靠。两者对比:TCP强调可靠连接管理,UDP侧重高效简单传输。

2025-08-24 09:05:16 946

原创 TCP是如何实现可靠传输的

TCP是面向连接的可靠传输协议,具有点对点通信、全双工和面向字节流的特点。它通过确认机制、超时重传和滑动窗口实现可靠性:发送方等待ACK确认,超时未收到则重传;接收方使用累积确认机制。TCP报文首部包含源/目的端口、序号、确认号、控制标志(SYN、ACK等)、窗口大小等字段,最小首部20字节,通过数据偏移定位数据起始位置。控制标志位实现连接建立/终止、紧急数据传输等功能,检验和确保数据完整性。

2025-08-20 14:49:35 1046

原创 UDP通信 -socket 接口函数扩展

本文介绍了网络通信中的核心函数:1) send/recv与read/write函数原型对比,前三个参数相同,send/recv增加了flags参数(如MSG_PEEK、MSG_OOB);2) sendto/recvfrom函数用于UDP通信,增加了地址参数;3) 简要提及UDP通信的实现过程。这些函数是网络编程的基础,send/recv用于TCP,sendto/recvfrom用于UDP通信。

2025-08-20 10:28:36 294

原创 TCP并发实现(代码)

本文介绍了TCP服务器与客户端的实现方法。服务器端通过socket创建套接字,设置SA_RESTART标志处理僵尸进程,接受客户端连接后fork子进程处理通信,父进程必须关闭newfd避免资源泄漏。客户端创建套接字后连接服务器,通过循环发送用户输入。重点解析了父进程关闭newfd的必要性:fork后父子进程共享socket对象,若不关闭会导致连接无法释放和文件描述符耗尽。线程版本则通过pthread_create创建线程处理连接。文中还展示了信号处理函数回收子进程的细节。

2025-08-20 10:17:00 743

原创 实现TCP通信(代码)

本文展示了基于TCP协议的C语言Socket通信实现,包含服务端和客户端代码。服务端通过socket()创建套接字,bind()绑定地址和端口,listen()进入监听模式,accept()接受客户端连接,并使用read()接收数据。客户端同样创建套接字后,通过connect()连接服务端,使用write()发送用户输入的数据。关键点包括:网络字节序转换(htons)、IP地址转换(inet_aton)、错误处理以及基本的通信流程。代码实现了简单的双向通信功能,服务端可接收并显示客户端发送的消息。

2025-08-20 09:46:50 192

原创 实现TCP通信

本文介绍了TCP协议实现过程中的关键系统调用和数据结构。主要内容包括:1)socket函数的参数设置,包括通信域、套接字类型和协议选择;2)bind函数的使用及IPv4地址结构体sockaddr_in的定义;3)listen和accept函数实现服务器监听和连接处理。重点说明了流式套接字SOCK_STREAM与TCP协议的对应关系,以及网络字节序转换的必要性。这些系统调用和数据结构构成了TCP网络编程的基础框架。

2025-08-20 09:33:45 392

原创 Socket 套接字及TCP的实现框架

本文介绍了网络体系结构的两种形式:体系结构定义网络各层功能,而实现则涉及具体硬件/软件的选用。重点讲解了网络编程中的套接字接口,包括socket()、bind()、listen()、accept()等核心API函数的使用方法,以及IPv4/IPv6地址结构体的差异。文章还分析了三种套接字类型(流式、数据报、原始套接字)的特点,阐述了网络通信的三元组要素(IP地址、端口、协议)。最后详细说明了TCP通信的实现过程,包括建立连接(socket-bind-listen-accept)、数据传输(read/writ

2025-08-18 11:07:36 1040

原创 字节序及IP地址转换

字节序是计算机存储多字节数据的顺序,分为大端和小端两种。主机一般采用小端字节序,而网络通信必须使用大端字节序。可通过判断变量的首字节值来确定主机的字节序类型。在编程中,可使用htonl/ntohl等函数进行主机和网络字节序的转换。对于IP地址,需要将"点分十进制"字符串与32位数据进行相互转换,相关函数包括inet_addr()、inet_ntoa()等,其中inet_pton()和inet_ntop()还支持IPv6地址的转换。这些转换需注意主机和网络字节序的区别。

2025-08-16 20:44:49 333

原创 IP地址及编址方式

1、IP地址由32 位二进制代码表示每8位为一组,采用点分十进制记法。例如:192.168.0.2 个字段:网络号和主机号 IP 地址 ::= { <网络号>, <主机号>}IP地址在整个互联网范围内是的。IP 地址指明了连接到某个网络上的一个主机A类地址范围:0~127;B类地址范围:128~191;C类地址范围:192~223;D类地址范围:224~239;E类地址范围:240~2553、一般不使用的特殊的 IP 地址:4、分类的 IP 地址的优点和缺点•••••••:无分类域间路由选择。

2025-08-16 17:19:04 1050

原创 TCP/IP协议与五层体系结构

TCP/IP体系结构是互联网事实标准,包含应用层(HTTP、DNS等)、传输层(TCP/UDP)、网络层(IP)和网络接口层。其中TCP保证可靠传输,UDP注重时效性;网络层负责路由选择与分组转发;数据链路层实现相邻节点通信;物理层传输比特流。互联网采用客户-服务器模式,可同时服务多个客户进程。该结构已演变为应用程序可直接使用底层协议,如ping命令。五层协议是民间分类,区别于官方的OSI七层和TCP/IP四层模型。

2025-08-15 14:59:50 974

原创 计算机网络的体系结构

OSI开放互联参考模型:物理层->数据链路层->网络层->传输层->会话层->表示层->应用层。:发送端几个高层会话复用条低层的连接,在接收端再进行分用。:交换数据前先建立一条逻辑连接,数据传送结束后释放连接。:发送端的发送速率必须使接收端来得及接收,不要太快。的数据块划分为更小的单位,在接收端将其还原。:使相应层次对等方的通信更加可靠。

2025-08-14 09:52:03 459

原创 数据结构(一)

线性关系 (1:1)、层次关系(1:N)、网状关系(N:N)

2023-09-25 17:00:50 143 1

原创 C语言 动态内存(二)

释放堆空间后,p成了空悬指针 动态分配失败。malloc与free是配对使用的, free只能释放堆空间。如果malloc返回的指针值丢失,则所分配的堆空间无法回收,称内存泄漏,删除一个指针p (free(p);),实际是删除了p所指的目标(变量或对象)释放了它所占的堆空间,而不是删除 p本身量或对象等)1、野指针:不是NULL指针,是指向“垃圾”(当前不需要的指针)内存的指针。

2023-09-23 20:14:26 142 1

原创 C语言 动态内存

malloc 本身并不识别要申请内存是什么类型,它只关心内存的总字节数 malloc申请到的是一块连续的内存,有时可能会比所申请到的空间大,有时会申请不到内存,返回NULL申请的空间大。静态存储分配: 通常定义变量,编译器在编译时都可以根据该变量的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。

2023-09-23 19:52:29 133 1

原创 C语言 共用体与typedef

这种数据构造类型称为共用体,简称共用。共用体 在定义,说明和使用形式上与结构体相似。两都本质上的不同仅在于使用内存的方式上。例如:typedef int integer;(此时定义的integer等价于int );形式为:typedef <已有数据类型> <新数据类型>;在C语言中,允许使用关键字typedef定义新的数据类型。union 共用体名。2、定义结构体时定义。

2023-09-23 18:44:46 137 1

原创 C语言 结构体数组(2)

【代码】C语言 结构体数组(2)

2023-09-23 12:29:54 95 1

空空如也

空空如也

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

TA关注的人

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