• 休闲生活
  • 教育教学
  • 经济贸易
  • 政法军事
  • 人文社科
  • 农林牧渔
  • 信息科技
  • 建筑房产
  • 环境安全
  • 当前位置: 达达文档网 > 达达文库 > 人文社科 > 正文

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

    时间:2020-10-18 07:59:05 来源:达达文档网 本文已影响 达达文档网手机站

    【摘要】文章介绍了一个基于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个描述符,可以使用数组定义如下:

    DESCgdt[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;

    BYTE        task_stat;    

    BYTE        task_pri;    

    BYTE        task_pril;    

    DWORD        task_prinum;

    int       task_sleep;

    void *       task_sp;    

    char *       task_name;    

    int         task_id;    

    int      task_pid;    

    unsigned inttask_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- ), 男 ,广西马山人,广西电网公司南宁供电局助理工程师。

    相关热词搜索: 体系结构 嵌入式 系统实现 操作 PC

    • 生活居家
    • 情感人生
    • 社会财经
    • 文化
    • 职场
    • 教育
    • 电脑上网