Written in front: homemade operating system Gos Chapter 2 Chapter 2: the main content is the transfer of power in CPU and how to control BIOS and MBR
Students with operating system foundation know that when the operating system is powered on, the BIOS will be loaded first, and then the BIOS will load the operating system. This process seems very simple, but in fact, there are many details we don't understand, and these details officially master the Dragon killing technology of the operating system.
What is BIOS
The whole process of BIOS is the Base Input Output System, that is, the basic input system. You can see that there are several keywords: basic, input and output, system.
There are several questions:
- What does basic mean?
- What are the inputs and outputs?
Let's look at the basic meaning first.
8086 real mode memory layout focus!!!
There are a total of 20 addresses in Intel 8086, so the address range that the CPU can access is 220 = 1M. This valuable 1M space is divided into the following areas:
|FFFF0||FFFFF||16B||BIOS entry address. The content here is mainly jmp f000:e05b|
|F0000||FFFEF||64KB-16B||Other BIOS addresses|
|C8000||EFFFF||160KB||Mapped hardware adapter ROM or memory mapped I/O|
|C0000||C7FFF||32KB||Display adapter BIOS|
|B8000||BFFFF||32KB||Adapter for text mode display|
|B0000||B7FFF||32KB||Adapter for black and white display|
|A0000||AFFFF||64KB||Adapter for color display|
|9FC00||9FFFF||1KB||EBDA extended BIOS data area|
|7E00||7DFF||512B||MBR loading area|
|500||4FF||256B||BIOS data area|
|000||3FF||1KB||Interrupt vector table|
This watch is very important. It is equivalent to the sword Manual of our dragon killing skill. We have to rely on him to kill the dragon.
Let's look at the area from 0xffff0 to 0xfffff at the beginning. The 64KB memory is ROM, which stores BIOS code. The main work of BIOS is to detect and initialize the hardware. This process is enlarged to see that BIOS calls the hardware driver function provided by the hardware driver. In addition, another thing BIOS does is initialize the interrupt vector table, so that the interrupt function can be called through the assembly instruction of int interrupt number.
Why is it called basic input and output? Because BIOS works in real mode, it doesn't need to do all the work. It only needs to complete the basic initialization. The really broad sea of stars is in protection mode!
From the beginning of our whole article, we know that BIOS is the first software started by the whole computer, so who started it? Is it bootstrapping?
It's actually hardware. In real mode, x86 CPU accesses memory through segment base register cs and segment offset register ip. At the moment of startup, the cs:ip of the CPU is initialized to 0xF000:0xFFF0, which is the entry address of the BIOS.
In the x86 mode, there is a convention that in order for a 16 bit register to access a 20 bit memory space, the segment base address needs to be shifted by 4 bits to the left, so 0xF000:0xFFF0 here is actually equivalent to 0xFFFF0
After that, the BIOS executes the instruction jmp f000:e05b and jumps to the place where the BIOS really starts to execute. After that, the BIOS starts to detect the peripheral information such as memory and graphics card. When the detection passes and initializes the hardware, the BIOS will establish an interrupt vector table at 0x000~0x3FF and fill in the interrupt routine.
When the BIOS is initialized successfully, he completes his work. Then he will hand over the power to the MBR. He is the first program we can control.
What is MBR
MBR is the Main Boot Record. It is located in the first sector of the whole hard disk, that is, 0 disk, 0 channel and 1 sector. This sector is called MBR boot sector. The contents of this boot sector are as follows:
- 446 byte boot program and parameters
- 64 byte partition table
- 2-byte end flags 0x55 and 0xaa
As for how the power is transferred, the BIOS detects the 0x55 and 0xaa marks from the beginning of the disk after completing the work. When they are detected, he thinks this is the successor MBR.
After that, the BIOS loads the 512 bytes to 0x7c00, and then jmp goes there. In this way, the handover of power is completed and the code in the MBR is executed.
Contents of MBR
Finally, the hard dish came. We began to control the operating system, starting with our MBR program. The following code is the content of the program. I can't understand the comments in the comment area.
;Master bootstrap SECTION MBR vstart=0x7c00 mov ax,cs ;use cs Register to initialize other registers mov ds,ax mov es,ax mov ss,ax mov fs,ax mov sp,0x7c00 ;Initialize stack pointer ; Clear screen utilization 0 x06 No. function, roll up all lines and clear the screen ; int 0x10 Function No.: 0 x60 Function Description: roll up window ; Input: ; AH Function No.: 0 x06 ; AL = Number of rows rolled up(0 Represent all) ; BH = Roll up row properties ; (CL,CH) = Upper left corner of window(x,y) Location of ; (DL,DH) = Lower right corner of window(x,y)Location of ; No return value! mov ax,0x600 mov bx,0x700 mov cx,0 ;top left corner(0,0) mov dx,0x184f ;Lower right corner(80,25) ;VAG In text mode, a line can only hold 80 characters, a total of 25 lines ;The subscript starts at 0, so 0 x18=24，0x4f=79 int 0x10 ;System call number 10 ;The following three lines of assembly code get the cursor position ; .get_cursor Gets the position of the current cursor and prints characters at the cursor position mov ah,3 ;input:3 The sub function of No. is to obtain the cursor position, which needs to be saved ah register mov bh,0 ;bh The register stores the page number of the cursor to be obtained int 0x10 ;Output: ch=The cursor starts the line, cl=Cursor end line ;dh=The line number of the cursor, dl=Column number of cursor ;Print string ;Or 10 h interrupt,However, this time, sub function 13 is called to print the string mov ax,message mov bp,ax ;es:bp Is the first address of the string, es Same at this time cs Consistent, already at the beginning sreg initialization ;Registers are used for cursor positions dx Content in, cs Cursor position in can be ignored mov cx,12 ;cx Is the string length, excluding the number of characters with terminator 0 mov ax,0x1301 ;The sub function number 13 is a real character and attribute to be stored ah register ;al Set character writing mode al=01: The string is displayed and the cursor moves with it mov bx,0x2 ;bh Store the page number to display, here is page 0 ;bl In is the character attribute, and the attribute is green on a black background(bl=02h) int 0x10 ;implement BIOS 0x10 No. interrupt ;Program hovers here jmp $ message db "hello,world!" times 510-($-$$) db 0 ；Expanded to 510 bytes db 0x55,0xaa
After that, we call nasm to compile this assembly code:
# Compile command nasm -o mbr.bin mbr.S
Then use the dd tool to write it into the first sector of the disk hd60M.img we created earlier:
# The generated executable file is written to disk 0, track 0 and sector 1 of hd60M.img virtual hard disk # Remember to change your bochs address after of sudo dd if=/home/ik/workspace/mbr.bin of=/bochs/bo_tmp/bin/hd60M.img bs=512 count=1 conv=notrunc
Then go to the place where you installed bochs and run the following command. Let's see the results:
 Deep understanding of computer systems  Operating system truth restore