linux源码分析(二)-启动过程

linux源码分析(二)-启动过程

大家好,又见面了,我是全栈君。

前置:这里使用的linux版本是4.8,x86体系。

这篇是 http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html 的学习笔记。

linux的启动过程有点像是小鱼吃大鱼,最后吃成一个胖子。

136188-20161025130134421-903353143.png

计算机中的PC寄存器是用来指示下个执行程序。最开始的时候,pc寄存器都是指向0xfffffff0。这个程序是指向BIOS的POST程序的。POST全称是Power On Self Test,意思是加点自检。过程包括内存检查,系统总线检查等。

POST过程结束,就进入到了自举过程,自举过程把MBR(主引导扇区)加载到内存中,并且执行它。这个主引导扇区是第一个扇区的前512字节。

Master Boot Record过程是为了后面一个过程准备的。它主要做的是读入GRUB stage2所在的扇区。并且执行它。

GRUB stage2 将系统切换到保护模式。设置C运行环境。

然后进入到x86/boot/header.S中执行。在这里面,你能找到main的函数入口。这个对应到x86/boot/main.c的main函数。

这个main函数执行到最后会进入go_to_protected_mode(); 进入到pm.c的这个函数的定义,除了初始化一些逻辑以外,主要是protected_mode_jump

下面就进入到boot/pmjump.S的protected_mode_jump

29 protected_mode_jump:
30        movl    %edx, %esi              # Pointer to boot_params table
31
32        xorl    %ebx, %ebx
33        movw    %cs, %bx                # 将实模式的代码段放入 bx
34        shll    $4, %ebx                # 转换为线性地址
35        addl    %ebx, 2f                # 将 in_pm32 的实模式地址转换为线性地址
36
37        movw    $__BOOT_DS, %cx        # ds 段选择子
38        movw    $__BOOT_TSS, %di        # tss 段选择子
39
40        movl    %cr0, %edx
41        orb    $X86_CR0_PE, %dl        # Protected mode
42        movl    %edx, %cr0              # 将 cr0 的0位置0是进入保护模式的标志
43        jmp    1f                      # Short jump to serialize on 386/486
44 1:
45        # 下面这段作用是跳转到 in_pm32,由于已经在保护模式,所以需要考虑段的问题
46        # Transition to 32-bit mode
47        .byte  0x66, 0xea              # ljmpl opcode
48 2:      .long  in_pm32                # offset
49        .word  __BOOT_CS              # segment
50
51        .size  protected_mode_jump, .-protected_mode_jump
52
53        .code32
54        .type  in_pm32, @function
55 in_pm32:        # 下面的注释挺清楚,就不翻译了
56        # Set up data segments for flat 32-bit mode
57        movl    %ecx, %ds
58        movl    %ecx, %es
59        movl    %ecx, %fs
60        movl    %ecx, %gs
61        movl    %ecx, %ss
62        # The 32-bit code sets up its own stack, but this way we do have
63        # a valid stack if some debugging hack wants to use it.
64        addl    %ebx, %esp
65
66        # Set up TR to make Intel VT happy
67        ltr    %di                    # 这个比较有意思
68
69        # Clear registers to allow for future extensions to the
70        # 32-bit boot protocol
71        xorl    %ecx, %ecx
72        xorl    %edx, %edx
73        xorl    %ebx, %ebx
74        xorl    %ebp, %ebp
75        xorl    %edi, %edi
76
77        # Set up LDTR to make Intel VT happy
78        lldt    %cx                    # 又是一个骗 CPU 的东西

79        # eax 是 protected_mode_jump 的第一个参数,即 header.S 中定义的 boot_params.hdr.code32_start,即 vmlinux 的入口地址
80        jmpl    *%eax                  # Jump to the 32-bit entrypoint
81
82        .size  in_pm32, .-in_pm32

最后的jmpl就跳转到
arch/x86/kernel/head_32.S的startup_32

ENTRY(initial_code)
    .long i386_start_kernel

进入到arch/x86/kernel/head32.c

asmlinkage __visible void __init i386_start_kernel(void) {
    cr4_init_shadow();
    sanitize_boot_params(&boot_params);

    x86_early_init_platform_quirks();

    /* Call the subarch specific early setup function */
    switch (boot_params.hdr.hardware_subarch) {
    case X86_SUBARCH_INTEL_MID:
        x86_intel_mid_early_setup();
        break;
    case X86_SUBARCH_CE4100:
        x86_ce4100_early_setup();
        break;
    default:
        i386_default_early_setup();
        break;
    }

    start_kernel();
}

这里最后是调用了start_kernel,这里的start_kernel是与操作系统无关的init/main.c里面了。




本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/5996308.html,如需转载请自行联系原作者

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107770.html原文链接:https://javaforall.net

(0)
上一篇 2022年3月12日 下午9:35
下一篇 2022年3月12日 下午10:00


相关推荐

  • 怎么用nginx搭建文件服务器,使用nginx搭建简单文件服务器

    怎么用nginx搭建文件服务器,使用nginx搭建简单文件服务器最近再做一个博客 本想使用 fastdfs 标准的文件存储服务器 但考虑到资源占用问题 且使用 nginx 比较快速 且效果不差 于是采用 ngixn 搭建 nginx 搭建文件服务器 本质上就是 nginx 的静态文件访问配置 安装 nginxmac brewinstalln 直接下载解压就行 配置文件路径对 nginx conf 进行配置 mac 的 brew 安装后配置文件在 usr l

    2026年3月16日
    2
  • mysql系列:全网最全索引类型汇总「建议收藏」

    mysql系列:全网最全索引类型汇总「建议收藏」前言除了常见的普通索引,唯一索引,组合索引,大家还能说一下mysql中有哪些其他类型的索引吗?今天和大家一起总结mysql中有哪些索引类型。一、mysql中有哪些索引类型?聚簇索引(ClusteredIndex)非聚簇索引主键索引(PRIMARYKEY)辅助索引(SecondaryIndexes)HASH索引BTREE索引T-TREE索引R-Tree索引自适应hash索引(AdaptiveHashIndex)唯一索引(UNIQUEIndexs)普通索引(No

    2022年5月22日
    37
  • 决策树:什么是基尼系数(“杂质 增益 指数 系数”辨析)「建议收藏」

    决策树:什么是基尼系数(“杂质 增益 指数 系数”辨析)「建议收藏」决策树:什么是基尼系数在我翻译学习这篇RandomForestsforCompleteBeginners的时候,对基尼系数和它相关的一些中文表达充满了疑问,查了一些资料以后,完成了这篇文章。其中基尼杂质系数的计算和解释参考了ASimpleExplanationofGiniImpurity。如果你查看scikit-learn中DecisionTreeClassifier的文…

    2022年10月9日
    4
  • mshta usage

    mshta usagemshtaisshortforMicroSoftHtmlApplication.Itcouldrunhtmlfileorhtmlstringasaparameter.whatisinterestingisyoucanuseitinawindowbatchcommandorbatchfileandyoucanusesome

    2022年7月15日
    28
  • 一、理解 OpenClaw 多智能体架构:三层物理隔离的核心价值

    一、理解 OpenClaw 多智能体架构:三层物理隔离的核心价值

    2026年3月13日
    2
  • 实施运维企业面试题-5「建议收藏」

    实施运维企业面试题-5「建议收藏」NETWORK1请描述TCP/IP协议中主机与主机之间通信的三要素参考答案IP地址(IPaddress)子网掩码(subnetmask)IP路由(IProuter)2请描述IP地址的分类及每一类的范围参考答案A类1-26B类128-191C类192-223D类224-239组播(多播)E类240-254科研3请描述A、B、C三类IP地址的默认子网掩码参考答案A类255.0.0.0B类255.255.0.0C类

    2022年5月5日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号