Linux
文章平均质量分 81
凛冬将至__
嵌入式软件开发(驱动开发),文章内容主要为个人学习整理,偏向于实际应用
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【Linux】fessk()详细解析
fseek()是 C 语言标准库中的一个非常重要的文件操作函数,用于在打开的文件中。通过fseek(),可以在文件的任意位置读取或写入数据。它是随机访问文件的基础,与顺序读取相比,可以提高对文件操作的灵活性。fseek()FILEfopen()offsetwhencewhenceSEEK_SETSEEK_CURSEEK_ENDfseek()offsetoffsetwhenceoffsetoffsetoffsetwhencewhenceSEEK_SET:将文件指针设置为相对于文件开头的offset位置。原创 2024-10-24 22:40:32 · 1236 阅读 · 0 评论 -
【Linux】ls -l|grep ^-|wc -l 统计当前目录下当前文件个数
命令是用于统计当前目录下的个数的一个组合命令。原创 2024-10-24 22:17:12 · 1289 阅读 · 0 评论 -
【Linux】统计当前目录及其所有子目录下的所有文件的个数 find . -type f -name “*.txt“ | wc -l
递归查找所有普通文件递归查找特定类型的文件**仅统计当前目录中的文件(不递归)原创 2024-10-24 22:17:05 · 1116 阅读 · 0 评论 -
【Linux】wc命令详细解析
wc是 Linux 中的一个常用命令,它的全称是 “word count”(字数统计),用于计算文件中的和或。wc可以处理一个或多个文件,也可以通过管道接收其他命令的输出作为输入。原创 2024-10-20 19:42:36 · 1751 阅读 · 0 评论 -
【Linux】dd命令常用的使用场景
【代码】【Linux】dd命令常用的使用场景。原创 2024-10-13 20:39:49 · 1389 阅读 · 0 评论 -
【Linux】dd命令
dd命令是 UNIX 和类 UNIX 系统(如 Linux)中的一个非常强大的工具,专用于复制和转换文件。它特别适合操作原始设备,如磁盘、分区和 USB 驱动器等,能够以块为单位读取和写入数据,并支持数据转换,例如字节交换、大写转换、ASCII 与 EBCDIC 编码转换等。原创 2024-10-01 19:32:29 · 2531 阅读 · 0 评论 -
【Shell】if表达式
Shell 提供了丰富的文件测试选项来检测文件或目录的存在、类型及权限等。可以简化条件的书写并避免一些常见的错误。语法中可以使用字符串模式匹配,例如使用通配符或正则表达式。Shell 支持多个条件组合在一起进行判断,例如使用。命令中可以使用经典的 C 风格比较运算符,如。语句进行模式匹配,它在处理多种情况时非常有用。用于进行算术运算,常用于数值计算和逻辑判断。语句,shell 脚本中还可以使用。原创 2024-09-29 22:15:09 · 1257 阅读 · 0 评论 -
【Linux】Linux驱动开发 IO模型:非阻塞IO
当应用程序发起读取数据(read)的时候,不管数据有没有准备好,read函数都应该立即返回。如果数据准备好了,立即返回数据,如果没有准备好,返回错误码。原创 2023-04-16 10:35:29 · 371 阅读 · 0 评论 -
【Linux】Linux驱动开发 IO模型:阻塞IO
当应用程序发起读取数据(read)的时候,如果数据没有准备好,就会阻塞等待(进程休眠),如果与硬件的数据准备好了,就会产生硬件中断,在中断处理函数中唤醒休眠的进程,然后将准备好的数据拷贝至用户空间。原创 2023-04-16 13:26:50 · 638 阅读 · 0 评论 -
【Linux】Linux设备驱动开发:字符设备驱动的注册与注销
解析一下各个参数major:主设备号,如果写0可以动态申请name:申请设备的设备名fops:file_operations结构体返回值:返回申请到的设备号。原创 2023-03-30 14:50:18 · 1719 阅读 · 0 评论 -
【Linux】Linux驱动开发 IO模型:多路复用(select/poll/epoll)
在同一个APP应用程序同时监听多个硬件的数据,此时就需要使用I0多路复用机制中的select/poll/epoll来完成多个文件描述符的监听的过程,如果所有的文件描述符对应的数据都没有准备好,进程休眠。3. epoll当在休眠的时候,如果有驱动的数据准备好,epoll能 直接拿到准备好的文件描述符,不需要遍历,效率高。3.当有文件描述符的对应驱动的数据准备好的时候,需要再次遍历找到准备好的文件描述符,效率低。3.当有文件描述符的对应驱动的数据准备好的时候,需要再次遍历找到准备好的文件描述符,效率低。原创 2023-04-17 18:12:46 · 1500 阅读 · 0 评论 -
【Linux】Linux内核定时器(标准定时器)
其中expires的单位是节拍数,节拍数等于 1 / HZ,而HZ是内核中定义好的,比如说内核中定义的HZ为100, jiffies(jiffies记录了系统启动后的滴答数)就会增加100。原创 2023-04-19 20:23:19 · 392 阅读 · 0 评论 -
【Linux】Linux应用开发:线程间通信(同步互斥机制)(互斥锁、条件变量、信号量)
互斥锁主要用来保护临界资源,每个临界资源都由一个互斥锁来保护,任何时刻最多只能有一个线程能访问该资源。线程必须先获得互斥锁才能访问临界资源,访问完资源后释放该锁。如果无法获得锁,线程会阻塞直到获得锁为止。条件变量是利用线程间共享的全局变量进行同步的一种机制。主要包括两个动作,一个线程等待“条件变量的条件成立”而挂起,另一个线程使“条件成立” (给出条件成立信号 )并唤醒挂起线程。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。对条件的测试是在互斥锁(互斥)的保护下进行的。原创 2023-05-11 17:28:02 · 1482 阅读 · 0 评论 -
【Linux】Linux应用开发:进程间通信 System V
1、共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝2、为了在多个进程间交换信息, 内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间,进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大提高的效率。3、由于多个进程共享一段内存,因此也需要依靠某种同步机制,如 互斥锁 和 信号量 等。1、消息队列就是一个消息的列表。用户可以在消息队列中添加消息、读取消息等。2、消息队列可以按照类型来发送接收消息。原创 2023-05-07 22:40:43 · 1518 阅读 · 0 评论 -
【Linux】Linux驱动开发:gpio子系统
在设备树中,“GPIO组”就是一个GPIO Controller,这通常都由芯片厂家设置好。我们要做的是找到它名字,比如“gpio1”,然后指定要用它里面的哪个引脚,比如。如果要操作GPIO引脚的话,需要先将所用引脚配置为GPIO功能,这需要通过Pinctrl子系统来实现。在Pinctrl子系统将引脚配置为GPIO功能后,就可以使用GPIO子系统来设置GPIO的方向等。表示这个节点是一个GPIO Controller,它下面有很多引脚。在根节点下写自己的节点。在根节点下写自己的节点。原创 2023-05-05 13:29:31 · 3507 阅读 · 0 评论 -
【Linux】Linux驱动开发 IO模型:异步通知IO(signal、fasync)
在进程中注册一个信号处理函数,如果硬件的数据准备好的时候,会产生中断,在中断处理函数中给这个进程发送信号即可。如果内核没有发出信号应用程序,不需要阻塞,运行自己特有的代码即可。本来也要在中断处理函数中发送,此处同样的也是在write函数中发信号。2、通过fcntl调用到底层的fasync函数。3、将当前进程号告诉内核。1、注册信号处理函数。原创 2023-04-18 11:42:46 · 804 阅读 · 0 评论 -
【Linux】Linux驱动开发:SPI子系统
SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动,主机控制器也就是 SOC 的 SPI 控制器接口。样。和 I2C适配器驱动一样,SPI主机驱动一般都是 SOC 厂商去编写的,所以我们作为 SOC的使用者,这一部分的驱动就不用操心了。原创 2023-05-07 11:58:53 · 3423 阅读 · 2 评论 -
【Linux】进程间通信:信号
2、信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来 通知 用户空间进程发生了哪些系统事件。5.2.3中,提到了可以用子进程在退出的时候,给父进程发送一个SIGCHLD信号,来回收僵尸进程。3、如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它。4、如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。自定义信号处理函数,当信号发生的时候,立即执行自定义信号处理函数。3、执行缺省操作(执行默认操作)原创 2023-05-18 22:31:31 · 798 阅读 · 0 评论 -
【Linux】Linux驱动开发:platform总线驱动
/定义在linux/module.h中使用时,参数如下:of:总线类型match_table:idtable数组首地址。原创 2023-05-06 14:20:42 · 2645 阅读 · 0 评论 -
【Linux】Linux驱动开发:块设备驱动
1、系统中能够随机访问固定大小(1block 512byte)数据片的设备被称之为块设备。块设备文件一般都是以安装文件系统的方式使用,这也是块设备通常的访问方式。块设备的方式访问方式是随机的。2、块设备中小的可寻址单位是扇区,扇区大小一般是2的整数倍。常见的大小是512字节。扇区的大小是块设备的物理属性,扇区是所有块设备的基本单元,块设备无法对比扇区更小的单位进行寻址和操作。3、块是文件系统的一种抽象,只能基于块来访问文件系统。原创 2023-05-13 23:57:59 · 1736 阅读 · 0 评论 -
【Linux】Linux驱动开发:设备树节点与属性
目录1、设备节点(node)2、属性(property)3、节点的一些特性4、节点的一些标准属性4.1 compatible属性4.2 model属性4.3 status属性4.4 reg属性4.5 #address-cells和 #size-cells属性5、device_node结构体6、property结构体7、 找到节点(device_node)的API7.1 定义节点7.2 of_find_node_by_path7.3 of_find_node_by_name7.4 of_find_compat原创 2023-04-19 14:35:29 · 3313 阅读 · 0 评论 -
【Linux】Linux驱动开发:并发与竞态(原子操作、自旋锁、信号量、互斥体)
/配合 atomic_dec_and_test 使用//定义并初始化原子变量//配合 atomic_inc_and_test 使用//定义并初始化原子变量。原创 2023-05-14 15:29:12 · 1790 阅读 · 0 评论 -
【Linux】Linux驱动开发:I2C子系统
I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。在Linux 内核中 I2C 的体系结构分为3 个部分:1、I2C 核心:I2C 核心提供了I2C 总线驱动和设备驱动的注册、注销方法等。2、I2C 总线驱动:I2C 总线驱动是对I2C 硬件体系结构中适配器端的实现,适配器可由 CPU 控制,甚至可以直接集成在CPU 内部。一般SOC 的 I2C 总线驱动都是由半导体厂商编写的,不需要用户去编写。原创 2023-05-06 22:41:39 · 2377 阅读 · 0 评论 -
【Linux】Linux驱动开发:中断子系统
参考文档内核目录如果中断控制器有级联关系,下级的中断控制器还需要表明它的“interrupt-parent”是谁,用了interrupt-parent”中的哪一个“interrupts”你要用哪一个中断控制器里的中断?interrupts你要用哪一个中断?Interrupts里要用几个cell,由 interrupt-parent 对应的中断控制器决定。在中断控制器里有“#interrupt-cells”属性,它指明了要用几个cell来描述中断。原创 2023-05-05 21:37:39 · 1934 阅读 · 0 评论 -
【Linux】Linux内核内存分配函数kmalloc()、kzalloc()、vmalloc()与__get_free_page()
作为内存管理的基本单位,尽管处理器的最小寻址单位通常为字(或者为字节),但是MMU(内存管理单元)通常以页为单位进行处理。从虚拟内存的角度看,页就是最小单位。等类似函数,申请的内存位于DMA和常规区域的映射区,而且在。申请内存的过程中可以睡眠,因此不能用于中断上下文中。标志来申请内存,若不存在空闲页,直接返回。标志申请内存时,若暂时不能满足,则进程会。等待页,即会引起阻塞,因此。原创 2023-07-08 12:00:29 · 1155 阅读 · 0 评论 -
【Linux】统一设备模型(kobject、kset、kobj_type)
在之前学习设备驱动的时候,即字符设备驱动的注册与注销这篇文章的时候,在cdev_alloc()和cdev_init()中均出现了kobject_init()这个函数,在当时并不清楚是什么东西,因为当时在乎的是把设备驱动这个框架给学会,在昨天看到文章的时候,又想起来还有这么一个东西没有去搞懂,于是稍微学习了一下,做一个笔记在此。原创 2023-08-03 01:15:00 · 975 阅读 · 0 评论 -
【Linux】Linux shell 脚本 之 getopt
getopt是一个用于解析命令行选项的工具,常用于编写需要处理多个命令行参数的脚本。它支持短选项(如-v)和长选项(如--version),并能处理带有参数的选项。getopt是 GNU 库中的一个标准工具,大多数 Unix 和 Linux 系统上都提供了它的实现。原创 2024-08-06 23:44:41 · 767 阅读 · 0 评论 -
【Linux】Image、zImage与uImage的区别
zImage是一种经过压缩的 Linux 内核镜像格式,它通过gzip压缩内核代码和数据,使文件大小大大减小。zImage也称为 “compressed kernel image”,在加载时会自解压缩到内存中然后执行。uImage是 U-Boot 引导加载程序专用的内核镜像格式。它是在zImage或Image的基础上加上一个 U-Boot 头部信息(U-Boot Header),使 U-Boot 能够识别并加载内核镜像。原创 2024-09-16 11:20:46 · 2949 阅读 · 0 评论 -
【Linux】uImage头部信息详细解析
【代码】【Linux】uImage头部信息详细解析。原创 2024-09-16 11:19:03 · 2177 阅读 · 0 评论 -
【Shell】在shell脚本中$的使用方法
变量引用$var表示引用变量。命令替换$()或`command`。位置参数$0$1$#$@$*。特殊变量$$等。花括号操作:用于字符串操作、默认值、替换等。原创 2024-09-08 16:42:21 · 2434 阅读 · 0 评论 -
【Linux】动态库的制作与链接
首先,你需要编写包含你想要打包成动态库的函数或类的源代码。在编写程序时,你可以链接并使用这个动态库。在文件末尾添加一行,将动态库路径添加到。将生成的动态库文件(如。要使更改立即生效,可以运行以下命令。)拷贝到系统默认的动态库路径,如。文件,添加动态库所在的路径。一个完整的动态库文件名如。将动态库所在的目录添加到。原创 2024-08-25 15:15:18 · 1860 阅读 · 0 评论 -
【Linux】Linux下默认的include,include的默认搜索路径
目录中的头文件主要用于嵌入式平台或者特定硬件架构,定义了与特定机器相关的接口和实现。:这些头文件与 Linux 内核的视频子系统相关,定义了图形和显示设备的接口,包括 framebuffer 驱动程序等。目录中的头文件包含了大量的内核接口、数据结构和宏定义,用于编写与内核交互的代码,如驱动程序、内核模块等。:这些头文件与内核的跟踪和调试子系统相关,定义了跟踪点、事件和跟踪控制接口,用于内核性能分析和调试。目录中的头文件是与架构相关的接口定义,提供了特定处理器架构的低级接口和汇编相关的宏或函数。原创 2024-08-18 18:07:37 · 2159 阅读 · 0 评论 -
【Linux】详细解析Linux内核链表
LIST_POISON1 和 LIST_POISON2 是 Linux 内核用来标记已删除链表节点的特殊值。这是内核开发者采用的一种巧妙的防御性编程技术,有助于编写更安全、更健壮的内核代码。list_entry 利用了 C 语言的一个特性:结构体成员的偏移量是固定的。它计算出 struct list_head 成员在整个结构体中的偏移,然后从这个 list_head 指针反推出整个结构体的起始地址。在上面的函数原型中,有这两行代码,他们的含义是什么呢。原创 2024-08-18 17:39:39 · 1907 阅读 · 0 评论 -
【Linux】mmap与ioremap
4、如果要操作设备的物理地址,有两种办法,一种是使用ioreamap(),然后用户调用read,write,ioctrl系统调用去访问那块物理地址,这里涉及到了。2、ioreamap()使用在内核里,将设备所在的物理地址映射到内核虚拟地址上,以后访问那个物理地址直接操作映射的虚拟地址就好。3、mmap()用在用户空间,将将设备所在的物理地址映射到用户虚拟地址上,以后访问那个物理地址直接操作映射的虚拟地址就好。,一次是用户空间到内核空间的拷贝,一次是内核空间到物理地址的拷贝;1、两者都是内存映射的函数。原创 2023-07-22 10:11:51 · 2253 阅读 · 0 评论 -
【Linux】基于IO多路复用的TCP、UDP
基于IO多路复用的TCP、UDP原创 2023-05-22 19:56:40 · 300 阅读 · 0 评论 -
【Linux】Linux 线程基础
8、一个进程中的多个线程共享的资源:可执行的指令、静态数据、进程中打开的文件描述符、信号处理函数、当前工作目录、用户 ID、用户组 ID。4、由于进程的地址空间是私有的,因此在进程间上下文切换时,系统开销比较大,在同一个进程中创建的线程共享该进程的地址空间。4、由于进程之间相互独立,线程共享同一进程下的资源,所以多进程的稳定性比多线程高,且多进程的资源量比多线程高。3、创建子进程的时候需要克隆父进程的所有资源,而创建线程不需要克隆资源,因为本身就共享同一进程下的资源。线程和进程都参与统一的调度。原创 2023-05-20 17:19:46 · 971 阅读 · 0 评论 -
【Linux】Linux应用开发:socket网络编程(TCP、UDP)
Linux应用开发:socket原创 2023-05-13 17:27:32 · 1412 阅读 · 0 评论 -
【Linux】setsockopt的常用选项
(4)在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步),系统默认的状态发送和接收一次为8688字节(约为8.5K);打开这个功能后,内核在val时间之类还没有收到数据,不会继续唤醒进程,而是直接丢弃连接。从三次握手上讲,就是设置这个状态之后,就算完成了三次握手,服务器socket状态也不是ESTABLISHED,而依然是 SYN_RCVD,不会去接收数据。注:此文原链接为,由于写的很好,我怕此文挂掉,所以抄了一份。原创 2023-05-13 15:37:36 · 979 阅读 · 0 评论 -
【Linux】Linux 进程基础
exec 函数族提供了一种在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段。在执行完之后原调用进程的内容除了进程号外其他全部都被替换了。可执行文件既可以是二进制文件也可以是任何 Linux 下可执行的脚本文件。当进程认为自己不能再为系统和用户做出任何贡献了时就可以调用 exec 函数,让自己执行新的程序。如果某个进程想同时执行另一个程序,它就可以调用fork 函数创建子进程,然后在子进程中调用任何一个exec 函数。原创 2023-05-12 13:15:58 · 3132 阅读 · 0 评论
分享