《操作系统》基本课程实验指导书-2014 联系客服

发布时间 : 星期三 文章《操作系统》基本课程实验指导书-2014更新完毕开始阅读bec6706ea76e58fafab003ab

moremsec = (1000000 - c2_virtt.it_value.tv_usec)/1000;

printf(\

t1=(10-c2_proft.it_value.tv_sec)*1000+(1000000-c2_proft.it_value.tv_usec)/1000 + c2_proft_secs*10000;

+

t2=(10-c2_virtt.it_value.tv_sec)*1000+(1000000-c2_virtt.it_value.tv_usec)/1000 c2_virtt_secs*10000;

}

moresec = (t1 - t2)/1000;

moremsec = (t1 - t2) % 1000;

printf(\fflush(stdout); exit(0); }//endc2

//parent

//setparent signal handle

signal(SIGALRM,p_sighandle); signal(SIGVTALRM,p_sighandle); signal(SIGPROF,p_sighandle);

ini_value.it_interval.tv_sec = 10; ini_value.it_interval.tv_usec = 0; ini_value.it_value.tv_sec = 10; ini_value.it_value.tv_usec = 0;

//set parent timer

setitimer(ITIMER_REAL,&ini_value,NULL); setitimer(ITIMER_VIRTUAL,&ini_value,NULL); setitimer(ITIMER_PROF,&ini_value,NULL);

fib = fibonacci(36);

getitimer(ITIMER_PROF,&p_proft); getitimer(ITIMER_REAL,&p_realt); getitimer(ITIMER_VIRTUAL,&p_virtt);

printf(\

moresec = 10 - p_realt.it_value.tv_sec;

moremsec = (1000000 - p_realt.it_value.tv_usec)/1000;

printf(\

moresec = 10 - p_proft.it_value.tv_sec;

moremsec = (1000000 - p_proft.it_value.tv_usec)/1000;

printf(\

moresec = 10 - p_virtt.it_value.tv_sec;

moremsec = (1000000 - p_virtt.it_value.tv_usec)/1000;

printf(\

t1= (10 - p_proft.it_value.tv_sec)*1000 + (1000000 - p_proft.it_value.tv_usec)/1000 + p_proft_secs*10000;

t2 = (10 - p_virtt.it_value.tv_sec)*1000 + (1000000 - p_virtt.it_value.tv_usec)/1000 + p_virtt_secs*10000;

moresec = (t1 - t2)/1000;

moremsec = (t1 - t2) % 1000;

printf(\

fflush(stdout); //wait c1,c2 terminal wait(&status); wait(&status); return 0; }//end main

int fibonacci(int n) {

if( n == 0 ) return 0;

else if( n == 1 || n == 2) return 1;

else return(fibonacci(n-1)+fibonacci(n-2) ); }

static void c1_sighandle(int s) { }

static void c2_sighandle(int s) {

switch(s){ case SIGALRM:c2_realt_secs+=10;break;

case SIGVTALRM:c2_virtt_secs+=10;break;

switch(s){

case SIGALRM:c1_realt_secs+=10;break;

case SIGVTALRM:c1_virtt_secs+=10;break; case SIGPROF:c1_proft_secs+=10;break; default :break;

}

} { }

case SIGPROF:c2_proft_secs+=10;break;

default :break; }

static void p_sighandle(int s)

switch(s){ case SIGALRM:p_realt_secs+=10;break; case SIGVTALRM:p_virtt_secs+=10;break; case SIGPROF:p_proft_secs+=10;break; default :break;

}

3.3 实验2.3内核模块

1、实验目的

模块是Linux系统的一种特有机制,可用以动态扩展操作系统内核功能。编写实现某些特定功能的模块,将其作为内核的一部分在管态下运行。本实验通过内核模块编程在/porc文件系统中实现系统时钟的读操作接口。

2、实验内容

设计并构建一个在/proc文件系统中的内核模块clock,支持read()操作,read()返回值为一字符串,其中包块一个空各分开的两个子串,为别代表xtime.tv_sec和xtime.tv_usec。

3、实验原理

Linux模块是一些可以作为独立程序来编译的函数和数据类型的集合。在装载这些模块式,将它的代码链接到内核中。Linux模块可以在内核启动时装载,也可以在内核运行的过程中装载。如果在模块装载之前就调用了动态模块的一个函数,那么这次调用将会失败。如果这个模块已被加载,那么内核就可以使用系统调用,并将其传递到模块中的相应函数。

4、实验步骤

?

编写内核模块

文件中主要包含init_module(),cleanup_module(),proc_read_clock()三个函数。其中init_module(),cleanup_module()负责将模块从系统中加载或卸载,以及增加或删除模块在/proc中的入口。read_func()负责产生/proc/clock被读时的动作。 ?

编译内核模块Makefile文件 Makefile CC=gcc

MODCFLAGS := -Wall -D__KERNEL__ -DMODULE –DLINUX

clock.o :clock.c /usr/include/linux//version.h $(CC) $( MODCFLAGS) –c clock.c

echo insmod clock.o to turn it on echo rmmod clock to turn ig off echo

编译完成之后生成clock.o模块文件。 ? 内核模块源代码clock.c #define MODULE

#define MODULE_VERSION #define MODULE_NAME

#include #include #include

int proc_read_clock(char* page, char** start, off_t off,

int count,int* eof,void* data)

{

int len;

struct timeval xtime;

do_gettimeofday(&xtime);

len = sprintf(page,\printk(\return len;

“1.0” “clock”

}

// proc_dir_entry数据结构

struct proc_dir_entry* proc_my_clock;

int init_module()

{

printk(\

my_clock=create_proc_read_entry(\printk(KERN_INFO“%s %s has initialized.\\n”,

MODULE_NAME,MODULE_VERSION);

return 0; }

void cleanup_module() {

printk(\

remove_proc_entry(proc_my_clock->name, &proc_root); printk(KERN_INFO“%s %s has removed.\\n”,

MODULE_NAME,MODULE_VERSION);