0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux中的32位與64位

Linux愛(ài)好者 ? 來(lái)源:Linux愛(ài)好者 ? 作者:Linux愛(ài)好者 ? 2020-12-11 16:00 ? 次閱讀

在通用PC領(lǐng)域,不論是windows還是linux界,我們都會(huì)經(jīng)常聽(tīng)到"32位"與"64位"的說(shuō)法,類(lèi)似的還有"x86"與"x86_64","i386"與"amd64",這兩組概念之間有著怎樣的聯(lián)系和區(qū)別呢?

實(shí)際上這兩組概念涉及了三個(gè)層次:硬件,系統(tǒng)和軟件。

1、硬件

早期的intel處理器,如i386,486,586,奔騰系列的CPU架構(gòu),都是32位的(32位的寄存器,32位的虛擬地址空間),統(tǒng)稱(chēng)為x86架構(gòu)。

隨著技術(shù)的發(fā)展,32位CPU已經(jīng)無(wú)法滿(mǎn)足需求,intel與AMD采用不同的方法開(kāi)發(fā)64位架構(gòu)的CPU,intel使用與x86完全不同的IA64架構(gòu),由于與原來(lái)的X86完全不兼容,因此在PC領(lǐng)域沒(méi)有得到應(yīng)用,只在服務(wù)器領(lǐng)域有一些使用。

而AMD開(kāi)發(fā)的架構(gòu)稱(chēng)為amd64(將寄存器擴(kuò)充為64位,支持64位虛擬地址),能夠完全兼容x86指令集,不用任何修改就能運(yùn)行老的操作系統(tǒng)和應(yīng)用軟件,在PC界得到廣泛的應(yīng)用,現(xiàn)在市場(chǎng)上幾乎所有的PC用途的CPU都是支持amd64指令集的了。

當(dāng)然intel也很快開(kāi)發(fā)出支持該指令集的CPU,不過(guò)intel將其稱(chēng)為x64架構(gòu),而不是用amd64這個(gè)名字。而在linux中則稱(chēng)為x86_64,即x86架構(gòu)的64位擴(kuò)展。

有關(guān)x86_64的詳細(xì)描述可翻閱《深入理解計(jì)算機(jī)系統(tǒng)》一書(shū)。

在linux中查看CPU是否64位的方法:如果/proc/cpuinfo內(nèi)的flags字段中含有"lm",則表示使用的是64位CPU(運(yùn)行“grep 'lm' /proc/cpuinfo”命令,輸出不為空)。

2、系統(tǒng)

系統(tǒng)同樣可分為32位與64位。在x86_64架構(gòu)的CPU出現(xiàn)之前,PC的操作系統(tǒng)都是用32位,例如windows 2000,xp,當(dāng)時(shí)的unix,linux等。

在x86_64架構(gòu)出現(xiàn)后,系統(tǒng)也就有了兩個(gè)版本:32位和64位,兩者的主要區(qū)別在于與硬件體系結(jié)構(gòu)相關(guān)的操作中。

由于x86_64架構(gòu)完全兼容x86架構(gòu),因此,32位的系統(tǒng)完全可以在x86_64位上運(yùn)行,只不過(guò)它只使用了x86部分,沒(méi)有完全發(fā)揮硬件的功能而已。

而64位系統(tǒng)專(zhuān)門(mén)針對(duì)64位的擴(kuò)展功能而開(kāi)發(fā)的,就是為了最大限度地發(fā)揮硬件的能力,它無(wú)法在x86架構(gòu)的cpu上運(yùn)行。

另外,不論是windows還是linux,驅(qū)動(dòng)程序都需要加載到內(nèi)核空間中,因此它的類(lèi)型(32位或64位)需要跟系統(tǒng)完全相同。

系統(tǒng)與CPU的關(guān)系如下圖所示:

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

查看linux系統(tǒng)是32位還是64位的方法:執(zhí)行shell命令“arch”,顯示為x86_64表示當(dāng)前系統(tǒng)為64位,顯示為i386,i486等表示系統(tǒng)是32位的。

3、軟件

在系統(tǒng)上運(yùn)行的應(yīng)用軟件同樣有32位和64位之分,老的應(yīng)用軟件運(yùn)行在32位CPU及32位系統(tǒng)中,屬于32位軟件。

出現(xiàn)了64位系統(tǒng)之后,也出現(xiàn)了專(zhuān)門(mén)運(yùn)行在64位系統(tǒng),能夠最大限度使用64位系統(tǒng)的擴(kuò)展功能的原生64位程序。

對(duì)于C程序來(lái)說(shuō),64位程序相比32位程序最大的區(qū)別就是int,long以及指針數(shù)據(jù)類(lèi)型的長(zhǎng)度都是64位的,可以使用64位的虛擬地址空間。

實(shí)際遠(yuǎn)不止這些,編繹器在將64位C程序翻譯成匯編語(yǔ)言或者機(jī)器語(yǔ)言時(shí),會(huì)盡量使用64位處理器的寄存器,盡量避免訪(fǎng)問(wèn)內(nèi)存,例如把函數(shù)的參數(shù),及局部變量?jī)?yōu)先放在寄存器,而不是在用戶(hù)棧中。

另外在64位系統(tǒng)中,為了兼容數(shù)量眾多的老的應(yīng)用程序,系統(tǒng)都會(huì)增加一個(gè)虛擬層,用來(lái)翻譯x86指令,這樣32位程序也可以在64位系統(tǒng)中運(yùn)行(windows和linux都支持)。

同樣在64位系統(tǒng)中,使用64位編繹器一般也可以選擇編譯成32位程序(gcc使用-m32編譯成32位可執(zhí)行文件)。

另外在PC上,軟件能否運(yùn)行,只需看系統(tǒng)是否支持即可,可以不用理會(huì)CPU的架構(gòu)。軟件與系統(tǒng)的關(guān)系如下圖所示:

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

linux中查看可執(zhí)行文件是32位還是64位的方法:執(zhí)行shell命令“file /usr/bin/xxx", 如果是32位程序,顯示為"ELF 32-bit ...";如果是64位,則顯示為:"ELF 64-bit..."。

4、linux發(fā)行版與內(nèi)核

在linux發(fā)行版中,一般會(huì)針對(duì)不同的架構(gòu)發(fā)布不同的安裝光盤(pán),以debian為例,可用于PC的就有i386和amd64這兩個(gè)版本。

根據(jù)上面的描述,這兩個(gè)版本的系統(tǒng)都可以安裝在使用64位的CPU的機(jī)器上,而使用32位CPU的機(jī)器上則只能安裝i386版本的系統(tǒng)。

在debian amd64光盤(pán)中帶的內(nèi)核及軟件包全都是64位版本的,而debian i386光盤(pán)中則有32位和64位的內(nèi)核,以及32位的軟件,可能是考慮到有些用戶(hù)想用64位內(nèi)核來(lái)運(yùn)行32位程序吧。

內(nèi)核源代碼是沒(méi)有32位,64位之分的,在編譯內(nèi)核時(shí)可以用ARCH參數(shù)手工指定編譯成哪一個(gè)架構(gòu)。例如:"make ARCH=i386 menuconfig","make ARCH=i386"用于配置,編譯32位內(nèi)核;

而"make ARCH=x86_64 menuconfig","make ARCH=x86_64"則用于配置,編譯64位內(nèi)核。

但是,在debian amd64光盤(pán)安裝的系統(tǒng)里編譯的32位內(nèi)核是無(wú)法引導(dǎo)的,因?yàn)橄到y(tǒng)安裝的所有軟件包都是原生64位程序,無(wú)法在32位內(nèi)核上運(yùn)行,典型的錯(cuò)誤是提示引導(dǎo)時(shí)找不到能運(yùn)行的init程序;

而使用debian i386光盤(pán)安裝的系統(tǒng)中編譯的64位內(nèi)核卻可以使用,只是需要在配置內(nèi)核時(shí)加上IA32 Emulation支持(menuconfig的:"Executable file formats/Emulations"-->"IA32 Emulation")。

基于這樣的原因,我原來(lái)用搭建的debian amd64光盤(pán)安裝的系統(tǒng)(http://www.cnblogs.com/xiongyuanxiong/p/3523306.html),現(xiàn)在也改成用debian i386光盤(pán)來(lái)安裝了,這樣就能同時(shí)編譯新的32位和64位官方內(nèi)核進(jìn)行對(duì)比測(cè)試。

責(zé)任編輯:lq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19032

    瀏覽量

    228448
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5268

    瀏覽量

    119646
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11161

    瀏覽量

    208461

原文標(biāo)題:Linux 中的32位與64位

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RV6464地址指令

    (word),雙字(doubleword)和長(zhǎng)整數(shù)(long)版本的指令,并將所有寄存器(包括 PC)擴(kuò)展為 64 。因此,RV64I 的 sub 操作的是兩個(gè)
    發(fā)表于 09-04 15:15

    MPU進(jìn)入64時(shí)代,Microchip推出PIC64系列產(chǎn)品

    ,MCU和MPU之間的界限也越來(lái)越小,以適應(yīng)更多新的應(yīng)用。Microchip作為嵌入式解決方案的領(lǐng)導(dǎo)者,近日推出了全新的PIC64GX MPU,這也是Microchip推出的首款64MPU產(chǎn)品
    的頭像 發(fā)表于 07-24 00:12 ?3404次閱讀

    請(qǐng)問(wèn)STM8能處理64的數(shù)據(jù)嗎?

    IAR for stm8 64數(shù)據(jù)變量賦值時(shí)出現(xiàn)integer constant is too large的錯(cuò)誤。 問(wèn)下STM8能處理64
    發(fā)表于 05-14 08:13

    ICMAN多點(diǎn)液檢測(cè)

    檢測(cè)
    ICman
    發(fā)布于 :2024年04月02日 09:31:20

    stm32F4 64變量操作異常怎么解決?

    stm32F4 64變量使用報(bào)錯(cuò)解決
    發(fā)表于 04-02 07:16

    入門(mén)級(jí)64ARM?CORTEX?-A55 MPU數(shù)據(jù)手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《入門(mén)級(jí)64ARM?CORTEX?-A55 MPU數(shù)據(jù)手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 02-19 10:59 ?0次下載
    入門(mén)級(jí)<b class='flag-5'>64</b><b class='flag-5'>位</b>ARM?CORTEX?-A55 MPU數(shù)據(jù)手冊(cè)

    STM32開(kāi)發(fā)運(yùn)算以及帶操作

    STM32開(kāi)發(fā)運(yùn)算以及帶操作? 運(yùn)算是計(jì)算機(jī)中常用的一種操作方式,特別適用于對(duì)數(shù)據(jù)的單個(gè)或多個(gè)位進(jìn)行操作。在STM32開(kāi)發(fā),
    的頭像 發(fā)表于 02-02 14:38 ?1372次閱讀

    關(guān)于32/64Altium Designer與Access數(shù)據(jù)庫(kù)兼容的問(wèn)題

    Database Libraries(Dblib)是一個(gè)功能強(qiáng)大的元器件管理方案,但對(duì)于3264版本的Altium Designer在使用Microsoft Access作為后端數(shù)據(jù)庫(kù)時(shí)是有區(qū)別的。
    的頭像 發(fā)表于 01-24 14:40 ?1732次閱讀

    玄鐵的rv64ilp32之路 - 32Linux的未來(lái)

    計(jì)算機(jī)科學(xué)巨擘、圖靈獎(jiǎng)得主唐納德在2008年的博客中曾發(fā)表過(guò)一段著名的言論,他抱怨道:在編譯內(nèi)存需求不足4GB的程序時(shí),使用64指針是非常不明智的。因?yàn)楫?dāng)這些指針值出現(xiàn)在結(jié)構(gòu)體時(shí)
    的頭像 發(fā)表于 01-23 16:25 ?1781次閱讀
    玄鐵的rv<b class='flag-5'>64</b>ilp32之路 - 32<b class='flag-5'>位</b><b class='flag-5'>Linux</b>的未來(lái)

    python32與62區(qū)別

    32 64 之間的區(qū)別和影響。 內(nèi)存限制: 在 32 系統(tǒng),每個(gè)進(jìn)程可以使用的最大內(nèi)存是 4GB。這是由于 32
    的頭像 發(fā)表于 11-23 16:44 ?1568次閱讀

    現(xiàn)在3264mcu主要有哪些?哪種性?xún)r(jià)比高呢?

    現(xiàn)在3264mcu主要有哪些?哪種性?xún)r(jià)比高?
    發(fā)表于 11-08 08:26

    ARM64與ARM32OP-TEE啟動(dòng)過(guò)程的差異

    ARM32的OP-TEE與ARM64的OP-TEE啟動(dòng)過(guò)程大致相同。ARM64的OP-TEE的_start函數(shù)定義在generic_entry_a64.S文件,而且該函數(shù)不像ARM3
    的頭像 發(fā)表于 11-07 15:12 ?657次閱讀

    8機(jī)、32機(jī)、64機(jī)是以什么標(biāo)準(zhǔn)來(lái)確定的?

    我們說(shuō)的8機(jī)、32機(jī)、64機(jī)是以什么標(biāo)準(zhǔn)來(lái)確定的? 為什么同一臺(tái)電腦,即能裝32操作系統(tǒng),又能裝
    發(fā)表于 11-02 07:14

    ICman:液檢測(cè)芯片在探針式結(jié)構(gòu)的應(yīng)用

    芯片檢測(cè)
    ICman
    發(fā)布于 :2023年10月26日 17:12:23

    8、16、32單片機(jī)的“XX”指的是什么?

    8、16、32單片機(jī)的“XX”指什么?
    發(fā)表于 10-26 06:43