我正在按照https://graphitemaster.github.io/fibers/用 C 創建一個光纖執行緒系統。我有一個設定和恢復背景關系的功能,我想要完成的是啟動一個功能作為具有自己堆疊的光纖。Linux,x86_64 SysV ABI。
extern void restore_context(struct fiber_context*);
extern void create_context(struct fiber_context*);
void foo_fiber()
{
printf("Called as a fiber");
exit(0);
}
int main()
{
const uint32_t stack_size = 4096 * 16;
const uint32_t red_zone_abi = 128;
char* stack = aligned_alloc(16, stack_size);
char* sp = stack stack_size - red_zone_abi;
struct fiber_context c = {0};
c.rip = (void*)foo_fiber;
c.rsp = (void*)sp;
restore_context(&c);
}
其中 restore_context 代碼如下:
.type restore_context, @function
.global restore_context
restore_context:
movq 8*0(%rdi), %r8
# Load new stack pointer.
movq 8*1(%rdi), %rsp
# Load preserved registers.
movq 8*2(%rdi), %rbx
movq 8*3(%rdi), %rbp
movq 8*4(%rdi), %r12
movq 8*5(%rdi), %r13
movq 8*6(%rdi), %r14
movq 8*7(%rdi), %r15
# Push RIP to stack for RET.
pushq %r8
xorl
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/437335.html
標籤:c assembly x86-64 abi fibers
上一篇:在沒有分支操作碼的情況下測驗一個整數是否不同于eBPF中的其他兩個整數
下一篇:ARM7組裝-ADC立即為0
