操作系统课程设计实验报告以Linux为例Word格式文档下载.docx
《操作系统课程设计实验报告以Linux为例Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计实验报告以Linux为例Word格式文档下载.docx(54页珍藏版)》请在冰豆网上搜索。
叙述本篇报告要解决什么问题。
注意不可以抄写实验要求中的表述,要用自己的话重新组织我们这里所提出的问题。
3.解决方案:
叙述如何解决自己上面提出的问题,可以用小标题3.1,3.2…等分开。
这是实验报告的关键部分,请尽量展开来写。
注意,这部分是最终课程设计的基本分的部分。
这部分不完成,本课程设计不会及格。
4.实验结果:
按照自己的解决方案,有哪些结果。
结果有异常吗?
能解释一下这些结果吗?
同别人的结果比较过吗?
注意,这部分是实验报告出彩的地方。
本课程设计要得高分,应该在这部分下功夫。
5.结束语:
小结并叙述本次课程设计的经验、教训、体会、难点、收获、为解决的问题、新的疑惑等。
6.附录:
加了注释的程序清单,注释行数目至少同源程序行数目比1:
2,即10行源程序,至少要给出5行注释。
实验一 编译Linux内核
实验时间
6小时
实验目的
认识Linux内核的组成,掌握配置、编译、安装Linux内核的步骤。
实验目标
下载2.6.19或更新的Linux内核,配置该内核使其支持NTFS,并在新的内核中修改其版本为LinuxNameTestKernelx.x.x,其中,Name是你的名字(汉语拼音);
x.x.x是新内核的版本号,最后在你的机器上编译安装这个新内核。
背景知识
参见《RedHatEnterpriseLinux4入门与提高》第20章。
实验步骤
1.验证gcc的可用:
在你自己的工作目录下,编译链接运行HelloWorld程序。
2.在http:
//www.kernel.org上下载指定的内核,或者查找更新的稳定版内核并下载之。
3.准备相关工具。
提示:
如当前运行的Linux内核是基于2.4版本的,则需要更新以下软件:
module-init-tools和mkinitrd。
具体更新信息可参见下载内核源代码中的Documentation/Changes这个文件。
4.把源代码解压缩至/usr/src中,最终形成/usr/src/linuxx.x.x/目录(x.x.x是新内核的版本号)。
这里的注意点是路径的选择,一般要放在/usr/src/linuxx.x.x/目录下面,以满足Makefile对路径设置的初始要求。
5.进入源代码的根目录(/usr/src/linuxx.x.x),找到合适自己的内核配置方法,并按照实验目标对其进行配置。
6.修改/usr/src/linuxx.x.x/include/linux/version.h文件中的版本信息。
注:
如果没有这个文件,请执行命令:
makeinclude/linux/version.h
7.编译内核。
8.安装模块文件。
9.安装内核文件。
10.重新启动新内核。
实验结果
1.实验步骤1中,编译链接运行程序你下达了哪些命令?
2.实验步骤2中,你下载了哪个版本的内核文件?
3.实验步骤3中,你是否安装了相关工具?
如安装,则写出安装过程。
4.实验步骤4中,你是用哪些命令解压缩内核文件的?
5.实验步骤5中,你用了哪种内核配置的方法?
6.你对实验步骤6中涉及的文件做了怎样的修改?
7.实验步骤7-9的过程,是否出现错误?
如有,你是如何解决的?
8.观察你机器中GRUB的配置文件,它在安装完新内核后发生了哪些变化?
9.新内核启动过程是否成功?
如有错误,是哪些错误?
你是如何消错的?
(如不够,可另附页)
#include"
mqx_inc.h"
//将“max-inc.h”添加到源文件中
/*!
*\private
//声明私有变量及分配存储空间声明私有变量及分配存储空间
*
*\briefCreatesthelightweightsemaphore.
//简单创建轻量级的信号
*\param[in]sem_ptrPointertothelightweightsemaphoretocreate.
//创建轻量级指针信号
*\param[in]initial_numberInitalnumberofsemaphoresavailable.
//信号量可用的初始数量
*\param[in]hiddenTRUEifsemaphorewillnehiddenfromkernel,FALSEifnot.
如果信号量ne被隐藏在核心代码中则为true,否则则为false
*\param[in]userUsermodefunctionality.
//用户模式的功能
*\returnMQX_OK
//返回MQX_OK
*\returnMQX_EINVAL
//返回MOX_EINVAL
*\returnMQX_INVALID_LWSEM
//返回MQX_INVALID_LWSEM
*\see_lwsem_create
*\see_lwsem_create_hidden
*\see_usr_lwsem_create
*\seeLWSEM_STRUCT
*/
_mqx_uint_lwsem_create_internal
(
LWSEM_STRUCT_PTRsem_ptr,
_mqx_intinitial_number,//初始数
booleanhidden,//隐藏
booleanuser//用户
)
{
KERNEL_DATA_STRUCT_PTRkernel_data;
//内核数据结构指针的核心数据
LWSEM_STRUCT_PTRsem_chk_ptr;
//lwsemstructPTRSEM检查PTR
#ifMQX_ENABLE_USER_MODE
//如果启用用户模式代码
if(user&
&
!
_psp_mem_check_access_mask((uint_32)sem_ptr,sizeof(LWSEM_STRUCT),MPU_UM_R,MPU_UM_RW))
如果用户
{
returnMQX_INVALID_LWSEM;
//返回MQX_INVALID_LWSEM;
}
#endif/*MQX_ENABLE_USER_MODE*///结束条件指令
_GET_KERNEL_DATA(kernel_data);
//得到的内核数据(内核-数据)
_KLOGE2(KLOG_lwsem_create,initial_number);
//
sem_ptr->
VALUE=initial_number;
_QUEUE_INIT(&
sem_ptr->
TD_QUEUE,0);
_int_disable();
if(!
hidden)//如果没有隐藏
#ifMQX_CHECK_ERRORS
/*Checkiflwsemisalreadyinitialized*/
//检查lwsem是否已经初始化
#ifMQX_ENABLE_USER_MODE//如果用户启用mqx
if(user)
sem_chk_ptr=(LWSEM_STRUCT_PTR)((pointer)kernel_data->
USR_LWSEM.NEXT);
while(sem_chk_ptr!
=(LWSEM_STRUCT_PTR)((pointer)&
kernel_data->
USR_LWSEM))
if(sem_chk_ptr==sem_ptr)
_int_enable();
_KLOGX2(KLOG_lwsem_create,MQX_EINVAL);
return(MQX_EINVAL);
sem_chk_ptr=(LWSEM_STRUCT_PTR)((pointer)sem_chk_ptr->
NEXT);
else
#endif/*MQX_ENABLE_USER_MODE*/
sem_chk_ptr=(LWSEM_STRUCT_PTR)((pointer)kernel_data->
LWSEM.NEXT);
=(LWSEM_STRUCT_PTR)((pointer)&
LWSEM))
return(MQX_EINVAL);
sem_chk_ptr=(LWSEM_STRUCT_PTR)((pointer)sem_chk_ptr->
#endif/*MQX_CHECK_ERRORS*/
if(user)
_QUEUE_ENQUEUE(&
USR_LWSEM,sem_ptr);
LWSEM,sem_ptr);
VALID=LWSEM_VALID;
_KLOGX2(KLOG_lwsem_create,MQX_OK);
return(MQX_OK);
}
*Becauselightweightsemaphoresareacorecomponent,anapplicationneednotto
*createthecomponentbeforeitcreateslightweightsemaphores.
//因为是轻量的核心组件,所以应用程序不需要在它创建的轻量级信号量创建组件
//参数sem_ptr指针创建轻量级信号.
//参数initial_number初始数量的可用信号量。
*\returnMQX_OK返回MQX_OK
*\returnMQX_EINVAL返回MQX_EINVAL
*\returnMQX_INVALID_LWSEM返回MQX_INVALID_LWSEM
*\see_lwsem_create_hidden创建隐藏
*\see_lwsem_destroy释放函数
*\see_lwsem_post向服务器传送数据
*\see_lwsem_test测试
*\see_lwsem_wait等待
*\see_lwsem_wait_for等待
*\see_lwsem_wait_ticks等待时间中断
*\see_lwsem_wait_until等待结束后继续执行
_mqx_uint_lwsem_create
_mqx_intinitial_number
#ifMQX_ENABLE_USER_MODE&
MQX_ENABLE_USER_STDAPI
if(MQX_RUN_IN_USER_MODE)
return_usr_lwsem_create(sem_ptr,initial_number);
#endif
return_lwsem_create_internal(sem_ptr,initial_number,FALSE,FALSE);
*\briefCreatesthelightweightsemaphorehiddenfromkernel.
//简单创建轻量级信号量隐藏在核心数据中
//参数sem_ptr指针创建轻量级信号
*\returnMQX_OK返回MQX_OK
*\returnMQX_EINVAL返回MQX_EINVAL
*\returnMQX_INVALID_LWSEM返回MQX_INVALID_LWSEM
*\see_lwsem_create创建
_mqx_uint_lwsem_create_hidden
return_lwsem_create_internal(sem_ptr,initial_number,TRUE,FALSE);
*\briefCreatesthelightweightsemaphorehiddenformkernel.
*Thisfunctionisanequivalenttothe_lwsem_create()APIcallbutitcanbe
*executedfromwithintheUsertaskorothercoderunningintheCPUUsermode.
//这个函数是一个相当于_lwsem_create()API调用,但是它可执行从用户任务或其他代码在CPU用户模式运行。
*Parameterspassedtothisfunctionbypointerarerequiredtomeetthememory
*protectionrequirementsasdescribedintheparameterlistbelow.
//如下面的参数列表描述。
需要满足内存的指针传递给这个函数的参数保护的要求。
*\param[in]sem_ptrReadonly.Pointertothelightweightsemaphoretocreate.
//参数[中]sem_ptr只读。
由指针的轻量级的信号来创建。
//参数[中]initial_number初始数量的可用信号量。
*\returnMQX_OK返回MQX_OK
_mqx_uint_usr_lwsem_create
MQX_API_CALL_PARAMSparams=
{(uint_32)sem_ptr,(uint_32)initial_number,(uint_32)FALSE,0,0};
return_mqx_api_call(MQX_API_LWSEM_CREATE,&
params);
*\private//声明私有变量及分配存储空间
*\briefDestroysthelightweightsemaphore.
//简单的释放轻量级信号量
*\param[in]sem_ptrPointertothecreatedlightweightsemaphore.
//\参数[中]sem_ptr指针创建的轻量级的信号量的
//[在]用户参数的用户模式功能。
*\returnMQX_OK//返回MQX_OK
*\returnMQX_INVALID_LWSEM(Lwsem_ptrdoesnotpointtoavalidlightweightsemaphore.)//返回MQX_INVALID_LWSEM(lwsem_ptr没有指向有效的轻量级的信号。
_mqx_uint_lwsem_destroy_internal
booleanuser
{/*Body*/
KERNEL_DATA_STRUCT_PTRkernel_data;
TD_STRUCT_PTRtd_ptr;
LWSEM_STRUCT_PTRsem_chk_ptr;
_KLOGE2(KLOG_lwsem_destroy,sem_ptr);
#ifMQX_CHECK_VALIDITY
if(sem_ptr->
VALID!
=LWSEM_VALID)
_KLOGX2(KLOG_lwsem_destroy,MQX_INVALID_LWSEM);
return(MQX_INVALID_LWSEM);
}/*Endif*/
VALID=0;
/*Invalidatethesemaphore*/
while(_QUEUE_GET_SIZE(&
TD_QUEUE))
_QUEUE_DEQUEUE(&
TD_QUEUE,td_ptr);
_BACKUP_POINTER(td_ptr,TD_STRUCT,AUX_QUEUE);
_TIME_DEQUEUE(td_ptr,kernel_data);
_TASK_READY(td_ptr,kernel_data);
}/*Endwhile*/
/*Checkiflwsemisinkernel'
ssemaphorelist*/
//检查lwsem是否是内核的信号量表
/*removesemaphorefromkernelLWSEMqueue*/
_QUEUE_REMOVE(&
break;
/*removesemaphorefromkerne