完善中断初始化和处理

请完成编码工作和回答如下问题:

  1. 中断描述符表(也可简称为保护模式下的中断向量表)中一个表项占多少字节?其中哪几位代表中断处理代码的入口?

表项的结构定义:
+ 一个表项占8个字节。
+ 哪几位代表中断处理代码的入口:16:32的段选择字加上0~ :15 和 48:63构成终端代码的处理代码的入口。

  1. 请编程完善 kern/trap/trap.c 中对中断向量表进行初始化的函数 idt_init。在 idt_init 函数中,依次对所有中断入口进行初始化。使用 mmu.h 中的 SETGATE 宏,填充 idt 数组内容。每个中断的入口由 tools/vectors.c 生成,使用 trap.c 中声明的 vectors 数组即可.

1) Ucore启动后,通过idt_init函数初始化IDT表,IDT表的每个元素均为門描述符,记录一个中断向量对应的中断处理函数的段选择子、偏移量和属性(门类型、DPL等),所以初始化IDT表就是初始化每个中断向量的这些属性。

2) 除了系统调用(T_SYSCALL)的门类型为陷阱門、DPL=3(用户级权限)以外,其它终端的门类型均为中断門、DPL=0(内核级权限,即仅能够使用int 0x30指令)。

3) vectors中存储了中断处理程序的入口程序和入口地址,即该数组中第i个元素对应第i个中断向量的中断处理函数地址。vectors定义在vector.S文件中,通过一个工具程序vector.c生成。而且由vector.S文件开头可知,中断处理函数属于.text的内容。因此,中断处理函数的段选择子即.text的段选择子GD_KTEXT。从kern/mm/pmm.c可知.text的段基址为0,因此中断处理函数地址的偏移量等于其地址本身。

4) 使用mmu.h中的SETGATE宏来填充idt数组的内容,传递的参数有向量的首地址、門的类型、是否为系统调用、段选择子、偏移地址和DPL。

5) 完成IDT表的初始化之后,还需执行’LIDT’命令将IDT表的起始地址加载到IDTR寄存器中。LIDT指令的作用:使用一个包含线性地址基址和界限的内存操作数来加载IDT。用来在OS创建IDT时设定IDT的起始地址。该指令只能在特权级0执行。

/* idt_init - initialize IDT to each of the entry points in kern/trap/vectors.S */
void idt_init(void) {extern uintptr_t __vectors[];  int i;/* along: how to set istrap and dpl? */for (i = 0; i < sizeof(idt) / sizeof(struct gatedesc); i ++) { //IDT表项的个数SETGATE(idt[i], 0, GD_KTEXT, __vectors[i], DPL_KERNEL);}SETGATE(idt[T_SWITCH_TOK], 0, GD_KTEXT,     __vectors[T_SWITCH_TOK], DPL_USER);lidt(&idt_pd);
}
  1. 请编程完善 trap.c 中的中断处理函数 trap,在对时钟中断进行处理的部分填写 trap 函数中处理时钟中断的部分,使操作系统每遇到 100 次时钟中断后,调用 print_ticks 子程序,向屏幕上打印一行文字”100 ticks”。
    1) Trap函数只是调用了trap_dispatch函数,而trap_dispatch函数实现了对各种中断的处理,这题只要我们完成对时钟中断的处理,也就是trap_dispatch函数中第一个case语句。

2) 可以使用kern/driver/clock.c中的全局变量ticks记录当前始终中断次数,每次发生时钟中断则将ticks加一,如果加一之后ticks==100,则调用print_ticks子函数打印相关信息,并将ticks置0.

  case IRQ_OFFSET + IRQ_TIMER:if (((++ticks) % TICK_NUM) == 0) {print_ticks();ticks = 0;}

Ucore------Lab1_Practice6相关推荐

  1. 操作系统:ucore的部分Bug挑战练习

    ucore是清华大学提供的一个学习操作系统的平台.ucore有完整的mooc视频与说明文档. https://objectkuan.gitbooks.io/ucore-docs/content/# 本 ...

  2. ucore操作系统实验笔记 - Lab1

    最近一直都在跟清华大学的操作系统课程,这个课程最大的特点是有一系列可以实战的操作系统实验.这些实验总共有8个,我在这里记录实验中的一些心得和总结. Task1 这个Task主要是为了熟悉Makfile ...

  3. 操作系统实验报告11:ucore Lab 2

    ucore实验报告2 实验内容 uCore Lab 2:物理内存管理 (1) 编译运行 uCore Lab 2 的工程代码: (2) 完成 uCore Lab 2 练习 1-3 的编程作业: (3) ...

  4. 操作系统实验报告1:ucore Lab 1

    操作系统实验报告1 实验内容 阅读 uCore 实验项目开始文档 (uCore Lab 0),准备实验平台,熟悉实验工具. uCore Lab 1:系统软件启动过程 (1) 编译运行 uCore La ...

  5. ucore和linux区别,附录 - 附录A—ucore历史 - 《操作系统的基本原理与简单实现》 - 书栈网 · BookStack...

    ucore历史 写一个教学OS的初衷是陈渝老师和向勇老师想参考MIT的xv6/JOS开发一个能够与OS课程教材相配套的OS实验环境.没有直接采用xv6/JOS的原因是当时(2008年)xv6没有完整的 ...

  6. 随想录(关于ucore)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 之前用过一段时间skyeye,也对开发skyeye的陈渝有一些了解.最近在github上闲逛的 ...

  7. 关于ucore实验一的资料查找

    任务:阅读实验一makefile 搞清楚ucore.img是如何构建的 $@  $<  $^  这三个变量分别是什么意思 https://blog.csdn.net/YEYUANGEN/arti ...

  8. ucore lab2

    UCORE实验2 实验目的 理解基于段页式内存地址的转换机制 理解页表的建立和使用方法 理解物理内存的管理方法 实验内容 本次实验包含三个部分.首先了解如何发现系统中的物理内存:然后了解如何建立对物理 ...

  9. 操作系统实验—ucore Lab1

    一.内容 通过 Lab1 中的 bootloader 可以从实模式切换的保护模式,然后再读取磁盘并加载 ELF 文件以加载 OS 操作系统,操作系统能够读入字符并显示到屏幕上,具体内容如下: 练习 1 ...

  10. 操作系统实验Ucore:Kernel_init(四)

    本文首发于我的博客 上一节进行到了kernel_init的printf_kernelinfo,继续往下分析 1.pmm_init 这个函数,顾名思义是用来初始化物理内存的函数,这个函数只会调用gdt_ ...

最新文章

  1. 漫画 | 人到中年,一地鸡毛
  2. 小猿圈Python学习教程之后端接收前端回传的文件方法
  3. mysql 函数,关键字,特性
  4. Java Bean与Map之间相互转化的实现
  5. Django - 网页加载报错:A server error occurred. Please contact the administrator(亲测)
  6. 安装DNN4.6.2 source code出现的问题
  7. 地址栏地址 获取_直播源获取工具,支持斗鱼、虎牙、B站、企鹅电竞、YY、抖音、西瓜直播!...
  8. matlab里box office,免费试用Econometrics Toolbox
  9. 面试题 02.06. 回文链表
  10. OA办公系统需要专业的系统管理员
  11. 屏幕居中(DIV/CSS) 的几种方法
  12. mysql实现停车场管理系统完整代码实现_基于微信小程序的停车场管理系统毕业论文+开题报告+前后台(Java+Mysql)源码及数据库文件...
  13. 微签电子印章自动生成上线
  14. 国家级专精特新小巨人企业是什么?
  15. 盛姓取名女孩儒雅大气
  16. 华科图书情报专硕考研复试与读研
  17. css/html 定位 绝对定位/相对定位
  18. FinalShell离线激活
  19. 1、树莓派4B设置热点,一步步细心来
  20. 秦路数据分析 Week All

热门文章

  1. 银行运维概念以及网银手机银行后台运维问题查找解决过程
  2. 轻松提高搜索能力-实用网站合集
  3. 电脑计算机简单密码设置方法,如何设置电脑开机密码
  4. 一些常用的SCI论文句式 (1)
  5. 基于粒子群优化算法的分布式电源选址定容【IEEE33节点】(Matlab代码实现)
  6. 每天一本电子书 - JavaScript for Kids: A Playful Introduct
  7. 抖音sdk接口API调用-同步抖音粉丝列表
  8. 在centos7上安装TinyProxy http代理
  9. 一个售后工程师的逆袭
  10. 离散数学-考纲版-01-命题逻辑