Michael Mamic
2018-08-16 07:32:20 UTC
Hello,
I am making a bare metal operating system for then Raspberry Pi, using
newlib as the standard library. I have implemented all of the syscalls
without trouble, the exception being _sbrk which always yields an error. My
simple implementation is below:
uint32_t sbrk(int incr) {
highest_addr+=incr;
if(highest_addr > 0x20000000) {
errno = ENOMEM;
return -1;
}
return highest_addr;
}
This implementation of sbrk is seemingly fine, but sbrk itself is called
with an incredibly large value for incr, 1431656813. This huge number
causes my memory to immediately overflow. After debugging, I have found
with almost absolute certainty that this call to sbrk comes when I call
printf, sometime before the text is sent to _write for dislay. My
installation of newlib comes from the libnewlib debian package, and it is
on the most recent update.
What could be the problem here, and is my implementation of sbrk adequate?
I am making a bare metal operating system for then Raspberry Pi, using
newlib as the standard library. I have implemented all of the syscalls
without trouble, the exception being _sbrk which always yields an error. My
simple implementation is below:
uint32_t sbrk(int incr) {
highest_addr+=incr;
if(highest_addr > 0x20000000) {
errno = ENOMEM;
return -1;
}
return highest_addr;
}
This implementation of sbrk is seemingly fine, but sbrk itself is called
with an incredibly large value for incr, 1431656813. This huge number
causes my memory to immediately overflow. After debugging, I have found
with almost absolute certainty that this call to sbrk comes when I call
printf, sometime before the text is sent to _write for dislay. My
installation of newlib comes from the libnewlib debian package, and it is
on the most recent update.
What could be the problem here, and is my implementation of sbrk adequate?