64位 linux

2018-06-02 17:57:54 hhhanpan 阅读数 4552

IA32-e模式下地址映射

之前写过,32位Linux虚拟地址映射,讨论了在CPU 80386下的虚拟地址映射。

看过博主的《Linux内核在x86_64 CPU中地址映射》,对32位和64位下地址映射的区别做了一些总结。


---------------------------------------------------------------------------

1. x86_64CPU中逻辑地址(段式)映射

    x86_64段式地址过程和x86一致,即各段起始地址都是0,区别在于段大小不再是4G

    在 x86-64 下,处理器默认 CS, DS, ES, SS的段基址为 0,所以下面就不讨论逻辑地址到线性地址的转换了,因为基址为0,经过运算后线性地址和逻辑地址是一样的。

    分页过程会将 48-bit 的线性地址转换为 52-bit 的物理地址, 可以看出虽然是 64bit 的操作系统但在处理器层面并没有提供 2^64 大小的访问范围。48-bit 线性地址可以有以下 3 种映射分配


2.x86_64CPU中线性地址(页式)映射



具体分析如下:

(1)线性地址是48位

    x86_64线性地址不是64bit,物理地址也不是64位,Intel当前CPU最高物理地址是52bit,但实际支持的物理内存地址总线宽度是40bit。


        x86CPU仅支持64位虚拟地址中的48位。对于用户模式地址,64位中的虚拟地址高16位的地址总被设置为0x0;对于内核模式地址,总被设置为0xF.

为什么64位虚拟地址只能使用48位呢?

        由于x86_64处理器硬件限制。x86_64处理器地址线只有48条,故而导致硬件要求传入的地址48位到63位地址必须相同。最初AMD规定,只有虚拟地址的最低48位才会在地址转换(页表查询)时被使用。48位地址空间在AMD推出64位时是非常大的,即使对于现在来说也基本够用。48位的虚拟地址转换成物理地址需要4级页表。

(2)页面映射分为4级

    4K页面下, 48位线性地址分为5段,位宽度分别是9、9、9、12。映射的方法为页表查找。

    即可管理的地址空间为2^48 = 256T。而在32地址模式下,该值仅为2^32 = 4G。

    另外64位地址时支持的物理内存最大为64T而在32位地址时最大支持的物理内存为64G(开启PAE选项)。

(3)CR3寄存器保存最高一级表的起始物理地址

(4)每个表项的大小为8字节


长模式(IA32-e模式)

    x86-64兼容CPU可以运行在多种模式之下,除了熟悉的实模式,保护模式,还有长模式等,在长模式下,处理器完全执行64位指令,使用64位地址空间(物理内存的寻址能力却没有被完全扩展到64位,因为目前的众多CPU在其寿命期限之内都没有机会见识到如此巨大的内存)和64操作数。因此,为了降低制造成本,目前的CPU被限制在略少于64位寻址。

  • 长模式下cpu屏蔽了段机制,简化了应用程序的内存管理,提高了单个寄存器的运算位数,并引入了一系列的新指令集和前缀(比如rex),使得合理优化过的64位程序比32位程序效率要高一些。
  • 长模式下引入了rip相对寻址机制,使得“位置无关代码”的实现更容易而且更快。


注:x86_64下HIGHMEM是没有定义的,用户空间默认从高端内存分配所需内存,虽然x86_64没有高端内存也没有关系,内核设计了适当的回退机制,用户空间一样可以在低端内存分配内存,只不过需要二次映射,浪费一点效率。

而在32位下虚拟地址空间的内核空间中,存在ZONE_HIGH(高端内存),用于Linux在32位系统下映射高于1G的内存,这块区域一般为128M大小。


-----------------------------------------------------------------------------------------------

参考资料:

X86/X64处理器体系结构及寻址模式

Linux内核在x86_64 CPU中地址映射



2018-07-19 10:42:47 weixin_34727238 阅读数 5075

时间宝贵,不该浪费在错误的下载事件上,总结本人最近的吃亏时间写出这总结,不论在linux系统上下载何类软件前,首当其冲要考虑的就是操作系统的适配性。

那么步入正题,怎样查看自己的linux版本是32位还是64位呢???以下总结了三种基本查看方式。

(1)输入命令:         file /sbin/init 或者 file /bin/ls

 以我自己的linux版本为例:




 从上两张图清晰可见,此linux版本为32位。(32-bit)

(2)输入命令:      uname -a

 以我自己的linux版本为例:



           备注:i686表示32位机器

如果是64位版本,则有以下文字:

Linux pmx002**.**.**  2.6.32-71.el6.x86_64 #1 SMP Wed Sep 1 01:33:01 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

备注:x86_64表示64位机器

(3)输入命令:      getconf LONG_BIT



结果显而易见,64位机器同理。

 

 

 

 

 

 

 

 

 

2017-11-05 19:05:32 sessos 阅读数 56811

如何判断Linux是32位还是64位

方法一:getconf LONG_BIT
在linux终端输入 getconf LONG_BIT 命令
如果是32位机器,则结果为32

[cpp] view plain copy

  1. [root@localhost ~]# getconf LONG_BIT
  2. 32

如果是64位机器,则结果为64

[cpp] view plain copy

  1. [root@localhost ~]# getconf LONG_BIT
  2. 64

方法二:uname -a
如果是64位机器,会输出x86_64

[cpp] view plain copy

  1. [chenzhou@testweb01 ~]$ uname -a
  2. Linux testweb01 2.6.18-308.4.1.el5 #1 SMP Tue Apr 17 17:08:00 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux

可以看到,uname-a执行后的结果中输出了x86_64,说明该机器是64位的,否则代表该机器是32位的

[cpp] view plain copy

  1. [root@localhost ~]# uname -a
  2. Linux localhost.localdomain 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:54 EDT 2009 i686 i686 i386 GNU/Linux

方法三:file /sbin/init 或者 file /bin/ls
示例:32位机器
file /sbin/init

[cpp] view plain copy

  1. [root@localhost ~]# file /sbin/init
  2. /sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

file /bin/ls

[cpp] view plain copy

  1. [root@localhost ~]# file /bin/ls
  2. /bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

示例:64位机器
file /sbin/init

[cpp] view plain copy

  1. [chenzhou@testweb01 ~]$ file /sbin/init
  2. /sbin/init: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

file /bin/ls

[cpp] view plain copy

  1. [chenzhou@testweb01 ~]$ file /bin/ls
  2. /bin/ls: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

可以通过命令结果中的64-bit或者32-bit来判断该机器是64位还是32位

 

分享一份C++大咖的资料!

C++资料免费送

 

 

 

 

 

 

2019-05-28 21:11:55 qq_35061334 阅读数 6244

一、问题现象:

如下图所示,虚拟机中新建虚拟电脑,版本只能选择32-bit,如果需要在新建的linux系统内安装docker,32位的是不支持的,所以,必须要解决这个问题
在这里插入图片描述

想要实现的目标(如下图所示,应该既有32位也有64位的才满足使用):
在这里插入图片描述

一、出现不能安装的原因:

电脑未开启处理器虚拟化技术,设置Virtualizaiton由Disable改为Enable即可。

二、解决办法

我的电脑是thinkpad,现在以我的电脑为例讲解下怎么打开虚拟化技术,其他品牌的电脑可以自己百度下,怎么实现。

1.进入bios

设置虚拟化技术的方法通常都在bios里面

  • 如何进入bios? 按下开机键的同时,按下f1键,通过f1键进入bios的,不用按fn键

  • 注意事项:进入bios的时间非常短,通常在开机1、2秒钟的时候,必须在该时刻快速按下f1,所以在开机前就做好按键准备。

  • 如果操作迟缓没进入bios界面怎么办? 重启电脑再次尝试进入bios。
    正确进入bios界面如图所示
    在这里插入图片描述

2.切换到security页面,设置Virtualizaiton

通过方向键,切换到security页面,通过下方向键选中在下面显示的Virtualizaiton选项,回车进入更改选项界面,我们选择enabled,就是表示将其开启,完成更改后,按下f10,保存并退出,电脑将再次重启。
在这里插入图片描述

在这里插入图片描述

结语:设置完重启后,就解决了此问题,可以在虚拟机中新建64位的linux啦

在这里插入图片描述

2016-08-18 20:24:37 xiaolong361 阅读数 4339

32位和64位Linux系统的区别:

一、设计初衷不同

最初,64位是为了满足高科技人员使用本行业需要大量内存和浮点特性的特殊软件的需要而设计的运行平台,而32位操作系统是为了满足普通用户的需要。

二、要求配置不同

64位只能安装在64位电脑上;32位可以安装在64位或32位电脑上,但是安装在64位电脑上可能会造成内存过大无法识别或硬件浪费等问题。

三、运算速度不同

64位CPU的通用寄存器的数据宽度为64位,64位指令集可以运行64位数据指令,即一次可以提取64位数据,比32位的提升了一倍。

四、寻址能力不同

64位处理器对内存的控制能力更强,其ALU和寄存器可以处理更大的整数,具有更强的寻址能力。而32位CPU和操作系统理论上最高只支持4G内存,要使用大于4g的内存,必须使用因特尔的PAE(物理地址扩展)模式。

五、软件普及不同

64位软件普及较好,32位相对较差。

六、在生产场景中的使用不同

绝大多数的服务器厂商如(dell,hp,ibm)的服务器都支持32位和64位系统。但是为了最大限度的发挥硬件性能,增大对大内存的利用率,通常采用的都是64位操作系统。

 

下面是Linux系统识别方法:

查看系统版本:

#cat /etc/redhat-release

查看内核版本:

#uname -r

查看64位还是32位:

#uname -m

或查看所有相关内容:

#uname -a

 

64位Linux汇编

阅读数 781

64位linux 汇编

阅读数 2057