77范文网 - 专业文章范例文档资料分享平台

xv6操作系统整体报告(6)

来源:网络收集 时间:2020-03-27 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

第八章 对称多处理(SMP/MultiCore)支持

1. 概述

本章将给出xv6多处理器支持的实现概貌。读者将学习以下一些内容:

? 什么是SMP系统?

? 什么是PIC,LAPIC,IOAPIC?

? xv6是如何识别一个计算机系统中的多个CPU的? ? xv6是如何支持CPU之间的中断信息传递的?

? xv6如何初始化主处理器(BP)和从处理器(AP)的?

xv6的一个独特之处在于它支持基于多处理器的计算机系统,即对称多处理计算机系统。SMP是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。它是应用十分广泛的并行技术。在这种架构中,一台电脑不再由单个处理器组成,而同时由多个处理器运行操作系统的单一复本,并共享内存和一台计算机的其他资源。虽然同时使用多个处理器,但是从管理的角度来看,它们的表现就像一台单处理器的计算机一样。系统将任务队列对称地分布于多个处理器之上,从而极大地提高了整个系统的数据处理能力。所有的处理器都可以平等地访问内存、I/O和外部中断。在对称多处理系统中,系统资源被系统中所有CPU共享,工作负载能够均匀地分配到所有可用处理器之上。在xv6中,每一个核上都可以独立地运行一个进程。本章侧重介绍与多处理器有关的内容;在本章内,读者可以了解到xv6是如何支持多处理器的。

2. APIC

APIC(Advanced Programmable Interrupt Controller)是一个与8259A兼容的高级中断处理器。它不但实现了中断处理的功能,还实现了以下功能:

1. 提供与中断相关的设备通讯

2. 提供多处理器(或多CPU)之间的中断共享与中断通讯

事实上,xv6与外部设备的很大一部分通讯处理,都是通过APIC来实现的。

APIC分为两层:Local APIC和I/O APIC。 a. I/O APIC I/O APIC是用来与外部设备通讯的,它完成了APIC最主要的功能:中断处理。 I/O APIC提供了两个模式,普通模式和8259A兼容模式。xv6在单核环境下,会选择使用8259A兼容模式,而在多处理器环境下,则会使用普通模式。 b. Local APIC Local APIC是APIC的顶层,每个核都有一个对应的Local APIC。它负责进行多处理器之间的中断传输,屏蔽中断,还提供了一个可编程的Timer。由于I/O APIC已经提供了中断处理的功能,Local APIC只是起辅助作用,可以屏蔽不用。

xv6在单核环境中,Local APIC被屏蔽不用;而只有在多处理器环境中,Local APIC才被打开,完成初始化每个核、开关中断、Timer等功能。

c. Timer

如上文所提到的,Local APIC提供了一个可编程的Timer。所以xv6在多处理器环境下,每个核使用其对应的Local APIC提供的Timer。

而在单核环境下,Local APIC并没有被打开。xv6使用了8253PIT(Programmable Interval Timer)来实现时钟中断。 相关代码:

if(ismp)

lapic_timerinit(); else

pit8253_timerinit();

picirq.c

该文件提供了与8259A兼容的中断处理函数,包括: pic_init: 初始化8259A中断控制器 irq_enable: 打开指定的中断

irq_setmask_8259A: 更改IRQ mask寄存器

ioapic.c

该文件提供了xv6与I/O APIC使用普通模式通讯的函数,包括: ioapic_init: 初始化I/O APIC ioapic_read: 读I/O APIC寄存器 ioapic_write: 写I/O APIC寄存器

该文件还包括了函数ioapic_enable,带有两个参数,irq和cpunum。它用来在cpunum号核上,打开irq所指的中断。

在整个xv6中,这个函数被调用了两次,分别是打开键盘在第一个核上的中断,和打开IDE在最后一个核上的中断。

在多处理器的环境下,I/O APIC开中断之后,指定的核并不能收到指定的中断。只有在指定的核的Local APIC中开中断后,才能收到指定的中断。

值得一提的是,该文件的所有函数只有在多处理器的环境下才会被执行。

lapic.c

该文件提供了xv6与Local APIC通讯的函数,包括: lapic_read: 读Local APIC寄存器 lapic_write: 写Local APIC寄存器

lapic_init: 初始化某个核的Local APIC,其中关键操作:

lapic_write(LAPIC_SVR, LAPIC_ENABLE|(IRQ_OFFSET+IRQ_SPURIOUS)); // 打开APIC

lapic_write(LAPIC_ICRHI, 0); lapic_write(LAPIC_ICRLO,

LAPIC_ALLINC|APIC_LEVEL|LAPIC_DEASSERT|APIC_INIT); // 发送init命令 while(lapic_read(LAPIC_ICRLO) & APIC_DELIVS); // 等待init完成

lapic_eoi: 响应中断(Acknowledge Interrupt),向EOI寄存器发送0

lapic_timerinit: 初始化Local APIC提供的Timer

lapic_timerintr: Timer中断处理函数,内容只是简单地Acknowledge Interrupt lapic_enableintr: 开中断,设置TPR(Task Priority Register)为0 lapic_disableintr: 关中断,设置TPR(Task Priority Register)为0xFF

另外还有两个函数cpu和lapic_startap,将在下一节Multi Processor中介绍。 值得一提的是,该文件的所有函数只有在多处理器的环境下才会被执行。

8253pit.c

该文件用来控制8253PIT,整个文件只有一个函数:pit8253_timerinit 当该函数被调用后,8253PIT会定期产生时钟中断。

在多处理器环境下,xv6会在每个核上运行scheduler,平等地分配进程。关于进程调度,上文中已经有详细的介绍。而本节的内容主要是介绍xv6对于多处理器的初始化。APIC可以认为是xv6与多处理器硬件之间的接口,几乎所有与多处理器有关的操作都要通过APIC来实现。下面是有关多处理器的一下基本概念和初始化分析。

a. BSP和AP

APIC将核分为了两类:BSP(Bootstrap Processor)和AP(Application Processor)。顾名思义,前者是操作系统启动时第一个使用的核,而后者是随后将使用的核。在实际的多处理器环境中,BSP只有一个(编号为0),xv6启动时就运行在它上面,完成基本的初始化工作,识别出其他的AP。AP可能有很多个,每个需要使用类似初始化BSP的代码来启动。在xv6中,只有在

初始化时,这两类核才有区别;操作系统多处理初始化,并正常运行后,它们便不再有区别了。

b. MP Configuration Table

MP Configuration Table是硬件提供给操作系统,用来描述多处理器信息的一个结构,在BSP上运行的xv6首先需要找到它,完成对AP、LAPIC、IOAPIC的查找和基本的初始化。该表由三部分组成:

1. Floating Point Structure: 作为一个指针,给出Configuration Table在内存中的位置 2. Configuration Table Header: 表头,在xv6中提供Local APIC寄存器的位置 3. Table Entry: 表项,一共有4种: ? Processor Table Entry ? Bus Table Entry

? I/O APIC Table Entry ? Interrupt Table Entry

其中唯一对xv6真正有价值的是Processor Table Entry。其中apicid以及flag中的MPBP标志位,前者是每一个核的编号,而后者用来识别哪个核是BP。

c. Processor的编号

在xv6中,使用到两种核的编号。第一种是apicid,也就是上文中从Processor Table Entry中获得的;而第二种是核在cpus数组中的下标。

前一种在初始化启动AP时会使用到(lapic_startap函数)。而后一种只使用过一次:在初始化Local APIC时,只有BSP使用了cpus数组的下标作为lapic_init的参数,而AP则使用了apicid作为lapic_init的参数。幸好lapic_init函数中并没有用到这个参数,不然可是会出大乱子的。

d. Inter-processor Interrupt

IPI(Inter-processor Interrupt)是多处理器之间通讯的一种方式。在xv6中,它用来在BSP和各个AP之间通讯,以启动AP。它是通过读写Local APIC的寄存器来实现的。

e. 初始化顺序

在多处理器环境下,xv6按照以下顺序来初始化BSP和各个AP:

1. 查找并读取MP Configuration Table,获取LAPIC配置起始地址,填写与CPU相关的

mpproc结构和与IOAPIC相关的mpioapic结构的信息;( mp.c文件的mp_init函数)[Q]mp.c的139~142行有什么作用? 2. 初始化BSP的Local APIC;(lapic文件的lapic_init函数)

3. 在此还初始化了内核中的许多关键数据结构,不过与AP没有直接关系;(main.c文件

的main函数的24~36行)

4. 设置AP的启动代码的起始函数start(位于bootother.S)和此函数结束后将跳转继续执

行的函数mpmain(位于main.c)和堆栈,通过IPI中断来启动各个AP;(main.c文件的bootothers函数) 5. 运行scheduler。(main.c文件的mpmain函数) 在每个AP中,xv6按照如下顺序来执行:

1. 进入保护模式

2. 初始化AP的Local APIC 3. 运行scheduler

函数分析

由于上文中已经介绍过系统启动的大部分内容,故下文中只介绍与多处理器相关的代码。

mp.c

该文件用来获得MP Configuration Table,启动各个AP。下面是相关函数的分析说明: mp_search: 寻找Floating Point Structure

在不同的计算机上,Floating Point Structure并不在同一个位置。根据intel的文档,应该按顺序在如下三个位置查找:

1. 在Extended BIOS Data Area的第一个KB中 2. 在System Base Memory的最后一个KB中 3. 在BIOS ROM中,地址0xE0000~0xFFFFF

mp_search: 判断指定内存位置是否为Floating Point Structure,并调用mp_search1查找mp数据结构

mp_search1: 根据“_MP_”和checksum来查找mp数据结构

mp_config: 在调用mp_search的基础上,进一步检测找到的MP Configuration Table是否合法 mp_init: 找到MP Configuration Table,并获取相关信息。[Q]ncpu的初始值为多少?原因是? mp_bcpu: 返回当前cpu在cpus数组中的下标作为编号

bootother.S

AP的启动代码在other.S的bootstart函数,具体操作为: 26~36行,在实模式下初始化各个寄存器 42~51行,进入保护模式

59~64行,在保护模式下初始化各个段寄存器

66~68行,设置esp并跳转到指定函数地址(mpmain函数)

值得一提的是,start之前的8个字节用来在mp_startthem和bootother.S中传递数据。start-4为栈地址,而start-8为要执行的函数地址

lapic.c

cpu: 读取Local APIC的ID寄存器,给出当前核的第一种编号 lapic_startap: 使用Inter-processor Interrupt来启动指定的AP

main.c

该文件中与Multi Processor有关的有两个函数: main: BSP的初始化,其中: 18行,把BSS清零

20行,获取MP Configuration Table的信息 21行,获得apicid,初始化BSP的Local APIC 37行,启动各个AP

89行,调用mpmain,运行scheduler

mpmain: AP的初始化函数,在bootother.S进入保护模式后执行,其中: 48行,显示输出cpid 49行,加载idt

50~51行,获得apicid,如果cpu是AP,则初始化AP的Local APIC 52行,设置段模式

53行,设置标志,表示AP已经启动完毕 56行,启动scheduler

bootothers: 循环启动每一个AP,具体操作为: 68行,引用了bootother.S中的启动代码

69行,将启动代码复制入APBOOTCODE(一块空内存) 72~73行,排除BSP

76~78行,将mpmain地址与栈地址写入bootother.S代码之前,由bootother.S负责初始化栈和跳转至mpmain函数 79行,执行lapic_startap 82行,等待AP初始化完毕

第九章 用户库和用户程序 (ulib & user program)

1. 概述

与其它操作系统相似,xv6给用户程序提供了系统调用和用户库函数两个重要的工具。用户程序使用了这些工具,便可以通过或不通过内核来完成各种有用的操作。

2. 系统调用

在上文中,已经介绍过xv6系统调用的实现原理。而在这节中,主要介绍xv6提供给用户程序有哪些系统调用,都实现了什么功能。

a. 文件系统调用

open: 打开指定的文件,参数为文件名和打开模式 close: 关闭指定的文件描述符

dup: 复制指定的文件描述符,返回新描述符

pipe: 创建一个pipe,并给管道入口和出口分别创建一个描述符,从参数给出的文件描述符数组指针返回入口和出口描述符

fstat: 返回指定文件描述符所包含的的文件属性

read: 从指定描述符读取指定大小的数据,返回成功读取的字节数 write: 向指定描述符写入指定大小的数据 mknod: 在文件系统中创建inode link: 在文件系统中创建链接 unlink: 在文件系统中删除链接 mkdir: 在文件系统中创建目录 chdir: 在文件系统中删除目录 exec: 执行指定的elf可执行程序

b. 进程相关调用

fork: 使用copyproc产生一个新进程作为当前进程的子进程 exit: 退出进程,不再返回

wait: 等待某个子进程结束,并返回子进程的pid kill: 杀掉指定pid的进程 getpid: 获得当前进程的pid

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库xv6操作系统整体报告(6)在线全文阅读。

xv6操作系统整体报告(6).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/jiaoyu/894191.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: