操作系统的启动是个很令人好奇的话题,从按下计算机电源的那一刻,计算机从裸机开始呈现一个丰富的系统界面,这个从只有硬件逻辑到软件逻辑的过程是如何完成的?这里我们将从硬盘分区,三方协议,grub引导启动程序进行讲述,首先介绍硬盘MBR分区形式,然后介绍CPU,BIOS,系统的三方协议,讲述从CPU的硬件逻辑最终运行内核的软件逻辑的过程,最后介绍一下引导启动程序的发展,在grub这些引导启动程序中如何继续遵守三方协议。
电脑启动后,CPU逻辑电路被设计为只能运行内存中的程序,没有能力直接运行存在于软盘或硬盘中的操作系统,如果想要运行,必须要加载到内存(RAM)中。
从打开电源到开始操作,计算机的启动是一个非常复杂的过程。 我一直搞不清楚,这个过程到底是怎么回事,只看见屏幕快速滚动各种提示...... 这几天,我查了一些资料,试图搞懂它。下面就是我整理的笔记。 零
首先简单认识一下硬盘的物理结构,总体来说,硬盘结构包括:盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器、接口、缓存等几个部分。所有的盘片(一般硬盘里有多个盘片,盘片之间平行)都固定在一个主轴上。在每个盘片的存储面上都有一个磁头,磁头与盘片之间的距离很小(所以剧烈震动容易损坏),磁头连在一个磁头控制器上,统一控制各个磁头的运动。磁头沿盘片的半径方向动作,而盘片则按照指定方向高速旋转,这样磁头就可以到达盘片上的任意位置了。
系统引导环节是操作系统启动过程中的最重要环节,也是最容易出问题的环节之一。按照个人计算机的硬件标准,引导环节发生在计算机的硬件系统检测完毕之后。具体的引导工作,是由BIOS完成的。BIOS维持一个可用于引导计算机的硬件设备列表,比如本地硬盘、本地光驱、网络、USB接口设备等,然后做一个排序。BIOS会试图从整个序列的第一个设备开始,检查其状态和引导能力。比如针对光驱,则首先会判断光驱中是否存在光盘,如果不存在,则跳过光驱设备,进入下一个设备的检测过程。如果发现有光盘存在,则试图读取光盘的第一个扇区,并检查这是否是一个可引导扇区(比如通过检查扇区的最后两个字节是不是0x55AA)。如果发现不是一个可引导扇区,则也是跳过光盘,再检查引导序列中的下一个设备,直到发现一个可引导的扇区为止。如果遍历完整个引导设备列表,未找到任何可引导的扇区代码,则引导过程失败,BIOS会提示无法找到可启动设备。如果在这个过程中能够找到一个可引导扇区,则BIOS会把该扇区的内容加载到内存,并跳转到该扇区,执行引导代码。这个跳转指令,就是BIOS程序在计算机启动过程中的最后一条指令,至此,BIOS的工作结束。后续工作,将由引导扇区代码完成。
软件运行时输入单元输入内容,进入内存,CPU由控制单元和算术逻辑单元组成,控制单元控制算术逻辑单元从内存中读取数据,内存和外部存储设备进行交互,运算完毕以后输出到输出单元,完成软件的运行。
我一直搞不清楚,这个过程到底是怎么回事,只看见屏幕快速滚动各种提示…… 这几天,我查了一些资料,试图搞懂它。下面就是我整理的笔记。
在上一篇文章中Linux从头学05-系统启动过程中的几个神秘地址,你知道是什么意思吗?,我们以几个重要的内存地址为线索,介绍了 x86 系统在上电开机之后:
Linux上的文件系统一般来说就是EXT2或EXT3,但这篇文章并不准备一上来就直接讲它们,而希望结合Linux操作系统并从文件系统建立的基础——硬盘开始,一步步认识Linux的文件系统。
前些天群友@Seraph_JACK在整引导,于是我也跟着云了一下。结果发现,我对引导相关的了解着实拉跨。所以趁此机会,正好完整学习一下引导相关的知识。本篇文章大致会涉及MBR、GPT、UEFI等内容,以使用Grub引导Linux为例,来分析启动的具体过程。
磁盘的组成:主要由盘片、机械手臂、磁头、与主轴马达所组成。而数据的写入其实是在盘片上面。盘片上面又可细分出扇区(Sector)与柱面(Cylinder)两种单位,其中扇区每个为512bytes那么大。假设磁盘只有一个盘片,那么盘片如图所示:
不管是Windows还是Linux操作系统,底层设备一般均为物理硬件,操作系统启动之前会对硬件进行检测,然后硬盘引导启动操作系统,如下为操作系统启动相关的各个概念:
为何更改为 4096 字节扇区? 如果您熟悉磁盘结构,就知道磁盘是被分解成扇区 的,大小通常是 512 字节;所有读写操作均在成倍大小的扇区中进行。仔细查看,就会发现硬盘事实上在扇区之间包括大量额外数据,这些额外字节由磁盘固件使用,以检测和纠正每个扇区内的错误。随着硬盘变得越来越大,越来越多的数据需要存储在磁盘的每一单位面积上,导致更多低级别错误,从而增加了固件纠错功能的负担。 解决该问题的一个方法是将扇区大小从 512 字节增加为更大的值,以使用功能更强大的纠错算法。这些算法可使每个字节使用较少的数据,从
计算机系统的启动过程是非常复杂的,也诞生了很多流派,比如BIOS-MBR启动方式、UEFI-GPT启动方式等。不管是哪个流派,广义上的启动过程是类似的,以BIOS-MBR为例,可以简化为如下步骤:
硬件设备在Linux中的命名 Linux中每一个设备都被当成文件,所有的设备文件都在/dev这个目录下。 设备 文件名 IDE硬盘 /dev/hd[a-d] SATA/USB/SCSI硬盘 /dev/sd[a-p] U盘 /dev/sd[a-p] 软驱 /dev/fd[0-1] 打印机 25针:/dev/lp[0-2] usb:/dev/usb/lp[0-15] 鼠标 usb:/dev/usb/mouse[0-15] ps2:/dev/psaux 当前CD/DVD RO
这小节将介绍各种BR(boot record)和各种boot loader,但只是简单介绍其基本作用。
目前,计算机市场提供了大量以数字形式存储信息的机会,现有的存储设备包括内部和外部硬盘驱动器、照片/摄像机的存储卡、USB 闪存驱动器、RAID 集以及其他复杂存储。数据片段以文件的形式保存在它们上,如文档、图片、数据库、电子邮件等,这些数据必须在磁盘上有效地组织并在需要时轻松检索。
LINUX 开机过程指的是从打开计算机电源直到LINUX显示用户登录画面的全过程。分析LINUX开机过程也是深入了解LINUX核心工作原理的一个很好的途径。 一般的开机启动无非就是四步:BIOS加电自检(检测硬件什么之类的,寻找启动磁盘,在启动磁盘加载MBR);Boot Loader(加载grub.conf顺序启动) ;启动内核(内核会尝试挂载根文件系统,根文件系统至少包含 /etc /bin /sbin /lib /dev 这5大目录); INIT进程初始化(内核会按 /sbin/init /etc/in
硬盘的种类主要是SCSI 、IDE 、以及现在流行的SATA等;任何一种硬盘的生产都要一定的标准;随着相应的标准的升级,硬盘生产技术也在升级;比如 SCSI标准已经经历了SCSI-1 、SCSI-2、SCSI-3;其中目前咱们经常在服务器网站看到的 Ultral-160就是基于SCSI-3标准的;IDE 遵循的是ATA标准,而目前流行的SATA,是ATA标准的升级版本;IDE是并口设备,而SATA是串口,SATA的发展目的是替换IDE;
开机的时候,寄存器cs:ip会强行指向FFFF0H这个地方,这是bios的地址。然后开始执行bios指令,bois指令会把启动盘第一个扇区的数据加载到0x07c00。然后开始修改cs:ip为0x07c00,接着执行。这时候,操作系统开始登上舞台。而启动盘第一个扇区的代码就是下面这块代码。这段代码主要作用是加载其他代码。加载完后,跳到被加载代码的地方继续执行。下面我们分析这个过程。
看了上面的基本过程后,相信大家可以理解了,如果我们要操作磁盘读写的话,就是告诉磁盘控制器关于柱面、磁头、扇区、缓 存位置,然后是读还是写,剩下的由磁盘控制器完成。
硬盘的物理结构是比较复杂的,这里我们只需要知道最常用到的几个术语即可,也就是chs寻址中所涉及到的结构
而以上两个部分我们称为文件系统!我们在上一章已经学习过了在系统中一个被打开的文件,而本章我们开始学习在磁盘中没有被打开的文件。
如果有一天你们公司很重要的一台Linux服务器突然启动不了了,重装系统又浪费时间,如果是启动过程有问题,那么你知道启动过程可以快速定位系统问题,很快就可以解决。
磁盘中可以被划分成一个一个的环,每个环都是一个磁道。每个磁道又可以被均分成一个一个的扇区,扇区是磁盘IO的基本单位(想要修改扇区中的一个比特位就必须把该扇区的全部比特位都加载到内存中)。磁盘中的盘面,磁道和扇区都是有编号的。要访问一个扇区中的内容,必须通过磁头先定位到哪一个磁道(柱面cylinder),再确定要读取哪一个盘面(磁头head),最后确定磁道上的哪一个扇区(sector),这种定位法被称为CHS定位法。
服务器:一直开机,不要宕机。(对硬件损耗巨大,极易损坏,要做好监控,防患于未然)
首先,让我们看一下硬盘的发展史: 1956年9月13日,IBM的IBM 350 RAMAC(Random Access Method of Accounting and Control)是现代硬盘的雏形,整个硬盘需要50个直径为24英寸表面涂有磁浆的盘片,它相当于两个冰箱的体积,不过其存储容量只有5MB。 1971年,IBM开始采用一种名叫Merlin的技术生产硬盘,这种技术据称能使硬盘头更好地在盘片上索引。 1973年,IBM 3340问世,主流采用采用红色。这个大家伙每平方英寸存储1.7MB的数据,在当
在 Linux 系统中,目录、字符设备、块设备、套接字、打印机等都被抽象成了文件,也就是大家常说的“一切皆文件”。
课堂上芒果给大家介绍过Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。
硬盘扇区如上图划分,在系统扇区中,存在分区启动扇区(PBR),在MBR分区中存在主启动扇区。
很久以前喜欢捣鼓电脑啊外设什么的,却也没有搞出什么名堂。经常见到标题里的一些术语,却也只是一知半解。最近在复习操作系统,对以往的瞎捣鼓小有感触和总结。故写下此文。
1.固件firmware(cmos,bios)-》post加点自检 2.自举程序Bootloader(grub)-》载入内核 3.载入内核 -》驱动硬件 4.启动进程init -》系统启动的第一个进程 5.读取执行配置文件 /etc/inittab
在前文《磁盘开篇:扒开机械硬盘坚硬的外衣!》中,我们了解了机械硬盘的物理构造,是由磁盘面,磁道、扇区等更小的单位组成的,如下图:
在Linux系统中一切都是文件,硬件设备也不例外。既然是文件,就必须有文件名称。系统内核中的udev设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等;这对于陌生的设备来说特别方便。另外,udev设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev目录下的设备文件。Linux系统中常见的硬件设备的文件名称如下图:
Linux 中的各种事物比如像文档、目录(Mac OS X 和 Windows 系统下称之为文件夹)、键盘、监视器、硬盘、可移动媒体设备、打印机、调制解调器、虚拟终端,还有进程间通信(IPC)和网络通信等输入/输出资源都是定义在文件系统空间下的字节流。 一切都可看作是文件,其最显著的好处是对于上面所列出的输入/输出资源,只需要相同的一套 Linux 工具、实用程序和 API。你可以使用同一套api(read, write)和工具(cat , 重定向, 管道)来处理unix中大多数的资源. 设计一个系统的终极目标往往就是要找到原子操作,一旦锁定了原子操作,设计工作就会变得简单而有序。“文件”作为一个抽象概念,其原子操作非常简单,只有读和写,这无疑是一个非常好的模型。通过这个模型,API的设计可以化繁为简,用户可以使用通用的方式去访问任何资源,自有相应的中间件做好对底层的适配。 现代操作系统为解决信息能独立于进程之外被长期存储引入了文件,文件作为进程创建信息的逻辑单元可被多个进程并发使用。在 UNIX 系统中,操作系统为磁盘上的文本与图像、鼠标与键盘等输入设备及网络交互等 I/O 操作设计了一组通用 API,使他们被处理时均可统一使用字节流方式。换言之,UNIX 系统中除进程之外的一切皆是文件,而 Linux 保持了这一特性。为了便于文件的管理,Linux 还引入了目录(有时亦被称为文件夹)这一概念。目录使文件可被分类管理,且目录的引入使 Linux 的文件系统形成一个层级结构的目录树
FAT数组解析出来之后,就可以去解析目录信息和MiniSAT了,因为目录信息和MiniSAT的数据是很有可能需要多个扇区储存的,必然需要扇区链接的信息,所以FAT数组必须要先进行解析。
先讲一个作者大约5-6年前我在某当时很火的一个应用分发创业公司的面试小插曲,该公司安排了一个刚工作1年多的一个同学来面我,聊到我们项目中的配置文件里写的一个开关,这位同学就跳出来说,你这个读文件啦,每个用户请求来了还得多一次的磁盘IO,性能肯定差。借由这个故事其实我发现了一个问题,虽然我们中的大部分人都是计算机科班出身,代码也写的很遛。但是在一些看似司空见惯的问题上,我们中的绝大多数人并没有真正理解,或者理解的不够透彻。
在日常开发中一些看似司空见惯的问题上,我觉得可能大多数人其实并没有真正理解,或者理解的不够透彻。不信我们来看以下一段简单的读取文件的代码:
一、绪论 Linux系统在日常工作中已经是我们朝夕相处的亲密伴侣,每次当我们按下可爱的电源键那一刻起直到出现熟悉的登陆界面。这短短的一瞬间它都经历什么那?? 二、Linux启动过程 对于一台
Linux系统在日常工作中已经是我们朝夕相处的亲密伴侣,每次当我们按下可爱的电源键那一刻起直到出现熟悉的登陆界面。这短短的一瞬间它都经历什么那?? 二、Linux启动过程 对于一台安装了Li
你是否也和我一样,想要知道当我们轻轻按下电源键,电脑哔的一声响,几行字闪过,然后操作系统的启动画面出现,电脑启动可以被使用,这一系列过程中,电脑到底做了什么呢?
程序其实是由一堆指令组成的,因此程序载入后的解释执行的过程,其实总结就是四个字: “取指执行”
文件有很多,但是被打开的文件很少,这些没有被打开的文件在磁盘中,这就叫做磁盘文件。每次先打开一个文件,需要先找到这个文件,需要通过文件路劲及文件名先在磁盘中找到这个文件。本篇文章要研究的是磁盘文件,核心问题是如何存取问题。在研究这些问题之前,需要先认识一下硬件–磁盘
将数据保存在存储介质上,除了需要一个好的存储介质之外,还需要一个适当的机制去管理这些存储介质上的数据,以便上层应用包括操作系统可以方便快捷的访问到这些数据。传统上我们知道进行磁盘管理都是通过一些工具进行操作的,那么这些工具是否一定与操作系统有关呢?不是的,因为从操作系统角度来看,操作系统虽然一般具有文件系统管理功能,但本质上文件管理系统它是比较独立的一个功能,显然可见的,就是操作系统可以支持多个文件系统,如LINUX支持ext2,ext3等,Windows 7扶持fat32也支持NTFS,实际上LINUX也是支持NTFS的。从文件系统角度来看,文件系统将数据以文件、目录方式进行。组织。那么从磁盘的角度来说,应该怎么管理这些空间呢?我们前面了解到磁盘一般都分磁道和扇区,那么这些磁盘和扇区是如何与文件系统对应上的呢?。这里需要了解磁盘管理的两个关键:磁盘分区和磁盘格式化。进行磁盘管理一般都是采用一些专用的工具进行的,这些工具可以实现我们想要的如磁盘分区和格式化功能。通常将磁盘划分成多个分区(partitions),然后操作系统通过磁盘驱动程序来读取这些硬盘上的分区信息。一般的LINUX上根据不同的接口类型显示分区名,如IDE接口是hde[1—],SCSI接口是sda[1—]等,在Windows上通常分为C、D、…等。当硬盘分成各个不同大小的区后,格式化软件会将这些区再细分成不同的文件系统管理格式,比喻说C盘是NTFS格式,D盘可能是FAT32格式。同样在LINUX下也是将文件目录mount到指定分区的。因此分区对磁盘非常重要。这里讲述几个常见软件的操作:
我在互联网上经常看到这样的说法:RAID很危险,RAID磁盘阵列在重建过程中失败的可能性几乎是100%,因为硬盘驱动器已经变得非常大。
我们知道计算机硬件分为三大部分,即输入单元,输出单元,中央处理器。 CPU分为X86和X64.也就是我们所说的64位和32位。 CPU每次能能处理的数据量成为字组大小(word siz
领取专属 10元无门槛券
手把手带您无忧上云