Linux内核编译及添加系统调用

栏目: 服务器 · Linux · 发布时间: 7年前

内容简介:首先让我们脑补一下什么是系统调用,个人理解系统调用就是调用系统函数(内核状态下的函数)。在linux系统中,用户通过执行一条访管指令(int$0x80)来实现系统调用。(说白点就是你在自己的代码中调用这个““syscall()”函数)就会出发一个访管中断,系统就会去执行你需要的系统函数。其实中间还有一些过程,笔者为了便于大家理解,在此忽略了。如需详细了解系统调用过程,请读者自行百度吧。那么开始进入正题吧,内核编译啊,其实是一个很漫长的过程,一步弄错,哈哈哈,很酸爽….首先我们需要一台linux系统的电脑或

首先让我们脑补一下什么是系统调用,个人理解系统调用就是调用系统函数(内核状态下的函数)。在 linux 系统中,用户通过执行一条访管指令(int$0x80)来实现系统调用。(说白点就是你在自己的代码中调用这个““syscall()”函数)就会出发一个访管中断,系统就会去执行你需要的系统函数。其实中间还有一些过程,笔者为了便于大家理解,在此忽略了。如需详细了解系统调用过程,请读者自行百度吧。

那么开始进入正题吧,内核编译啊,其实是一个很漫长的过程,一步弄错,哈哈哈,很酸爽….

首先我们需要一台linux系统的电脑或者装好了linux系统的虚拟机,大部分人还是用虚拟机的。笔者这里使用的是VMware12,虚拟机的安装,笔者这里就不介绍了

要进行内核编译,我们得去 http://www.kernel.org下载linux源代码

Linux内核编译及添加系统调用

这里注意下,开始编译前,确保自己是root用户(好处是可以省去添加sudo)

我编译的时候是用的4.13.7的版本,大家可以和我的不一样。

打开终端,切换到Downloads目录

Linux内核编译及添加系统调用 接下来将源码复制到/home/src(笔者之前已经在home目录下创建了src目录,其实在哪里都可以。)

Linux内核编译及添加系统调用

这时使用 xz -d linux-4.13.7.tar.xz 后会生成linux-4.13.7.tar

再使用tar -xvf linux-4.13.7.tar 便可以得到解压后的源码linux-4.13.7

Linux内核编译及添加系统调用

进入源码目录后,我所用过的linux系统基本上要安装nurses

使用 apt-get install libncurses5-dev 安装

笔者是用的是kalilinux(一款渗透测试系统的)在进行编译时发现 还需要 安装bc,使用 apt-get install bc就可以了

接下来就是编译前的清理工作了,使用make mrproper或者是make clean 命令,第一次编译的话是不需要执行的,如果是失败后再次编译就要执行清理工作了,make mrproper 会清理掉残留的.config 和.o文件,make clean 会保留 .config文件,如果你不想再次配置.config文件 就是用make clean吧。

内核的配置工作:

使用make menuconfig命令

会出现一个界面

选择Device Drivers 这项

Linux内核编译及添加系统调用

进入scsi 配置界面,将下面几项全部设成*

Linux内核编译及添加系统调用

Linux内核编译及添加系统调用

回退到上一个界面,设置Fusion MPT,设置为 *

Linux内核编译及添加系统调用

Linux内核编译及添加系统调用

选择exit保存就好了

接下来就是激动人心的时候了

输入以下命令make bzImage 生成映像文件

笔者大概用了30分钟左右(没办法虚拟机就这样)

开始编译模块 输入以下命令make modules

大概4个多小时吧(可以玩好几把lol了~)

安装模块:make modules_install,这个很快哦。 输入mkinitramfs - o /boot/initrd-4.13.7.img -v 4.13.7 即可建立载入ramdisk的映像文件

安装内核:make install

配置引导程序:update-grub2

最后:reboot

等待它重启

开机后查看内核版本

Linux内核编译及添加系统调用

内核编译就到此为止了,接下来是添加系统调用。

这里我添加一个系统函数 int mysetnice(pid_t,int flag,int nicevalue,void user *prio,void user * nice);

实现对指定进程的nice值的修改读取和prio值得读取,并将值从内核态返回到用户态

参数含义

pid:进程ID

flag:若flag为o功能是读取nice值,是1的话就是修改nice值

nicevalue:要修改的nice值

void __user 指针类型(其实就是用户态的普通指针了,例如int p)

添加系统调用首先要分配系统调用号,切换到/home/serc/linux-4.13.7/arch/x86/entry/syscalls/使用 vim syscall_64.tbl

在332下面添加一条,如图所示

Linux内核编译及添加系统调用

切换到/usr/include/asm-generic/下 vim unistd.h

加入#define NR_mysetnice 333 SYSCALL(__NR_mysetnice,sys_mysetnice)

Linux内核编译及添加系统调用

切换到/home/src/linux-4.13.7/kernel/

vim sys.c

写入以下代码

Linux内核编译及添加系统调用

注意这里是不能直接&task_nice(p),个人的理解是task_nice(p)返回的是一个字面值,不能直接取地址,通过另外的变量将这个值暂存起来,取变量的地址(这个坑,笔者踩了很久才跳出来),copy_to_user 是将内核的值拷贝到用户状态

系统调用的函数已经写好了,接下就是编译安装了,步骤跟编译是一样的了,这里不再讲述。

这里我写了一个demo测试系统调用是否成功的,代码如下

Linux内核编译及添加系统调用

这里我打开了火狐浏览器使用top命令可以看到该进程的pid是6252

Linux内核编译及添加系统调用

gcc -o testsyscall testsyscall.c 生成可执行文件后输入

./testsyscall

笔者的测试如下图

Linux内核编译及添加系统调用 成功读取nice 和 prio的值,并且也成功修改了nice值


以上所述就是小编给大家介绍的《Linux内核编译及添加系统调用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JavaScript高级程序设计(第3版)

JavaScript高级程序设计(第3版)

[美] Nicholas C. Zakas / 李松峰、曹力 / 人民邮电出版社 / 2012-3-29 / 99.00元

本书是JavaScript 超级畅销书的最新版。ECMAScript 5 和HTML5 在标准之争中双双胜出,使大量专有实现和客户端扩展正式进入规范,同时也为JavaScript 增添了很多适应未来发展的新特性。本书这一版除增加5 章全新内容外,其他章节也有较大幅度的增补和修订,新内容篇幅约占三分之一。全书从JavaScript 语言实现的各个组成部分——语言核心、DOM、BOM、事件模型讲起,深......一起来看看 《JavaScript高级程序设计(第3版)》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具