文章目录 一、arch 目录 二、block 目录 三、certs 目录 四、crypto 目录 五、Documentation 目录 在上一篇博客 【Linux 内核】Linux 内核源码结构 ( 下载...Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 ) 中 , 使用了 Visual Studio Code 查看 Linux 内核源码 , 本篇博客开始分析 Linux 内核源码结构.../x86 目录下 ; 每种体系结构 , 都有 相应的子目录 , 如 arm , arm64 分别是 arm 32 位和 64 位平台 ; 二、block 目录 ---- block 目录 , 是子系统目录..., 其中存储了 块设备驱动 相关代码 ; 三、certs 目录 ---- certs 目录中存储了 认证 和 签名 相关代码 ; 四、crypto 目录 ---- crypto 目录中存储了 内核中常用的...加密 , 压缩 等算法 相关代码 ; 五、Documentation 目录 ---- Documentation 目录中存储了 内核中常用的 协议规范 , 功能模块 相关代码 ;
文章目录 一、security 目录 二、sound 目录 三、tools 目录 四、usr 目录 五、virt 目录 一、security 目录 ---- security 目录中存储了 Linux...内核 安全模型 相关代码 ; 二、sound 目录 ---- sound 目录中存储了 声卡驱动 相关代码 ; 三、tools 目录 ---- tools 目录中存储了 与 Linux 内核交互 相关代码...; 四、usr 目录 ---- usr 目录中存储了 用户打包 和 内核压缩 相关代码 ; 五、virt 目录 ---- virt 目录中存储了 kvm 虚拟化目录相关实现 相关代码 ;
文章目录 一、drivers 目录 二、fs 目录 三、include 目录 四、init 目录 五、ipc 目录 六、kernel 目录 一、drivers 目录 ---- drivers 目录中存储了...驱动程序 相关代码 , 如 USB 总线驱动程序 , PCI 总线驱动程序 , 显卡驱动程序 , 网卡驱动程序 等 ; 二、fs 目录 ---- fs 目录中存储了 虚拟文件系统 ( Virtual...目录 ---- include 目录中存储了 内核源码 依赖 的 大部分头文件 代码 ; include 目录中存储了 虚拟文件系统 ( Virtual File System ) 相关代码 ; 四、...init 目录 ---- init 目录中存储了 Linux 内核的初始化 相关代码 ; 该 初始化代码 关联到了 内存的各个组件 的入口 ; 五、ipc 目录 ---- ipc 目录中存储了 进程间通信...相关代码 ; 如 : 信号量 , 共享内存 等 ; 六、kernel 目录 ---- kernel 目录中存储了 内核核心代码 ; 其中包含了 进程管理 , IRQ 中断 等模块 ;
文章目录 一、lib 目录 二、LICENSES 目录 三、mm 目录 四、net 目录 五、samples 目录 六、scripts 目录 一、lib 目录 ---- lib 目录中存储了 C 语言标准库的子集...相关代码 ; 二、LICENSES 目录 ---- LICENSES 目录中存储了 开源许可协议 相关协议文本 ; 该目录拿下都是文本文件 ; 三、mm 目录 ---- mm 目录中存储了 内存管理...( Memory Management ) 相关代码 ; 四、net 目录 ---- net 目录中存储了 网络协议 相关代码 ; 如 : TCP , WIFI , IPV4 , IPV6 等 ;...五、samples 目录 ---- samples 目录中存储了 Linux 内核参考示例代码 ; 六、scripts 目录 ---- scripts 目录中存储了 内核 编译 配置 相关脚本 ;
📷 $ tree ./ -L 1 ./ |-- COPYING |-- CREDITS |-- Documentation |-- Kbuild |-- Kco...
tar -jxvf dir.tar.bz2 解压缩dir.tar.bz2 二、linux内核目录文件解析: 现在我们开始来具体分析linux内核目录的一些文件到底是什么意思,我们大概要明白主体文件到底是干用的...drivers:驱动目录,里面分门别类的列出了linux内核支持的所有硬件设备的驱动源代码。 firmware:固件。什么是固件?...每种CPU架构特有的一些头文件在arch/arm/include目录及其子目录下。 init:init是初始化的意思,这个目录下的代码就是linux内核启动时初始化内核的代码。...scripts:脚本,这个目录下全部是脚本文件,这些脚本文件不是linux内核工作时使用的,而是用来辅助对linux内核进行配置编译生产的。...tools:linux中用到的一些有用工具 usr:目录下是initramfs相关的,和linux内核的启动有关 virt:内核虚拟机相关的 小结:大家看了这么文件目录,不要吓到了(要选择性学习),跟我们关系很紧密的就是
它不需要内存预留,并且尽可能地使用大页(这里唯一可能的预留是kernelcore=, 以避免不可移动的页面碎片化所有内存,但这样的调整不是针对透明大页支持的, 它是通用的适用于内核中所有动态高阶分配的特性...默认情况下,内核尝试在读取页面错误时使用巨型零页来进行匿名映射。...thp_zero_page_alloc_failed: 如果内核分配巨型零页失败并回退到使用小页,则thp_zero_page_alloc_failed会增加。...==优化应用程序== 为了保证内核将立即在任何内存区域映射2M页,mmap区域必须自然对齐。posix_memalign()可以提供这种保证。...如果您没有遍历页表,但是遇到了一个物理的大页,但是您不能在代码中原生地处理它, 您可以通过调用split_huge_page(page)来分裂它。这就是Linux VM在尝试切换大页面之前所做的。
文章目录 一、解压内核源码 二、查询当前 Linux 内核版本号 三、进入并查看 linux 内核源码目录 一、解压内核源码 ---- 将 下载的 Linux 内核源码 linux-5.6.14.tar.gz...拷贝到 Ubuntu 虚拟机中 , 执行 tar xvf linux-5.6.14.tar.gz 命令 , 解压 Linux 内核源码 ; 解压完毕后 , linux-5.6.14 目录中就是解压后的...Linux 内核源码 ; 二、查询当前 Linux 内核版本号 ---- 执行 uname -a 命令 , 查询当前 Ubuntu 系统的 Linux 内核版本号 , 执行过程如下 : root@ubuntu...x86_64 x86_64 x86_64 GNU/Linux root@ubuntu:~/kernel# root@ubuntu:~/kernel# 当前的内核版本号是 4.13.0 ; 三...、进入并查看 linux 内核源码目录 ---- 进入之前解压的 linux-5.6.14 内核源码目录 ; root@ubuntu:~/kernel# ls linux-5.6.14 linux-5.6.14
内核知识第八讲,PDE,PTE,页目录表,页表的内存管理 一丶查看GDT表....这里有一个页目录表,还有页表的关键词. 页目录表: 也称为PDE,而页表称之为PTE. CPU会通过虚拟地址,当作下表.去页目录表中查询.然后查到的结果再去页表中查询.这样就查到对应的物理地址了....PDE表的大小: 页目录表,存储在一个4K字节的物理页中,其中每一项是4个字节.保存了页表的地址. 而最大是1M个页. PTE表的大小. PTE的大小也和PDE一样的....首先前边20位保存了页表或者物理地址的基地址. 比如我们的页目录表. 查到了第5项.那么从中取出千20位来,加上000就等于页表了. 然后从页表中查询千20位....后10位当作页表的下表 设有物理地址为: 00401 000 那么下表则为: 00401 = 0000000001 0000000001 通过虚拟地址得知,页目录表是第一项,而页表也是第一项.
linux本来有伙伴系统分配内存页,为了加快单个内存页的分配linux在每个node里为每个cpu分配了一个per_cpu_pageset(暂且叫他页缓存吧)。...每个页缓存包含一个冷页缓存和一个热页缓存。这两个用法有什么区别呢。 如果申请完一个内存页就立刻用来写数据,用热页缓存。 如果申请完暂时用不到或者给DMA用,用冷页缓存。...这主要是因为内核用free_pages释放单个内存页的时候会调用free_hot_page。...刚释放的内存页大概率还在cpu的cache里,也就是说热页缓存里的页很可能还在cpu的cache里,所以申请热页缓存并且立即使用会直接访问cpu的cache速度会比较快。...其他情况就用冷页缓存,冷页缓存里的页在主内存里,需要重新加载到cpu的cache,速度会慢一些。
概述 运行在用户态的应用程序需要经常访问磁盘数据,进行读写操作,由于磁盘(HDD)相对较慢,没有任何缓存的情况下,每次应用读写操作时延页非常慢;在内核设计之初,添加了缓存设计,将磁盘数据保存在RAM中,...Page Cache高速缓存使用的是物理页帧,以页为单位将文件内容缓存,逻辑文件(struct file)中每一个页可以划分为块单位,将每个块映射到磁盘的盘块,因此一个文件的页可以和多个Buffer Cache...Page Cache(页缓存) Linux页高速缓存任何基于页的数据,所缓存的Page包括普通文件内容、块设备文件、内存映射文件的读写。页缓存中一个页帧的文件数据锁对应的磁盘块不必是连续的。...在内核中块缓存是通过struct buffer_head进行管理的。...所属的地址空间 struct address_space *b_assoc_map; atomic_t b_count; /* users using this buffer_head */ }; 内核中按照块访问的场景不多
1.开场白 环境: 处理器架构:arm64 内核源码:linux-5.10.50 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope Linux内核由于存在page...为了回写page cache中的脏页,需要标记页为脏。 脏页跟踪是指内核如何在合适的时机记录文件页为脏,以便内核在进行脏页回写时,知道将哪些页面回写到磁盘。...匿名页不需要跟踪脏页,因为不需要同步到磁盘;私有文件页也不需要跟踪脏页,因为映射的时候,可写页会映射为只读,写访问会发生写时复制,转变为匿名页;所以只有共享的文件页需要跟踪脏页。...在Linux内核中,因为跟踪脏页会涉及到文件回写、缺页异常、反向映射等技术,所以本文也重点讲解在Linux内核中如何跟踪脏页。...脏页回写之后,页描述符脏标志位是清零的,文件写页调用链会设置页描述符脏标志位。
一、配置内核 首先配置内核,使其支持导出内核页表到debugfs下面: Kernel hacking ---> ---> [*] Export kernel pagetable layout to...start] - [PCI I/O end]同上,专门用于PCI设备使用的地址空间,一般映射大小为16M [vmemmap start] - [vmemmap end]对与ARM64用于page映射区,linux...内核用page结构体管理所有物理内存,每一页大小为PAGE_SIZE对于arm64,可能是4K,16K,64K。...当标识为PTE表示为页表映射即PAGE_SIZE大小4K。 USR AP标记,用于标识当前范围是否在用户空间还是内核空间可读可写或者仅读。...x表述当前范围特权级别模式可执行,就是内核的可执行代码段,在内核中这段一般指向内核的text*段 SHD 表示可共享属性,在arm64上表述为多核之间可共享其页表可见 AF 访问标志,当首次映射页表时,
文章目录 一、物理页释放 __free_pages 函数 一、物理页释放 __free_pages 函数 ---- 页分配器 提供了 释放 物理页的 函数 __free_pages , 该函数定义在 Linux...内核源码的 linux-4.12\mm\page_alloc.c#4083 位置 ; __free_pages 函数参数分析 : struct page *page 参数 表示 要释放的 物理页 page...的 虚拟空间地址 ; unsigned int order 参数 表示 要释放的 物理页 的 " 阶数 " , 也就是 要释放的物理页大小 ; 阶 ( Order ) : 物理页 的 数量单位 ,...n 阶页块 指的是 2^n 个 连续的 " 物理页 " ; 参考 【Linux 内核 内存管理】伙伴分配器 ① ( 伙伴分配器引入 | 页块、阶 | 伙伴 ) __free_pages 函数源码...order == 0) free_hot_cold_page(page, false); else __free_pages_ok(page, order); } } 源码路径 : linux
文章目录 一、.clang-format 文件 二、.cocciconfig 文件 三、.COPYING 文件 四、CREDITS 文件 五、Kbuild 文件 六、Kconfig 文件 七、MAINTAINERS...clang-format 文件 是 代码格式化文件 , 一般由开发团队合作开发时使用 ; 二、.cocciconfig 文件 ---- .get_maintainer.ignore 文件 , 是编译内核时的配置...COPYING 文件 , 存储 代码 许可 和 授权信息 ; 四、CREDITS 文件 ---- CREDITS 文件 , 是贡献者列表 ; 五、Kbuild 文件 ---- Kbuild 文件 , 是内核设定脚本..., 六、Kconfig 文件 ---- Kconfig 文件 , 是开发人员配置内核时的参数 ; 七、MAINTAINERS 文件 ---- MAINTAINERS 文件是目前维护人员列表 ;...八、Makefile 文件 ---- Makefile 文件是 使用 make 命令 , 编译内核时用到的构建脚本 ; 九、README 文件 ---- README 文件 是编译内核的相关信息 ;
前面已经分析过了Intel的内存映射和linux的基本使用情况,已知head_32.S仅是建立临时页表,内核还是要建立内核页表,做到全面映射的。...建立内核页表前奏,了解两个很关键的变量: max_pfn:最大物理内存页面帧号; max_low_pfn:低端内存区(直接映射空间区的内存)的最大可用页帧号; max_pfn 的值来自setup_arch...既然到此,顺便介绍一下内核空间映射情况。 ? 内核空间如上图,分为直接内存映射区(低端内存,线性)和高端内存映射区。...Linux是一个支持多硬件平台的操作系统,各种硬件芯片的分页并非固定的2级(页全局目录和页表),仅仅Intel处理器而言,就存在3级的情况(页全局目录、页中间目录和页表),而到了64位系统的时候就成了4...所以Linux为了保持良好的兼容性和移植性,系统设计成了以下的4级分页模型,根据平台环境和配置的情况,通过将页上级目录和页中间目录的索引位设置为0,从而隐藏了页三级目录和页中间目录的存在。
前面已经分析了内核页表的准备工作以及内核低端内存页表的建立,接着回到init_mem_mapping()中,低端内存页表建立后紧随着还有一个函数early_ioremap_page_table_range_init...回到page_table_range_init(),其中one_md_table_init()是用于当pgd入参为空时,申请新物理页作为页中间目录的,但是此次仅分析x86非PAE环境的情况,不存在页中间目录...,如果是,则把其pte页表的内容拷贝到page_table_range_init()申请的页表空间中,并将newpte新页表的地址设置到pmd中(32bit系统实际上就是页全局目录),然后调用__flush_tlb_all...为了避免前期可能对固定映射区已经分配了页表项,基于临时内核映射区间要求页表连续性的保证,所以在此重新申请连续的页表空间将原页表内容拷贝至此。...至此,内核页表建立完毕。
从事十年嵌入式转内核开发(23K到45K),给兄弟们的一些建议 腾讯T6-9首发“Linux内核源码嵌入式开发进阶笔记”,差距不止一点点哦 如下图所示,进程1和进程2拥有完整的虚拟地址空间,虚拟地址空间分为了用户空间和内核空间...…… 针对这些话题本文不做深入探讨,可以阅读另一篇为其量身定做的博文《深入Linux内核(内存篇)—TLB》。 1.5 页表多大合适?...五级分页每级命名分别为页全局目录(PGD)、页4级目录(P4D)、页上级目录(PUD)、页中间目录(PMD)、页表(PTE)。...pgd_offset_k(addr) 根据入参虚拟地址address和init_mm,找到address在页全局目录中相应表项的线性地址。仅用于内核页表。...TTBR0和TTBR1,在Linux中分别用于用户空间和内核空间,内核空间地址高16位全为1,用户空间地址高16位全为0,。
,而页表管理是在虚拟内存管理中尤为重要,本文主要以回答几个页表管理中关键性问题来解析Linux内核页表管理,看一看页表管理中那些鲜为人知的秘密。...Linux内核为何使用多级页表?...2)Linux内核 填写页表,将页表基地址告诉mmu 内核初始化建立内核页表,实现缺页异常等机制为用户任务按需分配并映射页表。 当然,内核也可以遍历页表,如缺页异常时遍历进程页表。 10....12.页表遍历过程 下面以arm64处理器架构多级页表遍历作为结束(使用4级页表,页大小为4K): Linux内核中 可以将页表扩展到5级,分别是页全局目录(Page Global Directory,...PGD), 页4级目录(Page 4th Directory, P4D), 页上级目录(Page Upper Directory, PUD),页中间目录(Page Middle Directory
文章目录 一、下载 Linux 内核源码 二、使用 VSCode 阅读 Linux 内核源码 一、下载 Linux 内核源码 ---- 参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的...Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 ) 博客 , 下载 Linux 5.6.18 版本的内核源码 ; 5.x 内核源码下载地址...: https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ Linux 内核 5.6.18 版本 : https://mirrors.edge.kernel.org...不同版本的 Linux 内核 区别 : 系统调用 : 其系统调用是相同的 , 新的版本可能会增加新的系统调用 ; 设备文件 : 各内核版本的设备文件都是相同的 , 但是 内部接口 可能不同 ; 二、使用...Code ) 博客 , 安装 VSCode 软件 ; 打开 VSCode , 选择 ” 菜单栏 / 文件 / 打开文件夹 ” 选项 , 选择 Linux 内核源码目录 , 点击 ” 选择文件夹 ”
领取专属 10元无门槛券
手把手带您无忧上云