我想了解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将其放在命令行中?
任何帮助或指导都将非常有帮助。