Linux源码——启动流程1
创始人
2024-03-04 20:01:30
0

主要

大概流程就是:

  • 通电自检-----》bios----》bootloader —》内核。
  • 其中内核这部分是这篇主要的,通过bootloader初始化好一些条件,然后调用kernel_entry()开始正式进入内核之中,后面就是内核操作了,启动进程什么的。

宏观启动流程

参考这个大佬写的
https://blog.csdn.net/ligare/article/details/124613619
https://blog.csdn.net/sinat_27298703/article/details/46470823

通电、BIOS、主引导记录、操作系统
在这里插入图片描述

bootloader

https://blog.csdn.net/m0_56145255/article/details/122542564

Linux微观(函数) 1.网络

这个
https://zhuanlan.zhihu.com/p/524298207

arch/arm/kernel/head-armv.S

该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码,
主要作用是检查CPU ID, Architecture Type,初始化BSS等操作,并跳到start_kernel函数。在执行前,处理器应满足以下状态:

r0 - should be 0 
r1 - unique architecture number 
MMU - off 
I-cache - on or off 
D-cache – off
/* 部分源代码分析 */
/* 内核入口点 */
ENTRY(stext)
/* 程序状态,禁止FIQ、IRQ,设定SVC模式 */
mov r0, #F_BIT | I_BIT | MODE_SVC@ make sure svc mode
/* 置当前程序状态寄存器 */
msr cpsr_c, r0 @ and all irqs disabled
/* 判断CPU类型,查找运行的CPU ID值与Linux编译支持的ID值是否支持 */
bl __lookup_processor_type
/* 跳到__error */
teq r10, #0 @ invalid processor?
moveq r0, #'p' @ yes, error 'p'
beq __error
/* 判断体系类型,查看R1寄存器的Architecture Type值是否支持 */
bl __lookup_architecture_type
/* 不支持,跳到出错 */
teq r7, #0 @ invalid architecture?
moveq r0, #'a' @ yes, error 'a'
beq __error
/* 创建核心页表 */
bl __create_page_tables
adr lr, __ret @ return address
add pc, r10, #12 @ initialise processor
/* 跳转到start_kernel函数 */
b start_kernel

start_kernel()函数分析

  • lock_kernel()
/* Getting the big kernel lock.
* This cannot happen asynchronously,
* so we only need to worry about other
* CPU's.
*/
extern __inline__ void lock_kernel(void)
{if (!++current->lock_depth)spin_lock(&kernel_flag);
}

kernel_flag 是一个内核大自旋锁,所有进程都通过这个大锁来实现向内核态的迁移。

只有获得这个大自旋锁的处理器可以进入内核,如中断处理程序等。在任何一对 lock_kernel/unlock_kernel函数里至多可以有一个程序占用CPU。

进程的lock_depth成员初始化为-1,在 kerenl/fork.c文件中设置。在它小于0时 (恒为 -1),进程不拥有内核锁;当大于或等于0时,进程得到内核锁。

  • setup_arch()
    -在这里插入图片描述

Linux启动 2.龙芯Linux那本书

龙芯书第二章专门讲了启动。

宏观

在这里插入图片描述

微观

在这里插入图片描述


在这里插入图片描述

  • arch/mips/boot/compressed/head.S
  • 在这里插入图片描述
#include 
#include LEAF(start)/* Save boot rom start args */move	s0, a0move	s1, a1move	s2, a2move	s3, a3/* Clear BSS */PTR_LA	a0, _edataPTR_LA	a2, _end
1:	sw	zero, 0(a0)addiu	a0, a0, 4bne	a2, a0, 1bPTR_LA	a0, (.heap)	     /* heap address */PTR_LA	sp, (.stack + 8192)  /* stack address */PTR_LA	t9, decompress_kerneljalr	t92:move	a0, s0move	a1, s1move	a2, s2move	a3, s3PTR_LI	t9, KERNEL_ENTRYjalr	t93:b	3bEND(start).comm .heap,BOOT_HEAP_SIZE,4.comm .stack,4096*2,4
  • /arch/mips/kernel/head.S
    在这里插入图片描述
    kernel_entry()。内核的真正入口。
    在这里插入图片描述

大概流程就是:

  • 通电 自检 bios bootloader 内核。
  • 其中内核这部分是这篇主要的,通过bootloader初始化好一些条件,然后调用kernel_entry()开始正式进入内核之中,后面就是内核操作了,启动进程什么的。

相关内容

热门资讯

美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...
终于懂了手机麻将到底有没有挂... 您好:手机麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...