声明:如需引用或者摘抄本博文源码或者其文章的,请在显著处注明,来源于本博文/作者,以示尊重劳动成果,助力开源精神。也欢迎大家一起探讨,交流,以共同进步~ 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. Building Microservices with Spring Boot and Apache Thrift. Part 2. Swifty services

    http://bsideup.blogspot.com/2015/04/spring-boot-thrift-part2.html     In previous article I showed y ...

  2. A1087. All Roads Lead to Rome

    Indeed there are many different tourist routes from our city to Rome. You are supposed to find your ...

  3. A1106. Lowest Price in Supply Chain

    A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...

  4. 【洛谷P2042】维护数列

    题目大意:维护一个序列,支持区间插入,区间删除,区间翻转,查询区间元素和,查询区间最大子段和操作. 题解:毒瘤题...QAQ打完这道题发现自己以前学了一个假的 Splay.. 对于区间操作,用 spl ...

  5. 斯坦福大学公开课机器学习: advice for applying machine learning | deciding what to try next(revisited)(针对高偏差、高方差问题的解决方法以及隐藏层数的选择)

    针对高偏差.高方差问题的解决方法: 1.解决高方差问题的方案:增大训练样本量.缩小特征量.增大lambda值 2.解决高偏差问题的方案:增大特征量.增加多项式特征(比如x1*x2,x1的平方等等).减 ...

  6. 极光推送java代码

    package com.zheng.cms.web.jpush.util; import cn.jpush.api.JPushClient; import cn.jpush.api.common.AP ...

  7. Centos 7最小化InfluxDB部署

    配置源 [influxdb] name = InfluxDB Repository - RHEL \$releasever baseurl = https://repos.influxdata.com ...

  8. 【.NET】VS 本地调试 无法加载Json文件

    1.如果要是发布到iis,还加载不出来,那就要配置一下MIME类型: 2.本地调试时,无法加载json文件: 解决方案: 在web.config中添加如下配置:mimeMap <system.w ...

  9. python dom操作

    1.DOM介绍 (1)什么是DOM DOM:文档对象模型.DOM 为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构.目的其实就是为了能让js操作html元素而制定的一个规范. DOM就是由节 ...

  10. Hadoop记录-yarn ResourceManager Active频繁易主问题排查(转载)

    一.故障现象 两个节点的ResourceManger频繁在active和standby角色中切换.不断有active易主的告警发出 许多任务的状态没能成功更新,导致一些任务状态卡在NEW_SAVING ...