声明:如需引用或者摘抄本博文源码或者其文章的,请在显著处注明,来源于本博文/作者,以示尊重劳动成果,助力开源精神。也欢迎大家一起探讨,交流,以共同进步~ 0.0

由于操作系统实验的缘故,有一个实验需要在Linux内核中增加自定义的系统调用函数,经过摸爬滚打,查资料,爬坑之后,终于成功了(其实,总体来说还是比较顺利~)

增加自定义系统调用函数的过程/原理:

  1.在syscalls.h头文件增加新增函数的声明;

  2.在syscalls.h头文件增加新增函数的函数实现代码块;

  3.在unistd_64.h(Ubuntu 3.2.x版本)或者syscall_64.tbl中新增(注册)系统调用号和新增函数名的声明;将内核源码编译完成,加入boot引导中;重启,在C测试函数中调用即可。

  备注:系统调用头文件:<linux/kernel.h>;<sys/syscall.h>;<unistd.h>

1.题目

  1.1 下载一个新的 Linux 内核,并在其中加入一个新的系统调用,系统调用实现的功能:计算一个数字的三次方。

  1.2 用编译内核的方法,将其加入内核源码并编译、使用新的内核。

  1.3 编写测试程序测试该系统调用。

2.实验说明

  环境:Ubuntu 16.04

  内核版本:4.4.4(由于编译4.4.0版本中途失败,所以最后切换为4.4.4版本,但编译失败前的步骤的截图均采用4.4.0的版本)

3.实验过程

  3.1 安装软体linux-source,下载linux内核源码

#方式一:自定义下载,各种版本任你挑~https://cdn.kernel.org/pub/linux/kernel/
# 1.1 手动下载下来
#1.2 wget下载辅助工具,下载下来后,压缩包将会在命令行所处的当前文件夹目录下
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/<linux kernel version.tar.xxxxxx> #方式二:安装linux-source软体包,下载下来后,内核压缩包将在/usr/src下
sudo apt-get install linux-source #用在线包管理器安装下载linux内核压缩包
#如果要查看/切换到压缩包所处目录:ls/cd /usr/src  

  3.2 切换到Linux内核文件夹主目录

cd /usr/src/linux-source-4.4.0  

  3.3 解压内核

  3.4 修改sys.c库文件,增加系统调用函数

  3.5 查看syscalls.h,并在系统调用头文件中新增调用函数声明

  

  3.6 在syscaal_b4.tbl文件中增加系统调用号

  

  3.7  配置编译,并开始编译(此步骤发生错误,故不提示命令行语句)

  

  3.8 经查阅,此错误的原因是:

    ubuntu下缺少了部分组件libssl-dev,安装一下即可

sudo apt-get install libssl-dev

  3.9 上述问题解决,切换到待编译的Linux内核的主目录下,开始配置编译

sudo make makeconfig #配置编译文件,无需做任何改动,exit即可
sudo make clean(清除刚配置过程中生成的文件)

  3.10 (再次)开始编译  

sudo make -j8(四核八线程,充分利用CPU,否则要编译三四个小时)
sudo make modules_install
sudo make install

  

  3.11 重启(重启后,进入GRUB选择界面,选择Ubuntu下边的高级选项,里面会显示已经编译好的内核版本,选择它启动即可),测试新增的系统调用

【test.c】gcc test.c -o test.out
#include<stdio.h>
#include<linux/kernel.h>
#include<sys/syscall.h>
#include<unistd.h> int main(){
//printf("pow3(3):%d", (int)pow3(3));//error
//printf("sys_ln1(3)%d:", (int)sys_ln1(3));//error
printf("syscall(326, 3):%d\n", (int)syscall(326, 3));
return 0;
}

  

  

Congratulations! 

参考文献:

  【Linux添加系统调用总结】(http://blog.csdn.net/sinat_28750977/article/details/50837996)



Linux之增加系统调用[内核编译]的更多相关文章

  1. Linux 2.6的内核编译过程

    由于上课需要,老师指定使用linux-2.6.26内核.本人是菜鸟级别的. 由于本人安装的ubuntu系统中,没有自带GCC,故需要自己安装gcc, 首先启用ROOT权限  输入:sudo -i 获取 ...

  2. Lab1:Linux内核编译及添加系统调用(详细版)

    实验一:Linux内核编译及添加系统调用(HDU) 花了一上午的时间来写这个,良心制作,发现自己刚学的时候没有找到很详细的,就是泛泛的说了下细节地方也没有,于是自己写了这个,有点长,如果你认真的看完了 ...

  3. linux内核增加系统调用--Beginner‘s guide

    Linux内核中设置了一组用于实现系统功能的子程序,称为系统调用.系统调用和普通库函数调用非常相似明知是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用户自己提供,运行于用户态. ...

  4. linux内核增加系统调用--Beginner's guide

    Linux内核中设置了一组用于实现系统功能的子程序,称为系统调用.系统调用和普通库函数调用非常相似明知是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用户自己提供,运行于用户态. ...

  5. 【原创】Linux 增加系统调用

    Linux 增加系统调用大致步骤: 1.下载好内核文件,在内核源文件中添加好自己的调用函数. 2.编译内核 3.验证. 一.在内核源文件中增加自己的函数   首先将内核文件移至/usr/src/下并解 ...

  6. linux 驱动模块 内核编译环境

    目录(?)[+] Linux设备驱动Hello World程序介绍 如何编写一个简单的linux内核模块和设备驱动程序.我将学习到如何在内核模式下以三种不同的方式来打印hello world,这三种方 ...

  7. Linux 增加系统调用 (转)

    Linux 增加系统调用大致步骤: 1.下载好内核文件,在内核源文件中添加好自己的调用函数. 2.编译内核 3.验证. 一.在内核源文件中增加自己的函数 首先将内核文件移至/usr/src/下并解压. ...

  8. [转载]Linux内核编译

    原文地址:https://blog.csdn.net/qq_34247099/article/details/50949720 写在前面的话: 本人大二,东南大学一个软工狗,正在修一门名为<操作 ...

  9. linux内核编译相关

    参考:http://www.arm.linux.org.uk/docs/kerncomp.php 一. 内核编译1) linux 2.4make clean/make mrpropermake dep ...

随机推荐

  1. Linux系统状态监控小工具 - Linux Dash

    Linux Dash是一个简单易用的Linux系统状态监控工具,项目地址:https://github.com/afaqurk/linux-dash 1.安装Apache服务: [root@local ...

  2. Dubbo x Cloud Native 服务架构长文总结(很全)

    Dubbo x Cloud Native 服务架构长文总结(很全) mercyblitz SpringForAll社区 3天前 分享简介 Cloud Native 应用架构随着云技术的发展受到业界特别 ...

  3. spring MVC 如何接收前台传入的JSON对象数组并处理

    spring MVC 如何接收前台传入的JSON对象数组 主要方法: (主要用到的包是 net.sf.json  即:json-lib-2.3-jdk15.jar 完整相关jar包: commons- ...

  4. 二叉查找树(BST)、平衡二叉树(AVL树)(只有插入说明)

    二叉查找树(BST).平衡二叉树(AVL树)(只有插入说明) 二叉查找树(BST) 特殊的二叉树,又称为排序二叉树.二叉搜索树.二叉排序树. 二叉查找树实际上是数据域有序的二叉树,即对树上的每个结点, ...

  5. php小项目踩坑以及其中的注意点(第二篇)

    用户登录页面 1.通过数据库验证用户名和密码(可以将里面要用到的数据库信息,放入到一个config文件中) <?php define('DB_HOST','localhost'); define ...

  6. Qt ------ 添加某个功能,比如(QSerialPort)注意事项

    添加某个功能,比如(QSerialPort),不仅需要保护头文件 还需要在.pro文件内添加 QT += serialport

  7. threading:线程创建、启动、睡眠、退出

    1.方法一:将要执行的函数作为参数传递给threading.Thread() import threading import time def func(n): global count time.s ...

  8. rownum查询前N条记录

    在Oracle中,要按特定条件查询前N条记录,用个rownum就搞定了.——select * from emp where rownum <= 5 而且书上也告诫,不能对rownum用" ...

  9. Elastic Stack之Redis集群使用

    Elastic Stack之Redis集群使用 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客数据流走向:FileBeat ===>Redis  ===>lo ...

  10. 如何用MTR诊断网络问题

    MTR 是一个强大的网络诊断工具,管理员能够用它诊断和隔离网络错误,并向上游提供商提供有关网络状态的有用报告.MTR 通过更大的采样来跟踪路由,就像 traceroute + ping 命令的组合.本 ...