添加系统调用 http://docs.huihoo.com/joyfire.net/6-1.html

news/2024/8/29 21:00:08

第一步:
1.找到linux 内核代码所在地,一般在你的系统这个位置(你下载代码放其他地方我不反对
)
  /usr/src/linux/
 但是也可能是这个位置
 /usr/src/linux-2.4/或者其他
 找到后cd /usr/src/linux*/ 转到该目录下.
 linux*表示代码所在的文件夹
2.修改内核代码
  a.添加源文件
  假设新加的系统调用为mycall(int number),(大家举例子都喜欢用这个函数,就
  象helloworld)
  在/usr/src/linux*/kernel/sys.c文件中添加源代码,如下所示:
 asmlinkage int sys_mycall(int number)
 {
     return number;

 

 

 

 这篇文章简单的介绍了如何为linux添加一个系统调用。也就是为linux增加一个api函数。通过这篇文章,应该学会如何 简单的修改linux源代码、编译内核。

    首先:1:  cd  /usr/src/linux/kernel

               2: vi sys.c 并添加如下一个函数:

                       asmlinkage int sys_mycall(int num) { return num;}

              3.  cd /usr/src/linux/arch/i386/kernel

              4:  vi entry.S  并添加如下代码

                .long SYMBOL_NAME(sys_mycall)

            5.  在头文件中增加申明:

              cd /usr/include/asm

             vi unistd.h

           添加:   #define __NR_mycall     222

---------------------------------------

OK , 以下开始编译内核。

     make mrproper

   make menuconfig

   make dep

   make bzImage

  make modules

  make  modules_install

编译完成后,将新内核文件和新的系统符号表拷贝到/boot目录,如下:

   cp /usr/src/linux/arch/i386/boot/bzImage /boot/bzImage-new

  cp  /usr/src/linux/System.map  /boot/System.map-new

  然后将System.map-new,软链接到/boot/System.map,如下:

   ln -sf /bbot/System.map-new /boot/System.map


下面开始配置lilo(/etc 目录下):

   新lilo.conf文件如下:

    default = linux-new

     image = /boot/bzImage-2.4.7

   label=linux-new

   ..........(略)

 然后使用超级用户运行 /sbin/lilo


好,重新启动 。 reboot

重新启动机器后,我们来编写一个测试程序来调用我们刚才添加的api。如下test.c:

   #include <linux/unistd.h>   ///-----看见这里了吧

  _syscall1(int,mycall,int,ret)   申明系统调用

main()

{

printf("%d  /n",mycall(100));

}

存盘编译。

gcc -o  test test.c

编译好运行。

:)    -----全文玩

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lwglucky/archive/2005/06/28/405710.aspx

 

 

一、基本思想:
在系统调用函数中添加系统乘法 sysMul(int a, int b); 计算 a与b的乘积。将该系统方法封装为乘方 usrPow(int a, int n); 计算 a 的 n 次方。

二、准备工作:
1.环境:Fedora 6

2.我使用的Fedora6中没有提供源代码,又囧,还好在先前的实验中已经安装过2.6.18.1内核源代码包;不详述了。

三、详细步骤

1. 在kernel/sys.c中添加系统调写函数:
asmlinkage int sysMul(int a, int b)
{
int c;
c = a*b;
return c;
}

2.给新的系统调用分配调用号:
在include/asm-i386/unistd.h中添加如下代码:
#define __NR_sysAdd 264

3.在系统调用表/arch/i386/kernel/entry.S 中添加代码指向新写的系统调用函数:.long SYMBOL_NAME(sysMul)

4.使用一系列make,编译内核(这个和skyeye里跑uClinux过程差不多,不详述了),将生成的内核放到boot目录中去,

5.修改grub,添加一个新的引导项:
在menu.lst中添加如下代码:
title testRoot
root(hd0, 0)
kernel /bzImage ro root=/dev/hda1

6.重启后,在启动目录里有了testRoot选项,现在系统包含我们自己写的系统调用sysMul()了

7.开始我们用户例程的编写了,在root目录下建 uPow.c文件

1) 封装系统调用的有API味道儿的usrPow()函数

#inculde
#include
_syscall2(int, sysMul, int, a, int, b)


int usrPow(int m, int n)
{
int i;
int r = 1;
for (i=0; i < n; i++)
{
r = sysMul(r, m);
}
return r;
}

2)写使用用户API usrPow()函数的main()

main()
{
int bNum, pNum;
int result;
printf("input:/n");
scanf("%d%d", &bNum, &pNum);
result = usrPow(bNum, pNum);
printf("result = ", result);
}

8.编译
gcc -o uPow uPow.c

9.运行。

 

 

一、基本思想:
在系统调用函数中添加系统乘法 sysMul(int a, int b); 计算 a与b的乘积。将该系统方法封装为乘方 usrPow(int a, int n); 计算 a 的 n 次方。

二、准备工作:
1.环境:Fedora 6

2.我使用的Fedora6中没有提供源代码,又囧,还好在先前的实验中已经安装过2.6.18.1内核源代码包;不详述了。

三、详细步骤

1. 在kernel/sys.c中添加系统调写函数:
asmlinkage int sysMul(int a, int b)
{
int c;
c = a*b;
return c;
}

2.给新的系统调用分配调用号:
在include/asm-i386/unistd.h中添加如下代码:
#define __NR_sysAdd 264

3.在系统调用表/arch/i386/kernel/entry.S 中添加代码指向新写的系统调用函数:.long SYMBOL_NAME(sysMul)

4.使用一系列make,编译内核(这个和skyeye里跑uClinux过程差不多,不详述了),将生成的内核放到boot目录中去,

5.修改grub,添加一个新的引导项:
在menu.lst中添加如下代码:
title testRoot
root(hd0, 0)
kernel /bzImage ro root=/dev/hda1

6.重启后,在启动目录里有了testRoot选项,现在系统包含我们自己写的系统调用sysMul()了

7.开始我们用户例程的编写了,在root目录下建 uPow.c文件

1) 封装系统调用的有API味道儿的usrPow()函数

#inculde
#include
_syscall2(int, sysMul, int, a, int, b)


int usrPow(int m, int n)
{
int i;
int r = 1;
for (i=0; i < n; i++)
{
r = sysMul(r, m);
}
return r;
}

2)写使用用户API usrPow()函数的main()

main()
{
int bNum, pNum;
int result;
printf("input:/n");
scanf("%d%d", &bNum, &pNum);
result = usrPow(bNum, pNum);
printf("result = ", result);
}

8.编译
gcc -o uPow uPow.c

9.运行。


http://www.niftyadmin.cn/n/4464346.html

相关文章

matlab学习笔记(九)---频域增强

1、低通滤波 1.1对图像eight.tif加入椒盐噪声后&#xff0c;实现Butterworth低通滤波。 clear; I1imread(eight.tif); subplot(221),imshow(I1),title(原始图像); I2imnoise(I1,salt & pepper); %加入椒盐噪声 subplot(222),imshow(I2),title(噪声图像); fdouble(I2)…

matlab学习笔记(十)---边缘检测

分别采用roberts、sobel、prewitt、canny、log算子来检测图像的边缘并比较 Iimread(rice.png); B1edge(I,roberts); B2edge(I,sobel); B3edge(I,prewitt); B4edge(I,canny); B5edge(I,log); subplot(231),imshow(I),title(原始图像); subplot(232),imshow(B1),title(roberts算子…

2.6.8内核中通过模块添加系统调用,不用编译内核

我在2.6.8中通过模块添加系统调用&#xff0c;发现了两个问题&#xff1a;1.是sys_call_table的符号不可以被解析2.除了283 所有的系统调用号都已经被占用 &#xff0c;且没有空余。&#xff08;要是想添加的系统调用号大于283,我们就要先改变unistd.h中的NR_syscalls 改的大一…

fedora 升级内核

尽管在Fdora Core 8下可以使用yum升级内核&#xff0c;但是毕竟是别人编译通用内核&#xff0c;里面添加了很多自己系统不需要的模块&#xff0c;而自己需要的模块却没有开启。因此&#xff0c;学会自己手动编译升级内核也是必要的。 1、下载内核 linux内核可以从http://kernel…

matlab学习笔记(十一)---二值形态学运算

1、膨胀运算 1.1对图像text.png进行膨胀操作&#xff0c;并对比。 bwimread(text.png); sestrel(line,11,90); %创建一个线性结构元素 bw2imdilate(bw,se); %用线性结构元素来进行膨胀操作 subplot(121),imshow(bw),title(原始图像); subplot(122),imshow(bw2),title(膨…

向linux kernel 2.6.24.5中添加系统调用时的纠结

从www.kernel.org 下下载了 kernel 2.6.24.5的包&#xff0c;解压后放在 PC Ubuntu 8.04 /usr/src/ 下&#xff0c; 然后进入kernel源码文件树&#xff0c;进行了如下的步骤&#xff1a; 1. linux/kernel/sys.c 在该文件里增加了 一个自己的函数&#xff1a; asmlinkage void …

syscall summary

把下载的内核源码拷贝到 /usr/src/kernels/ 下make && make modules_install && make install 即可安装新kernel到fedora&#xff0c;并在grub中出现选项。 修改源码目录[rootlocalhost linux-2.6.29.6]# vim ./arch/x86/include/asm/unistd_32.h[rootlocalho…

matlab学习笔记(十二)---二值图像及其特征提取

1、二值图像的生成 函数im2bw&#xff1a;把图像转换成二值图像 load trees; BWim2bw(X,map,0.4); subplot(121),imshow(X,map),title(原图像); subplot(122),imshow(BW),title(二值图像);效果图如下&#xff1a;2、特征提取 2.1图像面积 函数bwarea:获取二值图像的面积 计…