关于 Golang Go语言在 Linux, amd64 平台下的系统调用问题
关于 Golang Go语言在 Linux, amd64 平台下的系统调用问题
正常来说,系统调用传参顺序是
EDI, ESI, EDX, ECX, R8, R9
看clone的系统调用时,发现传参顺序为 EDI, ESI, EDX, R10, R8, R9, R12
请问有什么原因吗
更多关于关于 Golang Go语言在 Linux, amd64 平台下的系统调用问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
比较了一下,发现我手里的 go1.15.1 的源码,和连接里的 go1.15.2 的代码又不一样了。。。
这些寄存器里到底哪些是传参的。。哪些是作为共享用的呢?
更多关于关于 Golang Go语言在 Linux, amd64 平台下的系统调用问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
linux 内核文档写的很清楚,RCX 和 R11 会在 x86_64 系统调用时被内核使用。
--------------------------------------arch/x86/entry.S-------------------------------------
* 64-bit SYSCALL saves rip to rcx, clears rflags.RF, then saves rflags to r11,
* then loads new ss, cs, and rip from previously programmed MSRs.
* rflags gets masked by a value from another MSR (so CLD and CLAC
* are not needed). SYSCALL does not save anything on the stack
* and does not change rsp.
*
* Registers on entry:
* rax system call number
* rcx return address
* r11 saved rflags (note: r11 is callee-clobbered register in C ABI)
* rdi arg0
* rsi arg1
* rdx arg2
* r10 arg3 (needs to be moved to rcx to conform to C ABI)
* r8 arg4
* r9 arg5
* (note: r12-r15, rbp, rbx are callee-preserved in C ABI)
------------------------------------------------------------------------------------------------
用户模式调用约定( calling convention ) 是 EDI, ESI, EDX, ECX, R8, R9
内核模式调用约定( 系统调用 ) 是 rdi,rsi,rdx,r10,r8 和 r9
你用 c 写个 printf 的程序看下汇编就懂了。
多谢各位的解答,原来调用普通函数和系统调用的传参顺序也不一样
关于Golang(Go语言)在Linux、amd64平台下的系统调用问题,以下是一些专业解答:
在Linux系统中,系统调用是用户进程与内核交互的桥梁,用于执行特定操作或获取系统信息。Go语言通过内置的syscall库提供了对Linux系统调用的访问。该库封装了Linux系统中的所有系统调用,并提供了统一的接口供程序员使用。
在Go语言中,常用的Linux系统调用包括打开文件(Open)、读取文件内容(Read)、写入文件内容(Write)、关闭文件(Close)以及删除文件(Remove)等。这些系统调用可以通过syscall库中的相应函数来实现。
在进行系统调用时,需要注意以下几点:
- 确保传递给系统调用的参数是有效的,否则可能会导致程序崩溃或系统不稳定。
- 系统调用的返回值需要仔细检查,以处理可能出现的错误情况。
- 不同的Linux发行版和内核版本可能会提供不同的系统调用或参数,因此在实际开发中需要参考相关文档和资料,以确保代码的兼容性和正确性。
总的来说,Go语言在Linux、amd64平台下通过syscall库可以方便地进行系统调用,但需要开发者对系统调用的原理和参数有深入的了解,以确保代码的正确性和稳定性。