Установить адрес стека для каждой функции - PullRequest
0 голосов
/ 12 марта 2020

Для специального программного обеспечения для управления памятью я хочу указать начальный адрес стека каждой функции. Его функциональность должна быть очень похожа на pthread_attr_setstackaddr, но вместо того, чтобы устанавливать адрес стека каждого потока, я хочу установить адрес стека каждой функции. Например, есть ли функция / способ, которым я могу установить адреса стека как:

SetFuncStack(main);
int main(){
  int a = 0;
  SetFuncStack(func1);
  func1();
  int b = 10;
  SetFuncStack(func2);
  func2();
  return 0;
}

Спасибо за любое предложение!

ОБНОВЛЕНИЕ: Так что я открыт для любых возможных методов, например, Я в порядке, если мне нужно изменить компилятор или какой-либо код ядра. Я просто не уверен, как мне это сделать.

1 Ответ

0 голосов
/ 12 марта 2020

Нечто подобное возможно. Для планирования ЦП мы используем библиотеку ucontext.h, которая дает вам доступ к блоку контекста для хранения функции, стека и других вещей. Вы должны поддерживать RunQ контекстных блоков. Чтобы добавить в RunQ, позвоните allocate_context(function); с:

void allocate_context(void (*function) (void)){
    ucontext_t* context = (ucontext_t*)malloc(sizeof(ucontext_t)); //allocate a context block
    int* stack = malloc(8192); //allocate a stack of 8192 bytes
    init_Context(Context, function, stack, sizeof(stack)); //call init_TCB
    AddQueue(RunQ, TCB); //call addQ to add this TCB into the "RunQ" 
}

    void init_Context (ucontext_t context, void (*function) (void), void *stackP, int stack_size){
    memset(context, '\0', sizeof(ucontext_t)); // wash, rinse
    getcontext(context); //get parent context
    context.uc_stack.ss_sp = stackP; 
    context.uc_stack.ss_size = (size_t) stack_size;
    makecontext(context, function, 0); // context is now cooked
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...