Friday, January 20, 2012

Pin It


Get Gadget

Hacking JOSH – Operating System Development in Assembly

In this project I was able to develop a simple OS which have kernel and a Shell by configuring a given simple OS. You can find that preliminary OS  by reading this article,


http://asiri.rathnayake.org/articles/hacking-josh-operating-system-tutorial/

I implemented a new command for my operating system which prints hardware information about the computer.To achieve that functionality after some research work over the internet and experts of this area I found several waysto get hardware information using x86 Assembly language.
They were BIOS interrupt calls, CPUID instruction, BIOS data area, SMBIOS – Collection of tables which can provides you hardware information. In these methods I choose interrupt calls, CPUID instruction to display hardware information of the system.
In my function which I add to existing kernel  it can show Processor Brand, Processor Type, Ram Size, system date and time, check the availability of serial ports, floppy drives, printers, co-processors and mouse.
Following articles will explain the steps which I took to develop this operating system, It will explain step by step to develop a OS like that.

http://www.insightforfuture.blogspot.com/2010/11/useful-techniques-in-assembly.html
http://www.insightforfuture.blogspot.com/2010/11/x86-assembly-if-else-control-structures.html
http://www.insightforfuture.blogspot.com/2010/11/bios-interrupt-calls-to-get-hardware.html
http://www.insightforfuture.blogspot.com/2010/11/find-hardware-infodo-you-know-how.html
http://www.insightforfuture.blogspot.com/2010/11/smbios-gives-hardware-specifications.html

Next I will Explain the source code of this new functionality,

This is the shell command which is responsible for run the hardware info;

    hwi:                    ;;;;;;;;This is the place hardware info Procedure Starts
    mov SI,strCmd0               
    mov DI,hw               
    call os_string_strincmp            ;check is the entered command is HW_Info
    jc    hardware_info            ;if it is call the hardware info function
    jmp _cmd_ver                ;else go to next shell command
    else:
    jmp _cmd_done ;;;;;;;;;End of the Hardware info call




This is the code where the original functionality lies, These assembly code are responsible to retrieve hardware info by using interrupt calls.




;;;;;;;;;;;;;;Start of Hardware Info;;;;;;;;;;;;;;

hardware_info:

    mov si,ent   
    call    _disp_str   

    mov si,hwinfo
    call    _disp_str   

    mov si,ent   
    call    _disp_str   

;;;;;;;;;;;;Processor Info Display;;;;;;;;;;;;;;;;   

    mov si,pinfo
    call    _disp_str

    mov eax,0
    cpuid
    mov [vendor_id],ebx            ;getting the cpu brand from ebx,ecx,edx
    mov [vendor_id+4],edx
    mov [vendor_id+8],ecx
    mov si,processor
    call    _disp_str
    mov si,vendor_id
    call    _disp_str

    mov si,ent   
    call    _disp_str

    mov si,processort
    call    _disp_str

    mov eax,80000002h
    cpuid
    mov [processor_type],eax        ;getting the cpu type string  brand from ebx,ecx,edx,eax
    mov [processor_type+4],ebx
    mov [processor_type+8],ecx
    mov [processor_type+12],edx
    mov si,processor_type
    call    _disp_str

    mov eax,80000003h
    cpuid
    mov [processor_type1],eax
    mov [processor_type1+4],ebx
    mov [processor_type1+8],ecx
    mov [processor_type1+12],edx
    mov si,processor_type1
    call    _disp_str       
   
    mov eax,80000004h
    cpuid
    mov [processor_type2],eax
    mov [processor_type2+4],ebx
    mov [processor_type2+8],ecx
    mov [processor_type2+12],edx
    mov si,processor_type2
    call    _disp_str

    mov si,ent   
    call    _disp_str

    ;;;;;;;;;;;;;;;RAM Info Display;;;;;;;;;;;;;;;;;;

    mov si,rinfo
    call    _disp_str
    mov si,ram   
    call    _disp_str

    MOV AX, 0xE801
    INT 0x15                ;calling the intruupt to get ram size in 64kb blocks
    call hex2dec

    mov si,ent   
    call    _disp_str

    ;;;;;;;;;;;;;;;Other Info Display;;;;;;;;;;;;;;;;;
    int 11h                ;calling the intruupt to get pheriperal device info
    mov cx,ax

    mov si,oinfo
    call    _disp_str

    ;;;;;;;;;;;;;;Check for Floppy Drive;;;;;;;;;;;;;;

    and ax,1h
    cmp ax,0h
    jz ifblock0
    jmp elseblock0
    ifblock0:
    mov si, floppyNotPresent
    call    _disp_str
        jmp end0
    elseblock0:
    mov si, floppyPresent
    call    _disp_str
    end0:
    mov ax,cx   
   
    ;;;;;;;;;;;;;;Check for Math Co-Processor;;;;;;;;

    and ax,2h
    cmp ax,0h
    jz ifblock1
    jmp elseblock1
    ifblock1:
    mov si, mathaNotPresent
    call    _disp_str
        jmp end1
    elseblock1:
    mov si, mathaPresent
    call    _disp_str
    end1:
    mov ax,cx   

    ;;;;;;;;;;;;;Check for Joystick;;;;;;;;;;;;;;;;;;

    and ax,800h
    cmp ax,0h
    jz ifblock2
    jmp elseblock2
    ifblock2:
    mov si, joyNotPresent
    call    _disp_str
        jmp end2
    elseblock2:
    mov si, joyPresent
    call    _disp_str
    end2:
    mov ax,cx   

    ;;;;;;;;;;;;;Check for Serial Printer;;;;;;;;;;;;;

    and ax,1000h
    cmp ax,0h
    jz ifblock3
    jmp elseblock3
    ifblock3:
    mov si, printerNotPresent
    call    _disp_str
        jmp end3
    elseblock3:
    mov si, printerPresent
    call    _disp_str
    end3:
    mov ax,cx   

    ;;;;;;;;;;;;Check for Serial Ports;;;;;;;;;;;;;;;;

    and ax,700h

    cmp ax,0h
    jz ifblock4_s0
    ifblock4_s0:
    mov si, s0
    call    _disp_str
        jmp end4 
    
    cmp ax,100h
    jz ifblock4_s1
    ifblock4_s1:
    mov si, s1
    call    _disp_str
        jmp end4

    cmp ax,200h
    jz ifblock4_s2
    ifblock4_s2:
    mov si, s2
    call    _disp_str
        jmp end4
    cmp ax,300h
    jz ifblock4_s3
    ifblock4_s3:
    mov si, s3
    call    _disp_str
        jmp end4
    cmp ax,400h
    jz ifblock4_s4
    ifblock4_s4:
    mov si, s4
    call    _disp_str
        jmp end4
    cmp ax,500h
    jz ifblock4_s5
    ifblock4_s5:
    mov si, s5
    call    _disp_str
        jmp end4
    cmp ax,600h
    jz ifblock4_s6
    ifblock4_s6:
    mov si, s6
    call    _disp_str
        jmp end4

    cmp ax,700h
    jz ifblock4_s7
    ifblock4_s7:
    mov si, s7
    call    _disp_str
        jmp end4
    end4:
    mov ax,cx   

    ;;;;;;;;;;;;;;Check for Mouse;;;;;;;;;;;;;;;;

     int 33h                  ; call interrupt 33h function 0
     cmp ax,0ffffh            ; compare AX and FFFFh (installed)
     jz endmouse              ; it is? Jump to the end!
     mov si, nmouse
     call    _disp_str
     jmp end5
    endmouse:
     mov si, mouse
     call    _disp_str    
    end5:

    ;;;;;;;;;;;;;;Display Date and Time;;;;;;;;;;;;

    call os_get_date_string
    mov si,date_time
    call    _disp_str        
    mov si, BX
    call    _disp_str
    call os_get_time_string
    mov si, space
    call    _disp_str
    mov si, BX
    call    _disp_str

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
jmp else

If you want further info about this please contact me.

7 comments:

  1. This comment has been removed by the author.

    ReplyDelete