内容

  1. 向Linux增加一个系统调用
  2. 撰写一个应用测试程序调用该系统调用
  3. 使用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.添加系统调用

先将目录切换到解压后的内核里操作

  1. 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内核添加一个系统调用的更多相关文章

  1. 给Linux内核增加一个系统调用的方法(转)

    作者:chenjieb520 给Linux内核增加一个系统调用的方法    为了更加好地调试linux内核,笔者的实验均在mini6410的arm板上运行的.这样做的原因,第一是因为本人是学嵌入式的, ...

  2. 向linux内核增加一个系统调用-2(利用proc打印信息)

    添加系统调用,打印/proc中的系统信息 前面关于proc和内核态函数的东西可以对比代码来看. 参考 http://blog.csdn.net/kylin_fire_zeng/article/deta ...

  3. 向linux内核增加一个系统调用-1

    验证编辑编译内核的流程,并增加新的系统调用 注意:需要/目录至少10GB空间,/boot目录500MB空间 下载内核并解压 kernel下载 百度云搬运 密码: qc8b 进入 /usr/src目录 ...

  4. xenomai内核解析--双核系统调用(三)--如何为xenomai添加一个系统调用

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有错误,欢迎指正. @ 目录 一.添加系统调用 二.Cobalt库添加接口 三.应用使用 一.添加系统调用 下面给xenomai添加一个系统调用g ...

  5. [保姆级教程] 如何在 Linux Kernel (V5.17.7) 中添加一个系统调用(System call)

    最近在学习 <linux Kernel Development>,本书用的linux kernel 是v2.6 版本的.看完"系统调用"一节后,想尝试添加一个系统调用, ...

  6. 实验 六:分析linux内核创建一个新进程的过程

    实验六:分析Linux内核创建一个新进程的过程 作者:王朝宪  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029 ...

  7. 作业六:分析Linux内核创建一个新进程的过程

    分析Linux内核创建一个新进程的过程 进程描述符PCB----task_struct数据结构 操作系统:1.进程管理 2.内存管理 3 文件系统 一.新进程如何创建和修改task_struct数据结 ...

  8. Linux内核分析-分析Linux内核创建一个新进程的过程

    作者:江军 ID:fuchen1994 实验题目:分析Linux内核创建一个新进程的过程 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/li ...

  9. linux内核分析作业6:分析Linux内核创建一个新进程的过程

    task_struct结构: struct task_struct {   volatile long state;进程状态  void *stack; 堆栈  pid_t pid; 进程标识符  u ...

随机推荐

  1. Flutter实战视频-移动电商-15.首页_商品推荐模块编写

    15.首页_商品推荐模块编写 商品推荐,我们做成可以横向滚动的 分析: 上面是标题,下面是ListView,里面是一个Column, column分三层,第一是图片,第二是价格,第三是市场价格 小细节 ...

  2. JSONObject put List<Double> 后转化为String问题的解决办法

    //原代码 JSONObject powerCurveJsonObj = new JSONObject(); powerCurveJsonObj.put("test",[0.5, ...

  3. vc编程中出现 fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”?

    解决办法菜单--〉项目--〉设置,出现“项目设置”对话框,左边展开项目,在“源文件”中找到出错的文件,然后在右边选择“C/C++”属性 页,在Category下拉框中选择“Precompiled He ...

  4. ajax 的三种使用方法

    第一种 也是最古老的一种方法之一 from 表单直接提交数据到php文件里 action为路径 <form method="post" action="./inde ...

  5. android摄像头获取图像——第三弹

    相机获取图像的格式问题 android中承认的格式的参考网址为 :http://developer.android.com/reference/android/graphics/ImageFormat ...

  6. unity3d项目文件目录发布后,对应的ios/android应用目录

    Unity3d的Resource.AssetBundle与手游动态更新的报告,在这里分享一下,希望能够对各位用Unity的朋友有些许帮助.目录:1.Unity的资源数据加载2.Resource.Str ...

  7. python3 requests模块 基本操作

    import requests import json # 1.HTTP方法 requests.get('https://github.com/timeline.json') #GET请求 reque ...

  8. [Xcode 实际操作]八、网络与多线程-(8)使用同步Get方式查询某地天气

    目录:[Swift]Xcode实际操作 本文将演示如果通过Get的方式,请求某地天气信息,同步获取网络数据, 一旦发送同步请求,程序将停止用户交互,直至服务器返回数据. 为了增强数据访问的安全性,从9 ...

  9. 使用命令动态更新JAR包中的文件

    动态更新JAR包中的文件,经本人实际测试可正常执行! 一.查询jar包中要替换的文件位置 jar  -tvf  gateway.jar  |  grep  topjui.config.js 二.在当前 ...

  10. DBUtils学习一 增删该查

    package com.mozq.jdbc.test; import java.sql.SQLException; import java.util.List; import java.util.Ma ...