Linux内存管理
文章平均质量分 78
__pop_
这个作者很懒,什么都没留下…
展开
-
linux内存管理 (五) A 用户空间 glibc的调试
centos下 用gdb 调试,跟踪glibc库文件ubuntu下 使用gdb调试glibc原创 2020-12-28 16:37:49 · 153 阅读 · 0 评论 -
linux内存管理 (五) 9 用户空间 glibc中的内存管理
TODO原创 2020-12-25 15:42:56 · 212 阅读 · 0 评论 -
linux内存管理 (五) 8 用户空间 glibc对内存相关系统调用的封装
前言在 linux内存管理 (五) 6 用户空间 内存相关的系统调用中简述了在内存方面 内核空间 会给 应用空间提供什么服务,但是 应用空间会怎么使用内核空间提供的服务并没有提及glibc的定义应用空间对 内存相关系统调用的使用应用程序一般会使用 malloc free mmap munmap 这 四个函数 来 对 0-3G中的 heap段 进行操作这4个函数是glibc提供的.在内存方面,glibc除了提供这4个函数,还提供了哪些函数api接口 https://www.kernel.org原创 2020-12-25 14:16:31 · 186 阅读 · 0 评论 -
linux内存管理 (五) 7 用户空间 内核中内存相关的系统调用
内核提供的 内存相关的系统调用有哪些也就是 SYSCALL_DEFINE 定义了 哪些内存相关的系统调用应用程序对内核的需求不外乎 申请内存,释放内存grep SYSCALL_DEFINE mm/* -nr 可以搜到很多 定义, 这些就是内核空间提供给用户空间linux-3.0.1]$ grep SYSCALL_DEFINE mm/* -nrmm/fadvise.c:27:SYSCALL_DEFINE(fadvise64_64)(int fd, loff_t offset, loff_t l.原创 2020-12-25 11:15:08 · 467 阅读 · 0 评论 -
linux内存管理 (五) 6 用户空间 系统调用
系统调用的标准与定义系统调用一般是os提供给应用程序的接口在不同的系统上有不同的数量,不同的种类待完善linux 系统调用 体现在哪里1.用户空间怎么陷入内核(进入SYSCALL_DEFINE内核路径),陷入后又怎么返回用户空间 // 对应不同的体系架构有不同的指令, 陷入内核指令的执行一般由glibc提供对于 x86 : int指令(在用户空间执行)陷入内核对于 arm : swi指令(在用户空间执行)陷入内核,iret指令(在内核空间执行)返回用户空间2. 整个.原创 2020-12-25 10:16:11 · 184 阅读 · 0 评论 -
linux内存管理 (五) 5 用户空间 helloword在内存中的布局
linux内存管理的是物理内存,但是cpu访问的都是虚拟地址,通过MMU转换访问物理地址之前了解到了 linux 在启动的时候 做了很多内存配置 (主要是做了 虚拟地址空间 C000 0000 - FFFF FFFF) 的配置 虽然这其中涉及到物理内存(这部分中有线性映射的,有非线性映射的),但是可以看出来不超过 (虚拟地址空间 C000 0000 - FFFF FFFF) 的范畴 也就是说 (虚拟地址空间 0000 0000 - BFFF FFFF) 一直没有做映射这部分(虚拟地址空间 00原创 2020-12-23 18:11:40 · 238 阅读 · 0 评论 -
linux内存管理 (五) 4 用户空间 运行一个helloword的全部过程解析
根据shell/exec加载elf程序的原理,是先解析ELF,定位并加载ld-linux.so这个程序加载器(该so路径需要通过ELF直接确定,且不依赖其他库),然后再解析elf中需要load的共享库,但这之前可以通过LD_PRELOAD来提前预先加载共享库next stephttps://zhuanlan.zhihu.com/p/188276588-------------------------hello 源代码为int main(int argc, char const *argv原创 2020-12-23 10:06:09 · 269 阅读 · 0 评论 -
linux内存管理 (五) 3 用户空间 编译一个helloword的全部过程解析
hello.croot:~/hello# cat hello.c #include <stdio.h>int main(int argc, char const *argv[]){ printf("hello world\n"); return 0;}编译hello的全过程root:~/hello# gcc hello.c -o hello --verbose // 打印信息1 Using built-in specs. Tar.原创 2020-12-23 10:03:35 · 164 阅读 · 0 评论 -
linux内存管理 (五) 2 用户空间 glibc中的重点文件分析
编译相关编译脚本/lib/libc.so/lib/libpthread.so函数入口// https://blog.csdn.net/farmwang/article/details/73195951// 跟 程序的 启动有关,一般会将其 与 程序一起链接 crt1.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.0, not stri原创 2020-12-21 16:24:51 · 330 阅读 · 0 评论 -
linux内存管理 (六) 1内存管理实验综述
前言之前只是从 s3c6410 的角度去 分析了 内存管理的全过程,从流程上大概明白了其过程存在以下几个问题1.细节比较混乱2.认识不够深刻接下来想做一系列实验来细化并强化实验内容实验 常用api使用 申请释放(所有内存机制) bootmem buddy slab/kmalloc vmalloc mempool 用户空间 映射(虚拟地址<--->物理地址) ioremap mmap 内核中的mmap 数据整理原创 2020-12-03 14:19:55 · 272 阅读 · 0 评论 -
linux内存管理 (五) 1 用户空间 用户态的内存管理
前言之前只是 分析了 内存管理启动 的全过程也大概分析了 内存如何申请和释放,虽然着墨甚少用户空间的内存管理一直没涉及.现在想就 用户空间的内存管理说一下可能涉及到以下概念 : mmap brk 等 系统 调用 glibc中的内存管理...原创 2020-12-03 14:16:46 · 467 阅读 · 0 评论 -
linux内存管理 (四) 6 内存管理机制 第三阶段
第三阶段是个时间点 : buddy完成建立完成建立的时间点start_kernel -> mm_init -> mem_init(这个函数返回时)buddy 内部的实现buddy 如何建立的buddy 提供的api------------------------------------申请内存 alloc_pages __get_free_pages alloc_page __get_free_page get_zeroed_page---原创 2020-11-29 14:12:21 · 172 阅读 · 0 评论 -
linux内存管理 (四) 5 内存管理机制 第二阶段 迈向 第三阶段的过程
bootmem 如何 消亡消亡的时间点 是 start_kernel -> mm_init -> mem_init -> free_all_bootmem -> free_all_bootmem_core -> __free_pages_bootmem -> __free_pages -> free_hot_cold_page(page, 0); -> pcp = &this_cpu_ptr(zone->pageset)->原创 2020-08-23 14:02:03 · 365 阅读 · 0 评论 -
linux内存管理 (四) 4 内存管理机制 第二阶段
TODO第二阶段现状: 映射关系 内存分类 bootmembootmem 的消费者从 第二阶段 建立完成,到 第二阶段消亡,有哪些代码用到了 bootmem 的申请和 释放内存原创 2020-08-23 01:01:54 · 238 阅读 · 0 评论 -
linux内存管理 (四) 3 内存管理机制 第一阶段 迈向 第二阶段的过程
详细过程解读迈向第二阶段,按最终目标来看,只需要关注两点内容 1. 做了哪些内存映射 2. bootmem 怎么提供的接口但是在实现过程中,分为了更多步骤 1. meminfo 填充的过程 2. meminfo 检查的过程 3. memblock 填充的过程 4. 内存映射的过程 5. bootmem 初始化的过程 6. bootmem 接口(申请,释放)调用过程...原创 2020-08-18 11:03:50 · 496 阅读 · 0 评论 -
linux内存管理 (四) 2 内存管理机制 第一阶段
第一阶段综述 起点 start(对应压缩内核)(arch/arm/boot/compressed/head.S) 或 stext(对应非压缩内核)(arch/arm/kernel/head.S) 终点 paging_init() 与 bootmem_init() 两者都执行完成 该阶段的动态内存分配器名称 无动态内存分配机制,结构体变量都是静态创建的. 动态分配器提供的申请内存的API 无 该阶段状态 1. 建立了页表 2. 开了MMU内存管理原创 2020-08-17 16:51:19 · 219 阅读 · 0 评论 -
linux内存管理 (四) 1 从 start_kernel开始 的内存管理总述
linux内存管理 (三) 一系列的文章 讲述了 两个时间点 中的过程 1. 内核被加载到内存 2. 内核执行到 start_kernellinux内存管理 (四) 想尽可能的叙述 从 start_kernel 到启动完成 过程中 ,启动相关的内存设置...原创 2020-08-08 21:54:13 · 337 阅读 · 0 评论 -
linux内存管理 (三) 13 基于ARM的系统移植要考虑什么
如果是三星的芯片需要在arch/arm 下面,提供一个类似 mach-s3c64xx 的目录,并完成这个目录应该提供的功能 1. 提供 一个 结构体 struct machine_desc __mach_desc_SMDK6410 2. 提供 s3c6410_core_init,用于 core_initcall如果不是三星的芯片需要在arch/arm 下面,提供一个类似 目录,该目录的功能 是 mach-s3c64xx 和 plat-samsung 的集合如果是个新架构芯片(不在那25个架构原创 2020-08-08 21:23:02 · 178 阅读 · 0 评论 -
linux内存管理 (三) 12 linux arch 目录的作用
ok6410 对应的linux-3.0.1 的编译情况arch 下面的这些目录 镜像 相关,其他目录与当前镜像 无关boot common configs include kernel lib mach-s3c64xx mm plat-samsung各目录分析arch/boot// 目录 内容✗ ls boot -Rboot:compressedboot/compressed:decompress.c head.S lib1funcs.S misc.c p原创 2020-08-08 21:16:58 · 475 阅读 · 0 评论 -
linux内存管理 (三) 11 其他架构 内核启动从start到start_kernel过程
arch/ 从linux-1.1.45 开始加入内核,代表开始支持多架构(architecture),之前支持 i386arch/i386 从linux-1.1.45 开始加入内核arch/mips 从 linux-1.1.82 开始加入内核arch/arm 从 linux-2.1.80 开始加入内核arch/arm64 从 linux-3.7-rc1 开始加入内核arch/riscv 从 linux-4.15-rc1 开始加入内核现在是 (2020-8-8 16原创 2020-08-08 16:47:32 · 396 阅读 · 2 评论 -
linux内存管理 (三) 10 ARM内核启动从start到start_kernel过程 在 linux 代码中的变化
增加了1.设备树2.虚拟化原创 2020-08-08 10:52:45 · 246 阅读 · 0 评论 -
linux内存管理 (三) 9 内核启动从start到start_kernel过程中的相关配置CONFIG及内核虚拟地址与物理地址关系解读
介绍了 zImage生成过程中的CONFIG及内核虚拟地址与物理地址的由来的深入解读原创 2020-08-08 10:51:12 · 557 阅读 · 0 评论 -
linux内存管理 (三) 8 内核启动从start到start_kernel过程中的相关符号的注解
u-boot 相关的地址请参考 linux内存管理 (三) 6 u-boot引导内核相关地址zImage 启动过程中的符号// linux-3.0.1/arch/arm/boot/compressed/head.S 131 .word 0x016f2818 @ Magic numbers to help the loader 用来帮助 u-boot 识别 zImage 的 132 .word start..原创 2020-08-07 15:58:40 · 383 阅读 · 2 评论 -
linux内存管理 (三) 7 内核启动从start到start_kernel过程中的相关地址在内存中的分布
内核在nand上的分布烧写的是zImage, 烧写到了 nand 的 100000 地址处u-boot 传参,并启动u-bootsetenv bootcmd nand read C0008000 100000 500000 ; bootm 从 nand 地址 100000 处, 读 500000 大小数据,到 C0008000 ,并从 bootm 启动此时和 我们说的 uImage 不同,按道理 官方u-boot 只能引导 uImage 这一种内核镜像除非他修改了u-boot,原创 2020-08-05 22:51:49 · 801 阅读 · 0 评论 -
linux内存管理 (三) 6 u-boot引导内核相关地址
参考 uboot引导内核 Load Address Entry Pointu-boot引导内核的相关地址tftp 0x60003000 uImage; //将 uImage 下载到 0x60003000bootm 0x60003000; // 从 0x60003000 开始解析 uImage ,并按照要求(在uImage头中)行事. 注意: 此时不是从 0x60003000 启动.$cat arch/arm/boot/.uImage.cmd cmd_arch/arm/boot/uImag原创 2020-08-05 21:50:44 · 352 阅读 · 0 评论 -
linux内存管理 (三) 5 arm-linux启动过程地址相关概念及处理方法
ARM地址虚拟地址开MMU的时候 CPU发出的地址是虚拟地址 PC寄存器中的值是虚拟地址 输出给主存的地址是物理地址 输出给cache 索引的地址是物理地址或虚拟地址 输出给MMU/TLB的地址 是虚拟地址物理地址物理地址在 地址总线上有体现物理地址在 内存实体上有体现在没开MMU的时候 不存在虚拟地址 所有的运行地址都是物理地址 PC寄存器中的值是物理地址链接地址1.链接过程中的体现 1.1 arm-linux-ld 的参数 -Ttext 定义原创 2020-08-05 10:51:09 · 261 阅读 · 0 评论 -
linux内存管理 (三) 4 压缩内核启动流程-从start到stext
之前有一个启动流程,是介绍未压缩内核的启动流程 linux内存管理 (三) 3 未压缩内核启动流程-从stext到start_kernel现在这个是介绍 压缩内核启动流程-从start到解压内核 linux内存管理 (三) 4 压缩内核启动流程-从start到解压内核两者关系 压缩内核启动过程 会引导 未压缩内核启动流程 因为压缩内核肯定要解压缩,解压缩之后就是 未压缩内核的启动流程了启动涉及到的文件arch/arm/boot/compressed/head.Sarch/arm/b原创 2020-08-04 15:22:51 · 583 阅读 · 0 评论 -
linux内存管理 (三) 3 未压缩内核启动流程-从stext到start_kernel
OK6410 修改的 linux-3.0.1 的代码启动流程smdk6410 MACH_SMDK6410 SMDK6410 1626启动涉及到的文件涉及到的文件arch/arm/kernel/head.Sarch/arm/kernel/head-common.Sarch/arm/kernel/asm-offsets.carch/arm/mm/proc-v6.S大致过程1.设置处理器到 svc 运行模式,关 FIQ 与 IRQ2..原创 2020-08-03 19:30:19 · 500 阅读 · 0 评论 -
linux内存管理 (三) 2 压缩与未压缩的内核镜像启动粗略解析
像以下内核镜像都是被压缩的,压缩格式为gzip. arch/arm/boot/compressed/vmlinux arch/arm/boot/zImage arch/arm/boot/uImage 这些文件的组成如下 1.前缀 2.解压代码 3.gzip压缩的二进制内核1. uboot引导内核的必要条件2.1如果uboot 引导了一个压缩的内核入口 linux的第一行代码从 linux-3.0.1/arch/arm/boot/compressed/head.S原创 2020-07-30 21:18:20 · 700 阅读 · 0 评论 -
linux内存管理 (三) 1 linux arch 下代码总览 导读
要分析的文件============= vmlinux arch/arm/boot/Image arch/arm/boot/compressed/piggy.gzip arch/arm/boot/compressed/vmlinux arch/arm/boot/zImage arch/arm/boot/uImage vmlinuz // 不对应实体文件,是一个概念集合,其实现包括zImage arch/xxx/boot/vmlinux.bin // 和 Image 一样,原创 2020-07-30 17:14:48 · 240 阅读 · 0 评论 -
linux内存管理 (二) 6.1 硬件 CACHE/WRITE BUFFER/TCM
cache 1.物理组成 缓存线个数/缓存集 叫做 缓存的集合关联性 2.cache 的管理 加载到cache 缓存是自动管理更新的。每当处理器想要访问可缓存位置时,都会检查缓存。 当在cache 未命中时,将分配一个位置并从内存加载缓存线. 管理cache 清除出cache 3.cache 信息 访问 3.1 hit 如何匹配 way/set ??? 3.2 miss 4.cache 的 拓扑(有多少级cache) 及 访问策略(不同cach.原创 2020-07-08 15:07:31 · 466 阅读 · 0 评论 -
linux内存管理 (二) 5.1 硬件 内存访问异常
在内存访问流程中有各种异常发生关注 1. 发生原因 2. 对应ARMv6 7种异常哪一种 3. 怎么处理 4. 应用场景原创 2020-07-08 14:58:39 · 426 阅读 · 0 评论 -
linux内存管理 (二) 4.2 硬件 SMP-Consistency之内存顺序模型1
内存顺序模型解读内存顺序模型解读 内存顺序解读: 到底我们看到的内存生效的顺序是怎么样的?这个就叫内存顺序模型。 程序顺序 : 程序给出的指令的执行顺序(一般涉及到读写内存),这代表程序员的意欲。// 程序员从代码中直观看出来的顺序 内存读写顺序 : 内存真的写入数据的顺序 , 内存的读写,到 设备显示 边际作用(也就是生效,被观察到发生更改) 有一定的时间间隔 观察(生效)顺序 : 这是各个CPU(包括写入的cpu)看到的在内存中发生的顺序,请注意了,这不是内存真的写入数据原创 2020-06-13 16:26:58 · 356 阅读 · 0 评论 -
linux内存管理 (二) 4.1 硬件 SMP-Consistency之内存操作的原子化
原子化操作是什么原子化这个问题要看每个体系结构的定义。每种体系结构都会说明自己哪些内存操作是原子的。更复杂的问题是进行通讯的时候需要做“读-判断-写”这样一个组合原子操作。早期CPU比较简单,比如早期的x86会用LOCK这样的信号来保证一段处理完全独占总线,让内存被原子化地更新。用一个非事实但说明问题的比喻,在上面这个处理过程,如果我在修改的时候把总线锁住,把data的每个域都更新了,然后其他CPU才能进来,这肯定是Consistent的,但这样效率就低了,这段时间其他CPU全都闲着(stall),等.原创 2020-06-13 16:20:07 · 255 阅读 · 0 评论 -
linux内存管理 (二) 3.2 硬件 CP15系统控制协处理器的寄存器描述
寄存器总览寄存器详细描述#Register 0:TLB类型寄存器(VMSAv6)TLB的大小和组织是由实现定义的。这个只读寄存器描述了可锁定的TLB项,以及是否存在单独的指令和数据或统一的TLB。这允许操作系统建立如何管理TLB。TLB类型寄存器通过读取CP15寄存器0来访问,操作码2字段设置为0b011。例如:MRC p15,0,Rd,c0,c0,3;返回TLB类型寄存器bit[0] 0=统一TLB 1=单独的指令/数据TLB。bit[7:1]SBZbit[15:8]统原创 2020-06-13 16:09:58 · 761 阅读 · 0 评论 -
linux内存管理 (二) 1 硬件总览 ARMv6 存储系统 Memory and System Architectures
内存管理armv6硬件相关内容章节概览Memory and System Architectures 存储顺序模型 读写定义 内存属性 内存访问的顺序要求 内存屏障 存储一致性 系统控制协处理器 VMSA 内存访问顺序 内存访问控制 内存访问属性 内存访问异常 异常地址和状态寄存器 table walk CP15寄存器 CACHE 和 Write Buffers cache 组织 cache 类型 L1 cache CP15寄原创 2020-06-13 15:16:48 · 374 阅读 · 0 评论 -
linux内存管理 (二) 3.1 硬件 CP15系统控制协处理器
引言为什么linux会发展成这个样子,这当然是程序员对程序的要求决定的,为了满足这些要求,提出了 进程地址空间抽象(1) , 其中 硬件上增加了新的模块MMU(2), 软件上根据MMU的使用手册(3)更新了系统另外在 进程地址空间抽象 的基础上, 软件上更新了很多新的内存特性(4).这当中并没有提到硬件做的其他工作.例如为了管理MMU,ARM核心上还增加了CP15我们可以通到代码来通过控制 CP15,从而来控制 MMU1.协处理器协处理器按功能分类CP0-CP7 ARM留给各生原创 2020-06-13 15:10:19 · 487 阅读 · 0 评论 -
linux内存管理 (二) 2.6 硬件 MMU的操作手册
引言为什么linux会发展成这个样子,这当然是程序员对程序的要求决定的,为了满足这些要求,提出了 进程地址空间抽象(1) , 其中 硬件上增加了新的模块MMU(2), 软件上根据MMU的使用手册(3)更新了系统另外在 进程地址空间抽象 的基础上, 软件上更新了很多新的内存特性(4).这里主要讲 MMU的使用手册(3)回顾MMU 是做什么的 ? 翻译翻译过程中用到了哪些硬件cpu mmu mmu中的TLBs mmu中的TableWalkUnit cache 主存中的转换表(页表) 主存中其他原创 2020-06-03 18:33:56 · 349 阅读 · 0 评论 -
linux内存管理 (二) 2.5 硬件 MMU及其运行过程 关键过程四 DDR
===========================================虚拟地址和物理地址的转换 关键过程4 根据物理地址pa从主存中其他部分中获取value 操作总线,根据ddr时序读取主存,时序在总线(时钟/控制/数据/地址)上展现. 具体参考 [嵌入式linux开发 (九) RAM(3) s3c2440外扩sdram](https://blog.csdn.net/u011011827/article/details/105422868)...原创 2020-06-03 12:46:56 · 369 阅读 · 0 评论 -
linux内存管理 (二) 2.4 硬件 MMU及其运行过程 关键过程三 cache
===========================================虚拟地址和物理地址的转换 关键过程3 根据物理地址pa从cache中获取value 缓存中的基本存储单元是缓存线。 缓存线包含缓存数据或指令时称为有效,不包含缓存数据或指令时称为无效。 重置时,缓存中的所有缓存线都将失效。当数据或指令从内存加载到缓存线时,缓存线将变为有效。 当缓存线有效时,它包含连续主存位置块的最新值。 缓存线的长度总是2的幂,通常在16到64字节的范围内。 如果缓存线长度为2L字节,则主内原创 2020-06-03 12:46:07 · 362 阅读 · 0 评论