导航

操作系统学习笔记(一)

Posted on 2021-07-17 23:19  rossxp  阅读(90)  评论(0编辑  收藏  举报

前言

  首先引出操作系统这一概念,我们用计算机的目的是为了帮助人们解决一些实际问题,下面以输出“hello!”到显示屏为例:

 

   上面通过机器语言或者汇编语言完成操作很麻烦,对程序员来说很不友好。由此后来发展出来高级语言,高级程序应用,直接调用Printf ”hello!“ 便可,但是这些高级语言机器是读不懂的,所以需要一个中介,帮助我们实现转化,方便人类与机器的交流,这一中介便是操作系统。

 

 

 (1)操作系统的概述

 

   高效的使用硬件即很方便简单的管理硬件,包括CPU管理,内存管理,终端管理,磁盘管理,文件管理,网络管理,电源管理和多核管理等等。

 

  (2)计算机开机原理(以intel的x86架构计算机为例)

 

 BIOS=Basic input outpu system基本输入输出系统,它将带领CPU识别并加载主板上的重要硬件和集成元件,如硬盘、显卡、声卡以及各种接口,然后按照预设顺序读取存储器上操作系统的引导文件,通过设置的启动模式找到引导分区装载操作系统,如DOS、Windows、Linux等。装载完操作系统之后就隐藏在后台了。

而磁盘0磁道0扇区称为引导扇区,是开机时我们第一段能控制的程序。

 

 

 

 bootsect.s要做的就是,将setup和system模块从磁盘中读出来,放在内存中。之后bootsect执行完了之后,要将控制权交给setup,运用跳转。jmpi 0,SETUPSEG 此时程序执行完毕!!!

系统开机后,从0xFFFF0处(ROM)取出第一条指令开始执行,进行BIOS自检,检查正常后就用BIOS的输入功能将启动磁盘上的bootset.s读入内存0X7C00处,然后将自己移动到0X90000处。
该段程序的主要作用就是:
1)将setup加载到bootset后,0X90200处
2)调用int 0X10中断,输出屏幕信息:“Loading system…”
3)将system模块加载到内存0X10000处
4)跳到setup执行setup程序

 从bootset.s跳转到setup.s中执行,代码作用如下:
1:获取初始化的基本参数
2:进入保护模式
1)将system模块从0x10000-0x8ffff整体移动到0X0地址处,这就是为什么前面要把引导扇区的512字节的内容进行转移。
2)启动保护模式,因为实模式的寻址方式是16位cs:4位偏移=20位,最多有1M的寻址空间,太小了,不满足现实需求,因此要切换寻址模式,切换到32位保护模式,这样就有了4G的寻址空间。
3)进入32位保护模式运行,并跳转到head.s

 

 

 保护模式下的寻址方式:

 

 

 

 

 

根据GDT表项我们可以知道保护模式下的jumpi 0,8其实就是跳转到内存零地址,我们知道system.s已经转移到零地址,所以至此setup模块执行完毕。

这时转移到system中的head.s开始执行。

 

 

system由许多的文件编译而来的,包括head.s,那么怎么控制head.s是第一段被执行的呢?这里涉及到makefile文件的编写。

makefile其实就是一个文档,里面定义了一系列的规则指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,它记录了原始码如何编译的详细信息! makefile一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

head.s设置报表等操作之后会跳转到main函数,这里的main跳出之后会执行L6也就是死机,但是main函数正常情况下是不会跳出的。

接下来进入main,完成许多模块的初始化工作。

 

 

 父进程因为成功创建子进程,所以fork()>0 不进init 而子进程fork()==0 进入init,启动shell。

 3)加载操作系统总结

 boot->setup->system(head->main)

总的来说就是完成的工作就是把操作系统从磁盘读入内存(从而可以取指执行)和进行操作系统的初始化。