Kami menulis sistem operasi. Bagian 1. Loader

Halo semuanya! Hari ini kita akan menulis bootloader yang akan menampilkan "Hello World" dan menjalankannya di VirtualBox. Kami akan menulis FASM assembler. Anda dapat mengunduhnya dari sini . Kami juga akan membutuhkan VirtualBox dan UltraISO . Sebelum menulis kode, kita akan memahami bagaimana sistem operasi memuat.

Jadi, ketika kita menekan tombol daya besar di komputer kita, sistem dimulai, yang ada di komputer mana pun - BIOS (Basic Input / Output System atau sistem input / output dasar). Tugas BIOS adalah:


  1. Deteksi semua perangkat yang terhubung dan periksa operabilitasnya. Program POST (Power On Self Test, power-on self-test) bertanggung jawab untuk ini. Jika vital iron tidak terdeteksi, maka speaker sistem (jika ada) akan mencicit sesuatu yang tidak dapat dipahami dan unduhan tidak akan melangkah lebih jauh.
  2. Menyediakan fungsi operasi sistem untuk bekerja dengan perangkat keras.
  3. Baca sektor pertama dari perangkat booting ke segmen nol RAM pada offset 0x7C00h dan transfer kontrol di sana. 1 sektor pada disk adalah 512 byte. Karena itu, bootloader kami tidak boleh melebihi 512 byte. BIOS menentukan bahwa sektor ini dapat di-boot dengan kehadiran 0x55 dan 0xAA dalam dua byte terakhirnya.

Sekarang Anda dapat mulai menulis kode. Jalankan file FASMW.EXE, yang terletak di arsip dengan FASM, dan masukkan kode berikut di sana:

org 7C00h

 start:
    cli              ;  (   )
    xor ax, ax       ;  ax
    mov ds, ax       ; dataSegment   
    mov es, ax       ;  es   
    mov ss, ax       ; StackSegment   
    mov sp, 07C00h   ;    
    sti              ; 

  ; 
  mov ax, 3
  int 10h

  mov ah, 2h
  mov dh, 0
  mov dl, 0
  xor bh, bh
  int 10h

  ; 
  mov ax, 1301h
  mov bp, message
  mov cx, 12
  mov bl, 02h
  int 10h

  jmp $

message db 'Hello World!',0

times 510 - ($ - $$) db 0 ;     510- 
db 0x55, 0xAA ;   

Kode ini membutuhkan sedikit penjelasan. Tim

org 7C00h

kita mengatakan bahwa kode harus dimuat ke dalam RAM pada 0x7C00. Dalam antrean

  mov ax, 3
  int 10h

kami mengatur mode video ke 80x25 (80 karakter per baris dan 25 baris) dan dengan demikian menghapus layar.

  mov ah, 2h
  mov dh, 0
  mov dl, 0
  xor bh, bh
  int 10h

Di sini kita mengatur kursor. Fungsi interupsi 10j 2j bertanggung jawab atas hal ini. Dalam register dh kita meletakkan koordinat kursor di Y, dan di register dl di X.

  mov ax, 1301h
  mov bp, message
  mov cx, 12
  mov bl, 02h
  int 10h

Kami mencetak garis. Fungsi interupsi 10 jam 13 jam bertanggung jawab untuk ini. Dalam register bp kita meletakkan string itu sendiri, di cx mendaftarkan jumlah karakter dalam string, di bl mendaftarkan atribut, dalam kasus kita warna, itu akan menjadi hijau. 4 bit pertama mempengaruhi warna latar belakang, 4 bit kedua mempengaruhi warna teks. Di bawah ini adalah bagan warna

0 - , 1 - , 2 - , 3 - , 4 - , 5 - , 6 - , 7 - -, 8 - -, 9 - -, A - -, B - -, C - -, D- -, E - -, F – .

Di barisan

jmp $

Program membeku.

Kami mengkompilasi kode dengan menekan Ctrl + F9 dan menyimpan file yang dihasilkan sebagai boot.bin.

Meluncurkan


Luncurkan UltraISO dan seret biner kami ke area khusus (ditandai dengan panah merah).



Selanjutnya, klik kanan pada binarink dan tekan tombol dengan tulisan berikut: "Install as boot file". Selanjutnya, simpan file kami dalam format ISO.
Buka VIrtualBox dan buat mesin virtual baru (jika Anda tidak tahu bagaimana melakukan ini, klik di sini ). Jadi, setelah Anda membuat mesin virtual, klik "Configure, pilih item" Media ", klik" Empty ", di mana" Drive "adalah ikon disk optik. Kami klik dan pilih "Select Optical Disk Image", cari file ISO kami, klik "Open". Kami menyimpan semua pengaturan dan memulai mesin virtual. Our "Hello World!" Muncul di layar.



Tentang ini, masalah pertama berakhir. Pada bagian selanjutnya, kita akan mengajarkan bootloader kita untuk membaca sektor disk dan mem-boot kernel pertama!


All Articles