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.