It's basically what I just described (and this is what I did and what worked for me). If you have a working rootfs it should also be possible to include that into the BSP and let it build a whole image.
But I prefer to replace the sectors of my image since the image's contents are work in progress. I'm doing some research on dfvs/cpufreq settings as already mentioned: https://groups.google.com/d/msg/linux-sunxi/CXx2MzMuujU/Y75MZpbpCwAJ
If you do the whole stuff not from within the running image then you've to replace /dev/mmcblk0p1 with either mountpoint of the SD-card or the path to the image. On OS X I used prior to 'full automatisation' this manual approach:
bash-3.2# cat update-sd-card.sh
#!/bin/bash
MyDisk=$1
if [ "$(id -u)" != "0" ]; then
echo "This script must be executed as root. Exiting" >&2
exit 1
fi
case ${MyDisk} in
disk*)
:
;;
*)
exit 1
;;
esac
ssh $buildhost "/var/git/M3/BPI-M3-bsp/build-stuff.sh"
rm -rf BPI_M3_1080P
rsync -a $buildhost:/var/git/M3/BPI-M3-bsp/output/BPI_M3_1080P .
diskutil unmountDisk ${MyDisk} || exit 1
if [ ! -f BPI_M3_1080P/pack/boot0_sdcard.fex ]; then
echo "Can't find the archive's contents. Giving up." >&2
exit 1
fi
dd if=BPI_M3_1080P/pack/boot0_sdcard.fex of=/dev/r${MyDisk} bs=1k seek=8
dd if=BPI_M3_1080P/pack/u-boot.fex of=/dev/r${MyDisk} bs=1k seek=19096
dd if=BPI_M3_1080P/pack/boot-resource.fex of=/dev/r${MyDisk} bs=1k seek=36864
dd if=BPI_M3_1080P/pack/env.fex of=/dev/r${MyDisk} bs=1k seek=69632
dd if=BPI_M3_1080P/kernel/boot.img of=/dev/r${MyDisk} bs=1k seek=86016
sleep 0.2
diskutil eject ${MyDisk}
But since I also had to replace /lib/modules I chose to fully automate it from within the running image. It's fire and forget