Linux系统调用
写在前面
原理不再详述,仅叙述整个过程。
实验环境:
- VMware Workstation 16 Pro
- Ubuntu 20.04 LTS(内核 5.8.0)
- 源码版本 Linux5.10.2
系统调用添加过程参考自:
Linux实验 | Ubuntu20.04编译内核并添加一个系统调用
给linux系统增加一个系统调用并测试,超详细含错误锦集
VMware Workstation 16 Pro安装
去VMware官网下载想要的版本即可。部分过旧的版本可能无法下载,在网上找其他资源就好了。授权码可以百度。
建议安装到D/E/F…盘,总而言之不要什么都往C盘装。(来自一个整理软件和文件到崩溃索性备份重要资料直接重装的小白。)
Ubuntu 20.04 LTS 安装配置(创建虚拟机)
VMware Workstation
关于版本:这里我安装的是Ubuntu20.04LTS,所以选择Ubuntu64位,如果是其他iso文件,如openEuler等,就要选择其对应的版本,如“Linux5.x及其更高版本内核64位”等。
还是那句话,名字可以随便起,但是不要安装到C盘
处理器数量及单个处理器的内核数量没有什么特别的要求,但尽量不要设置为1个处理器1个内核数量,否则很难说后面的编译会不会出错以及耗费多长时间。
一种说法是虚拟机的内存不要超过4G,在这里设4G就完事了。
磁盘大小不要低于60G,Linux5.10.2的内核编译完要50+G,如果内存不够,扩存对于新手来说,又是个大问题。
因为我在D:/Ubuntu/vm中已经安装了虚拟机,截图时是新建了虚拟机,不能在安装在D:/Ubuntu/vm,所以我换了一个路径,导致文件名称可能不一致,下图中不需要改动,直接点下一步即可。
打开虚拟机,选择“编辑虚拟机设置”。选择下载的iso文件。
之后启动就可以进行Ubuntu20.04LTS的安装。
Ubuntu
一定要断网安装!!!,否则后面的麻烦事真的令人绝望。在这里记录一下我没有断网安装的情况下遇到的麻烦事吧:
背景:无线校园网(偶尔中的偶尔:几MB/S,偶尔:几百KB/S,经常:几十KB/S)+刚重装过电脑(内存充足)
因为我卸载重装了无数次,这是不同的安装过程中遇到的不同的问题:
1.安装一天没有安装完,下载各种文件真的超级无敌慢(这还是在Ctrl+C跳过了check,以及跳过了语言文件下载的情况下)
2.上面似乎还能接受,但是联网安装这个问题真的很难忍受:Ctrl+C跳过Check并且跳过后面的文件下载,进行到能看到Ubuntu的界面之后,一直显示网络激活失败,界面右上角的网络链接的图标也没有,百度各种教程,你就会发现自己陷入了一个怪圈:没网你需要apt-get install某个软件进行配置,然后因为你没网所以无法下载,因为无法下载所以连接不上网络…😄
所以,一定要断网安装,Ubuntu20.04安装完成之后是可以直接连WiFi的,不需要连网线进行设置。
而且,安装完成之后一定要先换源。推荐在界面上完成换源,不要在终端中,因为此时你应该还没有安装VMTools,从windows端到Linux端的复制粘贴不知道能不能用,而且如果物理机到虚拟机的切换非常卡的话整个过程会让你非常惶恐(不要尝试用国外的源下载包括VMTools在内的任何软件,卡到怀疑人生),此外,如果你对命令行操作还不是很熟悉的话,很煎熬,而且还不一定能换完源。
网上的教程大多数是从终端来换,个人觉得对小白极其不友好,所以推荐界面换源。Ubuntu换源快速解决方案
总结一下就是,先断网安装,之后连网,界面换源。
换完源之后就可以愉快的根据各种教程下载各种软件了。
添加系统功能调用
获取内核源代码
大概有以下这三种方式:
windows端浏览器下载
访问http://www.kernel.org/,选择合适的版本下载。此时,文件保存在Windows端,在Linux端是访问不到的。需要用远程连接来实现Windows和Linux间文件的上传和下载。我这里选用的是Xshell7来远程连接Ubuntu。
虚拟机:终端输入ip -a
查看虚拟机地址,ping物理机地址。
物理机:cmd命令输入ifconfig
查看物理机地址,ping虚拟机地址。
如果能ping通,用Xshell7远程连接;如果ping不通,先查找ping不通的原因。
这种方法是连接root用户,而非普通连接。
因为我连接好之后,无法再现当时配置的画面,所以援引这位博主的博文,配置过程中稍作更改就可以配置root用户。
通过Xshell远程连接虚拟机VMVARE中的Ubuntu
登录用户名这里填写root,之后出现的密码界面中密码不要含大写,即可连接root用户。
连接好之后使用rz命令即可将Windows端的文件上传至Linux端。注意!先在Xshell切换到想要上传的目录,再上传。以源代码为例,我希望将其上传到/usr/scr/目录中,需要在Xshell中先cd /usr/scr
,然后再rz
命令。
Linux端火狐浏览器下载
访问http://www.kernel.org/,选择合适的版本下载。在Ubuntu中可以找到下载的文件。
Linux终端下载
sudo apt-get install linux-source
,这种方式只能下载部分版本。目前好像只能下载5.4.x,本次编译使用的5.10.2无法通过这种方式下载。
源码解压缩
sudo su
tar -xavf linux-5.10.2.tar.xz -C /usr/src
编译环境
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install libc6-dev
sudo apt-get install libelf-dev
sudo apt-get install libncurses5-dev libssl-dev
sudo apt-get install build-essential openssl
sudo apt-get install libidn11-dev libidn11
sudo apt-get install zlibc minizip
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install pkg-config
自定义系统功能调用
进到内核源码解压后的位置,之后的操作都在这个位置下
cd /usr/src/linux-5.10.2
自定义系统调用号
sudo gedit arch/x86/entry/syscalls/syscall_64.tbl
注意:441、common、mysyscall、sys_mysyscall四者之间不要用空格隔开,用tab实现,否则编译报错。
添加函数声明
sudo gedit include/linux/syscalls.h
在末尾添加函数声明
/* My Own syscall */
asmlinkage long sys_mysyscall(int number);
#endif
添加函数定义
printk
前面大段的空白不要输空格,用tab实现。否则编译报错。
sudo gedit kernel/sys.c
在末尾添加函数定义
编译
净化内核
sudo make mrproper
删除之前的编译
sudo make clean
配置文件
sudo make menuconfig
编译内核
sudo make -j5
内核分配数量属于玄学。我分了5个核,编译了12+个小时,前面所提到的博主分了15个核,编译了十几分钟。还有分了4个核,编译了几个小时的情况。emmm,编译多长时间看缘分吧。
重置内核
sudo make modules_install
sudo make install
报错的话参考给linux系统增加一个系统调用并测试,超详细含错误锦集删掉注释的部分内容即可。
验证
查看内核版本
uname -r
编写C程序验证
sudo gedit test.c
编译并运行:
sudo gcc -o test test.c
sudo ./test
结果:
成功!