Qualcomm
本文主要总结高通8996相关的一些知识,包括lk,驱动等
HZero.chen
随风潜入夜,润物细无声
展开
-
arm64_linux head.S的执行流程(3.18)- 12.msm8996 地址空间布局
1.前言本文基于高通8996平台,kernel版本为3.18.31。2. 8996内存地址空间布局通过启动时的打印信息可以知道kernel image的虚拟地址空间布局如下:结合bootloader(lk)对kernel image解压重定位的过程,我们可以知道,kernel image物理空间布局和虚拟空间布局如下:参考文档1.https://blog.csdn.net/xichangbao/article/details/515687822.https://www.cnblogs.co原创 2020-12-14 08:39:35 · 431 阅读 · 1 评论 -
arm64_linux head.S的执行流程(3.18)- 11.stext之__switch_data
1.前言本文基于高通8996平台,kernel版本为3.18.31。本文主要介绍head.S的__switch_data执行流程2. __switch_data这段代码分成两个部分,一部分是清BSS,另外一部分是为进入c代码做准备(主要是stack)。 .align 3 .type __switch_data, %object__switch_data: .quad __mmap_switched .quad __bss_start // x6 .quad __bss_stop原创 2020-12-12 16:07:01 · 421 阅读 · 0 评论 -
arm64_linux head.S的执行流程(3.18)- 10.stext之__enable_mmu
1.前言本文基于高通8996平台,kernel版本为3.18.31。本文主要介绍head.S的__enable_mmu执行流程根据前面对于lk的分析,系统启动后,lk会将kernel image copy到main memory,和虚拟地址空间类似,kernel image并没有copy到main memory的首地址,也保持了一个同样size的offset。现在,问题又来了:在kernel的开始运行阶段,MMU是OFF的,也就是说kernel image是直接运行在物理地址上的,但是实际上kern原创 2020-12-12 15:57:32 · 409 阅读 · 0 评论 -
arm64_linux head.S的执行流程(3.18)- 9.stext之__cpu_setup
1.前言本文基于高通8996平台,kernel版本为3.18.31。本文主要介绍head.S的__cpu_setup执行流程2. __cpu_setup主要对cpu相关进行设置。在调用__cpu_setup之前设定了lr的内容是__enable_mmu,而调用__cpu_setup使用的是b而不是bl指令,因此lr寄存器没有修改,因此,这里的ret返回到__enable_mmu函数#arch/arm64/mm/proc.S/* * __cpu_setup * * In原创 2020-12-12 15:48:54 · 564 阅读 · 0 评论 -
arm64_linux head.S的执行流程(3.18)- 8.stext之__create_page_tables
1.前言本文基于高通8996平台,kernel版本为3.18.31。本文主要介绍head.S的__create_page_tables执行流程2. 页表基础知识PGD(Page Global Directory)对应Level 0 translation tablePUD (Page Upper Directory) 对应Level 1 translation tablePMD (Page Middle Directory) 对应Level 2 translation tablePTE (原创 2020-12-12 15:39:43 · 618 阅读 · 1 评论 -
arm64_linux head.S的执行流程(3.18)- 7.stext之__vet_fdt
1.前言本文基于高通8996平台,kernel版本为3.18.31。本文主要介绍head.S的__vet_fdt执行流程2.__vet_fdt/* * Determine validity of the x21 FDT pointer. * The dtb must be 8-byte aligned and live in the first 512M of memory. */__vet_fdt:// x21存放dtb地址,是否8字节对齐 tst x21, #0x7 // 不对齐直原创 2020-12-12 14:16:03 · 240 阅读 · 0 评论 -
arm64_linux head.S的执行流程(3.18)-6.stext之lookup_processor_type
1.前言在执行lookup_processor_type之前,head.S流程中会通过如下操作将参数x0传递给lookup_processor_type// Move from State register to Register,x22=cpuid //获取当前cpu id,保存在x22 mrs x22, midr_el1 // 将当前cpuid作为参数传递给lookup_processor_type mov x0, x22// 查看cpu类型,并保存到X原创 2020-12-12 13:46:15 · 258 阅读 · 0 评论 -
arm64_linux head.S的执行流程(3.18)- 5.stext之set_cpu_boot_mode_flag
1.前言本文基于高通8996平台,kernel版本为3.18.31。本文主要介绍head.S的el2_setup执行流程2.set_cpu_boot_mode_flag/* * Sets the __boot_cpu_mode flag depending on the CPU boot mode passed * in x20. See arch/arm64/include/asm/virt.h for more info. */ENTRY(set_cpu_boot_mode_flag)原创 2020-12-12 13:31:19 · 283 阅读 · 0 评论 -
arm64_linux head.S的执行流程(3.18)- 4.stext之calc_phys_offset
1.前言本文基于高通8996平台,kernel版本为3.18.31。本文主要介绍head.S的calc_phys_offset执行流程2. 几个宏定义PHYS_OFFSET#arch/arm64/include/asm/memory.h/* PHYS_OFFSET - the physical address of the start of memory. */#define PHYS_OFFSET ({ memstart_addr; })内存的起始物理地址PAGE_OFFSET原创 2020-12-12 11:39:40 · 786 阅读 · 0 评论 -
arm64_linux head.S的执行流程(3.18)- 3.stext之el2_setup
1.前言本文基于高通8996平台,kernel版本为3.18.31。本文主要介绍head.S的el2_setup执行流程2. el2_setup/* * If we're fortunate enough to boot at EL2, * ensure that the world is sane before dropping to EL1. * * Returns either BOOT_CPU_MODE_EL1 or BOOT_CPU_MODE_EL2 in x20 if * b原创 2020-12-12 10:55:44 · 528 阅读 · 0 评论 -
arm64_linux head.S的执行流程(3.18)- 2.总体流程
1.前言本文基于高通8996平台,kernel版本为3.18.31。本文主要介绍head.S执行的整体流程2. head.S执行前bootloader在跳转到kernel前,需要确保如下设置:MMU = off, D-cache = off, I-cache = on or offx0 = physical address to the FDT blobkernel的入口在arch\arm64\kernel\head.S中。b stext // 跳转到stext3. stext执行原创 2020-12-12 10:36:48 · 664 阅读 · 0 评论 -
arm64_linux head.S的执行流程(3.18)- 1.概述
1.前言本文基于高通8996平台,kernel版本为3.18.31。在lk执行的最后会调用boot_linux,它是通过SMC #0指令引发异常,从而进入到secure world,当然异常处理是位于QSEE,这部分代码没有开放,但是我们相应的通过参数传递了解压后的kernel image的地址和dtb的地址,按照arm boot specific我们有理由相信QSEE会将dtb地址赋值给x0,并跨过kernel image的偏移TEXT_OFFSET,执行head.S的第一条指令。2.如何执行到he原创 2020-12-11 15:29:31 · 1238 阅读 · 0 评论 -
高通8996启动流程-4. lk启动之mkbootimg工具
1.前言Android在编译过程中会调用mkbootimg命令,mkbootimg是生成boo.img的命令,boot.img中包含了kernel, dtb, ramdisk等。2. mkbootimg工具原理我们通过查看安卓在编译过程中的输出信息可以看到如下:/bin/bash -c "(out/host/linux-x86/bin/mkbootimg --kernel out/target/product/G0335D/kernel --ramdisk out/target/product/G原创 2020-12-11 17:17:38 · 910 阅读 · 0 评论 -
高通8996启动流程-4. lk启动之boot_linux_from_mmc
1.前言本文档主要对MSM8996的启动流程进行一个简要的分析,目的在于展现启动流程的概貌,不会对每个细节做很详细的表述,但会对启动流程的关键节点进行重点说明。在lk正常启动时会进入boot_linux_from_mmc。2. boot_linux_from_mmcboot_linux_from_mmc主要完成了bootimg读取到缓存,解压kernel,重定位kernel, ramdisk, dtb,并最终启动kernel,启动的同时会向kernel传递dtb地址,dtb的chosen保存了cmdl原创 2020-12-11 17:08:31 · 1099 阅读 · 3 评论 -
高通8996启动流程-4. lk启动流程
1.前言本文档主要对MSM8996的启动流程进行一个简要的分析,目的在于展现启动流程的概貌,不会对每个细节做很详细的表述,但会对启动流程的关键节点进行重点说明。本文主要lk的流程。前面说过,boot_config_process_bl会循环执行各个协处理器的的回调,只有QSEE实现了jump_func函数,因此最终会跳转到qsee_jump_func执行,qsee内部执行的代码是不开源的,但是最终它会跳转到lk继续执行2. 总体流程lk主要完成早期的初始化,并引导内核2.1 platform_e原创 2020-12-11 17:00:53 · 796 阅读 · 0 评论 -
高通8996启动流程-3. sbl1启动流程
1. 前言本文档主要对MSM8996的启动流程进行一个简要的分析,目的在于展现启动流程的概貌,不会对每个细节做很详细的表述,但会对启动流程的关键节点进行重点说明。前面介绍8996的整体启动流程,本文主要介绍XBL #REG1也就是sbl1的启动流程。sbl1位于boot_images/QcomPkg/Msm8996Pkg/Library/XBLLoaderLib/sbl1.sSbl1即为XBL REG12. sbl1总体流程sbl1_entry首先主要完成了ARMV8体系结构相关的操作,主要设原创 2020-12-11 16:24:45 · 1664 阅读 · 1 评论 -
高通8996启动流程-2.总体启动流程
1.前言本文档主要对MSM8996的启动流程进行一个简要的分析,目的在于展现启动流程的概貌,不会对每个细节做很详细的表述,但会对启动流程的关键节点进行重点说明。本文主要通过框图的方式展现bootloader的总体流程。2.总体流程说明...原创 2020-12-11 15:52:48 · 545 阅读 · 0 评论 -
高通8996启动流程-1.概述
1.前言本文档主要对MSM8996的启动流程进行一个简要的分析,目的在于展现启动流程的概貌,不会对每个细节做很详细的表述,但会对启动流程的关键节点进行重点说明。2.关键术语Hexagon Digital Signal Processor (DSP)Hexagon架构和核心家族给高通带来了modem和多媒体应用的性能和功耗优势,是高通骁龙处理器的关键组件。LPASS-Low Power Audio SubSystem低功耗音频子系统【RPM】Resource Power Manage原创 2020-12-11 15:48:44 · 1265 阅读 · 4 评论