嵌入式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

相关文章

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方