添加系统调用--内核编译法(centos7 下4.15.10内核)

添加系统调用–内核编译法(centos7 下4.15.10内核)

1、【实验目的】

阅读Linux内核源代码,通过添加一个简单的系统调用实验,进一步理解Linux操作系统处理系统调用的统一流程。

2、【实验原理】

Linux操作系统处理系统调用的统一流程。

3、【实验环境】

PC机1台,Windows操作系统和其上的虚拟Linux操作系统。

4、【实验方法与步骤】| 请先看完6避坑

【注:因为在实验过程中,有些部分未能截下步骤的图像,将以文本的形式呈现。】

到官网或者相关下载点下载内核源代码linux-4.15.10.tar.gz,

把源码移动到/usr/src/目录下,然后解压,目录linux-4.15.10里的内容就是版本4.15.10的内核源码树。

img

img

一、添加新函数

在/usr/src/linux-4.15.10/kernel/sys.c中,添加一个系统调用函数到内核,命名和功能如下:

compat_sys_mysyscall()。在现有的系统中添加一个不用传递参数的系统调用,调用这个系统调用,使用户的uid变成0。

img

asmlinkage 说明参数传递不是靠寄存器,而是靠栈来传递。

img

这里之后编译的时候报错了,原因是没有task_struct没有uid这个变量(版本原因),故这里修改为如下功能:输出信息。

img

二、更新头文件

在/usr/src/linux-4.15.10/include/linux/syscalls.h中,添加系统调用号.如下图所示:

img

三、更新系统调用表

• 在/usr/src/linux4.15.10/arch/x86/entry/syscalls/syscall_64.tbl中,添加一个系统调用表项,如下图所示:

img

这里的abi有三种可以填(common、64、x32) ,经过测试发现x32没有效果,故修改成common。

img

四、重新编译内核

img

img

这之后新内核已经‘安装’在了系统中, 只需输入reboot,重启一下系统,用新内核引导。

img

5、【实验记录及数据处理】

测试验证

① 编辑源代码test.c如下:

img

② 运行结果如下

img

6、【实验总结与问题讨论】

1)做完本实验后的收获?

\1. 编译内核比较花时间,需要有耐心,同时可以增加CPU核数,以加快编译过程。

\2. 编译内和比较耗空间,需要提前为虚拟机准备充足的内存。

\3. 添加系统调用:更新系统调用表、更新头文件、添加性函数。要注意不同版本间,存放的地址也会不同;

\4. Printk函数属于内核调用的函数,输出结果不在窗口,需要使用dmesg查看。

\5. 主要是要有耐心,不断去网上查资料,比对,以及不要畏难。

2)实验中遇到什么问题?如何解决?

\1. 查看该centos能够支持的最低版本,不然编译后重启,会出现“kernel too old”的错误;

img

进入/lib64路径,‘file libc-2.17.so’查看支持的最低内核版本。这里改为4.15.10版本。

img

\2. 设置虚拟机的配置以及主机的调整;

① 虚拟机CPU根据主机的情况设置,这里我改为4核,方便提高‘make’的执行速度;

② 扩充/boot挂载的分区,以免执行‘make install’时出现“/boot分区空间不足”;

③ 扩充虚拟机内存大小。

④ 主机的D盘(虚拟机所在的磁盘)也要内存。

img

img

img

可以看出内核编译非常占用内存。

img

D盘空间不足。清理D盘空间,make clean 保留配置文件等,再重新编译即可。

img

\3. 各种包工具的安装,以免编译内核时停止。【这里我用history查看命令记录】

img

7、【拓展实验】

自己查阅相关的资料,完成下面的实验:

1)用模块添加法添加系统调用。

\1. 查询syscall_table的地址

img

\2. 查看可用的系统调用号

img

从下图知383可用。

img

\3. 创建执行文件

#include <linux/kernel.h>

#include <linux/init.h>

#include <linux/module.h>

#include <linux/unistd.h>

#include <linux/sched.h>

 

MODULE_LICENSE("Dual BSD/GPL");

 

#define SYS_CALL_TABLE_ADDRESS 0x0000000000000000 //sys_call_table对应的地址

#define NUM 383 //系统调用号为383

int orig_cr0; //用来存储cr0寄存器原来的值

unsigned long *sys_call_table_my=0;

static int(*anything_saved)(void); //定义一个函数指针,用来保存一个系统调用

static int clear_cr0(void) //使cr0寄存器的第17位设置为0(内核空间可写)

{

  unsigned int cr0=0;

  unsigned int ret;

  asm volatile("movq %%cr0,%%rax":"=a"(cr0));//将cr0寄存器的值移动到eax寄存器中,同时

输出到cr0变量中

  ret=cr0;

  cr0&=0xfffffffffffeffff;//将cr0变量值中的第17位清0,将修改后的值写入cr0寄存器

  asm volatile("movq %%rax,%%cr0"::"a"(cr0));//将cr0变量的值作为输入,输入到寄存器eax中,同时移动到寄存器cr0中

  return ret;

}

 

static void setback_cr0(int val) //使cr0寄存器设置为内核不可写

{

  asm volatile("movq %%rax,%%cr0"::"a"(val));

}

 

asmlinkage long sys_mycall(void) //定义自己的系统调用

{

  printk("模块系统调用-当前pid:%d,当前comm:%s\n",current->pid,current->comm);

  printk("hello,xieyixing!\n");

  return current->pid;

}

static int __init call_init(void)

{

  sys_call_table_my=(unsigned long*)(SYS_CALL_TABLE_ADDRESS);

  printk("call_init......\n");

  anything_saved=(int(*)(void))(sys_call_table_my[NUM]);//保存系统调用表中的NUM位置上

的系统调用

  orig_cr0=clear_cr0();//使内核地址空间可写

  sys_call_table_my[NUM]=(unsigned long) &sys_mycall;//用自己的系统调用替换NUM位置上>的系统调用

  setback_cr0(orig_cr0);//使内核地址空间不可写

  return 0;

}

 

static void __exit call_exit(void)

{

  printk("call_exit......\n");

  orig_cr0=clear_cr0();

  sys_call_table_my[NUM]=(unsigned long)anything_saved;//将系统调用恢复

  setback_cr0(orig_cr0);

}

 

module_init(call_init);

module_exit(call_exit);

img

\4. 创建Makefile

img

\5. 安装内核模块

① Make

img

img

**系统调用表的地址在每次出现致命错误后,会发生变化!**因此,在出现致命错误后,除了要修改 asmlinkage 部分的代码,不要忘了再次检查系统调用表地址,并在程序中修改!

img

Invalid module format:重新make就好了

img

修改系统调用的地址

img

② Insmod插入模块

img

③ 测试

img

img

  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
鸿鹄智能云CMS站群系统是一个在centos7.x 系统中,以python+Mysql进行开发的cms站群系统。 一.环境要求 鸿鹄智能云站系统版本是基于centos7开发的,务必使用centos7.x 系统 (裸系统即可/一般情况下不会有问题) 二.安装命令 SSH登陆你的服务器,ROOT用户权限下执行: yum install -y wget && wget -O install.sh http://download.swanyun.com/version/install.sh && sh install.sh (*)注意:部分服务器系统yum陈旧,如报yum错请先执行 yum update 更新一下完成后执行上述命令 三.登陆管理 安装完成后面板有提示,请注意(复制保存以防您忘记) 鸿鹄智能云CMS站群系统系统特性: 1、一键批量建站(快) 填写好域名后可一键批量创建站点,简单易用,速度飞快,只需要做三件事:解析域名,批量添加网站,等待30分钟站点自动建好,而且还带高质量的内容。 速度:一分钟建立一个站点(包含高质量内容),30分钟1000+站点,飞一般的速度! 2、一键调度数据(免规则免采集) 我们的云端数据提供内容高度精准调度服务,包括内容标题、内容主体、内容质量度、行为模式等分析,通过关键字自动调取相关内容! 数量:站点需要什么数据我们就能为您提供什么数据,不是采集! 栏目数*更新量 质量:标题唯一性  内容主题集中度 页面相关内容 地区内容 图文混版 3、SEO自动化功能(内置) 前端SEO模版优化适用于目前主流的搜索引擎,MIP/AMP/H5,OG协议,XML文件,网站地图SITEMAP不用自己写都有!自动ping,主动推送提交URL,404自定义等! 基础:通用SEO基础代码功能,页面关键字密度控制 自动内链 高级:URL自定义 404高级功能 SSL 数据分析 4、高性能并发负载(稳) 我们采用了python高并发框架系统构建底层源码结构,提升整体高并发负载性能,异步模式解决调用阻塞问题,前端展现毫秒级响应,单网站承载千万级别内容数据轻松应对,成功通过高压力测试! 代码:Python  数据库:Mysql 缓存组:Redis  WEB服务器:鸿鹄WEB服务器 5、商业SEO模版(选) 我们提供的模版自动适应各种浏览设备,同时针对搜索引擎做了深度优化,模版自身修改也简单易用,HTML前端SEO优化代码无需用户担心,模版内置多个模型调用标签,可以轻松为网站前端植入广告代码、表单代码、统计代码、在线客服等! 特性:自适应 MIP/AMP/H5 扩展:模版分离 易于编写 6、超多自定义功能(唯一性) 为每个网站提供差异化自定义功能,您可以对网站中的任意一个站做个性化修改(包含栏目URL,内容页URL都可自定义),而且针对网站模板的任何地方都能修改,内容调度可以完全模拟正常人工发布内容! 7、API一键获取数据(关键字) 支持多种格式数据返回格式,商业展现各种数据关联性,兼容多种CMS一键接入,提供多种数据文件格式离线下载,数据云端每日更新! 接口:主关键字 长尾词提取 相关词提取 关联标题内容/图片提取 8、傻瓜化但与众不同(一键模式) 云端调度模式解决您最关心的企业营销问题,建站、优化、维护、运营、分析,客户需要的技术支持我们都全力提供服务! 传统:找人,写源码,改需求,发布内容,SEO优化,运维 我们:安装,点鼠标设置,喝茶,看数据分析,上排名流量!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值