好久不发学习笔记了,一部分是因为中秋后这周感冒了,过得实在怠惰,另一部分是因为之前领到老板布置的任务后,实在是很懵逼。
上周一再次和导师沟通了一波,还是很懵逼,没有揣度出来老板究竟想让我们干什么,好像是要做一个实时进程调度的实验方案?
直到上周四晚上,队友徐老板一语点醒梦中人:“老板可能会想‘让你们看点书就这么难吗?’要不然为什么我们都问了他两次了,他都在给我们介绍基础?”
哦哦哦哦,好有道理——
于是上周基本一周都在看书,还真的意识到了不少知识,尤其是操作系统底层。
这周的学习很大程度上填上了我知识拼图中黑色的一块——操作系统。作为硬件和软件的中间者,此前它一直都披着神秘的面纱,直到上周我才顿悟到“操作系统是软件,系统软件是软件,是由人类编写的代码!”,尽管我早就知道操作系内核不是像朱雀的那台白色战机那个粉色的内核*。
参考资料:
《x86汇编语言:从实模式到保护模式》(李忠等,2013)
知乎:如何编写一个操作系统?
《计算机硬件技术基础》(万晓东等,2010)
《自己动手写操作系统》(于渊,2005)
《30天自制操作系统》
李忠那本书讲得非常透彻,文风幽默不晦涩,4年前出版,在同类书中算比较新的,力荐!
正如徐老板所言:“我们现在应该看看基础,可能看着看着就知道老板让我们做什么了。”下面就开始讲一些最近顿悟到的东西,虽然可能有的东西是错误或者有纰漏的,以后再慢慢抿回来好了。
Intel处理器发展史
8086/8088
1978/1979
16位
80x86
1980s
32位(兼容16位)
Pentium奔腾系列
1990s/2000s
32位
Core酷睿系列
现在
64位(兼容32位)
原来它们都是一家的!我每天用的core i5的爷爷就是那个out了很久的8086!它们家每个处理器的指令写法虽有所不同,但是有继承性,理想情况我们照着硬件书写的程序是可以跑在我们笔记本的裸机上的!
2.程序段的“段”就是内存中的“段”,就是段址+偏移地址中的“段”。
3.什么是BIOS?什么是引导程序?
BIOS全称是“基本输入输出系统”。它由计算机厂家提供,是硬件自带的,作用是开机自检(判断各块硬件是不是都没坏)和自举(找到操作系统引导程序所在的位置并执行)。
引导程序放在引导扇区内,是几行指向操作系统入口的代码,规定引导扇区大小为512B,以0x55AA结尾,下面是一段最简单的引导扇区代码(来自《从实模式到保护模式》):
所以引导扇区并不神秘,相反,它的实现相当的“傻瓜式”。
4.如何从硬盘中读取用户程序到内存中?
详见《从实模式到保护模式》一书,大概步骤为:事先已知用户程序位置——>写数据总线——>读取。
而看这一点给我最大的触动就是领悟到:
所有的代码最终都将变成机器码,对于计算机而言,无论原来的程序是用C,还是Java还是汇编语言写成,最终存储在存储器中的,只是数字,二进制的0101太抽象了,那么可以想象成是十六进制的数字,这样起码对于汇编来说,数据段的存储器数据是可以预期的。
5.软中断INT3就是程序调试时用到的中断
比如我们用VS或者VC6.0或者其他IDE调试程序的时候,在某一步,估计是编译的那一步,在断点位置,用一种复杂的手法在代码处添加上了INT3(至于到底是怎么加的,我现在还没看懂┑( ̄Д ̄)┍)
6.在裸机上实现实时进程间调度的方案初步构想
①引导程序跳转到从硬盘中加载程序的程序A的入口(指令寄存器CS改成那行代码的地址);
②程序A从硬盘中读出程序C,程序C的功能是显示键盘输入的小写字符,或者按一下键盘任意键输出一个字符“c”,再设置好中断向量表,设置键盘中断处理程序,定位到程序C的入口。
②程序A从硬盘中读程序B1,B1的功能是不断在屏幕上输出字符“a”,放在内存的某段中;
③读程序B2,B2的功能是不断在显示器上输出字符“b”,放在内存的另一段中;
④利用时钟中断,在B1、B2两段程序中跳来跳去,比如每隔500ms跳转一次吧,模拟同优先级的两个进程时间片轮转调度(RR调度);
⑤开始实验。
太晚了今天就先写到这儿吧。
* 兰斯洛特是出自《反叛的鲁路修》,为向导兵器,由不列颠洛伊德·阿斯普林德所研制的最新型的第7代Knightmare Frame,是枢木朱雀的专用机体。