软中断实验报告
篇一:linux 软中断通信实验报告
实验2 linux软中断通信
1. 实验目的
通过本实验,掌握软中断的基本原理;掌握中断信号的使用、进程的创建以及系统计时器的使用。
2. 实验内容(上交的实验2统一取名为:test2)
由父进程创建两个子进程,通过终端输入crtl+\组合键向父进程发送sigquit 软中断信号或由系统时钟产生sigalrm 软中断信号发送给父进程;父进程接受到这两个软中断的其中某一个后,向其两个子进程分别发送整数值为16和17软中断信号,子进程获得对应软中断信号后,终止运行;父进程调用wait()函数等待两个子进程终止,然后自我终止。
3. 设计思想及算法流程4. 源程序
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#define sec 5
void waiting();
void stop();
int wait_mark;
int main()
{
int p1, p2; /*定义两个进程号变量*/while ((p1 = fork()) == -1); /*循环创建进程至成功为止*/if (p1 > 0)
{
while ((p2 = fork()) == -1); /*循环创建进程至成功为止*/ if (p2 > 0) {
wait_mark = 1;
alarm(sec);
signal(sigquit, stop);
signal(sigalrm, stop);
waiting();
kill(p1, 16);
kill(p2, 17);
wait(0);
wait(0);
printf(parent process is killed!\n);
exit(0);
} else {
signal(sigquit, sig_ign);
signal(sigalrm, sig_ign);
wait_mark = 1;
signal(17, stop); /*接收到软中断信号17,转stop*/ waiting();/*在wait 置0前,不可往下执行*/lockf(1, 1, 0); /*加锁*/
printf(child process 2 is killed by parent!\n);
lockf(1, 0, 0); /*解锁*/
exit(0); /*子进程2退出*/
}
} else {
signal(sigquit, sig_ign);
signal(sigalrm, sig_ign);
wait_mark = 1; /*将等待标记置1直到中断信号刺激stop*/ signal(16, stop);/*接收到软中断信号16,转stop*/ waiting(); /*在wait 置0前,不可往下执行*/ lockf(1, 1, 0);
printf(child process 1 is killed by parent!\n);/*接收到父进程发送信号后,父进程杀死子进程1*/
lockf(1, 0, 0);/*解锁*/
exit(0); /*子进程1退出*/
}
return 0;
}
void waiting()
{
while (wait_mark != 0);
}
void stop()
{
wait_mark = 0;
}
5.运行结果
n 篇二:中断实验报告
上机实验报告
课程名称 上机内容 学 院 专 业 班 级 学 号
计算机接口与外设
中断实验 计算机学院 计算机科学与技术
学生姓名 指导教师 完成日期
吴以凡 2014-12-9一、实验目的
1、掌握8259中断控制器的工作原理。 2、学会编写中断服务程序。
二、实验内容及成果展示 实验1:使用软中断 代码:
start:mov ax,data mov ds,ax
cli
mov si,0ch*4
movax, offset intservice ;中断入口偏移地址 moves:[si], ax
movax, seg intservice ;中断入口的段地址 moves:[si+2], ax sti ;开中断 mov al,cnt ; 初始cnt=1 mov dx,0000h; led的地址out dx,al ;开始第一个灯亮 li: call intservice ;调用软件中断 call delay ;延时 jmp li
; 中断服务程序---------------------------------- intserviceproc push ds
mov al,cnt ;cnt=1;rol al,1 ;cnt=cnt<<1 mov cnt,almov dx,0000h ;led=cnt<<1out dx,al pop ds
intservice endp
;-------------------------------------------------
; 软件延时子程序---------------------------------- delay proc
push bx ;这里用到堆栈 push cx
mov bx,1 lp2:mov cx,0 lp1:loop lp1 dec bx jnz lp2 pop cx pop bx ret delay endp
code ends end start实验结果:实验2:使用1片8259a + 按钮硬件中断
代码如下: start:
; 设置icw4 ;设置icw4
; 设置icw2 ;设置icw2(教材p208图7.4) mov al,01100000b; 中断向量号60h mov dx,020h; 端口号out dx,al
mov ax,data mov ds,ax
; 中断向量的设置------------------------------------------- cli mov ax,0 mov es,ax mov si,60h*4
movax, offset int0 ; 中断入口偏移地址 moves:[si], ax
movax, seg int0 ; 中断入口的段地址 moves:[si+2], ax
; 初始化8259a------------------------------------------------ ;设置icw1 ;设置icw1(教材p207图7.3) mov al,00010011b ;边沿触发/单片使用/需要icw4 mov dx,020h;端口号 out dx,almov al,00011011b;特殊全嵌套方式/缓冲方式(从
片)/自动结束方式/16位机
li: ;8086模型有问题, 它取得的中断号是最后发到总线上的数据, 并不是由8259发出的中断号.
; 中断服务程序----------------------------------
mov dx,0400h ;端口号使用8259a 的端口0的地址 mov al,60hout dx,al jmp li ; 所以以下循环送中断向量地址
mov al,cnt ; 初始cnt=1mov dx,0200h;led 的地址 out dx,al ;开始第一个灯亮 sti ; 开中断
;8259初始化结束--------------------------------------------- ;设置ocw1
mov dx,21h; 设置ocw1(教材p209图7.7)mov al,00000000b;8个中断全部开放 out dx,al out dx,al 篇三:操作系统实验报告
西安交通大学
操作系统专题实验报告
班级:
学号:
姓名:
目 录
1.1实验目的 ............................................................... 1
1.2实验内容 ............................................................... 1
1.3实验思想(或流程图) ................................................... 1
1.4实验步骤 ............................................................... 1
1.5程序运行初值及运行结果分析 ............................................. 4
1.6实验总结 ............................................................... 6
1.7附件 ................................................................... 6
2.1实验目的 ............................................................... 9
2.2实验内容 ............................................................... 9
2.3实验原理 ............................................................... 9
2.4实验结果 .............................................................. 11 i 实验一 内核编译与系统调用
1.1实验目的
(1)熟悉linux 下的基本操作,学会使用各种shell 命令去操作linux ,对linux 有一个感性认识。
(2)理解操作系统调用的运行机制。
(3)掌握创建系统调用的方法。
1.2实验内容
(1)以root 用户身份登陆,并使用“ls ”, “cat ”“cd ”等命令来实现基本的文件操作并观察linux 文件系统的特点.
(2)系统调用实验
a. 编程调用一个系统调用fork (),观察结果。
b. 编程调用创建的系统调用foo (),观察结果。
c. 自己创建一个系统调用mycall (),实现功能:显示字符串到屏幕上。
d. 编程调用自己创建的系统调用。
1.3实验思想(或流程图)
系统调用是一种进入系统空间的办法。linux 的系统调用是通过中断机制实现的。中断这个概念涉及计算机系统结构方面的知识,显然它与微处理器等硬件有着密不可分的关系。软中断,是对硬中断的一种模拟,发送软中断就是向接收进程的proc 结构中的相应项发送一个特定意义的信号。软中断必须等到接收进程执行时才能生效的。
中断(interrupt ),是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得cpu 不得不暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后再返回原来被中断处继续执行的进程。其发生一般而言是“异步”的。换句话说就是在无法预测的情况下发生的(如系统掉电)。所以计算机的软硬件对于中断的相应反应完全是被动的。
陷阱(trap ),即由软件产生的中断,指处理机和内存内部产生的中断,它包括程序运算引起的各种错误,如地址非法、校验错误、页面失效等。它有专门的指令,如x86中的“intn ”,在程序中是有意产生的。所以说陷阱是主动的、“同步”的。
1.4实验步骤
(1)以root 用户身份登陆,并使用“ls ”, “cat ”“cd ”等命令来实现基本的文件操作并观察linux 文件系统的特点. (2)系统调用实验
1.5程序运行初值及运行结果分析
程序:
1. /* filename:helloworld.c */
#include <stdio.h>
main()
{
printf(hello world\n);
}
接下来,进行编译,最简单的编译方法是不指定任何编译选项:
gcc helloworld.c
它会为目标程序生成默认的文件名a.out ,我们可用-o 编译选项来为将产生的可执行文件指
定一个文件名来代替a.out 。例如,将上述名为
helloworld.c 的c 程序编译为名叫helloworld 的可执行文件,需要输入如下命令: gcc –o helloworld helloworld.c
最后,执行生成的可执行文件:./helloworld 可以在屏幕上看到输出结果:hello world 。
(1)编程调用一个系统调用fork ()
在应用程序中调用系统调用fork ()非常简单,下面的程序可以很清楚的显示出有fork ()系统调用生成了子进程,而产生的分叉作用:
# include <stdio.h>
int main()
{
int iuid; iuid=fork(); if(iuid==0) for(;;){ printf(this is parent.\n); sleep(1);
}
} if(iuid>0) } if(iuid<0)printf(can not use system call.\n); return 0;for(;;) {printf(this is child.\n); sleep(1);
1) 编程调用创建的系统调用foo ()
2) 添加源代码
第一任务是编写添加到内核的源程序,即添加到内核文件中的一个函数。该函数的名称应该是在新的系统调用名称之间前加上sys_标志。新加的系统调用为foo (),功能为原值返回输入的整型数。格式为int foo(int inumber),返回的值就是出入的参数。在
/usr/src/linux/kernel/sys.c文件中添加源代码,如下所示:
asmlinkage int sys_foo(int x)
{ printf(“%d\n”,x );
}
它的功能很简单,就是向标准输出一个特定的整数。程序test.c 如下:
#include <stdio.h>
#include <linux/unistd.h>