Subject is long to explain and I don't know what AN to suggest. But traditional (and IMO the best) concept of bootloader is this:
Bootloader along with bootloader vectors resides close to vectors area at 0xFFxx.
Bootloader and bootloaders vectors are write protected. (additional security, what if program update doesn't complete and power disappears/ reset happens etc). Write protection is done programming NVPROT location.
On reset, bootloader is started first. Bootloader verifies complettnes of application uploading process, or maybe checks application checksums.
If passed, then bootloader changes IVBR register setting to move vectors base address to where application vectors are expected. Application vectors probably should be just below bootloaders write protected area. And finally bootloader jumps to the contents of application reset vector address.
If application upload was not complete, or checksum doesn't match, then bootloader should awaiting for communication requests from CAN / SCI etc
For security reasons I recommend your bootloader should not autoerase application flash when application check doesn't pass. What if somewhat failed and bootloader didn't jump to application and is going to erase application...
Application and bootloader should be two separate applications.
Application should recognize some commands from communication channels, or maybe have dedicated pins to command jumping from application to bootloader. How you do it is up to you. Hovewer the recommended jump back to bootloader should be done using internal resets, maybe COP, maybe illegal address reset or any other. How bootloader will recognize which reset is normal reset and which was requested by application is again up to you.
In PRM reset vector should still point to _Startup, but vector should be moved to below bootloader write protected area.
VECTOR (0+ <bootloader size> / 2) _Startup
and for all other vectors:
VECTOR (X+ <bootloader size> / 2) vectorXaddress
Bootloader size divider by 2, because vector occupies 2 bytes. '+' sign because least vector occupies highest address.
Hope this helps