linux管理分散物理内存

Linux 4.14内核———— scatterlist介绍 scatterlist简单介绍 阅读详情

arm a9 跑linux 使用mmu时 是否可以在uboot参数表中指定linux可管理的几片物理地址空间?

直接回答:是的,完全可以,而且这正是一种标准的、推荐的做法。

当ARM A9运行使用MMU的Linux时,你不能也不应该让Linux管理所有的物理内存。通过U-Boot的参数表(主要是bootm命令使用的设备树Blob)来明确指定Linux可管理的物理内存区域是标准流程。


工作原理:U-Boot如何告知Linux内存布局

在现代Linux中,这个过程几乎总是通过设备树(Device Tree Blob, DTB) 来完成。U-Boot的工作是准备好DTB并将其传递给Linux内核。

  1. U-Boot的职责:

    • 检测或硬编码配置系统的物理内存布局。
    • 将内存布局信息(起始地址和大小)编码到设备树的 /memory 节点中。
    • 将最终的DTB地址通过r2寄存器(在ARM上)传递给Linux内核。
  2. Linux内核的行为:

    • 内核启动后,首先解析U-Boot通过r2传来的DTB地址。
    • 在DTB中查找 /memory 节点。
    • 将这些节点中描述的物理地址范围添加到内核的内存管理器(如Buddy Allocator)的可用资源中。
    • 此后,内核的MMU和虚拟内存系统将只管理这些指定的物理内存。

设备树中的内存节点示例

设备树中描述内存的节点通常看起来像这样:

/ {
    /* ... 其他节点 ... */

    // 这是定义可用物理内存的地方
    memory@80000000 {
        device_type = "memory";
        reg = <0x80000000 0x10000000>; // 起始地址 0x80000000, 大小 0x10000000 (256MB)
    };

    // 你可以定义多个内存区域!
    memory@c0000000 {
        device_type = "memory";
        reg = <0xc0000000 0x20000000>; // 另一片内存:起始 0xc0000000, 大小 0x20000000 (512MB)
    };

    /* ... 其他节点 ... */
};

关键点:

  • reg 属性:每个< >对定义了一片连续的物理内存区域。
  • 多个区域:你可以定义多个memory节点或一个节点包含多个reg条目,以此来告诉Linux系统中有多片不连续的物理内存可供使用。这对于处理保留区域(如GPU、DSP专用内存)至关重要。

为什么需要这样做?内存管理的“保留区域”

系统物理内存的很大一部分通常会被保留给其他特定用途,Linux绝不能去触碰这些区域。U-Boot通过DTB告诉Linux哪些是“可用”的,也就隐式地定义了哪些是“不可用”的(保留的)。

常见的保留区域包括:

  1. U-Boot自身:U-Boot在内存中运行,解压和加载内核后,它所在的内存区域必须被标记为保留,以免被Linux覆盖。
  2. 设备树Blob (DTB):U-Boot将DTB加载到内存的某个位置,这个区域必须保留。
  3. Linux内核映像:内核被加载到内存中并开始执行,它自身所在的代码段和数据段区域需要被保留。
  4. Initramfs:如果使用了初始RAM文件系统,它所在的内存也需要保留。
  5. 特定硬件功能:
    • GPU/VPU专用内存:SoC的GPU通常需要一片连续的、大的物理内存(CMA,Contiguous Memory Allocator)。
    • DSP/协处理器内存:另一个处理器核心可能需要独占一片内存。
    • 共享内存:用于Linux与协处理器或其他操作系统(如RTOS)之间通信的内存区域。
    • 硬件寄存器:SoC外设的寄存器地址空间,通常通过reserved-memory节点保留。
  6. DMA引擎:有些DMA引擎只能访问特定的内存地址范围。

在设备树中定义保留内存

保留内存通常在设备树中显式声明,这样内核和驱动程序都会避免使用它们。

/ {
    reserved-memory {
        #address-cells = <1>;
        #size-cells = <1>;
        ranges;

        // 为GPU保留128MB内存
        gpu_memory: region@98000000 {
            compatible = "shared-dma-pool";
            reg = <0x98000000 0x8000000>; // 128MB
            no-map; // 非常重要!告诉内核不要映射此区域用于常规用途
        };

        // 为DSP保留64MB内存
        dsp_memory: region@a0000000 {
            reg = <0xa0000000 0x4000000>; // 64MB
            no-map;
        };
    };

    // 然后,设备节点可以引用这些保留区域
    gpu: gpu@ff300000 {
        compatible = "vendor,gpu";
        memory-region = <&gpu_memory>; // 指向上面定义的保留区域
        /* ... */
    };
};

总结:U-Boot和Linux的协作流程

  1. 硬件上电 -> 运行U-Boot。
  2. U-Boot:
    • 初始化硬件,检测内存。
    • 将设备树(DTB)和Linux内核映像(zImage)加载到内存的特定地址。
    • 修改DTB:在DTB的 /memory 节点中设置可用的物理内存范围,并在 /reserved-memory 节点或 /chosen 节点中设置保留的内存范围(如内核、DTB自身所在的位置)。
    • 使用 bootm <kernel_addr> <ramdisk_addr> <dtb_addr> 命令启动内核,并将DTB地址通过寄存器传递给内核。
  3. Linux内核:
    • 从DTB中读取物理内存信息。
    • 初始化MMU和虚拟内存系统,仅管理DTB中声明的可用物理内存。
    • 将DTB中声明的保留区域排除在内存分配池之外。

所以,通过U-Boot参数(最终体现在DTB中)指定Linux可管理的物理内存片,不仅是可行的,更是启动一个稳定可靠的Linux系统的标准且必要的方法。



没有dts时候,指定mmu使用的空间,可以atag/mem cmdline方法。
比如Linux 2.6 vintage系统的启动核心,在设备树(DTS)成为标准之前,通过U-Boot传递的ATAG列表(特别是ATAG_MEM和ATAG_CMDLINE)来指定Linux可管理的物理内存空间。**


核心机制:ATAGs

在Linux 2.6时代(以及更早的版本),ARM平台使用一种称为ATAG(Auxiliary TAG)的数据结构来由Bootloader(如U-Boot)向内核传递系统信息。这是一个保存在内存中的链表,包含了内存大小、根设备、命令行参数等关键信息。

U-Boot通过寄存器r2向Linux内核传递ATAG列表的起始物理地址。

关键的内存相关ATAG:
  1. ATAG_MEM:

    • 作用:定义一片连续的、可用的物理内存区域。
    • 特点:可以传递多个ATAG_MEM标签,以此来告诉内核系统中有多片物理内存。这是回答你问题的关键。
  2. ATAG_CMDLINE:

    • 作用:传递内核命令行参数(bootargs)。
    • 与内存相关:可以通过mem=参数来覆盖或进一步限制从ATAG_MEM获得的内存信息。这在你有非常特殊的保留区域时非常有用。

如何实现:在U-Boot中指定多片内存

你需要通过组合使用多个ATAG_MEM 和 内核命令行参数 来实现。

方法1:快捷方法 - 使用内核命令行参数 mem=

如果修改U-Boot代码不方便,或者只是想临时测试,你可以使用U-Boot的bootargs环境变量来传递mem=参数。

在U-Boot命令行中设置:

# 语法:mem=<size>[@<start>]
# 设置第一片内存:从0x80000000开始的256MB
setenv bootargs console=ttyAMA0,115200 mem=256M@0x80000000

# 或者,如果你想定义两片不连续的内存,可以多次使用mem=参数
setenv bootargs console=ttyAMA0,115200 mem=256M@0x80000000 mem=128M@0xc00000000
saveenv
方法2:主要方法 - 修改U-Boot代码传递多个 ATAG_MEM

这是最正式、最可靠的方法。你需要修改U-Boot的板级支持包(通常是lib_arm/armlinux.c或板级文件中的setup_memory_tags()函数)。

示例:假设你的A9平台有兩片内存:

  • DRAM1: 0x80000000 - 0x8fffffff (256MB)
  • DRAM2: 0xc0000000 - 0xc7ffffff (128MB)

你的U-Boot代码需要生成一个像这样的ATAG列表:

/* 假设在某个设置ATAG的函数中 */
struct tag *params = (struct tag *)bd->bi_boot_params; // 获取ATAG列表起始地址

/* 设置第一个内存区域 */
params->hdr.tag = ATAG_MEM;
params->hdr.size = tag_size(tag_mem32);
params->u.mem.start = 0x80000000; // 起始地址
params->u.mem.size = 0x10000000;  // 大小 256MB
params = tag_next(params);         // 指向下一个ATAG位置

/* 设置第二个内存区域 */
params->hdr.tag = ATAG_MEM;
params->hdr.size = tag_size(tag_mem32);
params->u.mem.start = 0xc0000000; // 起始地址
params->u.mem.size = 0x08000000;  // 大小 128MB
params = tag_next(params);         // 指向下一个ATAG位置

/* ... 设置其他ATAG(如CMDLINE, INITRD等) ... */

/* 最后设置一个ATAG_NONE标签表示列表结束 */
params->hdr.tag = ATAG_NONE;
params->hdr.size = 0;
params = tag_next(params);

这样,Linux内核在启动时,会遍历ATAG列表,收集到所有ATAG_MEM标签,并将这些区域全部添加到它的内存管理系统中。

重要说明:

  • mem=参数会覆盖从ATAG列表中获得的所有内存信息。如果你在ATAG中传了512MB,但在命令行写mem=256M,内核最终只能看到256MB。
  • 使用多个mem=参数来定义多片内存是内核支持的特性,你需要确认你使用的Linux 2.6内核版本编译时开启了CONFIG_ARCH_PHYS_ADDR_T_64BIT或其他相关选项来支持物理地址扩展,否则可能无法正确识别高位地址的内存。

  1. Linux启动后保留:

    • 让内核看到所有内存,然后在Linux启动后,由特定的设备驱动程序通过request_mem_region()和ioremap()等API来申请并独占某块物理内存区域,使其不会被内存分配器分配给其他人。比如iomem空间用于soc上各模块reg访问的,of_io_request_and_map可以完成预留。
    • 这是一种“先到先得”的软件保留方式。
  2. 修改U-Boot:

    • 最可靠的方法:直接修改U-Boot的setup_memory_tags()函数,只将你想让Linux管理的物理地址范围通过ATAG_MEM传递过去。那些你不想让Linux管理的“保留区域”,直接不加入ATAG列表即可。U-Boot自己知道这些区域的存在,并且不会使用它们来加载内核或DTB,这样就实现了物理上的隔离。

总结:无DTS时代的流程

  1. U-Boot职责:

    • 初始化硬件,检测所有物理内存。
    • 决定哪些内存区域分配给Linux。
    • 在内存中构建一个ATAG列表,其中包含一个或多个ATAG_MEM标签,每个标签描述一片Linux可用的物理内存。
    • 通过寄存器r2将ATAG列表的起始地址传递给Linux内核。
    • 通过bootargs中的mem=参数可以覆盖ATAG的设置。
  2. Linux内核行为:

    • 从r2寄存器获取ATAG列表地址。
    • 遍历ATAG列表,收集所有ATAG_MEM信息。
    • 解析bootargs中的mem=参数(如果有),并据此调整可用的内存范围。
    • 初始化MMU和内存管理系统,仅管理通过这些机制告知它的物理内存。

因此,对于你的Linux 2.6系统,修改U-Boot代码以传递多个ATAG_MEM标签是指定多片物理内存空间的标准且最有效的方法。

SWIOTLB原理与调优:Linux DMA安全边界的核心机制 DMA(直接内存访问)是外设高效读写内存的基础技术,但其绕过MMU和页表的‘裸奔’特性,导致地址越界、缓存不一致及机密计算环境下的加密内存泄露等严重安全隐患。SWIOTLB(软件IO TLB)作为Linux内核关键子系统,通过预分配低位连续bounce buffer、强制地址合规映射与数据同步中转,在硬件DMA能力与操作系统内存模型之间构建安全隔离层。它支撑着PCIe、NVMe、以太网等高速外设的稳定运行,更是Intel TDX与AMD SEV等机密计算场景下DMA可信执行的强制基石。理解SWIOTLB的初 阅读详情

相关推荐

逆向工程Python爬虫——国税局发票查验平台

前言 这是一篇含金量很高的干货文章,笔者将手把手带领各位一步一步地实现爬取国家税务总局全国增值税发票查验平台(以下简称“查验平台”)。这个想法诞生在19年初,当时在做一款通过扫描二维码就可以查验发票的小程序。 当时由于笔者学艺尚浅,没办法模拟请求爬取查验平台,所以最终采用的技术方案是通过web自动化测试工具selenium控制浏览器去模拟查验步骤,即使这样,开发过程也是困难重重,不过最后笔者和伙伴们成功实现了整套流程,最后开发出的产品口袋发票夺得了包括2019微信小程序开发大赛赛区三等奖在内的多个奖项。 但

weixin_43102379的博客 1万+

Linux内核scatterlist

转载自: Linux内核scatterlist API介绍 - AlanTu - 博客园 (cnblogs.com)https://www.cnblogs.com/alantu2018/p/8457417.html 1. 前言 我们在那些需要和用户空间交互大量数据的子系统(例如MMC[1]、Video、Audio等)中,经常看到scatterlist的影子。对我们这些“非英语母语”的人来说,初见这个词汇,脑袋瞬间就蒙圈了。scatter可翻译成“散开、分散”,list是“列表”的意思,因而scatte

710

FreeRTOS-Plus-CLI使用笔记

FreeRTOS-Plus-CLI使用笔记 一、简介 详细介绍可参考FreeRTOS-Plus-CLI官网地址入口 FreeRTOS+CLI(Command Line Interface, 命令行接口)提供了一种简单、小型、可扩展且RAM高效的方法,使FreeRTOS应用程序能够处理命令行输入。添加一条指令的步骤如下: 提供一个实现命令功能的函数 将命令映射到该功能函数 注册命令 运行命令解释器 命令行调试接口对于排查分析出现的问题提供了很好的接口,可以通过查看传感器信息判断传感器是否正常,可以查看内置

ApexYuan 6963

高端内存映射之vmalloc分配内存中不连续的页--Linux内存管理(十九)

1 内存中不连续的页的分配 根据上文的讲述, 我们知道物理上连续的映射对内核是最好的, 但并不总能成功地使用. 在分配一大块内存时, 可能竭尽全力也无法找到连续的内存块. 在用户空间中这不是问题,因为普通进程设计为使用处理器的分页机制, 当然这会降低速度并占用TLB. 在内核中也可以使用同样的技术. 内核分配了其内核虚拟地址空间的一部分, 用于建立连续映射. 在IA-32系统中, 前16M划分给D...

weixin_30488313的博客 173

用Python+OpenCV给斗地主做个‘外挂’:手把手教你写个桌面记牌器(附源码)

本文详细介绍了如何使用Python和OpenCV开发一个智能斗地主记牌器,包括环境搭建、图像采集与预处理、扑克牌识别技术及PyQt5界面设计。通过实战案例,帮助开发者掌握图像处理与界面开发的结合应用,提升游戏辅助工具的编写能力。

weixin_29079643的博客 545

Abaqus SIGTERM/SIGINT中断问题深度解析与实战解决方案

本文深度解析Abaqus仿真计算中因SIGTERM或SIGINT信号导致作业意外终止的常见问题。核心原因常为许可证管理器因网络通信延迟误判进程空闲而强制断开,或系统资源监控工具的误杀。文章提供了从命令行参数调优(如使用int、ask_delete=OFF)、计算环境隔离到编写自动化容错脚本的完整实战解决方案,帮助用户彻底规避此类中断,确保长时间仿真任务的稳定运行。

weixin_29279101的博客 411

内存碎片化 linux,Linux页框分配器之内存碎片化整理

本文转载自微信公众号「人人都是极客」,作者布道师Peter 。转载本文请联系人人都是极客公众号。页框分配器在慢速分配中包括内存碎片化整理和内存回收,代码如下:staticinlinestructpage*__alloc_pages_slowpath(gfp_tgfp_mask,unsignedintorder,structalloc_context*ac){page=__all...

weixin_36487107的博客 253

网络可视媒体的智能计算-胡事民

本文为胡事民教授在山大做报告的笔记,现场见下图: 可视媒体是承载视觉信息的媒体类型,如图像、视频等,它具有网络化、海量和无序涌现等特征。 可视媒体计算的研究意义 可视媒体作为一种信息承载的介质,是用来表达语义信息的。那么就有一种介质与信息之间相互转化的问题。转化方向正反两种,举个栗子说明一下: 1. 可视媒体→→\rightarrow语义信息:比如看到画面,理解其中发生的事件、各主题之...

gdymind的博客 2450

虚拟内存与虚拟地址空间

虚拟地址空间是一种使程序可以直接访问这些内存而不必真正了解这些内存在物理上所处的位置的技术。每个进程都有自己的独立虚拟地址空间,同时操作系统负责将每个进程的虚拟地址映射到主存中的物理内存地址。虚拟地址空间使每个进程都有最大4GB(32位系统)或16EB(64位系统)可用的虚拟内存空间,尽管实际物理内存少于该数量,这样允许处理器利用虚拟内存空间存储更多数据。总的来说,虚拟地址空间是一种重要的内存管理技术,它允许计算机以更高效、可靠和安全的方式管理内存。虚拟地址空间允许各进程共享某些资源并提升系统的效率。

weixin_49503250的博客 4616

2025 高效抓取雪球社区数据:自动化导出Excel与PDF全攻略

本文详细介绍了2025年高效自动化抓取雪球社区数据的完整方案。通过Python脚本,用户可自动抓取帖子列表数据并导出为结构化的Excel表格,同时批量将帖子内容保存为PDF文档,并支持合并与添加书签,极大提升投资研究和信息整理的效率。

weixin_29034963的博客 691

基于 transformer、lstm、LSTM多特征的交通流量预测 完整数据代码 超全项目 本科硕士毕设卓卓有余

基于 transformer、lstm、LSTM多特征的交通流量预测 完整数据代码 超全项目 本科硕士毕设卓卓有余

4655

LInux中的物理内存管理

一、伙伴系统 LInux下用伙伴系统管理物理内存页,伙伴系统得益于其良好的算法,一定程度上可以避免外部碎片为何这么说?先回顾下Linux下虚拟地址空间的分布。 在X86架构下,系统有4GB的虚拟地址空间,其中0-3GB作为用户空间,而3-4GB是系统地址空间。linux系统系统地址空间理论上应该不可换出,即每个虚拟页面均会对应一个物理页帧。如果这样的话,系统地址空间就能使用1GB,如果系统有多余的内存,这里仍然使用不上,这就限制了其性能的发展。为了解决这一问题,就有了高端...

weixin_39094034的博客 551

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Linux 内存机制以及CPU、内存、硬盘的关系、物理内存以及虚拟内存的关系

本文有些篇幅较长,但如果认真读下来,相信你会收获颇丰!! documentlinux内存机制CPU内存虚拟内存硬盘物理内存内存和虚拟内存跟 Windows 完全不同的 Linux 内存机制Swap配置对性能的影响 linux内存机制 Linux支持虚拟内存(Virtual Mmemory),虚拟内存是指使用磁盘当作RAM的扩展,这样可用的内存的大小就相应地增大了。内核会将暂时不用的内存块的内容写...

low5252的博客 6561

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

深入解析Linux页表:从虚拟地址到物理内存的映射艺术

本文深入解析了Linux页表的工作原理及其重要性。页表通过多级映射机制(页目录+二级页表)将虚拟地址转换为物理地址,避免了直接存储每个字节映射关系的内存消耗(32位系统仅需约4MB)。文章详细介绍了struct page结构对物理内存的管理方式、多级页表的优缺点(提升灵活性但增加访问开销),以及通过TLB和缓存优化的访问效率。同时探讨了缺页异常处理机制和写时拷贝技术,解释了虚拟地址的10+10+12位组成原理及其与物理内存的映射关系。最后链接了共享内存设置、文件地址查找等实际应用场景,全面展现了页表在内存管

Kaisir777的博客 1294

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

物理内存管理

  Linux内核管理物理内存是通过分页机制实现的,它将整个内存划分成无数个4k(在i386体系结构中)大小的页,从而分配和回收内存的基本单位便是内存页了。系统在分配内存时不再要求大块的连续内存,但是实际上系统使用内存时还是倾向于分配连续的内存块。为了尽量减少不连续情况,内核采用了“伙伴”关系来管理空闲页面。   Linux的伙伴算法把所有的空闲页面分为10个块组,每组中块的大小是2的...

dawd454848523的博客 122

Linux 物理内存管理

内存管理十分简陋,大家都运行在物理内存上,内核和进程运行在一个空间中,内存分配算法有首次适应算法(FirstFit)、最佳适应算法(BestFit)、最差适应算法(WorstFit)等。显然,这样的内存管理方式问题是很明显的:段内存管理需要硬件的支持和软件的配合。在分段内存中,软件可以把物理内存分成一个一个的段,每个段都有段基址和段限长,还有段类型和段权限。段权限分为有特权(内核权限)和无特权(用户权限):但是分段内存管理还有一个严重的问题没有解决,那就是当时的物理内存非常少。为此当时想的办法是用软件方法来

2303_76614457的博客 248

【Linux】Linux物理内存的管理

Linux物理页框的描述 为了管理和描述物理页框,Linux在文件/include/linux/mm.h中定义了page结构: struct page { page_flags_t flags; /* 页的一些状态标志*/ atomic_t _count; /* 计数器,记录了访问本页框的程序数 */ atomic_t _mapcount; /* mm映射的的...

Yngz_Miao的博客 9140

Linux 内存管理 | 物理内存、内存碎片、伙伴系统、SLAB分配器

文章目录物理内存物理内存分配外部碎片内部碎片伙伴系统(buddy system)slab分配器 物理内存 在Linux中,内核将物理内存划分为三个区域。 在解释DMA内存区域之前解释一下什么是DMA: DMA(直接存储器访问) 使用物理地址访问内存,将数据从一个地址空间复制到另外一个地址空间,从而加快磁盘和内存之间数据的交换,不经过MMU(内存管理单元),这时CPU可以去干别的事,大大增加了效率。 DMA内存区域(ZONE_DMA): 包含 0M~16M 之内的内存页框,该区域的物理页面专门供I/O设备

Jormungand_V的博客 1262

【Linux底层探究】一步一图带你理解虚拟内存与物理内存的映射过程

之前我们学过虚拟内存的布局模型,今天我们来了解一下虚拟内存于物理内存的映射过程。

Stark的博客 1758

内存管理-伙伴系统 SLAB分配器 空闲链表 为什么要分配连续物理内存页

作为原书《现代操作系统》的补充 伙伴系统 与分页/分段算法的关系 我们已经了解了分页算法、虚拟页表、页置换算法。这时候又了解到伙伴系统,那它与分页、分段算法有什么关系呢?是平级关系吗? SLAB分配器 有SLAB、SLUB、SLOB三种分配器,统称SLAB分配器。 linux slub实现 kmem_cache 根据书中描述,SLAB会为每个大小维护一个内存资源池(大小通常为2n2^n2n字节)。每个内存资源池会维护多个slab,而每个slab都由一个/多个连续的物理页组成,从伙伴系统申请而来。维护了cu

duoyasong5907的博客 879

内存管理【Linux操作系统】

操作系统管理(使用)物理内存的基本单位是页框【】 为什么一般是4kb大小? 因为计算机科学家研究出4kb效率最高就像操作系统文件管理时,使用磁盘空间的基本单位也是数据块(一般也是4kb)一样所以磁盘中的数据加载到物理内存,就非常方便了,只需要对应的数据块中的内容,加载到对应页框里面就行了而不是需要多少,就分配多少?操作系统中存在非常多的页框,每个页框的使用情况,属于谁,是否要释放等等信息操作系统都要知道 所以操作系统一定要管理页框为了描述页框,操作系统内定义了: 因为页框的个数很多,所以struct pag

2301_80058734的博客 1484

Linux 内核物理内存管理核心机制与代码分析(附面试常问问题)

> * 内核内存分配失败时,应该怎么看日志、分析原因? > * 内存碎片化如何影响系统稳定性? > * 伙伴算法和回收、碎片整理各自的职责与联系是什么? > * 面试中常被问到的 `__alloc_pages()`、`zone_watermark_ok()`、`rmqueue_buddy()` 都是怎么协作的?

Interview_TC的博客 1397

Linux线程--2.理解分页式存储管理

由于磁盘,物理内存均按4KB设计那么我们就可以将物理内存按0到全F平坦编址,当磁盘文件加载到物理内存中,在page中设置一个类似数组用于保留代码和数据所在的页框起始地址(看作下标),方便寻址,以及使物理内存抽象的看成连续的。因为每⼀个程序的代码、数据⻓度都是不⼀样的,按照这样的映射⽅式,物理内存将会被分割成各种离散的、⼤⼩不同的块。虚拟内存看上去被虚线“分割”成⼀个个单元,其实并不是真的分割,虚拟内存仍然是连续的这个虚线的单元仅仅表⽰它与⻚表中每⼀个表项的映射关系,并最终映射到相同⼤⼩的⼀个物理内存⻚上。

lhxcc_fly的博客 1379

Linux 内存管理

Linux 内存管理 1.虚拟内存管理 总览 Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间。该空间是块大小为4G的线性虚拟空间(表现形式为mm_struct中的vma_area_struct),用户所看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址。利用这种虚拟地址不但能起到保护操作系统的效果(用户不能直接访问物理内存),而且更重要的是,用户程序可使用...

weixin_43886143的博客 166

linux 切割后的日志没有释放内存_虚拟内存、物理内存、内存交换之间的关系

问题虚拟内存地址、物理内存地址、内存分段、内存碎片、内存分页都是什么?Windows系统中的虚拟内存,Linux中swap分区都是干什么用的?程序装载之前提到过指令是一条一条的顺序执行,这就需要可执行程序加载后占用的内存空间应该是连续的。计算机通常会同时运行多个程序,也就是会同时加载多个程序,并不能让程序自己指定的在内存中加载的位置,因为你想要的内存地址有可能被其他加载的程序占用了。为了解决上面的...

weixin_33647940的博客 212
上一篇: arm的 swi简述
下一篇: regmap的使用
liveloading
博客等级 码龄7年 53粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值