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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java中Bigdecimal加减乘除运算

    java中Bigdecimal加减乘除运算在java中的Bigdecimal类型的数据进行加减乘除运算的时候要调用以下方法:加法:add减法:subtract乘法:multiply除法:divide例如: BigDecimali=newBigDecimal(2);BigDecimalj=newBigDecimal(1);//加法System.out.println(i.add(j));//减法System.out.println(i.subtract(j));

    2022年6月2日
  • css选择器nth-child()和nth-of-type()的应用

    css选择器nth-child()和nth-of-type()的应用

    2021年9月8日
  • eclipse下载及安装教程[通俗易懂]

    eclipse下载及安装教程[通俗易懂]eclipse下载及安装教程Java编程最好的集成开发工具就是IBM研发的Eclipse软件,Eclipse完全免费,是java开发人员的必备平台。进入eclipse下载页,界面如下图所示:(附加官网下载链接:https://www.eclipse.org/downloads/)eclispe提供了两种下载方式。一种是下载安装程序,下载后直接运行安装程序,根据安装程序的提示选择安装选项并完成安装;一种是下载具有不同功能项的eclispe压缩包,下载后手动解压即可。第一种——安装程序方式

    2022年5月10日
  • 河北对口计算机专业一分一档6,600分以上830人!河北一市中考一分一档表出炉!…

    河北对口计算机专业一分一档6,600分以上830人!河北一市中考一分一档表出炉!…出分啦!承德市2021年中考成绩公布6月30日,承德市教育考试招生信息平台公布2021年承德市中考成绩一分一档表!今年承德中考文化和体育是630分,理化实验20分,总计是650分。据一分一档表显示今年承德中考600分以上是830人2021年承德市中考成绩一分一档表除承德外河北其他地市什么时候能查分呢?有粉丝在后台问,衡水什么时候可以查分,这不,衡水市中考成绩发布时间也来啦~衡水市一、中考成绩发布时…

    2022年7月13日
  • c++ map遍历的几种方式_对map进行遍历

    c++ map遍历的几种方式_对map进行遍历C++map遍历#include#include

    usingnamespacestd;intmain(){map_map;_map[0]=1;_map[1]=2;_map[10]=10;map::iteratoriter;iter=_map

    2022年9月21日
  • IM开发宝典:史上最全,微信各种功能参数和逻辑规则资料汇总「建议收藏」

    1、引言IM应用的初学者们,在补全了各种基础技术知识后(如果您仍不具备这些知识,建议马上阅读《新手入门一篇就够:从零开发移动端IM》),在动手编码实践时,很多时候纠结的并不是功能该如何实现,而是这个功能该实现成什么样(没有经验,我特玛能找谁问问?)。比如,最常见的纠结有以下这些:1)离线聊天消息该保存多久?2)好友请求应该保存多久?3)短视频消息中的视频时长设为多大合适?4…

    2022年4月9日

发表回复

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

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