内核启动过程分析

正在起飞的蜗牛      2022-02-16     739

关键词:

1、uboot引导内核启动

参见博客:《嵌入式开发——uboot如何启动内核(以zImage详解)》

2、找到内核的入口

内核是从汇编代码开始运行,以arm架构的芯片为例,arch/arm/kernel/head.S的ENTRY(stext)处就是起始代码。参考博客:《如何快速确定程序的入口》

3、汇编代码阶段

3.1、设置成SVC模式并禁止终端

setmode	PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode and irqs disabled

调用setmode去设置CPSR寄存器的中断位和模式位。

3.2、检查内核是否支持当前CPU型号

bl	__lookup_processor_type		@ r5=procinfo r9=cpuid
movs	r10, r5				@ invalid processor (r5=0)?
beq	__error_p			@ yes, error 'p'

参考博客:《内核启动过程中对CPU型号的确认》

3.3、检查内核是否支持当前机器,也就是开发板

bl	__lookup_machine_type		@ r5=machinfo
movs	r8, r5				@ invalid machine (r5=0)?
beq	__error_a			@ yes, error 'a'

参考博客:《内核启动过程中机器码的确定》

3.4、检查uboot传参tag参数

bl	__vet_atags

参考博客:《内核中对uboot传参tags的校验》

3.5、创建临时页表

bl	__create_page_tables

参考博客:《嵌入式开发(S5PV210)——u-boot中开启MMU》

3.6、跳转执行__switch_data函数

ldr	r13, __switch_data

__switch_data:
.long	__mmap_switched
.long	__data_loc			@ r4
······

__switch_data汇编函数在分析启动过程中没什么特别需要关注的,直接跳转到__mmap_switched函数。

3.7、跳转执行__mmap_switched函数

__mmap_switched:
	adr	r3, __switch_data + 4
	······
	b	start_kernel
ENDPROC(__mmap_switched)

__mmap_switched函数就是调用start_kernel函数,跳转到C语言继续进行内核启动。

3.8、执行start_kernel函数

进入C语言阶段继续启动内核,start_kernel函数里是各模块的初始化,下面只对其中常用的模块进行介绍。

4、C语言阶段

4.1、打印内核版本信息:

const char linux_banner[] =
	"Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@"
	LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";
	
printk(KERN_NOTICE "%s", linux_banner);

linux_banner字符数组保存的是内核的版本等相关信息。在定义linux_banner字符数组时,把那些宏定义包含进去。

4.2、解析uboot传递的tag参数、CPU信息、机器信息

setup_arch(&command_line); 

把uboot传给内核的启动参数保存到command_line变量中;

4.3、解析uboot传递的cmdline

printk(KERN_NOTICE "Kernel command line: %s\n", boot_command_line);//打印command_line
parse_early_param();
parse_args("Booting kernel", static_command_line, __start___param,
	   __stop___param - __start___param,
	   &unknown_bootoption);

4.4、跳转到rest_init()函数,执行后续的初始化

(1)rest_init()函数调用kernel_thread()函数创建init进程和kthreadd进程;
(2)rest_init()函数最后调用cpu_idle()函数变成0号进程;
(3)内核启动结束;

内核启动分析(代码片段)

《2.uboot和系统移植-第16部分-2.16.内核的启动过程分析》 欢迎访问《朱老师物联网大讲堂》官方网站 www.zhulaoshi.org 以获取本课程更多信息第一部分、章节目录2.16.1.做好内核分析的准备工作2.16.2.head.S文件分析12.16.3.内核启动... 查看详情

kexec内核快速启动流程分析

一、命令行1. kexec -l $kpwd --append="$arg"其中$kpwd=目标内核的路径  $arg=传给内核的参数,与/proc/cmdline一致时表示重启现有内核2. kexec -e   二、执行过程1. kexec-tools执行过程kexec 的main函数解 查看详情

3内核的启动过程(代码片段)

 1.内核分析准备 删除无用文件官方版本的kernel中是支持各种硬件架构、各种开发板的,因此有很多文件夹和文件和我们无关,在建立SI工程前应该删掉这些家伙。我们现在分析的是开发板厂商九鼎科技移植好的针对X210开... 查看详情

内核启动12(代码片段)

《2.uboot和系统移植-第16部分-2.16.内核的启动过程分析》 欢迎访问《朱老师物联网大讲堂》官方网站 www.zhulaoshi.org 以获取本课程更多信息第一部分、章节目录2.16.1.做好内核分析的准备工作2.16.2.head.S文件分析12.16.3.内核启动... 查看详情

linux系统启动过程的打印信息从何而来?

...可以到/var/log目录中查看以anaconda文件开头的文件。追问内核代码你会不会啊追答你什么意思?你上来就说“Linux系统启动过程的打印信息从何而来?”,你能不能说详细点在发言?追问我要分析一个内核代码参考技术A内核中啊!!... 查看详情

第3阶段——内核启动分析之makemenuconfig内核配置

目标:分析makemenuconfig内核配置过程 在上1小结中(内核编译试验)讲到了3种不同的配置:(1)通过makemenuconfig直接从头到尾配置.config文件(2)通过makes3c2410_deconfig 命令在默认的配置上进行自动修改.config文件(3)使用厂家提供的配置c... 查看详情

内核配置裁剪及启动流程(代码片段)

文章目录一、内核分析之编译初体验二、内核分析之配置三、内核分析之Makefile四、内核分析之启动过程一、内核分析之编译初体验1.解压缩2.配置内核的配置有三种方法(1)直接执行makemenuconfig,从头到尾每一条都自... 查看详情

第3阶段——内核启动分析之创建si工程和启动内核分析

目标:(1)创建SourceInsight工程,方便后面分析如何启动内核的(2)分析uboot传递参数,链接脚本如何进入stext的  (3) 分析stext函数如何启动内核  1创建内核sourcesight工程 1.1点击“addall”添加所有文件,后面再慢慢删去A... 查看详情

《linux操作系统分析》之linux系统的理解及学习linux内核的心得

...行第二篇:《Linux操作系统分析》之分析精简的Linux的内核中断和时间片轮询第三篇:《Linux操作系统分析》之跟踪分析Linux内核的启动过程第四篇:《Linux操作系统分析》之使用库函数API和C代码中嵌入汇编代码两种方... 查看详情

wince6.0启动异砦新手求助

WindowsCE6.0启动过程分析在WindowsCE6.0中,内核(Kenerl)和OEM代码被分成oal.exe、kernel.dll和kitl.dll三个部分,其中启动代码(startup)和OAL层的实现部分不再与内核链接生成NK.exe,取而代之的是启动代码(startup)和硬件相关且独立于内... 查看详情

深度系统启动过程

Deepin系统启动过程总体分为:硬件上电、内核引导、内核启动、系统初始化、图形界面这几个过程。其中硬件上电、内核引导、内核启动主要为“boot”,主要作用是启动内核。系统初始化和图形界面为“initialize”,... 查看详情

linux0.11启动过程分析(代码片段)

...ve函数(六)Linux0.1180X86知识(七)Linux0.11内核体系结构(八)文章目录Linux0.11系列文章一、GDB调试方案二、启动分析1、BIOS加载2、bootsect.s3、setup.s4、head.s5、main函数一、GDB调试方案Linux0.11-调试Linux最早期... 查看详情

v87.01鸿蒙内核源码分析(内核启动篇)|从汇编到main()|百篇博客分析openharmony源码

本篇关键词:内核重定位、MMU、SVC栈、热启动、内核映射表内核汇编相关篇为:v74.01鸿蒙内核源码分析(编码方式)|机器指令是如何编码的v75.03鸿蒙内核源码分析(汇编基础)|CPU上班也要打卡v76.04鸿蒙内核源码分析(汇编传参)|如何传... 查看详情

v87.01鸿蒙内核源码分析(内核启动篇)|从汇编到main()|百篇博客分析openharmony源码

本篇关键词:内核重定位、MMU、SVC栈、热启动、内核映射表内核汇编相关篇为:v74.01鸿蒙内核源码分析(编码方式)|机器指令是如何编码的v75.03鸿蒙内核源码分析(汇编基础)|CPU上班也要打卡v76.04鸿蒙内核源码分析(汇编传参)|如何传... 查看详情

v87.01鸿蒙内核源码分析(内核启动篇)|从汇编到main()|百篇博客分析openharmony源码

本篇关键词:内核重定位、MMU、SVC栈、热启动、内核映射表内核汇编相关篇为:v74.01鸿蒙内核源码分析(编码方式)|机器指令是如何编码的v75.03鸿蒙内核源码分析(汇编基础)|CPU上班也要打卡v76.04鸿蒙内核源码分析(汇编传参)|如何传... 查看详情

第3阶段——内核启动分析之makeuimage编译内核

目标:通过分析makefile,明白makeuImage如何编译内核 把整个内核的makefile分成三类(makefile资料文档在linux-2.6.22.6/Documentation/build/makefiles.txt)<1>各级子目录makefile(每个子目录都有makefile)<2>/arch/arm/Makefile(架构相关的makefil 查看详情

bsp开发之kernellinux启动流程以及编译流程分析(代码片段)

...文件build-in.o过程分析vmlinux、Image,zImage、uImage的区别内核启动流程分析linux顶层Makefile分析MAKEFLAGS+=-rR#静默输出makeV=1静默输出ifeq("$(originV)",& 查看详情

socket与系统调用深度分析(代码片段)

...踪至系统调用的详细过程。追踪过程分为用户态的追踪和内核态的追踪。目录用户态追踪系统调用定义系统调用初始化的过程系统调用的执行过程(以socket为例的证明过程)内核态追踪分析replyhi和hello程序gdb跟踪sys_socket()调用栈... 查看详情