1

参考板: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。

  1. 我的想法是 setup_arch 与我的板子特定功能无关,它是对所有 arm 架构的通用调用。

  2. 我试图将 sabresd dtb 放在 uboot 中,这样如果在其中完成与内存相关的事情,至少会发生很多初始化,结果与此相同。

  3. 试图放置 pr_info 直到我找不到函数 flush_kern_range 的定义。在 nxp sabre 中,这个函数被一次又一次地调用。

任何人都可以帮助我解决一些问题。

4

0 回答 0