QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3936|回复: 10

linux内核中开头带有asmlinkage的函数表示什么

[复制链接]
发表于 2005-9-8 13:43:11 | 显示全部楼层 |阅读模式
linux内核中开头带有 asmlinkage 的函数表示什么
发表于 2005-9-12 19:37:36 | 显示全部楼层
强制通过堆栈传递参数,不要用寄存器传递
回复

使用道具 举报

 楼主| 发表于 2005-9-13 08:51:21 | 显示全部楼层
这样做是为了节约寄存器资源提高效率 还是其他的原因
回复

使用道具 举报

发表于 2005-9-13 21:09:14 | 显示全部楼层
跟这没关系,仔细看一下有asmlinkage的地方通常是系统调用的函数,因为在系统调用中,寄存器从用户空间传过来后SAVE_ALL压入堆栈,接着调用相应的系统调用函数,这样系统调用函数一定要保证是通过堆栈传递参数的

转贴一段:
The asmlinkage tag is one other thing that we should observe about this simple function. This is a #define for some gcc magic that tells the compiler that the function should not expect to find any of its arguments in registers (a common optimization), but only on the CPU's stack. Recall our earlier assertion that system_call consumes its first argument, the system call number, and allows up to four more arguments that are passed along to the real system call. system_call achieves this feat simply by leaving its other arguments (which were passed to it in registers) on the stack. All system calls are marked with the asmlinkage tag, so they all look to the stack for arguments. Of course, in sys_ni_syscall's case, this doesn't make any difference, because sys_ni_syscall doesn't take any arguments, but it's an issue for most other system calls. And, because you'll be seeing asmlinkage in front of many other functions, I thought you should know what it was about.
回复

使用道具 举报

 楼主| 发表于 2005-9-14 09:02:23 | 显示全部楼层
明白了 谢谢啊
回复

使用道具 举报

 楼主| 发表于 2005-9-14 10:53:02 | 显示全部楼层
那对于参数小于5的系统调用是不是就不用了
回复

使用道具 举报

发表于 2005-9-14 19:53:03 | 显示全部楼层
不是,跟这没关系的,具体可以研究一下arch/i386/kernel/entry.S
回复

使用道具 举报

 楼主| 发表于 2005-9-15 08:33:46 | 显示全部楼层
是不是为了保护寄存器内容不受更改 才用堆栈传递参数 以便以后能RESTORE--ALL
回复

使用道具 举报

发表于 2005-9-15 08:49:27 | 显示全部楼层
系统调用把参数存放在寄存器中然后进入内核空间,其实就和正常的函数调用一样,在内核中通过SAVE_ALL构造一个函数调用的栈帧环境,然后调用相应的系统调用函数而已
回复

使用道具 举报

 楼主| 发表于 2005-9-15 12:35:06 | 显示全部楼层
这里使用的堆栈就是原来SAVE--ALL的寄存器的内容吧
回复

使用道具 举报

发表于 2005-9-15 18:54:23 | 显示全部楼层
对的

ENTRY(system_call)
        pushl %eax                        # save orig_eax
        SAVE_ALL
        GET_THREAD_INFO(%ebp)
                                        # system call tracing in operation
        /* Note, _TIF_SECCOMP is bit number 8, and so it needs testw and not testb */
        testw $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),TI_flags(%ebp)
        jnz syscall_trace_entry
        cmpl $(nr_syscalls), %eax
        jae syscall_badsys
syscall_call:
        call *sys_call_table(,%eax,4)
        movl %eax,EAX(%esp)                # store the return value
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 12:44 , Processed in 0.098616 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表