内容简介:首先让我们脑补一下什么是系统调用,个人理解系统调用就是调用系统函数(内核状态下的函数)。在linux系统中,用户通过执行一条访管指令(int$0x80)来实现系统调用。(说白点就是你在自己的代码中调用这个““syscall()”函数)就会出发一个访管中断,系统就会去执行你需要的系统函数。其实中间还有一些过程,笔者为了便于大家理解,在此忽略了。如需详细了解系统调用过程,请读者自行百度吧。那么开始进入正题吧,内核编译啊,其实是一个很漫长的过程,一步弄错,哈哈哈,很酸爽….首先我们需要一台linux系统的电脑或
首先让我们脑补一下什么是系统调用,个人理解系统调用就是调用系统函数(内核状态下的函数)。在 linux 系统中,用户通过执行一条访管指令(int$0x80)来实现系统调用。(说白点就是你在自己的代码中调用这个““syscall()”函数)就会出发一个访管中断,系统就会去执行你需要的系统函数。其实中间还有一些过程,笔者为了便于大家理解,在此忽略了。如需详细了解系统调用过程,请读者自行百度吧。
那么开始进入正题吧,内核编译啊,其实是一个很漫长的过程,一步弄错,哈哈哈,很酸爽….
首先我们需要一台linux系统的电脑或者装好了linux系统的虚拟机,大部分人还是用虚拟机的。笔者这里使用的是VMware12,虚拟机的安装,笔者这里就不介绍了
要进行内核编译,我们得去 http://www.kernel.org下载linux源代码
这里注意下,开始编译前,确保自己是root用户(好处是可以省去添加sudo)
我编译的时候是用的4.13.7的版本,大家可以和我的不一样。
打开终端,切换到Downloads目录
接下来将源码复制到/home/src(笔者之前已经在home目录下创建了src目录,其实在哪里都可以。)
这时使用 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系统基本上要安装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 这项
进入scsi 配置界面,将下面几项全部设成*
回退到上一个界面,设置Fusion MPT,设置为 *
选择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
等待它重启
开机后查看内核版本
内核编译就到此为止了,接下来是添加系统调用。
这里我添加一个系统函数 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下面添加一条,如图所示
切换到/usr/include/asm-generic/下 vim unistd.h
加入#define NR_mysetnice 333 SYSCALL(__NR_mysetnice,sys_mysetnice)
切换到/home/src/linux-4.13.7/kernel/
vim sys.c
写入以下代码
注意这里是不能直接&task_nice(p),个人的理解是task_nice(p)返回的是一个字面值,不能直接取地址,通过另外的变量将这个值暂存起来,取变量的地址(这个坑,笔者踩了很久才跳出来),copy_to_user 是将内核的值拷贝到用户状态
系统调用的函数已经写好了,接下就是编译安装了,步骤跟编译是一样的了,这里不再讲述。
这里我写了一个demo测试系统调用是否成功的,代码如下
这里我打开了火狐浏览器使用top命令可以看到该进程的pid是6252
gcc -o testsyscall testsyscall.c 生成可执行文件后输入
./testsyscall
笔者的测试如下图
成功读取nice 和 prio的值,并且也成功修改了nice值
以上所述就是小编给大家介绍的《Linux内核编译及添加系统调用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- XenServer编译内核模块
- XenServer编译内核模块
- 树莓派之内核升级—源码编译
- Kernel Hack实战:修改并编译手机内核源码对抗反调试
- [译] Go 编译器内核:给 Go 新增一个语句(一)
- 感谢Google的参与,使LLVM Clang编译Linux内核的热潮再次升温
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Making Things See
Greg Borenstein / Make / 2012-2-3 / USD 39.99
Welcome to the Vision Revolution. With Microsoft's Kinect leading the way, you can now use 3D computer vision technology to build digital 3D models of people and objects that you can manipulate with g......一起来看看 《Making Things See》 这本书的介绍吧!