系统调用 操作系统课程设计 Linux内核编译 centos Ubuntu

操作系统课设的题目,我的题目是“基于块的设备驱动”,帮室友也做了系统调用的课程设计。

网上关于系统调用的资料多数都是用Ubuntu系统实现的,但我用的是centos做的,Ubuntu的做法基本一样,不一样的地方我会指出,没指出的命令就是两个都通用的。

目录

一、实现功能

1.重新编译Linux系统

2.增加一个系统调用

3.写一个程序进行调用

二、前期准备

1.虚拟机安装

2.镜像文件配置

3.linux内核文件下载

三、增加系统调用&写一个程序进行系统调用

1.增加系统调用号

2.增加系统调用函数声明

3.增加系统调用函数(均在linux-4.20.2目录下、打开管理员权限进行)

4.编译

5. 编译测试程序


提示一下,网上有很多教程在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

 之后就大功告成啦!

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习的小颜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值