The interrupt table is 0x28 bytes long (10 interrupt levels x 4 byte entries each), but there is some other space reserved by the sdk (an additional 0x30 bytes in the one i'm looking at) immediately following the IVT which is used by elib routines.
Rather than hard-code addresses in the source-code you should use sections to partition up your code, and then the addresses are either set in the linker file or automatically generated by it.
e.g. using the section names in the sdk:
char buffer[8192] __attribute__((section(".data_bank2));
When linked with the ldf files supplied in the sdk this will put buffer at 0x4000 as desired and take up the whole bank. You can also write your own linker files although the some features of the elib and libc requires certain stuff to be present.