# 操作系统课程设计🔧
## 一.目的
- 掌握Linux操作系统的使用方法
- 了解Linux系统内核代码结构
- 掌握实例操作系统的实现方法
## 二.设计内容
1. Linux用户界面的使用
> * 编一个C程序,其内容为实现文件拷贝的功能.
>
> - [x] 基本要求:使用系统调用*open/read/write...*; 选择:容错、*cp*。
>
> * 编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。要求用到Linux下的图形库。 (gtk/Qt)
>
> - [x] 基本要求:三个独立子进程各自窗口显示;选择:三个进程誊抄演示。
2. 掌握系统调用的实现过程,通过编译内核方法,增加一个新的系统调用。另编写一个应用程序,使用新增加的系统调用。
> * 内核编译、生成,用新内核启动;
> * 新增系统调用实现:文件拷贝或P、V操作。
3. 掌握增加设备驱动程序的方法。通过模块方法,增加一个新的字符设备驱动程序,其功能可以简单,基于内核缓冲区。
> - [x] 基本要求:演示实现字符设备读、写;
> - [x] 选择:键盘缓冲区,不同进程、追加、读取。
4. 使用GTK/QT实现系统监控器
> * 了解/proc文件的特点和使用方法
> * 监控系统中进程运行情况
> * 用图形界面实现系统资源的监控
5. 设计并实现一个模拟的文件系统
> * 基于一大文件(10M或100M),模拟磁盘;
> * 格式化,建立文件系统管理数据结构;
> * 基本操作,实现文件、目录相关操作。
## 三.实验环境
- Windows10 +虚拟机Ubuntu19.10 (60G)+内核Linux 5.4.21
## 四.实验步骤
### 4.1 Linux用户界面的使用
**1.配置虚拟机**
[Vmware安装虚拟机Ubuntu知乎教程链接🔗](https://zhuanlan.zhihu.com/p/38797088)
[VMware虚拟机扩展Ubuntu系统磁盘空间教程🔗](https://blog.csdn.net/daemon_2017/article/details/80660372)
其他具体教程就按照个人需求Google就好咯.
**2.(task1)编写Get_Copy_Get文件誊抄程序**
这是一个样例,不涉及并发.
```C++
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#define BUFFER_SIZE 1024
int main(int argc,char **argv) {
//缓冲区大小
int from_fd,to_fd;
int bytes_read,bytes_write;
char buffer[BUFFER_SIZE];
char *ptr;
if(argc!=3) //三个参数
{
fprintf(stderr,"Usage:%s fromfile tofile\n\a",argv[0]);
return(-1);
}
/* 打开源文件 */
if((from_fd=open(argv[1],O_RDONLY))==-1)
{
fprintf(stderr,"Open %s Error:%s\n",argv[1],strerror(errno));
return(-1);
}
/* 创建目的文件 */
if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1) {
fprintf(stderr,"Open %s Error:%s\n",argv[2],strerror(errno));
//设定一个缓冲区
return(-1);
}
/* 以下代码是一个经典的拷贝文件的代码 */
while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)) {
/* 一个致命的错误发生了 */
if((bytes_read==-1)&&(errno!=EINTR)) break;
else if(bytes_read>0)
{
ptr=buffer;
while(bytes_write=write(to_fd,ptr,bytes_read))
{
/* 一个致命错误发生了 */
if((bytes_write==-1)&&(errno!=EINTR))break;
/* 写完了所有读的字节 */
else if(bytes_write==bytes_read) break;
/* 只写了一部分,继续写 */
else if(bytes_write>0)
{
ptr+=bytes_write;
bytes_read-=bytes_write;
}
}
/* 写的时候发生的致命错误 */ if(bytes_write==-1)break;
}
}
close(from_fd);
close(to_fd);
return(1);
}
```
**3.(task2)编一个C程序,其内容为分窗口同时显示三个并发进程的运行结果。要求用到Linux下的图形库。 (gtk/Qt) **
因为GTK之前没有接触过,而且有一点点古老,所以我选择了Qt5.
我一共做了四个并发进程,通过fork()来实现.分别监视系统世界、CPU使用率、内存使用率、磁盘使用率.
![F803A68E974232A903522C7D7E91BA06](http://alexfanblog.oss-cn-beijing.aliyuncs.com/2020/02/29/f803a68e974232a903522c7d7e91ba06.jpg?image/auto-orient,1/interlace,1/quality,q_100)
(源码放在了Github仓库里面,欢迎大家一起学习交流)
### 4.2新增系统调用实现
**以下内容基于Ubuntu19.10 + 内核Linux5.4.21,如果是4.x.x版本的内核,参考以下下文链接**
👉[基于Linux4代内核的新增系统调用步骤](https://blog.csdn.net/qq_41175905/article/details/80529245)
**1.配置虚拟机**
[Vmware安装虚拟机Ubuntu知乎教程链接🔗](https://zhuanlan.zhihu.com/p/38797088)
[VMware虚拟机扩展Ubuntu系统磁盘空间教程🔗](https://blog.csdn.net/daemon_2017/article/details/80660372)
**2.更换Ubuntu源为清华源**
[更换镜像源链接🔗](https://blog.csdn.net/yumei1998/article/details/83214433)
注意你的Ubuntu版本,选择适配的镜像源,可加快安装包的速度.
**3.一键配置所有所需要的包**
换好镜像源后直接在命令行里配置就行了.
```
apt-get install libncurses-dev flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf
```
后续如果缺其他包就安装系统提示下载就好了
**4.内核下载**
别去www.kernel.org下了,速度实在不忍直视
直接通过下述链接下载配置.
[kernel镜像源链接🔗](http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/)
选择合适的版本挑一个下载即可.
**5.安装内核**
- ctrl+alt+t快速打开CMD,并且输入sudo su获得管理员权限.
- 将下载好的内核move到/usr/src目录下,使用命令
```
sudo mv **/**/**/linux*** /usr/src/
//**代表你刚下载的linux内核的路径
```
- 进入/usr/src/ 解压文件
```
sudo tar -xvf linux****
//linux***代表你刚下载的linux内核的文件名,可以用tab自动补齐.
```
- 进入解压出来的内核文件中的kernel目录
```
cd linux***/kernel
```
- 修改sys.c文件
```
sudo gedit sys.c
//在最末尾加上你想加的新的系统调用
//举个例子,helloworld程序
SYSCALL_DEFINE1(helloworld,int,number){
printk("Hello,world!");
return number+1
}
//对系统调用的编写 注意此处与前版本内核的不同
//上述程序中,1代表这个函数只有一个参数,有两个参数就换成2
//helloworld是新增系统调用函数名
//int是参数类型,number是形参.
//函数功能就是打印Hello,world!,并且返回1+number.可以通过dmesg看到打印的句子.
```
- 增加系统调用号
```
//从kernel返回上一级目录
cd /arch/x86/entry/syscalls
sudo gedit syscall_64.tbl
//增加一个新的系统调用
//例如 335 64 helloworld __x64_sys_helloworld
```
- 增加系统调用头文件
```
//返回/usr/src/linux***目录
cd include/linux
sudo gedit syscalls.h
//例如asmlinkage long sys_helloworld(int number);
```
- 最后按照上述步骤编写你的文件copy和P、V操作系统调用程序吧
**6.编译内核**
```
sudo make mrproper //删除之前编译的残余文件.只在第一次编译时执行即可,以免每次编译把重复文件重复编译.
sudo make clean //可执行可不执行,因为上一个命令似乎是涵盖了clean的
sudo make menuconfig//在general setup哪里给你的内核换个名字,比如AlexKernel
sudo make -j4 //根据你给虚拟机分配的核心数来适配.我分了4核心.
sudo make modules_install // 安装内核模块
sudo make install //安装内核
```
**7.更换系统默认启动内核**
[更换启动内核链接🔗](https://blog.csdn.net/cf_wu95/article/details/85984956)
**8.重启,编写你的测试c文件.**
(PS:不嫌麻烦的可以直接看官方文档。[新增系统调用官方文档🔗](https://www.kernel.org/doc/html/latest/process/adding-syscalls.html))
### 4.3增加设备驱动程序
[设备驱�
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
华中科技大学-操作系统课程设计-内含源码和说明书.zip (131个子文件)
4 1.06MB
objects.a 163KB
CMakeDetermineCompilerABI_CXX.bin 48KB
CMakeDetermineCompilerABI_C.bin 47KB
CMakeCCompilerId.c 20KB
main.c 2KB
alex_drive.c 1KB
copy.c 955B
get.c 880B
write.c 849B
alex_drive.mod.c 587B
alex_test.c 425B
helloworld.c 242B
mcf.c 224B
af_FileSystem.cbp 8KB
cmake.check_cache 86B
CMakeCXXCompiler.cmake 6KB
Makefile.cmake 3KB
CMakeCCompiler.cmake 3KB
cmake_install.cmake 1KB
DependInfo.cmake 952B
CMakeDirectoryInformation.cmake 677B
cmake_clean.cmake 456B
CMakeSystem.cmake 395B
CMakeRCCompiler.cmake 300B
Copy 17KB
CMakeCXXCompilerId.cpp 20KB
func_filesystem.cpp 12KB
mainwindow.cpp 9KB
ui_filesystem.cpp 7KB
moc_mainwindow.cpp 4KB
moc_mainwindow.cpp 3KB
moc_res_disk.cpp 3KB
moc_res_pro.cpp 3KB
moc_res_mem.cpp 3KB
res_disk.cpp 1KB
res_pro.cpp 1KB
res_mem.cpp 1KB
main.cpp 962B
mainwindow.cpp 625B
main.cpp 172B
main.cpp 70B
.alex_drive.o.d 13KB
操作系统课程设计报告.doc 2.93MB
af_FileSystem.exe 272KB
a.exe 48KB
a.exe 47KB
Get 17KB
moc_predefs.h 14KB
moc_predefs.h 13KB
ui_mainwindow.h 9KB
ui_res_disk.h 3KB
ui_res_mem.h 3KB
ui_mainwindow.h 3KB
ui_res_pro.h 3KB
func_filesystem.h 2KB
main.h 905B
mainwindow.h 808B
res_disk.h 516B
res_pro.h 481B
res_mem.h 437B
mainwindow.h 400B
ui_filesystem.h 342B
af_FileSystem.iml 98B
CXX.includecache 441B
user.ini 40B
depend.internal 620B
alex_drive.ko 302KB
CMakeOutput.log 77KB
main 17KB
main 17KB
main 0B
build.make 8KB
depend.make 603B
flags.make 281B
progress.make 90B
Makefile 27KB
Makefile 22KB
Makefile 7KB
Makefile2 4KB
progress.marks 3B
README.md 15KB
res.mem 51B
alex_drive.mod 27B
mainwindow.o 1.02MB
main.o 895KB
main.o 887KB
res_disk.o 787KB
res_mem.o 786KB
res_pro.o 785KB
mainwindow.o 773KB
moc_mainwindow.o 566KB
moc_res_disk.o 543KB
moc_res_pro.o 543KB
moc_res_mem.o 543KB
moc_mainwindow.o 542KB
alex_drive.o 194KB
alex_drive.mod.o 109KB
ui_filesystem.cpp.obj 86KB
func_filesystem.cpp.obj 75KB
共 131 条
- 1
- 2
资源评论
小码蚁.
- 粉丝: 2670
- 资源: 4523
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功