【问题标题】:Preemtive Multitasking in Userspace用户空间中的抢占式多任务
【发布时间】:2013-11-29 22:01:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: assembly x86-64 multitasking green-threads


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2018-06-15
      • 2016-09-26
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      • 2018-09-16
      • 1970-01-01
      相关资源
      最近更新 更多