1.demo
#include <stdio.h>
void test(int *a);
#define mytest(a) test(a)
int main()
{
int a;
a = 3;
printf("a is %d\n",a);
test(&a);
printf("a is %d\n",a);
}
void mytest(int *a)
{
*a = 2;
}
gcc -o 1 1.c
a is 3
a is 2
说明:系统调用sys_init_module在Linux kernel2.6内核以后即是这样实现的。
下面附上insmod命令的执行过程:
1.jb/system/core/toolbox/insmod.c
int insmod_main(int argc, char **argv)
{
......
ret = init_module(file, size, opts);
......
}
2.jb/bionic/libc/arch-arm/syscalls/init_module.S
ENTRY(init_module)
.save {r4, r7}
stmfd sp!, {r4, r7}
ldr r7, =__NR_init_module
swi #0
ldmfd sp!, {r4, r7}
movs r0, r0
bxpl lr
b __set_syscall_errno
END(init_module)
===================================
kernel部分:
3.定义
kernel2.6.35.11/arch/arm/include/asm/unistd.h
#define __NR_init_module (__NR_SYSCALL_BASE+128)
kernel2.6.35.11/arch/arm/kernel/calls.S
CALL(sys_init_module)
kernel2.6.35.11/include/linux/syscalls.h
#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
#define SYSCALL_DEFINEx(x, sname, ...) \
__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
#define __SYSCALL_DEFINEx(x, name, ...) \
asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
4.实现
kernel2.6.35.11/kernel/modules.c
SYSCALL_DEFINE3(init_module, void __user *, umod,
unsigned long, len, const char __user *, uargs)
{
}