[Android Software Development] dk75:
The "100MB internal for every 500MB external" rule is practical one.

Since part of the data is still on internal (/data/data directory), then even if you use 3GB external with 100MB internal free, internal will be stuffed in no time and you will have "insufficient memory amount" error with 2.5GB free internal memory listed (internal, because due to "mounting" thing, external poses as internal memory).

It's a way a Linux file system works.

There you have physical devices, but you have access to them by bytes, not directories and files. but if you mount it in file system space, then this physical devices are accessible as part one, big file system.

There is ROOT directory, mother of them all, where everything starts.

In this ROOT directory you could mount other physical storage devices by assigning their file system access point to directory.

Thus normally, to /data directory (ROOT/data) there is /dev/block/mtdblock5 (HTC Magic) virtual device based in internal memory, assigned.

INT2EXT+ script exchange access point of /dev/block/mtdblock5 (internal) with /dev/mmcblk0p2 (external), so /dev/mmcblk0p2 (external) points to /data directory and /dev/block/mtdblock5 (internal) points to /sd-ext.

Then it copies everything from /dev/block/mtdblock5 | /sd-ext (former /data) to /dev/mmcblk0p2 | /data (former /sd-ext).

So everything from internal is on external now. But because of speed, internal /dev/block/mtdblock5 (now empty) is bind back to /data/data directory (because data form /data/data is used all the time by it's applications, like posts from mail application or events from calendar) - directory itself is on external now, but since it become mount point for other device then it points out to it, not to it's origin as directory.

Hmm... I'm thinking about some diagram for that:

If system install or run app, it don't care on which physical/virtual device it is, as long as it is in right place of file system.

So you can't say about memory merging. More like memory mapping.

As you can read in first post of this thread, INT2EXT+ map external to /data, which means /data/dalvik-cache and /data/app are on SD Card partition (two biggest directory in /data on a slow partition), but /data/data and few others are still in internal (these directories are smaller and needs to be on fast internal memory either because of speed or need to be accessed/available early in system start).

As for me, right now I've modified INT2EXT4+ in a way that /dev/block/mtdblock4/dalvik-cache (directory /cache/dalvik-cache on internal - 130MB free, not used for anything, always free) instead of /dev/mmcblk0p2/dalvik-cache (external on SD Card) is mapped to /data/dalvik-cache for speed.

And right now, my file system looks like that:

:~$ adb shell df -h
Filesystem Size Used Available Use% Mounted on
tmpfs 95.7M 32.0K 95.6M 0% /dev
tmpfs 95.7M 0 95.7M 0% /mnt/asec
tmpfs 95.7M 0 95.7M 0% /mnt/obb
/dev/block/mtdblock3 170.0M 153.7M 16.3M 90% /system
/dev/block/mtdblock4 130.0M 118.3M 11.7M 91% /cache
/dev/block/mmcblk0p2 503.9M 189.3M 289.0M 40% /data
/dev/block/mtdblock5 165.8M 116.0M 49.8M 70% /data/data
/dev/block/mtdblock5 165.8M 116.0M 49.8M 70% /data/property
/dev/block/mtdblock4 130.0M 118.3M 11.7M 91% /data/dalvik-cache
/dev/block/vold/179:1
14.2G 7.0G 7.2G 49% /mnt/sdcard
/dev/block/vold/179:1
14.2G 7.0G 7.2G 49% /mnt/secure/asec
:~$

and as you can see, my /dev/block/mtdblock4 | /cache | /data/dalvik-cache partition is filled in 91% and though my /dev/mmcblk0p2 | /data partition (EXT4 in SD Card) have 189MB free I cant use it all because dalvik-cache will be full earlier.

But that's what I'm prepare to sacrifice for speed that it gives me.