1

(嗯,这是我第一次在这里提问,英语不是我的第一语言,所以请原谅我的一些错误。我是程序的新手。)

我在做操作系统作业时遇到了这个问题,我们被要求模拟函数SwitchToFiber,而我目前的问题是我不知道如何保存寄存器值以便在下次调用时恢复该函数。

我不知道我的问题是否清楚。虽然我不认为我的代码有用,但我会将它们放在下面。

#include <stdio.h>

#define INVALID_THD NULL
#define N 5
#define REG_NUM 32
unsigned store[N][REG_NUM];
typedef struct
{
    void (*address) (void * arg);
    void* argu;
}thread_s;

thread_s ts[N];

void StartThds();
void YieldThd();
void *CreateThd(void (*ThdFunc)(void*), void * arg);
void thd1(void * arg);
void thd2(void * arg);
void StartThds()
{

}

void YieldThd()
{
    thd2((void*)2);

}

void *CreateThd(void (*ThdFunc)(void*), void * arg)
{
    ts[(int)arg].address = (*ThdFunc);
    ts[(int)arg].argu = arg;
}

void thd2(void * arg)
{
    for (int i = 4; i < 12; i++)
    {
        printf("\tthd2: arg=%d , i = %d\n", (int)arg, i);
        //in order to see clearly,i added /t abouve
        YieldThd();
    }
}

void thd1(void * arg)
{
/* 
    __asm__(

    );
*/ 
    for (int i = 0; i < 12; i++)
    {
        printf("thd1: arg=%d , i = %d\n", (int)arg, i);
        YieldThd();
    }
}

int main()
{
    //this is my first plan, to store the register value in some static arry 
    for(int i = 0; i<N; i++)
        for(int j = 0; j<REG_NUM; j++)
            store[i][j] = 0;
    //create the two thread 
    if (CreateThd(thd1, (void *)1) == INVALID_THD)
    {
        printf("cannot create\n");
    }
    if (CreateThd(thd2, (void *)2) == INVALID_THD)
    {
        printf("cannot create\n");
    }


    ts[1].address(ts[1].argu);      //thd1((void*)1),argu = 1; 
//  StartThds();
    return 0;
}

这是我现在拥有的全部代码,因为我不知道哪个部分可能有用,所以我把它们都放在上面。如您所见,它们中的大多数仍然是空的。

4

2 回答 2

1

有可能(正如评论中指出的那样)您不需要为此编写程序集,也许您可​​以只使用 usingsetjmp()/longjmp()并让它们进行必要的状态保存。

于 2012-05-16T09:06:02.300 回答
0

我以前做过,但我总是要查看细节。以下当然只是伪代码。

基本上你所做的是用你的寄存器创建一个结构:

typedef struct regs {
   int ebx; //make sure these have the right size for the processors.
   int ecx;
   //...  for all registers you wish to backup
} registers;

//when changing from one thread
asm( //assembly varies from compiler to compiler check your manual
  "mov ebx, thread1.register.ebx;
   mov ecx, thread1.register.ecx;"
  // and so on

  //very important store the current program counter to the return address of this fu nction so we can continue from ther
  // you must know where the return address is stored
  "mov return address, thread1.register.ret"
);

//restore the other threads registers
asm(
  "mov thread2.register.ebx, ebx;
   mov thread2.register.ecx, ecx;
   //now restoer the pc and let it run
   mov thread2.register.ret, pc; //this will continue from where we stopped before
);

这或多或少是它的工作原理。既然你正在学习这个,你应该能够自己弄清楚其余的。

于 2012-05-16T09:25:35.157 回答