• Linux源码——启动流程1


    主要

    大概流程就是:

    • 通电自检-----》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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    /* 部分源代码分析 */
    /* 内核入口点 */
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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, a0
    	move	s1, a1
    	move	s2, a2
    	move	s3, a3
    
    	/* Clear BSS */
    	PTR_LA	a0, _edata
    	PTR_LA	a2, _end
    1:	sw	zero, 0(a0)
    	addiu	a0, a0, 4
    	bne	a2, a0, 1b
    
    	PTR_LA	a0, (.heap)	     /* heap address */
    	PTR_LA	sp, (.stack + 8192)  /* stack address */
    
    	PTR_LA	t9, decompress_kernel
    	jalr	t9
    
    2:
    	move	a0, s0
    	move	a1, s1
    	move	a2, s2
    	move	a3, s3
    	PTR_LI	t9, KERNEL_ENTRY
    	jalr	t9
    
    3:
    	b	3b
    
    	END(start)
    
    	.comm .heap,BOOT_HEAP_SIZE,4
    	.comm .stack,4096*2,4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • /arch/mips/kernel/head.S
      在这里插入图片描述
      kernel_entry()。内核的真正入口。
      在这里插入图片描述

    大概流程就是:

    • 通电 自检 bios bootloader 内核。
    • 其中内核这部分是这篇主要的,通过bootloader初始化好一些条件,然后调用kernel_entry()开始正式进入内核之中,后面就是内核操作了,启动进程什么的。
  • 相关阅读:
    【BUG】第一次创建vue3+vite项目启动报错Error: Cannot find module ‘worker_threads‘
    新款 锐科达 SV-2702VP SIP广播音频模块 RTP流音频广播
    HPA控制器
    Java练习题——接口和抽象类综合题
    预训练语言模型复现CPT-1&Restructure_pretrain
    406. 根据身高重建队列
    ​软考-高级-系统架构设计师教程(清华第2版)【第11章 未来信息综合技术(P384~P419)-思维导图】​
    Ansible学习笔记14
    第十章(6):Transformer模型中的参数共享:减少参数量和计算量的优化策略
    Linux(CentOS/Ubuntu)——安装nginx
  • 原文地址:https://blog.csdn.net/beidideshu/article/details/128123398