1 引言
操作系统技术包含服务器和客户机操作系统两套技术,目前支持瘦客户机计算的服务器技术主要是VNC、Citrix Metaframe、 Services、 X 和Tarantella,服务器操作系统要解决多用户、会话控制、状态表示等一系列技术难点。网络计算机设计中的一个主要工作就是瘦客户机操作系统的设计,在此我们把瘦客户端操作系统称为网络计算机操作系统。本文从Linux 体系结构的角度给出网络计算机的Linux 体系结构,这样更能方便表达设计和实现嵌入式Linux 网络计算机操作系统的步骤。
2 操作系统体系结构
本操作系统体系结构如图 1 所示:
根据上面网络计算机的嵌入式 Linux 体系结构,下面给出了要设计的网络计算机操作系统各部分的主要硬件和软件的选择。硬件系统:CPU(VTA C3 733MHzpro) 、内存(64MB-512MB )、显卡( 图形内核、32 兆DDR 帧缓存)、声卡(2 声道)、网卡(10/100 兆网卡、支持PXE 启动)、显示器(CRT 彩显)、PS/2 接口的和键盘。硬件抽象层(HAL):显卡驱动、声卡驱动、存储设备驱动、网卡驱动等。Linux 内核:.4.18。应用程序接口(API):Glibc2.4 等。图形用户界面层:Xwindows4.2 IceWM。应用软件:媒体播放器Mp1aper、浏览器mozila、终端RDP/ICA/PXE 等。
3 各部分具体实现策略
3.1 硬件层的实现
该层主要实现系统初始化部分和网络计算机硬件系统的驱动部分。首先,在386 的实模式下对已经调入内存的操作系统代码进行检查,通过 中断获取内存容量信息,设置键盘反应速度,设置显示器的基本模式,获取硬撇信息,检测是否有PS/2 等操作。然后,就准备让CPU 进入保护模式了。要先屏蔽中断信号,再次设置32位启动代码的位置,调用操作系统指令1idt 和1gdt 被调用了,设置中断向量表(idt)和全局描述符表(gdt)。最后们对8259 中断控制器进行编程,对防处理器进行复位。.S 设置保护模式的标志位,重新取指令以后,再用一条跳转指令,进入保护模式下的启动阶段,同时把控制权交给。 S 这段纯32 位汇编代码。。 S 先做一些屏蔽中断的准备工作,然后,用一个默认的表项把所有的256 个中断向量填满。这个默认表项指向一个特殊的Linux 中断服务程。因为Linux 系统初始化完成后,就不使用 的中断服务程序。Linux 有很完善的设备驱动程序使用机制,该机制使特定硬件设备的中断服务程序很容易被系统本身或用户直接调用,而且,调用时所需的参数通常都要比 调用来得简单且高效。所以,BIOS的中断向量在这里就被覆盖了。.S 此后会检查CPU 的类型,对协处理器进行检查,然后调用了_paging 这个子函数进行页初始化。到此,保护机制下内存管理,中断管理的框架已经建好了。最后,Head.S 调用//main.c 中的start_kernel 函数,把控制权交内核。
Linux 核心和设备驱动程序之间必须有一个以标准方式进行相互操作的接口。每一类设备驱动:字符设备、块设备及网络设备都提供通用接口,以便在需要时为核心提供服务。Linux动态性很强。每次Linux 核心启动时如果遇到不同的物理设备,需要不同的物理设备驱动程序。Linux 允许通过配置脚本,在核心重建时将设备驱动包含在内。设备驱动可在必要时作为核心模块动态加载。
3.2 内核的实现
在系统需求确定的前提下,设计网络计算机嵌入式Linux 操作系统的首要步骤是嵌入式Linux 内核的设计。内核的选择主要是根据硬件系统处理器体系结构的不同,选择适当的Linux 内核实现。构建Linux 内核之前先要根据目标硬件平台的配置来修改内核选项。通常要进行的修改是选择合适的硬件支持,这些硬件主要是处理器、芯片组、网卡、声卡、显卡等设备;另外还需要设置的是文件系统、网络接口等系统软件选项的选择,去除不需要的功能模块。内核编译过程包括确定内核依赖关系、生成内核镜像、生成内核模块几个步骤。
内核是应用程序和硬件之间桥梁,在瘦客户机中,存储设备和内存是非常紧缺的资源,保持一个小的内核既可以增强整个系统的性能,又能够节省宝贵的存储空间。因此需要一个精简的内核支持瘦客户机,使得内核能够完备的支持瘦客户机的硬件设备,又没有冗余。在完成了硬件 HAL 层的工作,将各种驱动源代码都获得并放到内核的指定位置后,就可以开始编译出自己想要的嵌入式Linux 内核了。编译结束后得到内核文件大小为1M 字节左右,这个大小对于网络计算机来说是可以接受的。
3.3 根文件系统的实现
设计好 Linux 内核后的工作是设计嵌入式Linux 的根文件系统,Linux 内核引导过程的最后一步工作就是挂接这个根文件系统。Linux 根文件系统的组织结构沿袭 系统的传统结构。在设计嵌入式Linux 的根文件系统的时候,我们要做的工作依次是组织目录结构、开发应用程序、选择共享函数库、存储内核镜像和模块、选择设备文件、配置系统初始化过程和安装根文件系统。
瘦客户机通常使用 作为存储设备。引导程序、操作系统内核、文件系统都保存在 中。因此需要文件系统和 驱动程序来统一完成对Flash 设备的读写。由于Flash的容量小、成本高、以及使用寿命短的特点。
3.4 应用程序层(API)层实现
应用程序层主要有许多 c 函数库构成。在Linux 中有很多函数库,满足各种各样的函数调用。我们用1dd 命令检测出需要的函数库,然后根据系统存储空间(因为网络计算机嵌入式操作系统要求最后编译出来的内核大小不能太大)和网络计算机需要满足的应用需求,将用到的函数库放到API 层,或用静态编译的方法将涉及该函数库的代码直接编译到应用中,从而使其不依赖该函数库。图3 给出了我们用到的部分函数库。
4 基于Linux 的RDP 客户端的设计与实现
NC 系统的一大应用是连接Windows2000 或Windows2003 终端系统,使用Windows 的资源,让用户感觉就像直接在使用windows2003 一样。由于Windows 终端协议经过了多次升级,到目前为止最新的是Rpd5.1 协议,该协议提供了很多RDP5.1 之前不具备的特性,如真彩色、本地打印、本地视频等。为了给用户提供一个真实的Windows 环境,使之具有多媒体等功能,需要研究RDP5.1,开发RDP5.1 的客户端。
4.1 RDP 程序模块
RDP 客户端的设计主要分为两大模块,分别是RDP 程序模块,客户端底层设计模块。RDP 程序模块主要实现RDP 协议;客户端底层设计模块通过定制和剪裁Linux 系统,让RDP程序与网络计算机硬件平台整合到一起,使RDP 程序在网络计算机设备上可以运行。RDP 程序主要有RDP 协议模块与GUI 模块组成,它们之间保留了接口。RDP 协议模块主要解析RDP 防议,与平台无关;GUI 模块主要负责图形显示和消息上传,与所选平台也没有关系。图4 是RDP 程序结构图。
RDP 程序执行后,首先从配置文件中读取服务器IP 地址,本机IP 地址等参数,然后连接服务器,服务器连接成功后,建立窗口,下载登陆界面,随后进入窗口消息循环,程序只处理鼠标、键盘消息,出理上传的RDP 数据。根据RDP 协议的层次结构将整个模块分为TCP 层、ISO 层、MCS 层、SEC 层、RDP 层。分别有文件tcp.c、iso.c、mcs.c、sec.c、rdp.c来实现。按功能划分,可以划分为RDP 回话连接、数据传输与解析、RDP 数据处理、数据的上传和本地打印。
4.2 客户端底层设计模块
RDP 客户端模块由两个独立程序组成,Rdp1og 负责用户界面和处理用户配置,mw 为RdP 客户端程序。在脚本rdp 中循环调用这两个独立程序,使用户所见到的总是RDP 客户端界面,可以从界面点击图标启动客户端程序。在启动脚本/etc/rc.d/rc.sys 中直接启动rdp脚本。启动流程如下图5 所示。
本文作者创新点:本文从Linux 体系结构的角度提出了网络计算机操作系统层次结构。根据提出的嵌入式Linux 网络计算机操作系统层次结构,研究了基于嵌入式Linux 网络计算机的操作系统的实现方法。