练习6--完善中断初始化和处理

1.  中断向量表中一个表项占多少个字节?其中哪几位代表中断处理代码的入口?

答:系统将所有的中断事件统一进行编号(0~255),这个编号称为中断向量。中断向量表的一个表项占8个字节,其结构如下:

  0~15位:偏移地址的0~15位;

  16~31位:段选择子;

  32~47位:属性信息(包括DPL等);

  48~63位:偏移地址的16~31位。

其中第16~32位是段选择子,用于索引全局描述符表GDT来获取中断处理代码对应的 段地址,再加上第0~15、48~63位构成的偏移地址,即可得到中断处理代码的入口。

2. 请编程完善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函数的源代码:

  

3. 请编程完善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.

  经过以上分析,写出如下源代码:

  实现效果:

在lab1目录下执行’make qemu’,观察到如下结果,发现每过1s屏幕打印一次’100 ticks’,并且按下的键也会在屏幕上显示:

参考链接:https://www.cnblogs.com/wuhualong/p/ucore_lab1_exercise6_report.html

ucore-lab1-练习6report的更多相关文章

  1. 《ucore lab1》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 练习1:理解通过make生成执行文件的过程 详见<ucore lab1 exercise1>实验报告 练习2:使用qemu执行并调试 ...

  2. ucore lab1 bootloader学习笔记

    ---恢复内容开始--- 开机流程回忆 以Intel 80386为例,计算机加电后,CPU从物理地址0xFFFFFFF0(由初始化的CS:EIP确定,此时CS和IP的值分别是0xF000和0xFFF0 ...

  3. 《ucore lab1 exercise5》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 题目:实现函数调用堆栈跟踪函数 我们需要在lab1中完成kdebug.c中函数print_stackframe的实现,可以通过函数print_s ...

  4. 《ucore lab1 exercise3》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 题目:分析bootloader进入保护模式的过程 BIOS将通过读取硬盘主引导扇区到内存,并转跳到对应内存中的位置执行bootloader.请分 ...

  5. 《ucore lab1 exercise2》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 题目:使用qemu执行并调试lab1中的软件 为了熟悉使用qemu和gdb进行的调试工作,我们进行如下的小练习: 从CPU加电后执行的第一条指令 ...

  6. 《ucore lab1 exercise1》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 题目:理解通过make生成执行文件的过程 列出本实验各练习中对应的OS原理的知识点,并说明本实验中的实现部分如何对应和体现了原理中的基本概念和关 ...

  7. ucore操作系统学习笔记(一) ucore lab1系统启动流程分析

    一.ucore操作系统介绍 操作系统作为一个基础系统软件,对下控制硬件(cpu.内存.磁盘网卡等外设),屏蔽了底层复杂多样的硬件差异:对上则提供封装良好的应用程序接口,简化应用程序开发者的使用难度.站 ...

  8. Ucore lab1实验报告

    练习一 Makefile 1.1 OS镜像文件ucore.img 是如何一步步生成的? + cc kern/init/init.c + cc kern/libs/readline.c + cc ker ...

  9. ucore lab1练习2 qemu+gdb 不能协作调试的问题make lab1-mon

    本练习是qemu结合gdb调试,但是我做实验的时候并不能像视频输入make lab1-mon那样顺利调试,期间有各种error,后来我找到原因,请看解决方法. 请先把ucore_lab文件删除,以下全 ...

  10. 《ucore lab1 exercise4》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 题目:分析bootloader加载ELF格式的OS的过程 通过阅读bootmain.c,了解bootloader如何加载ELF文件.通过分析源代 ...

随机推荐

  1. css 实现 左右div 等高, 同时父级div就是最高的子div的高度

    原文地址:https://www.cnblogs.com/cbza/p/7145384.html 方法一: 通过父级overflow:hidden,  自己设置padding-bottom 和 mar ...

  2. MYSQL登录函数(第3版本)

    已经改进 CREATE DEFINER=`root`@`%` FUNCTION `uc_session_login`( `reqjson` JSON, `srvjson` JSON ) RETURNS ...

  3. 图解Tomcat

  4. MPICH2简单的安装配置总结

    ./configure -prefix=/home/mpi/mpich2 make make install 用命令export PATH /home/mpi/mpich2/bin:$PATH,但我是 ...

  5. C语言排序算法学习笔记——交换类排序

    交换类排序:根据序列中两个元素关键字的比较结果来交换他俩在序列中的位置. 冒泡排序:假设待排序表长为n,从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i])则交换他们 ...

  6. JS获取option的value和text

    window.onload = function(){ //首先获得下拉框的节点对象: var select = document.getElementById("s1"); // ...

  7. MySql查询问题select from

    一开始这样不行,后来把值用单引号引起来就行了SELECT * FROM reflectmastercore WHERE name=free 就像下面这样 SELECT * FROM reflectma ...

  8. NoSuchMethodError解决方法

    下面演示下如何在啥都不知道的情况下遇到该错误的解决思路: 随便找一个错误示例: Caused by: java.lang.NoSuchMethodError: org.eclipse.jdt.inte ...

  9. Android 开发 Activity里获取View的宽度和高度 转载

    原文地址:https://blog.csdn.net/chenbaige/article/details/77991594 前言: 可能很多情况下,我们都会有在activity中获取view 的尺寸大 ...

  10. gentoo qt-creator no examples

    参考 [SOLVED] qtcreator: examples are missing https://forums.gentoo.org/viewtopic-t-1092826-highlight- ...