1)是的,它似乎但僅限於Linux。我想你可以依靠這裏描述的Linux約定:http://www.x86-64.org/documentation/abi.pdf。但實際上,你可以自由地傳遞參數它在intel assembly manual章6.3.3
2)使用堆棧描述的方法是在編譯器的方式:
int func(int i, int j, int k, int l, int m, int n, int o, int p, int q) { return q; }
void func2() { func(1, 2, 3, 4, 5, 6, 7, 8, 9); }
然後:
$ gcc -c func.c && objdump -d func.o
我的哪個x86_64的機器上輸出:
0000000000000000 <func>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 89 7d fc mov %edi,-0x4(%rbp)
7: 89 75 f8 mov %esi,-0x8(%rbp)
a: 89 55 f4 mov %edx,-0xc(%rbp)
d: 89 4d f0 mov %ecx,-0x10(%rbp)
10: 44 89 45 ec mov %r8d,-0x14(%rbp)
14: 44 89 4d e8 mov %r9d,-0x18(%rbp)
18: 8b 45 20 mov 0x20(%rbp),%eax
1b: 5d pop %rbp
1c: c3 retq
000000000000001d <func2>:
1d: 55 push %rbp
1e: 48 89 e5 mov %rsp,%rbp
21: 48 83 ec 18 sub $0x18,%rsp
25: c7 44 24 10 09 00 00 movl $0x9,0x10(%rsp)
2c: 00
2d: c7 44 24 08 08 00 00 movl $0x8,0x8(%rsp)
34: 00
35: c7 04 24 07 00 00 00 movl $0x7,(%rsp)
3c: 41 b9 06 00 00 00 mov $0x6,%r9d
42: 41 b8 05 00 00 00 mov $0x5,%r8d
48: b9 04 00 00 00 mov $0x4,%ecx
4d: ba 03 00 00 00 mov $0x3,%edx
52: be 02 00 00 00 mov $0x2,%esi
57: bf 01 00 00 00 mov $0x1,%edi
5c: e8 00 00 00 00 callq 61 <func2+0x44>
61: c9 leaveq
62: c3 retq
3)我想說的內核因爲你正在調用內核模塊中的函數。要獲得完整的有效示例,可以在模塊中從C中調用您的函數,並以與我一樣的方式反彙編.ko,以查看編譯器如何處理它。它應該是直截了當的。
我的理解是在用戶和內核之間的syscall接口中使用第四列(標記爲「x64(kernel)」)。對於內核中函數之間的調用,使用標準ABI(標記爲「x64(userland)」)。但是,我不是這方面的專家,所以如果我錯了,請有人糾正我。 –
對於一些特殊情況,研究__syscall –
@MarcovandeVoort:你能否詳細說明一下? –