• Tidak ada hasil yang ditemukan

Cara Membuat Dan Sistem Operasi

N/A
N/A
Protected

Academic year: 2018

Membagikan "Cara Membuat Dan Sistem Operasi"

Copied!
47
0
0

Teks penuh

(1)
(2)

Daftar Isi

Rekonstruksi Tutorial 14 ... 4

General Setup ... 4

General Step... 6

Results ... 11

Pelaksanaan Tutorial 19 ... 13

Pelaksanaan Tutorial 22 ... 15

Fungsi Aritmatika ... 17

Fungsi Modifikasi File dan Informasi File ... 24

Referensi ... 25

Lampiran ... 25

Kesimpulan ... 46

Saran ... 46

(3)

Daftar Gambar

Gambar 1 Menambahkan NASM pada W7 32-bit (berlaku sama untuk W8.1 64-bit) ... 5

Gambar 2 Instalasi standar ImDisk pada W8.1 64-bit ... 5

Gambar 3 Konfigurasi mkbt pada W8.1 64-bit ... 6

Gambar 4 Instalasi Bochs ... 6

Gambar 5 Virtual Floppy Disk dengan VFD ... 7

Gambar 6 Build Solution pada VS 2013 ... 9

Gambar 7 Run OS on Bochs ... 10

Gambar 8 Hasil pada W7 32-bit ... 11

Gambar 9 Hasil 1 pada W8.1 64-bit ... 12

Gambar 10 Hasil 2 pada W8.1 64-bit ... 12

Gambar 11 DebugPrintf() ... 12

Gambar 12 Hasil Tutorial 14 pada W8.1 64-bit ... 13

Gambar 13 Hasil pada W7 32-bit ... 14

Gambar 14 Hasil Tutorial 19 pada Windows 8.1 64-bit ... 14

Gambar 15 Error pada Tutorial 22 ... 16

Gambar 16 Error Handling Tutorial 22 ... 16

(4)

Rekonstruksi Tutorial 14

Pengerjaan tugas besar kami awali dengan mengulang kembali tugas kecil yang sebelumnya belum dikerjakan dengan sempurna. Hal ini terjadi karena adanya hambatan dalam build KRNL32.EXE. Setelah melakukan evaluasi, akhirnya kami dapat menyelesaikan tutorial ini.

Langkah pertama yang kami lakukan adalah memastikan semua tools yang dibutuhkan untuk melakukan tutorial ini sudah tersedia. Berikut merupakan daftar tools yang dibutuhkan, dalam tutorial ini maupun tutorial berikutnya, bergantung pada environment yang digunakan.

1. Pengembangan dalam Windows 32-bit a. NASM

NASM adalah sebuah assembler dari sebuah file dengan ekstensi .asm. b. VFD

VFD adalah sebuah alat bantu pembuat virtual floppy drive. c. PartCopy

PartCopy adalah sebuah alat bantu yang dalam tutorial ini digunakan untuk assigning bootloader pada virtual floppy drive.

d. Bochs

Sebuah PC Emulator untuk mensimulasikan OS yang dibuat dalam tutorial Brokenthorn.

e. Visual Studio

IDE pengembangan berbasis C++. 2. Pengembangan dalam Windows 64-bit

a. NASM

NASM adalah sebuah assembler dari sebuah file dengan ekstensi .asm. b. ImDisk

ImDisk adalah sebuah alat bantu pembuat virtual floppy drive. c. mkbt

mkbt adalah sebuah alat bantu yang dalam tutorial ini digunakan untuk assigning bootloader pada virtual floppy drive.

d. Bochs

Sebuah PC Emulator untuk mensimulasikan OS yang dibuat dalam tutorial Brokenthorn.

e. Visual Studio

IDE pengembangan berbasis C++.

Pelaksanaan Tutorial ini dilakukan dalam seluruh laptop dari anggota kelompok dengan spesifikasi yang berbeda-beda. Salah satu spesifikasi yang paling signifikan adalah environment atau arsitektur yang digunakan. Ricko menggunakan Windows 7 32-bit. Sedangkan Rizal, Hilman, dan Ghani menggunakan Windows 8.1 64-bit. Perbedaan ini membuat adanya perbedaan dalam proses yang dilalui untuk menghasilkan output yang sama. Berikut merupakan tahap-tahap pengembangan dari masing-masing percobaan.

General Setup

(5)

1. NASM

Setelah melakukan instalasi standar dengan menjalankan installer NASM, masukkan direktori NASM pada PATH dalam environment variables.

Gambar 1 Menambahkan NASM pada W7 32-bit (berlaku sama untuk W8.1 64-bit)

2. Virtual Floppy Drive

Untuk Windows 7 32-bit, lakukan instalasi standar VFD. Begitu pula dengan ImDisk pada Windows 8.1 64-bit.

Gambar 2 Instalasi standar ImDisk pada W8.1 64-bit

3. Bootsector Copier

(6)

Gambar 3 Konfigurasi mkbt pada W8.1 64-bit

4. PC Emulator

PC Emulator yang digunakan adalah Bochs 2.6.7. Langkah-langkah instalasi adalah sebagai berikut.

Gambar 4 Instalasi Bochs

5. Visual Studio

Instalasi Visual Studio merupakan langkah instalasi standar dengan menjalankan installer visual studio. Hal yang perlu diperhatikan adalah tipe dari dari installer. Pastikan ada koneksi internet yang memadai apabila tipe dari installer tersebut adalah online installer yang membutuhkan kuota minimal sebesar 3GB.

General Step

Setelah memastikan seluruh tools telah terinstal dan dapat digunakan, berikut merupakan langkah-langkah standar yang harus dilalui dalam seluruh rangkaian tutorial.

(7)

nasm –f bin Boot1.asm –o Boot1.bin

Sintaksis di atas merupakan sintaksis untuk mengubah file Boot1.asm menjadi Boot1.bin yang merupakan Bootloader dari OS yang akan dikembangkan. Selain Boot1.asm, file lain yang harus diubah adalah Stage2.asm menjadi KRNLDR.SYS dengan cara sebagai berikut.

nasm –f bin Stage2.asm –o KRNLDR.SYS

2. Setting-up Virtual Floopy Drive

Pembuatan Virtual Floppy Drive dengan menggunakan VFD adalah sebagai berikut.

Gambar 5 Virtual Floppy Disk dengan VFD

Sedangkan untuk imdisk adalah dengan menggunakan syntax pada Command Prompt sebagai berikut.

imdisk –a –f floppy.img –s 1440K –m A:

3. Copying Bootsector

Langkah ini dilalui dengan menggunkan PartCopy atau mkbt. Berikut detail dari penggunaan kedua tools tersebut.

partcopy Boot1.bin 0 200 –f0

mkbt –c Boot1.bin a:

Selain Boot1.bin, file lain yang harus dimasukkan ke dalam floppy disk adalah KRNLDR.SYS. Caranya adalah dengan copy-paste atau menggunakan Command Prompt dengan syntaksis sebagai berikut.

copy KRNLDR.SYS A:\KRNLDR.SYS

4. Build Solution

(8)
(9)
(10)

5. Run OS on Bochs

Jalankan Bochs, lakukan konfigurasi pada bagian Disk & Boot, lalu klik Start. Detail dari langkah ini adalah sebagai berikut.

(11)

Results

Hasil dari menjalankan langkah-langkah di atas pada laptop milik Ricko adalah sebagai berikut.

Gambar 8 Hasil pada W7 32-bit

Ternyata ada error akibat kesalahan konfigurasi. Hal yang harus dilakukan adalah melakukan beberapa konfigurasi pada Solutions builder. Beberapa hal yang harus diubah adalah sebagai berikut.

Parameter diatas untuk pengembangan di Windows 7 32-bit diubah menjadi seperti gambar berikut.

(12)

Gambar 9 Hasil 1 pada W8.1 64-bit

Gambar 10 Hasil 2 pada W8.1 64-bit

Terdapat kejanggalan, pada Bochs for Windows – Display layar silih-berganti antara seperti yang ada pada Gambar 8 dan Gambar 9. Ketika ditelusuri, memang terdapat sesuatu yang mengakibatkan OS harus melakukan reset secara terus menerus. Ghani pun teringat perkataan anggota kelompok lain, yaitu Taufik Akbar Abdullah, yang mengatakan bahwa ada keanehan dalam inisialisasi variabel untuk fungsi DebugPrintf(). Setelah ditelusuri, memang ada kejanggalan seperti yang terlihat pada gambar di bawah ini.

(13)

Kejanggalannya adalah variabel char str[32] diinisialisasi dengan {0}. Seharusnya tidak perlu diinisialisasi seperti itu. Penanganannya adalah dengan menghapus “={0}” sehingga hanya “char str[32];”. Setelah dilakukan rebuild Solutions, hasilnya sesuai dengan ekspektasi.

Gambar 12 Hasil Tutorial 14 pada W8.1 64-bit

Pelaksanaan Tutorial 19

Pada tutorial sudah ada beberapa knowledge yang ditambahkan dari tutorial sebelumnya, seperti Interrupt Handling, Exceptions, PIC, PIT, Memory Management, dan Keyboard Programming. Dengan begitu, kami sudah bisa membuat seolah-olah Command Prompt pada OS yang dikembangkan dengan fitur yang masih terbatas. Setelah memahami penjelasan tutorial dan perubahan pada file yang dibutuhkan serta menyesuaikan dengan penanganan error pada tutorial sebelumnya, kami mencoba menjalankan OS yang telah diperbarui. Pastikan langkah-langkah General Setup dan General Step telah dilakukan.

(14)

Gambar 13 Hasil pada W7 32-bit

Percobaan pada Windows 8.1 64-bit menghasilkan output yang sama.

(15)

Pelaksanaan Tutorial 22

Pada tutorial sudah ada beberapa knowledge yang ditambahkan dari tutorial sebelumnya, seperti FDC Programming, DMA Programming, File System, dan VFS. Dengan begitu, kami seharusnya sudah dapat membuat OS kami membaca file, menuliskan file, menyimpan file, dsb. Setelah memahami penjelasan tutorial dan perubahan pada file yang dibutuhkan serta menyesuaikan dengan penanganan error pada tutorial sebelumnya, kami mencoba menjalankan OS yang telah diperbarui. Pastikan langkah-langkah General Setup dan General Step telah dilakukan.

Pengujian OS dilakukan dengan menjalankan Bochs. Berikut merupakan hasil menjalankan OS pada Windows 7 32-bit.

(16)

Gambar 15 Error pada Tutorial 22

Ghani mencoba memperbaiki dengan memindahkan file DebugDisplay.h dan seluruh file yang sekiranya dibutuhkan oleh fat12.cpp ke dalam folder yang sama dengan folder fat12.cpp. Hasilnya sama saja. Muncul error yang sama. Kami pun mencoba melakukan penelusuran terhadap penggunaan syntax include pada C++. Berdasarkan hasil penelusuran pada situs resmi Windows tentang C++, terdapat kesalahan penggunaan syntax include. Dalam kasus ini, seharusnya yang digunakan adalah tanda “..”, bukan <..>. Kami pun mengganti seluruh syntax include pada fat12.cpp sehingga Build Solution pun berhasil.

Gambar 16 Error Handling Tutorial 22

(17)

Gambar 17 Hasil Tutorial 22

Hasilnya ternyata tidak sesuai dengan ekspektasi. OS tidak dapat membaca file.txt yang sebelumnya telah dibuat dan disimpan dalam A:. Tidak ada solusi yang dapat menyelesaikan masalah ini setelah menelusuri ke berbagai sumber, termasuk ke kelompok lain dan kepada salah satu mahasiswa informatika yang paling pintar. Akhirnya percobaan kami terhadap tutorial ini pun berhenti.

Fungsi Aritmatika

Berdasarkan pemahaman yang didapatkan dalam pengerjaan tutorial 19, kami dapat mengembangkan sebuah fungsi aritmatika dalam sistem operasi yang sedang dikembangkan. Untuk mengembangkan fungsi aritmatika tersebut, kami terlebih dahulu memastikan struktur pembacaan karakter. Setelah ditelusuri ternyata cukup sulit apabila harus memodifikasi fungsi yang sudah ada untuk ditambahkan dengan fungsi aritmatika. Hal yang dilakukan adalah dengan menambah fungsi baru khusus untuk membaca syntax operasi aritmatika. Fungsi yang ditambahkan adalah sebagai berikut.

void cmd_operation (){

char cmd[32];

char opr[10] = { '\0' };

int n1[1];

int n2[1]; n1[0] = 0; n2[0] = 0;

int result;

bool run = true;

DebugPrintf ("\n\rEnter your operation commad followed by the number you want to operate");

(18)

DebugPrintf ("\n\r mul : to multiply the number");

DebugPrintf ("\n\r <operation> <first number>,<second number>"); DebugPrintf ("\n\r ex: sum 3,4");

DebugPrintf ("\n\r back : to back to the previous menu"); while (run){

DebugPrintf ("\n\rOperation>"); get_opr_cmd (cmd,32,opr,n1,n2);

if (strcmp(cmd,"back")==0){

run = false; }

else {

if (strcmp(opr,"sum")==0){ result = n1[0]+n2[0];

DebugPrintf ("\n\r %d",result); } else if (strcmp(opr,"mod")==0){

result = n1[0]%n2[0];

int result2 = n1[0]/n2[0];

DebugPrintf ("\n\r %d sisa %d",result2,result); } else if (strcmp(opr,"mul")==0){

DebugPrintf ("\n\r %d",n1[0]*n2[0]); } else if (strcmp(opr,"sub")==0){

DebugPrintf ("\n\r %d",n1[0]-n2[0]); }

(19)
(20)
(21)
(22)
(23)
(24)

Fungsi Modifikasi File dan Informasi File

(25)

informasi file tidak dapat dikembangkan. Usaha yang dilakukan adalah dengan mencoba berkoordinasi dengan kelompok lain dan menanyakan pada mahasiswa informatika yang ahli dalam sistem operasi. Hasilnya tetap, fungsi ini tidak dapat dikembangkan. Salah satu penyebabnya yang kami dapatkan adalah belum stabilnya OS yang dikembangkan oleh Mike (Brokenthorn).

Referensi

Tipe Nama Tautan

Program MKBT http://www.nu2.nu/mkbt

Program NASM http://superuser.com/questions/183335/how-to-create-a-virtual-floppy-drive

Program Bochs http://sourceforge.net/projects/bochs/

Program VFD http://sourceforge.net/projects/vfd/

Program PartCopy http://stahlworks.com/dev/index.php?tool=partcopy

Program VS Community http://www.visualstudio.com/en-us/products/free-developer-offers-vs

Teori Pengembangan OS

http://www.brokenthorn.com/Resources/OSDevIndex.html

Teori C++ (Include) http://msdn.microsoft.com/en-us/library/36k2cdd4.aspx

Lampiran

Bagian ini merupakan lampiran atas kode yang paling berpengaruh dalam pengembangan OS dan yang mengalami perubahan.

1. Boot1.asm

;********************************************* ; Boot1.asm

; - A Simple Bootloader

;

; Operating Systems Development Tutorial ;*********************************************

bits 16 ; we are in 16 bit real

mode

org 0 ; we will set regisers

later

start: jmp main ; jump to start of

bootloader

(26)

;********************************************* bpbBytesPerSector: DW 512

bpbSectorsPerCluster: DB 1 bpbReservedSectors: DW 1

bpbNumberOfFATs: DB 2 bpbRootEntries: DW 224

bpbTotalSectors: DW 2880 bpbMedia: DB 0xf0 ;; 0xF1 bpbSectorsPerFAT: DW 9

bpbSectorsPerTrack: DW 18 bpbHeadsPerCylinder: DW 2 bpbHiddenSectors: DD 0 bpbTotalSectorsBig: DD 0 bsDriveNumber: DB 0 bsUnused: DB 0

bsExtBootSignature: DB 0x29

bsSerialNumber: DD 0xa0a1a2a3 bsVolumeLabel: DB "MOS FLOPPY " bsFileSystem: DB "FAT12 "

;************************************************; ; Prints a string

; DS=>SI: 0 terminated string

;************************************************; Print:

lodsb ; load next byte from string

from SI to AL

or al, al ; Does AL=0?

jz PrintDone ; Yep, null terminator

found-bail out

mov ah, 0eh ; Nope-Print the

character int 10h

jmp Print ; Repeat until null terminator

found PrintDone:

ret ; we are done, so return

absoluteSector db 0x00 absoluteHead db 0x00 absoluteTrack db 0x00

;************************************************; ; Convert CHS to LBA

; LBA = (cluster - 2) * sectors per cluster

(27)

ClusterLBA:

; AX=>LBA Address to convert ;

; absolute sector = (logical sector / sectors per track) + 1 ; absolute head = (logical sector / sectors per track) MOD number of heads

; absolute track = logical sector / (sectors per track * number of heads) ; Reads a series of sectors

; CX=>Number of sectors to read ; AX=>Starting sector

; ES:BX=>Buffer to read to

(28)

mov al, 0x01 ; read one sector ; Bootloader Entry Point

;*********************************************

main:

;--- ; code located at 0000:7C00, adjust segment registers ;---

cli ; disable interrupts

mov ax, 0x07C0 ; setup registers to

(29)

mov ss, ax mov sp, 0xFFFF

sti ; restore interrupts

mov [bootdevice], dl

;--- ; Load root directory table

;---

LOAD_ROOT:

; compute size of root directory and store in "cx"

xor cx, cx

; compute location of root directory and store in "ax"

mov al, BYTE [bpbNumberOfFATs] ; number of FATs

; read root directory into memory (7C00:0200)

mov bx, 0x0200 ; copy root dir

; browse root directory for binary image

(30)

find

; save starting cluster of boot image

mov dx, WORD [di + 0x001A]

mov WORD [cluster], dx ; file's first cluster

; compute size of FAT and store in "cx"

xor ax, ax

mov al, BYTE [bpbNumberOfFATs] ; number of FATs mul WORD [bpbSectorsPerFAT] ; sectors used by FATs

mov cx, ax

; compute location of FAT and store in "ax"

mov ax, WORD [bpbReservedSectors] ; adjust for bootsector

; read FAT into memory (7C00:0200)

mov bx, 0x0200 ; copy FAT above bootcode

call ReadSectors

; read image file into memory (0050:0000)

(31)

LOAD_IMAGE:

; compute next cluster

(32)

push WORD 0x0050 datasector dw 0x0000 cluster dw 0x0000

ImageName db "KRNLDR SYS" msgCRLF db 0x0D, 0x0A, 0x00 msgProgress db ".", 0x00

msgFailure db 0x0D, 0x0A, "MISSING OR CURRUPT KRNLDR. Press Any Key to Reboot", 0x0D, 0x0A, 0x00

TIMES 510-($-$$) DB 0

; Stage2 Bootloader

;

; OS Development Series

;*******************************************************

bits 16

org 0x500

jmp main ; go to start

;******************************************************* ; Preprocessor directives

;*******************************************************

%include "stdio.inc" ; basic i/o routines %include "Gdt.inc" ; Gdt routines

%include "A20.inc" ; A20 enabling

%include "Fat12.inc" ; FAT12 driver. Kinda :) %include "Common.inc"

(33)

;******************************************************* ; Data Section

;*******************************************************

LoadingMsg db 0x0D, 0x0A, "Searching for Operating System...", 0x00

msgFailure db 0x0D, 0x0A, "*** FATAL: Missing or corrupt KRNL32.EXE. Press Any Key to Reboot.", 0x0D, 0x0A, 0x0A, 0x00

boot_info:

istruc multiboot_info

at multiboot_info.flags, dd 0

at multiboot_info.memoryLo, dd 0 at multiboot_info.memoryHi, dd 0

at multiboot_info.bootDevice, dd 0

at multiboot_info.cmdLine, dd 0

at multiboot_info.mods_count, dd 0

at multiboot_info.mods_addr, dd 0

at multiboot_info.syms0, dd 0

at multiboot_info.syms1, dd 0

at multiboot_info.syms2, dd 0

at multiboot_info.mmap_length, dd 0

at multiboot_info.mmap_addr, dd 0

at multiboot_info.drives_length, dd 0

at multiboot_info.drives_addr, dd 0

at multiboot_info.config_table, dd 0 at multiboot_info.bootloader_name, dd 0

at multiboot_info.apm_table, dd 0

at multiboot_info.vbe_control_info, dd 0 at multiboot_info.vbe_mode_info, dw 0

at multiboot_info.vbe_interface_seg, dw 0 at multiboot_info.vbe_interface_off, dw 0 at multiboot_info.vbe_interface_len, dw 0 iend

mov [boot_info+multiboot_info.bootDevice], dl

(34)

sti

xor eax, eax xor ebx, ebx

call BiosGetMemorySize64MB

push eax KB between 0-1MB; add it

mov dword [boot_info+multiboot_info.memoryHi], 0 mov dword [boot_info+multiboot_info.memoryLo], eax

mov eax, 0x0

mov ds, ax

mov di, 0x1000

call BiosGetMemoryMap

call LoadRoot CS. Remember that the code selector is 0x8!

; Note: Do NOT re-enable interrupts! Doing so will triple fault!

(35)

;****************************************************** ; ENTRY POINT FOR STAGE 3

;******************************************************

bits 32

%include "Paging.inc"

(36)

ImageSig db 'PE'

offset 8 bytes from entry point

mov eax, dword [ebx] ; add image base add ebp, eax

cli

mov eax, 0x2badb002 ; multiboot specs

say eax should be this

mov ebx, 0

;-- header information format for PE files ---

(37)

; USHORT e_res[4]; // Reserved words ; } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

;<<--- Real mode stub program --->>

;<< Here is the file signiture, such as PE00 for NT --->>

;typedef struct _IMAGE_FILE_HEADER { ; USHORT Machine;

; USHORT NumberOfSections; ; ULONG TimeDateStamp;

; ULONG PointerToSymbolTable; ; ULONG NumberOfSymbols; ; USHORT SizeOfOptionalHeader; ; USHORT Characteristics; ; ULONG SizeOfUninitializedData;

; ULONG AddressOfEntryPoint; << IMPORTANT! ; ULONG BaseOfCode;

; USHORT MajorOperatingSystemVersion; ; USHORT MinorOperatingSystemVersion; ; USHORT MajorImageVersion;

; USHORT MinorImageVersion; ; USHORT MajorSubsystemVersion; ; USHORT MinorSubsystemVersion; ; ULONG Reserved1;

; ULONG SizeOfImage; ; ULONG SizeOfHeaders; ; ULONG CheckSum; ; USHORT Subsystem;

(38)

; ULONG SizeOfStackCommit; ; ULONG SizeOfHeapReserve; ; ULONG SizeOfHeapCommit; ; ULONG LoaderFlags;

; ULONG NumberOfRvaAndSizes; ; IMAGE_DATA_DIRECTORY

DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; ;} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;

3. Fungsi tambahan pada untuk fungsi aritmatika pada main.cpp

void get_opr_cmd (char* buf, int n,char* opr,int* n1,int* n2) {

//! buffer the next char

BufChar = true;

//! grab next char

key = getch ();

//! end of command if enter is pressed

if (key==KEY_RETURN)

break;

//! backspace

if (key==KEY_BACKSPACE) {

//! dont buffer this char

BufChar = false;

//! erase the character from display

(39)

n1[0] = (n1[0]/10);

//! convert key to an ascii char and put it in buffer

char c = kkybrd_key_to_ascii (key);

if (c != 0) { //insure its an ascii char

//! wait for next key. You may need to adjust this to suite your needs

sleep (5); }

//! null terminate the string

buf [i] = '\0'; }

4. Fat12.cpp pada Windows 8.1 64-bit

(40)

#include "DebugDisplay.h"

#define SECTOR_SIZE 512

//! FAT FileSystem

FILESYSTEM _FSysFat;

//! Mount info

MOUNT_INFO _MountInfo;

//! File Allocation Table (FAT)

uint8_t FAT [SECTOR_SIZE*2];

/**

Helper function. Converts filename to DOS 8.3 file format

*/

void ToDosFileName (const char* filename,

char* fname,

unsigned int FNameLength) {

unsigned int i=0;

if (FNameLength > 11)

return;

if (!fname || !filename)

return;

//! set all characters in output name to spaces

memset (fname, ' ', FNameLength);

//! 8.3 filename

for (i=0; i < strlen(filename)-1 && i < FNameLength; i++) {

if (filename[i] == '.' || i==8 )

break;

//! capitalize character and copy it over (we dont handle LFN format)

fname[i] = toupper (filename[i] ); }

//! add extension if needed

if (filename[i]=='.') {

//! note: cant just copy over-extension might not be 3 chars

for (int k=0; k<3; k++) {

//! extension must be uppercase (we dont handle LFNs)

for (i = 0; i < 3; i++)

(41)

/**

Locates file or directory in root directory */

FILE fsysFatDirectory (const char* DirectoryName) {

FILE file;

unsigned char* buf; PDIRECTORY directory;

//! get 8.3 directory name

char DosFileName[11];

ToDosFileName (DirectoryName, DosFileName, 11); DosFileName[11]=0;

//! 14 sectors per directory

for (int sector=0; sector<14; sector++) {

//! read in sector of root directory

buf = (unsigned char*) flpydsk_read_sector (_MountInfo.rootOffset + sector );

//! get directory info

directory = (PDIRECTORY) buf;

//! 16 entries per sector

for (int i=0; i<16; i++) {

//! get current filename

char name[11];

memcpy (name, directory->Filename, 11); name[11]=0; file.fileLength = directory->FileSize; file.eof = 0;

file.fileLength = directory->FileSize;

//! set file type

if (directory->Attrib == 0x10) file.flags = FS_DIRECTORY;

//! go to next directory

directory++; }

}

//! unable to find file

file.flags = FS_INVALID;

(42)

/**

Reads from a file */

void fsysFatRead(PFILE file, unsigned char* Buffer, unsigned int

Length) {

if (file) {

//! starting physical sector

unsigned int physSector = 32 + (file->currentCluster - 1);

//! read in sector

unsigned char* sector = (unsigned char*) flpydsk_read_sector ( physSector );

//! copy block of memory

memcpy (Buffer, sector, 512);

//! locate FAT sector

unsigned int FAT_Offset = file->currentCluster + (file->currentCluster / 2); //multiply by 1.5

unsigned int FAT_Sector = 1 + (FAT_Offset / SECTOR_SIZE);

unsigned int entryOffset = FAT_Offset % SECTOR_SIZE;

//! read 1st FAT sector

sector = (unsigned char*) flpydsk_read_sector ( FAT_Sector ); memcpy (FAT, sector, 512);

//! read 2nd FAT sector

sector = (unsigned char*) flpydsk_read_sector ( FAT_Sector + 1 ); memcpy (FAT + SECTOR_SIZE, sector, 512);

//! read entry for next cluster

uint16_t nextCluster = *( uint16_t*) &FAT [entryOffset];

//! test if entry is odd or even

if( file->currentCluster & 0x0001 )

nextCluster >>= 4; //grab high 12 bits

else

nextCluster &= 0x0FFF; //grab low 12 bits

//! test for end of file

if ( nextCluster >= 0xff8) {

file->eof = 1;

return; }

//! test for file corruption

if ( nextCluster == 0 ) {

(43)

if (file)

file->flags = FS_INVALID; }

/**

Locates a file or folder in subdirectory */

FILE fsysFatOpenSubDir (FILE kFile,

const char* filename) {

FILE file;

//! get 8.3 directory name

char DosFileName[11];

ToDosFileName (filename, DosFileName, 11); DosFileName[11]=0;

//! read directory

while (! kFile.eof ) {

//! read directory

unsigned char buf[512];

fsysFatRead (&file, buf, 512);

//! set directort

PDIRECTORY pkDir = (PDIRECTORY) buf;

//! 16 entries in buffer

for (unsigned int i = 0; i < 16; i++) {

//! get current filename

char name[11];

memcpy (name, pkDir->Filename, 11); name[11]=0; file.fileLength = pkDir->FileSize; file.eof = 0;

file.fileLength = pkDir->FileSize;

//! set file type

if (pkDir->Attrib == 0x10) file.flags = FS_DIRECTORY;

//! unable to find file

(44)

return file; }

/**

Opens a file */

FILE fsysFatOpen (const char* FileName) {

FILE curDirectory;

//! nope, must be in root directory, search it

curDirectory = fsysFatDirectory (path);

//! found file?

if (curDirectory.flags == FS_FILE)

return curDirectory;

//! go to next character after first '\'

p++;

//! open subdirectory or file

if (rootDir) {

//! search root directory - open pathname

curDirectory = fsysFatDirectory (pathname); rootDir=false;

}

else {

//! search a subdirectory instead for pathname

curDirectory = fsysFatOpenSubDir (curDirectory, pathname); }

//! found directory or file?

(45)

break;

//! found file?

if (curDirectory.flags == FS_FILE)

return curDirectory;

bootsector = (PBOOTSECTOR) flpydsk_read_sector (0);

//! store mount info

_MountInfo.numSectors = bootsector->Bpb.NumSectors; _MountInfo.fatOffset = 1;

_MountInfo.fatSize = bootsector->Bpb.SectorsPerFat; _MountInfo.fatEntrySize = 8;

_MountInfo.numRootEntries = bootsector->Bpb.NumDirEntries; _MountInfo.rootOffset = (bootsector->Bpb.NumberOfFats * bootsector->Bpb.SectorsPerFat) + 1;

_MountInfo.rootSize = ( bootsector->Bpb.NumDirEntries * 32 ) / bootsector->Bpb.BytesPerSector;

}

/**

Initialize filesystem */

void fsysFatInitialize () {

//! initialize filesystem struct

strcpy (_FSysFat.Name, "FAT12");

_FSysFat.Directory = fsysFatDirectory; _FSysFat.Mount = fsysFatMount; _FSysFat.Open = fsysFatOpen; _FSysFat.Read = fsysFatRead; _FSysFat.Close = fsysFatClose;

//! register ourself to volume manager

volRegisterFileSystem ( &_FSysFat, 0 );

//! mounr filesystem

(46)

Kesimpulan

 Tutorial yang diberikan Brokenthorn masih memiliki banyak bug dan memiliki keterbatasan lingkungan pengembangan. Pada situs Brokenthorn dikembangkan pada Windows 32-bit dengan tools Microsoft Visual Studio 2005 dan tidak mudah untuk beradaptasi dengan lingkungan pengembangan lainnya, seperti Windows 64-bit dan Microsoft Visual Studio versi lain.

 Fungsi aritmatika dapat dikembangkan secara langsung pada Kernel tanpa memerlukan interface lain. Pengembangan fungsi ini akan lebih mudah dengan cara membuat fungsi baru sehingga tidak perlu memodifikasi fungsi yang sudah ada.

File System tidak dapat dikembangkan karena belum stabilnya OS yang dibuat.

Saran

Selain saran yang disampaikan pada tugas sebelumnya, saran yang muncul dari pengerjaan tugas ini adalah akan lebih baik apabila pemberi tugas telah berhasil mengerjakan tugas yang diberikan terlebih dahulu. Hal ini akan berpengaruh pada efisiensi waktu pengerjaan dan akan ada tempat bertanya yang pasti.

Pembagian Kerja

Nama NIM Tanggung Jawab

(47)

Gambar

Gambar 1 Menambahkan NASM pada W7 32-bit (berlaku sama untuk W8.1 64-bit)
Gambar 3 Konfigurasi mkbt pada W8.1 64-bit
Gambar 5 Virtual Floppy Disk dengan VFD
Gambar 6 Build Solution pada VS 2013
+7

Referensi

Dokumen terkait

Jasa atestasi lain yang dapat diterapkan pada berbagai permasalahan Akuntan publik memberikan banyak jasa atestasi lainnya, yang kebanyakan merupakan perluasan

Diajukan untuk memenuhi salah satu syarat dalam menempuh ujian sidang Sarjana Pendidikan pada Program Studi Pendidikan

Kesimpulannya budaya niaga usahawan Bumiputera yang merujuk kepada sikap keusahawanan, pengaruh program pendidikan dan latihan keusahawanan serta kompetensi

Akademi Kebidanan

Cara untuk menerapkan efek pola garis pada teks

Berdasarkan tabel diatas,diperoleh nilai signifikansi sebesar 0,001 atau lebih kecil dari 0,05 (0,001 &lt; 0,05) sehingga dapat disimpulkan bahwa terdapat hubungan atau

Perlindungan hukum yang dituangkan dalam perjanjian kerja sama pembiayaan adalah bahwa pihak perusahaan modal ventura mewajibkan kepada perusahaan kecil untuk

1) Semakin tinggi konsentrasi Etanol yaitu sebesar 20%, maka rendemen pulp yang dihasilkan semakin rendah. 2) Semakin tinggi temperatur pemasakan yaitu sebesar 100 o C, maka