这学期的考试即将开始,也快要结束了,脑子里总是闲不住,定了一下下个学期的打算,一方面是好好地在intel实习,和前辈们多学点知识,另一方面,就是使自己的知识更扎实一点,所以想的办法就是,想自己编一个操作系统。
今天自修的时候,略想了一下具体的实现细节,写了接近2000多字的想象初稿,由于全部的实现细节,均是在自己的想法和利用已知道的知识出来的,所以未免会有差错,也可能会有误导读者的地方,还请严厉指正~
具体的实现大目标:利用大肆一年的时间(说起来简单,实际上在intel一周就要五天,11个月,估计也没有多长时间)
1。多进程的模型
2。完成自己的文件系统
3。有自己的进程控制机制
4。实现文件的读写操作
5。完成内存的分配问题
6。系统地引导以及驻留内存的操作
7。执行文件等操作
8。想到继续...
具体的硬件环境,就是实现可供开发的平台,目前可以想象的到的有:
1。在skyeye上模拟
优点及缺点:比较方便调试,但恐怕其对于一些基本的硬件和真实地会有些不同,所以可能导致在虚拟机上能跑起来的操作系统在实际当中却不可以
2。找嵌入式的开发板子
优点及缺点:有实验室,老师基本上可以说通给开发环境,一般是arm7的板子,但是需要经常用jtag或者bootloader来烧写flash,也可以采用bootloader+system的方式,后者好一些,但是会比较麻烦,而且我是夜猫子,一般在夜里头脑会比较清醒一点,这里实验室就可能不大方便。
3。用vmware
比较困难!需要将代码写好然后再安装调试...不知道如何直接写到硬盘上,调试很不方便
4.直接用pc机
cancel掉。调试太太麻烦
暂定为第一方案,第二方案为被选方案
需要解决的问题
1。在把文件系统格式化成你想要得比如CL(自己的:))格式之前,怎样把文件“写”到文件系统当中?想到这里豁然开朗了,dos的做法,由于bios可以识别软盘,故将引导文件放在软盘上(软盘的文件系统从何而来?可能是一种标准-_-),为了追求最初最初的文件系统概念(写得有点乱,基本上想到啥就写啥了,一下子想到的东西太多了),可以设想用JTAG把程序放到flash当中,然后机器就开始读指令(0地址),跳转,执行指令。而这时,假若操作系统无硬盘,就把内存假设成为分成一个块一个块的用文件系统的概念进行操作。想回来了,硬盘每个分区都有自己的主引导区,一般PC在电源一开时,是由内存中地址FFFF:0000开始执行(这个地址一定在ROMBIOS中,ROMBIOS一般是在FEOOOh到FFFFFh中),而此处的内容则是一个jump指令,jump到另一个位于ROMBIOS中的位置,开始执行一系列的动作,包括了检查RAM,keyboard,显示器,软硬磁盘等等,这些动作是由系统测试码(systemtestcode)来执行的,随着制作BIOS厂商的不同而会有些许差异,但都是大同小异,读者可自行观察自家机器开机时,萤幕上所显示的检查讯息。 紧接着系统测试码之后,控制权会转移给ROM中的启动程序(ROMbootstraproutine),这个程序会将磁盘上的零道零扇区读入内存中(这就是一般所谓的bootsector,如果你曾接触过电脑病毒,就大概听过它的大名),至于被读到内存的哪里呢?--绝对位置07C0
:0000(即07C00h处),这是IBM系列PC的特性。我们就在这里把一开始的引导程序放在这里,然后系统的控制权就可以拿到了自己的手里,然后进行操作了。。。[细节很多,需要具体研究]
2.引导了以后麽就可以操作自己的文件系统了,利用自己的规范。现在来介绍一下具体的文件系统究竟有什么不同?
磁盘的第一个扇区的具体构造
0000 |------------------------------------------------|
| |
| |
| Main Boot Record |
| |
| |
| 主引导记录(446字节) |
| |
| |
| |
01BD | |
01BE |------------------------------------------------|
| |
01CD | 分区信息 1(16字节) |
01CE |------------------------------------------------|
| |
01DD | 分区信息 2(16字节) |
01DE |------------------------------------------------|
| |
01ED | 分区信息 3(16字节) |
01EE |------------------------------------------------|
| |
01FD | 分区信息 4(16字节) |
|------------------------------------------------|
| 01FE | 01FF |
| 55 | AA |
|------------------------------------------------|
硬盘的分区表,由4个16字节的分区信息表组成。每个信息表的
结构如下:
偏移 长度 所表达的意义
0 字节 分区状态: 如0-->非活动分区
80--> 活动分区
1 字节 该分区起始头(HEAD)
2 字 该分区起始扇区和起始柱面
4 字节 该分区类型:如82--> Linux Native分区
83--> Linux Swap 分区
5 字节 该分区终止头(HEAD)
6 字 该分区终止扇区和终止柱面
8 双字 该分区起始绝对分区
C 双字 该分区扇区数
我们的程序就在这里进行操作,设置自己的独有的分区类型,那么fat和ext2之间的差别究竟在哪里?操作系统通过分区类型的一个字节,来获得分区的格式,从而来判断是否自己是支持的,然后通过自己的方法,来对文件进行存储读写操作。文件的内容都是放到磁盘上面的,比如一个文本文件,放的内容都是相同的,就是操作系统如何把存放在不同扇区的文件内容读出来(文件的存放不是连续的,否则也不用这么麻烦-_-),那么现在的问题是,当格式化1个分区的时候,是否只是仅仅改一下分区类型那一个字节,然后把该分区的内容全部清零??
现在我们来看一下ext2和fat文件系统的硬盘布局。
对于 ext2 文件系统来说,硬盘分区首先被划分为一个个的 block,一个 ext2 文件系统上的每个 block 都是一样大小的,但是对于不同的 ext2 文件系统,block 的大小可以有区别。典型的 block 大小是 1024 bytes 或者 4096 bytes。这个大小在创建 ext2 文件系统的时候被决定,它可以由系统管理员指定,也可以由文件系统的创建程序根据硬盘分区的大小,自动选择一个较合理的值。这些 blocks 被聚在一起分成几个大的 block group。每个 block group 中有多少个 block 是固定的。每个 block group 都相对应一个 group descriptor,这些 group descriptor 被聚在一起放在硬盘分区的开头部分,跟在 super block 的后面。所谓 super block,我们下面还要讲到。在这个 descriptor 当中有几个重要的 block 指针。我们这里所说的 block 指针,就是指硬盘分区上的 block 号数,比如,指针的值为 0,我们就说它是指向硬盘分区上的 block 0;指针的值为 1023,我们就说它是指向硬盘分区上的 block 1023。我们注意到,一个硬盘分区上的 block 计数是从 0 开始的,并且这个计数对于这个硬盘分区来说是全局性质的。在 block group 的 group descriptor 中,其中有一个 block 指针指向这个 block group 的 block bitmap,block bitmap 中的每个 bit 表示一个 block,如果该 bit 为 0,表示该 block 中有数据,如果 bit 为 1,则表示该 block 是空闲的。注意,这个 block bitmap 本身也正好只有一个 block 那么大小。假设 block 大小为 S bytes,那么 block bitmap 当中只能记载 8*S 个 block 的情况(因为一个 byte 等于 8 个 bits,而一个 bit 对应一个 block)。这也就是说,一个 block group 最多只能有 8*S*S bytes 这么大。在 block group 的 group descriptor 中另有一个 block 指针指向 inode bitmap,这个 bitmap 同样也是正好有一个 block 那么大,里面的每一个 bit 相对应一个 inode。硬盘上的一个 inode 大体上相对应于文件系统上的一个文件或者目录。关于 inode,我们下面还要进一步讲到。在 block group 的 descriptor 中另一个重要的 block 指针,是指向所谓的 inode table。这个 inode table 就不止一个 block 那么大了。这个 inode table 就是这个 block group 中所聚集到的全部 inode 放在一起形成的。一个 inode 当中记载的最关键的信息,是这个 inode 中的用户数据存放在什么地方。我们在前面提到,一个 inode 大体上相对应于文件系统中的一个文件,那么用户文件的内容存放在什么地方,这就是一个 inode 要回答的问题。一个 inode 通过提供一系列的 block 指针,来回答这个问题。这些 block 指针指向的 block,里面就存放了用户文件的内容。
说了这么多,只是想说明,文件系统的格式化不是仅仅地把后面的磁盘空间清零那么简单。
具体自己的文件系统(设计尽量简单)`,需要更加的细节化。后期的工作
3。进程的如何调度问题。
书本上讲了很多的进程调度方法,比如时间片啊,彩票啊,优先级啊,等等等等,但是没有说明究竟是如何采用语言来实现的?具体的实现细节?这里要具体深入到汇编级别的来进行讨论。...
累了,该复习编译原理了,为完待续......