linux系统启动过程

更新日期: 2019-09-29阅读: 2.7k标签: linux

BIOS

当我们给计算机加电的时候,计算机系统怎么知道该如何启动我们的操作系统呢?

首先计算机之中在主板上,有一个东西叫ROM(Read Only Memor),在ROM上固话了一些程序,被称为BIOS(基本输入输出系统),由于系统刚刚启动时处于实模式,关于什么是实模式,以及保护模式,可以看这篇文章

实模式可操作的空间非常有限,只有2^20也就是1M的地址空间


在X86系统之中,将 1M 空间最上面的 0xF0000 到 0xFFFFF,一共64K映射给了ROM,当访问到这块地址的时候,就会访问到ROM。当加电的时候,系统加载ROM之中的BIOS之前,会完成一系列初始化工作

1. CS(代码段寄存器)置为0xFFFF
2. IP(指令指针寄存器)置为0x0000

所以对于第一条指令会指向0xFFFF+0x0000,也就是0xFFF0,处于ROM的地址空间内,这是一个JMP指令会调到ROM中执行初始化的工作,也就是开始了BIOS

BIOS会检查两件事情

1. 系统硬件是否完好
2. 建立中断向量表和中断服务程序

在BIOS阶段,也可以通过键盘的方式对BIOS发出指令,一旦通过键盘,就肯定会触发一个中断来让系统处理你的指令,所以第二个步骤是很有必要的。此时BIOS前期的工作就算完成


BootLoader

BIOS完成上述步骤后,就需要开始加载操作系统。一般的操作系统,例如在windows我们都会安装在C盘也就是硬盘上。在BIOS上我们也可以看到启动盘的选择。

启动盘的特点如下:

- 一般位于第一个扇区
- 占用512字节
- 以0xAA55结束

满足上述条件,可以称之为启动盘,并且在512字节内完成启动的相关代码。

启动盘里的代码是GRUB2(Grand Unified Bootloader Version2),定义的。也就是说BIOS执行了启动盘中由GRUB2定义好的一系列加载操作系统的步骤

可以通过 grub2-mkconfig -o /boot/grub2/grub.cfg 来定义系统启动执行的选项。这些代码

grub2定义的操作系统的步骤可以分为以下几步:

- boot.img
- diskboot.img
- lzma_decompress.img
- kernel.img
- 启动内核


boot.img

由boot.S编译而成,一共512字节,正好符合启动盘的第一个扇区的大小,所以会安装在这个第一扇区,通常这个扇区成为MBR(主引导记录扇区)

BIOS会将boot.img从硬盘加载到内存中的0x7c00来运行,因为只有512个字节,所以boot.img的唯一使命就是加载grub2的另一个镜像core.img


core.img由lzma_decompress.img,diskboot.img,kernel.img和一系列模块组成

boot.img会先加载core.img的第一个扇区,也就是diskboot.img


diskboot.img

由diskboot.S编译而成,任务是将core.img的其他部分一块加载到进来,显示解压它的下一步骤,lzma_decompress.img,再往下就是kernel.img,最后则是各个modules的映射,这里还不到linux的内核,所有都是grub的内核


lzma_decompress.img

由startup_raw.S编译而成,因为后续的kernel.img是经过压缩过后的,所以需要解压,同时它还需要完成从 实模式——>保护模式 的切换,为的是能在更大的寻址空间里,加载更多的东西

切换到保护模式,需要完成一系列动作

1、启动分段,将寄存器里的段寄存器变成段选择子(类似于索引),来指向某个段描述符(真正的段的起始地址),实现不同进程切换

2、启动分页

3、打开Gate A20,也就是第21根地址线的控制线,在8086模式下,一共只有20个地址线,总共可以访问1M的地址空间,所以保护模式需要启动第21根,来增大可以寻址的空间


kernel.img

由startup.S及一堆C文件编译而成,startup.S会调用grub_main(grub kernel的主函数

主函数中

1. grub_load_config解析gurb.conf文件中的配置信息

2. 选定操作系统

3. 调用grub_menu_execute_entry,解析并执行选择的那一项

4. 其中选择的那一项可能会有很多指令,例如linux16,initrd等,都会执行对应的函数

5. 调用grub_command_execute,真正启动内核


总结


原文 https://www.heroyf.club/2019/09/29/linux_start_process/


链接: https://fly63.com/article/detial/5584

putty对Linux上传下载文件或文件夹

putty是一个开源软件,目前为止最新版本为0.70。对于文件或文件夹的上传下载,在Windows下它提供了pscp和psftp两个命令。pscp在命令提示符中使用,只要putty(ssh)能够远程,就能使用该命令。

sed 和 awk,所有的 Linux 管理员都应该会的技能!

我曾经有一次在 Reddit 看到一个帖子。这是一个很简单的需求,就像我们常用 Unix 的人每天遇到的一样。他的问题是,如何删除文件中的重复行,只保留不重复的。 这听起来似乎很简单,但是当文件足够大时,就会有些复杂。

在linux上部署自己开发的web项目

相信有很多做开发的小伙伴和我之前一样,只会在windows环境下,利用开发工具开发运行web项目,但是却不知道怎么把开发好的项目部署到linux服务器上去,并能够外网访问,这里是我自己摸索总结的过程

w3m浏览网页_linux在命令符界面如何浏览网页

w3m是个开放源代码的命令行下面的网页浏览器。 它支持表格、框架、SSL连线、颜色。如果是在适当的terminal上,支持多种操作系统,在命令行终端可以很好的支持中文。即使在没有鼠标支持的情况下也可以检查网页的输出。本文列出常用的快捷键。

Linux运维:mysql数据库的备份与恢复

运维工程师的日常工作需要对各种数据进行备份,其中数据库数据的备份当属重点之一,为了方便管理,选择哪种备份方案是很重要的。全量备份就是指对某一个时间点上的所有数据或应用进行的一个完全拷贝

Linux下4种禁用Root登陆的方法,你掌握了哪几种呢?

我们都知道 Linux 下 Root 用户的权限是最大的,因此一般不推荐直接使用 Root 用户操作。通常都是使用普通用户,在必要时通过 Sudo 命令来提权。在 Ubuntu 中,更是直接把 Root 用户直接禁用了。那么如何在 Linux 中禁止Root 登陆呢?今天,我们就来介绍几种常用的方法。

安全强化你的Linux服务器的七个步骤

这篇入门文章将向你介绍基本的 Linux 服务器安全知识。虽然主要针对 Debian/Ubuntu,但是你可以将此处介绍的所有内容应用于其他 Linux 发行版。我也鼓励你研究这份材料,并在适用的情况下进行扩展。

处理Linux文件的3个技巧

Linux 提供了许多用于查找、计数和重命名文件的命令。这有一些有用的选择。Linux 提供了多种用于处理文件的命令,这些命令可以节省你的时间

如何查看Linux哪些用户拥有sudo权限

本教程将讲解如何查看Linux用户是否有sudo权限。您还将学习如何查看Linux系统上的所有sudo用户。如何查看Linux哪些用户拥有sudo权限

linux搭建ftp服务器

运行以下命令安装 vsftpd;查看vsftpd文件夹;说明:/etc/vsftpd/vsftpd.conf 是核心配置文件。/etc/vsftpd/ftpusers 是黑名单文件,此文件里的用户不允许访问 FTP 服务器。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!