我再次将Linux映像部署到USB驱动器(由于某种原因,结果证明是Manjaro,但这是一个完全不同的故事),奇怪的想法浮现在脑海:BIOS看到了USB闪存驱动器,然后呢?好吧,是的,这里有一个MBR,很可能是GRUB,并且……并且,一旦在MBR中弹出了其他人的自定义代码,这意味着一个来自Adygea的简单人可以在“大型”计算机上但在操作系统之外进行编程。
而且由于使用高级语言进行此类操作实在太大胆了,而且我们不了解汇编程序,因此我们将直接针对8086的操作码进行维护。

介绍
计划:
- 退出
#
- 退出
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 , , .