├── README.md └── OperatingSystem ├── boot.bat ├── system.img ├── bin ├── Floppy.class ├── OperatingSystem.class └── Floppy$MAGNETIC_HEAD.class ├── boot.asm └── src ├── OperatingSystem.java └── Floppy.java /README.md: -------------------------------------------------------------------------------- 1 | # OS-kernel-development 2 | host very phase of my os kernel code 3 | -------------------------------------------------------------------------------- /OperatingSystem/boot.bat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wycl16514/OS-kernel-development/HEAD/OperatingSystem/boot.bat -------------------------------------------------------------------------------- /OperatingSystem/system.img: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wycl16514/OS-kernel-development/HEAD/OperatingSystem/system.img -------------------------------------------------------------------------------- /OperatingSystem/bin/Floppy.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wycl16514/OS-kernel-development/HEAD/OperatingSystem/bin/Floppy.class -------------------------------------------------------------------------------- /OperatingSystem/bin/OperatingSystem.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wycl16514/OS-kernel-development/HEAD/OperatingSystem/bin/OperatingSystem.class -------------------------------------------------------------------------------- /OperatingSystem/bin/Floppy$MAGNETIC_HEAD.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wycl16514/OS-kernel-development/HEAD/OperatingSystem/bin/Floppy$MAGNETIC_HEAD.class -------------------------------------------------------------------------------- /OperatingSystem/boot.asm: -------------------------------------------------------------------------------- 1 | org 0x7c00; 2 | 3 | jmp entry 4 | db 0x90 5 | DB "OSKERNEL" 6 | DW 512 7 | DB 1 8 | DW 1 9 | DB 2 10 | DW 224 11 | DW 2880 12 | DB 0xf0 13 | DW 9 14 | DW 18 15 | DW 2 16 | DD 0 17 | DD 2880 18 | DB 0,0,0x29 19 | DD 0xFFFFFFFF 20 | DB "MYFIRSTOS " 21 | DB "FAT12 " 22 | RESB 18 23 | 24 | entry: 25 | mov ax, 0 26 | mov ss, ax 27 | mov ds, ax 28 | mov es, ax 29 | mov si, msg 30 | 31 | 32 | readFloppy: 33 | mov CH, 1 ;CH 用来存储柱面号 34 | mov DH, 0 ;DH 用来存储磁头号 35 | mov CL, 2 ;CL 用来存储扇区号 36 | 37 | mov BX, msg ; ES:BX 数据存储缓冲区 38 | 39 | mov AH, 0x02 ; AH = 02 表示要做的是读盘操作 40 | mov AL, 1 ; AL 表示要练习读取几个扇区 41 | mov DL, 0 ;驱动器编号,一般我们只有一个软盘驱动器,所以写死 42 | ;为0 43 | INT 0x13 ;调用BIOS中断实现磁盘读取功能 44 | 45 | jc error 46 | 47 | putloop: 48 | mov al, [si] 49 | add si, 1 50 | cmp al, 0 51 | je fin 52 | mov ah, 0x0e 53 | mov bx, 15 54 | int 0x10 55 | jmp putloop 56 | 57 | 58 | 59 | fin: 60 | HLT 61 | jmp fin 62 | 63 | error: 64 | mov si, errmsg 65 | jmp putloop 66 | 67 | msg: 68 | RESB 64 69 | errmsg: 70 | DB "error" 71 | -------------------------------------------------------------------------------- /OperatingSystem/src/OperatingSystem.java: -------------------------------------------------------------------------------- 1 | import java.io.DataOutputStream; 2 | import java.io.File; 3 | import java.io.FileInputStream; 4 | import java.io.FileNotFoundException; 5 | import java.io.FileOutputStream; 6 | import java.io.IOException; 7 | import java.io.InputStream; 8 | import java.util.ArrayList; 9 | 10 | 11 | public class OperatingSystem { 12 | 13 | private Floppy floppyDisk = new Floppy(); 14 | 15 | 16 | 17 | private void writeFileToFloppy(String fileName) { 18 | File file = new File(fileName); 19 | InputStream in = null; 20 | 21 | try { 22 | in = new FileInputStream(file); 23 | byte[] buf = new byte[512]; 24 | buf[510] = 0x55; 25 | buf[511] = (byte) 0xaa; 26 | if (in.read(buf) != -1) { 27 | //将内核读入到磁盘第0面,第0柱面,第1个扇区 28 | floppyDisk.writeFloppy(Floppy.MAGNETIC_HEAD.MAGNETIC_HEAD_0, 0, 1, buf); 29 | } 30 | } catch(IOException e) { 31 | e.printStackTrace(); 32 | return; 33 | } 34 | } 35 | 36 | public OperatingSystem(String s) { 37 | writeFileToFloppy(s); 38 | } 39 | 40 | public void makeFllopy() { 41 | String s = "This is a text from cylinder 1 and sector 2"; 42 | floppyDisk.writeFloppy(Floppy.MAGNETIC_HEAD.MAGNETIC_HEAD_0, 1, 2, s.getBytes()); 43 | 44 | floppyDisk.makeFloppy("system.img"); 45 | } 46 | 47 | 48 | 49 | public static void main(String[] args) { 50 | OperatingSystem op = new OperatingSystem("boot.bat"); 51 | op.makeFllopy(); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /OperatingSystem/src/Floppy.java: -------------------------------------------------------------------------------- 1 | import java.io.DataOutputStream; 2 | import java.io.FileOutputStream; 3 | import java.util.ArrayList; 4 | import java.util.HashMap; 5 | 6 | 7 | public class Floppy { 8 | enum MAGNETIC_HEAD { 9 | MAGNETIC_HEAD_0, 10 | MAGETIC_HEAD_1 11 | }; 12 | 13 | 14 | public int SECTOR_SIZE = 512; 15 | private int CYLINDER_COUNT = 80; //80个柱面 16 | private int SECTORS_COUNT = 18; 17 | private MAGNETIC_HEAD magneticHead = MAGNETIC_HEAD.MAGNETIC_HEAD_0; 18 | private int current_cylinder = 0; 19 | private int current_sector = 0; 20 | 21 | private HashMap> > floppy = new HashMap> >(); //一个磁盘两个面 22 | 23 | public Floppy() { 24 | 25 | initFloppy(); 26 | } 27 | 28 | private void initFloppy() { 29 | 30 | //一个磁盘有两个盘面 31 | floppy.put(MAGNETIC_HEAD.MAGNETIC_HEAD_0.ordinal(), initFloppyDisk()); 32 | floppy.put(MAGNETIC_HEAD.MAGETIC_HEAD_1.ordinal(), initFloppyDisk()); 33 | } 34 | 35 | private ArrayList> initFloppyDisk() { 36 | ArrayList> floppyDisk = new ArrayList>(); //磁盘的一个面 37 | //一个磁盘面有80个柱面 38 | for(int i = 0; i < CYLINDER_COUNT; i++) { 39 | floppyDisk.add(initCylinder()); 40 | } 41 | 42 | return floppyDisk; 43 | } 44 | 45 | private ArrayList initCylinder() { 46 | //构造一个柱面,一个柱面有18个扇区 47 | ArrayList cylinder = new ArrayList (); 48 | for (int i = 0; i < SECTORS_COUNT; i++) { 49 | byte[] sector = new byte[SECTOR_SIZE]; 50 | cylinder.add(sector); 51 | } 52 | 53 | return cylinder; 54 | } 55 | 56 | public void setMagneticHead(MAGNETIC_HEAD head) { 57 | magneticHead = head; 58 | } 59 | 60 | public void setCylinder(int cylinder) { 61 | if (cylinder < 0) { 62 | this.current_cylinder = 0; 63 | } 64 | else if (cylinder >= 80) { 65 | this.current_cylinder = 79; 66 | } 67 | else { 68 | this.current_cylinder = cylinder; 69 | } 70 | } 71 | 72 | public void setSector(int sector) { 73 | //sector 编号从1到18 74 | if (sector < 0) { 75 | this.current_sector = 0; 76 | } 77 | else if (sector > 18) { 78 | this.current_sector = 18 - 1; 79 | } 80 | else { 81 | this.current_sector = sector - 1; 82 | } 83 | } 84 | 85 | public byte[] readFloppy(MAGNETIC_HEAD head, int cylinder_num, int sector_num) { 86 | setMagneticHead(head); 87 | setCylinder(cylinder_num); 88 | setSector(sector_num); 89 | 90 | ArrayList> disk = floppy.get(this.magneticHead.ordinal()); 91 | ArrayList cylinder = disk.get(this.current_cylinder); 92 | 93 | byte[] sector = cylinder.get(this.current_sector); 94 | 95 | return sector; 96 | } 97 | 98 | public void writeFloppy(MAGNETIC_HEAD head, int cylinder_num, int sector_num, byte[] buf) { 99 | setMagneticHead(head); 100 | setCylinder(cylinder_num); 101 | setSector(sector_num); 102 | 103 | ArrayList> disk = floppy.get(this.magneticHead.ordinal()); 104 | ArrayList cylinder = disk.get(this.current_cylinder); 105 | 106 | byte[] buffer = cylinder.get(this.current_sector); 107 | System.arraycopy(buf, 0, buffer, 0, buf.length); 108 | } 109 | 110 | public void makeFloppy(String fileName) { 111 | try { 112 | DataOutputStream out = new DataOutputStream(new FileOutputStream(fileName)); 113 | for (int cylinder = 0; cylinder < CYLINDER_COUNT; cylinder++) { 114 | for (int head = 0; head <= MAGNETIC_HEAD.MAGETIC_HEAD_1.ordinal(); head++) { 115 | for (int sector = 1; sector <= SECTORS_COUNT; sector++) { 116 | byte[] buf = readFloppy(MAGNETIC_HEAD.values()[head], cylinder, sector); 117 | /*if (head == 0 && cylinder == 0 && sector == 2) { 118 | int k = 0; 119 | k = 2; 120 | byte[] buffer = new byte[]{'H', 'e', 'l','l','o', 'w', 'o', 'r', 'l', 'd'}; 121 | for (int i = 0; i < buffer.length; i++) { 122 | buf[i] = buffer[i]; 123 | } 124 | 125 | }*/ 126 | out.write(buf); 127 | } 128 | 129 | } 130 | } 131 | 132 | } catch (Exception e) { 133 | // TODO Auto-generated catch block 134 | e.printStackTrace(); 135 | } 136 | } 137 | } 138 | --------------------------------------------------------------------------------