mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC24H Write Protected Bootloader


Autor: Booty (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: fkaiser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.