首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux-3.14.12内存管理笔记【建立内核(3)

前面已经分析了内核的准备工作以及内核低端内存建立,接着回到init_mem_mapping()中,低端内存建立后紧随着还有一个函数early_ioremap_page_table_range_init...“窗口”映射到内核地址空间,调用kmap_atomic可以搭建起“窗口”到高端内存的关系,即建立临时内核映射。...总的来说就是该临时内核映射区间是为了给各个CPU准备一个指定的窗口空间。由于kmap_atomic()对该区间的使用,所以该区间必须保证其连续性。...为了避免前期可能对固定映射区已经分配了表项,基于临时内核映射区间要求连续性的保证,所以在此重新申请连续的空间将原内容拷贝至此。...至此,内核建立完毕。

1.5K11

Linux-3.14.12内存管理笔记【建立内核(1)】

前面已经分析过了Intel的内存映射和linux的基本使用情况,已知head_32.S仅是建立临时内核还是要建立内核,做到全面映射的。...建立内核前奏,了解两个很关键的变量: max_pfn:最大物理内存页面帧号; max_low_pfn:低端内存区(直接映射空间区的内存)的最大可用帧号; max_pfn 的值来自setup_arch...Linux是一个支持多硬件平台的操作系统,各种硬件芯片的分页并非固定的2级(全局目录和),仅仅Intel处理器而言,就存在3级的情况(全局目录、中间目录和),而到了64位系统的时候就成了4...所以Linux为了保持良好的兼容性和移植性,系统设计成了以下的4级分页模型,根据平台环境和配置的情况,通过将上级目录和中间目录的索引位设置为0,从而隐藏了三级目录和中间目录的存在。...此外还有一个准备操作,在setup_arch()函数中调用的缓冲区申请操作: early_alloc_pgt_buf(): 【file:/arch/x86/mm/init.c】 void __init

1.8K41
您找到你想要的搜索结果了吗?
是的
没有找到

内核调试

一、配置内核 首先配置内核,使其支持导出内核到debugfs下面: Kernel hacking ---> ---> [*] Export kernel pagetable layout to...内核用page结构体管理所有物理内存,每一大小为PAGE_SIZE对于arm64,可能是4K,16K,64K。...地址空间port属性说明 第一列 当前的映射范围地址 第二列 代表此映射范围大小 PMD PUD PTE 当标识为PMD PUD表示当前映射为block映射,如当前为4K,则pud的block映射一次性可映射...当标识为PTE表示为映射即PAGE_SIZE大小4K。 USR AP标记,用于标识当前范围是否在用户空间还是内核空间可读可写或者仅读。...x表述当前范围特权级别模式可执行,就是内核的可执行代码段,在内核中这段一般指向内核的text*段 SHD 表示可共享属性,在arm64上表述为多核之间可共享其可见 AF 访问标志,当首次映射时,

12910

Linux内核管理-那些鲜为人知的秘密

,而管理是在虚拟内存管理中尤为重要,本文主要以回答几个管理中关键性问题来解析Linux内核管理,看一看管理中那些鲜为人知的秘密。...Linux内核为何使用多级?...2)Linux内核 填写,将基地址告诉mmu 内核初始化建立内核,实现缺页异常等机制为用户任务按需分配并映射。 当然,内核也可以遍历,如缺页异常时遍历进程。 10....填写/切换时机 1)内核填充 内核初始化过程: 物理地址 -> 恒等映射(建立恒等映射和粗粒度内核) ->打开mmu -> paging_init(建立细粒度的内核和内存线性映射...12.遍历过程 下面以arm64处理器架构多级遍历作为结束(使用4级大小为4K): Linux内核中 可以将扩展到5级,分别是全局目录(Page Global Directory,

1.7K21

深入理解Linux内核映射分页机制原理

从事十年嵌入式转内核开发(23K到45K),给兄弟们的一些建议 腾讯T6-9首发“Linux内核源码嵌入式开发进阶笔记”,差距不止一点点哦 如下图所示,进程1和进程2拥有完整的虚拟地址空间,虚拟地址空间分为了用户空间和内核空间...…… 针对这些话题本文不做深入探讨,可以阅读另一篇为其量身定做的博文《深入Linux内核(内存篇)—TLB》。 1.5 多大合适?...TTBRx(Translation Table Base Register x)即转换基址寄存器,ARMv7提供了TTBR0和TTBR1两个寄存器,Linux分别将其应用于内核态和用户态。...ARMv7属性的定义分为Linux版本的和ARMv7硬件的Linux版本的PTE属性定义加入前缀L_,如下所示: /* * "Linux" PTE definitions....TTBR0和TTBR1,在Linux中分别用于用户空间和内核空间,内核空间地址高16位全为1,用户空间地址高16位全为0,。

2.8K10

宋宝华: ARM64 Linux内核的块映射

内核文档Documentation/arm64/memory.rst描述了ARM64 Linux内核空间的内存映射情况,应该是此方面最权威文档。...我们看看这种情况下的,我们既可以用最终的【20:12】对应的PTE映射项,以4K为单位,进行虚拟地址到物理地址的映射;又可以以【29:21】对应的PMD映射项,以2M为单位,进行虚拟地址到物理地址的映射...我们把它们全部选中,这样我们可以得到一个debugfs接口: /sys/kernel/debug/kernel_page_tables 来获知内核的情况。...我在内核启动参数加的rodata=0实际上是让rodata_full为false。如果我把这个kernel启动选项去掉,我得到的内核是完全不一样,线性映射区也全部是PTE映射: ?...这个patchset的原理建立在,当内核以4KB分页的时候,每个page需要64字节的page struct。

3.1K10

内核必须懂(七): Linux四级(x64)

目录 前言 Intel四级 实操寻址 获取cr3 获取PGD 获取PUD 获取PMD 获取PTE 获取内容 最后 ---- 前言 Linux四级的作用主要就是地址映射, 将逻辑地址映射到物理地址...很多时候, 有些地方想不明白就可以查看实际物理地址进行分析. ---- Intel 四级 其实很多设计的根源或者说原因都来自于CPU的设计, OS很多时候都是辅助CPU....Linux的四级就是依据CPU的四级来设计的. 这里主要说的就是Intel x64面大小为4KB的情况, 如图所示: ?...在Linux当中, 第一级称为PGD, 当然是有历史原因的, 可以自行google. 所以Linux的四级分别是PGD -> PUD -> PMD -> PTE. ?...---- 最后 当然了, 这次是在用户态下进行从线性地址到物理地址转换的, 如果是内核态有些地方会发生变化. 暂时写到这里, 内核态等后续的更新了.

6.8K40

内核知识第八讲,PDE,PTE,目录,的内存管理

内核知识第八讲,PDE,PTE,目录,的内存管理 一丶查看GDT....首先我们的CR3寄存器保存了的首地址. 这里有一个目录,还有的关键词. 目录: 也称为PDE,而称之为PTE....CPU会通过虚拟地址,当作下表.去目录中查询.然后查到的结果再去中查询.这样就查到对应的物理地址了....PDE的大小:   目录,存储在一个4K字节的物理中,其中每一项是4个字节.保存了的地址.   而最大是1M个. PTE的大小.   PTE的大小也和PDE一样的....但是通过两个查询.可以映射4G内存.而上面的设计方法不行. 首先前边20位保存了或者物理地址的基地址. 比如我们的目录. 查到了第5项.那么从中取出千20位来,加上000就等于了.

1.3K10

linux内核的冷热分配器

linux本来有伙伴系统分配内存,为了加快单个内存的分配linux在每个node里为每个cpu分配了一个per_cpu_pageset(暂且叫他缓存吧)。...每个缓存包含一个冷缓存和一个热缓存。这两个用法有什么区别呢。 如果申请完一个内存就立刻用来写数据,用热缓存。 如果申请完暂时用不到或者给DMA用,用冷缓存。...这主要是因为内核用free_pages释放单个内存的时候会调用free_hot_page。...刚释放的内存大概率还在cpu的cache里,也就是说热缓存里的很可能还在cpu的cache里,所以申请热缓存并且立即使用会直接访问cpu的cache速度会比较快。...其他情况就用冷缓存,冷缓存里的在主内存里,需要重新加载到cpu的cache,速度会慢一些。

94410

驱动开发:内核解析内存四级

当今操作系统普遍采用64位架构,CPU最大寻址能力虽然达到了64位,但其实仅仅只是用到了48位进行寻址,其内存管理采用了9-9-9-9-12的分页模式,9-9-9-9-12分表示物理地址拥有四级,...9-9-9-9-12的分页模式是一种常见的分页方案,其中物理地址被分成四级:PXE(Page Directory Pointer Table Entry)、PPE(Page Directory Entry...每个级别的都负责将虚拟地址映射到更具体的物理地址。通过这种层次化的结构,操作系统可以更有效地管理和分配内存。...PTE 0即可解析,如下所示,当前地址0位置处的PTE基址是FFFF898000000000,由于PTE的一个大小是0x1000所以当内存地址高于0x1000时将会切换到另一个中,如下FFFF898000000008...则是另一个中的地址。

16330

驱动开发:内核解析内存四级

当今操作系统普遍采用64位架构,CPU最大寻址能力虽然达到了64位,但其实仅仅只是用到了48位进行寻址,其内存管理采用了9-9-9-9-12的分页模式,9-9-9-9-12分表示物理地址拥有四级,...9-9-9-9-12的分页模式是一种常见的分页方案,其中物理地址被分成四级:PXE(Page Directory Pointer Table Entry)、PPE(Page Directory Entry...每个级别的都负责将虚拟地址映射到更具体的物理地址。通过这种层次化的结构,操作系统可以更有效地管理和分配内存。...PTE 0即可解析,如下所示,当前地址0位置处的PTE基址是FFFF898000000000,由于PTE的一个大小是0x1000所以当内存地址高于0x1000时将会切换到另一个中,如下FFFF898000000008...则是另一个中的地址。

49290

linux内核符号kallsyms简介

简介: 在2.6版的内核中,为了更方便的调试内核代码,开发者考虑将内核代码中所有函数以及所有非栈变量的地址抽取出来,形成是一个简单的数据块(data blob:符号和地址对应),并将此链接进 vmlinux...在需要的时候,内核就可以将符号地址信息以及符号名称都显示出来,方便开发者对内核代码的调试。完成这一地址抽取+数据快组织封装功能的相关子系统就称之为 kallsyms。...kallsyms抽取了内核用到的所有函数地址(全局的、静态的)和非栈数据变量地址,生成一个数据块,作为只读数据链接进kernel image,相当于内核中存了一个System.map。...须设置 CONFIG_KALLSYMS 选项为y;如果要在 kallsyms 中包含全部符号信息,须设置 CONFIG_KALLSYMS_ALL 为y 查看kallsyms: 得益于/proc文件系统...,我们可以直接读取这个

2.2K20

浅谈Linux内核缓存和块缓存

概述 运行在用户态的应用程序需要经常访问磁盘数据,进行读写操作,由于磁盘(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 */ }; 内核中按照块访问的场景不多

2.7K30

深入理解Linux内核之脏跟踪

1.开场白 环境: 处理器架构:arm64 内核源码:linux-5.10.50 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope Linux内核由于存在page...为了回写page cache中的脏,需要标记为脏。 脏跟踪是指内核如何在合适的时机记录文件为脏,以便内核在进行脏回写时,知道将哪些页面回写到磁盘。...匿名不需要跟踪脏,因为不需要同步到磁盘;私有文件也不需要跟踪脏,因为映射的时候,可写会映射为只读,写访问会发生写时复制,转变为匿名;所以只有共享的文件需要跟踪脏。...在Linux内核中,因为跟踪脏会涉及到文件回写、缺页异常、反向映射等技术,所以本文也重点讲解在Linux内核中如何跟踪脏。...脏回写之后,描述符脏标志位是清零的,文件写调用链会设置描述符脏标志位。

2K10

Linux 内核 内存管理】物理释放 ( 物理释放 __free_pages 函数 )

文章目录 一、物理释放 __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

12.5K20

Linux 内核 内存管理】内存管理架构 ③ ( Linux 内核中的内存管理模块 | 分配器 | 不连续分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 缓存 | 高速缓存 )

文章目录 一、Linux 内核中的内存管理模块 二、硬件设备内存管理 一、Linux 内核中的内存管理模块 ---- Linux 内核还需要处理如下内容 : ① 错误异常处理 ② 管理 ③ 引导内存分配器...: 分配器 , 块分配器 , 不连续分配器 , 连续内存分配器 , 每处理器内存分配器 ; " 分配器 " 负责分配 内存物理 , 使用的是 " 伙伴分配器 " ; " 不连续分配器 " 提供了...vmalloc 函数 用于分配内存 , vfree 函数 用于 释放内存 ; 申请的 " 不连续物理 “ 可以 映射到 ” 连续的虚拟 " ; ④ 内存碎片整理 ⑤ 内存耗尽处理 ⑥ 内存控制组...: 控制管理 被 进程 占用的 内存 ; 碎片整理 : 如果 " 内存碎片化 " 严重 , 没有连续物理 , 需要通过 整理内存碎片 并迁移数据 得到 连续的 物理 ; 内存回收 : 内存不足时 ,..." ( MMU ) 中 , 还有一个 " 缓存 " ; 缓存 中缓存了 最近使用的 " 映射 “ , 该映射的作用是 将 ” 物理地址 " 映射为 " 虚拟地址 " ; CPU 处理器

1.4K40

Linux 内核Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 )

文章目录 一、下载 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 内核报错 ( Can not create symbolic link : 客户端没有所需的特权 | Windows 中配置 7z 命令行执行解压操作 ) 博客 ;...不同版本的 Linux 内核 区别 : 系统调用 : 其系统调用是相同的 , 新的版本可能会增加新的系统调用 ; 设备文件 : 各内核版本的设备文件都是相同的 , 但是 内部接口 可能不同 ; 二、使用

23.1K32

一文看懂影子和扩展

后引入机制,把虚拟地址送往MMU,MMU查TLB不中的情况下,依次查就可以找到对应的物理地址。...二.影子 (Shadow page table) 影子我用一句话来描述就是:VMM把Guest和Host中的合并成一个,称为影子,来实现GVA->HPA映射。...4, 把GVA -> HPA,这一路的映射关系记录到中,这个就是影子。...虚拟机和影子通过一个哈希建立关联(当然也有其他的关联方式),客户机操作系统把当前进程的基址载入PDBR时而VMM将会截获这一特权指令,将进程的影子基址载入客户机PDBR,使客户机在恢复运行时...硬件层面引入EPTP寄存器,来指向EPT基地址。Guest运行时,Guest被载入PDBR,而 EPT 被载入专门的EPT 指针寄存器 EPTP。

1.4K20
领券