0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux中的32位与64位

Linux爱好者 来源:Linux爱好者 作者:Linux爱好者 2020-12-11 16:00 次阅读

在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位"与"64位"的说法,类似的还有"x86"与"x86_64","i386"与"amd64",这两组概念之间有着怎样的联系和区别呢?

实际上这两组概念涉及了三个层次:硬件,系统和软件。

1、硬件

早期的intel处理器,如i386,486,586,奔腾系列的CPU架构,都是32位的(32位的寄存器,32位的虚拟地址空间),统称为x86架构。

随着威廉希尔官方网站 的发展,32位CPU已经无法满足需求,intel与AMD采用不同的方法开发64位架构的CPU,intel使用与x86完全不同的IA64架构,由于与原来的X86完全不兼容,因此在PC领域没有得到应用,只在服务器领域有一些使用。

而AMD开发的架构称为amd64(将寄存器扩充为64位,支持64位虚拟地址),能够完全兼容x86指令集,不用任何修改就能运行老的操作系统和应用软件,在PC界得到广泛的应用,现在市场上几乎所有的PC用途的CPU都是支持amd64指令集的了。

当然intel也很快开发出支持该指令集的CPU,不过intel将其称为x64架构,而不是用amd64这个名字。而在linux中则称为x86_64,即x86架构的64位扩展。

有关x86_64的详细描述可翻阅《深入理解计算机系统》一书。

在linux中查看CPU是否64位的方法:如果/proc/cpuinfo内的flags字段中含有"lm",则表示使用的是64位CPU(运行“grep 'lm' /proc/cpuinfo”命令,输出不为空)。

2、系统

系统同样可分为32位与64位。在x86_64架构的CPU出现之前,PC的操作系统都是用32位,例如windows 2000,xp,当时的unix,linux等。

在x86_64架构出现后,系统也就有了两个版本:32位和64位,两者的主要区别在于与硬件体系结构相关的操作中。

由于x86_64架构完全兼容x86架构,因此,32位的系统完全可以在x86_64位上运行,只不过它只使用了x86部分,没有完全发挥硬件的功能而已。

而64位系统专门针对64位的扩展功能而开发的,就是为了最大限度地发挥硬件的能力,它无法在x86架构的cpu上运行。

另外,不论是windows还是linux,驱动程序都需要加载到内核空间中,因此它的类型(32位或64位)需要跟系统完全相同。

系统与CPU的关系如下图所示:

68279c0a-348a-11eb-a64d-12bb97331649.jpg

查看linux系统是32位还是64位的方法:执行shell命令“arch”,显示为x86_64表示当前系统为64位,显示为i386,i486等表示系统是32位的。

3、软件

在系统上运行的应用软件同样有32位和64位之分,老的应用软件运行在32位CPU及32位系统中,属于32位软件。

出现了64位系统之后,也出现了专门运行在64位系统,能够最大限度使用64位系统的扩展功能的原生64位程序。

对于C程序来说,64位程序相比32位程序最大的区别就是int,long以及指针数据类型的长度都是64位的,可以使用64位的虚拟地址空间。

实际远不止这些,编绎器在将64位C程序翻译成汇编语言或者机器语言时,会尽量使用64位处理器的寄存器,尽量避免访问内存,例如把函数的参数,及局部变量优先放在寄存器,而不是在用户栈中。

另外在64位系统中,为了兼容数量众多的老的应用程序,系统都会增加一个虚拟层,用来翻译x86指令,这样32位程序也可以在64位系统中运行(windows和linux都支持)。

同样在64位系统中,使用64位编绎器一般也可以选择编译成32位程序(gcc使用-m32编译成32位可执行文件)。

另外在PC上,软件能否运行,只需看系统是否支持即可,可以不用理会CPU的架构。软件与系统的关系如下图所示:

68490b10-348a-11eb-a64d-12bb97331649.jpg

linux中查看可执行文件是32位还是64位的方法:执行shell命令“file /usr/bin/xxx", 如果是32位程序,显示为"ELF 32-bit ...";如果是64位,则显示为:"ELF 64-bit..."。

4、linux发行版与内核

在linux发行版中,一般会针对不同的架构发布不同的安装光盘,以debian为例,可用于PC的就有i386和amd64这两个版本。

根据上面的描述,这两个版本的系统都可以安装在使用64位的CPU的机器上,而使用32位CPU的机器上则只能安装i386版本的系统。

在debian amd64光盘中带的内核及软件包全都是64位版本的,而debian i386光盘中则有32位和64位的内核,以及32位的软件,可能是考虑到有些用户想用64位内核来运行32位程序吧。

内核源代码是没有32位,64位之分的,在编译内核时可以用ARCH参数手工指定编译成哪一个架构。例如:"make ARCH=i386 menuconfig","make ARCH=i386"用于配置,编译32位内核;

而"make ARCH=x86_64 menuconfig","make ARCH=x86_64"则用于配置,编译64位内核。

但是,在debian amd64光盘安装的系统里编译的32位内核是无法引导的,因为系统安装的所有软件包都是原生64位程序,无法在32位内核上运行,典型的错误是提示引导时找不到能运行的init程序;

而使用debian i386光盘安装的系统中编译的64位内核却可以使用,只是需要在配置内核时加上IA32 Emulation支持(menuconfig的:"Executable file formats/Emulations"-->"IA32 Emulation")。

基于这样的原因,我原来用搭建的debian amd64光盘安装的系统(http://www.cnblogs.com/xiongyuanxiong/p/3523306.html),现在也改成用debian i386光盘来安装了,这样就能同时编译新的32位和64位官方内核进行对比测试。

责任编辑:lq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19273

    浏览量

    229724
  • 寄存器
    +关注

    关注

    31

    文章

    5342

    浏览量

    120277
  • Linux
    +关注

    关注

    87

    文章

    11298

    浏览量

    209391

原文标题:Linux 中的32位与64位

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    TMS320C645x DSP 64定时器用户指南

    电子发烧友网站提供《TMS320C645x DSP 64定时器用户指南.pdf》资料免费下载
    发表于 12-16 10:14 0次下载
    TMS320C645x DSP <b class='flag-5'>64</b><b class='flag-5'>位</b>定时器用户指南

    ADS1212的21有效数字取DOR24的高21还是低21呢?

    如datasheet所述,ADS1212的数据输出寄存器有3字节24,但是普遍精度达不到要求,最多只有21,那么这21有效数字取DOR24
    发表于 11-28 07:47

    gd32vf103 timer内部计数器是自增的,64,溢出后是从0开始吗?

    timer内部计数器是自增的,64,溢出后是从0开始吗?有知道的小伙伴吗?官方参考手册也没有说明。
    发表于 09-27 07:09

    gd32vf103 timer内部计数器是自增的,64,溢出后是从0开始吗?

    timer内部计数器是自增的,64,溢出后是从0开始吗?有知道的小伙伴吗?官方参考手册也没有说明。
    发表于 09-27 06:28

    RV6464地址指令

    (word),双字(doubleword)和长整数(long)版本的指令,并将所有寄存器(包括 PC)扩展为 64 。因此,RV64I 的 sub 操作的是两个
    发表于 09-04 15:15

    MPU进入64时代,Microchip推出PIC64系列产品

    ,MCU和MPU之间的界限也越来越小,以适应更多新的应用。Microchip作为嵌入式解决方案的领导者,近日推出了全新的PIC64GX MPU,这也是Microchip推出的首款64MPU产品
    的头像 发表于 07-24 00:12 3592次阅读

    Traveo T2G SRAM不是32的吗?如何得到一个64的?

    ]ECC_P7_SW) 奇偶校验[6:0]为 32 比特 ACTUALWORD[127:0] 提供 7 比特奇偶校验。 请问,SRAM不是32的吗?如何得到一个64的ACTUALWORD[63:0]?比如
    发表于 06-03 08:49

    请问STM8能处理64的数据吗?

    IAR for stm8 64数据变量赋值时出现integer constant is too large的错误。 问下STM8能处理64
    发表于 05-14 08:13

    ICMAN多点液检测

    检测
    ICman
    发布于 :2024年04月02日 09:31:20

    stm32F4 64变量操作异常怎么解决?

    stm32F4 64变量使用报错解决
    发表于 04-02 07:16

    CodeWeavers发布CrossOver 24版,初试32应用运行功能

    由于苹果已在macOS Catalina系统删除了对32软件的支持,因此在未来的操作系统版本,旧版软件可能将不再能够运行。但借助Wine 9.0带来的超过7000项改进,CrossOver可以实现在
    的头像 发表于 02-23 11:18 1034次阅读

    入门级64ARM®CORTEX®-A55 MPU数据手册

    电子发烧友网站提供《入门级64ARM®CORTEX®-A55 MPU数据手册.pdf》资料免费下载
    发表于 02-19 10:59 1次下载
    入门级<b class='flag-5'>64</b><b class='flag-5'>位</b>ARM®CORTEX®-A55 MPU数据手册

    STM32开发运算以及带操作

    STM32开发运算以及带操作  运算是计算机中常用的一种操作方式,特别适用于对数据的单个或多个位进行操作。在STM32开发
    的头像 发表于 02-02 14:38 1615次阅读

    关于32/64Altium Designer与Access数据库兼容的问题

    Database Libraries(Dblib)是一个功能强大的元器件管理方案,但对于3264版本的Altium Designer在使用Microsoft Access作为后端数据库时是有区别的。
    的头像 发表于 01-24 14:40 2132次阅读

    玄铁的rv64ilp32之路 - 32Linux的未来

    计算机科学巨擘、图灵奖得主唐纳德在2008年的博客中曾发表过一段著名的言论,他抱怨道:在编译内存需求不足4GB的程序时,使用64指针是非常不明智的。因为当这些指针值出现在结构体
    的头像 发表于 01-23 16:25 2092次阅读
    玄铁的rv<b class='flag-5'>64</b>ilp32之路 - 32<b class='flag-5'>位</b><b class='flag-5'>Linux</b>的未来