asmlinkage的作用
来源:互联网 发布:淘宝精仿鞋店推荐2016 编辑:程序博客网 时间:2024/06/08 14:37
有網友來信問到,kernel 裡的 system call 實作函數中(C 函數),為什麼每一個函數原型宣告的前面都有一個 "asmlinkage" 的字串?例如:
asmlinkage long sys_nice(int increment)
"asmlinkage" 是在 i386 system call 實作中相當重要的一個 gcc 標籤(tag)。
當 system call handler 要呼叫相對應的 system call routine 時,便將一般用途暫存器的值 push 到 stack 裡,因此 system call routine 就要由 stack 來讀取 system call handler 傳遞的參數。這就是 asmlinkage 標籤的用意。
system call handler 是 assembly code,system call routine(例如:sys_nice)是 C code,當 assembly code 呼叫 C function,並且是以 stack 方式傳參數(parameter)時,在 C function 的 prototype 前面就要加上 "asmlinkage"。
加上 "asmlinkage" 後,C function 就會由 stack 取參數,而不是從 register 取參數(可能發生在程式碼最佳化後)。
更進一步的說明...
80x86 的 assembly 有 2 種傳遞參數的方法:
1. register method
2. stack method
Register method 大多使用一般用途(general-purpose)暫存器來傳遞參數,這種方法的好處是簡單且快速。另外一種傳遞參數的做法是使用 stack(堆疊),assembly code 的模式如下:
push number1
push number2
push number3
call sum
在 'sum' procedure 裡取值的方法,最簡單的做法是:
pop ax
pop ax
pop bx
pop cx
Stack Top 是放 IP,我們傳給 sum procedure 的參數由 stack 的後一個 entry 開始讀取。
其它有關 asmlinkage
1. asmlinkage 是一個定義
2. "asmlinkage" 被定義在 /usr/include/linux/linkage.h
3. 如果您看了 linkage.h,會發現 "__attribute__" 這個語法,這是 gcc 用來定義 function attribute 的語法。
--jollen
相信大家在看linux的source code的时候,都会注意到asmlinkage这个宏,它是用来做什么的呢?
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.
看一下/usr/include/asm/linkage.h里面的定义:
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
__attribute__是关键字,是gcc的C语言扩展,regparm(0)表示不从寄存器传递参数
如果是__attribute__((regparm(3))),那么调用函数的时候参数不是通过栈传递,而是直接放到寄存器里,被调用函数直接从寄存器取参数。
- asmlinkage的作用
- asmlinkage的作用
- “asmlinkage” 的作用
- linux源码中asmlinkage的作用
- asmlinkage 的意义
- asmlinkage的用法
- asmlinkage
- asmlinkage
- asmlinkage
- asmlinkage
- asmlinkage
- asmlinkage
- asmlinkage
- asmlinkage
- asmlinkage
- asmlinkage
- asmlinkage
- asmlinkage
- [Leetcode] Search in Rotated Sorted Array II
- PHP用CURL伪造IP和来源
- Photoshop中改进ios设计流程的30个诀窍
- CSS的行内样式书写规范
- NOIP2008普及组参考答案和评分标准(PASCAL语言)
- asmlinkage的作用
- [android]为程序创建快捷方式
- jquery获取对象大全
- msdn
- 获取天气、快递、身份证接口
- libgdx的使用--环境搭建测试
- dedecms文章内容中加入网站地址
- java小技巧临时
- Ext4的decode与encode方法的一个小技巧