`

asmlinkage

阅读更多

 

http://www.linuxsir.org/bbs/showthread.php?t=278997

harveysharp@linuxsir.org ::

 

它是GCC对C程序的一种扩展, #define asmlinkage __attribute__((regparm(0)))
表示用0个寄存器传递函数参数,这样,所有的函数参数强迫从栈中提取。
这个asmlinkage大都用在系统调用中,系统调用需要在entry.s文件中用汇编语言调用,所以必须要保证它符合C语言的参数传递规则,才能用汇编语言正确调用它。
这也是为何使用asmlinkage的原因吧!这是我的理解。

分享到:
评论

相关推荐

    linux内核源码中常见宏

    #### 一、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); /* ...

    71117408_梅洛瑜_Operating system experiment report_1th1

    在x86架构下,系统调用通常使用`asmlinkage`关键字表示,以表明其不会通过栈传递参数。`sys_hello`函数返回一个`long`类型的值,代表了实验者学号。 8. 实验结果: 成功实现了自定义系统调用,当运行测试程序时,...

    linux 应用程序中的open 操作与硬件驱动之间的联系浅析

    第一节 open 函数的系统操作过程,在fs/open.c 文件中 ...asmlinkage long sys_open(const char __user filename,int flags,int mode)。 那么,就是上面说过的,open 函数,对应的内核函数,就是sys_open,这种形式。

    Linux的内核修改与内核重新编译.pdf

    在 “/usr/src/linux-2.4/kernel/sys.c” 文件中,有一系列以 “asmlinkage” 开头的标准系统调用函数,我们可以编写新的系统调用函数插入最后一个 “asmlinkage” 的后面,函数名以 “sys_” 开头。 例如,我们...

    Linux i386+源码中常见宏标识tag的定义

    asmlinkage void __init start_kernel(void){ ... } ``` 在这个例子中,`start_kernel`函数在初始化阶段执行,且不占用运行时内存。 2) **`__initdata`**:同样来自`include/asm-i386/init.h`,这个宏用于初始化时...

    ubuntu系统中添加新的系统调用2.6.33.1(linux).pdf

    `asmlinkage`关键字确保函数不会使用任何保存在寄存器中的栈帧信息,这是内核函数的标准定义方式。`sys_`前缀是系统调用函数的标准命名约定。 接下来,我们需要将新系统调用链接到内核中。这涉及到修改两个文件: ...

    ubuntu系统中添加新的系统调用2.6.33.1(linux)[整理].pdf

    asmlinkage int sys_mycall(int number) { return number; } ``` 这里,`asmlinkage`关键字确保函数不会使用栈帧,这是系统调用的标准约定。 2. **更新系统调用表**: 新系统调用需要在内核的系统调用表中...

    2.6.28内核增加系统调用[归类].pdf

    这里`asmlinkage`关键词表明函数不使用任何固定寄存器传递参数。 5. **更新系统调用表**: 编辑`arch/x86/kernel/syscall_table_32.S`文件,将新系统调用添加到调用表的末尾,例如: ```assembly .long sys_...

    计算机软件及应用系统调用PPT课件.pptx

    在Linux内核的系统调用服务例程中,常常使用`asmlinkage`宏,它告诉编译器这个函数接收参数的方式不经过常规的栈机制,而是直接从寄存器传递。这是为了提高效率并适应系统调用的特殊需求。 5. **系统调用的重要性*...

    linux 通过模块实现自己的系统调用

    2. **定义系统调用接口**:在内核模块中,使用`asmlinkage`宏定义系统调用入口点,这允许内核以固定地址调用你的函数。例如: ```c asmlinkage long sys_my_syscall(int arg1, char *arg2); ``` 3. **实现系统...

    ubuntu系统中添加新的系统调用2.6.33.1(linux).docx

    `asmlinkage`关键字告诉编译器这是一个系统调用函数,确保参数能够正确传递给内核。函数体非常简单,只是直接返回传入的参数值。 #### 连接新的系统调用 完成源代码编写后,需要进行以下几步操作以确保内核能够...

    linux进程创建详解

    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 } ```...

    linux系统调用

    这些函数使用 `asmlinkage` 关键字定义,表示它们接收参数的方式是通过栈传递,而不是通过寄存器。 b) 在 `syscall_table_32.S` 文件中,找到 `.long sys_XXXX` 行,然后在下面添加对应的自定义系统调用,确保...

    linux实验_添加系统调用-完整版知识.pdf

    * 编辑/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-...

    实验2.4-系统调用-实验报告1

    这通常是声明一个原型函数,如`asmlinkage long sys_shiwenhan_time(time_t *tvp);`,其中time_t *tvp是一个指向时间值的指针。 3. **定义系统调用函数**: 根据实验指导,需要实现sys_shiwenhan_time的函数定义,...

    Linux下的系统调用和进程

    例如,`asmlinkage`宏确保了函数参数通过堆栈而非寄存器传递,这对于需要在汇编代码中访问函数参数的场景尤为重要。`__init`宏则用于标记那些仅在内核初始化阶段调用的函数,以减少内核的常驻内存占用。 #### 系统...

Global site tag (gtag.js) - Google Analytics