Zhang Jiuan’ Notes

asmlinkage, linux源代码

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 取参数(可能发生在程式码最佳化後)。

更进一步的说明…

80×86 的 assembly 有 2 种传递参数的方法:

1. register method
2. stack method

Register method 大多使用一般用途(general- purpose)暂存器来传递参数,这种方法的好处是简单且快速。弢r />??外一种传递参数的做法是使用 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 的语法。

If you enjoyed this post, make sure you subscribe to my RSS feed!

No Comments, Comment or Ping

Reply to “asmlinkage, linux源代码”

You must be logged in to post a comment.

返回顶部