x20存储的是FDT设备树文件的物理地址,将其传递给x21 /** Preserve the arguments passed by the bootloader in x0 .. x3*/preserve_boot_args:movx21,x0// x21=FDTadr_lx0,boot_args// record the contents ofstpx21,x1,[x0]// x0 .. x3 at kernel entrystpx2,x3,[x0,#16]dmbsy// n...
.equ swapper_pg_dir, KERNEL_RAM_VADDR - PG_DIR_SIZE .macro pgtbl, rd, phys add \rd, \phys, #TEXT_OFFSET - PG_DIR_SIZE .endm 其中KERNEL_RAM_VADDR表示内核启动地址的虚拟地址,即前面看到的链接地址0xC0008000,同时内核要求这个地址的第16位必须是0x8000。 然后由于没有配置ARM LPAE,则采用一级...
然后我这里没有配置CONFIG_SMP_ON_UP和CONFIG_ARM_PATCH_PHYS_VIRT选项(他们的内核配置解释分别为Allowbooting SMP kernel on uniprocessor systems和Patch physical tovirtual translations at runtime),接下来就要跳转到__create_page_tables中创建初始页表了。 /* * Setup the initial page tables. We only setup ...
可是实际操作中,kernel是载入到0x80008000地址执行的。 (我使用处理器sdram物理起始地址是0x80000000) 为什么链接地址和执行地址不一致? 学习完start_kernel之前的汇编,就会明确原因了。 在stext中。首先调用到__lookup_processor_type,Kernel代码将全部CPU信息的定义都放到.proc.info.init段中。因此能够觉得.proc.info...
Linux内核入口start_kernel linux 内核启动过程中,start_kernel()函数是分析Linux内核的切入点。 C语言阶段的start_kernel函数位于内核源码/init/main.c文件,主要完成以下内容: (1)打印一些输出信息。 (2)初始化内核工作所需的模块(比如内存管理、调度系统、异常处理等)。 start_kernel函数 在构架相关的汇编代码运行...
lock_kernel(); 1. /* 看这个函数的之前我们首先来了解一段知识,linux kernel默认是支持preemption(抢占)的。在SMP环境下为了实现kernel的锁定,kernel使用了一个BKL(big kernel lock)的概念,在初始化的过程中先锁定这个BKL,然后再继续进行其他启动或者初始化过程,这样就可以防止启动过程中被中断,执行到res_init以后...
("Kernel command line: %s\n", saved_command_line); /* parameters may set static keys */ jump_label_init(); parse_early_param();/* 解析命令行中的 console 参数 */ after_dashes = parse_args("Booting kernel", static_command_line, __start___param, __stop___param - __start___...
一、start_kernel start_kernel位于init/main.c,主要完成linux一些子系统的初始化。 1)smp_setup_processor_id() 单CPU位为空。 2)lock_kernel() 锁CPU,linux是支持抢占的,多CPU时调用这个函数防止其他CPU抢占。 3)tick_init() 时间相关初始化 4)boot_cpu_init() 确定有多少个CPU可用。现在以单CPU讲述。
lock_kernel(); /* 看这个函数的之前我们首先来了解一段知识,linux kernel默认是支持preemption(抢占)的。在SMP环境下为了实现kernel的锁定,kernel使用了一个BKL(big kernel lock)的概念,在初始化的过程中先锁定这个BKL,然后再继续进行其他启动或者初始化过程,这样就可以防止启动过程中被中断,执行到res_init以后,kern...
内核数据段结束每一个任务都有一个mmstruct结构管理任务内存空间initmm是内核的mmstruct其中设置成员变量mmap指向自己意味着内核只有一个内存管理结构设置pgds是内核的页目录在arm体系结构有16k所以initmm定义了整个kernel的内存空间下面我们会碰到内核线程所有的内核线程都使用内核空间拥有和内核同样的访问权限 内核启动start...