zoukankan      html  css  js  c++  java
  • linux源码分析2

    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://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html
    http://blog.csdn.net/alais/article/details/5129005

  • 相关阅读:
    html页面怎样能够自适应电脑屏幕宽度
    js语法大全
    DevExtreme- jQuery 表格组件-DataGrid
    DevExtreme 图表组件
    C# 中的委托和事件
    SQL Server游标的使用
    Oracle11g使用exp导出空表
    PowerDesigner设计Name和Comment 替换
    Toad for Oracle 快捷键
    Windows 命令大全
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/6002081.html
Copyright © 2011-2022 走看看