当前位置: 首页 > 编程日记 > 正文

计算机启动和操作系统加载小话

整个启动和加载过程可分为若干步骤,或者称为若干个状态,或者快照,下面的每一段都是描述一个快照。(类似自动状态机)

1、电源稳定(POWER GOOD)

按下启动键后,电源首先启动。为了保证安全使用,电源的设计采取了许多保护措施,所以电源从起振到稳定有一定的延迟。电源各部分(各输入电压和输出电压等)稳定后,会分别发送一个检测信号,此信号电压为高时表示稳定。所有检测信号都为高时,就产生一个POWER GOOD信号。如果主板接收不到该信号,时钟芯片会一直向cpu发送RESET信号(等同于按下重启键),这样cpu就不会工作。

2、CPU电压稳定

CPU的VID0-VID3引脚,使CPU工作电压与时钟信号匹配。

3、CPU跳转到BIOS程序

CPU预编程,使CPU执行0XFFFF0H处的JUMP指令,从而跳转到BIOS(basic input/output system)程序(不同的BIOS,所在地址不同)。

4、CPU执行POST(power on self-test 上电自检)

BIOS首先进行的就是上电自检,用来检测各硬件设备工作状态是否正常。BIOS厂商对每一个设备都给出了检测代码(POST CODE,即开机自我检测代码),对某一个设备进行检测时,首先将检测代码发送到80H检测端口,检测通过后,再发送下一个设备的检测代码进行检测。如果检测失败,检测代码会留在80H端口,检测程序也会停止,并根据预先设定好的警报声(此时显卡还未初始化,不能显示)进行报警(BIOS厂商对不同的设备定义了不同的报警声,我们可以根据报警声的不同来判断故障,Intel POST相关)。

5、初始化

包括创建中断向量表、设置寄存器、对一些外部设备(显卡等)进行初始化和检测,其中最重要的是对BIOS的设置,主要是对硬件参数的设置。初始化完毕,如果硬件配置发生变化,会进行ESCD更新。ESCD是BIOS和操作系统交换硬件配置信息的一种方法,它保存在CMOS中。

6、BIOS按CMOS设定的顺序启动相应设备

7、寻找活动分区

假设操作系统放在硬盘上,在启动硬盘后并不知道硬盘里有什么,一个硬盘有几个区,每个区都可能有操作系统,要想启动操作系统,就必须找到存放操作系统的区。所以,对待硬盘,所有的BIOS都先读取硬盘的0磁头0柱面1扇区,这里存放着主引导记录MBR(Main boot record ),该扇区称为主引导扇区。BIOS将控制权交给MBR,来找到并加载操作系统。

要了解如何找到活动分区,首先必须了解主引导扇区的结构。

主引导扇区是0磁头0柱面1扇区,磁头和柱面都是从0计数,扇区则从1计数。0磁头0柱面1扇区是第一物理扇区。该扇区共512字节,分为三部分。第一部分是MBR,存放程序,大小是446字节,范围是0-445字节(0x00H - 0x1BDH);第二部分是磁盘分区表DPT(Disk Partition table),大小为64字节,范围是446-509字节(0x1BEH-0x1FDH);第三部分是结束标志,大小为2字节,范围是510-511字节(0x1FEH-0x1FFH),其值一般为0xAA55H。

MBR里有启动代码和数据,不同的boot loader启动代码不同,但不论如何,分区表的结构都是相同的,所以先介绍一下分区表。

分区表可以容纳四个分区的信息,每个分区占16个字节。每个分区的16个字节表示的信息如下:

第0个字节:引导字节。80H代表活动分区,00H代表非活动分区;

第1-3个字节:本分区的起始扇区。最低位字节(第一个字节)代表磁头号,次高位字节的低6位代表扇区号,次高位字节的高2位和最高位字节的8位表示柱面号。

第4个字节:分区类型符。

00H——代表该分区未用(即没有指定)

01H——FAT12基本分区

04H——FAT16基本分区

06H——big FAT16基本分区

0BH——FAT32基本分区

05H——扩展分区

07H——NTFS分区

0FH——(LBA模式)扩展分区

83H——linux分区

第5-7个字节:本分区的结束扇区。结构类似开始分区;

第8-11个字节:本分区起始扇区距该分区的分区表所在扇区的扇区数之差;

第12-15个字节:本分区的总扇区数;

下面介绍DOS下引导操作系统的过程。注意:MBR程序的作用是找到活动分区(将要启动的操作系统所在的分区),并将控制权交给活动分区的系统引导程序。

1)BIOS把主引导扇区的512字节拷贝到内存的0:7c00H(为了和软盘的拷贝位置一致,BIOS自动完成此拷贝)处,将控制交给MBR代码。

2)MBR把512个字节搬移到0:600处,为之后活动分区引导程序留出空间。

3)MBR检查依次检测四个分区表的第一个字节,若为80H,则继续检测其他分区表确保只有一个活动分区,否则会发生错误;若为00H,则继续检测其他分区,若四个分区检查完毕,仍没有检测到活动分区,说明没有可以启动的分区,则调用INT 18H进入ROM BASIC(一种程序解释器,可以自己编写BASIC程序运行)。

4)找到活动分区后,根据分区表中分区起始位置等信息,读取该分区第一个扇区的内容到0:7c00H,将控制全交给该活动分区引导程序。该引导程序将加载内核,内核会加载操作系统。

Grub主引导扇区暂留。

8、加载内核和操作系统

转载于:https://www.cnblogs.com/ithink/p/3576464.html

相关文章:

java清空栈_java - 如何使用Intent.FLAG_ACTIVITY_CLEAR_TOP清除活动堆栈?

java - 如何使用Intent.FLAG_ACTIVITY_CLEAR_TOP清除活动堆栈?我已经阅读了几篇关于使用它的帖子,但必须遗漏一些因为它不适合我。 我的活动A在清单中有launchmode “singleTop”。 它启动活动B,启动模式“singleInstance”。 活动B打开浏览器…

「学习笔记-Linux」学习Shell Script

学习Shell Script Table of Contents 1 什么是Shell Scipt 1.1 程序书写1.2 程序执行2 简单Shell练习 2.1 例1 接收用户输入2.2 例2 按日期建立相似名字的文件3 判断式 3.1 测试文件是否存在3.2 test常用选项 3.2.1 文件类型3.2.2 权限3.2.3 文件新旧比较3.2.4 整数&#xff0c…

django admin组件

admin实例 from django.contrib import admin from app01 import models from django.utils.safestring import mark_safe # Register your models here. class UserInfoConfig(admin.ModelAdmin):# 自定义显示的东西def xxx(self):return mark_safe(<a href>xx</a>…

C语言网络编程:close或者shutdown断开通信连接

文章目录前言close函数介绍shutdown函数介绍前言 这里在主要通过实例进行描述close函数在网络编程中的使用 TCP编程模型中客户端或者服务器只要主动通过close发起断开连接的请求&#xff0c;则通信连接可以中断。 可以通过在主进程中抓取通信端的断开信号&#xff0c;比如SIGI…

Await, and UI, and deadlocks! Oh my!

It’s been awesome seeing the level of interest developers have had for the Async CTP and how much usage it’s getting. Of course, with any new technology there are bound to be some hiccups. One issue I’ve seen arise now multiple times is developers acc…

传智播客java基础的习题_传智播客java基础班(集合与IO)阶段测试题

本帖最后由 zhaodecang 于 2016-6-8 19:38 编辑单选题&#xff1a;(每道题目2分)1. ArrayList类的底层数据结构是( )a) 数组结构b) 链表结构 c) 哈希表结构 d) 红黑树结构2. LinkedList类的特点是( )a) 查询快b) 增删快c) 元素不重复 d) 元素自然排序3. Vector类的特点…

$@ 与 $* 差在哪?

$ 与 $* 差在哪&#xff1f; 要说 $ 与 $* 之前&#xff0c;需得先从 shell script 的 positional parameter 谈起...我们都已经知道变量(variable)是如何定义及替换的&#xff0c;这个不用再多讲了。但是&#xff0c;我们还需要知道有些变量是 shell 内定的&#xff0c;且其名…

[源码和文档分享]基于Netty和WebSocket的Web聊天室

一、背景 伴随着Internet的发展与宽带技术的普及&#xff0c;人们可以通过Internet交换动态数据&#xff0c;展示新产品&#xff0c;与人进行沟通并进行电子商务贸易。作为构成网站的重要组成部分&#xff0c;留言管理系统为人们的交流提供了一个崭新的平台。同时&#xff0c;聊…

t-tcpdump

文章目录写入和读取数据包抓取数据包抓取指定网卡流量指定数据的输出格式数据包抓取的方向输出信息的详细程度的可控选项抓取指定协议的数据包表达式介绍逻辑连接符的使用type的确定写入和读取数据包 在工作或者生活中的网络故障排除时最有力的方式就是抓包分析网络状况&#…

java jdk 8u111_8u111-jdk-alpine在java开发中的NullPointerException错误解决方案

问题描述在部署一个验证码服务的容器服务时遇到了一个空指针错误&#xff0c;错误代码为&#xff1a;java.lang.NullPointerExceptionat sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguratio…

sprintf函数做什么用?

sprintf函数原型为 int sprintf(char *str, const char *format, ...)。作用是格式化字符串&#xff0c;具体功能如下所示&#xff1a; &#xff08;1&#xff09;将数字变量转换为字符串。 &#xff08;2&#xff09;得到整型变量的16进制和8进制字符串。 &#xff08;3&#…

Yii学习笔记【3】

加载控制器及其方法&#xff1a; 根据route信息&#xff0c;获得当前控制器| 初始化当前控制器&#xff0c;CController::init()&#xff0c;默认为空| 执行当前控制器&#xff0c;CController::run()||----> 创建action&#xff0c;为空则默认为index|得到CInlineAction的实…

验证码相似问题

产生随机验证码时&#xff0c;类似数字1和小写字母l经常容易让人混淆分不清楚&#xff0c; 因此&#xff0c;产生随机验证码时应避免此情况 1&#xff08;一&#xff09;、l&#xff08;哎哦&#xff09;、I &#xff08;哎&#xff09;中三个任意两个或者全部不可同时存在 0&a…

C语言网络编程:accept函数详解

文章目录前言函数描述代码实例如何得到客户端的IP 和 端口号前言 当使用tcp服务器使用socket创建通信文件描述符&#xff0c;bind绑定了文件描述符&#xff0c;服务器ip和端口号&#xff0c;listen将服务器端的主动描述符转为被动描述符进行监听之后&#xff0c;接口accept通过…

java 声明静态类_java静态类声明--java类可以声明为static吗

为了理解static关键字在类声明中的使用&#xff0c;首先我们需要了解类声明。有两种类&#xff0c;一种是top-level class&#xff1b;一种是inner class。Top-level classestop-level class可以被声明为包成员&#xff0c;每一个top-level类对应于一个文件名与类名相同的java文…

单元测试资料汇总

从安装到配置 首先到官网http://www.nunit.org/下载如下图的资料&#xff0c;安装NUnit-2.6.1.msi包。 然后挂在VS2010外部工具这个地方来使用&#xff0c;工具—>外部工具—>添加—>标题&#xff1a;Nunit—>命令&#xff1a;安装路径—>确定。 然后打开Nunit&…

rhel5+nis+autofs+nfs

创建NIS服务器用户&#xff0c;用于客户端登陆 NIS服务器相关包&#xff1a;ypserv、ypbind(在RHEL5中默认已安装)、yp-tools(在RHEL5中默认已安装)。 运行nisdomainname test.com并把加入到如下位置 设置NIS服务器的域名 在NIS环境中将以NIS服务器上的所有用户用于NIS环境中所…

Beta冲刺 (1/7)

Part.1 开篇 队名&#xff1a;彳艮彳亍团队 组长博客&#xff1a;戳我进入 作业博客&#xff1a;班级博客本次作业的链接 Part.2 成员汇报 组员1&#xff08;组长&#xff09;柯奇豪 过去两天完成了哪些任务 熟悉并编写小程序的自定义控件展示GitHub当日代码/文档签入记录接下来…

C语言网络编程:listen函数详解

文章目录前言函数描述代码实例TCP服务器为什么调用listen前言 根据TCP编程模型中我们可以看到之前的socket和bind接口是tcp服务器在为接收客户端的链接做准备&#xff0c;保证tcp的面向字节流&#xff0c;面向连接的可靠通信服务正常进行。接下来的listen端口则为我们进行三次…

MVC页面加载速度优化小记

前言&#xff1a;最近做一个地图展示页面&#xff0c;业务初期没什么问题&#xff0c;运行一阵后报错&#xff1a; Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLeng…

java生成函数excel_java实现在excel中创建及读取公式

操作excel表格用公式来处理数据时&#xff0c;可通过创建公式来运算数据&#xff0c;或通过读取公式来获取数据信息来源。这里使用了java类库(Free Spire.XLS for Java 免费版)获取文件包后&#xff0c;解压&#xff0c;将lib文件夹下的jar文件导入Java程序。如图&#xff1a;(…

实战:使用TCP/IP筛选保护服务器安全

使用TCP/IP筛选保护服务器安全 对于部署在Internet的服务器&#xff0c;安全是必须要考虑的事情。为了降低服务器受***的危险&#xff0c;停止不必要的服务或在本地连接的TCP/IP属性中只打开必要的端口。 如图2-127所示&#xff0c;实验环境为Server的IP地址192.168.1.200&…

python中的协程(二)

协程 1、协程&#xff1a; 单线程实现并发 在应用程序里控制多个任务的切换保存状态 优点&#xff1a; 应用程序级别速度要远远高于操作系统的切换 缺点&#xff1a; 多个任务一旦有一个阻塞没有切&#xff0c;整个线程都阻塞在原地&#xff0c;该线程内的其他的任务都不能执行…

C语言网络编程:bind函数详解

文章目录函数功能函数头文件函数使用函数参数函数举例为什么需要bind函数服务器如何知道客户端的ip和端口号htons函数htons兄弟函数htonl,ntohs,ntohl为什么要进行端口的大小端序的转换inet_addr函数函数功能 bind API能够将套接字文件描述符、端口号和ip绑定到一起 注意&…

java flex 图片上传_flex上传图片到java服务器

今天弄flex上传图片到java&#xff0c;现在弄成功&#xff0c;中间也经常一点小波折&#xff0c;现记录一下。重点在java侧的实现。flex侧&#xff1a;文件上载到在url参数中传递的URL。该URL必须是配置为接受上载的服务器脚本。Flash Player使用HTTP POST方法上载文件。处理上…

开发者怎么样做到盈利

开发者如何赚钱? 不可回避的一点就是&#xff0c;开发者的产品要有足够好的用户体验。假设你会做手机游戏&#xff0c;那么把手游做好了之后用户的粘性很大&#xff0c;如果你做应用&#xff0c;那么你的应用下载会对用户产生有价值的东西。 其实如果你的产品真的有价值&#…

如何在Windows Azure VM上的SQL Server和Windows Azure SQL Database两者中做出选择

作者信息&#xff1a;本篇文章是由SQL Server Cloud Infrastructure Team的 Madhan Arumugam 和 Guy Bowerman共同著作。 简介 把SQL 数据托管在哪里&#xff0c;Windows Azure 为您提供了两个选择&#xff0c;VM上的SQL Server&#xff08;以下简称 SQL/VM&#xff09;和 Wind…

C语言网络编程:socket函数

函数描述 头文件 <sys/types.h> <sys/socket.h> 函数使用int socket(int domain, int type, int protocol); 函数功能&#xff1a;创建一个通信的终点&#xff0c;并返回一个文件描述符来代表通信的终点 函数参数&#xff1a; a. domain 代编当前创建的socket文…

python excel web_使用python在WEB页面上生成EXCEL文件

近日写的一个程序需要在WEB服务器上生成EXCEL文件供用户下载&#xff0c;研究了一下找到了以下比较可行的实现方案&#xff0c;下面以web.py为例&#xff0c;把相关代码贴出来供大家参考&#xff1a;首先需要下载生成EXCEL的模块&#xff0c;推荐使用xlwtimport xlwtimport Str…

dateTimePicker编辑状态下,取值不正确的问题

当对dateTimePicker进行编辑&#xff0c;回车&#xff0c;调用函数处理dateTimePicker的value值时&#xff0c;其取值结果是你编辑之前的值&#xff0c;而不是你编辑后的值&#xff0c;虽然dateTimePicker.text的值是编辑后的值&#xff0c;但使用起来不方便&#xff0c;因此暂…