自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 精选6个C++项目,推荐新人练手首选!

无论做什么项目,在写简历时,最好要整理出项目中的技术点,思考如何跟面试官介绍你的项目,要经得起面试官的提问。项目的话,可以考虑做下面的这几个:如果你想给自己的简历增加C+ +项目经验,以下提供一些方向指南:1.开源项目贡献:参与C+ +开源项目是一个很好的方式,可以展示你的技术能力和合作能力。你可以选择一知名的C+ +开源项目,阅读源代码,修复bug ,实现新功能或者改进性能,然后向项目贡献你的代码。这样不仅能够积累项目经验,还能与其他开发者进行交流和学习。

2023-08-26 14:04:30 4304

原创 Linux内核源码分析(强烈推荐收藏!)

Linux内核是由林纳斯·托瓦兹(Linus Torvalds)在1991年开始开发的。当时他为了得到一个可以运行UNIX操作系统的个人计算机,开始编写一个操作系统内核,并将其命名为Linux。随后,越来越多的开发者加入到项目中,共同完善和扩展Linux内核。如今,Linux已经成为最流行和广泛使用的开源操作系统内核之一,驱动着许多不同类型的设备和服务器。

2024-01-11 15:04:12 2674

原创 掌握GDB调试工具,轻松排除bug!

gdb是GNU debugger的缩写,是编程调试工具。GDB官网:GDB适用的编程语言: Ada / C / C++ / objective-c / Pascal 等。GDB的工作方式: 本地调试和远程调试。目前release的最新版本为8.0,GDB可以运行在Linux 和Windows 操作系统上。1.1安装与启动。

2023-06-30 21:57:19 3768

原创 探索网络通信核心技术,手写TCPIP用户态协议栈,让性能飙升起来!

DPDK(Data Plane Development Kit)是一个开源的数据平面开发工具包,它提供了一组C语言库和驱动程序,用于快速开发高性能的数据平面应用程序。DPDK使用用户空间的方式来实现网络数据包处理,从而避免了传统内核态和用户态之间频繁切换导致的性能损失。DPDK支持多种硬件平台和操作系统,并且在各种场景下都表现出优异的性能。例如,在云计算、电信、金融、在线游戏等行业中,DPDK被广泛应用于高速网络数据处理、虚拟化网络功能和SDN等方面。

2023-06-30 21:56:27 1369

原创 万字总结编译利器CMake,从入门到项目实战演练!

你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。

2023-06-30 21:55:47 690

原创 探索eBPF:Linux内核的黑科技

eBPF 是一个基于寄存器的虚拟机,使用自定义的 64 位 RISC 指令集,能够在 Linux 内核内运行即时本地编译的 “BPF 程序”,并能访问内核功能和内存的一个子集。这是一个完整的虚拟机实现,不要与基于内核的虚拟机(KVM)相混淆,后者是一个模块,目的是使 Linux 能够作为其他虚拟机的管理程序。eBPF 也是主线内核的一部分,所以它不像其他框架那样需要任何第三方模块(LTTng 或 SystemTap),而且几乎所有的 Linux 发行版都默认启用。

2023-06-30 21:51:50 1080

原创 轻松突破文件IO瓶颈:内存映射mmap技术

前面讲过,建立内存映射并没有实际拷贝数据,这时,MMU在地址映射表中是无法找到与ptr相对应的物理地址的,也就是MMU失败,将产生一个缺页中断,缺页中断的中断响应函数会在swap中寻找相对应的页面,如果找不到(也就是该文件从来没有被读入内存的情况),则会通过mmap()建立的映射关系,从硬盘上将文件读取到物理内存中,如图1中过程3所示。当进程发起读写操作时,会访问虚拟地址空间,通过查询页表,发现这段地址不在物理页上,因为只建立了地址映射,真正的数据还没有拷贝到内存,因此引发缺页异常。

2023-06-30 21:49:41 759

原创 牛客网论坛考研计算机组成原理笔记,GitHub已下载量已过百万

主要讲授信息的数字化表示、存储程序与冯诺依曼体制;计算机的诞生和发展;计算机系统的层次结构和硬件系统组织;计算机的主要性能指标。第一节 计算机系统层次结构硬件+软件硬件部分最底层的微处理机,由中央处理机中算术和逻辑处理单元、寄存器以及操作控制用的逻辑电路组成。第二层微型计算机,是在微处理机的基础上,设计适当的总线结构以及存储器、外部设备接口等,构成一个硬件计算机。第三层是机器语言环境,程序员能够通过计算机提供的机器语言环境,编制机器语言程序,控制计算机完成预定的任务。软件部分。

2023-06-30 21:47:54 1045

原创 解密Linux内核神器:内存屏障的秘密功效与应用方法

现在大多数现代计算机为了提高性能而采取乱序执行,这可能会导致程序运行不符合我们预期,内存屏障就是一类同步屏障指令,是CPU或者编译器在对内存随机访问的操作中的一个同步点,只有在此点之前的所有读写操作都执行后才可以执行此点之后的操作。内存屏障,也称内存栅栏,内存栅障,屏障指令等, 是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作。大多数现代计算机为了提高性能而采取乱序执行,这使得内存屏障成为必须。

2023-06-30 21:46:12 447

原创 程序员性能之道,从使用perf开始!

从2.6.31内核开始,Linux内核自带了一个性能分析工具perf,能够进行函数级与指令级的热点查找。通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题 (per thread),也可以用来分析内核的性能问题,当然也可以同时分析应用代码和内核,从而全面理解应用程序中的性能瓶颈。Perf是内置于Linux内核源码树中的性能剖析(profiling)工具。它基于事件采样原理,以性能事件。

2023-06-30 21:42:45 1250

原创 牛客网论坛最具争议的Linux内核成神笔记,GitHub已下载量已过百万

Linux内核是一个操作系统(OS)内核,本质上定义为类Unix。它用于不同的操作系统,主要是以不同的Linux发行版的形式。Linux内核是第一个真正完整且突出的免费和开源软件示例。Linux 内核是第一个真正完整且突出的免费和开源软件示例,促使其广泛采用并得到了数千名开发人员的贡献。Linux 内核由芬兰赫尔辛基大学的学生 Linus Torvalds 于 1991 年创建。随着程序员调整其他自由软件项目的源代码以扩展内核的功能,它迅速取得了进展。

2023-06-09 20:36:47 842 1

原创 Linux内核进程创建流程

如果是用户进程,调用ret_to_user返回用户空间, 如果是内核进程,X19存储线程函数的地址,X20存放线程函数的参数, 这里会跳转到x19所存储的函数地址执行。可以理解为fork是clone的简化版本, clone可以更精确的控制创建进程的行为,我们在创建线程时,就是使用的clone(没错, 在Linux里面, 线程实际上也是进程)。可以看到kernel_thread其实也是调用kernel_clone创建线程,其中stack被设置成了入口函数,stack_size被设置成了参数。

2023-06-06 17:42:31 926

原创 Linux内存初始化-启动阶段的内存初始化

那么在进入kernel之后, 就必须有一个使能MMU, 建立映射的过程, 本文描述kernel启动阶段进行内存初始化相关的操作。

2023-06-06 17:41:39 1322

原创 Linux内核文件写入流程

文本代码基于Linux 5.15。当用户层调用write 去做写入, linux 内核里面是如何处理的?本文以exfat 为例, 讨论这个流程。

2023-06-06 17:40:56 1839

原创 Linux mount 流程详解

本文代码基于Linux 5.10。Linux mount 主要通过mount 命令或者mount api来实现, 本文主要介绍mount 调用在内核中的实现。

2023-06-06 17:35:18 1247

原创 Linux内核sync流程

进程写文件时, 文件并没有真正写到存储设备, 而是写到了page cache中。文件系统会定期把脏页写到存储设备, 进程也可以调用sync这样的调用把脏页写回存储设设备。

2023-06-06 17:34:54 1923

原创 linux内核open文件流程

对于大多数进程, 打开文件的数量是有限的,一种优化的设计方式是为每个进程内置分配少量数目的文件描述符指针数组, 但进程需要更多的指针时, 再动态扩展。link_path_walk的内部实现有点复杂, 大致逻辑是,反复调用walk_component函数, 直到找到路径的最后一个分量。从逻辑上讲, 这个函数要做的事情,应该是遍历这个父目录的cluster, 根据name找到匹配的那个entry。这个函数应该做的是, 在文件系统中创建一个新的文件, 并建立inode, 关联到对应的dentry上。

2023-06-06 17:32:51 1797

原创 Linux内核文件读取流程

本文代码基于Linux5.10。当上层调用read函数读取一个文件时, Linux 内核究竟如何处理?本文主要介绍这个问题。

2023-06-06 16:57:47 2225

原创 VSCode+GDB+Qemu调试ARM64 linux内核

俗话说,工欲善其事 必先利其器。linux kernel是一个非常复杂的系统,初学者会很难入门。如果有一个方便的调试环境,学习效率至少能有5-10倍的提升。为了学习linux内核,通常有这两个需要笔者使用VSCode+GDB+Qemu完成了这两个需求qemu作为虚拟机,用来启动linux。VSCode+GDB作为调试工具,用来图形化地DEBUG。下面将一步一步介绍如何搭建上述环境。本文所有操作都在Vmware Ubuntu16虚拟机上进行。

2023-06-06 16:51:53 3075

原创 超全整理!Linux性能分析工具汇总合集

内存不足的表现:free memory急剧减少,回收buffer和cacher也无济于事,大量使用交换分区(swpd),页面交换(swap)频繁,读写磁盘数量(io)增多,缺页中断(in)增多,上下文切换(cs)次数增多,等待IO的进程数(b)增多,大量CPU时间用于等待IO(wa)在使用时,直接输入命令即可,当然也可以使用特定参数。任务区域默认显示:进程ID,有效用户,进程优先级,NICE值,进程使用的虚拟内存,物理内存和共享内存,进程状态,CPU占用率,内存占用率,累计CPU时间,进程命令行信息。

2023-06-06 16:17:58 912

原创 Linux内核超级装备eBPF技术详细研究

内核大神Brendan用了比喻的说法,更加形象地介绍了这个技术。eBPF对于Linux就相当于JavaScript对于HTML一样。JavaScript给静态的HTML网站带了了动态的内容和效果,已经丰富的交互能力。JavaScript程序运行在一个虚拟机的安全沙盒中。eBPF也对Linxu内核提供了类似的功能,程序员可以通过编写字节码,从而让程序工作在内核的沙盒环境中。eBPF更像是内核中JavaScript的V8虚拟机引擎。

2023-06-06 15:19:01 1794

原创 x86汇编语法基础(gnu格式)

除此之外,还增加了8个新的寄存器,它们的标号是按照新的命名规则制定的:从%r8到%r15。而imulq指令,由于两个64位数相乘,结果可能为128位,所以使用了%rdx寄存器来保存运算结果的高64位,%rax保存运算结果的低64位。stos 指令把 %al,%ax,%eax 或 %rax 寄存器里的字节、字、双字、四字数据,保存到目的操作数,目的操作数是一个内存地址。当 DF 位为 0 时,%(r|e)si 和 %(r|e)di 寄存器的值会增加,当 DF 为 1 时,寄存器的值会减少。

2023-05-25 22:06:49 2183

原创 使用 GNU 汇编语法编写 Hello World 程序的三种方法

从图中可以看到,我们调用C库函数printf()时,最终会调用内核的write()系统调用,那么我们就可以绕过C库,直接使用系统调用来输出字符串。x86-64中,最多允许 6 个参数通过通用寄存器来传递,多出的参数需要通过栈来传递;的例子,如果说我们输出的参数里有变量,而且是个浮点数,该如何处理呢?来进行系统调用,但它执行的是32位的系统调用,使用的是32位的系统调用表,且效率低下,不应该再使用;节),当被调用的函数中有浮点数时,需要使用 %xmm0~%xmm7 共 8 个 SSE 寄存器来传递参数;

2023-05-25 22:03:46 2062 1

原创 Linux Kernel 源码学习必备知识之:GCC 内联汇编(AT&T格式)

原因是即使寄存器只变动一部分,它的整体也会全跟着受影响,所以在 clobber/modiy 句中声明寄存器时,可以用低 8 位名称、低 16 位名称或低 32 位或全 64 位名称,如"al"、"ax"、"eax"、"rax" 都是指 rax 寄存器,其他通用寄存器也是一样的。单独强调一下,以上的 output() 和 intput() 括号中的是 C 代码中的变量,output(C变量)和input(C变量) 就像 C 语言中的函数,将 C 变量(值或变量地址)转换成汇编代码的操作数。

2023-05-25 21:54:10 2416

原创 Linux Kernel源码阅读: x86-64 系统调用实现细节(超详细)

本文采用Linux 内核 v3.10 版本本文不涉及调试、跟踪及异常处理的细节系统调用是用户空间程序与内核交互的主要机制。系统调用与普通函数调用不同,因为它调用的是内核里的代码。使用系统调用时,需要特殊指令以使处理器权限转换到内核态。另外,被调用的内核代码由系统调用号来标识,而不是函数地址。下面我们以示例程序中使用的write系统调用为例,来看看系统调用是如何定义的。write系统调用函数原型如下,可以通过命令查看。在linux内核中,write系统调用定义在文件中。由于write。

2023-05-25 21:22:59 2455

原创 计算机Intel CPU体系结构分析

之前一直存在疑惑是因为看了Paul的论文,有两点,一个是CPU在猜测执行时,如果猜测乱序执行的是一条store指令,并且store指令要操作的地址和之前正处于in-flight状态的store指令没有相关关系,那么意味着这条猜测执行的store会直接更新DCache,如果后期发现猜测执行错误,那么此时是没有办法回滚的(因为数据已经写入DCache),而对于猜测执行的load就不会造成这么严重的问题,顶多就是提前把主内存的内容读到DCache中(但是前段时间发生的Meltdown漏洞就是利用了该特性);

2023-05-10 14:43:07 1069 1

原创 QEMU调试Linux内核环境搭建

一个最小可运行Linux操作系统需要内核镜像bzImage和rootfs,本文整理了其制作、安装过程,调试命令,以及如何添加共享磁盘。

2023-05-10 14:41:07 1646

原创 Linux用户空间与内核空间通信(Netlink通信机制)

Netlink是linux提供的用于内核和用户态进程之间的通信方式。但是注意虽然Netlink主要用于用户空间和内核空间的通信,但是也能用于用户空间的两个进程通信。只是进程间通信有其他很多方式,一般不用Netlink。除非需要用到Netlink的广播特性时。那么Netlink有什么优势呢?一般来说用户空间和内核空间的通信方式有三种:/proc、ioctl、Netlink。而前两种都是单向的,但是Netlink可以实现双工通信。

2023-05-10 14:39:48 1300

原创 Linux内核架构和工作原理

1、提供platform_bus_type类型的总线,把那些不是总线型的soc设备都添加到这条虚拟总线上。使得,总线——设备——驱动的模式可以得到普及。2、提供platform_device和platform_driver类型的数据结构,将传统的device和driver数据结构嵌入其中,并且加入resource成员,以便于和Open Firmware这种动态传递设备资源的新型bootloader和kernel 接轨。

2023-05-10 14:35:40 737

原创 Linux内核Makefile系统文件详解

什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows 的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile 还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。因为, makefile关系到了整个工程的编译规则。

2023-05-10 14:31:14 1202

原创 Linux Kernel内核整体架构(图文详解)

本文是“Linux内核分析”系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统。之后,会介绍Linux内核源文件的目录结构,并和各个软件子系统对应。a) 内核版本为Linux 3.10.29(该版本是一个long term的版本,会被Linux社区持续维护至少2年)。b) 鉴于嵌入式系统大多使用ARM处理器,因此涉及到体系结构部分的内容,都以ARM为分析对象。

2023-05-10 14:29:43 1988

原创 Linux系统查看内存使用情况

Windows及带有GUI的Linux操作系统中,我们通常可以使用UI查看系统内存及空间使用情况,但是对于开发或者运维人员来说,经常要工作在没有GUI的Linux的服务器,命令行能比GUI提供更多功能和灵活性。特别当我们的系统中某个应用程序异常,或者系统占用异常,抑或linux开发需要内存裁剪时,我们就要了解下系统内存及空间使用情况,就需要掌握几个常用的查看工具。

2023-05-10 14:26:43 1230

原创 Linux内核阅读自学精简教程目录(必读)

学习Linux内核需要一定的计算机基础知识,包括操作系统,计算机网络等。以下是学习Linux内核的步骤:大部分程序员可能永远没有机会开发Linux内核或者驱动Linux,那么我们为什么还需要学习Linux内核呢?Linux的源代码和架构都是开放的,我们可以学到很多操作系统的概念和实现原理。Linux的设计哲学体系继承了UNIX,现在整个设计体系相当稳定和简化,这是大部分服务器使用Linux的重要原因。那学习Linux内核的原因就在于此。进一步了解内核的原理,有助于你更好地使用命令和程序设计,让你的面试和开发

2023-04-27 21:37:18 1134 1

原创 Linux内核设备驱动设备树概念与使用

需要用到 DTC 工具!DTS 文件的主要功能就是按照图所示的结构来描述板子上的设备信息, DTS 文件描述设备信息是有相应的语法规则要求的,稍后我们会详细的讲解 DTS 语法规则。根节点下也有compatible属性,用来选择哪一个“machine desc”:一个内核可以支持machine A,也支持machine B,内核启动后会根据根节点的compatible属性找到对应的machine desc结构体,执行其中的初始化函数。dtsi文件中定义了很多设备,但是在你的板子上某些设备是没有的。

2023-04-08 16:57:05 1326

原创 Linux内核Oops调试方法总结

内核开发比用户空间开发更难的一个因素就是内核调试艰难。内核错误往往会导致系统宕机,很难保留出错时的现场。调试内核的关键在于你的对内核的深刻理解。

2023-04-04 17:54:22 1478

原创 Linux内核设备信息集合

本文结合设备信息集合的详细讲解来认识一下设备和驱动是如何绑定的。所谓设备信息集合,就是根据不同的外设寻找各自的外设信息,我们知道一个完整的开发板有 CPU 和各种控制器(如 I2C 控制器、SPI 控制器、DMA 控制器等),CPU和控制器可以统称为 SOC,除此之外还有各种外设 IP,如 LCD、HDMI、SD、CAMERA 等,如下图:我们看到一个开发板上有很多的设备,这些设备是如何一层一层展开的呢?设备和驱动又是如何绑定的呢?我们带着这些疑问进入本节的主题。

2023-03-24 21:38:28 473

原创 Linux内核字符设备Character Device

上文中我们分析了虚拟文件系统的结构以及常见的文件操作从用户态到虚拟文件系统再到底层实际文件系统的过程。而实际上我们并没有说明实际的文件系统如ext4是如何和磁盘进行交互的,这就是本文和下篇文章的重点:I/O之块设备和字符设备。输入输出设备我们大致可以分为两类:块设备(Block Device)和字符设备(Character Device)。块设备将信息存储在固定大小的块中,每个块都有自己的地址。如硬盘就是常见的块设备。字符设备发送或接收的是字节流,而不用考虑任何块结构,没有办法寻址。

2023-03-24 21:37:26 946

原创 Linux内核文件系统知识大总结

它引入了一个新的概念,叫作Extents。inode里面有文件的读写权限i_mode,属于哪个用户i_uid,哪个组i_gid,大小是多少i_size_io,占用多少个块i_blocks_io,i_atime是access time,是最近一次访问文件的时间;如果在写的逻辑__generic_file_write_iter里面,发现设置了IOCB_DIRECT,则调用generic_file_direct_write,里面同样会调用address_space的direct_IO的函数,将数据直接写入硬盘。

2023-03-24 21:34:51 730

原创 Linux内核设备驱动IO流程详解

我们之前的文章提到了操作系统的三个抽象,它们分别是进程、地址空间和文件,除此之外,操作系统还要控制所有的 I/O 设备。操作系统必须向设备发送命令,捕捉中断并处理错误。

2023-03-24 21:34:48 1096

原创 Linux内核六大进程通信机制原理

顾名思义,进程通信( InterProcess Communication,IPC)就是指进程之间的信息交换。实际上,进程的同步与互斥本质上也是一种进程通信(这也就是待会我们会在进程通信机制中看见信号量和 PV 操作的原因了),只不过它传输的仅仅是信号量,通过修改信号量,使得进程之间建立联系,相互协调和协同工作,但是它缺乏传递数据的能力。虽然存在某些情况,进程之间交换的信息量很少,比如仅仅交换某个状态信息,这样进程的同步与互斥机制完全可以胜任这项工作。但是大多数情况下,

2023-03-23 22:32:25 1123

千万字肝翻Linux内核源码,对底层原理深耕深分析,从入门到入狱

内存屏障、内存映射、同步机制、GDB基本功能、CPU缓存、内核启动流程、 syncookie、读写分析、NFS实现框架、网络新特性、skb核心操作、HASH算法、过滤框架Nftables、接 收框架、页缓存PageCache、Netfilter框架、处理器架构、中断机制、malloc、free实现原理、内存的 动态、缺页中断、Kfifo环形缓冲区、开发工具ARM-LInux-gcc安装、网络协议栈、构建嵌入式Lnux系 统、内存性能优化、核心知识CPU、内核编译、UDP收包率、反向映射机制、MMu-gather操作、进程 描述符、虚拟内存机制、RCU机制、ARM架构、高速缓存、页面回收、数据同步、回写机制、页交换、 软硬中断区别、等待队列、字符设备驱动、系统调用、内存碎片。

2023-01-03

空空如也

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

TA关注的人

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