用户空间中的抢先式多任务处理

时间:2013-11-16 13:51:42

标签: assembly x86-64 multitasking green-threads

我正在尝试在程序集中实现绿色线程/进程。

例如,我得到了带有两个循环的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.t1main.t2,同时保存一些寄存器并更改堆栈指针。

我理解如果在用户空间中这是不可能的,那么进程似乎不太可能改变正在运行的程序,因为这会引入一些安全漏洞。如果无法从用户空间完成,是否可以使用内核模块?

1 个答案:

答案 0 :(得分:0)

当然,在内核模式下也是可以的。使用来自计时器的中断。我无法弄清楚你对你的问题知道多少,如果谈论明显的事情,那就很抱歉。从实模式16位代码开始,它更简单。使用调度程序和线程编写.COM DOS程序(如果需要,可以稍后编写加载程序)。在调度程序/调度程序例程中设置定时器中断向量。编写调度程序(状态保存/加载例程)很简单:中断将保存CS:IP,保存其他寄存器是你的任务,加载相同。调度程序有点棘手,可能最简单的调度程序是“循环”,它只是在线程之间交替,为每个调度程序提供相同的时间段。您可以使用环链表实现它。 此外,在某些操作系统(* nix,afaik)中,可以使用信号执行相同的操作。