LINUX.ORG.RU

История изменений

Исправление 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.

Для системы.

У вас какой-то культ поклонения системе. Система — это просто инструмент. Можно пользоваться частью её функционала, а можно нет.