to kill all the nonsense:
BDA is RAM, not ROM. The BIOS uses the BDA to do its internal affairs, so if you are in a position where you are still using the bios (indirectly via interrupts or not) you should not touch this.
In other words, keep out unless you
a) are in protected mode not going back to (un)real mode
b) need the memory
c) are absolutely sure you are not going to need it later.
The same holds for the IVT.
The *E*BDA however shall remain untouched since it is undefined and can be used by the BIOS even without you knowing it.
0xA0000 is VRAM, not ROM. You can write there.
"ROM"s are only between 0xC0000 and 0xFFFFF, possibly with holes, and even then it is more often RAM where the chipset has been programmed to ignore all writes so that it can't be changed.
Now I'd like you all to be a bit more careful about what you tell the OP (and everybody else in general) because it completely puts him off-track and annoys the competent people into flaming you. (although against the rules, you do deserve it

)
Back to the story
So if you load the kernel somewhere into memory where it can decently go (not in the IVT/BDA/EBDA), you jump to protected mode permanently, then from there copy the kernel to 0 making sure you don't overwrite anything you might need, then yes it should theoretically work.
That eliminates the design problems, and leaves the bugs.
I expect it to be something about a bad linker setup that makes the code think it should run somewhere where it should not, or that you indeed copy the kernel partially over its previous copy (and therefore suddenly put the processor in some random piece of code)