Pages

Saturday, November 20, 2010

Assembly වලින් Boot Loader එකක් ලියමු -Part 2

පෙර ලිපියෙන් අපි කතා කලා Floppy image එකක් සාදාගන්නා ආකරය ගැන.මේ ලිපියෙන් අපි ඉතුරු පියවරවල් ගැන කතා කරමු.

NASM භාවිතයෙන් Boot Loader Program එකක් ලියමු

Myfirst.asm
------------------------------------------------------------------------------------------------

BITS 16

start:
mov ax, 07C0h ; Set up 4K stack space after this bootloader
add ax, 288 ; (4096 + 512) / 16 bytes per paragraph
mov ss, ax
mov sp, 4096

mov ax, 07C0h ; Set data segment to where we're loaded
mov ds, ax


mov si, text_string ; Put string position into SI
call print_string ; Call our string-printing routine

jmp $ ; Jump here - infinite loop!


text_string db 'This is my cool new OS!', 0


print_string: ; Routine: output string in SI to screen
mov ah, 0Eh ; int 10h 'print char' function
.repeat:
lodsb ; Get character from string
cmp al, 0
je .done ; If char is zero, end of string
int 10h ; Otherwise, print it
jmp .repeat
.done:
ret


times 510-($-$$) db 0 ; Pad remainder of boot sector with 0s
dw 0xAA55 ; The standard PC boot signature

-------------------------------------------------------------------------------------------------

මෙහි අඩංගු NASM Instructions ගැන පස්සෙ පැහැදිලි කිරීමකට යන්නම්. ඊට පෙර අපි මේ Myfirst.asm කියන අපේ පලමුවෙනි සරල Boot Loader Program එක Save කරගෙන Floppy image එකකට Write කරල Booting වැඩේ සිද්ධවෙන නොවෙන බව බලාගමුකො.
හරි, ඔන්න ඔය විදිහට Assembly file එකත් ලියගත්තා කියමුකො.දැන් තියෙන්නෙ ඒක Compile කරගන්නයි.මෙතනදි Compile කරන විදහ සාමාන්‍ය NASM code එකක් Compile කරන්වාට වඩා වෙනස් මොකද කියනවානම් අපිට අවශ්‍ය Output File Format එක මෙතනදි විශෙෂ එකක් නිසා. මම දැන් ඔය විශෙෂ Output file format එක ගැන පොඩ්ඩක් කියන්නම්. BootLoader එකක් කියන්නේ කෙලින්ම BIOS එක හරහා Processor එකට විධාන නිකුත් කරන Program එකක්. ඒ කියන්නේ මෙතැනදි අතරමැදියෙක් විදිහට OS එක වැඩකරන්නැහැ (තාම OS එක Load කරලත් නැතුව මොන අතරමැදියොද හික් හික් : D ) .ඒක නිසා මෙතනදි අතරමැදි interface එක විදිහට වැඩ කරන්නේ ස්ර්‍ජුවම BIOS එකයි. BIOS එකත් එක්ක ගනුදෙනු කරද්දි Commands දෙන්න වෙන්නෙ කෙලින්ම Machine Language එකෙන් හෙවත් Binary format (o1o1o1o1o1o1....) එකෙනුයි.ඔන්න ඔය හේතුව නිස තමයි අපිට අර මම කලින් කියපු විශෙෂ file format එක හෙවත් Binary format එකෙන් Boot Loader Program එකේ instructions දෙන්න වෙන්නේ.අපි ලියපු NASM Program එක Binary Format file එකක් විදිහට compile කරන්නේ මෙන්න මෙහෙමයි.

nasm -f bin -o Myfirst.bin Myfirst.asm

පේනව ඇති -f කියලා comiling option format එක දීලා තියෙන්නෙ "bin" කියලා බව.ඒ කියන්නෙ Output file එක Binary format එකට තියෙන්න ඔනි කියනෙකයි. කොහොමින් කොහොම හරි ඔන්න ඔය විදිහට Comple කරගත්තහම අපේ පුංචි Boot Loader Program එක ලැහැස්තියි. දැන් තියෙන්නෙ මේක Floppy image file එකට Write කරනෙක හෙවත් 3 වෙනි පියවරයි.

Boot Loader Program එක Floppy image එකට write කර Boot-able Floppy image එකක් හදා ගමු

හරි යාලුවනේ. ඔන්න දැන් ගාව අපේ වැඩේට අවශ්ය ප්‍රධාන File දෙකම තියෙනවා. දැන් තියෙන්නෙ අපේ පුංචි Boot Loader Program එක අපි කලින් හදාගත්තු Floppy image file එකට Write කරන්නයි.ඒ සදහාත් මම භාවිතා කරන්න බලපොරොත්තු වෙන්නෙත් මම අර කලින් කියපු "ප්‍රසිද්ධ" "dd" Command එකම තමයි.මෙන්න ඒකේ Command Syntax එක.

dd status=noxfer conv=notrunc if=Myfirst.bin of=floppy.flp

මෙතනදි input file එක Myfirst.bin වෙනව වගේම Output file එක වෙන්නෙ Floppy image file එකයි. මේ command එකේ කලින්ට වඩා නොතිබු option දෙකක් තියෙනවා දැකගන්න පුලුවන්. ඒ ගැන පොඩි විස්තරයක් කරන්නම්.

status:
මෙම option එකෙන් "noxfer" කියල දුන්නොත් වෙන්නේ, dd command එක Run කලාට පස්සෙ දෙනවා Status Line එකක් 3 වෙනි Output line එක විදිහට.ඔන්න ඕක ප්‍රින්ට් නොවෙන්න නම් ඔය option එක දෙන්න ඔනි.ඕනිනම් ඔය option එක නැතුව Run කරලම බලන්නකෝ.

conv:
මෙම option එකෙන් "notrunc" කියල දුන්නොත් වෙන්නේ input file එකේ තියෙන Content, Output file එකට Copy කිරීමේදී Output file එකෙන් අවශ්ය ඉඩ ප්‍රමානය විතරක් අරගෙන Replace කරලා file එකේ ඉතුරු කොටසේ ඇති දත්ත එහෙම්ම තියෙන්න ඉඩ අරිනවා.

හරි ඔන්න එහෙනම් අපි දැන් "Bootable Floppy image" එකකුත් හදාගත්තා.දැන් ඊලග අවසාන පියවරට යන්න තමයි අපේ සූදානම...

Qemu emulator ය Install කිරීම සහ එය භාවිතයෙන් Floppy image ය Virtual PC එකක Boot කිරීම

Qemu කියන්නේ Processor Emulator එකක් වගේම Virtualizer එකක් විදිහට ක්‍රියකරන්න පුලුවන් OpenSource Software Package එකක්. සරල භාෂාවෙන් කිව්වොත් අපි භාවිතා කරන Virtual Box,VMWare යනාදියත් ඔන්න ඔය කියන ඝනයේ එව්වා තමයි නමුත් Qemu පස්සෙ කිව්ව එව්වට වඩා පොඩ්ඩක් Complex දේවල්වල්ට භාවිතා කරන එකක් (වැඩිවිස්තර මෙතැනින්).
හරි දැන් අපි කතා කරගෙන ආපු මාතෘකාවට බහිමුකෝ.අපි දැන් හදාගත්තු Floppy image එක බූට් කරල බලන්න එපැයි අපේ Boot Loader එක වැඩද නැද්ද කියල බලන්න.ඕක කරන්න පුලුවන් මෙන්න මෙහෙම.අපි ඇත්තම PC එකක් බූට් නොකර qemu භාවිතා කරල Virtual PC එකක් Emulate කරගෙන ඒ V-PC එක Floppy image එක භාවිතා කරලා බූට් කරල බලමු.
මේ සදහා මුලින්ම අපේ Linux මෙහෙයුම් පද්ධතියෙ qemu install කරගත යුතුයි. ඒ සදහා පහත විධානය භාවිතා කරන්න.

sudo apt-get install build-essential qemu nasm

(nasm දැනටමත් තිබේ නම් අවසාන කොටස අනවශ්‍යයි (nasm part of the code) )

Install වීම සම්පූර්න වුවිට දැන් ඉතුරුව ඇත්තේ අපි අපේ පුංචි Boot Loader එක Run කරලා බලන සතුටු දායකම අවස්තාවයි : ඩී.
පහත Command එක Run කිරීම තුලින් අපේ Boot Loader floppy image file එක qemu වල ඇති Virtual PC එකකින් Run කරගැනීමේ හැකියාව ලැබේ

sudo qemu -fda floppy.flp

ඔබට ජය!!!!!

Assembly වලින් Boot Loader ලියන හැටි ගැන වැඩි විස්තර ඊලග ලිපියෙන් (Details of NASM Code too)

12 comments:

  1. මුලින්ම මේ වටිනා ලිපි පෙල ලිවීම ගැන ස්තූතිවන්ත වෙන්න ඕනෙ.:)
    Shazan කියල දුන්න වගේ අර "dd" command එකෙන් අපි හදාගත්ත "myfirst.bin" file 1 එක ආපහු floppy image එකට write කරද්දි command syntax එකට පොඩි දෙයක් එකතු කරන්න හිතුනා.
    මේ තියෙන්නේ syntax එක:
    dd status=noxfer bs=512 count=1 conv=notrunc if=Myfirst.bin of=floppy.flp
    මේතනදි අලුතින් එකතු කරපු "bs=512" සහ "count=1" එකින් තහවුරු කරනවා අපි අපේ floppy image එකේ මුල්ම 512kB වලට අපේ ".bin" file එක write කරා කියන එක.මතක ඇතිනේ අපිට සර් කියල දුන්නා hard එකේ මුලින්ම කියවන්නේ පළවෙනි 512kB කියල

    මේ සම්භන්ධව තවත් තොරතුරු තියනවානම් comment එකක් විදියට එකතුකරන්නකෝ..

    ReplyDelete
  2. [BITS 16] ;tell the assembler that its a 16 bit code
    [ORG 0x7C00] ;Origin, tell the assembler that where the code will
    ;be in memory after it is been loaded

    JMP $ ;infinite loop

    TIMES 510 - ($ - $$) db 0 ;fill the rest of sector with 0
    DW 0xAA55 ; add boot signature at the end of bootloader

    ReplyDelete
  3. this is da code from the note dat sir has given..this wont print anything but do only booting.....this will help to understand the basic structure of the assembly structure......anyway buka good work machan.other than goin here and there without a clue along web sites we could get eveything at one place...thanx alot machan

    ReplyDelete
  4. සීරාවටම ගොඩක් වටිනවා මචන්. අපිත් මේ මෙහෙවරට පුලුවන් උපරිමයෙන් අනිවා දායක වෙනවා. මේ කරන වැඩේට ගොඩක් ස්තූතීයි මචං.

    ReplyDelete
  5. නියමයි මචන්....බොහෝම ස්තූතියි.
    දිගටම කරගෙන යන්න ශක්තිය ලැබේවා..!!

    ReplyDelete
  6. pattai!! math meken thama mulinma iganagaththe thnx buka :D:D

    ReplyDelete
  7. great work machan.... sira!

    Thanx alot

    ReplyDelete
  8. pattai machan..sirawatama niyameta therenawa...ela...

    ReplyDelete
  9. යකුනේ ඔච්චර දුක් විඳන්නෙ නැතුව asm file එක
    nasm filename.asm කියල binary file එක හදාගෙන(එතකොට filename කියල binary file එකක් හැදෙනවා)
    qemu filename කියල kvm එකෙන් run කර ගනින්. අනික දැන් floppy disk බේතකටවත් හොයාගන්න තියනවයැ.

    ReplyDelete
  10. @රුවන්,මාධව:-එකතු කිරීම සම්බන්ධයෙන් බොහොම ස්තූතියි මචංලා
    @සංජය,අසේල,ධනුෂ්ක,පබිත,අකිල,නුවන්:- තෑන්ක් යු වෙවා කොම්මෙන්ටු වලට :- ඩී
    @සුසිත අය්යා:- අපේ ප්‍රධාන පරමාර්ථේ Assignment එකනේ අය්යේ ඒකනෙ floopy බදාගෙන ඉන්නෙ,:( අනික ඔනි නම් කෙනෙක් qemu නැතුව සිරාවට බූට් කරන්න try එකක් දෙනවනම් ඒකටත් එක්ක හොදයි නේද,හැබැයි කිව්ව සිද්දිය නම් සිරා ,නිකමටවත් හිතුවෙ නැහැ ඔහොම කරා නම් ගොඩක් ලේසිය් නේද කියනෙක.Bin එක කෙලින්ම run කරනෙක නම් ගොඩක්ම ලෙසිය් වටරවුමක් නොගහා,බොහොම ස්තුතිය් අදහස් දැක්වීමට :) :)

    ReplyDelete
  11. වැඩෙනම් සිරා බන්.... අපි වගේ අන්තිම මොහොතේ වැඩ පටන් ගන්න උන්ටත් මේකෙන් ඔක්කොම දේවල් පැහැදිලි වෙනවා...

    ReplyDelete

ඔබගේ අදහස් පවසන්න ...
මට ඒව මසුරන් වටිනවා ....