答复: [PATCH 01/11] Initialize the mapping of KASan shadow memory
From: Liuwenliang Abbott Liu <hidden>
Date: 2018-02-26 13:09:37
Also in:
linux-mm
On Oct 19, 2017 at 19:09, Russell King - ARM Linux [mailto:linux at armlinux.org.uk] wrote:
On Thu, Oct 12, 2017 at 02:42:49AM +0300, Dmitry Osipenko wrote:quoted
On 11.10.2017 11:22, Abbott Liu wrote:quoted
+void __init kasan_map_early_shadow(pgd_t *pgdp) +{ + int i; + unsigned long start = KASAN_SHADOW_START; + unsigned long end = KASAN_SHADOW_END; + unsigned long addr; + unsigned long next; + pgd_t *pgd; + + for (i = 0; i < PTRS_PER_PTE; i++) + set_pte_at(&init_mm, KASAN_SHADOW_START + i*PAGE_SIZE, + &kasan_zero_pte[i], pfn_pte( + virt_to_pfn(kasan_zero_page), + __pgprot(_L_PTE_DEFAULT | L_PTE_DIRTY | L_PTE_XN)));Shouldn't all __pgprot's contain L_PTE_MT_WRITETHROUGH ?One of the architecture restrictions is that the cache attributes of all aliases should match (but there is a specific workaround that permits this, provided that the dis-similar mappings aren't accessed without certain intervening instructions.) Why should it be L_PTE_MT_WRITETHROUGH, and not the same cache attributes as the lowmem mapping?
Here is mapping the kasan shadow which is used at the early stage of kernel start(from start
of start_kernel to paging_init). At this stage we only read the kasan shadows, never write the
kasan shadows which is initialized to be zero.
We will map the kasan shadows again with flags PAGE_KERNEL:
pte_t * __meminit kasan_pte_populate(pmd_t *pmd, unsigned long addr, int node)
{
pte_t *pte = pte_offset_kernel(pmd, addr);
if (pte_none(*pte)) {
pte_t entry;
void *p = kasan_alloc_block(PAGE_SIZE, node);
if (!p)
return NULL;
entry = pfn_pte(virt_to_pfn(p), __pgprot(pgprot_val(PAGE_KERNEL)));
set_pte_at(&init_mm, addr, pte, entry);
}
return pte;
}