首页 > 编程知识 正文

虚拟化技术架构(嵌入式开发与实践张勇)

时间:2023-05-04 18:34:52 阅读:73804 作者:2632

以前,我介绍了一个简单的Hello OS操作系统和代码是如何工作的。 从现在开始,我们将正式向Hello OS操作系统添加功能,正如—— 操作系统架构是一个极其精细的活自古以来所说的那样,“凡事先想一想”,无论是手写操作系统,都要先考虑其细节,一步一步构建操作系统

这次,我们先来看看pydmn的课程在Mac环境或Windows环境下进行内核开发环境的构建然后看看操作系统的内核设计。 然后,构建进行内核开发的环境。

3358www.Sina.com/尝试做某事时,必须像开发其他APP应用程序一样,首先使用它。环境建立

为了便于开发和测试,我们建议使用VirtualBox(VMware )进行操作系统内核开发,因为我们实际上可以自行探索一些步骤

笔者的开发环境为Mac Pro和VirtualBox6.1.22。

注:首先,我们需要一个内核开发环境

注意:在Windows环境下也可以按照之后的教程进行环境的配置和开发,笔者在两个环境下都进行了相关的测试上,可以参考原始教程进行相关的环境安装。

如果电脑本身就是Linux(Ubuntu)环境VirtualBox的安装请参阅以下内容。

3359 blog.csdn.net/u 011046452/article/details/11505449

下载Ubuntu16.04镜像:

3359 www .建安墅.com/p/123489 c8b 991

VirtualBox安装Ubuntu可以执行以下操作:

33559 www.Huawei cloud.com/articles/28f9f 8529 b6e 0317167 c 56 f25 d 825 fee.html

准备工作在此环境配置中,需要为开发的Linux(Ubuntu )环境构建两个虚拟机Ubuntu。 另一个是加载新建虚拟机Ubuntu

我们内核观察结果的虚拟机COMOS——创建名为Ubuntu的Linux-Ubuntu16.04虚拟机。

建议为内存分配4g,为CPU分配4个内核(取决于您的电脑性能)。

下一步是基于向导创建虚拟硬盘。 分配了10G。 要动态分配,直接单击运行时虚拟机不会启动。 配置包括第一个虚拟机 Ubuntu

启动虚拟机后,系统会提示您安装Ubuntu,并按照提示完成安装大约需要10分钟。

安装完成后,关闭虚拟机。

3358 www.Sina.com/http://www.Sina.com/上的存储,http://www.Sina.com /

请按照提示一步一步地进行。 **请注意,要创建的硬盘必须具有固定大小的VDI。 **因为核心很小,所以分配100M的尺寸就可以了。

已经下载好的Ubuntu镜像(.iso后缀),而后才能运行:接下来需要创建另一个虚拟机。 ——COSMOS!

这个虚拟机将运行我们今后创建的内核,意义重大。

请注意,此虚拟机只需要按照默认配置向下移动,而不需要自己设置参数。 但是,添加硬盘时,请使用新建虚拟硬盘

OK,COSMOS已创建,但当前新硬盘hd.vdi中没有任何内容。 COSMOS在启动后仍未找到时报告错误。

虚拟机Ubuntu设你可能已经注意到了,添加虚拟 硬盘

为什么会这样呢?

新建虚拟机COSMOS

接下来,您必须能够在注意添加已有硬盘hd.vid,也就是在上一步我们建立的那个硬盘上加载您即将编写的系统。

首先打开虚拟机Ubuntu,然后输入lsblk命令查看当前设备。

有两个硬盘,安装GRUB。 其中,sda是Ubuntu系统的专用硬盘,sdb是我们的目标硬盘hd.vdi。

首先,依次输入以下命令:

//sdb设备只是新硬盘,上面

需要建立文件系统才能够使用//mkfs.ext4即是在sdb上建立ext4文件系统sudo mkfs.ext4 /dev/sdb//进入~目录建立hdisk文件夹作为sdb的挂载目录cd ~mkdir hdisk//将/dev/sdb挂载在hdisk目录下,这样我们就能通过访问hdisk目录访问sdb硬盘mount /dev/sdb ./hdisk

再次输入lsblk命令,可以看到sdb设备已经被加载到了hdisk目录下(可以认为访问hdisk就是访问sdb硬盘):

而后创建boot目录,作为内核的加载目录:

sudo mkdir ./hdisk/boot

将grub安装到boot中(grub可以看做是bootloader,是用来加载操作系统的),这需要借助grub-install工具:

sudo grub-install --boot-directory=./hdisk/boot/ --force --allow-floppy /dev/sdb

若无误则表明grub安装完毕,进入boot目录可以看到多出了grub文件夹。

现在还需做一件事情,那就是配置grub的启动项,在boot/grub目录下新建一个grub.cfg,其中的内容如下:

//设置HelloOS是启动系统的第一个选项menuentry 'COSMOS' {#加载part_msdos、ext2模块#这是grub的语法insmod part_msdosinsmod ext2set root='hd0' #只有一个硬盘,因此设置根目录为hd0(就是hd.vdi)multiboot2 /boot/COSMOSOS.eki #加载boot目录下的.eki内核文件boot #加载启动内核文件}#设置过时样式为目录set timeout_style=menu#设置过时时间if [ "${timeout}" = 0 ]; then set timeout=10 #等待10秒钟自动启动fi

注:上述grub.cfg文件内容暂时不懂没关系,语法的学习可以参考:GRUB2语法学习,并且在下一节课会对GRUB、Boot、efi等概念做一个总结,到时候一切都明白了

保存后关闭虚拟机Ubuntu,启动虚拟机COSMOS。

注:两个虚拟机不能同时开启,因为两者都挂载了hd.vdi,两个同时开启会出现文件冲突。

启动COSMOS

启动COSMOS之后可以看到下面的结果:

点击COSMOS之后,提示找不到eki文件:

之所以找不到eki文件,是因为我们暂时还没有往hd.vdi硬盘中放入内核文件,而这就是我们以后要做的工作——将内核编译为eki文件放入grub文件夹下,而后利用虚拟机COSMOS进行测试!

内核架构 管理资源

内核架构,即是我们所说的操作系统架构。内核——也就是操作系统——**其实就是在应用程序与计算机硬件、软件之间的一个桥梁,它负责负责管理计算机资源。**其实在手写操作系统(3)中已经提到过了,计算机资源分为硬件资源和软件资源

硬件资源是指计算机物理存在的介质,包括CPU、内存、硬盘、数据总线等,如下图所示:

软件资源即是计算机中的各种数据,如文件、应用程序等等。

内核就是上述硬件、软件资源的管理者,其内部逻辑大致有:

管理CPU:CPU是用来执行程序的,可以简单理解为管理进程/线程;管理内存:负责分配、释放内存;管理硬盘:主要是指管理硬盘的文件系统;管理各种IO设备:包括但不限于显卡、网卡、U盘、键盘等等。

由于各种硬件的性能不同,种类不同,内核想使用这些硬件就需要一个帮助程序,那就是我们常听到的驱动程序。有的时候游戏画面出了问题,很有可能就是因为驱动程序版本不对。

那么现在的问题就是:如何让内核来组织并管理这些资源呢?应该采用一个怎样的形式?

关于这一点,几十年来的英俊的冥王星已经帮我们思考了很多种架构了,比如宏内核、微内核以及混合内核。

宏内核

宏,即所谓的大。

宏内核架构就是将上述所提到的所有的资源组件的相关代码编译链接在一起,形成一个更大的执行程序,值得注意的是,这个更大的执行程序是运行在处理器特权级别(后面会讲)。其结构图如下:

注意,内核层之下的各个接口、安全组件等不是层级结构,严格来说是并行的,上图只是为了方便阅读。若宏内核需要为某个应用分配内存

应用程序调用内存分配的API,如C的malloc;CPU在特权级别运行内核代码内核代码中的内存管理组件分配一块内存;将上述分配的内存首地址返回给API;应用程序获得API返回的内存地址;

宏内核可以说是一种简单的混杂思想,即将所有东西直接组装在一起,简单粗暴。优点很明显,那就是内核包括所有组件,可以互相调用,性能很好。缺点也很明显,多个执行库链接在一起,没有模块化,扩展性不强,如果其中某个组件新增功能,整个系统需要重新编译,若一个组件出错,则系统崩溃。Linux就是采用的宏内核架构。

微内核

微内核的设计与宏内核就有点不一样了:宏内核巴不得内核具有所有的功能,恨不得上天。

而微内核则尽可能减少内核的规模,只给它一些基本且必须的功能,如进程调度、进程通信中断、内存空间映射等等。

由于此时微内核的功能较少,为了配合内核的工作,将各种进程管理、内存管理、设备管理等功能设计为一个一个的服务进程。内核需要实现某种功能时,则交给对应的服务进程来处理。它与这些服务进程之间的通信是通过消息来传输的。其结构如下:

同样以是给进程分配内存为例,在微内核架构中流程如下:

进程调用微内核的API(申请内存的);内核切换到特权级别,运行内核代码;内核将相关信息以消息机制发送给管理内存的服务进程,由它来处理内存管理服务进程收到消息之后,分配内存;将内存信息以消息机制发送给内核;内核将内存信息发送给进程。

从上述过程可以看出来,宏内核就是古代中央集权的典范

微内核架构下,内核的功能就像是一个中转站,它负责将进程需要的服务传递给对应的服务进程,是一种分而治之的思想。这种结构的方式缺点很明显,**相比于宏内核多了很多步骤,性能不好。**优点也很明显, 当需要一个新功能,增加一个服务进程即可。

COSMOS

了解了宏内核与微内核的相关的知识,现在轮到我们开始选择了——我们的操作系统内核应该采用什么架构?

综合考虑之下,我们不想单独选择两者中的某一种,而打算结合它们的优点,设计一种混合架构:

我们将我们的操作系统称为COMOS,之所以这么取名,意指保罗宇宙,囊括万物之意。

从上图可以看出,COMOS的内核架构大致分为三层:

内核接口层

定义了一套Unix接口的子集(学习和研究方便),这些接口代码主要是检查参数合法性,而后调用更下层的函数进行处理。

内核功能层

内核功能层是内核接口层的具体实现,根据功能的不同大致分为进程管理、内存管理、中断管理、设备管理。

内核硬件层

这一层其实主要是与电脑硬件有关的设置,主要是完成初始、中断设置等等。

上述这种内核架构,即有了微内核的简洁和高扩展性,又有宏内核加载驱动程序进入内核的高度耦合性,充分发挥设备的性能,因此才被称为混合结构。具有高内聚,低耦合的特点。

其实,Windows NT就是采用的混合架构,难怪会成为有史以来最成功的商业操作系统。

Linux、Windows、MacOS

Linux内核的结构如下:

可以看出,Linux采用宏内核,各个模块之间互相调用。性能强劲,但是一旦出现错误会很难排查。不过由于Linux是开源的,可以进行个性化的定制和优化,也是其独特的一点。稍微总结一下,Linux大致分为五大重要组件,且每个组件从上到贯穿各个层次

Windows内核NT的内部结构如下,采用的是混合内核架构(图形驱动程序还在内核中,因此图像性能强劲):

苹果Darwin结构如下,采用双层内核架构,主要是为了兼容之前的系统内核:

Linux 性能良好,**结构异常复杂,不利于问题的排查和功能的扩展,**而 Darwin-XNU 和 Windows 结构良好,层面分明,利于功能扩展,不容易产生问题且性能稳定

PS:宏内核和微内核要好好区分。 宏内核是内核的功能很多,所以性能好,但是不方便更改;微内核是性能稳定,便于寻找问题和优化。

参考资料

10 设置工作模式和环境(课程及neohope的留言)

Ubuntu下Grub配置详解

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。