参考板:i.mx6q sabresd,内核版本:4.9.17
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 4.9.17-04736-ga88711e-dirty (mrigendra.chaubey@CPU-384U) (gcc version 4.9.x 20150123 (prerelease) (GCC) ) #6 SMP PREEMPT Sun Jul 8 12:13:44 IST 2018
[ 0.000000] CPU: ARMv7 Processor [412fc09a] revision 10 (ARMv7), cr=10c53c7d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[ 0.000000] OF: fdt:Machine model: Freescale i.MX6 Quad SABRE Smart Device Board
[ 0.000000] cma: Reserved 448 MiB at 0x2a000000
[ 0.000000] Memory policy: Data cache writealloc
[ 0.000000] ##DEBUGsmb_tlb.c: flush_tlb_kernel_range1
[ 0.000000] ##DEBUGsmb_tlb.c: start: da000000 end: f6000000
[ 0.000000] ##DEBUGsmb_tlb.c: flush_tlb_kernel_range2
[ 0.000000] percpu: Embedded 15 pages/cpu @f6eb6000 s31040 r8192 d22208 u61440
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 260368
[ 0.000000] 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=071f21d4d72d7372 androidboot.soc_type=imx6q androidboot.storage_type=sd gpt
[ 0.000000] PID hash table entries: 4096 (order: 2, 16384 bytes)
[ 0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
[ 0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
[ 0.000000] Memory: 556280K/1048576K available (13312K kernel code, 1121K rwdata, 4300K rodata, 1024K init, 612K bss, 33544K reserved, 458752K cma-reserved, 139264K highmem)
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
[ 0.000000] vmalloc : 0xf8000000 - 0xff800000 ( 120 MB)
[ 0.000000] lowmem : 0xc0000000 - 0xf7800000 ( 888 MB)
上面的日志来自一个工作的 sabresd 板。我的源代码取自 nxp 的 android O 源代码。
我在我们的定制板上移植了 android,它类似于 sabresd 并且基于 imx6q 。我移植的内核卡住了。这是日志,
Uncompressing Linux... done, booting the kernel.
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 4.9.17 (mrigendra.chaubey@CPU-384U) (gcc version 4.9.x 20150123 (prerelease) (GCC) ) #23 SMP PREEMPT Sat Jul 7 23:29:19 IST 2018
[ 0.000000] CPU: ARMv7 Processor [412fc09a] revision 10 (ARMv7), cr=10c53c7d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[ 0.000000] OF: fdt:Machine model: Freescale i.MX6 MYSABRE Board
[ 0.000000] bootconsole [earlycon0] enabled
[ 0.000000] cma: early_cma(448M)
[ 0.000000] cma: dma_contiguous_reserve(limit ffffffff)
[ 0.000000] cma: dma_contiguous_reserve: reserving 448 MiB for global area
[ 0.000000] cma: cma_declare_contiguous(size 0x1c000000, base 0x00000000, limit 0x50000000 alignment 0x00000000)
[ 0.000000] cma: Reserved 448 MiB at 0x2a000000
[ 0.000000] Memory policy: Data cache writealloc
[ 0.000000] ##DEBUGmmu.c: build_mem_type_table done
[ 0.000000] ##DEBUGmmu.c: build_mem_type_table done
[ 0.000000] ##DEBUGmmu.c: prepare_page_table done
[ 0.000000] ##DEBUGmmu.c: map_lowmem done
[ 0.000000] ##DEBUGmmu.c: memblock_set_current_limit done
[ 0.000000] ##DEBUGdna-mapping.c: dma_contiguous_remap1
[ 0.000000] ##DEBUGdna-mapping.c: dma_contiguous_remap2
[ 0.000000] ##DEBUGsmb_tlb.c: flush_tlb_kernel_range1
[ 0.000000] ##DEBUGsmb_tlb.c: start: da000000 end: f6000000
两个板都配置为 vmsplit_3g。
由于某些我无法找到的问题,我的 setup_arch 调用未完成,这是调用流程
start_kernel > setup_arch > paging_init > dma_contiguous_remap > flush_kernel_tlb_range > local_flush_tlb_range
一件事我无法理解此功能的去向
local_flush_tlb_kernel_range(start, end);
我在函数 flush_tlb_kernel_range 中的 local_flush_tlb_kernel_range(start, end) 调用上方打印的开始和结束。
在我的情况下,在 nxp saber 的情况下,这是 local_flush_tlb_kernel_range 变为
struct cpu_tlb_fns {
void (*flush_user_range)(unsigned long, unsigned long, struct vm_area_struct *);
void (*flush_kern_range)(unsigned long, unsigned long);
unsigned long tlb_flags;
};
/*
* Select the calling method
*/
#ifdef MULTI_TLB
#define __cpu_flush_user_tlb_range cpu_tlb.flush_user_range
#define __cpu_flush_kern_tlb_range cpu_tlb.flush_kern_range
#else
xx
#define __cpu_flush_user_tlb_range __glue(_TLB,_flush_user_tlb_range)
#define __cpu_flush_kern_tlb_range __glue(_TLB,_flush_kern_tlb_range)
extern void __cpu_flush_user_tlb_range(unsigned long, unsigned long, struct vm_area_struct *);
extern void __cpu_flush_kern_tlb_range(unsigned long, unsigned long);
所以我认为内核flush_kern_range中的某个地方会被定义,但我找不到那个定义
由于两个工作区不同,我的日志中有一些额外的##DEBUGfile.c。
我的想法是 setup_arch 与我的板子特定功能无关,它是对所有 arm 架构的通用调用。
我试图将 sabresd dtb 放在 uboot 中,这样如果在其中完成与内存相关的事情,至少会发生很多初始化,结果与此相同。
试图放置 pr_info 直到我找不到函数 flush_kern_range 的定义。在 nxp sabre 中,这个函数被一次又一次地调用。
任何人都可以帮助我解决一些问题。