博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OK6410A 开发板 (八) 22 linux-5.11 OK6410A start_kernel 功能角度 第一阶段
阅读量:4283 次
发布时间:2019-05-27

本文共 2617 字,大约阅读时间需要 8 分钟。

第一阶段主要负责 cpu的初始化

CPU0

  • 中的 stext -> start_kernel
cpu 寄存器的初始化	sp寄存器	cpsr		Supervisor Mode		irq disabled		fiq disabled		little endiancp15 寄存器 的初始化	cache		dcache		icache		write buffer	mmu		page table		domain access

CPU1 …

cpu 寄存器的初始化	sp寄存器 // 值来自于 cpu0的设定值 secondary_data.stack	cpsr		Supervisor Mode		irq disabled		fiq disabled		little endiancp15 寄存器 的初始化	cache		dcache		icache		write buffer	mmu		page table	// 值来自于 cpu0的设置值 secondary_data.pgdir		domain access // 值来自于 cpu0的设置值 secondary_data.pgdir
  • 流程
cpu0:smp_init        idle_threads_init            for_each_possible_cpu idle_init                fork_idle                    copy_process        bringup_nonboot_cpus            cpu_up                _cpu_up                	                	// cpu1跑起来的时候会设置自己cpu1,参数就是下面的值                	secondary_data.stack = task_stack_page(idle) + THREAD_START_SP;                	secondary_data.pgdir = virt_to_phys(idmap_pgd);                	secondary_data.swapper_pg_dir = get_arch_pgd(swapper_pg_dir);                	                    smp_ops.smp_boot_secondary(cpu, idle); / 即 psci_boot_secondary                        psci_ops.cpu_on // 对应 0.1 版本的 psci为 psci_0_1_cpu_on                            psci_0_1_cpu_on                                __psci_cpu_on                                    invoke_psci_fn // 调用什么 取决于 set_conduit 的设定值                                        __invoke_psci_fn_smc                                            arm_smccc_smc                                                __arm_smccc_smc                                                    SMCCC SMCCC_SMC                                                        __SMC                                                            0xE1600070 | (((imm4) & 0xF) << 0),                                                            0xF7F08000 | (((imm4) & 0xF) << 16)    cpu1:secondary_startup    	    	// 设置为 svc mode    	// irq off    	// fiq off    	safe_svcmode_maskall r9				// 将 __secondary_switched 放到 r13		mov_l   r12, __secondary_switched		mov r13, r12		// 跳转到 arch/arm/mm/proc-v6.S 中的 __v6_setup ,并返回    	ldr r12, [r10, #PROCINFO_INITFUNC]    	add r12, r12, r10    	ret r12    	    	// 跳转到 __enable_mmu    	__enable_mmu    	    		// 用 secondary_data.pgdir 设置 page table pointer    		mcr p15, 0, r4, c2, c0, 0       @ load page table pointer    		b   __turn_mmu_on				__turn_mmu_on						// 跳转到 __secondary_switched			mov r3, r13			ret r3		        __secondary_switched        	// 用  secondary_data.stack 的值 设置 sp        	ldr_l   r7, secondary_data + 12         	mov sp, r7        	// 跳转到 secondary_start_kernel            b secondary_start_kernel

转载地址:http://icigi.baihongyu.com/

你可能感兴趣的文章
linux前后台切换
查看>>
nmap
查看>>
uboot执行顺序main_loop
查看>>
uboot编译内容详解
查看>>
uboot Makefile 分析
查看>>
uboot网络验证
查看>>
烧写uboot
查看>>
QT安装
查看>>
QtCreator介绍
查看>>
QT工程实例
查看>>
pkg-config
查看>>
Linux内核分析-1/反汇编(堆栈)
查看>>
Linux内核分析-2/时间片轮转多道程序
查看>>
Linux内核分析-4/5/系统调用
查看>>
c/c++常见关键字
查看>>
C++内存地址分配和内存区划分简介
查看>>
C++数值交换
查看>>
指针数组、数组指针、函数指针、指针函数
查看>>
float,double在内存中的存储方式
查看>>
int main(int argc,char* argv[])详解
查看>>