嵌入式linux开发 (二十九) 内存管理2.0(1) 内存管理总述

2024-05-27 16:18

本文主要是介绍嵌入式linux开发 (二十九) 内存管理2.0(1) 内存管理总述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

硬件讲了 sram sdram ddr3
驱动讲了 控制器初始化  读写内存内存管理2.0主要讲软件对内存的管理(分块及保护及管理)
关于内存管理2.0,其实也讲了一部分,对内存的分段应该就属于内存2.0// .code .ro-data .data .bss .stack .heap现在要讲 内存保护(MPU MMU) buddy slab 
内存管理流程
  • 加载文件到内存
刚加载到内存,还没运行代码的时候,最多只有.code .ro-data .data // 一般为 bootrom建立的.bss .stack .heap 是代码建立起来的.
  • .bss .stack .heap的建立
一般是开始运行的用户代码建立的对于用户程序是start.S中的_start对于arm-linux是arch/arm/kernel/head.S 中的 stext
  • 更复杂的内存管理
内存管理的主要功能有:内存分配、内存保护、地址映射和内存扩充。
// 涉及到系统,所以接下来要以 rtos 或者linux源码为 参考 讲述内存管理
// 包括系统的 代码开发包括
// 1. 系统开发
// 		用来读写并管理真实物理内存,并提供接口
// 			给系统提供内存管理接口
//			给用户程序提供内存管理接口
// 2. 应用程序开发
// 		由系统加载应用程序到内存,并为应用程序准备好的内存空间.应用程序使用系统提供的api管理系统为应用程序准备好的内存空间.
// 		应用程序最好不要绕过这些api访问内存空间我们怎么看到一个系统,一个操作系统包括1. 操作系统内核 // 操作系统代码2. 应用程序A // 应用程序A代码3. 应用程序B // 应用程序B代码
对内存的管理的日益增长的需求及解决方案
  • 裸机程序
只有 .code .ro-data .data .bss .stack .heap 不能满足吗?
一开始是裸机程序,安排好这些就够了.
  • rtos
需要多道程序并发运行,这就需要内存方面有改善
内存分配:为每道程序分配内存。需要OS支持,并给每个程序的程序内存空间做分块.每一个程序对应一个task_struct结构体,该结构体中一个成员类似 linux内核中的task_struct中的mm成员,指向进程所管理的内存的一个总的抽象的数据结构mm_struct
内存保护:确保每道用户程序都只在自己的内存空间运行,彼此互不干扰。MPU的支持用系统控制处理器(CP15)寄存器来完全定义保护区域基于区域,不是基于页面,控制颗粒度要比VMSA少不支持虚拟到物理地址的映射物理内存地址始终与ARM处理器生成的虚拟地址相同
// 现实是绝大多数rtos都没有用到MPU的功能.
// 只实现了内存管理,调度,IPC,定时器,MUTEX等功能
  • linux

地址映射:将地址空间的逻辑地址转换为内存空间与对应的物理地址。MMU的支持用翻译表来定义保护页面基于页面,不是基于区域,控制颗粒度要比PMSA多(MMU允许对内存系统进行细粒度控制)翻译表存储在内存中,然后常用的部分被加载到TLB(TLB通过缓存转换表遍历的结果来降低内存访问的平均成本。)执行完整翻译表查找的过程称为 translation table walk,它由硬件自动执行,并且在执行时间上有很大的开销,至少有一个主内存访问,通常有两个支持虚拟到物理地址的映射由ARM®处理器生成的地址称为虚拟地址MMU允许将此地址映射到不同的物理地址。此物理地址标识正在访问的主内存位置。内存扩充:用于实现请求调用功能,置换功能等。就是内存不够的时候,将不常用的内存数据A 放到flash的文件B里面,然后释放这些不常用的内存A.可使用内存就会增加. 在使用这些不常用内存A的时候,再加载B到内存.// 如果flash够快的话,这就相等于将flash当内存用.同样,也有拿内存当flash 用的,例如ramfs// 一般文件系统是管理flash的,同样我们也可以将一块内存做成一种文件系统ramfs(基于内存的文件系统),此时读写ramfs 文件里面的数据,其实是在操作内存,缺点是掉电就没了.https://blog.csdn.net/No1_tiger/article/details/75126974https://blog.csdn.net/u012489236/article/details/104172649

这篇关于嵌入式linux开发 (二十九) 内存管理2.0(1) 内存管理总述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1007972

相关文章

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

linux hostname设置全过程

《linuxhostname设置全过程》:本文主要介绍linuxhostname设置全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录查询hostname设置步骤其它相关点hostid/etc/hostsEDChina编程A工具license破解注意事项总结以RHE

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加