Default x86 Port Address Assignments | ||||
---|---|---|---|---|
Address Range | First QWORD | Second QWORD | Third QWORD | Fourth QWORD |
0x000-0x00F | DMA Controller Channels 0-3 | |||
0x010-0x01F | System Use | |||
0x020-0x02F | Interrupt Controller 1 | System Use | ||
0x030-0x03F | System Use | |||
0x040-0x04F | System Timers | System Use | ||
0x050-0x05F | System Use | |||
0x060-0x06F | Keyboard/PS2 Moude (Port 0x60) Speaker (0x61) | Keyboard/PS2 Mouse (0x64) | System Use | |
0x070-0x07F | RTC/CMOS/NMI (0x70, 0x71) | DMA Controller Channels 0-3 | ||
0x080-0x08F | DMA Page Register 0-2 (0x81 - 0x83) | DMA Page Register 3 (0x87) | DMA Page Register 4-6 (0x89-0x8B) | DMA Page Register 7 (0x8F) |
0x090-0x09F | System Use | |||
0x0A0-0x0AF | Interrupt Controller 2 (0xA0-0xA1) | System Use | ||
0x0B0-0x0BF | System Use | |||
0x0C0-0x0CF | DMA Controller Channels 4-7 (0x0C0-0x0DF), bytes 1-16 | |||
0x0D0-0x0DF | DMA Controller Channels 4-7 (0x0C0-0x0DF), bytes 16-32 | |||
0x0E0-0x0EF | System Use | |||
0x0F0-0x0FF | Floating Point Unit (FPU/NPU/Mah Copprocessor) | |||
0x100-0x10F | System Use | |||
0x110-0x11F | System Use | |||
0x120-0x12F | System Use | |||
0x130-0x13F | SCSI Host Adapter (0x130-0x14F), bytes 1-16 | |||
0x140-0x14F | SCSI Host Adapter (0x130-0x14F), bytes 17-32 | SCSI Host Adapter (0x140-0x15F), bytes 1-16 | ||
0x150-0x15F | SCSI Host Adapter (0x140-0x15F), bytes 17-32 | |||
0x160-0x16F | System Use | Quaternary IDE Controller, master slave | ||
0x170-0x17F | Secondary IDE Controller, Master drive | System Use | ||
0x180-0x18F | System Use | |||
0x190-0x19F | System Use | |||
0x1A0-0x1AF | System Use | |||
0x1B0-0x1BF | System Use | |||
0x1C0-0x1CF | System Use | |||
0x1D0-0x1DF | System Use | |||
0x1E0-0x1EF | System Use | Tertiary IDE Controller, master slave | ||
0x1F0-0x1FF | Primary IDE Controller, master slave | System Use | ||
0x200-0x20F | Joystick Port | System Use | ||
0x210-0x21F | System Use | |||
0x220-0x22F | ||||
Sound Card | ||||
Non-NE2000 Network Card | System Use | |||
0x230-0x23F | SCSI Host Adapter (0x220-0x23F), bytes 17-32) | |||
0x240-0x24F | ||||
Sound Card | ||||
Non-NE2000 Network Card | System Use | |||
NE2000 Network Card (0x240-0x25F) Bytes 1-16 | ||||
0x250-0x25F | NE2000 Network Card (0x240-0x25F) Bytes 17-32 | |||
0x260-0x26F | ||||
Sound Card | ||||
Non-NE2000 Network Card | System Use | |||
NE2000 Network Card (0x240-0x27F) Bytes 1-16 | ||||
0x270-0x27F | ||||
System Use | Plug and Play System Devices | LPT2 - Second Parallel Port | ||
System Use | LPT3 - Third Parallel Port (Monochrome Systems) | |||
NE2000 Network Card (0x260-0x27F) Bytes 17-32 | ||||
0x280-0x28F | ||||
Sound Card | ||||
Non NE2000 Network Card | System Use | |||
NE2000 Network Card (0x280-0x29F) Bytes 1-16 | ||||
0x290-0x29F | NE2000 Network Card (0x280-0x29F) Bytes 17-32 | |||
0x2A0-0x2AF | ||||
Non NE2000 Network Card | System Use | |||
NE2000 Network Card (0x280-0x29F) Bytes 1-16 | ||||
0x2B0-0x2BF | NE2000 Network Card (0x280-0x29F) Bytes 17-32 | |||
0x2C0-0x2CF | System Use | |||
0x2D0-0x2DF | System Use | |||
0x2E0-0x2EF | System Use | COM4 - Fourth Serial Port | ||
0x2F0-0x2FF | System Use | COM2 - Second Serial Port | ||
0x300-0x30F | ||||
Sound Card / MIDI Port | System Use | |||
Non NE2000 Network Card | System Use | |||
NE2000 Network Card (0x300-0x31F) Bytes 1-16 | ||||
0x310-0x31F | NE2000 Network Card (0x300-0x32F) Bytes 17-32 | |||
0x320-0x32F | ||||
Sound Card / MIDI Port (0x330, 0x331) | System Use | |||
NE2000 Network Card (0x300-0x31F) Bytes 17-32 | ||||
SCSI Host Adapter (0x330-0x34F) Bytes 1-16 | ||||
0x330-0x33F | ||||
Sound Card / MIDI Port | System Use | |||
Non NE2000 Network Card | System Use | |||
NE2000 Network Card (0x300-0x31F) Bytes 1-16 | ||||
0x340-0x34F | ||||
SCSI Host Adapter (0x330-0x34F) Bytes 17-32 | ||||
SCSI Host Adapter (0x340-0x35F) Bytes 1-16 | ||||
Non NE2000 Network Card | System Use | |||
NE2000 Network Card (0x340-0x35F) Bytes 1-16 | ||||
0x350-0x35F | ||||
SCSI Host Adapter (0x340-0x35F) Bytes 17-32 | ||||
NE2000 Network Card (0x300-0x31F) Bytes 1-16 | ||||
0x360-0x36F | ||||
Tape Accelerator Card (0x360) | System Use | Quaternary IDE Controller (Slave Drive)(0x36E-0x36F) | ||
Non NE2000 Network Card | System Use | |||
NE2000 Network Card (0x300-0x31F) Bytes 1-16 | ||||
0x370-0x37F | ||||
Tape Accelerator Card (0x370) | Secondary IDE Controller (Slave Drive) | LPT1 - First Parallel Port (Color systems) | ||
System Use | LPT2 - Second Parallel Port (Monochrome Systems) | |||
NE2000 Network Card (0x360-0x37F) Bytes 1-16 | ||||
0x380-0x38F | System Use | Sound Card (FM Synthesizer) | System Use | |
0x390-0x39F | System Use | |||
0x3A0-0x3AF | System Use | |||
0x3B0-0x3BF | VGA/Monochrome Video | LPT1 - First Parallel Port (Monochrome Systems) | ||
0x3C0-0x3CF | VGA/CGA Video | |||
0x3D0-0x3DF | VGA/CGA Video | |||
0x3E0-0x3EF | ||||
Tape Accelerator Card (0x370) | System Use | COM3 - Third Serial Port | ||
System Use | Tertiary IDE Controller (Slave Drive)(0x3EE-0x3EF) | |||
0x3F0-0x3FF | ||||
Floppy Disk Controller | COM1 - First Serial Port | |||
Tape Accelerator Card (0x3F0) | Primary IDE Controller (Slave Drive)(0x3F6-0x3F7) | System Use |
Hello World Operating System
So lets start making our little operating system and as tradition first we will make a hello world operating system.So things you should known before making operating system like what tool you gonna use....An operating system (OS) is a set of programs that manage computer hardware resources and provide common services for application software.
HeLLo World Operating System Part 2
When a computer starts up ( obviously by pressing the power button), the first thing that occurs is it send a signal to motherboard which in turn starts the power supply. After supplying the correct amount of power to each device, it send a signal called "Power OK" to BIOS which resides on motherboard.
This is featured post 3 title
Replace these every slider sentences with your featured post descriptions.Go to Blogger edit html and find these sentences.Now replace these with your own descriptions.
Thursday, 23 February 2012
Default x86 Port Address Assignments
Tuesday, 21 February 2012
HeLLo World Operating System Part 2
So finally in this section we are going to build a small bootloader that will say helloworld on console.
When a computer starts up ( obviously by pressing the power button), the first thing that occurs is it send a signal to motherboard which in turn starts the power supply. After supplying the correct amount of power to each device, it send a signal called "Power OK" to BIOS which resides on motherboard.
Once the BIOS receive the "Power OK" signal, it starts the booting process by first initializing a process called POST (Power On Self Test). POST first check that every device has right amount of power and then it check whether the memory is not corrupted. Then it initialize each devices and finally it gives control to BIOS for further booting.
Now the final process of booting begins. For this the BIOS first find 512 bytes of image called MBR (Master Boot Record) or Bootsector from the floppy disk or hard disk which is used for booting. The priority of boot devices is set by the user in BIOS setting. The normal priority is floppy disk first, then hard disk.
Once BIOS finds the bootsector it loads the image in memory and execute it. If a valid bootsector is not found, BIOS check for next drive in boot sequence until it find valid bootsector. If BIOS fails to get valid bootsector, generally it stops the execution and gives an error message "Disk boot failure".
It is bootsectors responsibility to load the operating system in memory and execute it.
bootloader |
Master Boot Record
A device is "bootable" if it carries a boot sector with the byte sequence 0x55, 0xAA{signature} in bytes 511 and 512 respectively. When the BIOS finds such a boot sector, it is loaded into memory at a specific location; this is usually 0x0000:0x7c00 (segment 0, address 0x7c00). However, some BIOS' load to 0x7c0:0x0000 (segment 0x07c0, offset 0), which resolves to the same physical address, but can be surprising.On a hard drive, the so-called Master Boot Record (MBR) holds executable code at offset 0x0000 - 0x01bd, followed by table entries for the four primary partitions, using sixteen bytes per entry (0x01be - 0x01fd), and the two-byte signature (0x01fe - 0x01ff).
The layout of the table entries is as follows:
Offset | Size (bytes) | Description |
---|---|---|
0x00 | 1 | Boot Indicator (0x80=bootable, 0x00=not bootable) |
0x01 | 1 | Starting Head Number |
0x02 | 2 | Starting Cylinder Number (10 bits) and Sector (6 bits) |
0x04 | 1 | Descriptor (Type of partition/filesystem) |
0x05 | 1 | Ending Head Number |
0x06 | 2 | Ending Cylinder and Sector numbers |
0x08 | 4 | Starting Sector (relative to begining of disk) |
0x0C | 4 | Number of Sectors in partition |
bootloader.asm
[BITS 16] ;Tells 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
MOV SI,String ;Store string pointer to SI
CALL PrintString ;Call print string procedure
JMP $ ;Infinite loop, hang it here.
PrintCharacter: ;Procedure to print character on screen
;Assume that ASCII value is in register AL
MOV AH, 0x0E ;Tell BIOS that we need to print one charater on screen.
MOV BH, 0x00 ;Page no.
MOV BL, 0x07 ;Text attribute 0x07 is lightgrey font on black background
INT 0x10 ;Call video interrupt
RET ;Return to calling procedure
PrintString: ;Procedure to print string on screen
;Assume that string starting pointer is in register SI
next_character: ;Lable to fetch next character from string
MOV AL, [SI] ;Get a byte from string and store in AL register
INC SI ;Increment SI pointer
OR AL, AL ;Check if value in AL is zero (end of string)
JZ exit_function ;If end then return
CALL PrintCharacter ;Else print the character which is in AL register
JMP next_character ;Fetch next character from string
exit_function: ;End label
RET ;Return from procedure
;Data
String db 'Hello World', 0 ;HelloWorld string ending with 0
TIMES 510 - ($ - $$) db 0 ;Fill the rest of sector with 0
DW 0xAA55 ;Add boot signature at the end of bootloader
[BITS 16]
: Our code starts with [BITS 16] which is an assembler directive. This will tell assembler that our code is a 16 bit code.[ORG 0x7C00]
: Then we have used [ORG 0x7C00] which tell
assembler to assemble the instructions from Origin 0x7C00. BIOS loads
bootloader at physical address 0x7C00 hence we have assemble our
bootloader starting from that location.JMP $
: JMP at location $ means jumping to the same
location. Thus this nothing but an infinite loop. We just want to hang
our code here.TIMES 510 - ($ - $$) db 0
: As bootloader is always of
length 512 bytes, our code does not fit in this size as its small. We
need to use rest of memory and hence we clear it out using TIMES
directive. $ stands for start of instruction and $$ stands for start of
program. Thus ($ - $$) means length of our code.DW 0xAA55
: This is boot signature. This tells the BIOS
that this is a valid bootloader. If bios does not get 0x55 and 0xAA at
the end of the bootloader than it will treat bootloader as invalid. Thus
we provide this two bytes at the end of our bootloader.MOV BH, 0x00
MOV BL, 0x07
predefined interrupt table is used like OEh is used to print character on tty mode.
I am also providing interrupt table so you can easily refer to it from here:
Interrupt table
A list of common BIOS interrupts can be found below. Note that some BIOSes (particularly old ones) will not support all of these interrupts.Interrupt vector | Description | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
00h |
CPU: Executed after an attempt to divide by zero or when the quotient does not fit in the destination | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
01h |
CPU: Executed after every instruction while the trace flag is set | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
02h |
CPU: NMI, used e.g. by POST for memory errors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
03h |
CPU: The lowest non-reserved interrupt, it is used exclusively for debugging, and the INT 03 handler is always implemented by a debugging program |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
04h |
CPU: Numeric Overflow. Usually caused by the INTO instruction when the overflow flag is set. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
05h |
Executed when Shift-Print screen is pressed, as well as when the BOUND instruction detects a bound failure. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
06h |
CPU: Called when the Undefined Opcode (invalid instruction) exception occurs. Usually installed by the operating system. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
07h |
CPU: Called when an attempt was made to execute a floating-point instruction and no numeric coprocessor was available. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
08h |
IRQ0: Implemented by the system timing component; called 18.2 times per second (once every 55 ms) by the PIC | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
09h |
IRQ1: Called after every key press and release (as well as during the time when a key is being held) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0Bh |
IRQ3: Called by serial ports 2 and 4 (COM2/4) when in need of attention | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0Ch |
IRQ4: Called by serial ports 1 and 3 (COM1/3) when in need of attention | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0Dh |
IRQ5: Called by hard disk controller (PC/XT) or 2nd parallel port LPT2 (AT) when in need of attention | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0Eh |
IRQ6: Called by floppy disk controller when in need of attention | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0Fh |
IRQ7: Called by 1st parallel port LPT1 (printer) when in need of attention | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
10h |
Video Services - installed by the BIOS or operating system; called by software programs
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
11h |
Installed by the BIOS; returns equipment list | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
12h |
Installed by the BIOS or operating system; returns Conventional Memory Size | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
13h |
Low Level Disk Services; installed by the BIOS or operating system; called by software programs
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
14h |
Routines for communicating via the serial port. Used by software programs.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
15h |
Miscellaneous (System services support routines)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
16h |
Implemented by the BIOS or operating system. Provides routines to be
called by software programs which communicate with the keyboard.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
17h |
Print Services - used by software programs to communicate with the printer
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
18h |
Execute Cassette BASIC: True IBM computers contain BASIC in the ROM to be interpreted and executed by this routine in the event of a boot failure (called by the BIOS) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
19h |
After POST this interrupt is used by BIOS to load the operating system. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1Ah |
Real Time Clock Services - called by software programs to communicate with the RTC
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1Bh |
Installed by the operating system; automatically called by INT 9 when Ctrl-Break has been pressed |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1Ch |
Called automatically by INT 08 ; available for use by software programs when a routine needs to be executed regularly |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1Dh |
Not to be called; simply a pointer to the VPT (Video Parameter Table), which contains data on video modes | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1Eh |
Not to be called; simply a pointer to the DPT (Diskette Parameter Table), containing a variety of information concerning the diskette drives | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1Fh |
Not to be called; simply a pointer to the VGCT (Video Graphics Character Table), which contains the data for ASCII characters 80h to FFh |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
41h |
Address pointer: FDPT = Fixed Disk Parameter Table (1st hard drive) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
46h |
Address pointer: FDPT = Fixed Disk Parameter Table (2nd hard drive) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4Ah |
Called by RTC for alarm | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
70h |
IRQ8: Called by RTC | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
74h |
IRQ12: Called by mouse | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
75h |
IRQ13: Called by math coprocessor | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
76h |
IRQ14: Called by primary IDE controller | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
77h |
IRQ15: Called by secondary IDE controller |
Sunday, 19 February 2012
Hello World Operating System
So what is Operating System???