温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

自主操作系统LMOS-00.04发布啦

发布时间:2020-06-29 20:15:35 来源:网络 阅读:554 作者:pdlenovo 栏目:系统运维

更多的信息请访问我的CU博客

        恍恍然三个月过去了,也三个月没写点什么了,这三个月我倒是写了不少代码,是时侯把lmos拿出来说说了,这将是lmos的第四个开发版。今年的三个月已经完了,又只有9个月了,时间紧迫的孩纸们要抓紧啦,其实开发操作系统内核就是要足够的时间,时间越多越好,可往往不如我愿,时间总是不够用。
      先来说说lmos第四个开发版有什么新的特性吧。
      1、从这个版本开始,lmos不在支持32位x86体系结构了,而是支持更先进那么一点点的64位x86体系结构了,它的名字叫AMD64。
      2、lmos这个版本开始拥有虚拟内存了。这个说起来很复杂,那就等会儿在说。
      3、lmos从这个版本开始,支持从U盘启动了,当然有个前提,那就是你的计算机主板必须支持从U
盘这类USB介质引导你的计算机,这点给想要在物理机上验证和捣鼓lmos的朋友提供了方便。
      为什么lmos从32位突然之间就变成全64位的了,是因为我开发虚拟内存管理器在32位下受到了严重的局限性。后来一想以后反正要支持64位的,不如趁早,以免日后麻烦。其实现在物理机的内存容量已经超过4GB了。x86——64体系结构是AMD公司最先定义出来的,这就是为什么叫AMD64的原因。实现AMD64体系结构的时候,他们的工程师被要求这样,要保证原有32位的os和app,能够不经过任何修改就能运行在AMD64体系结构上。64位的OS能够执行未经修改的32位app。在这些保证下还要尽量改进x86.你不得不惊叹搞x86的工程师们有多伟大、有多痛苦,呵呵。其实AMD64体系结构改得还是不错的。段 几乎不起作用了,TSS的作用也改变了,中断的栈也更加规范了,寄存器全64位了而且寄存器还多了不少,看来他们也知道x86的寄存器太少了,页表也是4层了,支持4KB,2MB,1GB这几种大小的页面。LMOS是全64位的内核,同时也要求应用程序和驱动也是64位的,LMOS不会兼容32位的程序。AMD64的寄存器虽然是64位的,但并不代表它可以访问0~0xffffffffffffffff之间所有的物理地址,事实上在当前的AMD64体系结构的CPU上只有48根地址线,甚至更少。那么它是怎么做的呢,它要求64位寄存器从48位开始用符号位扩展,也就是说CPU只能访问这两个区间的地址:0~0x00007fffffffffff和
0xffff800000000000~0xffffffffffffffff,如果你访问
0x800000000000~0xffff800000000000之间的地址CPU会产生异常。但这一实现非常有利于日后的扩展,我这有幅图大家可以看看:
    自主操作系统LMOS-00.04发布啦

      这一改变佐证了LMOS的可移植性,因为LMOS内核有硬件抽象层的概念,我只花了几个周的时间写了个64位的硬件抽象层,然后把这个层和上层硬件无关的层链接起来就完事儿了。也就是说我要把LMOS移植到ARM体系结构上,只要写个ARM的硬件抽象层外加少许改动就行了,这种设计使lmos成为通用操作系统变成可能。
      在来看看这一版本中lmos的虚拟内存管理器。虚拟内存在操作系统理论书籍中只花很少篇幅介绍了那么一点点,实际中虚拟内存可谓重中之重,可谓是操作系统内核的内核。先看看LMOS这一版本中虚拟内存管理器的总框架图,我画的很简陋,大家看看吧:
     自主操作系统LMOS-00.04发布啦

      为什么虚拟内存管理是内核的内核,我举个例子吧。比如操作系统要描述一个线程,那么就必须要定义一个数据结构来表示一个线程,(说句题外话,我现在才真正明白,C语言书前面那句话:“程序=数据结构+算法”)好了回来,这个表示线程的数据结构只有在内存中有了真正的实例,程序(内核)才能工作。内核为支持多线程那么这种数据结构的实例就需要很多,比如可能有2000个线程你总不能静态的定义2000个这种数据结构的数组,这样确实能够工作,但是这样使用内存太低效了,太不智能了,因为有可能有时系统中只有两三个线程,这时就浪费了内存,如果有时系统中超过2000个线程时,这时你没办法了。类似这种数据结构系统中是非常多的,通常只有几10字节、几100字节到1KB之间。既然静态的不行,就只有用动态的方法,那就是:要用的时侯就分配并初始化一个数据结构实例,不要时就释放这个实例所占用的内存空间。LMOS这个版本重新实现了一个更为先进的内存池,来处理这种问题,先说了这种数据结构只有10字节、几100字节到1KB之间。你总不能一次就分配一个页面,这叫浪费。内存池就是为解决这个问题的。
      现代意义的操作系统,好像都有保护、安全这种类概念,这些概念是怎么实现的呢,CPU提供了一些机制。把一部分关键指令规定为特权指令,把程序里出现的访存地址规定为虚拟地址,要通过地址映射部件映射之后,才能访问真正的物理内存。这两套机制形成了编写现代操作系统的基石。这使得每个进程都有一个独立的地址空间,而这个空间由于权力不同,可以被分为,用户空间和内核空间。这样就形成了一个“保护”的概念。这些概念在lmos中是如何利用的呢,这有个图:
     自主操作系统LMOS-00.04发布啦

      由上可知,x86——64下 只能访问两个区间的地址,既然硬件都是这么实现的,而且这种实现有利于扩展,那么我也没什么好改的了,0~0x00007fffffffffff的虚拟地址区间为进程的用户空间,这个空间是每个进程私有的,其它别的进程不能访问,而且这个区间有虚拟内存管理器分配和映射物理内存。0xffff800000000000~0xffffffffffffffff的虚拟地址区间为LMOS内核空间,这个空间是所有进程共享的,在x86上好像只能这样了没有别的选择,我试过很多种别的空间分配法都没法成立。只能是上图那样的。
      LMOS这个版本支持U盘启动了,为了让更多的人,能够在物理机上捣鼓和验证LMOS内核,我这次重写了lmos内核的引导程序,以便能从U盘启动lmos,大家也更能相信LMOS是个真正的玩意儿。U盘也不用很大,32MB就行啦,但是使用前请备份好你U盘中的数据。LMOS会删除U盘上所有的数据。如果你想捣鼓一下的话,请在linux下插入U盘,然后到/dev目录下查看你U盘的设备文件名,一般可能是sd(x)这样的名字,括号中的X是变化的,如果你有两块硬盘的话,你就会在/dev目录下看到:sda、sdb、这样的设备文件名,当你在插入U盘时,就会看到sdc,找到且确认是U盘的设备文件名后,在终端下切换到放lmos内核文件的目录下,执行sudo make U_DSK=/dev/sdb,(我的linux下,我的U盘设备文件名是 sdb 所以才能这样,如果你的不是或者不能确定是不是,千万别执行上面那条命令),否则造成的数据丢失,本人一概不负责。
      虚拟机中安装,我推荐大家使用这种方式,这样既不需要另的一块空U盘,也不需要大家的宿主操作系统是LINUX。大家首先确保你的宿主操作系统中安装有Oracle VM VirtualBox 虚拟机软件。如果没有请大家自行下载相关操作系统版本的Oracle VM VirtualBox并安好。安装好后,先新建个虚拟机,然后下载(点此下载)本人提供的虚拟机硬盘镜像。并挂载在虚拟机上,启动虚拟机即可运行LMOS。这次我还提供了VMDK格式的硬盘镜像。方便使用VM虚拟机的朋友。
      最后说说这次的shell,我提供了几条极为简单的命令:
      r 重启计算机 如下图
     自主操作系统LMOS-00.04发布啦

      t 查看lmos内部的进程、线程数 如下图
     自主操作系统LMOS-00.04发布啦

      m 查看计算机物理内存的使用情况 如下图
     自主操作系统LMOS-00.04发布啦

      p 查看计算机内部的pci总线和设备 如下图
     自主操作系统LMOS-00.04发布啦
     LMOS内核镜像包下载

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI