linux开发
文章平均质量分 95
Frey_Liu
软件工程师
展开
-
Linux进程通信之管道解析
管道是 UNIX系统 IPC的最古老的形式,所有的UNIX系统都提供此种通信。所谓的管道,也就是内核里面的一串缓存,从管道的一段写入的数据,实际上是缓存在内核中的,令一端读取,也就是从内核中读取这段数据。对于管道传输的数据是无格式的流且大小受限。对于管道来说,也分为匿名管道和命名管道,其中命名管道也被叫做 FIFO,下面则分别阐述这两种管道。转载 2024-03-13 22:45:48 · 98 阅读 · 0 评论 -
操作系统常见问题
epoll使用事件驱动的机制,内核里维护了一个链表来记录就绪事件,当某个socket有事件发生时,通过回调函数内核会将其加入到这个就绪事件列表中,当用户调用epoll_wait()函数时,只会返回有事件发生的文件描述符的个数,只将有事件发生的 Socket 集合传递给应用程序,不需要像select/poll那样轮询扫描整个socket集合,大大提高了检测的效率。如果程序要访问虚拟地址的时候,由操作系统转换成不同的物理地址,这样不同的进程运行的时候,写入的是不同的物理地址,这样就不会冲突了。原创 2024-03-10 17:46:18 · 913 阅读 · 0 评论 -
网络协议常见问题
不是重传 SYN,重传的 SYN 的序列号是一样的)。为了防止历史连接中的数据,被后面相同四元组的连接错误的接收,因此 TCP 设计了 TIME_WAIT 状态,状态会持续 2MSL 时长,这个时间足以让两个方向上的数据包都被丢弃,使得原来连接的数据包在网络中都自然消失,再出现的数据包一定都是新建立连接所产生的。在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环。原创 2024-03-10 14:16:13 · 1484 阅读 · 0 评论 -
TCP与UDP
TCP与UDP协议TCP协议TCP原理确认应答机制超时重传机制连接管理机制滑动窗口流量控制拥塞控制延迟应答捎带应答粘包问题UDP协议参考协议协议(protocol)是不同的硬件、操作系统之间的通信,所需的一种规则。这种规则就是计算机与网络设备要相互通信,双方所使用的相同方法。比如:如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。TCP/IP 是互联网相关的各类协议族的总称,比如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都属于 TCP原创 2022-04-18 22:44:07 · 1469 阅读 · 0 评论 -
深度解析 slab 内存池回收内存以及销毁全流程
整个 slab cache 系列篇幅非常庞大,涉及到的细节非常丰富,为了方便大家回顾,笔者这里将 slab cache 系列涉及到的重点内容再次梳理总结一下。转载 2023-06-11 22:43:12 · 782 阅读 · 0 评论 -
深入理解 slab cache 内存分配全链路实现
本文我们基于 slab cache 的完整的架构,近一步深入到内核源码中详细介绍了 slab cache 关于内存分配的完整流程:我们可以看到 slab cache 内存分配的整个流程分为 fastpath 快速路径和 slowpath 慢速路径。其中在 fastpath 路径下,内核会直接从 slab cache 的本地 cpu 缓存中获取内存块,这是最快的一种方式。从本地 cpu 缓存 partial 列表中分配从 NUMA 节点缓存中分配,其中涉及到了对本地 cpu 缓存的填充。转载 2023-06-11 22:35:23 · 720 阅读 · 0 评论 -
从内核源码看 slab 内存池的创建初始化流程
本文笔者基于内核 5.4 版本,从源码角度详细讨论了 slab cache 的创建初始化过程,创建流程如下图所示:经过该流程的创建之后,我们得到了如下图所示的 slab cache 架构:在这个过程中,笔者又近一步从源码角度介绍了内核具体是如何对 slab 对象进行内存布局的。在这个内存布局的基础上,笔者又近一步展开了内核如何计算一个 slab 到底需要多少个物理内存页,以及一个 slab 到底能够容纳多少内存块的相关逻辑。转载 2023-06-11 22:29:38 · 656 阅读 · 0 评论 -
一步一步推演 slab 内存池的设计与实现
本文在伙伴系统的基础上又为大家详细介绍了一款内核专门应对小内存块管理的 slab 内存池,并列举了 slab 内存池在内核中的几种应用场景。转载 2023-06-11 21:17:23 · 720 阅读 · 0 评论 -
深度剖析 Linux 伙伴系统的设计与实现
我们前面一直在谈伙伴系统,那么伙伴这个概念到底在内核中是什么意思呢?其实下面这张伙伴系统的结构图已经把伙伴的概念很清晰的表达出来了。伙伴在我们日常生活中含义就是形影不离的好朋友,在内核中也是如此,内核中的伙伴指的是大小相同并且在物理内存上是连续的两个或者多个 page。比如在上图中,free_area[1] 中组织的是分配阶 order = 1 的内存块,内存块中包含了两个连续的空闲 page。这两个空闲 page 就是伙伴。转载 2023-06-11 19:07:37 · 588 阅读 · 0 评论 -
深入理解 Linux 物理内存分配全链路实现
本文首先从 Linux 内核中常见的几个物理内存分配接口开始,介绍了这些内存分配接口的各自的使用场景,以及接口函数中参数的含义。并以此为起点,结合 Linux 内核 5.19 版本源码详细讨论了物理内存分配在内核中的整个链路实现。快速路径 fast path:该路径的下,内存分配的逻辑比较简单,主要是在 WMARK_LOW 水位线之上快速的扫描一下各个内存区域中是否有足够的空闲内存能够满足本次内存分配,如果有则立马从伙伴系统中申请,如果没有立即返回。转载 2023-06-11 17:51:30 · 603 阅读 · 0 评论 -
一步一图带你深入理解 Linux 物理内存管理
在我们理解了物理内存的 NUMA 架构,以及在 NUMA 架构下的内存分配策略之后,本小节笔者来为大家介绍下如何正确的利用 NUMA 提升我们应用程序的性能。前边我们介绍了这么多的理论知识,但是理论的东西总是很虚,正所谓眼见为实,大家一定想亲眼看一下 NUMA 架构在计算机中的具体表现形式,比如:在支持 NUMA 架构的机器上到底有多少个 NUMA 节点?每个 NUMA 节点包含哪些 CPU 核,具体是怎样的一个分布情况?前面也提到 CPU 在访问本地 NUMA 节点中的内存时,速度是最快的。转载 2023-06-11 15:40:30 · 852 阅读 · 0 评论 -
一步一图带你深入理解 Linux 虚拟内存管理
当程序运行起来之后就变成了进程,而这些业务数据结构的引用在进程的视角里全都都是虚拟内存地址,因为进程无论是在用户态还是在内核态能够看到的都是虚拟内存空间,物理内存空间被操作系统所屏蔽进程是看不到的。进程通过虚拟内存地址访问这些数据结构的时候,虚拟内存地址会在内存管理子系统中被转换成物理内存地址,通过物理内存地址就可以访问到真正存储这些数据结构的物理内存了。随后就可以对这块物理内存进行各种业务操作,从而完成业务逻辑。转载 2023-06-11 15:38:30 · 1113 阅读 · 0 评论 -
进程与线程
进程是计算机系统资源分配的最小单元,进程为线程提供资源。一个进程中可以有多个线程,同一个进程中的线程可以共享进程中的资源。线程是计算机可以被CPU调度的最小单元。原创 2023-03-05 21:26:27 · 1031 阅读 · 0 评论 -
Linux中的各种栈:进程栈 线程栈 内核栈 中断栈
Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈栈的作用1. 函数调用2. 多任务支持Linux 中有几种栈?各种栈的内存位置?1. 进程栈2. 线程栈3. 进程内核栈4. 中断栈Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈栈的作用首先,栈 (stack) 是一种串列形式的数据结构。这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 top) 进行推入 (push) 和弹出 (pop) 操作。根据栈的特点,很容易的想到转载 2021-12-04 00:49:11 · 4043 阅读 · 2 评论 -
嵌入式Linux内存管理
嵌入式内存管理被欺骗的C进程每一个C语言的程序被执行起来的时候系统为了更方便开发人员操作,会给每一个进程分配一个虚拟的内存空间,它实际上是从处理内存映射出来的。虚拟内存的起始地址结束地址都是固定的,因此虚拟内存的布局都是一样。比如有三个进程 P1 P2 P3 ,他们虽然得到的物理内存是完全不一样,但是从进程的角度来看他们三个得到的内存确实一模一样的。假设你正在使用的计算机实际物理内存只有 1GB 大小,而当前系统运行了三个进程,Linux 会将 PM 中的某些内存映射为三个大小均为 4GB 的虚拟内转载 2021-12-19 18:33:03 · 1089 阅读 · 0 评论 -
WSL2的安装、应用、内核模块编译安装
win10系统上开启WSL2的安装、升级,及WSL2的常见应用!原创 2022-12-24 11:52:08 · 3628 阅读 · 1 评论 -
Linux常用命令
Linux常用的命令,未完待续!原创 2022-12-23 11:17:45 · 1953 阅读 · 0 评论 -
利用WSL2搭建Qemu仿真Vexpress-a9开发环境
利用WSL2搭建Qemu仿真Vexpress-a9开发环境,实现了制作根文件系统,u-boot引导linux运行。原创 2022-12-05 23:25:10 · 3599 阅读 · 1 评论 -
u-boot常用命令
uboot 的全称是 Universal Boot Loader, uboot可看作是一个逻辑软件,用来引导内核启动。板子相关信息环境变量操作环境变量的操作涉及到两个命令: setenv 和 saveenv,命令 setenv 用于设置或者修改环境变量的值。命令 saveenv 用于保存修改后的环境变量,一般环境变量是存放在外部 flash 中的,uboot 启动的时候会将环境变量从 flash 读取到 DRAM 中。所以使用命令 setenv 修改的是 DRAM中的环境变量值原创 2022-12-04 02:30:24 · 2433 阅读 · 0 评论 -
修改Ubuntu的源列表
修改Ubuntu的源列表(source list)环境:win10自带Ubuntu 14.04.5 LTS \n \lsources.list所在目录:/etc/apt/sources.list 修改sources.list的目的主要是因为ubuntu默认的源地址一般是国外地址,下载安装软件扥度比较慢,可以使用命令”cp sources.list sources.list_bk”备原创 2018-02-05 20:33:47 · 4534 阅读 · 1 评论 -
ADB驱动程序无数字签名
ADB驱动程序无数字签名win10电脑的ADB驱动安装完成后,会出现依然不能用的情况,提示信息显示“无法验证设备的数字签名”,这是就需要关闭win10 的驱动程序数字签名。 安装完ADB驱动后可能会出现: 这时就需要禁用win10的驱动程序强制签名。先在Win10的桌面打开任务栏左下角“开始” 图标,选择其中的“设置”。选择设置中的更新与安全选择恢复,原创 2018-02-05 21:08:39 · 2127 阅读 · 0 评论 -
update-alternatives切换Ubuntu软件版本
update-alternatives是ubuntu系统中专门维护系统命令链接符的工具,通过它可以很方便的设置系统默认使用哪个命令及那个软件版本(参考内容)。 环境:win10自带Ubuntu 14.04.5 LTS \n \l1.以改变ubuntu系统gcc版本为例测试update-alternatives功能使用命令查看当先系统gcc版本:frey@Frey:/usr/b原创 2018-02-05 23:36:38 · 356 阅读 · 0 评论 -
自动遍历子目录的通用Makefile
自动遍历子目录的通用Makefile本文对文章 “一份通用makefile,自动遍历子目录源文件,自动生成依赖”进行了些许修改,并根据自己使用情况修改一份适合编译*.c文件的,自测试可以使用。 这份makefile可以将当前makefile所在文件夹以及所有子文件夹中的cpp文件打包成静态库/动态库/可执行文件. 自动生成所有依赖关系,修改任何文件都可以触发重新编译相应依赖的...原创 2018-03-19 22:07:39 · 3561 阅读 · 0 评论 -
Media Independent Interface
Media Independent InterfaceMedia Independent Interface ( MII ),介质独立接口,起初是定义100M以太网(Fast Ethernet)的 MAC 层与 PHY 芯片之间的传输标准(802.3u)。介质独立的意思是指,MAC与PHY之间的通信不受具体传输介质(双绞线或光纤等)的影响,任何MAC和PHY都可以通过MII接口互连。M...转载 2018-05-20 19:27:25 · 1819 阅读 · 2 评论 -
XML学习
XML学习本文参考了w3school的XML 教程,详细看具体教程。XML 简介XML 指可扩展标记语言(EXtensible Markup Language),XML 是纯文本,不会做任何事情,被设计用来传输和存储数据,而HTML 被设计用来显示数据。XML 是一种标记语言,很类似 HTMLXML 的设计宗旨是传输数据,而非显示数据XML 标签没有被预定义。您需要自行定...原创 2018-05-20 20:15:21 · 666 阅读 · 0 评论 -
win10上linux子系统的开启、升级及使用
win10上linux子系统开启、升级及使用 在16年时看到网上有所win10上可以运行ubuntu子系统,就试着下载了试用了下,利用Linux子系统可以直接访问win10的各种文件,相比使用虚拟机很是方便,而且速度也是杠杠的。 Linux子系统和Windows是一种很好的互补,利用两个系统相互协作,完全可以在Windows下进行进行编码,然后在Linux子系统进行编译、提交等工作。...原创 2018-06-16 12:24:35 · 43902 阅读 · 1 评论 -
USB枚举过程
本人在学习STM32 USB使用的过程中,收集网上的资料,阅读别人博文,拼凑零碎知识,边看边学,记录下学习过程。推荐看《圈圈教你玩USB》。枚举前的工作根据STM32的USB库做移植,介绍枚举过程,SetSystem函数是一些初始化化设置。首先系统执行USB中断设置:USB_Interrupts_Config(); //中断向量表设置然后执行USB时钟设置:Set_USBClock();...转载 2018-11-21 22:06:08 · 9193 阅读 · 1 评论 -
Camera接口
DVP并口DVP并口多应用于一些早期简单的芯片如:GC0308 / OV7725DVP并口主要由以下引脚组成:PLCK、VSYN、HSYNC、D[0:7],另外还提供I2C用于配置芯片。PCLK最好在72MHz以下。CSI接口MIPI(mobile Industry processor Interface移动产业处理器接口)是LVDS低压差分高速接口(串行),只需要CLKP/N,DAT...原创 2018-11-19 22:30:43 · 2715 阅读 · 0 评论 -
Ubuntu:Unable to locate package
Unable to locate package libx11-dev本文参考Ubuntu:Unable to locate package(无法定位安装包) 环境:win10自带Ubuntu 14.04.5 LTS \n \l1 前言在最近的安装JDK和库文件时出现提示需要安装库文件的情况,如下:frey@Frey:/mnt/e/topeet/Android_JDK$ su原创 2018-02-05 20:15:32 · 12723 阅读 · 0 评论