Gracias por tu respuesta amigo planeta9999, pero sigo con la duda.
Cuando corres un bootloader para modificar o actualizar el firmware de un dispositivo como yo lo entiendo es que en sí el bootloader no corre en la memoria que se va a modificar sino en otra. Hasta donde sé es lo que se llama(ba) shadow ram o memoria sombra.
Claro el bootloader, tiene que estar en una parte de la flash que no vamos a borrar, si no la liaríamos parda, y se bloquearía todo.
Todo el programa se almacena en la flash, normalmente el bootloader a partir de la primera dirección de la flash. Ese término de "shadow ram", no creo que sea aplicable a los microcontroladores, en todo caso a un PC y similares, para que los programas se ejecuten desde RAM más rápido, en un microcontrolador estamos muy limitados, TODO se ejecuta desde la flash, la RAM es solo para almacenar variables de trabajo.
Como lo entiendo es por ejemplo en el BIOS de una PC donde al arrancar todo el contenido del eprom es copiado a la zona ram correspondiente. De esa manera es que es posible actualizar el BIOS. El procedimiento ya no corre desde la eprom sino desde su imágen en ram. Entre otras cosas por eso es muy importante no interrumpir el proceso de actualización cuando se está ejecutando. Si se interrumpe, el contenido de la eprom quedaría dañado o incompleto.
Si eso en un PC, pero no es aplicable a los microcontroladores, date cuenta de que trabajamos con tamaños de flash y RAM muy pequeños en comparación con un PC.
1. ¿Es posible borrar el área de la memoria de programa en forma zonificada?
No es que sea posible, es que es obligatorio, por páginas, en los PIC32 son páginas de 4096 bytes, en otros micros más pequeños supongo que serán páginas de 1K o menos, yo hace muchos años que solo trabajo con PIC32, en cualquier caso la flash no se puede borrar por dirección, hay que borrar obligatoriamente un bloque de memoria, el tamaño de ese bloque ya dependerá de si el micro es de 8, 16, 32 bits...
2. En tu idea del bootloader, en sí el bootloader no puede ser cambiado ¿o sí?
Podría, pero es peligroso, si no se hace bien el PIC se quedaría bloqueado.
Aunque en principio parece algo absurdo, si que me lo planteé hace tiempo, para el caso de que algún fabricante (chino) me hackease alguna de mis placas, para esos casos liberar un firmware que regrabase el bootloader, se puede hacer, es decir que en vez de ser el bootloader el que actualiza el firmware, fuese el firware el que actualizase el bootloader. Siempre que no pises y borres la página en la que en ese momento se está ejecutando el programa, lo puedes hacer.
3. Para la modificación del área de programa el origen de la información ¿es siempre externo?
Es que interno, no tiene mucho sentido, una zona de la flash que actualice otra zona de la flash, ¿ para que quieres hacer eso ?.
Otra cosa es utilizar la flash para guardar variables que se conserven tras quitar alimentación al micro, en caso de que no tengas eeprom, como ocurre con los PIC32.
De hecho mi duda general parte de la última pregunta ya que es en sí lo que no me puedo imaginar. Que un programa en ejecución se pueda modificar a sí mismo partiéndo de las propias condiciones que encuentre.
Es que eso solo suele ocurrir en dos casos, un bootloader para actualizar fimware, y usar la flash simulando una eeprom, aunque en este segundo caso es para guardar datos, no programa.
Lo he visto en técnicas de AI (inteligencia artificial). El caso más clásico es en los algoritmos genéticos y evolutivos, pero no se me ocurre en un microcontrolador sobre todo porque dichas técnicas corren en ram y memoria secundaria (disco duros, etc.).
Ya, pero es que con los microcontroladores, jugamos con muy poca memoria, no se pueden aplicar algoritmos complejos para que el micro decida autoreprogramarse cuando quiera, reprogramar la flash desde el propio programa solo suele ser necesario en los bootloader, o cuando quieres usar la flash como memoria no volatil para guardar variables.