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

简介:

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

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

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

计算机中的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,如需转载请自行联系原作者
相关文章
|
Linux C语言
RISC-V Linux汇编启动过程分析
RISC-V Linux汇编启动过程分析
|
3月前
|
Linux Shell 网络安全
Linux 系统启动过程
Linux 系统启动过程
67 2
|
1月前
|
搜索推荐 Linux
深入理解Linux操作系统的启动过程
本文旨在揭示Linux操作系统从开机到完全启动的神秘面纱,通过逐步解析BIOS、引导加载程序、内核初始化等关键步骤,帮助读者建立对Linux启动流程的清晰认识。我们将探讨如何自定义和优化这一过程,以实现更高效、更稳定的系统运行。
|
3月前
|
存储 Linux Shell
深入理解Linux操作系统的启动过程
【10月更文挑战第21天】本文将深入浅出地介绍Linux操作系统的启动过程,包括BIOS、引导加载程序、内核初始化和系统服务启动等环节。通过阅读本文,您将了解到Linux启动过程中的关键步骤和相关概念,以及如何优化启动速度。
|
3月前
|
安全 Linux
探索Linux操作系统的启动过程
在这篇文章中,我们将深入探讨Linux系统的启动流程,从电源开启到登录界面呈现的每一个步骤。我们将揭示BIOS、引导加载器、内核以及初始化进程如何协同工作,使Linux系统顺利启动。通过了解这些过程,读者将能更好地理解Linux系统的工作原理,并为可能出现的启动问题提供解决思路。
100 14
|
3月前
|
安全 Ubuntu Linux
Linux系统无法启动或启动过程中卡住
【10月更文挑战第5天】
628 3
|
5月前
|
NoSQL Linux
Linux 0.11启动过程分析(一)
Linux 0.11启动过程分析(一)
50 1
|
5月前
|
Linux
探索Linux操作系统的启动过程
【8月更文挑战第31天】本文将深入探讨Linux系统从按下电源键到登录界面出现之间的神秘世界。我们将一步步揭开内核加载、初始化进程启动和系统服务运行的面纱,同时通过实际代码示例,揭示这一切是如何精妙地编织在一起的。无论你是系统管理员还是对操作系统感兴趣的爱好者,这篇文章都将给你带来新的视角和深刻的见解。
|
5月前
|
存储 Linux 调度
深入理解Linux操作系统的启动过程
【8月更文挑战第31天】本文将深入探讨Linux操作系统的启动过程,包括BIOS、内核、init进程等关键步骤。我们将通过实际代码示例,揭示Linux启动过程中的奥秘,帮助读者更好地理解和掌握Linux系统。
|
5月前
|
存储 Linux 数据库
探索Linux操作系统的启动过程
【8月更文挑战第24天】本文将带你深入了解Linux操作系统从开机到用户登录的全过程。我们将逐步解析BIOS/UEFI初始化、引导加载器(Bootloader)的作用、内核启动以及系统运行级别和初始化进程。通过阅读本文,你将获得对Linux启动流程的清晰认识,并能够理解每个阶段的关键任务。