Linux kernel 扩展386段选择器中的基址witdh以超过32位操作系统中的4GB RAM限制?

Linux kernel 扩展386段选择器中的基址witdh以超过32位操作系统中的4GB RAM限制?,linux-kernel,32bit-64bit,i386,Linux Kernel,32bit 64bit,I386,随着内存需求的快速增长,今天越来越多的系统需要64位机器来访问更大的RAM FWIK在386保护模式下,内存指针由两部分组成:由段选择器指定的基址(32位)和添加到基址的偏移地址(32位) 要在64位中重新编译所有程序,有很多工作要做,例如对于C/C++程序,依赖于机器的“int”类型(在32位机器中是32位的,在64位机器中是64位的)如果使用不正确将导致问题。即使它被重建也没有问题,随着内存需求的不断增长,例如,有一天我们将使用128位机器,我们需要重新重建所有程序以符合新的字大小吗 如果我

随着内存需求的快速增长,今天越来越多的系统需要64位机器来访问更大的RAM

FWIK在386保护模式下,内存指针由两部分组成:由段选择器指定的基址(32位)和添加到基址的偏移地址(32位)

要在64位中重新编译所有程序,有很多工作要做,例如对于C/C++程序,依赖于机器的“int”类型(在32位机器中是32位的,在64位机器中是64位的)如果使用不正确将导致问题。即使它被重建也没有问题,随着内存需求的不断增长,例如,有一天我们将使用128位机器,我们需要重新重建所有程序以符合新的字大小吗

如果我们只是将基址扩展到64位,从而在整个RAM上形成一个类似4GB窗口的段,我们甚至不需要64位操作系统,不是吗?大多数应用程序/进程不必访问4G+内存,例如,在服务器端,如果文件服务器使用20GB RAM进行缓存,它可能会被分成10个进程,每个进程访问2GB,因此32位指针就足够了。并将每个内存放在不同的段中,以覆盖20GB内存

扩展段限制对上层程序来说是透明的,应该做的只是CPU和操作系统,如果我们可以让Linux支持在不同的64位段上分配内存(尽管目前段基址是32位的),我们可以很容易地在32位机器上使用1TB RAM,不是吗


我说得对吗?

内存访问是在CPU上使用汇编指令完成的。如果CPU有32位用于寻址内存段,它最多可以寻址4 GB,但不能超过4 GB。要扩展此行为,CPU需要一个64位寄存器

32位操作系统也有同样的限制。64位操作系统可以执行32位程序并使其访问高于4 GB的基址,但需要64位处理器

综上所述,操作系统(以及间接由该操作系统上运行的进程)可访问的内存窗口限制受处理器寄存器宽度(以位为单位)的限制

所以,你是不对的


可能适合您的需要,但您需要硬件和操作系统支持,据我所知,这是非常常见的。

内存访问是在CPU上完成的,使用汇编指令。如果CPU有32位用于寻址内存段,它最多可以寻址4 GB,但不能超过4 GB。要扩展此行为,CPU需要一个64位寄存器

32位操作系统也有同样的限制。64位操作系统可以执行32位程序并使其访问高于4 GB的基址,但需要64位处理器

综上所述,操作系统(以及间接由该操作系统上运行的进程)可访问的内存窗口限制受处理器寄存器宽度(以位为单位)的限制

所以,你是不对的


很可能,它适合您的需要,但您需要硬件和操作系统支持,据我所知,这是非常常见的。

您现在可以通过在64位内核上运行32位进程来实现这一效果。每个32位进程只有4GB的虚拟地址空间,但这些地址可以映射到内核可访问的物理内存中的任何位置。但是,它不是使用分段来完成的;这只是通过分页来完成的。

今天,您可以通过在64位内核上运行32位进程来实现这一效果。每个32位进程只有4GB的虚拟地址空间,但这些地址可以映射到内核可访问的物理内存中的任何位置。但是,它不是使用分段来完成的;它只是通过分页完成的