华中科技大学操作系统实验课 实验一
添加函数调用添加系统调用函数声明
文章目录
前言
写这篇博客旨在帮助同学尽快完成作业,不要饱受学校无聊的作业折磨。
任务1:用NASM编写MBR引导程序,在BOCHS虚拟机中测试
选做==不做
任务2:在Linux(建议Ubuntu或银河麒麟或优麒麟)下裁剪和编译Linux内核,并启用 新内核。(其他发行版本也可以)
虚拟机秘勺:ZF3R0-FHED2-M80TY-8QYGC-NPKYF
任务3:为Linux内核(建议Ubuntu或银河麒麟或优麒麟)增加2个系统调用,并启用新的内核,并编写应用程序测试。(其他发行版本也可以)
- 提示1:系统调用的功能:int Add(int , int ) ; int Max(int , int, int ) ;
- 提示2:内核编译和重启参考任务2.
- 提示3:如果采用新建c源文件并修改makefile方式修改源代码,则参考
- 提示4,5,6。如果直接修改已有内核源文件,则忽略提示4,5,6。
- 提示4:主目录下建NewCall目录并在其中新建MyNewcall.c文件和相应
的makefile文件。c文件含有系统调用的实现函数。makefile文件内容:
obj-y := MyNewcall.o
- 提示5:将NewCall目录添加到主makefile中的特定位置:
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ NewCall/ - 提示6:在syscall_64.tbl和syscalls.h中分别定义编号和声明函数。
- 提示4:主目录下建NewCall目录并在其中新建MyNewcall.c文件和相应
- 提示7:在应用程序中使用下面方式调用:
int nRet = syscall(548, 20,18); // nRet = 38
int nRet = syscall(549, 20,18, 4); // nRet = 20
以任务2安装的版本VM16+Ubuntu-16.04.7-desktop-amd64+linux 5.16.14为基础进行下面操作。
借鉴自linux内核添加系统调用(详细),但内容并不完全相同,可能是版本不同的问题。
1、添加系统调用ID
打开Computer/usr/src/linux-5.16.14/arch/x86/entry/syscalls
文件目录
双击syscall_64.tbl
在334后面添加系统调用号335和336.
2、添加系统调用函数声明
打开Computer/usr/src/linux-5.16.14/arch/x86/include/asm
目录
打开文件syscalls.h
,输入如下两个函数声明
3、在内核源代码添加函数定义
打开Computer/use/src/linux-5.16.14/kernel
目录,打开sys.c
(可搜索找到)
可在一堆include
和define
下添加代码
添加如下代码
4、编译内核
在Computer/use/src/linux-5.16.14
目录下运行终端,输入make menuconfig
点击save
点击ok
Exit
继续Exit
这块我的CONFIG_SYSTEM_TRUSTED_KEYS=""
不需要修改,故可以跳过,如果和我版本一致。
之后还要修改一些东西,不然编译途中会出错。
vim ./.config。
令CONFIG_SYSTEM_TRUSTED_KEYS=“”。(使用shift+“:”,输入?CONFIG_SYSTEM_TRUSTED_KEYS回车后查询)
编译
sudo make -j4
(因为我是双核)
安装模块
sudo make modules_install
sudo make install
5、调用已添加的系统调用
在桌面新建文件test.c
输入测试代码
#include<stdio.h>
#include<unistd.h>
#include<sys/syscall.h>
int main(){
long a=syscall(335,1,3);
printf("%ld\n",a);
long b=syscall(336,14,15,16);
printf("%ld\n",b);
return 0;
}
在桌面文件打开终端
输入gcc ./test.c -o test
编译
输入./test
运行
查看输出
与预期相同。任务完成!
任务4:在Linux (建议Ubuntu或银河麒麟或优麒麟) 或Windows下,编写脚本或批处理。在指定目录中的全部txt文件末尾追加或更新:用户名:日期和时间。root:2022-04-26 21:00
- 提示1:目录通过命令行的参数来指定,不要在脚本中写死
- 提示2:注意检查文件的后缀是否txt
- 提示3:日期和时间的写入格式可以自己确定【例如特殊字符标识】。
- 提示4:已写有日期和时间的文件只能更新日期和时间,不能追加。
1、编写批处理文件
在桌面新建bash.sh文件,写入
#!/bin/bash
filenames=$(ls "$1"*.txt)
echo "$1"
echo $filenames
for file in $filenames
do
regular=$(tail -n 1 $file)
if [[ "$regular" =~ [0-9]{4}-[0-9]{2}-[0-9]{2}* ]];then
sed -i '$d' $file
echo $USER:`date +"%Y-%m-%d %H:%M:%S"` >> $file
else
echo $USER:`date +"%Y-%m-%d %H:%M:%S"` >> $file
fi
done
2、添加管理员权限
sudo chmod -R 777 ./
否则会报错,Permission Denied。
3、添加测试文件
在桌面(与bash.sh
同目录)下添加a.txt
,b.txt
在此环境下打开终端,输入./bash.sh ./
输出如下
打开a.txt
或b.txt
后出现用户名:年份 时间
更多推荐
所有评论(0)