您的位置:首页 > 运维架构 > Linux

Linux增加系统调用

2015-12-14 19:04 543 查看
本次实验以Linux 2.6.35版本的unbutu系统为基础,在内核上增加一个helloworld程序的系统调用。

一、重新安装配置内核

Linux增加系统调用

本次实验以Linux 2.6.35版本的unbutu系统为基础,在内核上增加一个helloworld程序的系统调用。

一、重新安装配置内核

1)安装所需的工具和包:#yum install -y gcc ncurses-devel make wget(ncurses能提供底层终端功能的封装,提供一个相当稳固的工作框架用以产生漂亮的界面)

若是centos系统,命令则不同:#apt-get install -y gcc libncursesdev make wget wget。

2)查看所用系统的内核版本,下载所需版本的Linux内核(本实验需要另外的Linux内核,若在本机内核上操作可能导致严重的问题该实验用2.6.35版本),并解压:

uname -r
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.35.tar.gz tar xvzf linux-2.6.35.tar.gz


也可以到www.kernel.org下载相关内核

3)进入linux-2.6.3,安装配置启动菜单menuconfig:

make menuconfig


在启动菜单里选择如下:

编译内核:#make

make modules


4)安装内核(需要用$su命令取得权限):

make modules_install
make install


(unbutu用户需要先执行:#sudo update-initramfs -c -k 2.6.35 手动生成ini)

5)修改配置文件

vim /boot/grub/menu.lst


修改文件中的内容:default=0,timeout=25

(unbutu用户则#sudo vim /etc/default/grub 并修改:GRUB_DEFAULT=2,GRUB_TIMEOUT=25,最后更新grub:#sudo update-grub)

6)重启系统并观察版本号:

reboot
uname -r


二、增加新的系统调用

1)编写调用程序:

cd linux-2.6.35
mkdir my_source
touch my_soucer/sys_hellowoeld.c
vim my_soucer/sys_hellowoeld.c


文件内程序如下:

include<linux/kernel.h>
include<linux/sched.h>
Asmlinkage int sys_helloworld(void)
{
Printk(KERN_EMENG “Hello World! \n”);
Return 1;
}


2)增加配置文件:

touch my_source/Makefile
vim my_source/Makefile


文件内容为:

Makefile of the new system call

Obj-y :-sys_helloworld.o


3)修改原有配置文件

在linux2.6.35目录下打开原有配置文件:#vim Makefile

在下行末尾加上my_source:

Core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ my_source/

4)增加系统调用号

vim arch/x86/kernel/sys_table_32.S

在系统调用表末尾增加一个未使用的调用号,最好接上上一个,我用的是339:

.long sys_helloworld /* 339 */
vim /arch/x86/include/asm/unistd_32.h


增加一行:#define __NR_helloworld 339

将总调用数增加1,变成339:#define NR_syscalls 339

vim /arch/x86/include/asm/syscall.h


增加一行:asmlinkage int sys_helloworld(void);

5)返回第一步编译安装内核并重启

6)编写测试程序代码test_syscall.c,程序内容如下:

include<linux/unistd.h>
include<sys/syscall.h>
include<sys/types.h>
include<stdio.h>
define __NR_helloworld 339
Int main(int argc,char *argv||)
{
syscall(__NR_helloworld);
Return 0;
}


7)编译执行测试程序

gcc test_syscall.c -o test_syscall
./test_syscall
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 内核