1

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

例如,我得到了这个带有两个循环的 x64 汇编代码(nasm 语法)。它输出很多'a',但我希望它输出'a's和'b's。这当然不是一个真实的例子,因为只需将两个循环结合起来就可以解决问题。

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每隔几微秒,同时保存一些寄存器并更改堆栈指针。

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

4

1 回答 1

0

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

于 2013-11-16T20:09:32.893 回答