《C预处理》linux kernel中一种宏定义在函数实现中的用法

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)
{
  
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值