[PATCH 0/4] RFC: split text and linear mappings using tagged pointers

Mark Rutland mark.rutland at arm.com
Wed Mar 25 18:26:22 PDT 2015


Hi Ard,

On Mon, Mar 23, 2015 at 03:36:52PM +0000, Ard Biesheuvel wrote:
> This implements a split mapping of the kernel Image using the AArch64
> tagged pointers feature. The kernel text is emitted with bit 56 cleared,
> which can be used by the virt to phys translation to choose one translation
> regime or another.

This looks neat!

I definitely want to see the linear mapping decoupled from the text mapping,
but I'm rather worried by the prospect of tagged pointers in the kernel (there
are a lot of edge cases for those w.r.t. the preservations of the tag bits),
and if possible I'd like to avoid their use. I think that we can achieve the
same effect by reorganising the VA layout within the 56 bits we have to play
with.

Nit: please s/translation regime/mapping/ (or some other wording to that
effect) for these patches; the architectural definition of "translation regime"
differs from what you're referring to here, and we should avoid overloading
that terminology.

Thanks,
Mark.

> The purpose is to allow PHYS_OFFSET to start at an arbitrary offset below
> the kernel image, so that memory below the kernel Image can be used, allowing
> the Image to be loaded anywhere in physical memory.
>
> This series moves the kernel text right below PAGE_OFFSET, next to the modules
> area. PHYS_OFFSET is chosen to be a suitable aligned boundary somewhere below
> the kernel Image (1 GB or 512 MB depending on chosen page size).
> 
> Output from a QEMU/EFI boot:
> 
> System RAM:
>  memory[0x0]	[0x00000040000000-0x000000bfffffff], 0x80000000 bytes flags: 0x0
> 
> Kernel image:
>  reserved[0x0]	[0x0000005f680000-0x0000005fe68fff], 0x7e9000 bytes flags: 0x0
> 
> Virtual kernel memory layout:
>     vmalloc : 0xffffff8000000000 - 0xffffffbdbfff0000   (   246 GB)
>     vmemmap : 0xffffffbdc0000000 - 0xffffffbfc0000000   (     8 GB maximum)
>               0xffffffbdc1000000 - 0xffffffbdc3000000   (    32 MB actual)
>     fixed   : 0xffffffbff69fd000 - 0xffffffbff6c00000   (  2060 KB)
>     PCI I/O : 0xffffffbff6e00000 - 0xffffffbff7e00000   (    16 MB)
>     modules : 0xffffffbff8000000 - 0xffffffbffc000000   (    64 MB)
>     memory  : 0xffffffc000000000 - 0xffffffc080000000   (  2048 MB)
>       .init : 0xfeffffbffc783000 - 0xfeffffbffc7c6000   (   268 KB)
>       .text : 0xfeffffbffc080000 - 0xfeffffbffc782344   (  7177 KB)
>       .data : 0xfeffffbffc7ca000 - 0xfeffffbffc830c00   (   411 KB)
> 
> Note that this time, no relocations were harmed in the making of these
> patches. With added relocation support, it should be possible to move
> the combined modules and kernel text anywhere in the vmalloc area (for
> kaslr)
> 
> There are probably some places where the cleared bit 56 in the virtual
> address may cause trouble. Known problem is the module loader, but there
> are surely others.
> 
> 
> Ard Biesheuvel (4):
>   arm64: use tagged pointers to distinguish kernel text from the linear
>     mapping
>   arm64: fixmap: move translation tables to dedicated region
>   arm64: move kernel text below PAGE_OFFSET
>   arm64: align PHYS_OFFSET to block size
> 
>  arch/arm64/include/asm/linkage.h       |  2 ++
>  arch/arm64/include/asm/memory.h        | 27 +++++++++++++++++--
>  arch/arm64/include/asm/pgtable-hwdef.h |  1 +
>  arch/arm64/kernel/head.S               | 48 +++++++++++++++++++++++++---------
>  arch/arm64/kernel/vmlinux.lds.S        | 19 +++++++++-----
>  arch/arm64/mm/mmu.c                    | 21 +++++++++------
>  arch/arm64/mm/proc.S                   |  3 ++-
>  7 files changed, 91 insertions(+), 30 deletions(-)
> 
> -- 
> 1.8.3.2
> 
> 



More information about the linux-arm-kernel mailing list