I have to package my kernel into a fat partition and load it up using grub, but mac doesn’t has a mkfs.vfat and “mount loopback” command. So I am creating a small programing using https://github.com/waldheinz/fat32-lib/ to manipulate the fat image by myself. So far these two small program can read & write a fat image:
Read Fat32:
package peter; import java.io.File; import java.nio.ByteBuffer; import java.util.Iterator; import de.waldheinz.fs.FsDirectory; import de.waldheinz.fs.FsDirectoryEntry; import de.waldheinz.fs.FsFile; import de.waldheinz.fs.fat.BootSector; import de.waldheinz.fs.fat.FatFileSystem; import de.waldheinz.fs.util.FileDisk; public class Fat32Lib_ReadTest { public static void main(String[] args) { try { File file = new File("peter.img"); if (!file.exists()) { System.out.println(file.getName() + " not exist"); } FileDisk rd = new FileDisk(file, false); FatFileSystem fatFs = FatFileSystem.read(rd, true); BootSector bs = fatFs.getBootSector(); System.out.println(bs.getOemName()); FsDirectory fatRootDir = fatFs.getRoot(); Iterator<FsDirectoryEntry> i = fatRootDir.iterator(); while (i.hasNext()) { final FsDirectoryEntry e = i.next(); System.out.println(" - " + e); FsDirectory dir = e.getDirectory(); Iterator<FsDirectoryEntry> i2 = dir.iterator(); while (i2.hasNext()) { final FsDirectoryEntry e2 = i2.next(); System.out.println(" - " + e2); if (e2.isFile()) { FsFile f = e2.getFile(); System.out.println(" File = " + e2.getName() + ", " + f.getLength()); ByteBuffer buff = ByteBuffer.allocate((int) f.getLength()); f.read(0, buff); System.out.println(new String(buff.array(), "utf8")); } } } } catch (Exception ex) { ex.printStackTrace(); } System.out.println("done"); } }
Write to Fat32
package peter; import java.io.File; import java.nio.ByteBuffer; import de.waldheinz.fs.FsDirectoryEntry; import de.waldheinz.fs.FsFile; import de.waldheinz.fs.fat.FatFileSystem; import de.waldheinz.fs.fat.FatLfnDirectory; import de.waldheinz.fs.fat.FatLfnDirectoryEntry; import de.waldheinz.fs.fat.FatType; import de.waldheinz.fs.fat.SuperFloppyFormatter; import de.waldheinz.fs.util.FileDisk; public class Fat32Lib_WriteTest { public static void main(String[] args) { try { File file = new File("peter.img"); if (!file.delete()) { System.out.println("unable to delete " + file.getName()); } FileDisk dev = FileDisk.create(file, 40 * 1024 * 1024); SuperFloppyFormatter sf = SuperFloppyFormatter.get(dev); sf.setOemName("Peter32"); sf.setVolumeLabel("Peter Fat32"); sf.setFatType(FatType.FAT32); sf.format(); FatFileSystem fs = new FatFileSystem(dev, false); final FatLfnDirectory rootDir = (FatLfnDirectory) fs.getRoot(); FatLfnDirectoryEntry entry = rootDir.addDirectory("Directory"); for (int i = 0; i < 10; i++) { final FsDirectoryEntry e = entry.getDirectory().addFile("file_" + i); final FsFile fsFile = e.getFile(); byte[] nullBytes = "Peter 你好 UTF8\n".getBytes(); ByteBuffer buff = ByteBuffer.wrap(nullBytes); buff.rewind(); fsFile.write(0, buff); } fs.flush(); fs.close(); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("done"); } }