操作系统课设的题目,我的题目是“基于块的设备驱动”,帮室友也做了系统调用的课程设计。
网上关于系统调用的资料多数都是用Ubuntu系统实现的,但我用的是centos做的,Ubuntu的做法基本一样,不一样的地方我会指出,没指出的命令就是两个都通用的。
目录
3.增加系统调用函数(均在linux-4.20.2目录下、打开管理员权限进行)
提示一下,网上有很多教程在Ubuntu编译的过程中会使用命令make clean,然后经常会报错没有什么ko文件,这个问题困扰了我同学很久,网上找不到什么靠谱的解决方法,所以我的解决办法就是:不要用这个命令。
AND 编译之后重启的话 在开机的时候 一定要选择新编译好的内核进入,centos的开机的时候可以选择新内核;Ubuntu的话可以在开机的时候长按shift进入引导界面,高级选项,然后进入新内核!
一、实现功能
1.重新编译Linux系统
2.增加一个系统调用
3.写一个程序进行调用
二、前期准备
一共包括以下几个部分,在我的另一篇文章中有详细教程(5条消息) 基于块的Linux驱动程序 操作系统课程设计 块设备驱动 linux内核编译_m0_46362426的博客-CSDN博客
1.虚拟机安装
2.镜像文件配置
3.linux内核文件下载
三、增加系统调用&写一个程序进行系统调用
1.增加系统调用号
先使用cd命令进入到linux目录下,使用su打开管理员权限,随后使用gedit命令编辑syscall_64.tbl文件
cd /usr/src/kernels/linux-4.20.2
su
gedit arch/x86/entry/syscalls/syscall_64.tbl
我这里原来是到334,所以加了一个335系统调用号,之后是一个tab键,64,一个tab键,hello,三个tab键,sys_hello
(这里注意,我打的不是空格键,而是tab键;并且不要为了和前面的一样 而在sys_hello前面加上_x64)
335 64 hello sys_hello
然后保存并关闭文件。
2.增加系统调用函数声明
使用gedit命令编辑syscalls.h文件
gedit include/linux/syscall_64.tbl
拉到最下方,在endif上面加上一行:
asmlinkage long sys_hello(void);
然后保存并且关闭文件。
3.增加系统调用函数(均在linux-4.20.2目录下、打开管理员权限进行)
使用gedit命令编辑kernel/sys.c 文件
gedit kernel/sys.c
同样,拉到最下面,在endif上面添加系统调用函数
asmlinkage long sys_hello(void){
printk(""Hello world!");
return 20210726;
}
(这里是printk,而不是printf,printk是内核态命令,在系统日志里面输出的,可通过dmesg命令显示出来,而printf就是用户态命令,在终端输出)。
保存并关闭。
4.编译
如果以下操作出现什么跟flex或者bison相关的,就是你没下这两个东西
centos的下载命令:sudo yum y install flex和sudo yum y install bison
Ubuntu的下载命令就是把yum y换成apt-get就可以了
#以下操作都要在打开su管理员权限下进行
make menuconfig
make -j4
make modules_install
make install
编译完成后重启进入新内核。
编译之后重启的话 在开机的时候 一定要选择新编译好的内核进入,centos的开机的时候可以选择新内核;Ubuntu的话可以在开机的时候长按shift进入引导界面,高级选项,然后进入新内核。
centos的如图,选第一个:
Ubuntu的我找了一张图,大概是这样,选第二个:
5. 编译测试程序
我在主目录下写了这个测试程序,命名为test.c
#include<stdio.h>
#include<linux/kernel.h>
#include<sys/syscall.h>
#include<unistd.h>
int main()
{
long int a=syscall(335);
printf("Today is %ld\n",a);
return 0;
}
使用gcc命令进行测试,没有的话可以安装一下。
gcc test.c
./a.out
之后就大功告成啦!