Да, сейчас написано в го. Но вам не нужен C, чтобы делать системные вызовы.
Важно отметить, что системные вызовы не «написаны на C.» Вы можете делать системные вызовы из C на Unix из-за <unistd.h>
. В частности, то, как Linux определяет этот заголовок, немного запутано, но из этого файла вы можете увидеть общую идею. Системные вызовы определяются с помощью имени и номера. Когда вы звоните, например, read
, то, что действительно происходит за кулисами, это то, что параметры устанавливаются в надлежащие регистры / память ( Linux ожидает номер системного вызова в eax
), за которым следует инструкция syscall
который прерывает огонь 0x80
. ОС уже настроила соответствующие обработчики прерываний, которые будут получать это прерывание, и ОС будет делать все, что нужно для этого системного вызова. Таким образом, вам не нужно что-то написанное на C (или стандартная библиотека в этом отношении) для создания системных вызовов. Вам просто нужно понять ABI вызова и знать номера прерываний.
Однако, как указывает @retgits, подход Голанга заключается в том, чтобы использовать тот факт, что libc уже обладает всей логикой для обработки системных вызовов. mksyscall.go
- это скрипт CLI, который анализирует эти файлы libc для извлечения необходимой информации.
На самом деле вы можете отследить жизнь системного вызова, если скомпилируете скрипт go, например:
package main
import (
"syscall"
)
func main() {
var buf []byte
syscall.Read(9, buf)
}
Запустите objdump -D
в полученном двоичном файле. Время выполнения go довольно велико, поэтому лучше всего найти функцию main
, посмотреть, где она вызывает syscall.Read
, а затем искать смещения оттуда: syscall.Read
звонки syscall.syscall
, syscall.syscall
звонки runtime.libcCall
(который переключается с совместимости go ABI на C ABI, так что аргументы находятся там, где ожидает ОС - вы можете увидеть это в runtime
, например, для Дарвина), runtime.libcCall
вызывает runtime.asmcgocall
и т. д.
Для дополнительного удовольствия, запустите этот двоичный файл с помощью gdb и продолжайте входить, пока вы не нажмете системный вызов.