《嵌入式Linux与物联网软件开发——C语言内核深度解析》一1.4 内存编址和寻址、内存对齐

简介: 本节书摘来自华章出版社《嵌入式Linux与物联网软件开发——C语言内核深度解析》一书中的第1章,第1.4节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.4 内存编址和寻址、内存对齐 1.4.1 内存编址方法 上面我们讲了内存的单位,以及内存的逻辑模型,这节我们会更加详细地介绍这个逻辑模型。

本节书摘来自异步社区《嵌入式Linux与物联网软件开发——C语言内核深度解析》一书中的第1章,第1.4节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.4 内存编址和寻址、内存对齐

1.4.1 内存编址方法

上面我们讲了内存的单位,以及内存的逻辑模型,这节我们会更加详细地介绍这个逻辑模型。内存在逻辑上就是一个一个的格子,这些格子可以用来装东西(里面装的东西就是数据),每个格子有一个编号,这个编号就是内存地址,这个内存地址(一个数字)和这个格子的空间(实质是一个内存空间)是一一对应且永久绑定的。这就是内存的编址方法。

在程序运行时,计算机中CPU实际只认识内存地址,而不关心这个地址所代表的空间怎么分布(硬件设计保证了只要按照这个地址就一定能找到这个格子,这就涉及了内存单元的两个重要概念—地址和空间。那么问题也就来了,我们究竟以多大空间来划分一个格子,并绑定一个地址呢?)。

1.4.2 关键:内存编址是以字节为单位

前面一直提到内存地址,那么我们究竟以多大的内存空间来划分绑定一个地址?答案是:我们以一个字节为基本单元对整个内存进行划分,并且一一绑定地址。常说的一个个内存空间指的就是内存单元。由此可见一个内存单元就是一个字节。如果把内存比喻为一栋大楼,那么这个楼里面的一个一个房间就是一个一个内存单元,每个房间的编号就好比内存单元地址。32根地址线可以找到多大的内存空间?每根线有两种状态,要么是0,要么是1,所以32根有2的32次幂种状态,每种状态对应一个地址,就有2的32次幂个地址。而内存以字节编址,一个地址对应一个字节,那就有2的32次幂个字节(B),我们把它换算成G,也就是4GB内存,大于4GB内存,对于CPU来说将无法寻址。这就好比你只有一个木桶,哪怕你身边有再多大江大河,但你还是只能装一桶水……

      232÷(1024×1024×1024)=232÷230=22=4(G)
      注意:1024=210

计算内存大小时,2的10次幂是1024,不是数学上的1000。所以1GB=1024MB,1MB=1024KB,1KB=1024B,因此232=4GB

在讲内存位宽的时候我们就提到了内存编址,无论是多少位的内存,都是以字节为单位进行内存编址的。下面是64位位宽内存的编址,表示在一定时间(时间指的是一个时钟周期,不需要了解)内所能传送数据的位数是64位,也就是8个内存单元,所以我们把8个单元画成一排。


382182fc2cbd34e2f1285be8ff20437a437023ae

64 位内存模型

1.4.3 内存和数据类型的关系

现在搞清楚了内存单元的划分,我们有必要讨论一下C语言中的基本数据类型:char、short、int、long、float、double。在C语言中,数据类型的本质表示一个内存格子的长度和解析方法。也就是在定义变量时,到底需要给这个变量分配多大空间,按照什么样的方式去解析该空间。用int和char类型定义一个变量时,其分配的空间大小自然是不同的。

当然,在32位系统中定义变量最好用int,这样效率高,因为32位系统中很多硬件本身都是32位的,配合定义的int型变量在内存中恰好分配4个字节,使得软件和硬件对于数据的处理非常契合,这样的工作效率自然就高。32位的硬件配置天生就适合定义32位的int型变量。千万不要单纯地认为定义char型变量由于分配了更少的内存空间,所以效率就更高,因此我们一直强调写程序时要尽量配合硬件特点。

在很多32位系统环境下,当定义bool类型变量时,我们基本都是用int来替代。虽然bool型只需要一个位,但是我们定义一个整型替代时,看似浪费了31个bit,但是好处是效率会高很多。对于现代计算机来说,内存还是很充足的,浪费31个bit并不是一个很大的问题。特别提示一点,int(整型)这个“整”字体现在它和CPU本身的数据位宽是一样的,如32位的CPU,整型就是32位,int就是32位。

问题:实际编程时,节省内存和提高效率到底谁重要?

回答:很多年前内存很贵,因此内存都很少,那时候写代码以省内存为主。现在随着半导体技术的发展,内存变得很便宜了,现在的机器都是高配,不在乎省一点内存,而效率和用户体验变成了关键。所以现在写程序大部分都是以效率为重。

1.4.4 内存对齐

什么是内存对齐,首先这是一个硬件问题。因为是逻辑模型,前面我们为了便于大家理解,在画内存逻辑图的时候并没有体现内存单元的对齐。但此时我们为了分析内存对齐,就需要画出内存的这个特性。内存对齐其实也很好理解。


eea8ab99fd4b6ea05af7982a3d6894d1dd3455ec

32位内存模型,单元格中的数是单元格编号。

假设我们现在要在C语言中用int a;定义一个int类型变量,在内存中就必须分配4个字节来存储这个a的数据。下面有两种不同的内存分配思路和策略。

第一种:0 1 2 3              对齐访问

第二种:1 2 3 4 或者2 3 4 5或者3 4 5 6  非对齐访问

内存的对齐访问不是逻辑的问题,而是硬件的问题。从硬件角度来说,对于32位的内存,0 1 2 3这四个单元本身逻辑上就有相关性,四个组合起来当作一个int,在硬件上就是合适的,效率就高。对齐访问更符合硬件规律,所以效率更高;非对齐访问因为和硬件本身不搭配,所以效率不高。因为兼容性的问题,通常硬件也都提供非对齐访问,但是效率要低很多。一般来说,除了直接使用汇编外,使用高级语言编写程序的时候,内存空间分配都会自动对齐。

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
16天前
|
安全 Linux 编译器
探索Linux内核的奥秘:从零构建操作系统####
本文旨在通过深入浅出的方式,带领读者踏上一段从零开始构建简化版Linux操作系统的旅程。我们将避开复杂的技术细节,以通俗易懂的语言,逐步揭开Linux内核的神秘面纱,探讨其工作原理、核心组件及如何通过实践加深理解。这既是一次对操作系统原理的深刻洞察,也是一场激发创新思维与实践能力的冒险。 ####
|
1天前
|
Linux 数据库
Linux内核中的锁机制:保障并发操作的数据一致性####
【10月更文挑战第29天】 在多线程编程中,确保数据一致性和防止竞争条件是至关重要的。本文将深入探讨Linux操作系统中实现的几种关键锁机制,包括自旋锁、互斥锁和读写锁等。通过分析这些锁的设计原理和使用场景,帮助读者理解如何在实际应用中选择合适的锁机制以优化系统性能和稳定性。 ####
14 6
|
1天前
|
机器学习/深度学习 负载均衡 算法
深入探索Linux内核调度机制的优化策略###
本文旨在为读者揭开Linux操作系统中至关重要的一环——CPU调度机制的神秘面纱。通过深入浅出地解析其工作原理,并探讨一系列创新优化策略,本文不仅增强了技术爱好者的理论知识,更为系统管理员和软件开发者提供了实用的性能调优指南,旨在促进系统的高效运行与资源利用最大化。 ###
|
3天前
|
算法 Linux 开发者
深入探究Linux内核中的内存管理机制
本文旨在对Linux操作系统的内存管理机制进行深入分析,探讨其如何通过高效的内存分配和回收策略来优化系统性能。文章将详细介绍Linux内核中内存管理的关键技术点,包括物理内存与虚拟内存的映射、页面置换算法、以及内存碎片的处理方法等。通过对这些技术点的解析,本文旨在为读者提供一个清晰的Linux内存管理框架,帮助理解其在现代计算环境中的重要性和应用。
|
2天前
|
缓存 网络协议 Linux
Linux操作系统内核
Linux操作系统内核 1、进程管理: 进程调度 进程创建与销毁 进程间通信 2、内存管理: 内存分配与回收 虚拟内存管理 缓存管理 3、驱动管理: 设备驱动程序接口 硬件抽象层 中断处理 4、文件和网络管理: 文件系统管理 网络协议栈 网络安全及防火墙管理
19 4
|
3天前
|
人工智能 算法 大数据
Linux内核中的调度算法演变:从O(1)到CFS的优化之旅###
本文深入探讨了Linux操作系统内核中进程调度算法的发展历程,聚焦于O(1)调度器向完全公平调度器(CFS)的转变。不同于传统摘要对研究背景、方法、结果和结论的概述,本文创新性地采用“技术演进时间线”的形式,简明扼要地勾勒出这一转变背后的关键技术里程碑,旨在为读者提供一个清晰的历史脉络,引领其深入了解Linux调度机制的革新之路。 ###
|
5天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
30 4
|
6天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
9天前
|
缓存 Linux
揭秘Linux内核:探索CPU拓扑结构
【10月更文挑战第26天】
25 1
|
9天前
|
缓存 运维 Linux
深入探索Linux内核:CPU拓扑结构探测
【10月更文挑战第18天】在现代计算机系统中,CPU的拓扑结构对性能优化和资源管理至关重要。了解CPU的核心、线程、NUMA节点等信息,可以帮助开发者和系统管理员更好地调优应用程序和系统配置。本文将深入探讨如何在Linux内核中探测CPU拓扑结构,介绍相关工具和方法。
11 0

热门文章

最新文章

相关产品

  • 物联网平台