"Hot" updating root-mounted mtd partitions
tmbinc at elitedvb.net
Tue Feb 25 18:51:08 EST 2003
i'm using MTD on a Linux Set-Top-Box, and i like to upgrade the (cramfs)
root FS, which is on a mtd, while the device is running.
Of course updating it (be it from internet, from satellite or whatever)
includes erasing and rewriting the root. This naturally causes troubles.
How can i avoid this?
- remount rootfs using an in-memory-copy (ramfs), but i don't think
this is possible, since there are many open files in the old fs.
- including ugly hacks in the flash driver, mainly by copying the
partition to RAM and redirect accesses to that backup while flashing the
both possibilities suck.
I tried the following: (with proper error checking, of course)
p=mmap(0, size, PROT_READ, MAP_SHARED|MAP_LOCKED,
to map the BLOCK(!)device mtdblock0 in memory. as block accesses are
chached, i thought, this should prevent them to go out of cache (=ram).
to enforce them to go into ram, i used
for (i=0; i<size; i+=PAGE_SIZE) (void)p[i];
Well, actually, it did help, but it's still not perfect. Sometimes the
application crashes with a busfault after erasing the root.
My question: is it possible to do that this way? If not - why not?
I know that the application might reload data of a.) itself or b.) used
fonts (it's a graphical application, based for example on freetype+ttf
fonts), so i cannot simple remove the root.
Is such a mmap "strong enough" ?
What else can i do? How is this normally done? Having a 2nd system in
flash is no choice.
More information about the linux-mtd