
unix/linux
文章平均质量分 92
私房菜
这个作者很懒,什么都没留下…
展开
-
Linux 中的同步机制——rwsem
读写信号量的原理与读写锁类似,读写信号量归根到底是“信号量”,读写锁归根到底是“自旋锁”,而信号量与自旋锁的区别一个可以睡眠,一个只能自旋。允许多个读者同时进入临界区;读者与写者不能同时进入临界区(读者与写者互斥);写者与写者不能同时进入临界区(写者与写者互斥);原创 2024-08-15 21:59:07 · 1145 阅读 · 0 评论 -
Linux 中的同步机制
指哪些在同一时刻只允许被一个线程访问的软件或硬件资源。这种资源的特点是,如果有线程正在使用,其他进程必须等待直到该线程释放资源。指在每个线程中访问临界资源的那段代码。由于临界资源需要互斥访问,因此每个线程的临界区代码在执行时需要确保没有其他现成同事访问该资源。原创 2024-08-13 09:48:00 · 1228 阅读 · 0 评论 -
Linux 内核 delayacct 原理分析
用以统计此次 swapin 的耗时,当成功获得IO 资源后,此次 IO 耗时会被统计到 swapin_delay 里,而不被统计到 blkio_delay。即 blkio_delay 统计的是非swapin 的IO 耗时,而 swapin_delay 统计的是 swapin 的 IO 耗时。在内存紧张时会进行内存回收,最终会调用到 do_try_to_free_pages() 函数,这里会统计整个回收过程所产生的耗时(调用 shrink_zones 函数)。中会检测 task_struct 中。原创 2024-04-28 12:00:00 · 1444 阅读 · 0 评论 -
Linux下/proc目录简介
在linux的根目录下存在一个/proc目录,/proc文件系统是一种虚拟文件系统,以文件系统目录和文件形式,提供一个指向内核数据结构的接口,通过它能够查看和改变各种系统属性.proc目录通常情况下是由系统自动挂载在/proc目录下,但是我们也可以自行手动挂载./proc目录下的大部分文件都是只读的,部分文件是可写的,我们通过这些可写的文件来修改内核的一些配置;/proc目录下还有许多目录,但是本文并没有介绍,主要原因是这些信息在平时查询或者使用都比较少,所以没有介绍.如果有兴趣,可以自行阅读proc手册。转载 2024-04-09 09:33:45 · 2234 阅读 · 0 评论 -
Linux 中的 waitqueue 机制详解
等待队列这个机制在Linux 内核中使用的频率很高,与进程调度机制紧密相关联,可以用来同步对系统资源的访问、异步事件通知、跨进程通信等。网上关于等待队列使用的优秀文章也很多,之所以笔者也写一篇,一是想更新下最新代码中的使用,二是融入些自己的拙见,方便自己回头查看,也希望能有助于后来读者。原创 2023-12-14 20:20:57 · 2132 阅读 · 0 评论 -
Linux 中的 container_of 原理
这个宏函数在Linux 内核中使用的频率还是很多的。网上关于 container_of 使用的优秀文章也很多,之所以笔者也写一篇,一是想更新下最新代码中的使用,二是融入些自己的鄙见,方便自己回头查看,也希望能有助于后来读者。原创 2023-12-13 15:51:56 · 1226 阅读 · 0 评论 -
Linux 中的 initcall 机制详解
Linux 对驱动程序提供静态编译进内核和动态加载两种方式,当采用静态方式时,开发者如果想要在系统中启动这个驱动通常调用类似 xxx_init() 接口。a_init();b_init();但是,这种做法在小系统中或许可以,对于 linux 庞大的系统来说,驱动很多,不可能每添加一个驱动就会改动一下 kernel_init() 代码,这将会是一场灾难。在编译的时候,通过使用告知编译器连接,自定义一个专门用来存放这些初始化函数的地址段,将对应的函数入口统一放在一起;原创 2023-11-02 21:47:18 · 1266 阅读 · 0 评论 -
Linux 中的 READ_ONCE和WRITE_ONCE
在Linux 内核代码中,经常会看到读取一个变量时,不是直接读取,而是通过 READ_ONCE 宏。同样的,在写入一个变量的时候,也不是直接赋值,而是通过 WRITE_ONCE宏。本文将详细分析下这两个宏的具体含义。原创 2023-04-11 15:14:31 · 2277 阅读 · 0 评论 -
Linux 中的 __attribute__ 机制详解
现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序地一个接一个地排放,这就是对齐。原创 2019-12-24 21:40:24 · 5833 阅读 · 0 评论 -
Linux 中的 System.map简介
对于计算机而言是没有符号这个概念的,只有0 和 1,但是我们比较容易理解的是函数名、变量名这样的符号。在Linux 内核中用 System.map 来记录Linux 内核中的符号信息,称为内核的符号表,该文件会在每次内核编译的时候,都会产生一个新的对应的 System.map 文件。在内核运行出错时,通过 System.map 中的符号表解析,就可以查到一个地址值对应的变量名、函数名。原创 2023-04-11 21:50:16 · 2960 阅读 · 1 评论 -
Linux 中的几种定时器
在linux系统中定时器有分为软定时和硬件定时器。硬件定时器一般指的是CPU的一种底层寄存器,它负责按照固定时间频率产生中断信号,形成信号源。基于硬件提供的信号源,系统就可以按照信号中断来计数,计数在固定频率下对应固定的时间,根据预设的时间参数即可产生定时中断信号,这就是软定时。本文主要整理 Linux 系统开发中常使用的软定时器,而硬件定时器涉及到硬件手册这里略过。本文会在持续更新过程中将常用定时器逐一整理出来。alarm当时间到达__seconds秒后,进程会受到一个SIGALRM的信号。原创 2023-01-05 14:28:22 · 9442 阅读 · 4 评论 -
Linux 中proc 文件系统简介
前言最初开发/proc文件系统是为了提供有关系统中进程的信息。但是由于这个文件系统非常有用,因此内核中的很多元素也开始使用它来报告信息,或启用动态运行时配置。/proc文件系统包含了一些目录(用作组织信息的方式)和虚拟文件。虚拟文件可以向用户呈现内核中的一些信息,也可以用作一种从用户空间向内核发送信息的手段。实际上我们并不会同时需要实现这两点,但是本文将向您展示如何配置这个文件系统进行输入和输出。尽管像本文这样短小的一篇文章无法详细介绍/proc的所有用法,但是它依然对这两种用法进行了展示.原创 2022-02-11 15:34:07 · 1631 阅读 · 0 评论 -
Linux 中的 epoll 原理及使用
epoll 简介epoll是Linux内核中的一种可扩展IO事件处理机制,最早在 Linux 2.5.44内核中引入,可被用于代替POSIX select 和 poll 系统调用,并且在具有大量应用程序请求时能够获得较好的性能( 此时被监视的文件描述符数目非常大,与旧的 select 和 poll 系统调用完成操作所需 O(n) 不同, epoll能在O(1)时间内完成操作,所以性能相当高)...原创 2020-02-12 11:33:48 · 12197 阅读 · 3 评论 -
Linux内核oops panic简析
内核异常的级别大致分为三个:BUG、oops、panic。BUG是指那些不符合内核的正常设计,但内核能够检测出来并且对系统运行不会产生影响的问题,比如在原子上下文中休眠,在内核中用 BUG 标识。Oops杀死导致异常的进程或者挂起系统。panic本意是“恐慌”的意思,这里意旨 kernel 发生了致命错误导致无法继续运行下去的情况。根据实际情况 Oops最终也可能会导致panic 的发生。本文将简单分析下这三种异常的流程。原创 2023-05-18 21:34:23 · 4595 阅读 · 0 评论 -
GNU链接脚本详解
每一个链接都是由链接脚本控制的,链接脚本是用链接命令语言编写的脚本。链接都会用到一个链接脚本,如果你没有指定自己的脚本,就会使用默认的链接脚本。可以用 "--verbose" 命令行选项显示默认的连接脚本。指定命令行参数,比如 '-r'、'-N'都会影响默认的链接脚本。也可以用 '-T' 来指定自己的链接脚本,也可以隐式地把自己的连接脚本当成链接输入文件,就像普通的链接文件一样,参见链接文件说明。如上图,链接器是将多个对象文件链接成可执行程序。链接器输入文件:目标文件或链接脚本文件;原创 2023-11-07 17:09:11 · 1277 阅读 · 0 评论 -
Linux 内核链接脚本vmlinux.lds.S详解
现代软件工程中,一个大的工程通常都会有多个源文件组成,其中包括高级计算机语言编写的源文件,以及汇编语言编写的汇编文件。在编译构建过程中会分别对这些源文件进行汇编、编译生成目标文件,这些目标文件包含:代码段、数据段、符号表等内容。链接器主要任务是将符号引用解析到符号定义上,将多个目标文件和库文件合并成为一个可执行文件或者动态链接库,生成符号表,并对程序代码做最后的检查和优化。本文主要针对 ARM64架构的连接脚本进行剖析。因为 vmlinux.lds.S 的内容比较多,本文将其拆分后分析。原创 2023-11-03 20:50:45 · 2112 阅读 · 0 评论 -
Linux任务调度延时分析工具getdelays
getdelays工具是一个用户态工具,这个工具可以显示出指定 pid或者 tgid对应的调度延时数据,包括用户态内核态运行的时间,在就绪队列上等待运行的时间,以及等待IO等资源的延迟时间。这些数据是通过netlink机制从内核获取,最终呈现给用户态。原创 2022-12-12 16:22:27 · 1600 阅读 · 0 评论 -
Linux内核的文件预读机制详解
为什么需要文件预读机制?算法磁盘I/O性能的发展远远滞后于CPU和内存,因而成为现代计算机系统的一个主要瓶颈。预读可以有效的减少磁盘的寻道次数和应用程序的I/O等待时间,是改进磁盘读I/O性能的重要优化手段之一。从寄存器、L1/L2高速缓存、内存、闪存,到磁盘/光盘/磁带/存储网络,计算机的各级存储器硬件组成了一个金字塔结构。越是底层存储容量越大。然而访问速度也越慢,具体表现为更小的带宽和更大的延迟。因而这很自然的便成为一个金字塔形的逐层缓存结构。由此产生了三类基本的缓存管理和优化问题: 预取转载 2021-08-26 17:26:32 · 1078 阅读 · 0 评论 -
linux驱动 ioctl 小结
依赖版本: linux4.14依赖头文件: sys/ioctl.h ->asm/ioctl.h ->asm-generic/ioctl.h函数原型:extern int ioctl (int __fd, unsigned long int __request, ...) __THROW;第一个参数是文件描述符 第二个参数代表传递的命令,它会原样传递给驱动 第三个参数是可选类型的,主要根据第二个参数选择,第三个参数无论是整数还是...原创 2021-03-03 15:08:44 · 1527 阅读 · 0 评论 -
linux 文件IO操作之dup 和dup2函数
1. 函数原型 #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd);功能:复制文件描述符,使多个文件描述符指向同一个文件。返回值: 成功:dup函数返回当前系统可用的最小整数值。 dup2函数返回第一个不小于newfd的整数值。也就是分为两种情况: ①、如果newfd已经打开,则先将其关闭,再复制文件描述符。 ②、如果newfd等于oldfd,则dup2原创 2020-06-10 19:42:38 · 1025 阅读 · 0 评论 -
GDB变量值显示为 optimized_out 的解决方法
最近使用GDB调试的时候,经常遇到GDB查看变量值的时候输出< optimized_out >,Google了一下,找到几个解决方法,来应对不通情况下需要查看具体变量输出的场景。解决方案将GCC优化选项调整为O1或是O0GCC在O2、O3优化选项下会将代码优化的比较多,调试器有可能会找不到变量的信息。通常可以将优化级别降低到O0,完全关闭优化,可以保留所有的变量和代码...转载 2019-12-23 14:43:05 · 21230 阅读 · 1 评论 -
在Linux中如何利用backtrace信息解决问题
一、导读在程序调试过程中如果遇到程序崩溃死机的情况下我们通常多是通过出问题时的栈信息来找到出错的地方,这一点我们在调试一些高级编程语言程序的时候会深有体会,它们通常在出问题时会主动把出问题时的调用栈信息打印出来,比如我们在eclipse中调试java程序时。当这些换到Linux上的C/C++环境时情况将变的稍微复杂一些,通常在这种情况下是通过拿到出问题时产生的core文件然后再利用gdb调...转载 2019-11-02 10:12:58 · 709 阅读 · 0 评论 -
linux平台代码覆盖率
1. gcov简介1.1 gcov是什么gcov是一个测试代码覆盖率的工具。与GCC一起使用来分析程序,以帮助创建更高效、更快的运行代码,并发现程序的未测试部分 是一个命令行方式的控制台程序。需要结合lcov,gcovr等前端图形工具才能实现统计数据图形化 伴随GCC发布,不需要单独下载gcov工具。配合GCC共同实现对c/c++文件的语句覆盖和分支覆盖测试 与程序概要分析工具(pr...原创 2019-10-30 16:40:35 · 2713 阅读 · 0 评论 -
busybox 中 getopt32用法
1. 函数原型uint32_t getopt32(char **argv, const char *applet_opts, ...)函数的声明位于libbb.h 中,定义在libbb/getopt32.c 中。命令行选项是通过字符串applet_opts 传递。如果其中一个选项被找到了, 就有一个标志值(unsigned long类型)添加到返回值中。2. 返回值...原创 2019-09-26 22:11:59 · 2807 阅读 · 0 评论 -
Kernel中Kconfig小结
前言当执行#make menuconfig时会出现内核的配置界面,所有配置工具都是通过读取"arch/$(ARCH)Kconfig"文件来生成配置界面,这个文件就是所有配置的总入口,它会包含其他目录的Kconfig注:对于uboot来讲,配置的总入口在uboot/Kconfig作用Kconfig用来配置内核,它就是各种配置界面的源文件,内核的配置工具读取各个Kconfig文件...原创 2019-02-19 16:36:20 · 2676 阅读 · 1 评论 -
LD_DEBUG
LD_DEBUG 是 glibc 中的 loader 为了方便自身调试而设置的一个环境变量。通过设置这个环境变量,可以方便的看到 loader 的加载过程。如命令说明,可以使用环境变量LD_DEBUG_OUTPUT 将std out 换成用户指定的路径,详细命令:LD_DEBUG=libs LD_DEBUG_OUTPUT=/data/test/log /usr/bin/main最后会在/data/test 目录下生成log.PID 接口的文件,其中pid 就是程序main 运行时候的进程号原创 2020-12-09 16:06:25 · 2047 阅读 · 0 评论 -
Linux 中的 likely 和 unlikely
likely()、unlikely() 原理是利用了GCC 的内建函数(),通过编译器预测代码分支;GCC 编译器会将不希望的代码分支放最后;GCC 可能优先执行期盼的执行,再进行判断,不同的编译器版本实现方式不同;likely() 表示该表达式为 “True” 的概率大一些,unlikely() 表示改表达式为 “True” 的概率小一些;likely()、unlikely() 通过分支预测指令的预取能提高代码的执行效率。原创 2025-03-16 17:37:43 · 817 阅读 · 0 评论 -
GCC特性——内建函数
函数原型:描述:该函数是GNU 扩展,用以返回当前函数或者当前函数调用者的返回地址。a(0) 通过 __builtin_return_addrest(0) 打印的值为C 语言函数在调用过程中,会将当前函数的返回地址、寄存器等现场信息保存在堆栈中,然后才会跳到被调用函数中去执行。当被调用函数执行结束后,根据保存在堆栈中的返回地址,就可以直接返回到原来的函数中继续执行。原创 2022-11-28 15:06:11 · 1331 阅读 · 0 评论 -
linux GCC -O参数设置整理
-O参数只有5个级别,并不是设置的越高越好(以前的GCC支持很高的级别,但是现在确实只有5级)◆-O0:关闭所有优化选项◆-O1:基本优化,编译器会生成更快的代码◆-O2:-O1的升级版,推荐使用◆-O3:这是目前最高的优化级别,它会使用更多的编译时间,虽然它生成的代码只会比-O2块一点点(GCC3.x中是这样的,但是在GCC4.x中有时候可能还没有-O2快),但是它会增大二进制文...转载 2019-03-07 16:48:08 · 1047 阅读 · 0 评论 -
ftok 使用
ftok 是系统IPC键值的格式转换函数,系统建立IPC通讯(消息队列、信号量、共享内存)时必须指定一个ID值。通常情况下,该id值通过ftok函数得到。头文件:#include <sys/types.h>#include <sys/ipc.h>原型:key_t ftok( const char * fname, int id )fn...原创 2019-04-17 16:33:43 · 795 阅读 · 0 评论 -
设置线程 CPU 亲和性的几种方式
线程CPU 亲和性分两种:软亲和性和硬亲和性。软亲和性主要由操作系统来实现,Linux 操作系统的调度器会倾向于保持一个进程不会频繁在多个 CPU 之间迁移,通常情况下调度器都会根据各个 CPU 的负载情况合理地调度运行中的进程,以减轻繁忙 CPU 的压力,提高所有进程整体性能。硬亲和性由用户调用系统 API 实现自定义进程运行在指定的 CPU 上,从而满足特定进程的特殊性能需求。原创 2024-05-21 22:06:53 · 2567 阅读 · 0 评论 -
设置线程名的两种方式:prctl和pthread_setname_np
对于长期在linux 中开发的同学,这两个函数应该是非常熟悉的。prctl 的功能十分强大,但对于设置线程名称单独的特性而言,pthread_setname_np 更是灵活些。原创 2021-11-04 16:16:09 · 17733 阅读 · 0 评论 -
进程间通信(7)——套接字
进程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如:它们都仅限于本地进程间通信。而网络间通信要解决的是不同主机进程间的通信问题(可把同机进程间通信看成一个特例)。同一主机上,不同进程可用进程号(process ID)唯一标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。例如,主机A赋于某进程号5,在B机中也可以存在5号进程,因此,“5号进程”这句话就没有意义了。原创 2023-07-07 16:55:14 · 2188 阅读 · 0 评论 -
进程间通信(6)——信号量
通过前面几篇博文,大概清楚这些IPC 的设计都是为了进程间数据的共享而设计的,例如,本文将要介绍的信号量(semaphore) 跟这些有些区别,更确切说它是为了共享数据的访问服务,它是一个计数器,是由提出,并通过PV(通过&释放,是荷兰文缩写)操作对信号量进行控制。的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。原创 2019-04-19 11:29:49 · 2229 阅读 · 1 评论 -
进程间通信(5)——共享内存
共享内存可以说是最有用的进程间通信方式,也是最快的IPC 形式。两个不同的进程A、B共享内存的基本原理是,同一块物理内存映射到进程A、B各自的进程地址空间。进程A可以即时看到B对共享内存中数据的更新,反之亦然。原创 2019-04-18 22:44:30 · 1516 阅读 · 3 评论 -
进程间通信(4)——消息队列
一文中说到 system V版本,AT&T引进了一种新形式的IPC 功能(信号量、消息队列以及共享内存)。System IPC 中,对于每一个新建的信号量、消息队列以及共享内存,都有一个在整个系统中唯一的标识符。每个标识符都有唯一对应的关键字,关键字的数据类型由系统定义为key_t。在终端命令行输入ipcs第一列key 就是IPC 的关键字,第二列是IPC 的标识符。在终端命令行输入这些限制中大多数可以通过重新配置内核来改变。原创 2019-04-18 22:13:36 · 1173 阅读 · 0 评论 -
进程间通信(3)——命名管道(FIFO)
命名管道也被称为FIFO(first in first out)文件,它是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和之前所讲的没有名字的管道(匿名管道)类似。由于Linux中所有的事物都可被视为文件,所以对命名管道的使用也就变得与文件操作非常的统一,也使它的使用非常方便,同时我们也可以像平常的文件名一样在命令中使用。原创 2019-04-18 17:26:01 · 1307 阅读 · 0 评论 -
进程间通信(2)——管道(PIPE)
管道是UNIX系统IPC 的最古老形式,所有UNIX系统都提供此种通信机制。通常说的管道为匿名管道(),下一篇讲述命名管道(它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。原创 2019-04-18 17:04:04 · 2049 阅读 · 0 评论 -
进程间通信(1)——信号(Signal)
kill -l目前Linux 中定义了64中信号,前期定了32种(1-31),后面的33种为实时信号(32-64);glibc的接口中可能会使用到2 或者3 种实时信号(32、33、34),所以,对于用户看到的SIGTRMIN 会做适当的调整(34 或35)。从目前来看,glibc 应该是用了32 和 33两个实时信号;因为 glibc的需要,实时信号可能是变动的,所以,在使用的时候不要直接写死数值,而是用SIGRTMIN+n 的方式,而且需要确定SIGRTMIN+n不能超过SIGRTMAX。原创 2019-10-14 15:22:57 · 3438 阅读 · 0 评论 -
进程间通信(0)——序
linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。可是共享内存的通信方式是通过将共享的内存缓冲区直接附加到进程的虚拟地址空间中来实现的,因此。因为Unix版本号的多样性,电子电气project协会(IEEE)开发了一个独立的Unix标准,这个新的ANSI Unix标准被称为计算机环境的可移植性操作系统界面(PSOIX)。原创 2019-04-18 15:42:49 · 585 阅读 · 0 评论