操作系统 L3操作系统启动(网易公开课)

bootsect.s(引导扇区程序)做了件什么事?

将硬盘中的OS程序(setup.s)读入内存

今天看一下setup.s后又做了什么事。



为什么一开始操作系统的程序要用汇编来编写?因为我们要严格地控制程序在哪里执行。汇编能做到,而C语言要需要编译才可以,在哪里执行我们是控制不了的。

为什么要做这件事情(扩展,获取内存的大小)呢?

为了以后要管理内存,必须先知道内存的大小。

还要获得其他参数:如光标位置,显卡参数等等。

获得之后就会形成一个数据结构的表。以便后面来管理。

之后就将操作系统的全部代码移动到0地址处,固定在内存中。以后应用程序就放在操作系统之上啦!(这样也解释的通为什么4G的内存发现可用的内存不够4GB,因为一部分内存被操作系统占用啦)

如果把这门课的全部代码(摘自Linux0.11源码分析)全部看懂,你就已经直到了操作系统的基本样子。有余力再去阅读《Linux0.11源码分析》。

这样后,setup.s就完成基本工作了。

setup.s做的最后一件事是:

jmpi 0,8这条指令在我们课程中发挥着非常至关重要的作用。能理解它,可以说对操作系统的认识有了一定的层次。

jmpi 0,8 的含义是:把0赋给IP,把8赋给CS。

这样就跳到00080处了。但如果真的跳到80处就会死机。这条指令实际跳到了0地址处。

因为此时访存能力只有20位,最大只有1MB,那么现在的计算机访存能力已经达到了4GB,那么如何改变访存方式呢?

要从16位机切换到32位机的样子。(1M->4GB).

32位模式也叫做保护模式。必须从实模式切换到保护模式下工作。

所以setup.s最后的事情就是切换到保护模式下

16位模式和32位模式的本质区别是什么?CPU的解释程序不一样。

之前是CS;IP ,CS左移4位后加上IP。但是现在不能这样解释了。

要切换到另一条电路来执行。

cr0寄存器如果是0,就是为实模式,为1就是保护模式。

这两条指令执行完毕后,CPU就走另外一条电路了。

这条解释执行的电路要怎样解释执行呢?

CS这时变成了选择子(selector)

这时查找指令的地址的方式就变成了:CS的作用为选择表中的一个项,在这个项中取出基地址,再和IP偏移地址加在一起产生32位地址。

如果要想32位的寻址方式好使,那么就需要著名的gdt(global discription table)表

setup.s初始化gdt的部分:

切换到32位寻址方式后,CS和IP都变成了32位的寄存器。

此时中断函数也要去gdt表项里去查找。

其实是跳到了0地址去执行。

编写操作系统,除了编写操作系统的源代码以外,还要编写操作系统的控制代码,比如system是由一大堆子文件集合起来的,那么就需要你控制谁先执行。

这就是著名的makefile

学完了这个课程后,makefile必须会用!

像编辑器,直接用快捷键就能把源代码文件编译好,是因为内部帮你实现了makefile。

system是由许多子文件像bootsect,setup,head,init等组合而成,最后生成一个镜像文件Image。

最后LD,链接,生成了tools/system。

第一个模块是bootsect,接着是setup,接着是head,接着是main

head.s做了些什么事情?

又一次初始化了idt表和gdt表

刚才为啥要初始化gdt表?只是为了跳到jmpi 08这个地方去。所以临时建立gdt表。

这一次建立的表,是使操作系统真正开始工作。

还有一个要注意的是:现在的汇编代码和之前的不一样了。变成了32位的汇编代码。

操作系统特别复杂,使用了3种汇编语言:16位汇编,32位汇编,和内嵌汇编。

head.s(汇编)会跳转到main函数部分,main是一段C函数。

可以看到这是压栈操作,下图配和理解,压完main函数后,返回L6,L6将继续执行L6,这时就会死机。所以操作系统是永远不会死机的。

进入了main函数:

可以看出,main函数用于不会退出(因为没有返回L6的语句)。

可以看到,这里的函数大部分作用都是初始化。

这里只说一个,明白了它,其他的作用大概也就明白了

内存的初始化。

每4K进行一次初始化,初始化为0。4K称为一页,我们在内存管理的时候再详细说明。

end_mem就是你的机器的内存大小,这个参数是之前setup.s程序读取内存的时候获取的。

到此,系统启动基本完成。其实上就是干了两件事:1.把操作系统读入内存 2.初始化

原文地址:https://www.cnblogs.com/JasonPeng1/p/12110141.html

时间: 2024-10-21 05:24:27

操作系统 L3操作系统启动(网易公开课)的相关文章

iOS 网易公开课解析示例

使用AFNetWorking请求数据,并用TFHpple进行解析 解析内容:示例解析的是首页中小编推荐标题栏的第一个项 - (void)wangyi {     // 网易公开课地址     NSString *str=[NSString stringWithFormat:@"http://open.163.com/"];     NSURL *url = [NSURL URLWithString:[str stringByAddingPercentEscapesUsingEncodi

浙江理工大学公开课:设计与生活_全6集_网易公开课

浙江理工大学公开课:设计与生活_全6集_网易公开课 中国大学视频公开课  浙江理工大学公开课:设计与生活

用python打造网易公开课视频下载软件

主要分为三部分:1.整体要实现的功能.2.贴出程序源代码及exe程序贴图3.各个资源下载地址 第一.整体要实现的功能 1.根据url地址,获取课程视频地址 2.增加图形化界面 3.将python程序,发布为exe文件,这样大家不安装python就可以运行了 4.由于下载文件名字并不是课程名字,所以下载后要能够实现批量重命名(目前1.0版本未实现) 第二.程序源代码及exe程序贴图 1.程序源代码:down163openv1.0.py 1 #coding:utf-8 2 import urllib

手把手教你用python打造网易公开课视频下载软件1-总述

最近准备重温一下算法导论,感谢大网易把MIT算法导论课程全部贴出来,地址为:http://v.163.com/special/opencourse/algorithms.html 在线看时,网速实在太慢,于是决定下载下来,一个一个的下载不是我等IT男所能忍受的,用迅雷抓取吧,不是特别爽,恰巧前两天刚刚看了下python,于是准备自己写个小软件,练练手,正好可以用这个实际的东西,练练python. 好吧,既然是总述,那么我把接下来要讲的东西的整体轮廓都写在这篇里面,所有需要下载的资源也都会在这里贴

手把手教你用python打造网易公开课视频下载软件3-对抓取的数据进行处理

上篇讲到抓取的数据保存到rawhtml变量中,然后通过编码最终保存到html变量当中,那么html变量还会有什么问题吗?当然会有了,例如可能html变量中的保存的抓取的页面源代码可能有些标签没有关闭标签,例如<div>hello</,这样的错误,那么怎么处理呢?接着看下面的代码: soup=BeautifulSoup(html) 其中利用模块BeautifulSoap,可能很方便去整理html源文件内容,这里我写了个小例子,大家看一下,代码如下: html='<html>&l

手把手教你用python打造网易公开课视频下载软件4-图形化界面

上一篇讲解完函数:def getdownLoadInfo (url): 传入公开课的url地址,就可以提取课程的信息,这一篇讲解一下如何编写图像化界面.大概思考一下图像化界面需要的内容: (1)一个标签:显示为:"请输入公开课地址" (2)一个文本框:用来输入地址 (3)一个按钮:点击用来提取视频信息 (4)一个标签和多行文本框,其中标签用来显示课程信息,多行文本用来显示下载链接 完成后的效果图如下: 我们先贴出代码: #创建APP app=wx.App(False) #创建frame

网易公开课中英字幕文件合并代码

如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 下载了网易公开课的视频之后,发现它的中文和英文字母是分开的,用其他播放器打开的时候只能载入一个字幕,于是就想合并2个文件 思路: 假定英文字幕的文件名叫1.srt,中文字幕的文件名叫2.srt,新合并的文件名叫3.srt.假设起始行为1. 读取1.srt中的每一行,同步读取2.srt中的每一行,并且将1.srt的数据写入3.srt,当发现行数对4取余的值为3时,将2.srt中读取的数

网易公开课倍速播放

  最近在看网易公开课的视频,无奈的是网易不提供倍速播放.想到html5中video中有playbackRate属性(chrome&&safari),可以以此来实现自定义倍速播放.   注意到网页源代码里有这一段: 网易直接提供了m3u8的地址,利用正则提取出来换上mp4即为视频源地址. 通过设置display为none可以屏蔽原来的flash播放器.  下面只要document.createElement来创建所需的video等再添加进body即可显示HTML5的视频.设置video.p

新浪公开课和网易公开课-开放课件联盟

网易公开课是属于OCWC(Open Course Ware Consortium 开放课件联盟) OCWC是由MIT发起的, 非盈利目的的公益组织, 遵守CC协议. 目的就是为了知识传播, OCWC本身没有商业模式, 也没有这方面的计划. 新浪应该还没有加入OCWC, 是遵守CC协议进行的再次传播.国内公开课的CC协议方面, 使用的是 署名, 相同方式共享, 非商业使用. 对于这类公开课, 大公司本身不求在上面获得直接的经济回报. 一方面确实是功德无量, 加速了知识的传播速度和广度, 另一方面也