tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: [Milkymist port] virtual memory management



On Feb 10, 2014, at 9:10 AM, Eduardo Horvath <eeh%NetBSD.org@localhost> wrote:

> On Sun, 9 Feb 2014, Yann Sionneau wrote:
> 
>> Thank you for your answer Matt,
>> 
>> Le 09/02/14 19:49, Matt Thomas a écrit :
>>> On Feb 9, 2014, at 10:07 AM, Yann Sionneau 
>>> <yann.sionneau%gmail.com@localhost> wrote:
> 
> 
>>>> Since the kernel runs with MMU on, using virtual addresses, it cannot
>>>> dereference physical pointers then it cannot add/modify/remove PTEs,
>>>> right?
>>> Wrong.  See above.
>> You mean that the TLB contains entries which map a physical address to 
>> itself?
>> like 0xabcd.0000 is mapped to 0xabcd.0000? Or you mean all RAM is always
>> mapped but to the (0xa000.000+physical_pframe) kind of virtual address you
>> mention later in your reply?
> 
> What I did for BookE is reserve the low half of the kernel address space 
> for VA=PA mappings.  The kernel resides in the high half of the address 
> space.  I did this because the existing PPC port did strange things with 
> BAT registers to access physical memory and copyin/copyout operations and 
> I couldn't come up with a better way to do something compatible with the 
> BookE MMU.  It did limit the machine to 2GB RAM, which wasn't a problem 
> for the 405GP.

For the MPC85xx, I did something similar but I used fixed TLB1 entries
to map the physical ram 1:1 with VA=PA mappings.

> Also, the user address space is not shared with the kernel address space 
> as on most machines.  Instead, user processes get access to their own 4GB 
> address space, and the kernel has 2GB to play with when you deduct the 2GB 
> VA==PA region.  (It's the same sort of thing I did for sparc64 way back 
> when it was running 32-bit userland.  But it doesn't need VA==PA mappings 
> and can access physical and userland addresses while the kernel address 
> space is active.  Much nicer design.)

BookE could have avoided the VA==PA mappings but it simplifies a lot of things.

> When a BookE machine takes an MMU miss fault, the fault handler examines 
> the faulting address if the high bit is zero, it synthesizes a TLB entry 
> where the physical address is the same as the virtual address.  If the 
> high bit is set, it walks the page tables to find the TLB entry.

Not true for the MPC85xx BookE.  Then a trap happens, the PSL[PR] bit gets
reset along with the PSL[DS] and PSL[IS] bits.  This forces the MMU to only
match the match TLB entries with a MAS1[TS] == 0 (e.g. kernel TLB entries).

> This did make the copyin/copyout operations a bit complicated since it 
> requires flipping the MMU between two contexts while doing the copy 
> operation.

Well, for the MPC85xx, I only set the PSL[DS] bit so I can access the
user address space, load/store stuff to/from register, and then reset it back.
It's not as fast as I'd like but it works.

>>>> Also, is it possible to make sure that everything (in kernel space) is
>>>> mapped so that virtual_addr = physical_addr - RAM_START_ADDR +
>>>> virtual_offset
>>>> In my case RAM_START_ADDR is 0x40000000 and I am trying to use
>>>> virtual_offset of 0xc0000000 (everything in my kernel ELF binary is mapped
>>>> at virtual address starting at 0xc0000000)
>>>> If I can ensure that this formula is always correct I can then use a very
>>>> simple macro to translate "statically" a physical address to a virtual
>>>> address.
>>> Not knowing how much ram you have, I can only speak in generalities.
>> I have 128 MB of RAM.
>>> But in general you reserve a part of the address space for direct mapped
>>> memory and then place the kernel about that.
>>> 
>>> For instance, you might have 512MB of RAM which you map at 0xa000.0000
>>> and then have the kernel's mapped va space start at 0xc000.0000.
>> So if I understand correctly, the first page of physical ram (0x4000.0000) is
>> mapped at virtual address 0xa000.0000 *and* at 0xc000.0000 ?
>> Isn't it a problem that a physical address is mapped twice in the same 
>> process
>> (here the kernel)?
>> My caches are VIPT, couldn't it generate cache aliases issues?
> 
> If the MMU is always on while the kernel is running, and covers all of the 
> KVA, then you could relocate the kernel text and data segments wherever 
> you want them to be.  If you want to put the kernel text and data segments 
> in the direct-mapped range, you can easily do that.  If you want it 
> elsewhere, that should work too.  

In fast, I'd recommend doing that.  Leaving the mapped KVA space for those
things that need to dynamically mapped.

> The cache aliasing issues in VIPT caches only occur if the cache way size 
> is larger than the page size.  If you're designing your own hardware, 
> don't do that.  Otherwise, remember to only access a page through a single 
> mapping and you won't have aliasing issues.  And flush the page from the 
> cache wenever establishing a new mapping.

I agree.  You can play other games with VIPT but it becomes complex quickly.


Home | Main Index | Thread Index | Old Index