内核源码解读
文章平均质量分 86
着重剖析内存管理、进程管理、文件系统三大块
奇妙之二进制
csdn博客专家,C/C++领域优质创作者,抖音搜奇妙之二进制,专注于Linux C/C++、嵌入式Linux开发,偶尔谈谈人生,目前致力于完成大约500篇的linux C/C++开发知识体系库,所有的文章都会一直保持更新(优化内容、排版),想学习的可以订阅我的专栏,也可以关注Linux 世界。
展开
-
内核解读之文件系统(3)文件IO原理剖析(read/write、mmap)
转发自:https://zhuanlan.zhihu.com/p/442771856。转载 2024-02-18 14:10:33 · 194 阅读 · 1 评论 -
Linux文件系统原理分析(2)inode索引节点
假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode”链接数”不会因此发生变化。文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。转载 2024-02-18 17:06:31 · 355 阅读 · 0 评论 -
内核解读之内存管理(13)逆向映射
数学大师陈省身有一句话是这样说的:了解历史的变化是了解这门学科的一个步骤。今天,我把这句话应用到一个具体的Linux模块:了解逆向映射的最好的方法是了解它的历史。本文介绍了Linux内核中的逆向映射机制如何从无到有,如何从笨重到轻盈的历史过程,通过这些历史的演进过程,希望能对逆向映射有更加深入的理解。转载 2024-02-29 23:59:36 · 448 阅读 · 0 评论 -
内核解读之内存管理(12)进程虚拟内存管理 vm_area_struct
在32位的系统上,线性地址空间可达到4GB,这4GB一般按照3:1的比例进行分配,也就是说用户进程享有前3GB线性地址空间,而内核独享最后1GB线性地址空间。由于虚拟内存的引入,每个进程都可拥有3GB的虚拟内存,并且用户进程之间的地址空间是互不可见、互不影响的,也就是说即使两个进程对同一个地址进行操作,也不会产生问题。原创 2023-01-12 22:06:27 · 1767 阅读 · 0 评论 -
内核源码解读之内存管理(10)percpu_page_set分析
在内核启动之初per_cpu机制还没有初始化,用于动态分配per_cpu变量的空间还没有分配,所以定义了一个静态的per_cpu变量boot_pageset,用以暂时管理内存域的per_cpu缓存。high记录了per_cpu缓存中页帧的上限,如果超过这个值就将释放 batch个页帧到伙伴系统中去,如果per_cpu中没有可分配的页帧就从伙伴系统中分配batch个页帧到缓存中来。per_cpu缓存中的页帧的page就挂接在struct list_head lists中。原创 2023-01-03 23:55:47 · 848 阅读 · 0 评论 -
内核解读之内存管理(9) 第一个mm_struct
每个进程或内核线程都由一个任务描述数据结构(task_struct)来管理,每个task_struct中有个struct mm_strcut数据结构指针,用来管理任务的虚拟地址空间。而内核本身作为一个进程,也有对应的mm_struct。上面有个重要成员pgd,它记录了全局页目录项的地址,全局页目录项占据了一个page,swapper_pg_dir是在内核镜像链接脚本vmlinux.ld.S里定义的。init_mm是全系统第一个mm_struct,它记录了内核进程的内存信息。原创 2023-01-04 00:30:42 · 741 阅读 · 0 评论 -
内核解读之内存管理(8)什么是page cache
文件一般存放在硬盘(机械硬盘或固态硬盘)中,CPU 并不能直接访问硬盘中的数据,而是需要先将硬盘中的数据读入到内存中,然后才能被 CPU 访问。由于读写硬盘的速度比读写内存要慢很多(DDR4 内存读写速度是机械硬盘500倍,是固态硬盘的200倍),所以为了避免每次读写文件时,都需要对硬盘进行读写操作,Linux 内核使用 页缓存(Page Cache) 机制来对文件中的数据进行缓存,即将文件中的数据缓存到page中,这些page就叫page cache。转载 2024-02-24 22:22:17 · 1517 阅读 · 0 评论 -
内核解读之内存管理(7)页分配器伙伴系统介绍
high参数就是用于该目的,当pcp中的内存高于high时,其会将一部分内存释放回buddy的free_area中,当然若pcp中的内存不足,也会从free_area中分配部分内存。例如对于上图的node 0节点,若需要分配非DMA的普通内存,则其先尝试从从node 0的normal zone分配,若分配不成功,则继续尝试从node 0的DMA zone分配,若依然不成功,则fallback到node 1中分配,依次类推。伙伴系统是linux的页框分配器,负责系统物理内存的分配工作。转载 2023-01-09 00:06:58 · 614 阅读 · 0 评论 -
内核解读之内存管理(6)address_space建立文件索引结点inode和页page、虚拟地址空间vma的映射
file结构体和inode结构体中都有一个address_space结构体指针,实际上,file->f_mapping是从对应inode->i_mapping而来,inode->i_mapping->a_ops是由对应的文件系统类型在生成这个inode时赋予的。它是代表某个地址空间吗?实际上不是的,它是用于建立文件结点(struct inode)到内存页面(struct page)的映射,其实就是每个file都有这么一个结构,将文件系统中这个file对应的数据与这个file对应的内存绑定到一起;原创 2024-02-24 14:16:33 · 663 阅读 · 0 评论 -
内核解读之内存管理(5)内存模型
还是用于进程的页表?如果物理内存空间是一个连续的,没有空洞的地址空间,那么这种计算机系统的内存模型就是Flat memory,如图所示,我们将内存分成一页一页的Page frame,描述page frame的结构体page组成一个数组mem_map,通过将地址转换成页帧号(即该地址对应的page在page数组中的索引)可以取得该地址对应的page,就可以访问任何一页物理内存。如果是极致sparse内存模式,用一个page的大小来存放一个root的所有mem_section,也就是一个root有。原创 2023-01-04 22:49:10 · 1398 阅读 · 1 评论 -
内核解读之内存管理(4)内存管理三级架构之page
初始值为-1,如果只被一个进程的页表映射了,该值为0. 如果该page处于伙伴系统中,该值为PAGE_BUDDY_MAPCOUNT_VALUE(-128),内核通过判断该值是否为PAGE_BUDDY_MAPCOUNT_VALUE来确定该page是否属于伙伴系统。引用计数,表示内核中引用该page的次数, 如果要操作该page, 引用计数会+1, 操作完成-1. 当该值为0时, 表示没有引用该page的位置,所以该page可以被解除映射,这往往在内存回收时是有用的。最新版本的page结构体精简了好多。原创 2023-01-07 15:21:37 · 1395 阅读 · 0 评论 -
内核解读之内存管理(3)内存管理三级架构之内存区域zone
而0xffff,8000,0000,0000以上的128T为系统空间地址, 这远大于当前我们系统中的内存空间, 因此所有的物理地址都可以直接映射到虚拟地址, 不需要高端内存的特殊映射。NUMA结构下, 每个处理器CPU与一个本地内存直接相连, 而不同处理器之前则通过总线进行进一步的连接, 因此相对于任何一个CPU访问本地内存的速度比访问远程内存的速度要快, 而Linux为了兼容NUMA结构, 把物理内存相依照CPU的不同node分成簇, 一个CPU-node对应一个本地内存pgdata_t。原创 2023-01-05 21:14:02 · 1119 阅读 · 0 评论 -
内核解读之内存管理(2)内存管理三级架构之内存结点node
结合NUMA的架构,Linux抽象出了三级内存管理架构:内存节点node、内存区域zone和物理页框page。在NUMA模型中,每个CPU都有自己的本地内存节点(memory node),而且还可以通过QPI总线访问其他CPU下挂的内存节点,只是访问本地内存要比访问其他CPU下的内存的速度高许多,一般经过一次QPI要增加30%的访问时延。原创 2023-01-03 19:55:08 · 1542 阅读 · 0 评论 -
内核解读之内存管理(1)CPU体系架构UMA和NUMA
所以,SMP 又称为 UMA(Uniform Memory Access,一致性存储器访问),其中,一致性指的就是在任意时刻,多个处理器只能为内存的每个数据保存或共享一个唯一的数值。上图的 NUMA Topology 有 2 个 NUMA node,每个 node 有 1 个 socket,即 pCPU, 每个 pCPU 有 6 个 core,1 个 core 有 2 个 Processor,则共有逻辑 cpu processor 24 个。多节点的设计有效提高了存储器的带宽和处理器的扩展性。原创 2023-01-03 16:31:04 · 3517 阅读 · 3 评论 -
内核解读之内存管理(0)开篇介绍
内存管理是linux内核比较重要的一个模块,其实也是任何操作系统里的一个核心专题。在实际的开发工作中,经常会遇到和内存牵扯的问题,比如内存泄露啊,内存越界等。如果你的技术仅仅只是停留于业务层面,对内核的东西一无所知,遇到这些问题往往是束手无策的。我们从事嵌入式linux开发的,应用程序跑在linux操作系统上,你总不能对程序的运行载体一无所知吧。网上有很多关于内存管理的博客,零零散散,对对错错,并不系统,我在阅读了大概上百篇博客之后,结合最新版本(6.x)的内核源码,写了这个系列的文章。原创 2023-01-03 14:42:05 · 1119 阅读 · 0 评论