- 论坛徽章:
- 0
|
新手一个,看了linux0.11系统调用过程以后,
由于寄存器有限,所以最多只能传三个参数。
现在的想法是添加一个int ** ,调用system_Ncall,专门处理。
不禁想知道多参数如何调用,请指教。
实验报告中写的,如下:
--在可用寄存器为有限情况下:
参数传递是在堆栈中实现的(as far as i can see),包括系统调用,中的系统函数,读的亦是系统的堆栈,而linux0.11
时,调用afun(int a,int b, int c)系统堆栈是这样的
|%edx| 值为c
|%ecx| 值为b
|%eax| 值为a
| pc |
%ebp-> |%ebp|
|.........|
...........
%esp-> |..........|
参数通过ebp读入
现在,
实现 void forfun(int a, int b, int c, int d)
我们可以通过修改unistd.h
unistd.h定义的宏函数运行在用户空间,我们可以加一个宏函数,里面的asm代码
相应地:
%ebx 用户堆栈中最小地址的,
#define _syscall4(type,name,atype,a,btype,b,ctype,c,dtype,d) \
type name(atype a,btype b, ctype c, dtype d ) \
{ \
long __res; \
int*__pt__=__&a;\
int__num__=__4;\ //<-格式暂不知道是否正确
__asm__ volatile ("int $0x80" \
: "=a" (__res) \
: "0" (__NR_##name),"b" ((long)(pt)),"c" ((long)(num))); \
if (__res >= 0) \
return (type) __res; \
errno = -__res; \
return -1; \
}
然后修改 system_call.s 通过fs 读用户空间的堆栈,pt得到地址,num控制边界。将得到的数据压栈然后再call相应的内核的函数
但是这样的话并不会的到效率的提高,相反,由于无论大小,只用一套(基址,个数...),所以,大大的减低了三个以下参数的系统调用的实现。
也是由于这样,暂不知道怎样测试。
折中的方法是不修改system_call.s 修改内核函数的定义,或者再用另外一个中断专门给system_call2(专为多参版本服务的),但不知道可不可行。
到头来感觉不如不改,直接在有需要的时候再通过传指针方式减少参数就算了。
剩下个问题,当时怎样传long long ?? |
|