Forum: Mikrocontroller und Digitale Elektronik PIC24H Write Protected Bootloader


von Booty (Gast)


Lesenswert?

Vielleicht kann mir ja hier jemand helfen...

Ich habe einen SD Card Bootloader für den p24HJ256GP210. Funktioniert 
auch. Nun möchte ich den Bootloader vor überschreiben durch die 
Applikation schützen. Ich verwende C30.

Laut Datenblatt ist der Schreibschutz nur wirksam wenn ein Bootsegment 
definiert ist, d.h. obwohl ich die ganzen CodeGuard features eigentlich 
nicht verwenden möchte, muß ich diese entsprechend konfigurieren.

Weiterhin habe ich mittlerweile verstanden das jede Funktion des 
Bootloaders mit dem entsprechenden "Boot Attribut" versehen werden muß 
damit diese auch im Boot Segment abgelegt wird (und nicht im General 
Segment). Compiler Libraries können auch nicht verwendet werden, d.h. 
ich muss für z.B. free und malloc eine andere Lösung finden.

Hier meine Fragen:
- Ist es wirklich so kompliziert?
- Gibt es keine einfachere Möglichkeit einen bestimmten Bereich im Flash 
als Schreibgeschützt zu definieren?

Danke!

von fkaiser (Gast)


Lesenswert?

Hallo Booty,

ich stehe vor dem selben Problem!

Sobald man über die Configuration Bits das CodeGuard aktiviert, muss man 
für jede funktion "__attribute__ ((boot)) schreiben.

z.B. void _attribute_ ((boot)) main(void){...}


Das reicht aber noch nicht.

Problem ist, dass der Linker den C Starup Code NICHT in das Bootsegment 
schreibt, sondern direkt danach. Folglich springt der Controller erst 
mal in den Ungeschützden Bereich NACH dem Bootloader, macht dort C 
Startup, und springt dann wieder zurück in den Bootloader.
Was natürlich quatsch ist, wenn man nen sicheren Bootloader haben will.

Im Linker script seieh man oben folgende Zeilen:

CRT0_STARTUP(crt0_standard.o)
CRT1_STARTUP(crt1_standard.o)

Man sucht sich die crt0_standard.S aus dem libpic30.zip im C30 ordner 
und kopiert sie ins Projekt. Nennt sie ggf. um und bearbeitet in ihr 
folgende Zeile (30):
.section .boot_resetvector, code

um in:
.section .boot_resetvector, code, boot    ; optional noch dazu: 
ADDRESS(0x200)

Im Linker script dannnoch den Dateinamen anpassen in die entsprechende 
.o

Dann ist schon mal der startup code an der stelle wo man möchte.

Allerdings noch nicht ganz!

Wenn man sich die crt0_standard.S ansieht, greift sie in ziele 70 auf 
eine funktion namens "__data_init_standard" zu. Diese ist wie ich 
herausgefunden habe ebefalls in der libpic30.zip in der datei 
"data_init_standard.S" enthalten.

Diese wird wegen dem fehlenden boot ebenfalls ins General segment 
gelegt.
Also ist man weider fast so weit wie zufor!

Leider kann man diese nicht so einfach ins Projekt einbinden und 
umschreiben. Weil der Linker selbstständig darauf zugreift...

Wenn uns das noch gelingen würde, wäre das Problem gelöst.
Evtl kommt ja von euch jemand drauf!?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.