我阅读的代码是2.6.33.1的代码。
本文没有详细分析代码逻辑,主要是看函数执行流程。
启动过程从arch/x86/boot/header.S开始。按代码所在位置分为两部分,一部分是在boot目录下的,另一部分是在kernel目录下。
1. arch/x86/boot/header.S(Based on bootsect.S and setup.S)
是在16-bit的实模式执行,因此访存是这样的:段地址:段内偏移
在header.S有一个jmp main的命令,跳转到arch/x86/boot/main.c。
在这个main函数中,初始化许多设定,例如init_heap(),set_video()……
最后进入保护模式go_to_protected_mode(),注意,在这个函数里面有set_idt()与setup_gdt()两个操作。
看了go_to_protected_mode(),它最后一个跳转操作,现在不确定跳转到哪里。
个人感觉是跳转到arch/x86/boot/compressed/head_32.S:startup_32,这段汇编文件代码会调用decompress_kernel,在它将kernel解压后跳转到kernel代码开始执行kernel代码,kernel的入口代码是在arch/x86/kernel/head_32.S
2. 在arch/x86/kernel/head_32.S在做许多初始化工作(建立gdt,idt表, 开启Page机制等)之后,执行jmp *(initial_code),就跳转到了i386_start_kernel。
而在i386_start_kernel的最后调用了start_kernel,在这个函数中kernel完成了自己的许多初始化工作,包括创建init内核线程,然后最后在reset_init函数中启动了cpu_idle.
启动多个CPU的代码流程:
init/main.c:start_kernel()
|
\|/
init/main.c:rest_init
|
\|/
kernel_thread(kernel_init, NULL, CLONES_FS | CLONE_SIGHAND)
-----------------------------------------------------------------
kernel_init会被当成kernel_thread_function
kernel_thread创建地方是在init/main.c:rest_init
init/main.c: smp_init():kernel_init
|
\|/
/* called by boot processor to activate the rest */
init/main.c: smp_init()
|
\|/
for_each_present_cpu(cpu) {
if (num_onlien_cpus() >= setup_max_cpus)
break;
if ( !cpu_online(cpu))
cpu_up(cpu);
}
/* Any cleanup work */
printk(KERN_INFO "Brought up %ld CPUs\n", (long)num_online_cpus());
smp_cpu_done(setup_max_cpus);
--------------------------------------------------------------
cpu_up = native_cpu_up是一个回调函数。
注册地方是在:arch/x86/kernel/smp.c
struct smp_ops smp_ops = {
……
.cpu_up = native_cpu_up,
……
}
arch/x86/kernel/smpboot.c:native_cpu_up(unsigned int cpu)
|
\|/
arch/x86/kernel/smpboot.c: do_boot_cpu(int apicid, int cpu)
分享到:
相关推荐
关于Linux系统的启动过程分享一下,内容是关于Linux的
### Linux启动过程综述 #### 一、引言 Linux是一种开源的操作系统,以其高度的稳定性和安全性在服务器领域有着广泛的应用。对于深入理解Linux系统的行为及其管理来说,掌握Linux的启动过程至关重要。本文旨在详细...
### Linux内核启动过程分析 #### 一、引言 随着技术的发展,Linux作为一个免费开源的Unix类操作系统,因其强大的功能、高效的性能以及良好的可移植性,在嵌入式系统乃至高性能服务器领域获得了广泛应用。理解Linux...
ARM Linux启动过程分析 1. ARM Linux 启动过程概述 ARM Linux 启动过程可以分为四个部分:引导加载程序(bootloader),Linux 内核,文件系统,应用程序。其中 bootloader 是系统启动或复位以后执行的第一段代码,...
"Linux启动过程分析" Linux 启动过程分析是嵌入式 Linux 系统的核心组成部分,理解 Linux 启动过程对嵌入式系统的开发和应用至关重要。本文将详细分析 Linux 启动过程,包括 bootloader 的执行流程和 ARM Linux 的...
LINUX系统启动过程分析 LINUX系统启动过程是一个复杂的过程,涉及到多个步骤和组件。下面将对LINUX系统启动过程进行详细的分析。 BIOS自检 在PC中,LINUX系统启动从BIOS中的地址0xFFFF0处开始。BIOS的第一个步骤...
Linux的启动过程 Linux的服务管理 Linux的进程管理 Linux的启动过程 BIOS自检 读取并加载硬盘MBR(主引导记录)中的启动引导器(GRUB或LILO等) 运行Linux的系统内核并检测硬件 Linux的启动过程 读取配置文件/etc/...
linux系统内核启动过程详细分析,希望对学习linux的大家有帮助。
### Linux启动过程详解 在深入理解Linux操作系统的工作原理时,了解其启动流程是至关重要的一步。本文将详尽解析Linux的启动过程,包括从引导区加载到系统初始化的各个环节。 #### 引导区引导 Linux的启动始于...
### Linux启动过程详解 #### 一、Bootloader详解 Linux系统的启动过程中,Bootloader扮演着极其重要的角色。它是系统启动的第一阶段,负责加载操作系统内核到内存中,并将控制权交给内核。根据不同的硬件平台,...
嵌入式Linux系统的启动是一个复杂的过程,涉及到硬件初始化、BIOS或U-Boot加载、内核启动、根文件系统挂载等多个环节。以下是对这个过程的详细解析。 首先,我们从硬件层面开始。嵌入式设备通常有一个固件,如BIOS...
Linux启动过程是一个复杂而有序的序列,涉及到多个组件和阶段,从硬件初始化到操作系统核心的加载,再到用户空间服务的启动。以下是对Linux启动过程的详细解析,主要以Redhat 6.0 Linux 2.2.19 for Alpha/AXP为例,...
剖析Linux系统启动过程 今日,我们将深入剖析 Linux 系统启动过程,从用户打开电源到屏幕出现命令行提示符的整个过程。 1. BIOS 开机自检 当用户打开 PC 的电源,BIOS 开机自检,按 BIOS 中设置的启动设备...
Linux系统的启动过程是一个复杂而有序的序列,涉及多个关键组件和步骤。首先,当计算机加电后,BIOS(基本输入输出系统)开始执行自检(POST),检查硬件设备是否正常工作并初始化它们。接着,BIOS根据配置的启动...
ARMLinux启动过程分析 本文将对ARMLinux启动过程进行详细的分析,主要介绍了bootloader的概念和作用、bootloader的执行流程、ARM Linux的启动过程等内容。通过对bootloader和Linux内核的研究,可以加速嵌入式系统的...
"Linux启动过程分析" Linux启动过程是一个复杂的过程,涉及到多个文件和阶段。下面我们将详细分析Linux启动过程中的各个阶段和关键文件。 1. 启动过程简介 Linux启动过程可以分为三个阶段:引导、内核初始化和...