基于PC体系结构的嵌入式操作系统实现

2008-10-11 09:01
现代企业文化·理论版 2008年13期
关键词:嵌入式操作系统

罗 斌

【摘要】文章介绍了一个基于PC体系结构的嵌入式操作系统,从CPU的16位实模式切换到32位保护模式,包括中断控制器、系统时钟等在内的系统硬件初始化过程,全局描述符表、中断描述符表等内核运行环境的建立,进程的定义以及调度算法,进程切换方面介绍了一个具备基本功能的嵌入式操作系统。

【关键词】PC;嵌入式操作系统;CPU保护模式

当前,嵌入式操作系统已经获得非常广泛的应用,涉及的领域包括通信、军事、航空航天、以及生活等方方面面。目前市场上比较有名且占有一定市场分额的操作系统有VxWork、uLinux、uC/OS-II、eCos等,他们有各自的优点,VxWork经过了长时间的发展和实际应用的考验,在关键应用领域仍是一支独秀。uLinux则可以利用广泛的Linux资源,便于开发等等。

由于操作系统的基本功能是硬件无关的,因此这部分可以使用C语言进行开发,而平台相关的部分只需要使用汇编语言,但是只要设计好代码框架,就可以做到方便移植。选择了PC作为最初的目标平台,是因为x86体系结构应用范围越来越广,而且可以在开发x86版本后再移植到其他平台。

一、操作系统简介

操作系统在功能上主要是负责管理计算机的资源,这些资源包括CPU、内存、外部存储器、还有一些其他的外设。

从结构上则分为单一内核和微内核结构,单一内核的代表就是UNIX、Linux,这类操作系统的内核是一个整体,功能都包含在内核里面,有点“大杂烩”的味道,其优点就是由于功能都包含在内核中,因此内核很紧凑,且效率较高。而且带来的缺点就是当一个功能模块需要修改时,就必须将内核全部编译一次。微内核结构的代表就是windows系列,其内核提供的功能很少,仅有一些基本的功能,其他的功能全部作為扩展模块连接进入核心,这样的好处就是各个功能模块在接口不变的时候,可以很方便的更新而不影响系统,给系统提供了最大的灵活性。带来的缺点是结构不够紧凑,造成一定的资源浪费,同时也对运行效率产生一定影响。本系统采用的是单一内核结构。

操作系统的开发通常是在UNIX、Linux下使用GNU Compiler Collection(GCC)进行开发编译。一般认为不能在Windows下开发,并且认为微软提供的开发工具不能进行此类开发。但是本操作系统是在Windows下开发使用Microsoft Visual C/C++ 6(VC6)进行开发。

二、CPU保护模式初始化

PC在通电后运行于16位实模式,其寻址能力为64K,而嵌入式系统的配置范围非常广泛,仅仅考虑16位的寻址范围显然不适合当前的发展要求。而i386及其以上的CPU的寻址能力都达到了4G,因此需要设计能支持4G内存的操作系统。

在系统引导时,首先建立一个临时的全局描述符表(GDT),这个全局描述符表中有5个描述符,第一个必须设为0,这是x86处理器规定的,称为哑描述符。其中两个是16位保护模式代码段和数据段的描述符,用于在切换CPU运行模式的时候,保证初始化代码仍然能够正常运行。另外两个是32位保护模式下的代码段和数据的描述符,用于CPU内核运行。

由于CPU在复位时是处于16位实模式,所以初始化代码是16位实模式下的代码,这部分的代码的作用是为切换到16位保护模式准备运行环境,主要的工作是设置GDT。具体地做法是根据当前的段寄存器计算GDT中相应段描述符的值。

再设置好GDT后,就可以将CPU切换到保护模式下运行。将CPU切换到保护模式的方法是,将cr0寄存器的0位设置为1,代码为:

……

mov eax,cr0

or eax,1

mov cr0,eax

……

再切换到保护模式运行后,由于CPU有指令预取机制,所以在指令队列中已经存在了下一跳指令,而且需要刷新代码段寄存器,为了防止运行出错,必须刷新指令队列已近代码段寄存器。由于需要在一条指令中同时刷新段寄存器和指令队列,所有需要手动构造一条段间转移指令。代码为:

……

db0eah

dwoffset init

dwtemp_code_sel

init:

……

完成后CPU即进入16位保护模式运行。

三、建立内核运行环境

进入内核后,首先必须建立运行环境,对于INTEL的CPU来说,就是建立两个系统表,一个是全局描述符表(GDT),一个是中断描述符表(IDT)。

(一)全局描述符表初始化

在CPU由16位实模式切换到32位保护模式的时候,建立了一个临时的GDT。但是进入内核后,需要一个真正的描述符表,不能在继续使用这个临时的GDT,否则在以后的任务切换中将会遇到麻烦。

由于假设系统运行在单一地址空间,因此全局描述符表仅需要3个描述符,可以使用数组定义如下:

DESC gdt[4] = { {0,0,0,0,0,0},

{0xffff,0x0000,0x00,0x9a,0xcf,0x00}, // 代码段

{0xffff,0x0000,0x00,0x92,0xcf,0x00} // 数据段

};

定义了新的全局表述附表后,就可以将GDT更换为新的描述符表,并且将段寄存器CS的值更换为新的段选择子的值。

(二)中断描述符表初始化

运行环境的另一个重要的系统表就是中断描述符表,他决定了由哪个程序来响应系统的中断或者陷阱。在保护模式初始化时,并没有对IDT进行初始化,甚至没有定义中断描述符表,那是因为在进行保护模式切换时,可以保证系统运行于关中段状态,保证初始化本身也不使用任何的软中断指令,这样就可以在没有对IDT初始化的情况下,确保不会发生因中断描述符表没有设置而导致的错误。

由于INETL的CPU可以响应256个中断,因此系统IDT最大有256个描述符,但是实际系统中并不需要那么多,所以可以根据需要进行设置,在本系统中,为了节约空间,仅定义了64个。

定义后并将其初始化,使用一个默认过程来初始化,这个默认的过程什么工作都不作,仅仅是简单的返回。默认过程定义如下:

__declspec( naked )

void default_int()

{

__asm iretd ;

}

这里使用了__declspec( naked )这个由VC6提供的特有关键字,它可以让编译器不生成函数的环境初始化代码,所有的操作都交由程序员来完成。因此可以使用VC6来编写中断处理程序,这也是为什么选择VC6来编写这个操作系统的原因。

(三)系统基本硬件初始化

系统环境建立后,需要对硬件设备进行初始化,为了保证通用性,仅初始化大多数系统都会有的硬件,就是系统时钟。

在PC系统中要初始化系统时钟,必须首先初始化中断控制器,因为系统时钟是通过中断控制器接入系统的。由于INTEL已经保留了CPU的0-31号中断,因此中断控制器的中断只能从32号中断开始。在本系统中,中断控制器接入CPU的中断号从32开始,到47,一共16个,另外保留16个中断门作为系统调用的入口,为以后扩展功能留下一定的余地。

四、 进程定义及调度

(一)进程定义

任何操作系统,最重要的概念就是进程,进程通常表示一个执行的程序,它包括可执行的程序、程序数据、栈、程序计数器等等程序运行需要的信息。在本系统中,由于并没有涉及复杂的功能,所以进程结构的定义比较简单。仅包含调度相关的信息和一些基本进程信息

struct _task

{

struct _node task_node;

char task_cputime;

BYTEtask_stat;

BYTEtask_pri;

BYTEtask_pril;

DWORD task_prinum;

int task_sleep;

void *task_sp;

char *task_name;

int task_id;

int task_pid;

unsigned int task_errcode;

};

(二)調度算法

本系统采用的调度算法是以优先级为主,辅以时间片轮转的调度算法。以优先级为主的调度算法,可以保证高优先级的进程可以抢占CPU,以保证实时任务得到及时响应,而辅以时间片轮转,则可以保证优先级相同时,各进程公平的获得CPU时间。

系统调度过程是调度器根据优先级从高到低的原则扫描系统进程表,在发现某个优先级存在可调度进程的时候,就转入扫描该优先级的进程表,如果该优先级中存在多个任务,就根据时间片轮转的原则挑选出进程,然后将CPU的控制权交给挑选出来的进程。

五、结语

这仅仅是一个最简单的操作系统内核,没有提供任何额外的系统服务,包括一些类似系统延时、互斥对象、定时器这样的基本功能,但是有了基本的内核后,就可以在其上发展,使其逐渐发展壮大。

【参考文献】

[1]John Lions. Lion's Commentary on UNIX 6th Edition with Source Code [M].机械工业出版社,2000.

[2]Andrew S. Tanenbaum. Modern Operating Systems [M].机械工业出版社,1999.

[3]Jean J. Labrosse. MicroC/OS_II The Real-Time Kernel Sec-

ond Edition [M].北京航空航天大学出版社,2003.

[4]杨季文.80X86汇编语言程序设计教程[M].清华大学出版社,1998.

【作者简介】罗斌(1978- ), 男 ,广西马山人,广西电网公司南宁供电局助理工程师。

猜你喜欢
嵌入式操作系统
典型实时嵌入式操作系统应用分析
FATFS在嵌入式操作系统FreeRTOS中的移植与应用
基于嵌入式操作系统的工业采集板设计
应用服务型人才培养体系下的嵌入式操作系统教学改革探索
兼容多种通信方式的智能网关软件设计
计算机嵌入式操作系统研究