Tumbleweed 32 bit sees only 3 GB RAM with PAE kernel while installing

I am trying to install tumbleweed i586 on a virtual machine (Qemu) with 8 GB RAM allocated to the VM. After completing the installation process and booting, the “top” command shows only 2 GB of total RAM. Same with free -h. When I checked the kernel, it shows PAE is enabled. It appears to be enabled by default but is unable to access the full amount of RAM. I tried re-installing with a virtual console open this time. The first line of the loader script shows the total RAM available is nearly 3 GB. How to solve this problem? Is it a bug in the installer that the boot kernel is 32 bit without PAE enabled. So the system thinks that it is installing on a 3 GB machine. After installation it does not matter whether the PAE is enabled or not because the OS itself installed on a 3 GB hardware. Please let me know if I am missing something.

Thank you.

Out of curiosity I tried on VirtualBox and I too see available RAM at 3.41 GB.
Please look at dmesg, you should see a warning reading:

Warning: only 4GB will be used. Support for CONFIG_HIGHMEM64G was removed!

That is a strange choice by the developers. Is there anyway to get it back? Do we have to build the kernel from source?

@megh-suse yes, you would need to roll your own kernel…

Thank you @malcolmlewis . I am new to Opensuse tumbleweed. Can you please share a link to a knowledge base or any developer notes on how to build your own kernel in opensuse?

@megh-suse Hi, depends on your desired method, src rpm and patch in the config change rebuild/install or the openSUSE Build Service…

It’s going to be a process for sure… See https://build.opensuse.org/projects/openSUSE:Factory/packages/kernel-source/files/README.SUSE?expand=1

It’s a little bit more than just build a kernel with CONFIG_HIGHMEM64G set. That option was removed in 6.15.

There is not support in the kernel for PAE in Linux 6.15+

commit bbeb69ce301323e84f1677484eb8e4cd8fb1f9f8
Author: Arnd Bergmann <arnd (at) arndb.de>
Date:   Wed Feb 26 22:37:09 2025 +0100

    x86/mm: Remove CONFIG_HIGHMEM64G support
    
    HIGHMEM64G support was added in linux-2.3.25 to support (then)
    high-end Pentium Pro and Pentium III Xeon servers with more than 4GB of
    addressing, NUMA and PCI-X slots started appearing.
    
    I have found no evidence of this ever being used in regular dual-socket
    servers or consumer devices, all the users seem obsolete these days,
    even by i386 standards:
    
     - Support for NUMA servers (NUMA-Q, IBM x440, unisys) was already
       removed ten years ago.
    
     - 4+ socket non-NUMA servers based on Intel 450GX/450NX, HP F8 and
       ServerWorks ServerSet/GrandChampion could theoretically still work
       with 8GB, but these were exceptionally rare even 20 years ago and
       would have usually been equipped with than the maximum amount of
       RAM.
    
     - Some SKUs of the Celeron D from 2004 had 64-bit mode fused off but
       could still work in a Socket 775 mainboard designed for the later
       Core 2 Duo and 8GB. Apparently most BIOSes at the time only allowed
       64-bit CPUs.
    
     - The rare Xeon LV "Sossaman" came on a few motherboards with
       registered DDR2 memory support up to 16GB.
    
     - In the early days of x86-64 hardware, there was sometimes the need
       to run a 32-bit kernel to work around bugs in the hardware drivers,
       or in the syscall emulation for 32-bit userspace. This likely still
       works but there should never be a need for this any more.
    
    PAE mode is still required to get access to the 'NX' bit on Atom
    'Pentium M' and 'Core Duo' CPUs.

If you have evidences and compelling arguments that this option is still needed, you need to contact developers.

This comment seems incorrect to me. I have a 32 bit Compaq nc6400 laptop here running Tumbleweed. Here is some system information.

We see below that the pae flag is set from an excerpt of inxi -Fxz

CPU:
 Info: dual core model: Intel T2400 bits: 32 type: MCP arch: M Yonah rev: 8
   cache: L1: 128 KiB L2: 2 MiB
 Speed (MHz): avg: 1000 min/max: 1000/1833 cores: 1: 1000 2: 1000
   bogomips: 7315
 Flags-basic: ht nx pae sse sse2 sse3 vmx

Here we see 4GiB total memory with 3.31 GiB used. This is because system BIOS allocates some memory to video.

:~> inxi -m
Memory:
 System RAM: total: 4 GiB available: 3.31 GiB used: 1.22 GiB (37.0%)
 Array-1: capacity: 4 GiB slots: 2 modules: 2 EC: None
 Device-1: DIMM #1 type: DDR2 size: 2 GiB speed: 667 MT/s
 Device-2: DIMM #2 type: DDR2 size: 2 GiB speed: 667 MT/s
:~> free -m
              total        used        free      shared  buff/cache   available
Mem:            3387        1071         292          37        2372        2315
Swap:           3391           0        3391
:~> uname -a
Linux Compaq-nc6400 6.17.7-1-pae #1 SMP PREEMPT_DYNAMIC Sun Nov  2 16:18:06 UTC 2025 (5d304cd) i686 i686 i386 GNU/Linux

A 6.17.7-1-pae kernel is installed and being used.

Side note: Firefox 145: A Major Release with 32-Bit Linux Support Dropped :< Firefox 145: A Major Release with 32-Bit Linux Support Dropped | Linux Journal compile Firefox on your own now or use Firefox 140.5.0 esr as long as you can.

@panorain OP is wanting to use more that 4GB of ram, have you tried putting more in that system?

The maximum amount of physical RAM is 4 GiB respectively for the Compaq nc6400.

Nothing you have shown contradicts what I said.

inix is reporting that your processor supports the pae extensions. That has nothing to do with if the kernel will use them.

You then show that there is only 4G ram available anyway so you wouldn’t know either way.

Then you show that the kernel is named PAE. That doesn’t mean really anything. If they stopped producing a package named -pae, you wouldn’t be able to automatically upgrade kernels. You can put any flag you want in the config, if the source doesn’t act on it, it doesn’t mean anything.

The actual commit that removed it has already been linked in the thread. I have no idea what you’re trying to argue against.

Thanks for the detailed explanation. The only compelling argument is entirely personal, i.e. I have a few servers, Proliant ML 150 Gen1 with 2 Xeon CPUs on the motherboard and an IBM server with exactly same hardware configuration. They are equipped with 12 GB RAM each. However it may not a convincing argument for the developers as they have to look at a broader picture.

That is actually my point. The PAE kernel does not access more than 3 GB RAM in my case. This has been explained by @arvidjaar .

Thank you for sharing this explanation.

I understand more about this now, this is a good thread. I do wish this current situation was changed.

@mhurron , I agree with your explanation. However I want to know if the source itself has dropped the HIGHMEM64G option (i.e. no header files and modules) or the compiled kernel does not have this option even though if one wants, he/she can get this configuration by passing the appropriate flags. I understand that if I compile a custom kernel, I have to keep compiling it everytime a new kernel is available.

@malcolmlewis , thanks for sharing the knowledge base. It appears to be some work for sure but not very difficult if carried out with discipline. However, as @mhurron mentioned, the source itself probably does not have this option.

What stops you from looking?

x86/mm: Remove CONFIG_HIGHMEM64G support - kernel/git/torvalds/linux.git - Linux kernel source tree

But looking at what this option and this patch did - this options mostly enabled CONFIG_X86_PAE. The 4G limit appears to be entirely artificial due to

 	if (max_pfn > MAX_NONPAE_PFN) {
 		max_pfn = MAX_NONPAE_PFN;
 		printk(KERN_WARNING MSG_HIGHMEM_TRIMMED);
 	}

As kernel-pae has CONFIG_X86_PAE enabled, commenting out this code (which was the second effect of the CONFIG_HIGHMEM64G) should allow access to memory above 4G.

I would even go further and argue that condition

#ifndef CONFIG_HIGHMEM64G

should have been replaced with

#ifndef CONFIG_X86_PAE

because that is what the code actually does. And that may be accepted by developers.

If you look at the code you will see that there is no option to override this artificial restriction. But you may raise it up with kernel developers. It does sound like a bug.

What stops you from looking?

Well, in principle nothing. But in reality, a lack of in-depth knowledge on my part. Probably the forums exist only for this reason. Thanks for the detailed explanation. I will try to understand your explanation.