Changing virtual adress space layout
deveshkr at marvell.com
Fri Jan 28 13:36:27 UTC 2011
Thank you very much for your detail response. Trick of not changing KERNVIRTADDR worked.
I was able to map 1GB of RAM into kva from KERNBASE(0x8000_0000) to OLD_KERNBASE(0xC000_0000) using pmap_map_chunk api.
I was able to write some data into mapped space and print it back.
But some doubt I still have
1) What is L1 and L2 page table in FreeBSD? Is there document which explains these vm concepts for arm?
2) How do I verify that this mapping indeed happened?
Thanks & Regards
From: Mark Tinguely [mailto:marktinguely at gmail.com]
Sent: Wednesday, January 26, 2011 9:08 PM
To: Devesh Rai
Cc: freebsd-arm at freebsd.org
Subject: Re: Changing virtual adress space layout
Reading your reply, it sounds like you want to directly map a full 1GB
to the KVA. The upper 1GB will always be partially used; for example it
has HIGH_VECTOR, and device mappings. So it sounds like you should set
KERNBASE to 0x8000_0000, map the RAM at 0x8000_0000 and leave the
KERNVIRTADDR where is was.
The 1GB memory should be physically contiguous and properly aligned, so
you be able to directly add the addresses into the KVA "level 1
pagetable entries" either manually or with pmap_map_chunk().
Sorry, I do not have my development machine, so I can't do the
background work. Does changing the KERNBASE into a makeoption really
overriding the static define in /sys/arm/include/vm_machdep.h? A "cc -E"
(for example initarm() source file) would answer that question. The
other place to look would be in /sys/conf, but after a quick look, I did
not see any hardcoded values in the ARM specific files.
Also, the KERNVIRTADDR does not equal KERNBASE on many ARM platforms ;
the boot loader may have put the kernel text at an offset to pass
parameters, and some older families use the ARM_USE_SMALL_ALLOC feature
- a form of direct ARM pagetable map. For example, the Sheeva port has
the KERNPHYSADDR/KERNVIRTADDR at 0x00900000/0xc0900000.
On 1/26/2011 8:34 AM, Devesh Rai wrote:
> Hi Mark,
> Actually I want to map large portion of RAM in kernel virtual address space.
> To achieve this in Linux, I did following
> 1) boot kernel with 256M by setting CONFIG_CMDLINE="mem=256M". This freed up more than 1GB of RAM for my module usages
> 2) increase KVA to 3GB by setting CONFIG_VMSPLIT_1G=y ( 1G for user and 3GB for kernel)
> 3) ioremap unused RAM ( 2GB - 256MB ) into Kernel virtual address space.
> Changing KERNBASE and KERNVIRTADDR "makeoption" from 0xc0000000 to 0x80000000 did not worked for me. Kernel hang while loading.
> Thanks& Regards
> -----Original Message-----
> From: Mark Tinguely [mailto:marktinguely at gmail.com]
> Sent: Thursday, January 13, 2011 10:00 PM
> To: freebsd-arm at freebsd.org
> Cc: Devesh Rai
> Subject: Re: Changing virtual adress space layout
> On 1/13/2011 1:30 AM, Devesh Rai wrote:
>> I am new to FreeBSD. Can some tell how to change virtual address space layout in FreeBSD for arm?
>> For x86, KVA_PAGES=N option is there in FreeBSD. In Linux, I used CONFIG_VMSPLIT option.
>> I am looking corresponding option for arm.
> I assume you have run out of space for the device virtual addresses.
> KERNBASE is hard coded in sys/arm/include/vm_param.h to be 0xc0000000.
> There is a related variable for each device configuration: the
> KERNVIRTADDR "option" and "makeoption" values. This is usually in one
> of the "std" file file for the device. KERNVIRTADDR sets the starting
> location of the executable and is sometimes different than KERNBASE.
> The arm code does not map the from KERNBASE to 0xffff_ffff into the KVA.
> Instead, there is a variable that determines the maximum size of the
> kernel executable and kernel virtual address area. Above this defined
> area lies the no-cache remap memory region, device map area, high
> vector, etc.
> On a tangent note: There will be a great advantage in ARMv6/ARMv7 to go
> to a 2GB UVA / 2GB KVA.
More information about the freebsd-arm