Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104574593
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-05-18 13:51:52

作者: Promises  出自:
作者:比萨公园·蜗牛居

一、基本思想:
在系统调用函数中添加系统乘法 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.运行。
阅读(307) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~