/* 看这个函数的之前我们首先来了解一段知识,linux kernel默认是支持preemption(抢占)的。在SMP环境下为了实现kernel的锁定,kernel使用了一个BKL(big kernel lock)的概念,在初始化的过程中先锁定这个BKL,然后再继续进行其他启动或者初始化过程,这样就可以防止启动过程中被中断,执行到res_init以后,kernel会释放这个锁,...
内核启动程序的入口:参见arch/arm/kernel/vmlinux.lds(由arch/arm/kernel/vmlinux.lds.S生成)。 arch/arm/kernel/vmlinux.lds: ENTRY(stext) jiffies = jiffies_64; SECTIONS { ... . = 0xC0000000 + 0x00008000; .head.text : { _text = .; *(.head.text) } .text : { /* Real text segmen...
本文介绍linux的第二部分,C语言编写,主要讲述start_kernel到1号进程的创建。主要讲述大概过程,以后再对子函数进行讲解。 一、start_kernel start_kernel位于init/main.c,主要完成linux一些子系统的初始化。 1)smp_setup_processor_id() 单CPU位为空。 2)lock_kernel() 锁CPU,linux是支持抢占的,多CPU时调用这个函...
在进行虚拟地址到物理地址的转换过程中,即可实现x线性转换(转换方式参见《ARM Linux启动流程分析——内核自解压阶段》)。 如此循环映射完整个__turn_mmu_on部分代码,映射后的地址空间如下图: /* * Map our RAM from the start to the end of the kernel .bss section. */ add r0, r4, #PAGE_OFFSET >>...
一、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讲述。
从kernel的第一条指令开始分析,一直分析到进入start_kernel()函数. 我们当前以linux-2.6.19内核版本作为范例来分析,本文中所有的代码,前面都会加上行号以便于和源码进行对照. 例: 在文件init/main.c中: 00478: asmlinkage void __init start_kernel(void) ...
开始真正的Linux内核 1、入口在arch/arm/kernel/head-armv.S 2、查找处理器类型 __lookup_processor_type __lookup_architecture_type 3、初始化页表:__creat_page_tables 4、初始化C代码空间 5、跳转到C代码中,start_kernel ARM的MMU单元 MMU:内存管理单元 ...
开始真正的Linux内核 1、入口在arch/arm/kernel/head-armv.S 2、查找处理器类型 __lookup_processor_type __lookup_architecture_type 3、初始化页表:__creat_page_tables 4、初始化C代码空间 5、跳转到C代码中,start_kernel ARM的MMU单元 MMU:内存管理单元 作用: 虚拟地址到物理地址的映射 存储器访问权限 ...
了解完kernel启动以前的汇编之后我们来看看正式的c语言启动代码,也就是我们的start_kernel函数了。start_kernel相当大,里面每一个调用到的函数都足够我们伤脑筋了,我这里只是浅尝辄止的描述一下函数的功能,从而对kernel启动的过程有一个比较直观的了解。很多函数真正理解需要对linux相关体系有很深的了解,暂时没有时间深入...
ARM处理器上的linux内核启动的过程详细资料概述 对于ARM的处理器,内核第一个启动的文件是arc/arm/kernel下面的head.S文件。当然arc/arm/boot/compress下面也有这个文件,这个文件和上面的文件略有不同,当要生成压缩的内核时zImage时,启动的是后者,后者与前者不同的时,它前面的代码是做自解压的,后面的代码都相同。