Help with head_64.S

lichangshou chungzhou at gmail.com
Sun Jan 9 01:30:02 EST 2011


The same problem I asked before.  I want to modify kernel image's page table
from 2M to 4K.

In arch/x86/kernel/head_64.S, I add another level page table, make pmd point
to the new page table. However, after compile and boot it, the kernel cannot
work and always reboot.

I try many kind of port, it still cannot work normally.


Here is the context of my modified code :
-----------------------------------------------------
/* Automate the creation of 1 to 1 mapping pmd entries */
#define PMDS(START, PERM, COUNT)            \
    i = 0 ;                     \
    .rept (COUNT) ;                 \
    .quad   (START) + (i << PMD_SHIFT) + (PERM) ;   \
    i = i + 1 ;                 \
    .endr

#define PTDS(START, PERM, COUNT)            \
    i = 0 ;                     \
    .rept (COUNT) ;                 \
    .quad   (START) + (i << PAGE_SHIFT) + (PERM) ;  \
    i = i + 1 ;                 \
    .endr

    .data
    /*
     * This default setting generates an ident mapping at address 0x100000
     * and a mapping for the kernel that precisely maps virtual address
     * 0xffffffff80000000 to physical address 0x000000. (always using
     * 2Mbyte large pages provided by PAE mode)
     */
NEXT_PAGE(init_level4_pgt)
    .quad   level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE
    .org    init_level4_pgt + L4_PAGE_OFFSET*8, 0
    .quad   level3_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE
    .org    init_level4_pgt + L4_START_KERNEL*8, 0
    /* (2^48-(2*1024*1024*1024))/(2^39) = 511 */
    .quad   level3_kernel_pgt - __START_KERNEL_map + _PAGE_TABLE

NEXT_PAGE(level3_ident_pgt)
    .quad   level2_ident_pgt - __START_KERNEL_map + _KERNPG_TABLE
    .fill   511,8,0

NEXT_PAGE(level3_kernel_pgt)
    .fill   L3_START_KERNEL,8,0
    /* (2^48-(2*1024*1024*1024)-((2^39)*511))/(2^30) = 510 */
    .quad   level2_kernel_pgt - __START_KERNEL_map + _KERNPG_TABLE
    .quad   level2_fixmap_pgt - __START_KERNEL_map + _PAGE_TABLE

NEXT_PAGE(level2_fixmap_pgt)
    .fill   506,8,0
    .quad   level1_fixmap_pgt - __START_KERNEL_map + _PAGE_TABLE
    /* 8MB reserved for vsyscalls + a 2MB hole = 4 + 1 entries */
    .fill   5,8,0

NEXT_PAGE(level1_fixmap_pgt)
    .fill   512,8,0

NEXT_PAGE(level2_ident_pgt)
    /* Since I easily can, map the first 1G.
     * Don't set NX because code runs from these pages.
     */
    PMDS(0, __PAGE_KERNEL_IDENT_LARGE_EXEC, PTRS_PER_PMD)

NEXT_PAGE(level2_kernel_pgt)
    /*
     * 512 MB kernel mapping. We spend a full page on this pagetable
     * anyway.
     *
     * The kernel code+data+bss must not be bigger than that.
     *
     * (NOTE: at +512MB starts the module area, see MODULES_VADDR.
     *  If you want to increase this then increase MODULES_VADDR
     *  too.)
     */
/*  PMDS(0, __PAGE_KERNEL_LARGE_EXEC,
        KERNEL_IMAGE_SIZE/PMD_SIZE)*/
#define NEW_PMD_PORT (0x0 | _PAGE_PRESENT | _PAGE_RW |  _PAGE_ACCESSED)
    PMDS(level1_kernel_pgt - __START_KERNEL_map, NEW_PMD_PORT, PTRS_PER_PMD)

NEXT_PAGE(level1_kernel_pgt)
#define NEW_PTD_PORT (0x0 | _PAGE_PRESENT | _PAGE_RW | |_PAGE_USER |
_PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_GLOBAL)
    PTDS(0, NEW_PTD_PORT, KERNEL_IMAGE_SIZE/PAGE_SIZE)

NEXT_PAGE(level2_spare_pgt)
    .fill   512, 8, 0
----------------------------------------------------------------------------------------------
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20110109/b0824acb/attachment.html 


More information about the Kernelnewbies mailing list