Eu estou precisando de ideias de como alocar memoria numa stack de 16KiB. Tenho que fazer uma função simples que rode em sistemas x86 bare metal (com PM, ou seja, 32 bits).
A função tem que retornar um ponteiro para o local de memória e ter a capacidade de informar o tamanho em bytes da alocação (necessário para contrução da stack frame).
algo como void* alocar(size_t tamanho); com um uso tipo uint8_t* buffer = (uint8_t*) alocar(8 * sizeof(char)); nesse caso seriam alocados 8 bytes .
Sim eu sei, porem estou rodando um ambiente gcc standalone sendo assim a LibC nao existe ja que eu basicamente eatou compilando codigo generico.
Preciso entao de uma solucao minimalista de alocaçao, ja estudei o codigo fonte da GLibC porem e algo complexo e que depende de outros headers e sistemas da GLibC que eu nao pretendo implentar, isto dito ja que a especificacao da LibGCC diz que devemos implementar por nos mesmo as funcoes memcmp, memcpy, memmove, memset e abort ja foram implementadas de forma prototipica (funcionam porem com limitacoes, por exemplo a abort que so chama uma subrotina assembly cli hlt jmp $).
Sobre o meu compilador eu compilei o GCC 8.3.0 com binutils 2.32 com as flags:
Binutils: --target=i686-elf --prefix="/home/lucas/gcc8.3-elf" --with-sysroot --disable-nls --disable-werror
GCC: --target=i686-elf --prefix="/home/lucas/gcc8.3-elf" --disable-nls --enable-languages=c,c++ --without-headers
No caso do GCC eu construi com:
make all-gcc && make all-target-libgcc