История изменений
Исправление X512, (текущая версия) :
Фсмысле??? Нет, не может. Сегмент стека программы это сегмент стека программы.
Держите код для создания своего стека, даже ассемблер не понадобился:
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
#include <string.h>
void SwitchStack(void *stack, size_t stackSize, void (*Entry)(jmp_buf, void*), void *arg)
{
jmp_buf oldCtx, ctx;
if (setjmp(oldCtx) == 0) {
size_t **fp = NULL;
size_t *sp = (size_t*)((char*)stack + stackSize);
printf("stack end: %p\n", sp);
sp--; *sp = (size_t)arg;
sp--; *sp = (size_t)oldCtx;
sp--; *sp = 0; // return address
memset(ctx, 0, sizeof(ctx));
ctx[0].regs[3] = (size_t)fp;
ctx[0].regs[4] = (size_t)sp;
ctx[0].regs[5] = (size_t)Entry;
longjmp(ctx, 1);
}
}
void StackEntry(jmp_buf oldCtx, void *arg)
{
printf("+StackEntry: %s\n", (char*)arg);
jmp_buf probeCtx;
setjmp(probeCtx);
printf("SP: %p, ", probeCtx[0].regs[4]);
printf("FP: %p\n", probeCtx[0].regs[3]);
printf("-StackEntry\n");
longjmp(oldCtx, 1);
}
int main()
{
printf("+main\n");
jmp_buf probeCtx;
setjmp(probeCtx);
printf("SP: %p, ", probeCtx[0].regs[4]);
printf("FP: %p\n", probeCtx[0].regs[3]);
size_t stackSize = 1024*1024;
void *stack = malloc(stackSize);
SwitchStack(stack, stackSize, StackEntry, (void*)"This is a test.");
free(stack); stack = NULL;
printf("-main\n");
return 0;
}
Вывод:
+main
SP: 0x71d54520, FP: 0x71d54588
stack end: 0x18245130
+StackEntry: This is a test.
SP: 0x182450d8, FP: 0x18245120
-StackEntry
-main
И никакого больше системного стека. Код для 32 бит потому что лень возиться с регистрами соглашения вызовов x86-64.
Для системы.
У вас какой-то культ поклонения системе. Система — это просто инструмент. Можно пользоваться частью её функционала, а можно нет.
Исправление X512, :
Фсмысле??? Нет, не может. Сегмент стека программы это сегмент стека программы.
Держите код для создания своего стека, даже ассемблер не понадобился:
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
#include <string.h>
void SwitchStack(void *stack, size_t stackSize, void (*Entry)(jmp_buf, void*), void *arg)
{
jmp_buf oldCtx, ctx;
if (setjmp(oldCtx) == 0) {
size_t **fp = NULL;
size_t *sp = (size_t*)((char*)stack + stackSize);
printf("stack end: %p\n", sp);
sp--; *sp = (size_t)arg;
sp--; *sp = (size_t)oldCtx;
sp--; *sp = 0; // return address
memset(ctx, 0, sizeof(ctx));
ctx[0].regs[3] = (size_t)fp;
ctx[0].regs[4] = (size_t)sp;
ctx[0].regs[5] = (size_t)Entry;
longjmp(ctx, 1);
}
}
void StackEntry(jmp_buf oldCtx, void *arg)
{
printf("+StackEntry: %s\n", (char*)arg);
jmp_buf probeCtx;
setjmp(probeCtx);
printf("SP: %p, ", probeCtx[0].regs[4]);
printf("FP: %p\n", probeCtx[0].regs[3]);
printf("-StackEntry\n");
longjmp(oldCtx, 1);
}
int main()
{
printf("+main\n");
jmp_buf probeCtx;
setjmp(probeCtx);
printf("SP: %p, ", probeCtx[0].regs[4]);
printf("FP: %p\n", probeCtx[0].regs[3]);
size_t stackSize = 1024*1024;
void *stack = malloc(stackSize);
SwitchStack(stack, stackSize, StackEntry, (void*)"This is a test.");
free(stack); stack = NULL;
printf("-main\n");
return 0;
}
И никакого больше системного стека. Код для 32 бит потому что лень возиться с регистрами соглашения вызовов x86-64.
Для системы.
У вас какой-то культ поклонения системе. Система — это просто инструмент. Можно пользоваться частью её функционала, а можно нет.
Исходная версия X512, :
Фсмысле??? Нет, не может. Сегмент стека программы это сегмент стека программы.
Держите код для создания своего стека, даже ассемблер не понадобился:
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
#include <string.h>
void SwitchStack(void *stack, size_t stackSize, void (*Entry)(jmp_buf, void*), void *arg)
{
jmp_buf oldCtx, ctx;
if (setjmp(oldCtx) == 0) {
size_t **fp = NULL;
size_t *sp = (size_t*)((char*)stack + stackSize);
printf("stack end: %p\n", sp);
sp--; *sp = (size_t)arg;
sp--; *sp = (size_t)oldCtx;
sp--; *sp = 0; // return address
memset(ctx, 0, sizeof(ctx));
ctx[0].regs[3] = (size_t)fp;
ctx[0].regs[4] = (size_t)sp;
ctx[0].regs[5] = (size_t)Entry;
longjmp(ctx, 1);
}
}
void StackEntry(jmp_buf oldCtx, void *arg)
{
printf("+StackEntry: %s\n", (char*)arg);
jmp_buf probeCtx;
setjmp(probeCtx);
printf("SP: %p, ", probeCtx[0].regs[4]);
printf("FP: %p\n", probeCtx[0].regs[3]);
printf("-StackEntry\n");
longjmp(oldCtx, 1);
}
int main()
{
printf("+main\n");
jmp_buf probeCtx;
setjmp(probeCtx);
printf("SP: %p, ", probeCtx[0].regs[4]);
printf("FP: %p\n", probeCtx[0].regs[3]);
size_t stackSize = 1024*1024;
void *stack = malloc(stackSize);
SwitchStack(stack, stackSize, StackEntry, (void*)"This is a test.");
free(stack); stack = NULL;
printf("-main\n");
return 0;
}
И никакого больше системного стека. Код для 32 бит потому что лень возиться с регистрами соглашения вызовов x86-64.
Для системы.
У вас какой-то культ поклонения системе. Система — это просто инструмент. Можно пользоваться частью её функционала, а можно нет.