我正在尝试在程序集中实现绿色线程/进程。
例如,我得到了带有两个循环的x64汇编代码(nasm语法)。它会输出很多'a',但我希望它输出'a'和'b'。这当然不是一个真实的例子,因为只结合两个循环就可以解决问题。
global main
extern printf
section .text
main:
.t1:
mov eax, 0
mov rdi, a
call printf
jmp .t1
.t2:
mov eax, 0
mov rdi, b
call printf
jmp .t2
section .data
a: db "a", 0
b: db "b", 0
所以我想编写某种调度程序,每隔几微秒就会将指令指针更改为main.t1
或main.t2
,同时保存一些寄存器并更改堆栈指针。
我理解如果在用户空间中这是不可能的,那么进程似乎不太可能改变正在运行的程序,因为这会引入一些安全漏洞。如果无法从用户空间完成,是否可以使用内核模块?
答案 0 :(得分:0)
当然,在内核模式下也是可以的。使用来自计时器的中断。我无法弄清楚你对你的问题知道多少,如果谈论明显的事情,那就很抱歉。从实模式16位代码开始,它更简单。使用调度程序和线程编写.COM DOS程序(如果需要,可以稍后编写加载程序)。在调度程序/调度程序例程中设置定时器中断向量。编写调度程序(状态保存/加载例程)很简单:中断将保存CS:IP,保存其他寄存器是你的任务,加载相同。调度程序有点棘手,可能最简单的调度程序是“循环”,它只是在线程之间交替,为每个调度程序提供相同的时间段。您可以使用环链表实现它。 此外,在某些操作系统(* nix,afaik)中,可以使用信号执行相同的操作。