bootdiskbuilder.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 148 行

JAVA
148
字号
/*
 * $Id: BootDiskBuilder.java,v 1.6 2004/02/08 12:28:26 epr Exp $
 */
package org.jnode.build;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import org.jnode.driver.ApiNotFoundException;
import org.jnode.driver.Device;
import org.jnode.driver.DriverException;
import org.jnode.driver.block.BlockDeviceAPI;
import org.jnode.driver.block.MappedBlockDeviceSupport;
import org.jnode.fs.FileSystemException;
import org.jnode.fs.fat.Fat;
import org.jnode.fs.fat.GrubBootSector;
import org.jnode.fs.fat.GrubFatFormatter;
import org.jnode.fs.partitions.ibm.IBMPartitionTableEntry;
import org.jnode.fs.partitions.ibm.IBMPartitionTypes;
import org.jnode.fs.util.Geometry;

/**
 * @author Ewout Prangsma (epr@users.sourceforge.net)
 */
public class BootDiskBuilder extends BootFloppyBuilder {

	private File plnFile;
	int bytesPerSector = 512;
	int spc = 1;
	private Geometry geom = new Geometry(64, 16, 32);
	private MappedBlockDeviceSupport part0;
	
	public BootDiskBuilder() {
	}

	/**
	 * Create the actual bootfloppy
	 * @throws IOException
	 * @throws DriverException
	 * @throws FileSystemException
	 */
	public void createImage() throws IOException, DriverException, FileSystemException {
		super.createImage();
		
		FileWriter fw = new FileWriter(plnFile);
		PrintWriter pw = new PrintWriter(fw);
		pw.println("DRIVETYPE ide");
		pw.println("CYLINDERS " + geom.getCylinders());
		pw.println("HEADS     " + geom.getHeads());
		pw.println("SECTORS   " + geom.getSectors());
		pw.println("CAPACITY  " + geom.getTotalSectors());
		pw.println("ACCESS    \"" + getDestFile().getCanonicalPath() + "\" 0 102400");
		pw.flush();
		fw.flush();
		pw.close();
		fw.close();
		System.out.println("Wrote " + plnFile);
	}
	
	/**
	 * Format the given device
	 * @param device
	 * @throws IOException
	 */
	protected void formatDevice(Device device) throws IOException {

		/* Format the MBR & partitiontable */		
		GrubBootSector mbr = (GrubBootSector)(createFormatter().getBootSector());
		
		mbr.getPartition(0).clear();
		mbr.getPartition(1).clear();
		mbr.getPartition(2).clear();
		mbr.getPartition(3).clear();
		
		IBMPartitionTableEntry pte = mbr.getPartition(0);
		pte.setBootIndicator(true);
		pte.setStartLba(1);
		pte.setNrSectors(geom.getTotalSectors() - 1);
		pte.setSystemIndicator(IBMPartitionTypes.PARTTYPE_DOS_FAT16_LT32M);
		pte.setStartCHS(geom.getCHS(pte.getStartLba()));
		pte.setEndCHS(geom.getCHS(pte.getStartLba() + pte.getNrSectors() - 1));
		
		/*System.out.println("partition table:");
		for (int i = 0; i < 4; i++) {
			System.out.println("" + i + " " + mbr.getPartition(i));
		}*/

		/* Format partition 0 */
		part0 = new MappedBlockDeviceSupport(device, pte.getStartLba() * bytesPerSector, pte.getNrSectors() * bytesPerSector);
		GrubFatFormatter ff = createFormatter();
		ff.setInstallPartition(0x0000FFFF);
		ff.format(part0);
		GrubBootSector part0bs = (GrubBootSector)ff.getBootSector();  
		
		/* Fixup stage2 sector in MBR */
		mbr.setStage2Sector(pte.getStartLba() + part0bs.getStage2Sector());
		try {
			mbr.write((BlockDeviceAPI)device.getAPI(BlockDeviceAPI.class));
		} catch (ApiNotFoundException ex) {
			throw new IOException("BlockDeviceAPI not found on device", ex);
		}
		//System.out.println("mbr stage2 sector=" + mbr.getStage2Sector());
	}
	
	/**
	 * @see org.jnode.build.BootFloppyBuilder#createFormatter()
 	 * @return The formatter
	 * @throws IOException
	 */
	protected GrubFatFormatter createFormatter() throws IOException {
		return new GrubFatFormatter(bytesPerSector, spc, geom, Fat.FAT16, 1, getStage1ResourceName(), getStage2ResourceName());
	}

	/**
	 * @see org.jnode.build.BootFloppyBuilder#getDeviceLength()
	 * @return The device length
	 */
	protected long getDeviceLength() {
		return geom.getTotalSectors() * bytesPerSector;
	}

	/**
	 * @return File
	 */
	public File getPlnFile() {
		return plnFile;
	}

	/**
	 * Sets the plnFile.
	 * @param plnFile The plnFile to set
	 */
	public void setPlnFile(File plnFile) {
		this.plnFile = plnFile;
	}

	/**
	 * @param rootDevice
	 * @see org.jnode.build.BootFloppyBuilder#getSystemDevice(Device)
	 * @return The device
	 */
	protected Device getSystemDevice(Device rootDevice) {
		return part0;
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?