无法了解此内核功能和android内核命令行

时间:2018-07-08 14:35:20

标签: android c assembly command-line kernel

我想了解linux内核4.9.17中这两个函数的发生情况

smp_tlb.c

void flush_tlb_kernel_range(unsigned long start, unsigned long end)
{
    if (tlb_ops_need_broadcast()) {
        struct tlb_args ta;
        ta.ta_start = start;
        ta.ta_end = end;
        on_each_cpu(ipi_flush_tlb_kernel_range, &ta, 1);
    } else          
        local_flush_tlb_kernel_range(start, end);//becomes v7wbi_flush_kern_tlb_range(start, end);

    broadcast_tlb_a15_erratum();
}

tlb_v7.S

/*
 *  v7wbi_flush_kern_tlb_range(start,end)
 *
 *  Invalidate a range of kernel TLB entries
 *
 *  - start - start address (may not be aligned)
 *  - end   - end address (exclusive, may not be aligned)
 */
ENTRY(v7wbi_flush_kern_tlb_range)
    dsb ish
    mov r0, r0, lsr #PAGE_SHIFT     @ align address
    mov r1, r1, lsr #PAGE_SHIFT
    mov r0, r0, lsl #PAGE_SHIFT
    mov r1, r1, lsl #PAGE_SHIFT
1:
#ifdef CONFIG_ARM_ERRATA_720789
    ALT_SMP(mcr p15, 0, r0, c8, c3, 3)  @ TLB invalidate U MVA all ASID (shareable)
#else
    ALT_SMP(mcr p15, 0, r0, c8, c3, 1)  @ TLB invalidate U MVA (shareable)
#endif
    ALT_UP(mcr  p15, 0, r0, c8, c7, 1)  @ TLB invalidate U MVA
    add r0, r0, #PAGE_SZ
    cmp r0, r1
    blo 1b
    dsb ish
    isb
    ret lr
ENDPROC(v7wbi_flush_kern_tlb_range)

因为我没有调试器,所以我的内核在调用local_flush_tlb_kernel_range(start,end)之后停止。而且我不知道如何在此汇编文件中进行调试。

我也是从Android的sabresd内核命令行复制了

Kernel command line: console=ttymxc0,115200 init=/init earlyprintk video=mxcfb0:dev=ldb,fbpix=RGB32,bpp=32 video=mxcfb1:off video=mxcfb2:off video=mxcfb3:off vmalloc=128M androidboot.console=ttymxc0 consoleblank=0 androidboot.hardware=freescale cma=448M galcore.contiguousSize=33554432 buildvariant=userdebug androidboot.serialno=110f91d4ea9ac958 androidboot.soc_type=imx6qp androidboot.storage_type=sd gpt

任何人都可以告诉这些变量对内核意味着什么

vmalloc=128M
cma=448M
galcore.contiguousSize=33554432
androidboot.serialno=110f91d4ea9ac958

我应如何更改这些内容?我该如何交叉检查这些是我想要的正确命令行选项?

在命令行中,它需要448MiB的连续区域,用于vmalloc 128M。但是vmalloc区域本身不是必须连续的吗,那么为什么要使用两个单独的变量呢?

现在sabresd具有1GB DDR3内存,即448+ 128+ 32 = 608MiB。如果将那么多的内存分配为连续的块,则内核内存将非常小,而用户地址空间将更小。我的理解正确吗?

什么是androidboot.serialno?为什么Android将其放在命令行中?

任何帮助或指导都将非常有帮助。

0 个答案:

没有答案