linux 0.11 启动过程

开机上电的阶段

开机上电时CPU寄存器的值CS:0xffff, IP: 0x0000, 此时CPU处于实模式因此会去执行地址 addr = cs * 16 + ip = 0xffff0 此处就是固化在ROM中的

一段程序也就是BIOS, 然后BIOS 会去读MBR(引导扇区 512B) , 将这512B(也是bootsect.s的内容)的程序加载到0x7c00:0处。

bootsect.s的阶段

将自己从0x7c00:0处移到0x9000:0处, 接着读随后的4个扇区的内容到0x9000:0x200 处, 接着读取system img到 0x1000:0处并显示Loading system...

然后jmp 到 0x9000:0x200处 开始执行setup.s的内容

setup.s阶段

保存硬盘参数等信息到0x90000处, 将0x10000处的system img 移动到绝对地址0x0000处, 设置gdt ( NULL, 代码段, 数据段, 保留 ), 设置idt(NULL)

使用lgdt 加载gdt 表, lidt 加载idt 表, 关中段并开启A20 地址线, 置CR0 寄存器PE 位, 进入保护模式, jmp 0x8:0 此时已经是保护模式, 所以会去寻找gdt中的

第二项也就是代码段的段描述符, 跳转到段描述符中的保存的地址( 已经设置成了 0) , 会去执行0x0000的代码 也就是head.s

head.s 阶段

因为寄存器的值已经改变 需要重新加载gdt和idt的内容, push _main 到栈中, call 设置页目标和4个页表的子程序, 设置CR0 寄存器的PG位, 开启分页模式, 执行ret 指令弹出_main到ip中, 执行main函数进入内核初始化的过程。

时间: 2024-10-13 17:13:56

linux 0.11 启动过程的相关文章

(作业3)Linux内核的启动过程(从start_kernel到init进程启动)

作业题目: 详细分析从start_kernel到init进程启动的过程并结合实验截图撰写一篇署名博客,并在博客文章中注明“真实姓名(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”,博客内容的具体要求如下: 题目自拟,内容围绕Linux内核的启动过程,即从start_kernel到init进程启动: 博客中需要使用实验截图 博客内容中需要仔细分析

Linux内核分析之跟踪分析Linux内核的启动过程

一.实验过程 使用实验楼虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 内核启动进入 menu 程序.下面是用 gbd 来跟踪内核的启动过程: gdb (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表 (gdb)target remote:1234 # 建立gdb和gdbserver之间的

20135239 益西拉姆 linux内核分析 跟踪分析Linux内核的启动过程

回顾 1.中断上下文的切换——保存现场&恢复现场 本节主要课程内容 Linux内核源代码简介 1.打开内核源代码页面 arch/目录:支持不同CPU的源代码:其中的X86是重点 init/目录:内核启动相关的代码基本都在该目录中(比如main.c等) start_kernel函数就相当于普通C程序的main函数 kernel/目录:Linux内核核心代码在kernel目录中 README 介绍了什么是Linux,Linux能够在哪些硬件上运行,如何安装内核源代码等 构造一个简单的linux系统m

跟踪调试Linux内核的启动过程

跟踪调试Linux内核的启动过程---使用gdb 符钰婧 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 本次的实验是使用gdb跟踪调试内核从start_kernel到init进程启动,并分析启动的过程. 1.首先是在实验楼虚拟机上进行调试跟踪的过程. (1) 先构造一个简单的Linux系统 (2) 接下来使用gdb跟踪调试内核 启动(窗口被冻结) 另开一个shell窗口(水平分割)

linux教程——1.启动过程

Linux 系统启动过程 linux启动时我们会看到许多启动信息. Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 运行init. 系统初始化. 建立终端 . 用户登录系统. 内核引导 当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动. 操作系统接管硬件以后,首先读入 /boot 目录下的内核文件. 运行init init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任

跟踪分析Linux内核的启动过程--实验报告 分析 及知识重点

跟踪分析Linux内核的启动过程 攥写人:杨光  学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ) 知识总结: ****Linux内核中关键目录: arch:不同cpu的支持,我们主要关注的是其中x86文件夹 init:内核启动的相关代码,期中main.c是内核启动的起点,main.c中的start_kernel是内核初始化的起点 ker

基于 Docker 快速构建 Linux 0.11 实验环境

by Falcon of TinyLab.org 2015/05/02 简介 五分钟内搭建 Linux 0.11 的实验环境介绍了如何快速构建一个 Linux 0.11 实验环境. 本文介绍如何快速构建一个独立于宿主机的 Linux 0.11 实验环境,该实验环境可以用于任何操作系统的宿主开发机,将非常方便各类学生学习 Linux 0.11,本文只介绍 Ubuntu.在 Windows 和 Mac 下可以用 VirtualBox + Boot2Docker 来启动. 下文要求已经安装 git 和

Linux 系统的启动过程

阅读目录 Linux 系统启动过程 内核的引导 运行init 运行级别 系统初始化 建立终端 用户登录系统 图像模式与文字模式的切换 Linux的关机 当我们在启动Linux操作系统时,会显示出硬件自检以及很多的启动信息,包括启动失败的我们都一目了然! 在Centos 5.x版本上是可以完全可以看见硬件自检以及启动信息的 在Centos 6.x版本上只显示进度条,只需要按F4 或者 root用户修改 /boot/grub/grub.conf 文件 vim /boot/grub/grub.conf

Linux 0.11下信号量的实现和应用

Linux 011下信号量的实现和应用 生产者-消费者问题 实现信号量 信号量的代码实现 关于sem_wait和sem_post sem_wait和sem_post函数的代码实现 信号量的完整代码 实现信号量的系统调用 测试用的应用程序的实现 Linux 0.11下信号量的实现和应用 1.生产者-消费者问题 从一个实际的问题:生产者与消费者出发,谈一谈为什么要有信号量?信号量用来做什么? 问题描述:现在存在一个文件”.\buffer.txt”作为一个共享缓冲区,缓冲区同时最多只能保存10个数.现