linux-地址空间-探究地址空间-MIPS64-Linux-mips64 (linux系统)

教程大全 2025-07-15 18:41:33 浏览

地址空间是一个操作系统中的重要概念。在操作系统内核中,地址空间是用来区分不同进程内存空间的一个概念。对于不同的进程来说,它们的地址空间应该是分离的。这样才能保证进程之间的内存不会发生冲突,从而保证系统的稳定性和可靠性。

在本文中,我们将探究LINUX MIPS64平台下的地址空间。我们将会讨论MIPS64体系结构下的地址空间特点,以及Linux内核如何管理这些地址空间。

MIPS64地址空间的特点

MIPS64架构是基于32位地址空间的,但它支持使用64位物理地址。这意味着MIPS64架构可以寻址的内存空间非常大。在Linux MIPS64平台下,进程的地址空间大小为48位,其中高16位被保留,并且实际上只有44位被用于寻址。这使得MIPS64架构可以访问高达16EB的内存空间。

与任何其他架构一样,MIPS64体系结构也为每个进程保留了地址空间。在Linux中,每个进程都有自己的地址空间,这个地址空间在进程被创建时就被初始化和分配。这些地址空间包括用户空间、内核空间和栈空间。

用户空间是进程的主要内存区域。它包括了各种用户代码和数据段,以及堆空间和共享库的映射。内核空间是内核代码和数据段的区域。内核可以在进程的上下文中访问该空间,从而进行系统级别的操作。栈空间是用于保存局部变量、函数调用堆栈以及其他相关数据的内存区域。

Linux内核对地址空间的管理

Linux内核在MIPS64平台下通过使用页表来管理地址空间。页表是一张数据结构,用于存储虚拟地址和物理地址之间的映射关系。它将虚拟地址映射到物理地址,从而让程序可以访问内存。在MIPS64平台下,内存被分成固定大小的页面。每个页面的大小通常为4KB。

Linux内核将进程的地址空间划分成多个区域,每个区域都有一定的保护属性。例如,代码段通常是只读的,而数据段则可以被读写。内核可以通过设置页面保护属性来实现这些限制。在进程执行的不同阶段,内核可以动态地改变页面保护属性,以确保进程可以访问其需要的内存。

在Linux MIPS64平台下,内核还可以使用可重定位的代码,以便在不同进程之间共享代码段。共享代码可以节省内存,但同时也增加了代码修改时的复杂度。

Linux MIPS64平台下的地址空间是一个极其重要的概念。Linux内核通过使用页表和保护属性来管理各个进程的地址空间。每个进程都有自己独立的地址空间,这确保了不同进程之间的内存空间分离,从而提高了Linux系统的稳定性和可靠性。了解地址空间的工作原理对于理解操作系统内部运作十分重要,希望本文能够帮助你更好地理解这个概念。

相关问题拓展阅读:

64位简介及详细资料

MIPS64

概述

一个 64 位的 CPU,内部可能有外部数据汇流排或不同大小的地址汇流排,可能比较大或比较小;术语”64位”也常用于描述这些汇流排的大小。例如,目前有许多机器有着使用 64 位汇流排的 32 位处理器(如最初的 Pentium 和之后的 CPU),因此有时会被称作”64位”。同样的,某些 16 位处理器(如 MC68000,摩托罗拉公司生产的一款16位处理器,因集成约68000个电晶体而得名)指的是 16/32 位处理器具有 16 位的汇流排,不过内部也有一些 32 位的性能。这一术语也可能指计算机指令集的指令长度,或其它的数据项(如常见的 64 位双精度浮点数)。去掉进一步的条件,”64位”计算机架构一般具有 64 位宽的整数型暂存器,它可支持(内部和外部两者) 64 位”区块”(chunk)的整数型数据。

架构影响

处理器中的暂存器通常可分为三种︰整数、浮点数、其它。在所有常见的主流处理器中,只有整数暂存器(integer register)才可存放指针值(记忆体数据的地址)。非整数暂存器不能存放指针来读写记忆体,因此不能用来避开任何受到整数暂存器大小所影响的记忆体限制。

几乎所有常见的主流处理器(大部分的 ARM 和 32 位 MIPS 实作是明显的例外)集成了浮点数硬体,它有可能使用 64 位暂存器保存数据,以供处理。例如,x86 架构包含了 x87 浮点数指令,并使用 8 个 80 位暂存器构成堆叠结构。后来的 x86 修改版和 x86-64 架构,又加入 SSE 指令,它使用 8 个 128 位宽的暂存器(在 x86-64 中有 16 个暂存器)。与之相较,64 位 Alpha 系列处理器,除了 32 个 64 位宽整数暂存器以外,也定义了 32 个 64 位宽型戚的浮点数暂存器。

记忆体限制

截至2023 年,大部分的 CPU,其单个暂存器可存放虚拟记忆体中任意数据的记忆体地址(本机)。因此,虚拟记忆体(计算机在程式的工作区域中所能保留的数据总量)中可用的地址取决于暂存器的宽度。自 1960 年的 IBM System/360 起,然后1970年的 DEC VAX微型计算机,以及1980年中期的 Intel 80386,在事实上一致开发合用的 32 位大小的暂存器。32 位暂存器意味着 2^32 的地址,或可使用 4 GB 的记忆体。当时在设计这些架构时,4 GB 的记忆体远远超过一般所安装的可用量,而认为已足够用于定址。认为 4 GB 地址为合适的大小,还有其它重要的理由︰在应用程式中,如资料库,42 亿多的整数已足够对大部分可计算的实例分配唯一的参考引用。

然而在 1990年初,成本不断降低的记忆体,使安装的记忆体数量逼近 4 GB,且在处理某些类型的问题时,可以想像虚拟记忆体的使用空间将超过 4 GB 上限。为此,一些公司开始释出新的 64 位架构晶片家族,最初是提供给超级计算机、顶级工作站和伺服器机器。64位运算逐渐流向个人计算机则出现在 2023 年,某些型号的 Apple Macintosh 生产线转向 PowerPC 970 处理器(Apple 称为”G5″),并在 2023 年,转向 EM64T 处理器,且 x86-64 处理器在顶级的 PC 中遂渐普及。64 位架构的出现,有效的将记忆体上限提升至 2^64 地址,16 EB 的记忆体。从这个角度来看,在 4 MB 主记忆体很普遍时,更大的记忆体上限 2^32 的地址大约是一般安装记忆体的 1000 倍。如今,当 16 GB 的主记忆体很普遍时,2^64 的地址上限大约是 10亿倍。

今天市面上大部分的消费迟源级 PC 存在着人为的记忆体限制,因受限于实例上的限制,而几乎不太可能需要完整支持 16 GB 容量。举例来说,Apple的 Mac Pro 最多可安装实例记忆体至 16 GB,而无必要支持超过的大小。最新的Linux核心(版本 2.6.16)可编译成更高支持 64 GB 的记忆体,Windows VistaUltimate支持超过128G记忆体。

32位比较

从32位到64位架构的改变是一个根本的改变,因为大多数作业系统必须进行全面性修改,以取得新架构的优点。其它软体也必须进行移植,以使用新的性能;较旧的软卜旦陵体一般可借由硬体兼容模式(新的处理器支持较旧的 32 位版本指令集)或软体模拟进行支持。或者直接在 64 位处理器里面实作 32 位处理器核心(如同 Intel 的 Itanium 处理器,其内含有 x86 处理器核心,用来执行 32 位 x86 应用程式)。支持 64 位架构的作业系统,一般同时支持 32 位和 64 位的应用程式。

明显的例外是 AS/400,其软体执行在虚拟的指令集架构,称为 TIMI(技术独立机器界面),它会在执行之前,以低阶软体转换成本地机器码。低阶软体必须全部重写,以搬移整个 OS 以及所有的软体到新的平台。例如,当 IBM 转移较旧的 32/48 位”IMPI”指令集到 64 位 PowerPC(IMPI 完全不像 32 位 PowerPC,所以这比从 32 位版本的指令集转移到相同指令集的 64 位版本的规模还要庞大)。

64 位架构无疑可套用在需要处理大量数据的应用程式,如数码视频、科学运算、和早期的大型资料库。在其它工作方面,其 32 位兼容模式是否会快过同等级的 32 位系统,这部分已有很多争论。在 x86-64 架构(AMD64 和 Intel 64)中,主要的 32 位作业系统和应用程式,可平滑的执行于 64 位硬体上。

Sun 的 64 位 Java虚拟机的启动速度比 32 位虚拟机还慢,因为 Sun 仍假定所有的 64 位机器都是伺服器,而且只有为 64 位平台实作”伺服器”编译器(C2)。”客户端”编译器(C1)产生较慢的代码,不过编译较快速。所以尽管在 64 位 JVM 的 Java 程式在一段很长的周期会执行的较好(一般为长时间运作的”伺服器”应用程式),它的启动时间可能更久。对于短生命期的应用程式(如 Java 编译器 javac) 增加启动时间可控制执行时间,使 64 位的 JVM 整体变慢。

应当指出,在 32 位和 64 位处理器时,速度并不是唯一的考量因素。应用程式,如多任务、压力测试(stress testing)、丛集(clustering)(用于HPC)可能更适合 64 位架构以正确部署。为了以上原因,64 位丛集已广泛部署于大型组织,如 IBM、VodafOne、HP、微软

优缺点

一个常见的误解是:除非计算机安装的记忆体大于 4 GB,否则 64 位架构不会比 32 位架构好。这不完全正确。

部分作业系统保留了一部分进程地址空间供作业系统使用,造成使用者程式可用于映射记忆体的地址空间减少。例如,Windows XP DLL 以及 userland OS 组件映射到每一个进程的地址空间,即使计算机装有 4 GB 的记忆体,也仅留下 2 至 3.8 GB(端视其设定)的可用地址空间。这个限制在 64 位 Windows 中并不会出现。

档案的记忆体映射对 32 位的架构而言不再合用,尤其是相对便宜的 DVD 烧录技术的引入。大于 4 GB 的档案不再罕见,且如此大的档案无法简单的映射到 32 位架构的记忆体;只能映射档案的一部分范围到地址空间上,并以记忆体映射存取档案,当有需要时,就必须将这些范围映射进或映射出地址空间。这是一个问题,因为充裕的记忆体映射仍是从磁碟至记忆体最有效率的存取方法,如果作业系统能适当实行的话。

64 位架构主要的缺点是,相对于 32 位架构,占用相同的数据会消秏更多的记忆体空间(由于肿胀的指针,以及其它型态和对齐补白等可能)。这会增加进程对记忆体的需求,且可能会影响高效能处理器高速快取的使用。维持一部分的 32 位模型是一个处理方法,且大致合理有效。实际上,高效能导向的 z/OS 作业系统便采取这个方法,要求程式代码存放在 32 位地址空间的任一数字,数据对象则可(选择性)存放在 64 位区域。

目前主要的商业软体是建立在 32 位代码,而非 64 位代码,所以不能取得在 64 位处理器上较大的 64 位地址空间,或较宽的 64 位暂存器和数据路径的优点。然而,免费或自由软体作业系统的使用者已经可以使用专有的 64 位运算环境。并非所有的应用程式都需要大量的地址空间或操作 64 位数据项,所以这些程式不会享受到较大的地址空间或较宽的暂存器和数据路径的好处;主要受益于 64 位版本的应用程式,并不会享受到使用 x86 的版本,会有更多的暂存器可以使用。

可用性

64位系统有时缺乏对应的软体,那些软体是写给 32 位架构。最严重的问题是不兼容的驱动程式。尽管大部分软体可执行于 32 位兼容模式(又称作模拟模式,即微软 WoW64(Windows 32 bit on Windows 64 bit) 技术),其通常无法执行驱动程式(或类似软体),因为程式通常执行于作业系统和硬体之间,在此直接模拟无法使用。许多开放源始码软体封包可简单的从源始码编译为可执行于 64 位环境作业系统,如 Linux。所需的条件是供给 64 位机器的编译器(通常是 g)。目前 64 位版本的驱动程式还不能用,由于缺少可用的驱动程式,所以使用 64 位作业系统会有挫折,推荐使用预装64位版本的windows 7的电脑,一般会解决驱动问题。

因为设备的驱动程式通常执行于作业系统核心(kernel)的内部,有可能以 32 位进程执行核心,同时支持 64 位的使用者进程。以在核心里的额外消耗为代价,如此可为使用者提供受益于 64 位的记忆体和效能,且不破坏现存 32 位驱动程式的二进制兼容性。这个机制源于 Mac OS X 启用 64 位进程,同时支持 32 位的驱动程式。

数据模型

以高阶语言编写的套用软体,从 32 位架构转换到 64 位架构的各种困难。一个共同的问题是,部分程式设计师假定指针如同其它数据型态一样有相同的长度。程式设计师假定他们可以在数据型态之间传送数量而不遗失信息。这些假定只在一部分 32 位机器上如此(甚至是一部分 16 位机器),不过在 64 位机器上就不再如此。C 语言及其后代 C++ 尤其容易产生这种错误。

要在 C 和 C++ 中避免这种错误,如果确定原始类型的大小为所需的基础,sizeof 操作符可用来确定原始类型的大小,无论是在编译以及执行时期。此外,在 C99 标准中的 表头,以及在 C++ 标准中的 表头的 numeric_limits 类,可提供更多有用的信息;sizeof 只返回字元大小。这个用法使人产生误解,因为一个字元(CHAR_BITS)的大小是由自身决定,在所有的 C 或 C++ 实作中并未以相同方式定义。然而,除了这些编译器目标 DSP 以外,”64 位 = 8 字元(每一字元有 8 位)”已成标准。

必须谨慎使用 ptrdiff_t 型态(在标准表头 中)两个指针相减的结果;太多代码宁可不正确的使用”int”或”long”。表示一个指针(而不是指针差异)为一个整数,在此可以使用 uintptr_t(它只定义在 C99 中,不过某些编译器另外集成较早版本的标准以提供之,作为一个扩充)。

C 和 C++ 并未定义指针、整数型(int)、长型(long)为特定的位数目。

在主要的 32 位机器程式设计环境中,指针、”int”变数、”long”变数全部都是 32 位长。

然而,在 64 位机器下的许多程式设计环境,”int”变数仍然是 32 位宽,不过”long”和指针是 64 位宽,上述内容称为 LP64 数据模型。另一个选择是 ILP64 数据模型,三种数据型态都是 64 位宽,甚至 SILP64 连”short”变数也是 64 位宽。然而,大多数情况下所需的修改是相对次要且简单,而且许多编写良好的程式可以简单的重新编译给新的环境,而无须修改。另一个选择是 LLP64 模型,其维持 32 位代码的兼容性,使 int 和 long 为 32 位。”LL”指”long long”型态,其在所有平台下至少是 64 位,包括 32 位环境。

今天有许多 64 位编译器使用 LP64 模型(包括 Solaris、AIX、HP、Linux、Mac OS X、IBM z/OS 本地编译器)。微软的 VC++ 编译器使用 LLP64 模型。其缺点是在 LP64 模型中将 long 存放到 int 可能会溢出。另一方面,还会使强制转型一个指针为 long 可以作用;在 LLP 模型下,情况则刚好相反。两者皆不应该出现在合乎 C99 的代码中。

注意,程式设计模型是在预编译器底层选择的,且数个模型可共存于同一作业系统。然而一般由 OS API 选择程式设计模型作为原始模型。

另一个考量是用于驱动程式的数据模式。在现代的作业系统中,驱动程式弥补了大多数的作业系统代码(尽管许多代码可能不会载入,当作业系统执行时)。许多驱动程式大量使用指针操控数据,且在某些情况下必须读入一定大小的指针进入支持 DMA 的硬体。举个例子,提供给 32 位 PCI 设备的驱动程式,请求设备的 DMA 数据进入 64 位机器记忆体的较高区域,可能无法满足来自作业系统从设备到大于 4 GB 记忆体读入数据的要求。因为对于这些地址的指针,将不适合设备的 DMA 暂存器。这个问题可如下解决,当向设备发出 DMA 请求时,OS 采用与设备相符的记忆体限制,或者使用 IOMMU。

发展历程

1961︰IBM 发表 IBM 7030 Stretch 超级计算机。它使用 64 位数据字组,以及 32 或 64 位的指令字组。

1974︰Control>香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云 服务器 和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。


LINUX进程的地址空间是什么时候确定的?确定了,就马上分配吗?为什么?

是你电脑上软件的问题,有一些个软件访问了内存中的重要系统地址空间;或是病毒的问题!你先杀毒,之后在想想是什么时候,安了什么软件之后出现的,想起来之后就吧软件删了,想不起来也没关系!之后考虑是不是系统的问题,是就重做系统!最后再考虑是不是内存条的问题!(我想你应该知道怎么办) 请参考,希望能帮到你。

linux用户级进程跟内核线程(进程)有什么差别

1、几乎所有的程序都要切换到内核态运行再返回用户态,用中断完成的,因为在内核下封装了一些东西,用户态下只是传入某些参数后调用内核态下的函数罢了,2、进程有三态(执行态,就绪态,阻塞态),cpu任何时刻都只有一个进程在执行,so从用户态切换到内核态时,用户态下的进程就处于阻塞或就绪态了,至于从用户态切换到内核态执行哪个函数那就看你在用户态下执行的是什么函数了,比如在用户态下的lseek在内核下就是llseek了,不一样的。3、这问题就是linux的内存管理了,这里就得提到三种地址(逻辑地址、线性地址、物理地址),这里我们提到的4G地址是逻辑地址,不是我们实际的物理地址,linux中一个进程用户占0-3G对应的内核占3G-4G部分说得不是很清楚,这是比较复杂的内容,需要从头看起,单就这几个问题是不能搞懂linux的,最好还是系统的学习,不断的重复

linux 网卡怎么配置IP

展开全部vim /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE=eth0 网卡名字TYPE=EthernetONBOOT=yes开启网卡BOOTPROTO=none固定ipIPADDR=192.168.6.133设置你需要的静态ipPREFIX=24子网掩码24GATEWAY=192.168.6.1网关DNS1=192.168.6.1DNSDNS2=114.114.114.114

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐