操作系统:在linux系统下增加一个自定义的系统调用

1 篇文章 0 订阅
1 篇文章 0 订阅

一、导言

前几天操作系统课程布置了一个给linux添加系统调用的作业。
在这里插入图片描述
对于我一个刚安装完双系统的小白来说那可真是一头雾水,在老师的逼迫和鼓励下,查找了各种各样的资料,学习了许许多多的博客,经历了种种错误和绝望之后,终于完成了!

本文章通过三个部分来分享:
1.环境和准备
2.详细步骤及常见错误
3.心得

二、增加系统调用

(1)环境和准备

1.环境

VMware Workstation14虚拟机下 Ubuntu (版本18.04.2)(当然也可以使用双系统)
内核版本 4.18.0-15

2.准备

下载一个新的内核,百度各大网站,CSDN等都可以下载;
这里使用的是linux-4.16.8.tar.xz

注意:请保证你的linux有足够的存储空间!
我在编译内核前剩余70G,全部完成后剩余47.5G,下面是内核文件夹大小作为参考。
在这里插入图片描述
所以请分配足够的空间
惨痛的教训,我在双系统编译内核快要完成时显示内存不足,导致我又在虚拟机上重新做了一遍,费时费力。
下面我们正式开始我们的步骤。

(2)详细步骤和常见错误

第一步:获取root权限并下载完成相应的配置

首先要熟悉终端的操作,终端(那个黑色的可以输入各种命令的黑框框),可以按ctrl+alt+T打开,也可以右键桌面打开,后续工作大部分都要在这里面完成。

1.获取root权限,即获取管理员权限

没有管理员权限无法完成移动文件等诸多操作。
打开终端后输入sudo su,然后输入用户密码,即可获得权限。
在这里插入图片描述

2.下载完成相应配置

linux中大多采用sudo apt-get install+文件名的命令下载各种需要的编译文件,库文件

在这里插入图片描述
按图中例子依次下载linux-source build-essential kernel-package libncurses5-dev等,如果后面有缺可以补充下载。

第二步:移动内核并解压

1.移动内核到/usr/src/文件夹里

因为没有管理员权限不能直接移动所以要在终端里用指令移动;
用mv语句:sudo mv /home/himawari/下载/linux-4.16.8.tar.xz /usr/src/
前面为移动的内核文件路径,后面为要移动到的路径。

注意:注意千万语句中的空格,否则会出现错误

如果mv语句曾经像我一样实在输不对,可以采用sudo nautilus命令,打开一个具有权限的资源管理器,找到内核文件,就可以拷贝到/usr/src/里了。

小tips:在终端里用方向键上下键可以选择历史命令,这样可以快捷输入之前输入的命令,效率提高了很多。

2.解压内核文件

先用cd语句移动到/usr/src目录:cd /usr/src
cd+路径即移动到指定目录下。

在这里插入图片描述
对于我的内核的xz后缀使用命令tar -Jxvf linux-4.16.8.tar.xz解压
对于其他格式请参考https://www.cnblogs.com/midiyu/p/7875462.html选择使用命令
解压成功后进入下一步

第三步:编写加入新的系统函数

1.进入解压后的文件夹并安装vim编辑器
cd /usr/src/linux-4.16.8/kernel

下载安装vim编辑器

sudo apt-get install vim

完成后即可打开各种文件并进行编辑。

2.编写加入新函数

在之前进入的/usr/src/linux-4.16.8//kernel路径下输入命令

vim sys.c

注意:vim编辑器常用的几个操作:
i 进入编辑模式
esc 退出编辑
:wq 保存退出
:q 不保存退出

我们在编辑器末尾添加函数
在这里插入图片描述

asmlinkage long hellohelloworld(void){
           printk("Honma Himawari");
           return 2434;
}

保存并退出

第四步:添加声明

进入cd /usr/src/linux-4.16.8/arch/x86/include/asm/
输入vim syscalls.h
在文件中插入asmlinkage long hellohelloworld(void);
在这里插入图片描述
保存并退出

第五步:添加系统调用id

进入cd /usr/src/linux-4.16.8/arch/x86/entry/syscalls
输入vim syscall_64.tbl
在编辑器中添加333 64 helloworld hellohelloworld
在这里插入图片描述

保存并退出

第六步:配置内核

一、编译内核
1.进入路径
cd  /usr/src/linux-4.16.8
2.下载安装可能需要用到的文件
sudo apt-get install libncurses5-dev libssl-dev 
sudo apt-get install build-essential openssl
sudo apt-get install zlibc minizip 
sudo apt-get install libidn11-dev libidn11
3.执行命令

清除无用文件

sudo make mrproper
sudo make clean

配置内核

sudo make menuconfig

注意:这里可能会碰到错误
在这里插入图片描述
解决办法

sudo apt-get install bison

在这里插入图片描述

解决办法

sudo apt-get install flex

总结:过程中可能会碰到缺少库的错误,缺什么下什么就好了

4.采用默认设置

成功进入菜单
在这里插入图片描述
在这个菜单中采用默认设置,Save->OK->然后Exit

5.开始编译内核

使用命令sudo make -j4 -jN为告诉处理器同时运行N个编译程序。
我的4核心cpu可以采用-j4,理论上数字不能超过处理器核心的两倍。
因为编译时间漫长,这会大大影响编译速度。
开始漫长编译
在这里插入图片描述

过程中有些地方卡了很久也是正常现象…只要没死机~

如果内存不够就会出现我之前的情况:设备上没有空间(都是泪啊!)

在这里插入图片描述
看别人好像一般都编译了2~3小时,但我只用了50分钟…根据个人而定把

二、安装内核
1.输入命令

输入

sudo make modules_install 
sudo make install

这样就接近成功啦!

第七步:调试

一、配置grub引导

输入命令sudo update-grub2
作用是启动时,引导程序在对计算机系统初始化后,把操作系统的核心部分程序装入存储
让我们可以在引导界面用grub切换内核

二、重启ubuntu
1.Ubuntu图标在正中央,小圆圈滚动加载时,长按住shift,重启后就会出现grub界面

选择Ubuntu高级选项
在这里插入图片描述

选择新的内核启动
在这里插入图片描述

注意:这里也可能出现错误
错误:

在这里插入图片描述
然后无法启动,当时我都以为要前功尽弃了,但根据那个Out of memory找到了解决办法。
解决办法:在VMware中将虚拟机内存从2G改到4G,就可以成功进入了
在这里插入图片描述

三、测试
1.检验内核版本

在终端中输入命令cat /proc/version
看到内核版本已经变为4.16.8
在这里插入图片描述

2.编写程序

进入cd /home/himawari/桌面
在桌面创建c文件touch 12.c
编辑c文件vim 12.c
输入代码

#include<stdio.h>
#include<sys/syscall.h>
#include<linux/kernel.h>
#include<unistd.h>

int main()
{
     long int a=syscall(333);
     printf("hellohelloworld  return  %ld\n",a);
     return 0;
}

在这里插入图片描述
保存并退出

3.编译程序

接下来是激动人心的时刻,用gcc编译编辑的c文件

用命令gcc 12.c
输出a./a.out

在这里插入图片描述

当你发现函数返回的不是-1而是你规定的数字时,证明你的系统调用就成功啦!!!!
是2434!
是彩虹社!(x

三、心得

这两天的摸索和努力,中间虽然经历了种种的困难和绝望(mv命令不断错误,解压时命令出错,编译内核时内存不够,最终更换内核后无法启动……)
但成功后真的是发自内心的喜悦。
发现自己从一个不知道系统调用,甚至不知道终端,害怕自己用不好那些专业的linux内部命令的小白,到熟练地运用各种命令进行下载、进入目录、移动文件,创建文本等操作,大大加深了自己对于linux系统的理解。


所谓前人栽树,在此特别感谢前届学长的博客以及他本人的大力鼓励和支持!
https://blog.csdn.net/qq_41175905/article/details/80529245
读者也可以作为参考,我也在其基础上进行了很多的改善和补充。


这也是我第一次写博客,如果有排版问题,或是文章阅读上的困难敬请谅解。
本文旨在帮助像我一样的linux小白在遇到相同问题时能找到解决办法,如果有没看懂的地方或是遇到了问题,或是一些我没说明的地方有大神能给出建议,以及有对此博客的建议,都欢迎在下方留言


同样,如果还有不明白的问题或是有想交流讨论的问题欢迎加好友讨论。
联系方式:QQ41096378(备注CSDN)

  • 21
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值