August 14th, 2023, 09:19 UTC

Embedded Rust

RAM is mapped into the address space

The Embedded Rust Book says:

Where are Flash memory and RAM mapped in the address space? e.g. RAM is commonly located at address 0x2000_0000.

RAM is mapped into the address space the same as anything else! Mind blown 🤯 This never quite gelled in my mind until now.

Previously I had thought that RAM began at address 0x0000_0000 and that non-RAM hardware was mapped into RAM (waves hands) somehow. I had imagined that null pointers were also 0x0000_0000 and that everyone agreed that the first addressable location in RAM was unused!

Update: Hilariously, I wasn’t entirely wrong. Read the following from Putting the “You” in CPU:

Aside: cursed ELF fact

In certain situations, binfmt_elf has to map the first page of memory to zeroes. Some programs written for UNIX System V Release 4.0 (SVr4), an OS from 1988 that was the first to support ELF, rely on null pointers being readable. And somehow, some programs still rely on that behavior.

It seems like the Linux kernel dev implementing this was a little disgruntled:

“Why this, you ask??? Well SVr4 maps page 0 as read-only, and some applications ‘depend’ upon this behavior. Since we do not have the power to recompile these, we emulate the SVr4 behavior. Sigh.”