Мне кажется, вы все-же двигаетесь не в том направлении. Для начала: Загрузчик и Приложение должны быть совершенно независимыми проектами. Загрузчик должен находиться в нулевом секторе (ну, если не влезет - то и в последующих). Он программируется в нулевой сектор при производстве изделия и защищается от стирания битами защиты. Загрузчик стартует при включении питания, проверяет целостность приложения (каким конкретно образом - решать вам, обычно идет подсчет CRC) и если приложение цело - запускает его. Если приложение порушено или отсутствует (что в общем-то одно и то же) - остается в режиме загрузчика, тревожно мигает лампочками и ждет прошивку по UART. Все, что надо знать загрузчику - это откуда начинается приложение и какой его размер. Или, как второй вариант - размер приложения хранится в приложении по жестко зафиксированному адресу. Дальше гляньте обсуждение
тут . И еще
тут - правда про SAM7, но он тоже ARM.
Почитать на английском - да хотя бы апликашки по загрузчикам для AVR - AVR231, например. Оно хоть и совсем не ARM, но для общего развития будет полезно. Ну и
прект загрузчика из TNKernel тоже обязательно посмотрите.
То, что кейл кладет в нулевой сектор - это вектора исключений и стартап-код. Без них не бывает ни одной С-программы. В документации к вашему компилятору он должен быть описан. Ищите в документации слово startup. Причем, поскольку загрузчик и приложение - разные пректы, каждый из них должен иметь свой собственный независимый стартап. Для переключения между векторами исключения загрузчика и приложения удобно использовать remap.