操作系统项目:向Linux内核添加一个系统调用
内容:
- 向Linux增加一个系统调用
- 撰写一个应用测试程序调用该系统调用
- 使用ptrace或类似的工具对该测试程序进行跟踪调
环境:
1.vmware workstation 15.0.0
2.ubuntu-18.10-desktop
3.linux-4.18.14
步骤:
一.准备环境
在终端操作:
sudo apt-get update //更新系统源码
sudo apt-get install vim //安装vim
sudo apt-get install libncurses5-dev libssl-dev //下载依赖包
sudo apt-get install libelf-dev
sudo apt-get install build-essential openssl
sudo apt-get install zlibc minizip
sudo apt-get install libidn11-dev libidn11
sudo apt-get install flex bison
二.构建新内核
1.准备
在www.kernel.org下载linux-4.18.14.tar.gz
解压
将在官网下好的内核直接拉到ubuntn里,然后将压缩包用指令移到/usr/src目录下(过程需要root权限)。
sudo su //获取root
sudo mv 压缩包位置 /usr/src //移动文件
cd /usr/src //切换到该目录下进行操作
sudo tar -xvflinux-4.18.14.tar.gz //解压
2.添加系统调用
先将目录切换到解压后的内核里操作

- sudo vim kernel/sys.c //添加自己的函数
这里添加了sys_helloworld

2.sudo vim arch/x86/include/asm/syscalls.h //添加声明

3.sudo vimarch/x86/entry/syscalls/syscall_64.tbl //添加调用号

3.删除无用的文件
sudo make mrproper
sudo make clean
4.配置
sudo make menuconfig
此处直接save,exit即可,无需修改

5.编译新内核并安装
A.编译
sudo make -j2 //将处理机内核总数调整为4,会明显加快编译速度

(-j2为开启双线程编译)
B.安装
sudo make modules_install
sudo make install
6.重启
//reboot
三.测试
先使用vim写一个测试的cpp

之后gcc编译(前提是apt-get install build-essential安装gcc/g++/gdb/make 等基本编程工具。)
然后运行

demsg 查看进程信息

上图最后一行说明系统调用添加成功。
四.使用ptrace或类似的工具对测试程序进行跟踪调试:
1.先用strace,可以查看程序的系统调用。
A.

下图中read(0, 就是程序中a的输入,这里我输入19.
而syscall_0x150则是测试程序中的系统调用,0x150 16进制转化为10进制即为336,是我们刚刚添加的系统调用号。
write则为printf。

B.再用strace -c 可以查看测试程序的各类系统调用。如下图。

2.接下来用gdb调试。gdb在ptrace的基础上得来,功能强大且简便。
A.我们这里仅仅简单的调试。

输入l可以查看程序源码。

输入r可以运行程序。

输入b x,可以在x行前添加断点。

加断点后先r,再用c可以一步步执行,每次到断点停止。

clear可以清除断点
在return前插入断点,运行,输入bt可以查看堆栈调用。

3.Gdb和strace还有很多功能,对测试程序进行调试。在此不再演示。
题外话:
其实这就是操作系统第一次的大作业,实验报告我也差不多就这么写了。
假如有WHU的同学们参考了这篇文章。。不要copy啊 XD
教训:
1.在sudo vim arch/x86/include/asm/syscalls.h //声明 的时候world打成了wrold。。(哭泣)浪费了2个小时
2.网上多数教程是syscallID = ptrace(PTRACE_PEEKUSER, pid, ORIG_EAX*4, NULL);但是这是32位机的情况,若是64位,则改成syscallID = ptrace(PTRACE_PEEKUSER, pid, ORIG_RAX*8, NULL); (打开reg.h看一看)
操作系统项目:向Linux内核添加一个系统调用的更多相关文章
- 给Linux内核增加一个系统调用的方法(转)
作者:chenjieb520 给Linux内核增加一个系统调用的方法 为了更加好地调试linux内核,笔者的实验均在mini6410的arm板上运行的.这样做的原因,第一是因为本人是学嵌入式的, ...
- 向linux内核增加一个系统调用-2(利用proc打印信息)
添加系统调用,打印/proc中的系统信息 前面关于proc和内核态函数的东西可以对比代码来看. 参考 http://blog.csdn.net/kylin_fire_zeng/article/deta ...
- 向linux内核增加一个系统调用-1
验证编辑编译内核的流程,并增加新的系统调用 注意:需要/目录至少10GB空间,/boot目录500MB空间 下载内核并解压 kernel下载 百度云搬运 密码: qc8b 进入 /usr/src目录 ...
- xenomai内核解析--双核系统调用(三)--如何为xenomai添加一个系统调用
版权声明:本文为本文为博主原创文章,转载请注明出处.如有错误,欢迎指正. @ 目录 一.添加系统调用 二.Cobalt库添加接口 三.应用使用 一.添加系统调用 下面给xenomai添加一个系统调用g ...
- [保姆级教程] 如何在 Linux Kernel (V5.17.7) 中添加一个系统调用(System call)
最近在学习 <linux Kernel Development>,本书用的linux kernel 是v2.6 版本的.看完"系统调用"一节后,想尝试添加一个系统调用, ...
- 实验 六:分析linux内核创建一个新进程的过程
实验六:分析Linux内核创建一个新进程的过程 作者:王朝宪 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029 ...
- 作业六:分析Linux内核创建一个新进程的过程
分析Linux内核创建一个新进程的过程 进程描述符PCB----task_struct数据结构 操作系统:1.进程管理 2.内存管理 3 文件系统 一.新进程如何创建和修改task_struct数据结 ...
- Linux内核分析-分析Linux内核创建一个新进程的过程
作者:江军 ID:fuchen1994 实验题目:分析Linux内核创建一个新进程的过程 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/li ...
- linux内核分析作业6:分析Linux内核创建一个新进程的过程
task_struct结构: struct task_struct { volatile long state;进程状态 void *stack; 堆栈 pid_t pid; 进程标识符 u ...
随机推荐
- PhpStorm下载、破解
下载 去官网下载新版phpstorm 破解 1.打开编辑器, Help->Register->License server,输入http://idea.codebeta.cn (支持10. ...
- Linux系统查看网站访问日志
日志地址 /www/wwwlogs/网站名称-access_log 下载到本地,改成txt文件 打开WPS,创建表格,导入数据,选择文件,然后点击下一步,直到选择文件类型时,选择分隔符号,下一步,把勾 ...
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:4.1 上报位置信息
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
- Shiro 权限管理框架
一.什么是Shiro Apache Shiro是一个强大易用的java安全框架,提供认证.授权.加密和会话管理等功能 · 认证:用户身份识别,俗称“登录”: · 授权:访问控制 · 密码加密:保护或隐 ...
- 自然语言处理(三)——PTB数据的batching方法
参考书 <TensorFlow:实战Google深度学习框架>(第2版) 从文本文件中读取数据,并按照下面介绍的方案将数据整理成batch. 方法是:先将整个文档切分成若干连续段落,再让b ...
- ZooKeeper-3.3.4集群安装配置(转载)
ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization).命名服务(Naming S ...
- Java 执行linux命令(转)
转自 http://blog.csdn.net/a19881029/article/details/8063758 java程序中要执行linux命令主要依赖2个类:Process和Runtime 首 ...
- [NOIP2014]无线网站发射器选址
Description 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网.假设该城市的布局为由严格平行的129条东西向街道和129条南北向街道所形成的网格状, ...
- centos6.7版本下配置ssh密钥登录
需要提前说明的是我使用的系统是centos6.7的版本. 1.我使用的是Putty登录 #ssh-keygen (生成公钥和私钥的命令) 回车之后会提示密钥要存放的目录,默认的目录是当前目录下的.ss ...
- 关于@Mapper和@Repository的一点小理解
参考博客:https://blog.csdn.net/lalioCAT/article/details/51803461 如果在接口上@Mapper,然后再在 xml中的namespace指向mapp ...