《嵌入式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
相关文章
|
4月前
|
存储 C语言 C++
【c语言】运算符汇总(万字解析)
今天博主跟大家分享了c语言中各种操作符的功能、使用方法以及优先级和结合性,并且与大家深入探讨了表达式求值的两个重要规则--算数转换和整形提升。学习这些知识对我们的C语言和C++学习都有着极大的帮助。
234 2
|
25天前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
1天前
|
存储 Linux 调度
【Linux】进程概念和进程状态
本文详细介绍了Linux系统中进程的核心概念与管理机制。从进程的定义出发,阐述了其作为操作系统资源管理的基本单位的重要性,并深入解析了task_struct结构体的内容及其在进程管理中的作用。同时,文章讲解了进程的基本操作(如获取PID、查看进程信息等)、父进程与子进程的关系(重点分析fork函数)、以及进程的三种主要状态(运行、阻塞、挂起)。此外,还探讨了Linux特有的进程状态表示和孤儿进程的处理方式。通过学习这些内容,读者可以更好地理解Linux进程的运行原理并优化系统性能。
16 4
|
2月前
|
网络协议 Unix Linux
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
70 11
|
2月前
|
存储 运维 安全
深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功能和优势。
124 6
|
3月前
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
88 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
3月前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
248 14
|
4月前
|
缓存 并行计算 Linux
深入解析Linux操作系统的内核优化策略
本文旨在探讨Linux操作系统内核的优化策略,包括内核参数调整、内存管理、CPU调度以及文件系统性能提升等方面。通过对这些关键领域的分析,我们可以理解如何有效地提高Linux系统的性能和稳定性,从而为用户提供更加流畅和高效的计算体验。
132 17
|
3月前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
102 8
|
3月前
|
算法 Linux
深入探索Linux内核的内存管理机制
本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。

相关产品

  • 物联网平台