操作系统-ucore-lab3

合集下载

ucosiii移植原理

ucosiii移植原理

ucosiii移植原理
uCOSIII(MicroC/OS-III)是一款开源的实时操作系统(RTOS),适用于各种嵌入式系统和实时应用。

uCOSIII的移植原理主要包括以下几个方面:
1. 硬件抽象层(HAL):首先,需要针对特定硬件平台(如STM32、ARM、AVR等)编写硬件抽象层代码。

硬件抽象层的作用是将硬件平台的特性和接口抽象成统一的、易于操作的接口,以便于上层应用程序和实时操作系统进行调用。

2. 移植uCOSIII内核:将uCOSIII内核代码移植到目标硬件平台,主要包括以下几个步骤:
a. 配置uCOSIII内核:根据目标硬件平台的特性,配置uCOSIII内核的参数,如内存大小、任务数量等。

b. 修改内核代码:根据目标硬件平台的实际情况,修改内核代码,以适应不同硬件平台的需求。

这可能包括:修改内存管理代码、时钟管理代码、中断处理代码等。

c. 编写初始化代码:编写初始化代码,用于在系统启动时初始化
内核及其相关组件。

3. 移植uCOSIII的应用实例:根据项目需求,编写基于uCOSIII的应用实例。

这可能包括:编写驱动程序、编写通信协议、编写应用程序等。

4. 集成测试:将编写好的硬件抽象层、内核及应用实例集成到一起,进行系统测试和调试,确保整个系统的稳定性和可靠性。

5. 优化与调试:根据实际运行情况,对系统进行优化和调试,以提高系统的性能和资源利用率。

总之,uCOSIII的移植原理主要包括硬件抽象层的编写、uCOSIII内核的移植、应用实例的编写、集成测试以及优化与调试。

通过这些步骤,可以将uCOSIII成功移植到不同的硬件平台,并应用于各种实时系统。

ucos-iii知识点总结

ucos-iii知识点总结

1、其中最有用的功能应该是时间片轮转法(roundrobin), 这个是uC/OS-II 中不支持的,但是现在已经是uC/OS-III 的一个功能了2、uC/OS-III 被设计用于32 位处理器,但是它也能在16 位或8 位处理器中很好地工作。

3、一共有2 种类型的实时系统:软实时系统和硬实时系统。

硬实时系统中,运算超时是不允许发生的,运算超时会导致严重后果。

但是在软实时系统中,超时不会导致严重后果4、前后台系统:包含一个无限循环的模块实现需要的操作(后台)。

中断处理程序实现异步事件(前台)。

前台也叫做中断级,后台也叫作任务级。

5、临界操作应该在任务级中被执行,不可避免地必须在中断处理程序中执行也要确保是在很短的时间内完成。

因为这会导致ISR 占用更长的时间。

通常的,ISR 中使能相关的信息而在后台程序中执行相应的操作。

6、ucos-iii中的任务(也叫做线程)是一段简单的程序,运行时完全地占用CPU 。

在单CPU 中,任何时候只有1 个任务被执行。

7、内核的责任是管理任务,协调和切换多个任务依次享用CPU 。

让我们感觉是多个CPU 在同时运行,也有利于处理模块化的应用它也负责管理任务间的交流,系统资源的管理(内存和I/O )等。

8、uC/OS-III 是一个抢占式内核,这意味着uC/OS-III 总是执行最重要的就绪任务9、ISR 响应中断请求设备,但是ISR 只做非常少的工作。

ISR 应该标记或发送消息到一个高优先级的任务,让中断能够快速处理完毕10、系统中加入内核需要额外的支出,因为内核提供服务时需要时间去处理。

内核占用CPU 的时间介于2% 到4% 之间。

因为uC/OS-III是一个软件,添加到目标系统中需要额外的ROM 和RAM 。

11、。

uC/OS-III 内核需要1K 到4K 之间的RAM ,加上每个任务自己所需的堆栈空间。

至少有4K 大小RAM 的处理器才有可能成功移植uC/OS-III 。

UCOS III 配置与初始化

UCOS III 配置与初始化

/********************************************************************
********************************************************
void OSIntExit (void)
{
CPU_SR_ALLOC();
*/
if (p_stk != (CPU_STK *)0) {
/*关于 OSCfg_ISRStkBasePtr 我也不是很清楚,不用也行*/ size = OSCfg_ISRStkSize;
/*在 os_cfg_app.c 中有定义 CPU_STK* const OSCfg_ISRStkBasePtr= (CPU_STK*)&OSCfg_ISRStk[0];*/
return;
}
#endif
#if OS_CFG_TMR_EN > 0u
/* Initialize the Timer Manager module
*/
OS_TmrInit(p_err);
if (*p_err != OS_ERR_NONE) {
return;
}
#endif
#if OS_CFG_DBG_EN > 0u OS_Dbg_Init();
}
#endif
OS_IdleTaskInit(p_err); /* 初始化空任务,一般没有别的任务工作的话,就由它来占 CPU,空任务 的优先级要最低*/ if (*p_err != OS_ERR_NONE) {
return; }
OS_TickTaskInit(p_err);
/* 初始化时钟节拍函数

计算机系统基础实验介绍Lab3

计算机系统基础实验介绍Lab3

Lab3 实验任务(续)
4)任务四:boom(续) 本阶段的实验任务就是构造这样一个攻击字符串,使得 getbuf函数不管获得什么输入,都能将正确的cookie值返回 给test函数,而不是返回值1。除此之外,你的攻击代码应还 原任何被破坏的状态,将正确返回地址压入栈中,并执行ret 指令从而真正返回到test函数。
目标程序bufbomb续?缓冲区攻击从getbuf函数开始函数gets并不判断buf数组是否足够大它只是简单地向目标地址复制全部输入字符串因此输入如果超出预先分配的存储空间边界就会造成缓冲区溢出
计算机系统基础实验介绍Lab3
学术诚信
如果你确实无法完成实验, 你可以选择不 提交。如果抄袭,不管抄袭者还是被抄袭者, 均以零分论处并按作弊处分。
正常情况下,如果你的操作不符合预 期(!success),会看到信息“Better luck next time”,这时你就要继续-8尝-
目标程序BUFBOMB(续)
• 本实验的主要内容从分析test函数开始。
test函数中调用了getbuf函数, getbuf函数的功能是 从标准输入(stdin)读入一个字符串。
熟练运用gdb、objdump、gcc等工具。
-4-
二、实验数据
• /s/1hs2Mw1Q • 下载实验数据包: lab3.tar
在本地目录将数据包解压: tar –xf lab3.tar
数据包中至少包含下面四个文件:
* bufbomb: 可执行程序,攻击所用的目标程序bufbomb。 * bufbomb.c: C语言源程序,目标程序bufbomb的主程序。 * makecookie:可执行程序,该程序基于你的学号产生一个唯一的由8
void fizz(int val) {

清华大学操作系统实验lab1实验报告

清华大学操作系统实验lab1实验报告

练习1、理解通过make生成执行文件的过程。

[练习1.1] 操作系统镜像文件ucore.img 是如何一步一步生成的?在proj1执行命令make V=可以得到make指令执行的过程从这几条指令中可以看出需要生成ucore.img首先需要生成bootblock,而生成bootblock需要先生成bootmain.o和bootasm.o还有sign,这三个文件又分别由bootmain.c、bootasm.S、sigh.c来生成。

ld -m elf_i386 -N -e start -Ttext 0x7C00 obj/boot/bootasm.o obj/boot/bootmain.o –o obj/bootblock.o这句话用于生成bootblock,elf_i386表示生成elf头,0x7C00为程序的入口。

'obj/bootblock.out' size: 440 bytes这句话表示生成的bootblock的文件大小,因为大小不到512字节,所以需要给blootblock填充,填充的功能在sign.c中有所体现,最后两字节设置为了0x55,0xAAbuf[510] = 0x55;buf[511] = 0xAA;FILE *ofp = fopen(argv[2], "wb+");size = fwrite(buf, 1, 512, ofp);[练习1.2] 一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?前面已经提到过:引导扇区的大小为512字节,最后两个字节为标志性结束字节0x55,0xAA,做完这样的检查才能认为是符合规范的磁盘主引导扇区。

Sign.c文件中有作检查:if (size != 512) {fprintf(stderr, "write '%s' error, size is %d.\n", argv[2], size);return -1;}练习2:使用qemu执行并调试lab1中的软件。

uC-OS-III的特点

uC-OS-III的特点

uC/OS-III的特点uC/OS-III简介uC/OS-III(Micro C OS Three 微型的C 语言编写的操作系统第3版)是一个可升级的,可固化的,基于优先级的实时内核。

它对任务的个数无限制。

uC/OS-III 是一个第3 代的系统内核,支持现代的实时内核所期待的大部分功能。

例如资源管理,同步,任务间的通信等等。

然而,uC/OS-III 提供的特色功能在其它的实时内核中是找不到的,比如说完备的运行时间测量性能,直接地发送信号或者消息到任务,任务可以同时等待多个内核对象等。

uC/OS-III 是一个可扩展的,可固化的,抢占式的实时内核,它管理的任务个数不受限制。

它是第三代内核,提供了现代实时内核所期望的所有功能包括资源管理、同步、内部任务交流等。

uC/OS-III 也提供了很多特性是在其他实时内核中所没有的。

比如能在运行时测量运行性能,直接得发送信号或消息给任务,任务能同时等待多个信号量和消息队列。

uC/OS-III主要特点1、时间片轮转调度:uC/OS-III 允许多个任务拥有相同的优先级。

当多个相同优先级的任务就绪时,并且这个优先级是目前最高的。

uC/OS-III 会分配用户定义的时间片给每个任务去运行。

每个任务可以定义不同的时间片。

当任务用不完时间片时可以让出CPU 给另一个任务。

2、抢占式多任务处理:uC/OS-III 是一个抢占式多任务处理内核,因此,uC/OS-III 正在运行的经常是最重要的就绪任务。

3、快速响应中断:uC/OS-III 有一些内部的数据结构和变量。

uC/OS-III 保护临界段可以通过锁定调度器代替关中断。

因此关中断的时间会非常少。

这样就使uC/OS-III 可以响应一些非常快的中断源了。

4、确定性的:uC/OS-III 的中断响应时间是可确定的,uC/OS-III 提供的大部分服务的执行时间也是可确定的。

5、易移植的:uC/OS-III 可以被移植到大部分的CPU 架构中。

ucosiii操作系统的执行流程

ucosiii操作系统的执行流程

ucosiii操作系统的执行流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor.I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!深入解析UCOSIII操作系统执行流程UCOSIII,全称为μC/OS-III,是一款实时嵌入式操作系统,广泛应用于微控制器和嵌入式系统中。

清华大学操作系统lab3实验报告范文

清华大学操作系统lab3实验报告范文

清华大学操作系统lab3实验报告范文实验3:虚拟内存管理练习1:给未被映射的地址映射上物理页ptep=get_pet(mm->dir,addr,1);if(ptep==NULL){//页表项不存在cprintf("get_pteindo_pgfaultfailed\n"); gotofailed;}if(某ptep==0){//物理页不在内存之中//判断是否可以分配新页if(pgdir_alloc_page(mm->pgdir,addr,perm)==NULL){ cprintf("pgdir_alloc_pageindo_pgfaultfailed\n"); gotofailed;}}ele{if(wap_init_ok){tructPage某page=NULL;ret=wap_in(mm,addr,&page);if(ret!=0){//判断页面可否换入cprintf("wap_inindo_pgfaultfailed\n");gotofailed;}//建立映射page_inert(mm->pgdir,page,addr,perm);wap_map_wappable(mm,addr,page,1);}ele{cprintf("nowap_init_okbutptepi%某,failed\n",某ptep); gotofailed;}}ret=0;failed:returnret;}练习2:补充完成基于FIFO算法_fifo_map_wappable(tructmm_truct某mm,uintptr_taddr,tructPage某page,intwap_in){lit_entry_t某head=(lit_entry_t某)mm->m_priv;lit_entry_t某entry=&(page->pra_page_link);aert(entry!=NULL&&head!=NULL);lit_add(head,entry);return0;}pra_page_link用来构造按页的第一次访问时间进行排序的一个链表,这个链表的开始表示第一次访问时间最近的页,链表的尾部表示第一次访问时间最远的页。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统实验报告题目:虚拟内存管理目录一、内容 (2)二、目的 (3)三、实验流程 (3)四、实验环境与结果分析 (3)五、实验体会和思考题 (10)一、内容本次实验是在实验二的基础上,借助于页表机制和实验一中涉及的中断异常处理机制,完成Page Fault异常处理和FIFO页替换算法的实现,结合磁盘提供的缓存空间,从而能够支持虚存管理,提供一个比实际物理内存空间“更大”的虚拟内存空间给系统使用。

这个实验与实际操作系统中的实现比较起来要简单,不过需要了解实验一和实验二的具体实现。

实际操作系统系统中的虚拟内存管理设计与实现是相当复杂的,涉及到与进程管理系统、文件系统等的交叉访问。

如果大家有余力,可以尝试完成扩展练习,实现extended clock页替换算法。

练习1:给未被映射的地址映射上物理页(需要编程)完成do_pgfault(mm/vmm.c)函数,给未被映射的地址映射上物理页。

设置访问权限的时候需要参考页面所在VMA的权限,同时需要注意映射物理页时需要操作内存控制结构所指定的页表,而不是内核的页表。

注意:在LAB2EXERCISE1处填写代码。

执行make qemu后,如果通过check_pgfault函数的测试后,会有“check_pgfault() succeeded!”的输出,表示练习1基本正确。

请在实验报告中简要说明你的设计实现过程。

请回答如下问题:请描述页目录项(Pag Director Entry)和页表(Page Table Entry)中组成部分对ucore实现页替换算法的潜在用处。

如果ucore的缺页服务例程在执行过程中访问内存,出现了页访问异常,请问硬件要做哪些事情?练习2:补充完成基于FIFO的页面替换算法(需要编程)完成vmm.c中的do_pgfault函数,并且在实现FIFO算法的swap_fifo.c中完成map_swappable和swap_out_vistim函数。

通过对swap的测试。

注意:在LAB2EXERCISE 2处填写代码。

执行make qemu后,如果通过check_swap函数的测试后,会有“check_swap()succeeded!”的输出,表示练习2基本正确。

请在实验报告中简要说明你的设计实现过程。

请在实验报告中回答如下问题:如果要在ucore上实现"extended c lock页替换算法"请给你的设计方案,现有的swap_manager框架是否足以支持在ucore 中实现此算法?如果是,请给你的设计方案。

如果不是,请给出你的新的扩展和基此扩展的设计方案。

并需要回答如下问题需要被换出的页的特征是什么?在ucore中如何判断具有这样特征的页?何时进行换入和换出操作?二、目的了解虚拟内存的Page Fault异常处理实现了解页替换算法在操作系统中的实现三、实验流程本次实验主要完成ucore内核对虚拟内存的管理工作。

其总体设计思路还是比较简单,即首先完成初始化虚拟内存管理机制,即需要设置好哪些页需要放在物理内存中,哪些页不需要放在物理内存中,而是可被换出到硬盘上,并涉及完善建立页表映射、页访问异常处理操作等函数实现。

然后就执行一组访存测试,看看我们建立的页表项是否能够正确完成虚实地址映射,是否正确描述了虚拟内存页在物理内存中还是在硬盘上,是否能够正确把虚拟内存页在物理内存和硬盘之间进行传递,是否正确实现了页面替换算法等。

lab3的总体执行流程如下。

首先是初始化过程。

参考ucore总控函数init的代码,可以看到在调用完成虚拟内存初始化的vmm_init 函数之前,需要首先调用pmm_init函数完成物理内存的管理,这也是我们lab2已经完成的内容。

接着是执行中断和异常相关的初始化工作,即调用pic_init函数和idt_init函数等,这些工作与lab1的中断异常初始化工作的内容是相同的。

在调用完idt_init函数之后,将进一步调用三个lab3中才有的新函数vmm_init、ide_init和swap_init。

这三个函数设计了本次实验中的两个练习。

第一个函数vmm_init是检查我们的练习1是否正确实现了。

为了表述不在物理内存中的“合法”虚拟页,需要有数据结构来描述这样的页,为此ucore建立了mm_struct 和vma_struct数据结构(接下来的小节中有进一步详细描述),假定我们已经描述好了这样的“合法”虚拟页,当ucore访问这些“合法”虚拟页时,会由于没有虚实地址映射而产生页访问异常。

如果我们正确实现了练习1,则do_pgfault函数会申请一个空闲物理页,并建立好虚实映射关系,从而使得这样的“合法”虚拟页有实际的物理页帧对应。

这样练习1就算完成了。

ide_init和swap_init是为练习2准备的。

由于页面置换算法的实现存在对硬盘数据块的读写,所以ide_init 就是完成对用于页换入换出的硬盘(简称swap硬盘)的初始化工作。

完成ide_init函数后,ucore就可以对这个swap硬盘进行读写操作了。

swap_init函数首先建立swap_manager,swap_manager是完成页面替换过程的主要功能模块,其中包含了页面置换算法的实现(具体内容可参考5小节)。

然后会进一步调用执行check_swap函数在内核中分配一些页,模拟对这些页的访问,这会产生页访问异常。

如果我们正确实现了练习2,就可通过do_pgfault来调用swap_map_swappable函数来查询这些页的访问情况并间接调用实现页面置换算法的相关函数,把“不常用”的页换出到磁盘上。

四、实验过程与结果分析(1)给未被映射的地址映射上物理页(需要编程)具体而言,当启动分页机制以后,如果一条指令或数据的虚拟地址所对应的物理页框不在内存中或者访问的类型有错误(比如写一个只读页或用户态程序访问内核态的数据等),就会发生页错误异常。

产生页面异常的原因主要有:1、目标页面不存在(页表项全为0,即该线性地址与物理地址尚未建立映射或者已经撤销);2、相应的物理页面不在内存中(页表项非空,但Present标志位=0,比如在swap分区或磁盘文件上)3、访问权限不符合(此时页表项P标志=1,比如企图写只读页面).do_pgfault()函数从CR2寄存器中获取页错误异常的虚拟地址,根据error code来查找这个虚拟地址是否在某一个VMA的地址范围内,那么就给它分配一个物理页。

struct vma_struct {// the set of vma using the same PDTstruct mm_struct *vm_mm;uintptr_t vm_start; // start addr of vmauintptr_t vm_end; // end addr of vmauint32_t vm_flags; // flags of vma//linear list link which sorted by start addr of vmalist_entry_t list_link;};vm_start和vm_end描述的是一个合理的地址空间范围(即严格确保 vm_start < vm_end 的关系);list_link是一个双向链表,按照从小到大的顺序把一系列用vma_struct表示的虚拟内存空间链接起来,并且还要求这些链起来的vma_struct应该是不相交的,即vma之间的地址空间无交集;vm_flags表示了这个虚拟内存空间的属性,包括#define VM_READ 0x00000001 //只读#define VM_WRITE 0x00000002 //可读写#define VM_EXEC 0x00000004 //可执行vm_mm是一个指针,指向一个比vma_struct更高的抽象层次的数据结构mm_struct而这mm_struct包含所有虚拟内存空间的共同属性,如下:struct mm_struct {// linear list link which sorted by start addr of vmalist_entry_t mmap_list;// current accessed vma, used for speed purposestruct vma_struct *mmap_cache;pde_t *pgdir; // the PDT of these vmaint map_count; // the count of these vmavoid *sm_priv; // the private data for swap manager};mmap_list是双向链表头,链接了所有属于同一页目录表的虚拟内存空间mmap_cache是指向当前正在使用的虚拟内存空间pgdir所指向的就是 mm_struct数据结构所维护的页表map_count记录mmap_list里面链接的vma_struct的个数sm_priv指向用来链接记录页访问情况的链表头最后实现if ((ptep = get_pte(mm->pgdir, addr, 1)) == NULL) { //目标页面不存在,失败cprintf("get_pte in do_pgfault failed\n");goto failed;}if (*ptep == 0) { //权限不够,也是失败!if (pgdir_alloc_page(mm->pgdir, addr, perm) == NULL) {cprintf("pgdir_alloc_page in do_pgfault failed\n");goto failed;}}else { //页表项非空,可以尝试换入页面if(swap_init_ok) {struct Page *page=NULL;//根据mm结构和addr地址,尝试将硬盘中的内容换入至page中if ((ret = swap_in(mm, addr, &page)) != 0) {cprintf("swap_in in do_pgfault failed\n");goto failed;}page_insert(mm->pgdir, page, addr, perm);//建立虚拟地址和物理地址之间的对应关系swap_map_swappable(mm, addr, page, 1);//将此页面设置为可交换的 page->pra_vaddr = addr;}else {cprintf("no swap_init_ok but ptep is %x, failed\n",*ptep);goto failed;}}请描述页目录项(Pag Director Entry)和页表(Page Table Entry)中组成部分对ucore 实现页替换算法的潜在用处。

相关文档
最新文档