程序数据模型由OS还是硬件架构决定?

文章目录

  • 前言
  • 硬件架构的作用
  • OS的作用
  • 编译器的角色
  • OS的数据模型
  • 参考


前言

在文章 1>>32的结果是1还是0 中提到了数据模型 L P 64 LP64 LP64 ,并提出这个数据模型主要是由 U n i x Unix Unix 以及类 U n i x Unix Unix 的操作系统使用居多,例如 L i n u x Linux Linux

L P 64 LP64 LP64 外,在 64 b i t 64bit 64bit 下还有其余的数据模型,如下表所示:
在这里插入图片描述上表中 I L P 32 ILP32 ILP32 数据模型也用于许多具有 32 位处理器的平台。该模型减少了代码大小和包含指针的数据结构的大小,但代价是地址空间更小,适合嵌入式系统。

看过了上述所有数据模型,我们会引出疑问:对于C语言程序,用户书写代码并通过编译器编译为可执行文件执行,那么在这个过程中,由谁来决定数据模型的选择,是OS还是硬件架构,编译器又扮演什么角色?

巧的是,已经有人在 S t a c k O v e r f l o w StackOverflow StackOverflow 上问过这个问题了,原链接在文末。

硬件架构的作用

我们知道,现在应用最为广泛的 64 64 64 位指令集架构是 x 86 _ 64 x86\_64 x86_64,又名 a m d 64 amd64 amd64 x 64 x64 x64 。它是 a m d amd amd 公司在 I n t e l Intel Intel i 386 i386 i386 的基础上于 1999 1999 1999 年提出的指令集,主要优点在于能够在 64 b i t 64bit 64bit 机器上运行 32 b i t 32bit 32bit 指令。所以我们在当前 64 b i t 64bit 64bit 机器上也可以运行 32 b i t 32bit 32bit 可执行程序。

但在此我们以 R I S C V RISCV RISCV 指令集 R V 64 I RV64I RV64I 为例。其提供指令 L D LD LD L W LW LW L H LH LH L B LB LB用于加载数据。其中, L D LD LD加载 64 64 64 位数据到寄存器, L W LW LW用于加载 32 32 32 位数据并符号扩展到 64 64 64 位寄存器, L H LH LH用于加载 16 16 16 位数据并符号扩展到 64 64 64 位寄存器, L B LB LB用于加载 8 b i t 8bit 8bit 数据。
同样的,用于加载数据并零扩展的指令有: L W U LWU LWU L H U LHU LHU L B U LBU LBU
用于存储数据的指令有: S D SD SD S W SW SW S H SH SH S B SB SB

根据上述我们知道一个 R I S C V RISCV RISCV 硬件可能支持多种操作模式,从 8 − 64 b i t 8-64bit 864bit

但只有硬件不够,还需要有OS的支持。我们可以在 64 b i t 64bit 64bit 处理器上运行 32 b i t 32bit 32bit 的OS,同时还可以在 64 b i t 64bit 64bit 的OS上运行 32 b i t 32bit 32bit 的用户程序。

OS的作用

在运行 L i n u x Linux Linux 中的程序时,程序可以遵循 I L P 32 ILP32 ILP32 L P 64 LP64 LP64 模型。当我在 W i n d o w s Windows Windows 系统时,程序可以遵循 I L P 32 ILP32 ILP32 L L P 64 LLP64 LLP64 模型。因此,即使在同一组硬件上,可以有两个操作系统待选择,不同OS在编译时又有两个“平台”可供选择。

L i n u x Linux Linux 为例,用户在编译时的选择中的两个常见的 L i n u x Linux Linux 平台为 x86_64-pc-linux-gnui386-pc-linux-gnu,分别对应 64 64 64 32 32 32 位用户程序。

编译器的角色

编译器主要对用户程序产生影响,我们知道,在 L i n u x 64 Linux64 Linux64 位系统中使用 G C C GCC GCC 编译程序时可以选择编译为 32 32 32 位或选择默认编译为 64 64 64 位可执行程序。那么编译器会根据编译参数,同时结合当前OS,即用户所处环境,强制用户程序所遵循的数据模型。

例如:用户在 l i n u x 64 linux64 linux64 下取用默认选项,那么其可执行程序为 64 b i t 64bit 64bit 程序且数据模型为 L P 64 LP64 LP64。同样的,在 w i n d o w 64 window64 window64 下我们使用 V i s u a l   S t u d i o Visual \ Studio Visual Studio 指定编译选项为 x 64 x64 x64 时,其数据模型为 L L P 64 LLP64 LLP64。用户指定编译结果为 32 b i t 32bit 32bit 的话则统一编译为数据模型为 I L P 32 ILP32 ILP32 的可执行程序。

OS的数据模型

OS作为一种系统软件其必须遵循一种数据模型。OS的数据模型一定程度上受到硬件架构的影响,其选择的数据模型在所处硬件上必须支持,同时OS可以在范围内有自己的选择,这也导致了 L i n u x Linux Linux W i n d o w s Windows Windows 数据模型的不同。

例如:32位处理器OS可以选择 I L P 32 ILP32 ILP32 L P 32 LP32 LP32 数据模型,但是在 L P 32 LP32 LP32 数据模型中, i n t int int 大小为 16 b i t 16bit 16bit,那么在 i 386 i386 i386 的处理器则不支持,由于在 32 b i t 32bit 32bit 模式下 16 b i t 16bit 16bit 数据的操作码比 32 b i t 32bit 32bit 更长更慢。

例如: L i n u x 64 Linux64 Linux64 遵循 L P 64 LP64 LP64 W i n d o w s 64 Windows64 Windows64 遵循 L L P 64 LLP64 LLP64 数据模型。

参考

原StackOverflow问答地址。希望对大家有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/505746.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

macOS Catalina for mac (macos 10.15系统)v10.15.7正式版

macOS Catalina是苹果公司专为麦金塔电脑推出的桌面操作系统,是macOS的第16个主要版本。它继承了苹果一贯的优雅与高效,不仅引入了分割视图和侧边栏,还带来了全新的音乐和播客应用,极大地提升了用户体验。在隐私保护和安全性方面&…

java学习总结以及考试总结

1.对象的this引用 this引用用于区分成员变量和局部变量,this引用的一定的指的是成员变量 所以说this语句的作用就是区分成员变量和局部变量(如何呢) package com.temo.test1;public class student{private String name;//成员变量private …

Optimizer神经网络中各种优化器介绍

1. SGD 1.1 batch-GD 每次更新使用全部的样本,注意会对所有的样本取均值,这样每次更新的速度慢。计算量大。 1.2 SGD 每次随机取一个样本。这样更新速度更快。SGD算法在于每次只去拟合一个训练样本,这使得在梯度下降过程中不需去用所有训…

OpenEuler华为欧拉系统安装教程及联网配置

OpenEuler简介 openEuler是一款开源操作系统。当前openEuler内核源于Linux,支持鲲鹏及其它多种处理器,能够充分释放计算芯片的潜能,是由全球开源贡献者构建的高效、稳定、安全的开源操作系统,适用于数据库、大数据、云计算、人工智…

【Laravel】07 快速套用一个网站模板

【Laravel】07 快速套用一个网站模板 1. 新增post表2.补充 :生成Model、Controller、迁移文件3. 使用php artisan tinker4. 网站模板下载 课程地址 1. 新增post表 在Model中创建Post (base) ➜ example-app php artisan make:model Post Model created successfu…

力扣 1035. 不相交的线

题目来源:https://leetcode.cn/problems/uncrossed-lines/description/ C题解:经过细细一推导,就发现跟力扣 1143. 最长公共子序列-CSDN博客 换汤不换药。 直线不能相交,说明元素顺序不能改变,求可以绘制的最大连线数…

相机显示储存卡未格式化怎么回事?怎么办

在摄影的学习和实践中,相机是我们记录美好瞬间的得力助手。然而,当相机突然提示储存卡未格式化时,这往往会让我们感到困惑和焦虑。本文将探讨相机显示储存卡未格式化的可能原因,并提供相应的解决方案。 图片来源于网络&#xff0c…

游戏引擎中的大气和云的渲染

一、大气 首先和光线追踪类似,大气渲染也有类似的渲染公式,在实际处理中也有类似 Blinn-Phong的拟合模型。关键参数是当前点到天顶的角度和到太阳的角度 二、大气散射理论 光和介质的接触: Absorption 吸收Out-scattering 散射Emission …

汇编语言第四版-王爽第1章 基础知识

前言 基础知识 (1)换成bit,1KB1024B,1Byte8bit;1KB1024*8bit,即2的13次方,宽度为13. (2)1个存储单元只能放1个字节,1KB1024B;编号从0到1023. &a…

web前端面试题----->VUE

Vue的数据双向绑定是通过Vue的响应式系统实现的。具体原理: 1. Vue会在初始化时对数据对象进行遍历,使用Object.defineProperty方法将每个属性转化为getter、setter。这样在访问或修改数据时,Vue能够监听到数据的变化。 2. 当数据发生变化时…

书生 浦语大模型全链路开源体系

通用大模型成为发展通用人工智能的重要途径 书生 浦语大模型的开源历程 书生 浦语 2.0体系,面向不同的使用需求,每个规格包含三个模型版本,(7B、20B)InternLM2-Base、InternLM2、InternLM2-Chat。 大模型是回归语言建…

python通过shapely 的 valid 判断aoi图形是否有效

测试aoi坐标: 116.527712,39.924304;116.527123,39.924353;116.52707,39.923985;116.527685,39.92397;116.527712,39.924304 如图所示是一个有效的坐标,使用python代码判断是否有效: 代码: from shapely.geometry import Polyg…

数字孪生|山海鲸可视化快速入门

哈喽,你好啊,我是雷工! 今天继续学习山海鲸可视化软件,以下为学习记录。 (一)新建项目 1.1、打开软件后,默认打开我的项目界面,初次打开需要注册,可以通过手机号快速注册。 点击“新建”按钮,新建一个项目。 1.2、根据项目需要选择一个快捷的项目模板,填写项目名称…

C语言 | Leetcode C语言题解之第1题两数之和

题目&#xff1a; 题解&#xff1a; int* twoSum(int* nums, int numsSize, int target, int* returnSize) {for (int i 0; i < numsSize; i) {for (int j i 1; j < numsSize; j) {if (nums[i] nums[j] target) {int* ret malloc(sizeof(int) * 2);ret[0] i, ret…

【Qt 学习笔记】Day1 | Qt 背景介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Day1 | Qt 背景介绍 文章编号&#xff1a;Qt 学习笔记 / 01 文章目录…

C语言程序与设计——复杂结构

结构体 结构体在C语言中是一种重要的数据类型&#xff0c;或者说是一种用户自定义的相同或不同数据类型的集合。可以帮助我们封装一组相关数据&#xff0c;使其数据呈现更直观。例如我们想要统计一个学校学生的基本信息。可以将一个同学的信息按照如下存储。 typedef struct …

结构化绑定optional(C++基础)

结构化绑定 处理多个返回值的操作&#xff1a;C17提出 之前多返回值喜欢用struct来返回。现在会做成元组&#xff0c;下图中设置C17的版本&#xff0c;不要设置错为C语言标准。 #include<iostream> #include<string> #include<tuple> std::pair<std::st…

【跟着CHATGPT学习硬件外设 | 02】GPIO

文章目录 &#x1f680; 概念揭秘快速入门关键精华 &#x1f31f; 秒懂案例生活类比实战演练步骤1&#xff1a;硬件配置步骤2&#xff1a;软件配置步骤3&#xff1a;发送和接收数据步骤4&#xff1a;处理异常步骤5&#xff1a;优化操作手册硬件设计注意事项配置攻略准备阶段配置…

Docker配置Mysql

1.首页搜索mysql镜像 2.选择对应版本的MySQL&#xff0c;点击pull 3.pull完成以后&#xff0c;点击images&#xff0c;这里可以看到刚刚pull完成的mysql版本 4.打开命令界面&#xff0c;运行命令 docker images ,查看当前已经pull的images 5.运行命令设置mysql docker run -it…

OSCP靶场--Kyoto

OSCP靶场–Kyoto 考点(缓冲区溢出GPO滥用提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.216.31 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-31 08:08 EDT Nmap scan report for 192.168.216.31 Host …