Я экспериментирую с системным вызовом clone3() в Linux (появившимся в Linux 5.3) для создания потоков без использования стандартной библиотеки. Хотя существует множество примеров использования более старого системного вызова clone(), я не нашел четких примеров использования clone3() для создания потоков.
Что я пытаюсь сделать:
Создайте поток, используя системный вызов clone3() напрямую.
Реализуйте это без libc (-nostdlib).
Пусть поток выполнит простую функцию, которая печатает сообщение.
< р>Текущий поведение:
Программа аварийно завершает работу с SIGSEGV после печати «Создано». Вывод strace показывает:
Ядро Linux: 6.11.6
Я просмотрел документацию ядра и справочные страницы, но не смог найти конкретных примеров использование clone3() для создания потока. Буду признателен за любую помощь в понимании того, чего мне не хватает.
Я экспериментирую с системным вызовом clone3() в Linux (появившимся в Linux 5.3) для создания потоков без использования стандартной библиотеки. Хотя существует множество примеров использования более старого системного вызова clone(), я не нашел четких примеров использования clone3() для создания потоков. Что я пытаюсь сделать: Создайте поток, используя системный вызов clone3() напрямую. Реализуйте это без libc (-nostdlib). Пусть поток выполнит простую функцию, которая печатает сообщение. < р>Текущий поведение: Программа аварийно завершает работу с SIGSEGV после печати «Создано». Вывод strace показывает: [code]execve("./clone3", ["./clone3"], 0x7ffc16f11ca0 /* 43 vars */) = 0 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN|MAP_STACK, -1, 0) = 0x7156c433d000 clone3({flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND, exit_signal=0, stack=0x7156c433d000, stack_size=0x2000}, 88) = 9973 write(1, "C", 1C) = 1 write(1, "r", 1r) = 1 write(1, "e", 1e) = 1 write(1, "a", 1a) = 1 write(1, "t", 1t) = 1 write(1, "e", 1e) = 1 write(1, "d", 1d) = 1 --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x20040114d} --- +++ killed by SIGSEGV (core dumped) +++ fish: Job 1, 'strace ./clone3' terminated by signal SIGSEGV (Address boundary error) [/code] Код: [code]#define _GNU_SOURCE
#include #include #include #include #include
typedef int (*thread_fn)(void *arg);
static inline long syscall6(long n, long a1, long a2, long a3, long a4, long a5, long a6) { register long rax __asm__("rax") = n; register long rdi __asm__("rdi") = a1; register long rsi __asm__("rsi") = a2; register long rdx __asm__("rdx") = a3; register long r10 __asm__("r10") = a4; register long r8 __asm__("r8") = a5; register long r9 __asm__("r9") = a6;
long tid = clone3(&args); if (tid > 0) { write_str("Created thread!\n"); sleep_seconds(2); }
exit(0); __builtin_unreachable(); } [/code] Скомпилировано с помощью: [code]gcc clone3.c -static -nostdlib -fno-stack-protector -o clone3[/code] Ядро Linux: 6.11.6 Я просмотрел документацию ядра и справочные страницы, но не смог найти конкретных примеров использование clone3() для создания потока. Буду признателен за любую помощь в понимании того, чего мне не хватает.