《嵌入式Linux与物联网软件开发——C语言内核深度解析》一1.3 位、字节、半字、字的概念和内存位宽

简介: 本节书摘来自华章出版社《嵌入式Linux与物联网软件开发——C语言内核深度解析》一书中的第1章,第1.3节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.3 位、字节、半字、字的概念和内存位宽 1.3.1 深入了解内存(硬件和逻辑两个角度) 在前面我们就已经介绍了什么是内存,这里我们继续深入理解内存。

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

1.3 位、字节、半字、字的概念和内存位宽

1.3.1 深入了解内存(硬件和逻辑两个角度)

在前面我们就已经介绍了什么是内存,这里我们继续深入理解内存。

从硬件角度,内存实际上是电脑的一个配件(一般叫内存条)。根据不同的硬件实现原理,还可以把内存分成SRAM和DRAM(DRAM又有好多代,如最早的SDRAM,后来的DDR1、DDR2、LPDDR……)。

从逻辑角度:内存可以随机访问(随机访问的意思是只要给一个地址,就可以访问这个内存地址),并且可以读写(当然了,逻辑上也可以限制其为只读或者只写)。内存在编程中的本质是用来存放变量内容的(就是因为有了内存,所以C语言才能定义变量,C语言中的一个变量实际就对应内存中的内存空间)。

1.3.2 内存的逻辑抽象图(内存的编程模型)

对于编程者来说,不需要深入了解内存的电子结构,但是内存的逻辑结构是必须知道的。从逻辑角度来讲,内存实际上是由无限多个内存单元格组成的,每个单元格有一个固定的地址,叫内存地址,这个内存地址和这个内存单元格唯一对应且永久绑定。

为了大家更好地理解,我们以大楼来类比内存。逻辑上的内存就好像是一栋大楼,内存的单元格好比大楼中的一个个小房间,每个内存单元格的地址就好象每个小房间的房间号。内存中存储的内容就好像住在房间中的人。如果我们想要找到一个人和他说点什么,那么我们就必须知道他的房间号 。同理,我们对内存中某个空间操作,前提是我们需要知道它的内存地址。C语言虽然不像汇编、可以写出直接操作内存的指令,但本质的东西是不会变的,内存的硬件构造是不会变的。你不告诉CPU内存地址,CPU就无法控制指令将数据读写到正确的内存空间。所以C语言也不例外,虽然C语言并不会直接操作内存地址,但变量的引入其实就是对内存的操作。在下面左图中,我们给出了一个内存条的逻辑模型,内存地址的排列是从零开始。右图的目的是为了让大家明白,除了内存条还有其他硬件设备也有内存,像显卡内存、网卡内存,但在CPU看来它们和内存条并无二异,只要有地址就可以控制数据的读写。


02eed12275cc92445a5a1b5fb1933f2685d21f4c

8位内存模型


a85288f9199030d56cf8181770d0c686594be09d

其他具有内存的硬件

逻辑上来说,内存可以有无限大,因为数学上编号是没有尽头的。但是现实中实际的内存大小是有限制的,如32位的系统(32位系统指的是32位数据线,但是一般地址线也是32位,这个地址线32位决定了内存地址只能有32位二进制,所以逻辑上的大小为2的32次幂),内存限制就为4G。实际上32位的系统中可用的内存是小于等于4G的(如32位CPU装32位Windows,但电脑实际可能只配置了512MB内存条)。这里涉及三总线的概念。所谓三总线就是指地址总线、数据总线和控制总线。如我们现在要向内存中写入一个数据,这个过程就是,控制总线上面传输写指令,地址总线上面传输内存地址,而数据总线传输要写入内存的数据。由此可知总线的重要性。我们常常讲多少位CPU,指的就是数据总线位数。数据线越多,一次传输处理的数据就越多,性能也就越好,这也是为什么32位的CPU就比16位的性能强。

地址线的数量决定了它可以寻址内存空间的大小。我们举个简单例子,例如我们有两根地址线,每根地址线上面可以传输0或者1,那两根线就有4种不同的状态,分别是00、01、10、11。由这4种不同的状态就可以确定4个地址。如果有32根地址线可以确定多少种不同状态?2的32次方,也就意味着最高可访问的内存大小为2的32次幂(4G)。


cf3bfd6454073ded13dd40d3029b3d452e5098e3

内存的逻辑结构

1.3.3 位和字节

上面讲了内存不可能无限大,那么为了衡量内存大小以及更好地使用内存,我们就需要引入内存单位。内存单位有很多,我们平时经常提到的以G为单位的内存,其实对于编程来说,这个单位反而不常用。我们编程往往是操控内存单元。下面首先给出一个单位换算表达式。

1GB=1024MB 1MB=1024KB 1KB=1024B 1B=8bit

这里的KB是千字节的意思。注意,计算机里面的千是1024,而不是1000。B是字节(Byte),bit是位(bit),也叫二进制位,可见它是表示二进制的一位(0或者1),我们的代码和数据编译后对应的就是二进制的0和1。除了我们了解的位(1bit)、字节(8bit),还有半字(一般是16bit)、字(一般是32bit)。这里我们特别注意,在所有的计算机中,不管是32位系统、16位系统,还是以后的64位系统,位永远都是1bit,字节永远都是8bit。

1.3.4 字和半字

历史上曾经出现过16位系统、32位系统、64位系统等,而且操作系统还有Windows、Linux、iOS等,所以很多的概念在历史上的定义都很乱。建议大家对字、半字、双字这些概念不要详细区分,只要知道这些单位具体是多少字节,都是依赖于平台的。实际工作中,我们了解了这些平台后,才具体到该平台的“字”是多少位,当然“半字”永远是字的一半,双字永远是字的两倍大小)。编程时一般用不到“字”这个概念,我们区分这个概念主要是因为有些文档中会用到这些概念,如果不加区别可能会造成对程序的误解。

1.3.5 内存位宽(硬件和逻辑两个角度)

内存位宽(内存数据线的数量)是指在一定时间(时间指的是一个时钟周期,不需要了解)内所能传送数据的位数,位数越大,则所能传输的数据量就越大。左图就是一个8位的内存逻辑图,右图是32位的内存逻辑图。8位内存模型表示一次可以传送数据的位数为8位,32位内存模型表示一次可以传送数据的位数为32位,所以我们把32位(4个格子)画为一排,学了下面的内存编址你就会更加明白了。


9f8ac595efac1d285eb76efa278373f587e063d1

从硬件角度讲:硬件内存的实现本身是有宽度的,也就是说有些内存条就是8位的,而有些就是16位的。那么需要强调的是,内存芯片之间是可以并联的,通过并联,即使8位的内存芯片也可以做出来16位或32位的硬件内存。

从逻辑角度讲:内存位宽在逻辑上是任意的,甚至逻辑上存在内存位宽是24位的内存(但是实际上这种硬件是买不到的,也没有实际意义)。不管内存位宽是多少,对操作不构成影响。但是因为操作不是纯逻辑而是需要硬件去执行的,所以不能为所欲为,我们实际上很多操作都是受限于硬件的特性。如24位的内存逻辑上和32位的内存没有任何区别,但实际硬件都是32位的,都要按照32位硬件的特性和限制来编程。

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
1月前
|
缓存 Linux
linux 手动释放内存
在 Linux 系统中,内存管理通常自动处理,但业务繁忙时缓存占用过多可能导致内存不足,影响性能。此时可在业务闲时手动释放内存。
112 17
|
11天前
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
81 48
|
20天前
|
XML Java 开发者
Spring底层架构核心概念解析
理解 Spring 框架的核心概念对于开发和维护 Spring 应用程序至关重要。IOC 和 AOP 是其两个关键特性,通过依赖注入和面向切面编程实现了高效的模块化和松耦合设计。Spring 容器管理着 Beans 的生命周期和配置,而核心模块为各种应用场景提供了丰富的功能支持。通过全面掌握这些核心概念,开发者可以更加高效地利用 Spring 框架开发企业级应用。
69 18
|
1月前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
120 20
|
2月前
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
74 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
2月前
|
算法 Linux
深入探索Linux内核的内存管理机制
本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。
|
2月前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
103 6
|
2月前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
82 4
|
3月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
88 6
|
3月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
270 13

相关产品

  • 物联网平台