实验一linux内核编译及添加系统调用设计目的Linux是开源操作系统,用户可以依照自身系统须要剪裁、修改内核,订制出功能愈发合适、运行效率更高的系统,为此,编译linux内核是进行内核开发的必要基本功。在系统中按照须要添加新的系统调用是更改内核的一种常用手段,通过本次实验,读者应理解linux系统处理系统调用的流程以及降低系统调用的方式。内容要求(1)添加一个系统调用,实现对指定进程的nice值的更改或读取功能,并返回进程最新的nice值及优先级prio。建议调用原型为:intmysetnice(pid_tpid,intflag,intnicevalue,void__user*prio,void__user*nice);参数涵义:pid:进程ID。flag:若值为0,表示读取nice值;若值为1,表示更改nice值。Prio、nice:进程当前优先级及nice值。返回值:系统调用成功时返回0,失败时返回错误码EFAULT。(2)写一个简单的应用程序测试(1)中添加的系统调用。(3)若程序中调用了linux的内核函数,要求深入阅读相关函数源码。
实验二linux内核模块编程设计目的Linux提供的模块机制能动态扩展linux功能而无需重新编译内核,早已广泛应用在linux内核的许多功能的实现中。在本实验上将学习模块的基本概念、原理及实现技术linux是什么系统,之后利用内核模块编程访问进程的基本信息,进而加深对进程概念的理解、对模块编程技术的掌握。内容要求(1)设计一个模块,要求列举系统中所有内核线程的程序名、PID号、进程状态及进程优先级。(2)设计一个带参数的模块,其参数为某个进程的PID号,该模块的功能是列举该进程的家族信息,包括父进程、兄弟进程和子进程的程序名、PID号。(3)请依照自身情况,进一步阅读剖析程序中用到的相关内核函数的源码实现。实验四linux进程管理设计目的(1)熟悉linux的命令插口。(2)通过对linux进程控制的相关系统调用的编程应用,进一步加深对进程概念的理解,明晰进程和程序的联系和区别,理解进程并发执行的具体含意。(3)通过Linux管线通讯机制、消息队列通讯机制、共享显存通讯机制的使用,加深对不同类型的进程通讯形式的理解。(4)通过对linux的Posix讯号量的应用,加深对讯号量同步机制的理解。
(5)请依照自身情况,进一步阅读剖析相关系统调用的内核源码实现。设计内容(1)熟悉linux常用命令:pwd,useradd,passwd,who,ps,pstree,kill,top,ls,cd,mkdir,rmdir,cp,rm,mv,cat,more,grep等。(2)实现一个模拟的shell:编撰三个不同的程序cmd1.c,cmd2.c,cmd3.c,每位程序的功能自定,分别编译成可执行文件cmd1,cmd2,cmd3。之后再编撰一个程序,模拟shell程序的功能,能依据用户输入的字符串(表示相应的命令名),去为相应的命令创建子进程并让它去执行相应的程序,而父进程则等待子进程结束,之后再等待接收下一条命令。假如接收到的命令为exit,则父进程结束;假如接收到的命令是无效命令,则显示“Commandnotfound”,继续等待。(3)实现一个管线通讯程序:由父进程创建一个管线,之后再创建3个子进程,并由这三个子进程借助管线与父进程之间进行通讯:子进程发送信息,父进程等三个子进程全部发完消息后再接收信息。通讯的具体内容可依照自己的须要随便设计linux设置环境变量,要求能试验阻塞型读写过程中的各类情况,测试管线的默认大小,但是要求借助Posix讯号量机制实现进程间对管线的互斥访问。
运行程序,观察各类情况下,进程实际读写的字节数以及进程阻塞唤起的情况。(4)借助linux的消息队列通讯机制实现两个线程间的通讯:编撰程序创建两个线程:sender线程和receive线程,其中sender线程运行函数sender(),它创建一个消息队列linux 查看crontab属于哪个用户,之后linux 查看crontab属于哪个用户,循环等待用户通过终端输入一串字符,将这串字符通过消息队列发送给receiver线程,直至用户输入“exit”为止;最后,它向receiver线程发送消息“end”,但是等待receiver的应答,等到应答消息后,将接收到的应答信息显示在终端屏幕上,删掉相关消息队列,结束程序的运行。Receiver线程运行rece