die Urloader mdt Bezeichnung ist nicht gleich mit der Kernel mtd Zuordnung
Hmm ... ich sehe da keine (großen) Unterschiede, außer daß MTD0 in der Bootloader-Definition erst einmal eine Größe von 0 Bytes hat (die Angaben im Urlader-Environment sind ja jeweils Start- und Ende-Adresse) und daß MTD5 (für die JFFS2-Partition) NICHT existiert (was ja auch Sinn macht, denn die Art und Weise, wie diese Angaben zu den Partitionen im Bootloader gespeichert sind, läßt keine Veränderungen zu - außer durch ein Update des Konfigurationsbereichs im Bootloader, was aber mit einem hohen Risiko fürs "Bricken" verbunden ist, denn der liegt (bei UR8) am Offset 0x580 und damit INNERHALB des ersten Erase-Blocks), ist schon fast logisch - das ist praktisch ein "virtuelles MTD", wobei ALLE internen MTD-Strukturen natürlich erst bei der Kernel-Initialisierung angelegt werden. Alle anderen Angaben für MTD1 bis MTD4 sind aber 1:1 zwischen FRITZ!OS und EVA identisch - da gibt es Modelle, wo die Unterschiede noch VIEL größer sind und da stimmt dann die Nummerierung TATSÄCHLICH nicht überein.
Was auch richtig ist, dass bei einen Freetz Update mit Haken bei JFFS2 löschen, die Partition UND die Variable auf 16 zurückgesetzt werden.
Für mich (wenn ich Deine Aussagen richtig verstehe) ein typischer Fall von "confirmation bias":
https://github.com/Freetz/freetz/bl...es/root/usr/lib/mww/do_update_handler.sh#L171 - das mag zwar "am Ende der Kette" dann so aussehen, aber bei der Installation aus Freetz heraus wird lediglich "die volle Größe" der Kernel-/Dateisystem-Partition (MTD1) für das Flashen verwendet (was ja aus je einem "erase"- und einem "write"-Zyklus besteht und wenn für einen Block keine Daten vorliegen, bleibt der eben gelöscht), indem
kernel_update_len
auf diesen Wert gesetzt wird und zusätzlich wird dabei die Variable
jffs2_size
aus dem Urlader-Environment gelöscht (ein Schreibvorgang OHNE Wert löscht die betreffende ID im TFFS). Das alles geschieht VOR dem Aufruf von
/var/install
(nicht zu verwechseln mit "bereits beim Image-Build", da wird die
/var/install
nicht angefaßt) und der gesamte Rest wird wieder vom AVM-Code erledigt.
Der Kernel berechnet die maximale JFFS2 size
Viel wichtiger wäre (auch für eine "Zusammenfassung" der Erkenntnisse) ja die Frage gewesen, woher wohl
jffs2_earliest_start
stammt und siehe da, das wird dem SquashFS-Superblock (denn da steht die Größe des SquashFS-Images drin) entnommen (und danach dann "aligned", wenn nötig) und das ganze Lesen von
jffs2_size
aus dem Environment ist hier nur Show, denn
p
wird zwar in Zeile 264 zugewiesen (wenn der Wert existiert, ansonsten gibt
prom_getenv()
auch mal NULL zurück) und danach aber (innerhalb des Scope) gar nicht mehr verwendet:
C:
264 p = prom_getenv((char*)"jffs2_size");
265 /*--- printk("jffs2_size not set\n"); ---*/
266 mtd->read(mtd, (loff_t)pos, sizeof(struct squashfs_super_block), &readlen, (u_char*)&squashfs_sb);
267 jffs2_earliest_start = (u_int32_t)pos + (u_int32_t)squashfs_sb.bytes_used;
268 /*--- printk("squashfs pos: %x\n", (u_int32_t)pos); ---*/
269 /*--- printk("squashfs size: %x\n", (u_int32_t)squashfs_sb.bytes_used); ---*/
270 /*--- printk("jffs2_start (squashfs pos + len) = %x\n", (u_int32_t)jffs2_earliest_start); ---*/
271 if (jffs2_earliest_start & (mtd->erasesize-1)) {
272 /*--- printk("align jffs: start: %x\n", jffs2_earliest_start); ---*/
273 jffs2_earliest_start = (jffs2_earliest_start & ~(mtd->erasesize-1)) + mtd->erasesize;
274 }
275 /*--- printk("jffs2_earliest_start (aligned) = %x\n", jffs2_earliest_start); ---*/
276 jffs2_size = ((*p_mtd_pat)[0].offset + (*p_mtd_pat)[0].size - jffs2_earliest_start) >> 16;
277 /* jffs2_size in 64k Blöcken. Muss ggf. um 1 veringert werden für 128k Block Flash */
278 /*--- printk("jffs2_size = %x\n", jffs2_size); ---*/
279 jffs2_size = jffs2_size & ~((mtd->erasesize / 0x10000)-1);
280 /*--- printk("jffs2_size = %x\n", jffs2_size); ---*/
281 if (jffs2_size < (JFFS2_MIN_SIZE * (mtd->erasesize/0x10000))) {
282 printk(KERN_WARNING "[ur8_squashfs_parser_function]: not enough space for JFFS2!\n");
283 } else {
Damit ist
jffs2_size
(in diesem Code-Abschnitt) also am Ende IMMER irgendein Wert zwischen
JFFS2_MIN_SIZE
und
JFFS2_MAX_SIZE
und wird durch den Parser auch nicht neu gesetzt im Urlader-Environment, sondern erst durch die Abarbeitung der
S15-filesys
(s.
#47) neu geschrieben ... allerdings immer unter der Voraussetzung, daß noch mindestens
JFFS2_MIN_SIZE
Blöcke verfügbar sind, ansonsten entfällt das MTD für
jffs2
einfach bzw. behält seinen (ursprünglichen) Namen
reserved
, woraufhin es auch der Code in der
S15-filesys
nicht finden kann und daher dort gar nichts mountet.
Konnte das aber initialisiert werden, findet dann auch der Parser beim nächsten Start zuerst die JFFS2-Partition (siehe Kommentar in Zeile 76:
* Zuerst wird das JFFS2 gesucht, dann das Squash-FS!
- wobei der JFFS2-Parser ohnehin größere Schritte macht (nämlich in der Größe eines "erase blocks") und nicht die kleinen (256 Bytes), wie der SquashFS-Parser auf der Suche nach dem SquashFS-Magic) und damit wird das ganze Geraffel mit der neuen Berechnung der Größe auch nicht erneut ausgeführt und der (alte) Inhalt der JFFS2-formatierten Flash-Blöcke bleibt erhalten.
Wenn Du das tatsächlich oben auch so beschrieben haben solltest (bzw. es zumindest so gemeint war), dann habe ich das wohl nicht richtig verstanden.