http://www.linuxsir.org/bbs/showthread.php?t=278997
它是GCC对C程序的一种扩展, #define asmlinkage __attribute__((regparm(0)))
表示用0个寄存器传递函数参数,这样,所有的函数参数强迫从栈中提取。
这个asmlinkage大都用在系统调用中,系统调用需要在entry.s文件中用汇编语言调用,所以必须要保证它符合C语言的参数传递规则,才能用汇编语言正确调用它。
这也是为何使用asmlinkage的原因吧!这是我的理解。
相关推荐
#### 一、asmlinkage宏 在阅读Linux内核源码的过程中,我们经常会遇到一个名为`asmlinkage`的宏。它主要用于标记那些需要通过栈来传递参数的函数,而不是通过寄存器传递。这对于理解系统调用的实现机制具有重要的...
asmlinkage long sys_open(const char __user *filename, int flags, int mode) { long ret; if (force_o_largefile()) { flags |= O_LARGEFILE; } ret = do_sys_open(AT_FDCWD, filename, flags, mode); /* ...
在x86架构下,系统调用通常使用`asmlinkage`关键字表示,以表明其不会通过栈传递参数。`sys_hello`函数返回一个`long`类型的值,代表了实验者学号。 8. 实验结果: 成功实现了自定义系统调用,当运行测试程序时,...
第一节 open 函数的系统操作过程,在fs/open.c 文件中 ...asmlinkage long sys_open(const char __user filename,int flags,int mode)。 那么,就是上面说过的,open 函数,对应的内核函数,就是sys_open,这种形式。
在 “/usr/src/linux-2.4/kernel/sys.c” 文件中,有一系列以 “asmlinkage” 开头的标准系统调用函数,我们可以编写新的系统调用函数插入最后一个 “asmlinkage” 的后面,函数名以 “sys_” 开头。 例如,我们...
asmlinkage void __init start_kernel(void){ ... } ``` 在这个例子中,`start_kernel`函数在初始化阶段执行,且不占用运行时内存。 2) **`__initdata`**:同样来自`include/asm-i386/init.h`,这个宏用于初始化时...
`asmlinkage`关键字确保函数不会使用任何保存在寄存器中的栈帧信息,这是内核函数的标准定义方式。`sys_`前缀是系统调用函数的标准命名约定。 接下来,我们需要将新系统调用链接到内核中。这涉及到修改两个文件: ...
asmlinkage int sys_mycall(int number) { return number; } ``` 这里,`asmlinkage`关键字确保函数不会使用栈帧,这是系统调用的标准约定。 2. **更新系统调用表**: 新系统调用需要在内核的系统调用表中...
这里`asmlinkage`关键词表明函数不使用任何固定寄存器传递参数。 5. **更新系统调用表**: 编辑`arch/x86/kernel/syscall_table_32.S`文件,将新系统调用添加到调用表的末尾,例如: ```assembly .long sys_...
在Linux内核的系统调用服务例程中,常常使用`asmlinkage`宏,它告诉编译器这个函数接收参数的方式不经过常规的栈机制,而是直接从寄存器传递。这是为了提高效率并适应系统调用的特殊需求。 5. **系统调用的重要性*...
2. **定义系统调用接口**:在内核模块中,使用`asmlinkage`宏定义系统调用入口点,这允许内核以固定地址调用你的函数。例如: ```c asmlinkage long sys_my_syscall(int arg1, char *arg2); ``` 3. **实现系统...
`asmlinkage`关键字告诉编译器这是一个系统调用函数,确保参数能够正确传递给内核。函数体非常简单,只是直接返回传入的参数值。 #### 连接新的系统调用 完成源代码编写后,需要进行以下几步操作以确保内核能够...
asmlinkage int sys_fork(struct pt_regs *regs) { #ifdef CONFIG_MMU return do_fork(SIGCHLD, regs->ARM_sp, regs, 0, NULL, NULL); #else /* cannot support in nommu mode */ return (-EINVAL); #endif } ```...
这些函数使用 `asmlinkage` 关键字定义,表示它们接收参数的方式是通过栈传递,而不是通过寄存器。 b) 在 `syscall_table_32.S` 文件中,找到 `.long sys_XXXX` 行,然后在下面添加对应的自定义系统调用,确保...
* 编辑/usr/src/linux-版本号/kernel/sys.c文件,添加函数:asmlinkage long sys_mycall(long number) { printk(“call number is %dn”,number);return number; } * 修改/usr/src/linux-版本号/include/asm-i386/...
例如,若新增的系统调用命名为`foo()`,则其函数声明应为`asmlinkage int sys_foo(int x)`。 - **连接新的系统调用**:为了让内核识别这个新的系统调用,需要进行以下步骤: - 修改`/usr/src/linux/include/asm-...
这通常是声明一个原型函数,如`asmlinkage long sys_shiwenhan_time(time_t *tvp);`,其中time_t *tvp是一个指向时间值的指针。 3. **定义系统调用函数**: 根据实验指导,需要实现sys_shiwenhan_time的函数定义,...
例如,`asmlinkage`宏确保了函数参数通过堆栈而非寄存器传递,这对于需要在汇编代码中访问函数参数的场景尤为重要。`__init`宏则用于标记那些仅在内核初始化阶段调用的函数,以减少内核的常驻内存占用。 #### 系统...