计算机操作系统实验指导.docx
- 文档编号:11263967
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:82
- 大小:105.25KB
计算机操作系统实验指导.docx
《计算机操作系统实验指导.docx》由会员分享,可在线阅读,更多相关《计算机操作系统实验指导.docx(82页珍藏版)》请在冰豆网上搜索。
计算机操作系统实验指导
计算机操作系统实验指导
实验一LINUX初起代码的分析
1设计目的
通过对Linux初起代码的分析了解一个操作系统的初起过程锻炼学生分析大型软件代码的能力,通过与同组同学的合作锻炼学生的合作能力
2设计内容
根据本设计书所提供的基础知识,分析init/main.c中关于系统初起的相关代码,得到相关的框图,写出设计报告.
3设计要求
认真阅读代码,与同组同学合作,通过充分的讨论得到相关的结论.
4设计装置
无
5设计步骤
1.了解基础知识
2.与同组同学一起讨论出任务的分配方式
3.对自己的任务部分的代码充分阅读得到相应的框图
4.与同组同学讨论得到整体的框图
5.撰写报告
6数据及处理
分析系统源代码得到相关框图
7报告及要求
1.设计题目
2.同组同学任务的分配方式
3.代码分析结果
4.体会
8相关基础知识
PC机的引导过程如下.在最低的层次上,启动系统的第一步是从硬件获得帮助,然后由这个硬件去运行一些短小的程序,再由他去引导系统
1.首先,当机器开启的时候,机器中的每个CPU都要初始化,我们现在只考虑只有一个CPU的情况.在系统开启之后,这个CPU就开始进行自测试.
2.CPU初始化后,从0xfffffff0地址开始取指令执行,执行的是固化在ROM中的指令,这是一个跳转指令,跳转到BIOS代码的开始位置.
3.BIOS使用内部的规则来启动设备,通常的选择顺序是软盘、硬盘、CDROM,当然你也可以通过按健来手动选择,当设备启动后,BIOS读这个设备上的第一个扇区的信息,即开始512个字节的内容,称之为MBR主引导记录。
我们假设LINUX
是采用LILO来引导的,BIOS先读MBR上的关键字,目的是确定这是BIOS,然后检测引导扇区的位置,它指明LILO的开始部分,BIOS将LILO装入内存,把控制转给LILO。
4.LILO在把自己其余的部分装载进来以后,从磁盘上找数据配置,它们会指明从何处得到内核,启动时要通过什么选项LILO,然后装载非压缩形式存储的内核自解压可执行文件从而把控制交给内核
5.内核的大部分程序以压缩形式存储,除了前面提到的自解压可执行文件。
它负责自解压内核映像文件,解压缩完成后,把控制转给已经解压的内核。
在这部分操作完成后,执行main.c中的start_kernal函数,产生一个init进程,这个进程是LINUX中的第一个进程,由init进程负责触发其他必须的进程来使系统作为一个整体进入可用的状态。
例如,要设置getty进程来接受用户登录,建立网络服务,比如FTP和HTTP守护进程等等。
代码:
init/main.c
#ifdefCONFIG_BLK_DEV_INITRD
kdev_treal_root_dev;启动参数所设定的根盘设备
#endif
asmlinkagevoid__initstart_kernel(void)
{
char*command_line;
unsignedlongmempages;
externcharsaved_command_line[];
lock_kernel();
printk(linux_banner);
setup_arch(&command_line);arch/i386/kernel/setup.c中,初始化initrd_start和initrd_end两个变量
...
#ifdefCONFIG_BLK_DEV_INITRD
if(initrd_start&&!
initrd_below_start_ok&&
initrd_start ;min_low_pfn为内核末端_end所开始的物理页号,initrd_start,initrd_end在rd.c中定义 printk(KERN_CRIT"initrdoverwritten(0x%08lx<0x%08lx)-" "disablingit.\n",initrd_start,min_low_pfn< initrd_start=0; } #endif ... kernel_thread(init,NULL,CLONE_FS|CLONE_FILES|CLONE_SIGNAL);创建init进程 unlock_kernel(); current->need_resched=1; cpu_idle(); } staticintinit(void*unused) { lock_kernel(); do_basic_setup(); /* *Ok,wehavecompletedtheinitialbootup,and *we'reessentiallyupandrunning.Getridofthe *initmems egmentsandstarttheuser-modestuff.. */ free_initmem(); unlock_kernel(); if(open("/dev/console",O_RDWR,0)<0) printk("Warning: unabletoopenaninitialconsole.\n"); (void)dup(0); (void)dup(0); /* *Wetryeachoftheseuntilonesucceeds. * *TheBourneshellcanbeusedinsteadofinitifweare *tryingtorecoverareallybrokenmachine. */ if(execute_command) execve(execute_command,argv_init,envp_init); execve("/sbin/init",argv_init,envp_init); execve("/etc/init",argv_init,envp_init); execve("/bin/init",argv_init,envp_init); execve("/bin/sh",argv_init,envp_init); panic("Noinitfound.Trypassinginit=optiontokernel."); } staticvoid__initdo_basic_setup(void) { #ifdefCONFIG_BLK_DEV_INITRD intreal_root_mountflags; #endif ... #ifdefCONFIG_BLK_DEV_INITRD real_root_dev=ROOT_DEV;ROOT_DEV为所请求根文件系统的块设备 real_root_mountflags=root_mountflags; if(initrd_start&&mount_initrd)root_mountflags&=~MS_RDONLY; elsemount_initrd=0; #endif start_context_thread(); do_initcalls();会调用partition_setup()中加载内存盘 /*..filesystems..*/ filesystem_setup(); /*Mounttherootfilesystem..*/ mount_root(); mount_devfs_fs(); #ifdefCONFIG_BLK_DEV_INITRD root_mountflags=real_root_mountflags; if(mount_initrd&&ROOT_DEV! =real_root_dev &&MAJOR(ROOT_DEV)==RAMDISK_MAJOR&&MINOR(ROOT_DEV)==0){ ;如果当前根盘为initrd所建立的内存盘 interror; inti,pid; pid=kernel_thread(do_linuxrc,"/linuxrc",SIGCHLD);创建新的任务去执行程序/linuxrc if(pid>0) while(pid! =wait(&i));等待linuxrc进程退出 if(MAJOR(real_root_dev)! =RAMDISK_MAJOR ||MINOR(real_root_dev)! =0){ ;如果原来的根盘不是0号内存盘,则使用原来的根文件系统, ;并且将内存盘转移到其/initrd目录下 error=change_root(real_root_dev,"/initrd"); if(error) printk(KERN_ERR"Changerootto/initrd: " "error%d\n",error); } } #endif } #ifdefCONFIG_BLK_DEV_INITRD staticintdo_linuxrc(void*shell) { staticchar*argv[]={"linuxrc",NULL,}; close(0);close (1);close (2); setsid();设置新的session号 (void)open("/dev/console",O_RDWR,0); (void)dup(0); (void)dup(0); returnexecve(shell,argv,envp_init); } #endif ;arch/i386/kernel/setup.c #defineRAMDISK_IMAGE_START_MASK0x07FF #defineRAMDISK_PROMPT_FLAG0x8000 #defineRAMDISK_LOAD_FLAG0x4000 #definePARAM((unsignedchar*)empty_zero_page) #defineRAMDISK_FLAGS(*(unsignedshort*)(PARAM+0x1F8))可用rdev设置的参数 #defineLOADER_TYPE(*(unsignedchar*)(PARAM+0x210)) #defineINITRD_START(*(unsignedlong*)(PARAM+0x218))初始化盘映象起始物理地址 #defineINITRD_SIZE(*(unsignedlong*)(PARAM+0x21c))初始化盘字节数 void__initsetup_arch(char**cmdline_p) { ... #ifdefCONFIG_BLK_DEV_RAM rd_image_start=RAMDISK_FLAGS&RAMDISK_IMAGE_START_MASK;以块为单位 rd_prompt=((RAMDISK_FLAGS&RAMDISK_PROMPT_FLAG)! =0); rd_doload=((RAMDISK_FLAGS&RAMDISK_LOAD_FLAG)! =0); #endif ... #ifdefCONFIG_BLK_DEV_INITRD if(LOADER_TYPE&&INITRD_START){ if(INITRD_START+INITRD_SIZE<=(max_low_pfn< ;max_low_pfn表示内核空间1G范围以下最大允许的物理页号 reserve_bootmem(INITRD_START,INITRD_SIZE); initrd_start= INITRD_START? INITRD_START+PAGE_OFFSET: 0;转变为内核逻辑地址 initrd_end=initrd_start+INITRD_SIZE; } else{ printk("initrdextendsbeyondendofmemory" "(0x%08lx>0x%08lx)\ndisablinginitrd\n", INITRD_START+INITRD_SIZE, max_low_pfn< initrd_start=0; } } #endif ... } ;fs/partitions/check.c: int__initpartition_setup(void) { device_init();包含ramdisk设备的初始化 #ifdefCONFIG_BLK_DEV_RAM #ifdefCONFIG_BLK_DEV_INITRD if(initrd_start&&mount_initrd)initrd_load(); ;如果启动时加载了initrd文件,则用它去初始化根内存盘 else #endif rd_load();如果内核配置了内存盘并且根盘指定为软盘则试图将软盘加载为根内存盘 #endif return0; } __initcall(partition_setup); ;drivers/block/rd.c: intrd_doload;/*1=loadRAMdisk,0=don'tload*/ intrd_prompt=1;/*1=promptforRAMdisk,0=don'tprompt*/ intrd_image_start;/*startingblock#ofimage*/ #ifdefCONFIG_BLK_DEV_INITRD unsignedlonginitrd_start,initrd_end; int 实验二进程管理 1.目的和要求 加强对进程概念的理解。 2.实验内容 至少要有: 创建新的进程;查看运行进程;换出某个进程;杀死运行进程以及进程之间通信等功能。 3.实验环境 ①PC兼容机 ②Windows、DOS系统 ③TC语言 4.实验提示 PCB结构通常包括以下信息: 进程名,进程优先数,轮转时间片,进程所占用的CPU时间,进程的状态,当前队列指针等。 可根据实验的不同,PCB结构的内容可以作适当的增删。 主体程序 #include"conio.h" #include"stdio.h" #include"stdlib.h" structjincheng_type {intpid; intyouxian; intdaxiao;………}; structjincheng_typeneicun[20]; intshumu=0,pid_l; main() { intn,m,i; chara; n=1; while(n==1) { clrscr(); printf("\n********************************************"); printf("\n*进程演示系统*"); printf("\n********************************************"); printf("\n1.创建新的进程2.查看运行进程"); printf("\n3.换出某个进程4.杀死运行进程"); printf("\n5.进程之间通信6.退出系统"); printf("\n********************************************"); printf("\n请选择(1~6)"); a=getche(); switch(a) {case'1': create(); break; case'2': run(); break; case'3': huanchu(); break; case'4': kill(); break; case'5': tongxun(); break; case'6': exit(0); default: n=0; } } } create()/*创建一个进程的示例(不完整的程序)*/ { if(shumu>=20) { printf("\n内存已满,请先结束或换出进程\n"); } else { printf("\n请输入新进程的pid\n"); scanf("%d",&neicun[shumu-1].pid); printf("\n请输入新进程的优先级\n"); scanf("%d",&neicun[shumu-1].youxian); printf("\n请输入新进程的大小\n"); scanf("%d",&neicun[shumu-1].daxiao); shumu++; } } 5.实验运行结果 ******************************************** *进程演示系统* ******************************************** 1.创建新的进程2.查看运行进程 3.换出某个进程4.杀死运行进程 5.进程之间通信6.退出系统 ******************************************** 请选择(1~6) 然后根据你选择的不同,出现不同的结果。 实验三进程调度 1.目的和要求 进程调度是处理机管理的核心内容。 本实验要求用C语言编写和调试一个简单的进程调度程序。 通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先数和时间片轮转调度算法的具体实施办法。 2.实验内容 ①设计进程控制块PCB表结构(与实验一的结构相同),分别适用于优先数调度算法和循环轮转调度算法。 ②建立进程就绪队列。 对两种不同算法编制入链子程序。 ③编制两种进程调度算法: 1)优先数调度;2)循环轮转调度 3.实验环境 同实验一 4.实验提示 ①本程序用两种算法对五个进程进行调度,每个进程可有三个状态,并假设初始状态为就绪状态。 ②为了便于处理,程序中的某进程运行时间以时间片为单位计算。 各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。 ③在优先数算法中,优先数可以先取值为98,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。 在轮转算法中,采用固定时间片(即: 每执行一次进程,该进程的执行时间片数为已执行了2个单位),这时,CPU时间片数加2,进程还需要的时间片数减2,并排列到就绪队列的尾上。 ④对于遇到优先数一致的情况,采用FIFO策略解决。 5.实验运行结果 TYPETHEALGORITHM(PRIORITY/ROUNDROBIN): 若选择了PRIORITY(优先数算法),则进一步显示: INPUTNAMEANDNEEDTIME A12 A23 A34 A42 A54 OUTPUTOFPRIORITY: CPUTIME: 1 NAMECPUTIMENEEDTIMEPRIORITYSTATE A11145working A20347ready A30446ready A40248ready A50446ready CPUTIME: 2 NAMECPUTIMENEEDTIMEPRIORITYSTATE A12145ready A20347ready A30446ready A41145working A50446ready CPUTIME: 3 NAMECPUTIMENEEDTIMEPRIORITYSTATE A13145ready A21244working A30446ready A42245ready A50446ready CPUTIME: 4 NAMECPUTIMENEEDTIMEPRIORITYSTATE A14145working A22244ready A30446ready A43245ready A50446ready CPUTIME: 5 NAMECPUTIMENEEDTIMEPRIORITYSTATE A15145ready A23244ready A31343working A44245ready A50446ready CPUTIME: 6 NAMECPUTIMENEEDTIMEPRIORITYSTATE A16145ready A24244ready A323
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 操作系统 实验 指导