基于ARM架构鲲鹏系统的操作系统实验教学设计
2020-11-25孙微微刘汉兴王金凤
孙微微,刘汉兴,王金凤
(华南农业大学数学与信息学院,广州510642)
0 引言
长期以来,我国计算机处理器芯片和操作系统严重依赖于国外,为防止技术升级和国家安全受制于人,硬件和软件的自主可控研发和创新日益重要[1]。华为作为我国的科技先行者和践行者,自主研制了鲲鹏处理器芯片和欧拉操作系统,为突破国外的技术垄断和扼制提供了核心硬件和软件工具。
操作系统实验是操作系统课程的重要实践环节,对提升学生动手实践能力和加深理论知识理解有重要作用。然而传统的操作系统实验模式偏于理论知识和原理的复现,实用价值欠缺。有必要设计基于鲲鹏平台的新型操作系统实验项目,使学生提高实践能力并及时跟踪新技术的发展。
1 鲲鹏计算生态组成
鲲鹏计算生态是指基于鲲鹏处理器构建的全栈IT基础设施、行业应用及服务,包括个人计算机、服务器、企业存储、操作系统、中间件、虚拟化、数据库及云服务等,其目标是建立完善的开发者和产业人才体系,使鲲鹏生态成为开发者和用户的首选,实现IT技术自主安全可控[2]。
在硬件方面,不同于复杂指令集CISC的x86系列CPU,华为公司2019年推出的鲲鹏(Kunpeng)920处理器采用精简指令集RISC的ARM架构,并基于鲲鹏处理器构建全自研的泰山(Taishan)服务器。
在软件方面,华为推出Linux兼容的欧拉(openEuler)操作系统,并将云服务全面鲲鹏化,支持事务处理、大数据分析、科学计算、数据库、分布式存储及移动终端ARM应用等多种场景。
在企业和开发者支持方面,通过鲲鹏弹性云服务器提供超高性价比和稳定可靠的计算和存储资源,通过从x86平台到鲲鹏ARM平台的多种应用移植、性能优化以及应用部署软件工具方便企业数字化转型,通过云容器引擎提供多平台自适应混合部署以及快速地将原有的x86应用迁移到鲲鹏平台。
2 传统操作系统课程实验模式
操作系统课程教学在计算机学科中一直占据非常重要的基础位置,虽然操作系统课程主要是理论课,但实验部分也是不可或缺的。然而传统的操作系统课程实验主要有以下两种模式[3]:
(1)编程对操作系统的重要原理算法进行模拟实现,例如实现CPU调度算法、内存分区分配算法、虚拟内存置换算法等。学生对此感觉是“一个数据结构大作业”,除了练习了编程水平和深入了解了各算法细节,对实践能力培养并无多少帮助。
(2)实现一个迷你操作系统。不同水平的大学实现的层次不一样,有些学校从启动的汇编代码开始实现,逐步(甚至逐届学生接力)添加进程管理、内存管理、文件管理和设备管理等模块;有些学校对一个已有的教学操作系统改编,例如添加系统调用、修改算法等。这种模式可以让学生熟悉操作系统底层的内核细节,但实际是让学生重复学习“造轮子”。
诚然,操作系统的源码和内核开发是需要研究型人才甚至天才的,然而有必要让所有学生都从零开始去学习打磨轮子和制造发动机吗?既然已经有了鲲鹏这样的完善且先进的平台,为什么不引导部分应用型的学生学习怎么直接利用鲲鹏和相关工具去解决未来工作中的潜在实际问题呢?所以,重新设计鲲鹏平台下的新型操作系统实验项目是有实际意义的。
3 鲲鹏平台下操作系统实验项目设计
在进行鲲鹏平台下的操作系统实验项目之前,学生要熟悉支持鲲鹏和泰山服务器的JDK、编译器gcc、虚拟机和docker、华为弹性云服务器等,特别是Linux、CentOS或欧拉操作系统的vi编辑器和shell命令操作[2]。
3.1 应用移植
x86处理器是复杂指令集结构,鲲鹏处理器是精简指令集结构,二者的机器指令差异很大,由于x86处理器长期的主流地位,绝大多数的企业应用软件是基于x86平台开发的,不能直接移植到鲲鹏平台运行,因此进行应用移植是首先要解决的问题。
解释型语言(如Java、Python等)的源代码由编译器生成字节码,再由虚拟机解释执行,虚拟机屏蔽了不同CPU指令集的差异,所以解释型语言开发的程序在迁移到鲲鹏处理器时,一般不需要特殊处理。但编译型语言(如C、C++等)开发的程序在从x86平台迁移到鲲鹏平台时,必须重新编译才能运行。
以CentOS操作系统和C/C++源码为例,应用移植的实验项目主要有以下步骤:
(1)从鲲鹏社区中获取代码迁移工具Porting Advisor,并安装到服务器的/opt/portadv目录;
(2)用远程传输工具WinSCP把源码文件(如C/C++源代码文件、汇编源代码文件、Makefile文件)传输到/opt/portadv/portadmin目录,设置源码分析相关参数。Porting Advisor根据依赖库白名单、汇编代码字典、编译器字典等开始源码分析;
(3)源码分析完毕后,Porting Advisor生成移植建议报告。例如原始Makefile文件中存在编译选项-m32,工具建议移植到鲲鹏平台时删除该选项;x86的内存操作汇编指令mov需要替换成ldr x0,[x1]&str x0,[x2]指令等。
(4)根据移植建议,安装或编译依赖库SO文件,修改源代码。重新上传修改后的源代码,再次进行移植分析和测试验证。
3.2 容器迁移
虚拟机技术已经广泛应用,通过VMware等虚拟机软件,在宿主机操作系统(例如Windows)上安装若干个相互隔离的GuestOS(例如Redhat、CentOS等),然后在各GuestOS中可以运行相互隔离的多个应用程序。可见,虚拟机会消耗很大的磁盘、CPU和内存资源。
容器是一种轻量级自包含的软件打包技术。容器引擎与宿主机操作系统通信,管理多个相互隔离的docker容器实例。类似于面向对象的类和对象的关系,首先要生成一个将应用程序的源代码和依赖库都打包在内的docker镜像,然后通过docker镜像来创建docker容器,最后在docker容器中启动一个应用程序实例。不同的应用程序需要生成不同的docker镜像,运行在不同的docker容器。与应用程序类似,跨平台的容器是互不适用的,例如x86平台的docker镜像直接应用于ARM平台会出现格式错误。
(1)docker启动及相关命令:
①执行yum-y install docker命令安装docker;
②执行systemctl start docker命令启动docker服务;
③熟悉使用如下命令:
●docker search查找Docker Hub上的镜像;
●docker pull拉取镜像;
●docker images查看镜像;
●docker run启动一个容器并在容器内执行用户命令;
爱罗漠有多苦,她比谁都更清楚。她是不能和楚西争的,连对手都没有,这场仗注定打得艰难。可这没有关系。她可以没有爱情,但是当爱情降临的时候,她必须对它忠诚。
●docker ps查看运行中和未运行的容器;
●docker commit创建一个新镜像。
(2)根据docker ID创建一个新镜像,作为目标应用(如Redis)的基础镜像;
(3)创建dockerfile文件,指明源镜像ID、Redis的来源地址、容器运行时要监听的端口、挂载点、容器启动时的服务等配置参数。执行docker built命令,根据dockerfile创建Redis的应用镜像;
(4)根据Redis的应用镜像,启动一个容器,连接到Redis服务端,之后即可使用Redis服务。
3.3 应用部署与发布
可以在鲲鹏云服务器或者泰山物理服务器上搭建鲲鹏开发环境,通过打包编译源码或者制作主机镜像方式实现应用的快速部署。
在采用打包并编译源码成为RPM文件的方式时,首先需要安装Linaro交叉编译工具。之所以需要交叉编译,是因为许多基于ARM平台的嵌入式硬件的性能不高或没有足够的内存/磁盘空间[4],而整个编译过程非常消耗资源,所以需要在x86平台上编写程序并交叉编译成可以在ARM平台上运行的程序,所生成的RPM包可以直接安装到ARM平台。
以将Redis源码包制作成RPM包为例,实验项目主要有以下步骤:
(1)安装rpm-build工具,用wget工具下载Redis的开源源码,准备编译前环境;
(2)编辑SPEC配置文件,设置软件发行版本、解压源码、编译和安装软件包时要执行的命令等信息;
(3)执行rpmbuild命令构建二进制的RPM包;
(4)执行rpm命令安装Redis的客户端版本。
4 结语
鲲鹏作为我国自主研制的处理器芯片,在实现硬件自主安全可控中具有重要作用。基于鲲鹏平台设计新型操作系统实验项目,涉及较多工具、命令和技术,实施过程中经常遇到配置或运行的意外情况,不仅可以让学生提高遇到问题解决问题的实战实践能力,而且可以在实施过程中了解新技术概念。与传统的操作系统实验项目相比,更容易引起学生的学习兴趣,同时有助于对理论知识的理解和更新。对于校企产学合作协同育人以及操作系统理论课程教学改革也是一种有益的探索。