Understanding the mapping of physical memory to kernel address space

Arun KS getarunks at gmail.com
Sun Mar 15 03:47:29 EDT 2015


Hello Sunny,

On Sat, Mar 14, 2015 at 8:25 PM, Sunny Shah <shahsunny715 at gmail.com> wrote:
> Thank you guys!
>
> I have two more questions from your replies:
>
> I thought I had understood HIGH_MEM and LOW_MEM, but it appears I was wrong.
> Does the concept of high memory/low memory correspond to physical address
> space or virtual address space? Also, does LOW_MEM always have to be 1 GiB
> maximum?

Physical memory is divided into HIGH_MEM and LOW_MEM.
Why do we need two memory?  To understand this, we need to know who
all are consumers of kernel virtual address(KVA) which is limited to
1GB(in case of 3:1 split).
1. low mem( physical ram which has linear mapping to KVA).
2. IO memory address(for eg a DMA controller registers, Memory
controller register, etc). When MMU is enabled all the address
generated by the cpu are virtual address. Hence io memory should have
a valid virtual to physical memory mapping.
3. Vmalloc address space. A dynamic kernel memory allocation
mechanism, which only guarantees continuity in virtual address space.
4. Persistent kernel map. (if kernel want to use HIGH memory, it maps
high memory to this portion of virtual address).
5. vector table.

Let me give a rough calculation for a better understanding. Lets say a
system with configuration as follows,
2GB of physical RAM, 40 MB of physical io address space, 240 MB of
vmalloc address space, 32 MB for persistent kernel map
The maximum RAM which can be mapped as low mem = 1GB - (40 MB + 240 MB
+ 32MB) = 712MB.

Rest of RAM 1336MB( 1GB - 712MB) will fall as HIGH_MEM.

Now how system uses HIGH memory. Major user of HIGH mem is user space
code. Kernel directly maps high mem to user space virtual address.
Hight mem is also used by kernel though PK mappings. Even vmalloc
allocation can also fall from HIGH mem region.

Now if we decides to use 1:3 user space to kernel space split, high
memory is not required. Because we have plenty of kernel virtual
address(3GB) and can easily map 2GB of RAM in to it.

HTH.

Thanks,
Arun

> For a RAM of  896 MiB - 4096 MiB, the book says:
> "In this case, the RAM cannot be mapped entirely into the kernel linear
> address space. The best Linux can do during the initialization phase is to
> map a RAM window of size 896 MB into the kernel linear address space."
>
> Why is there a need to map the whole RAM into the kernel space (the usage of
> the word "entirely") ? Shouldn't it be only LOW_MEM ? Or am I confusing the
> two things here ?
>
>
> I believe all doubts are pointing to the concepts of LOW_MEM and HIGH_MEM,
> but I'm still not being able to wrap my head around them.
>
> Thanks,
> Sunny
>
> On Thu, Mar 12, 2015 at 11:49 PM, Jeff Haran <Jeff.Haran at citrix.com> wrote:
>>
>> -----Original Message-----
>> From: kernelnewbies-bounces at kernelnewbies.org
>> [mailto:kernelnewbies-bounces at kernelnewbies.org] On Behalf Of Arun KS
>> Sent: Thursday, March 12, 2015 11:03 AM
>> To: Sunny Shah
>> Cc: kernelnewbies
>> Subject: Re: Understanding the mapping of physical memory to kernel
>> address space
>>
>> Hello Sunny,
>>
>> On Thu, Mar 12, 2015 at 10:32 PM, Sunny Shah <shahsunny715 at gmail.com>
>> wrote:
>> > Hello,
>> >
>> > This is my first mail on this list, so please let me know if I'm erring.
>> >
>> > I'm reading Bovet and Cesati's "Understanding the Linux Kernel",
>> > specifically the chapter "Memory Addressing", sub-section "Kernel Page
>> > Tables". Here they describe how Linux initializes its page tables for
>> > various RAM sizes and how much of the physical address space is mapped
>> > onto the kernel virtual address space.
>> >
>> > I have several questions from my reading:
>> >
>> > My understanding is that the 32 bit virtual address space of a process
>> > is split into 2 parts - the first 3 GiB for the user space and the
>> > remaining 1GiB for the kernel (with the same kernel mapping being used
>> > for all processes. However, although the kernel is mapped into the
>> > higher portion of the address space, it resides in the lower 1 GiB of
>> > RAM. Is this correct?
>> Yes. Incase of 3:1 mapping, kernel virtual address starts at 0xc0000000.
>> You can also have 2:2 mappings aswell. It is a configurable option
>>
>> Just an FYI, I've seen 1:3 mapping too. We had to do that with the kernels
>> we built
>> when I was at one company because we needed 3GB of virtual address space
>> to map all
>> of the memory mapped registers on their ASICs.
>>
>> There's lots of options here.
>>
>> Jeff Haran
>>
>>
>



More information about the Kernelnewbies mailing list