рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рдореИрдВрдиреЗ рдПрдХ рдпреВрдПрд╕рдмреА-рдбреНрд░рд╛рдЗрд╡ рдореЗрдВ рд▓рд┐рдирдХреНрд╕-рдЫрд╡рд┐ рдХреЛ рддреИрдирд╛рдд рдХрд┐рдпрд╛ (рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдпрд╣ рдордВрдЬреВрд░реЛ рдирд┐рдХрд▓рд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд╣рд╛рдиреА рд╣реИ), рдФрд░ рдЕрдЬреАрдм рд╡рд┐рдЪрд╛рд░ рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ рдШреВрдорддреЗ рд╣реИрдВ: BIOS рдиреЗ рдпреВрдПрд╕рдмреА рдлреНрд▓реИрд╢ рдбреНрд░рд╛рдЗрд╡ рджреЗрдЦрд╛, рдФрд░ рдлрд┐рд░ рдХреНрдпрд╛? рдЦреИрд░, рд╣рд╛рдБ, рдПрдХ MBR рд╣реИ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ GRUB, рдФрд░ ... рдФрд░ MBR рдореЗрдВ рдПрдХ рдмрд╛рд░ рдХрд┐рд╕реА рдФрд░ рдХреЗ рдХрд╕реНрдЯрдо рдХреЛрдб рдХреЛ рдкреЙрдк рдЕрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ Adygea рдХрд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реНрдпрдХреНрддрд┐ "рдмрдбрд╝реЗ" рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдХреБрдЫ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд╣рд░ред
рдФрд░ рдЪреВрдВрдХрд┐ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдРрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдмрд╣реБрдд рд╣реА рд╕рд╛рд╣рд╕рд┐рдХ рд╣реИ, рдФрд░ рд╣рдо рдЕрд╕реЗрдВрдмрд▓рд░реЛрдВ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реАрдзреЗ 8086 рдХреЗ рд▓рд┐рдП opcodes рдкрд░ рдЦрд░реНрдЪ рдХрд░реЗрдВрдЧреЗред

рдкрд░рд┐рдЪрдп
рдпреЛрдЬрдирд╛:
- рдирд┐рдХрд╛рд▓рдирд╛
#
- рдирд┐рдХрд╛рд▓рдирд╛
Hello, Habrauser!
- рдЗрдирдкреБрдЯ рд╡рд░реНрдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ (рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдЪреНрдЪреЛрдВ рдХрд╛ рдордиреЛрд░рдВрдЬрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред
рдЕрд╕реНрд╡реАрдХрд░рдг рдФрд░ рдЕрд╕реНрд╡реАрдХрд░рдг
рдлреНрд▓рд╛рдкрд░ рдХреА рдЧрд░реНрдЬрдирд╛ рд╕реЗ рдкрд░реЗрд╢рд╛рди рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рд╢рд┐рдХреНрд╖рдг рджреЗрдВрдЧреЗ рдмрд┐рд▓реНрд▓реА рдХреА QEMU. , , dd
x86- . .
MBR, - (?) (?) тАФ , Enter
. .
тАФ , ( !) - . ( .) ! .
MBR
:
- ,
Bootstrap Area
. - , ( )
0x7c00
( Compaq). - , , ( , --). : 640KB, . ( , .)
, тАФ , .
, , , , (sic!) . , ( - ), , .
, - ┬л┬╗ 80- ┬л-┬╗ 90-, : ┬л┬╗ ┬л┬╗. ┬л┬╗, Lode Runner, ┬л┬╗.
┬л┬╗ +
!
-, , , , , тАФ errata.
, , , .
:
- ,
MOV
, INT
, ADD
, DIV
тАФ , , , . , , , . - , , , :
imm8
, r16
, r/m32
, rel8
. , , (, ) , , DIV BL
F6 F3
(DIV
r/m8
, , , тАФ .) F6
тАФ DIV
, NEG
, ( opcode extension
тАФ .)
, , dd
, , , , , тАФ , , -. -, тАж , POSIX , !
тЮЬ $ echo "48 65 6c 6c 6f 2c 20 48 61 62 72 21" | xxd -r -p
Hello, Habr!%
:
тЮЬ $ echo -e "# Comment\n48 65 6c 6c 6f 2c 20 # First line\n48 61 62 72 21 # Last line" | sed 's/#.*$//g' | xxd -r -p
Hello, Habr!%
( sed
-, xxd
, hex-dump. ?)
, , .
, sh-#!/bin/sh
IN="${1:-/dev/stdin}"
OUT="${2:-/dev/stdout}"
> $OUT
while read line
do
echo "$line" | sed 's/#.*$//' | xxd -r -p >> $OUT
done < $IN
: LF
(aka \n
), . , , , , - , тАФ .
тАФ , !
тЮЬ $ ./build loader.mbr loader.img && stat -f %z loader.img
512
512 тАФ , . , .
, bin
- 512B, . ┬л dd
/dev/zero
, !┬╗ тАФ . , c ( , ipython
) !
,
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
, , , QEMU, Exception'.

, , ( ), MBR.
,...
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00
, :
55 AA
:
$ qemu-system-i386 -nic none loader.img
-nic none
, PXE, тАФ .

, BIOS , ! , !
PRINT "#"
, !
, . :
B4 0E
B0 23
CD 10
00 00
00 00 00 00 00 00 00 00
( , 512).
, QEMU !

, , , , :
B4 0E
тАФ AH
0E
( mov ah, 0e
), BIOS ( ), , .B0 23
тАФ : AL
#
. ? ┬л┬╗? тАФ ASCII- man ascii
!CD 10
тАФ : BIOS-, . , AL
AH
, , : .
, AL
:
$
(B0 24
)%
(B0 25
)├б
(B0 A0
, )
PRINT "Hello, Habrauser!"
, , . .
- . тАФ printf('Hell of word')
.
, , :
,
B4 0E
B0 0A
CD 10
B0 48
CD 10
B0 65
CD 10
B0 6C
CD 10
B0 6C
CD 10
B0 6F
CD 10
B0 2C
CD 10
B0 20
CD 10
B0 48
CD 10
B0 61
CD 10
B0 62
CD 10
B0 72
CD 10
B0 61
CD 10
B0 75
CD 10
B0 73
CD 10
B0 65
CD 10
B0 72
CD 10
B0 21
CD 10
00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
,
, , :

:
- ,
- , ,
- , BIOS' тАФ - ,
Booting from Hard Disk...
.
, :
B8 00 06
CD 10
B4 0E
BE 80 7C
AC
3C 00
74 06
CD 10
EB F7
00 00 00 00 00
00 00 00 00 00 00 00 00
...
48 65 6C 6C 6F 2C 20 48
61 62 72 61 75 73 65 72
21
00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
:
- : ,
0x7c00
, . ? data- ( ), ( !), SI
тАФ . SI
AC
( LODS
). , SI
AL
, SI
! , !- . , . , , ?
AL
, , тАФ ( , 6 ), 00
.AL
- , BIOS-...- тАж 7 тАФ
LODS
!
, . , .
, - . : BIOS- . тАж . тАФ ( , тАФ ).
, . printer.mbr
typewriter.mbr
.
, :
B4 07
B0 00
CD 10
B4 00
CD 16
3C 0D
75 06
B4 0E
CD 10
B0 0A
B4 0E
CD 10
EB EC
1
:
- ( QEMU) .
AH = 00h
16h
, , , AL
.- , :
OD
(aka CR
aka
), Return
/Enter
, , ( -), . CR
CR
, LF
, , Enter
.AL
OD
, , .- : -- , ! 20 .
, :

, :
- , ┬л┬╗ ,
- , ,
- ┬л┬╗:
Backspace
, .
. emacs
- .
, .
, - :

, . , :
B8 12 00
CD 10
B4 0E
B3 00
FE C3
BE 80 7C
AC
3C 00
74 F6
CD 10
EB F7
00
00 00 00 00 00 00 00 00
...
48 65 6C 6C 6F 2C 20 48
61 62 72 61 68 61 62 72
21 20
00 00 00 00 00 00
00 00 00 00 00 00 00 00
color-printer.mbr
- (? ? BIOS?) , ,
BL
(. , .)FE
BL
- : , , , .
.
, .
, :
тАФ !
тАФ .
, Sublime Text :
тАФ --, ! !
.
- .
UPD: eisaev, Andrew_Pinkerton, MrSmith33, Anthony1025 , , .