рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо RISC-V рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рдЙрд╕рдХреЗ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЗ рдкреНрд░рд┐рдЬреНрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ (рд╕рдВрдХрд▓рди рдФрд░ рд▓реЗрдЖрдЙрдЯ, рдЖрджрд┐рдо runtimes, рдХреЛрдбрд╛рдВрддрд░рдХ, рдФрд░ рдЕрдзрд┐рдХ) рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред рдореИрдВ рд╕реНрд╡рдпрдВ рдПрдХ рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░ рд╣реВрдВ, рдореИрдВ рдХрд╛рдо рдкрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╕реЗ рд▓реЗрдЦ рдЖрдпрд╛ рдерд╛! рдирд┐рдореНрди-рд╕реНрддрд░ рдХреА рдЕрд░рд╛рдЬрдХрддрд╛ рдХреА рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдЗрд╕ рд╡реНрдпрд╕реНрдд рдпрд╛рддреНрд░рд╛ рдкрд░ рдореБрдЭреЗ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред
рдкрд╣рд▓реЗ, рдЖрдЗрдП RISC-V рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рдмрд╛рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдорд╣рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВ, RISC-V рдЯреВрд▓рдХрд┐рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ, рдФрд░ рдПрдХ рд╕рд░рд▓ C рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ RISC-V рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдЪрд▓рд╛рдПрдБред
рд╕рд╛рдордЧреНрд░реА
- RISC-V рдХреНрдпрд╛ рд╣реИ?
- QEMU рдФрд░ RISC-V рдЯреВрд▓реНрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
- рд╣рд╛рдп RISC- рд╡реА!
- рднреЛрд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг
- рдкрд░реНрджрд╛ рдЙрдард╛рдирд╛ -рд╡
- рд╣рдорд╛рд░реЗ рдвреЗрд░ рдХреЛ рдЦреЛрдЬреЗрдВ
- рд╡реНрдпрд╡рд╕реНрдерд╛
- рдЗрд╕реЗ рд░реЛрдХреЛ!
Hammertime! рд░рдирдЯрд╛рдЗрдо!
- рдбреАрдмрдЧ рдХрд░реЗрдВ рд▓реЗрдХрд┐рди рдЕрдм рдЕрд╕рд▓реА рдХреЗ рд▓рд┐рдП
- рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?
- рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА
RISC-V рдХреНрдпрд╛ рд╣реИ?
RISC-V рдПрдХ рдирд┐: рд╢реБрд▓реНрдХ рдЕрдиреБрджреЗрд╢ рд╕реЗрдЯ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╣реИред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рд╢реБрд░реБрдЖрдд 2010 рдореЗрдВ рдмрд░реНрдХрд▓реЗ рдореЗрдВ рдХреИрд▓рд┐рдлреЛрд░реНрдирд┐рдпрд╛ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рд╕реЗ рд╣реБрдИред рдЗрд╕рдХреА рд╕рдлрд▓рддрд╛ рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдХреЛрдб рдХреА рдЦреБрд▓реЗрдкрди рдФрд░ рдЙрдкрдпреЛрдЧ рдХреА рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рднрд╛рдИ рдЧрдИ рдереА, рдЬреЛ рдХрдИ рдЕрдиреНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдереАред рдПрдЖрд░рдПрдо рд▓реЗрдВ: рдПрдХ рд╕рдВрдЧрдд рдкреНрд░реЛрд╕реЗрд╕рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
$ 1 рдорд┐рд▓рд┐рдпрди рд╕реЗ $ 10 рдорд┐рд▓рд┐рдпрди рдХрд╛ рдЕрдЧреНрд░рд┐рдо рд╢реБрд▓реНрдХ
рджреЗрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдмрд┐рдХреНрд░реА рдкрд░ 0.5 royal2% рдХреА рд░реЙрдпрд▓реНрдЯреА рдХрд╛ рднреБрдЧрддрд╛рди рднреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдФрд░ рдЦреБрд▓рд╛ рдореЙрдбрд▓ рдЖрд░рдЖрдИрдПрд╕рд╕реА-рд╡реА рдХреЛ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдХрд░реНрд╖рдХ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЗ рд▓рд┐рдП рдЬреЛ рдПрдЖрд░рдПрдо рдпрд╛ рдЕрдиреНрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХрд╛ рднреБрдЧрддрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдХрд╛рджрдорд┐рдХ рд╢реЛрдзрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдФрд░ (рдЬрд╛рд╣рд┐рд░ рд╣реИ) рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдПред
рдЖрд░рдЖрдИрдПрд╕рд╕реА-рд╡реА рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рд╡реГрджреНрдзрд┐ рдкрд░ рдХрд┐рд╕реА рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рдЧрдпрд╛ред рдПрдЖрд░рдПрдо
рдиреЗ рдЖрд░рдЖрдИрдПрд╕рд╕реА-рд╡реА (рд╕рд╛рдЗрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдВрдж рд╣реИ) рдкрд░ рдПрдЖрд░рдПрдо рдХреЗ рдХрдерд┐рдд рд▓рд╛рднреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдПрдХ рд╕рд╛рдЗрдЯ рд╢реБрд░реВ рдХреА (рдмрд▓реНрдХрд┐ рдЕрд╕рдлрд▓)ред RISC-V рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ
рдХрдИ рдмрдбрд╝реА рдХрдВрдкрдирд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдкреНрд░рд╛рдкреНрдд рд╣реИ, рдЬрд┐рд╕рдореЗрдВ Google, Nvidia рдФрд░ Western Digital рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
QEMU рдФрд░ RISC-V рдЯреВрд▓реНрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
рд╣рдо RISC-V рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдХреЛрдб рддрдм рддрдХ рдирд╣реАрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рд╕реНрдерд╛рдкрдирд╛ рдирд╣реАрдВ рдХрд░рддреЗред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рднреМрддрд┐рдХ RISC-V рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо
qemu рд▓реЗрддреЗ рд╣реИрдВред рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ
рд▓рд┐рдП рдЕрдкрдиреЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ
рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред рдореЗрд░реЗ рдкрд╛рд╕ MacOS рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрд╕ рдПрдХ рдХрдорд╛рдВрдб рджрд░реНрдЬ рдХрд░реЗрдВ:
рдЖрд╕рд╛рдиреА рд╕реЗ,
qemu
рдХрдИ рд░реЗрдбреА-рдЯреВ qemu-system-riscv32 -machine
рдорд╢реАрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ (
qemu-system-riscv32 -machine
)ред
рдЕрдЧрд▓рд╛, RISC-V рдФрд░ RISC-V рдЯреВрд▓ рдХреЗ рд▓рд┐рдП
OpenOCD рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
рдпрд╣рд╛рдВ RISC-V OpenOCD рдФрд░ RISC-V рдЯреВрд▓ рдХреА рддреИрдпрд╛рд░ рдЕрд╕реЗрдВрдмрд▓реА рдбрд╛рдЙрдирд▓реЛрдб
рдХрд░реЗрдВ ред
рд╣рдо рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реИ
~/usys/riscv
ред рдЗрд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рд░рдЦреЗрдВред
mkdir -p ~/usys/riscv cd ~/Downloads cp openocd-<date>-<platform>.tar.gz ~/usys/riscv cp riscv64-unknown-elf-gcc-<date>-<platform>.tar.gz ~/usys/riscv cd ~/usys/riscv tar -xvf openocd-<date>-<platform>.tar.gz tar -xvf riscv64-unknown-elf-gcc-<date>-<platform>.tar.gz
рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░
RISCV_OPENOCD_PATH
рдФрд░
RISCV_PATH
рд╕реЗрдЯ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣рдорд╛рд░реА рдЯреВрд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд╛ рд╕рдХреЗрдВред рдпрд╣ OS рдФрд░ рд╢реЗрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рднрд┐рдиреНрди рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ: рдореИрдВрдиреЗ рдкрдереЛрдВ рдХреЛ
~/.zshenv
рдЬреЛрдбрд╝рд╛ред
рдЗрд╕ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП
/usr/local/bin
рдореЗрдВ рдПрдХ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд▓рд┐рдВрдХ рдмрдирд╛рдПрдВ рддрд╛рдХрд┐ рдЖрдк рдЗрд╕реЗ
~/usys/riscv/riscv64-unknown-elf-gcc-<date>-<version>/bin/riscv64-unknown-elf-gcc
рдкреВрд░реНрдг рдкрде рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐рд╕реА рднреА рд╕рдордп рдЪрд▓рд╛ рд╕рдХреЗрдВред
~/usys/riscv/riscv64-unknown-elf-gcc-<date>-<version>/bin/riscv64-unknown-elf-gcc
ред
рдФрд░ рд╡реЛрдЗрд▓рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ RISC-V рдЯреВрд▓рдХрд┐рдЯ рд╣реИ! рд╣рдорд╛рд░реЗ рд╕рднреА рдирд┐рд╖реНрдкрд╛рджрдХ, рдЬреИрд╕реЗ рдХрд┐
riscv64-unknown-elf-gcc
,
riscv64-unknown-elf-gdb
,
riscv64-unknown-elf-ld
рдФрд░ рдЕрдиреНрдп,
~/usys/riscv/riscv64-unknown-elf-gcc-<date>-<version>/bin/
ред
рд╣рд╛рдп RISC- рд╡реА!
26 рдордИ, 2019 рдкреИрдЪ:
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, RISC-V QEMU рдореЗрдВ рдПрдХ рдмрдЧ рдХреЗ рдХрд╛рд░рдг, QEMU рдореЗрдВ рд╕реНрд╡рддрдВрддреНрд░рддрд╛-рдП-рдПрд╕рдбреАрдХреЗ 'рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб' рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдЪ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред рд▓реЗрдЦ рдХреЗ рдмрд╛рдж рдХреЗ рдЦрдВрдбреЛрдВ рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдореИрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд▓реЗрдЦ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реВрдВред
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВредрд╕реЗрдЯ рдЕрдк рдЯреВрд▓ рдХреЗ рд╕рд╛рде, рдЪрд▓реЛ рд╕рд░рд▓ RISC-V рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдЖрдЗрдП SiFive
рд╕реНрд╡рддрдВрддреНрд░рддрд╛-рдП-sdk рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреНрд▓реЛрди рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВ:
cd ~/wherever/you/want/to/clone/this git clone --recursive https://github.com/sifive/freedom-e-sdk.git cd freedom-e-sdk
рдкрд░рдВрдкрд░рд╛ рд╕реЗ , рдЖрдЗрдП
freedom-e-sdk
рднрдВрдбрд╛рд░ рд╕реЗ 'рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛' рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рдХрд░реЗрдВред рд╣рдо рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП
Makefile
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╡реЗ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдбрд┐рдмрдЧ рдореЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ:
make PROGRAM=hello TARGET=sifive-hifive1 CONFIGURATION=debug software
рдФрд░ QEMU рдореЗрдВ рдЪрд▓рд╛рдПрдВ:
qemu-system-riscv32 -nographic -machine sifive_e -kernel software/hello/debug/hello.elf Hello, World!
рдпрд╣ рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╢реБрд░реБрдЖрдд рд╣реИред рдЖрдк
freedom-e-sdk
рд╕реЗ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рд▓рд┐рдЦреЗрдВрдЧреЗ рдФрд░ рд╕реА рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред
рднреЛрд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг
рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬреЛ рдЕрд╕реАрдо рд░реВрдк рд╕реЗ рджреЛ рдирдВрдмрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
cat add.c int main() { int a = 4; int b = 12; while (1) { int c = a + b; } return 0; }
рд╣рдо рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ RISC-V рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдпрд╣
a.out
рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЪреВрдХ рдХрд░рддреА рд╣реИред рдЕрдм рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ
qemu
рдореЗрдВ рдЪрд▓рд╛рдПрдВ:
рд╣рдордиреЗ
riscv-qemu
рдорд╢реАрди рдХреЛ рдЪреБрдирд╛ рдЬреЛ рдХрд┐
рдореВрд▓ рд░реВрдк рд╕реЗ riscv-qemu
рдХреЗ riscv-qemu
рдЖрдИ riscv-qemu
ред
рдЕрдм рдЬрдм рд╣рдорд╛рд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо QEMU рдХреЗ рдЕрдВрджрд░ GDB рд╕рд░реНрд╡рд░ рдкрд░
localhost:1234
рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ RISC-V GDB рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдПрдХ рдЕрд▓рдЧ рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
рдФрд░ рд╣рдо GDB рдХреЗ рдЕрдВрджрд░ рд╣реИрдВ!
рдЗрд╕ GDB рдХреЛ "--host = x86_64-apple-darwin17.7.0 --target = riscv64-Unknown-elf" рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред тФВ
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП "рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рджрд┐рдЦрд╛рдПрдВ" рдЯрд╛рдЗрдк рдХрд░реЗрдВред тФВ
рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рджреЗрдЦреЗрдВ: please
<Http://www.gnu.org/software/gdb/bugs/>ред тФВ
рдСрдирд▓рд╛рдЗрди рдкрд░ GDB рдореИрдиреБрдЕрд▓ рдФрд░ рдЕрдиреНрдп рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╕рдВрд╕рд╛рдзрди рдЦреЛрдЬреЗрдВ: and
<Http://www.gnu.org/software/gdb/documentation/>ред тФВ
тФВ
рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП, "рд╕рд╣рд╛рдпрддрд╛" рдЯрд╛рдЗрдк рдХрд░реЗрдВред тФВ
"рд╢рдмреНрдж" рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЖрджреЗрд╢реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП "рдПрдкреНрд░реЛрдкреЛрд╕ рд╢рдмреНрдж" рдЯрд╛рдЗрдк рдХрд░реЗрдВ ... word
A.out рд╕реЗ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдкрдврд╝рдирд╛ ... out
(GDB)
рд╣рдо GDB рдореЗрдВред рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП
run
рдпрд╛ рдХрдорд╛рдВрдб
start
рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд▓рд╣рд╛рд▓ рдпрд╣ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд╣рдордиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ
riscv64-unknown-elf-gcc
рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдореЗрдЬрдмрд╛рди рдХреЛ
riscv64
рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░
riscv64
рдЪрд╛рд╣рд┐рдПред
рд▓реЗрдХрд┐рди рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИ! рдпрд╣ рд╕реНрдерд┐рддрд┐ GDB рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рдореЙрдбрд▓ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХрд╛ рдПрдХ рдореБрдЦреНрдп рдХрд╛рд░рдг рд╣реИред рд╣рдо
riscv64-unknown-elf-gdb
рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╣реЛрд╕реНрдЯ рдкрд░ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рдХреБрдЫ рджреВрд░рд╕реНрде рд▓рдХреНрд╖реНрдп (GDB рд╕рд░реНрд╡рд░) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдмрд╕
riscv-qemu
рд╢реБрд░реВ рдХрд┐рдпрд╛ рдФрд░ рд╣рдореЗрдВ
localhost:1234
рдкрд░ GDB рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ред рдмрд╕ рдЗрд╕ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:
(gdb) рд▓рдХреНрд╖реНрдп рджреВрд░рд╕реНрде: 1234 target
рд░рд┐рдореЛрдЯ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░: 1234
рдЕрдм рдЖрдк рдХреБрдЫ рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
(gdb) b main Breakpoint 1 at 0x1018e: file add.c, line 2. (gdb) b 5
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдХрд┐ GDB
continue
(рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрдорд╛рдВрдб
c
) рдЬрдм рддрдХ рд╣рдо рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддреЗ:
(gdb) c Continuing.
рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рдиреЛрдЯрд┐рд╕ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдпрд╣ рдЕрдЬреАрдм рд╣реИ ... рдХреНрдпрд╛ рд╣рдореЗрдВ рддреБрд░рдВрдд рдмреНрд░реЗрдХрдкрд╛рдЗрдВрдЯ
b 5
рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпрд╛ рд╣реБрдЖ?

рдпрд╣рд╛рдБ рдЖрдк рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
- рдкрд╛рда UI рд╕реНрд░реЛрдд рдирд╣реАрдВ рдвреВрдБрдв рд╕рдХрддрд╛ред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдФрд░ рдкрд╛рд╕ рдХреЗ рдХрд┐рд╕реА рднреА рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
- GDB рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╡рд░реНрддрдорд╛рди рдкрдВрдХреНрддрд┐ (
L??
) рдХреЛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ рдФрд░ рдХрд╛рдЙрдВрдЯрд░ 0x0 ( PC: 0x0
) рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
- рдЗрдирдкреБрдЯ рд▓рд╛рдЗрди рдореЗрдВ рдХреБрдЫ рдкрд╛рда, рдЬреЛ рдЕрдкрдиреА рд╕рдВрдкреВрд░реНрдгрддрд╛ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
0x0000000000000000 in ?? ()
0x0000000000000000 in ?? ()
рдЗрд╕ рддрдереНрдп рдХреЗ рд╕рд╛рде рдХрд┐ рд╣рдо рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ, рдпреЗ рд╕рдВрдХреЗрддрдХ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ: рд╣рдордиреЗ
рдХреБрдЫ рдЧрд▓рдд рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдХреНрдпрд╛?
рдкрд░реНрджрд╛ рдЙрдард╛рдирд╛ -рд╡
рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЖрдкрдХреЛ рдПрдХ рдХрджрдо рд╡рд╛рдкрд╕ рд▓реЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реБрдб рдХреЗ рддрд╣рдд рд╣рдорд╛рд░рд╛ рд╕рд░рд▓ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
main
рдХрд╛рд░реНрдп рдПрдХ рд╕рд░рд▓ рдЬреЛрдбрд╝ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ? рдЗрд╕реЗ
main
рдХреНрдпреЛрдВ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐
origin
рдпрд╛
begin
? рд╕рдореНрдореЗрд▓рди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рднреА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ
main
рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЬрд╛рджреВ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ?
рдЗрди рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЕрдкрдиреА рдЬреАрд╕реАрд╕реА рдЯреАрдо рдХреЛ
-v
рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рджреЛрд╣рд░рд╛рдПрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
riscv64-unknown-elf-gcc add.c -O0 -g -v
рдЖрдЙрдЯрдкреБрдЯ рдмрдбрд╝рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреВрд░реА рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрджреНрдпрдкрд┐ рдЬреАрд╕реАрд╕реА рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╕рдВрдХрд▓рдХ рд╣реИ, рдпрд╣ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЪреВрдХ рдХрд░рддрд╛ рд╣реИ (рд╕рдВрдХрд▓рди рдФрд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
-c
рдзреНрд╡рдЬ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпреЛрдВ рд╣реИ? рдЦреИрд░,
gcc
рдХреЗ рд╡рд┐рд╕реНрддреГрдд рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рд╕реНрдирд┐рдкреЗрдЯ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
# рд╡рд╛рд╕реНрддрд╡рд┐рдХ `gcc -v` рдХрдорд╛рдВрдб рдкреВрд░реНрдг рдкрде рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдХрд╛рдлреА рд╣реИрдВ
# рд▓рдВрдмрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрди рдЪрд░ рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдореМрдЬреВрдж рд╣реИред
# $ RV_GCC_BIN_PATH = / рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ / twilcock / usys / riscv / riscv64-Unknown-elf-gcc- <date> - <version> / bin /
# $ RV_GCC_LIB_PATH = $ RV_GCC_BIN_PATH /../ lib / gcc / riscv64-Unknown-elf / 8.2.0
$ RV_GCC_BIN_PATH /../ libexec / gcc / riscv64-Unknown-elf / 8.2.0 / collect2 \
... рдХрд╛рдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ ...
$ RV_GCC_LIB_PATH /../../../// riscv64-Unknown-elf / lib / rv64imafdc / lp64d / crt0.o \
$ RV_GCC_LIB_PATH / riscv64-Unknown-elf / 8.2.0 / rv64imafdc / lp64d / crtbegin.o \
-lgcc --start-group -lc -lgloss --end-group -lgcc \
$ RV_GCC_LIB_PATH / rv64imafdc / lp64d / crtend.o
... рдХрд╛рдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ ...
COLLECT_GCC_OPTIONS = '- O0' '-g' '-v' '-march = rv64imafdc' '-mabi = lp64d'
рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рдореЗрдВ рднреА рдпрд╣ рдмрд╣реБрдд рдХреБрдЫ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╕рдордЭрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ,
gcc
collect2
рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рддрд╛ рд╣реИ,
crt0.o
,
crtbegin.o
рдФрд░
crtend.o
,
-lgcc
рдФрд░
--start-group
рдЭрдВрдбреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдХрд▓реЗрдХреНрдЯ 2 рдХрд╛ рд╡рд░реНрдгрди
рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ : рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╕рдВрдЧреНрд░рд╣рдг 2 рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдЖрд░рдВрднреАрдХрд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЖрдпреЛрдЬрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд▓реЗрдЖрдЙрдЯ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдкрд╛рд╕ рдореЗрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬреАрд╕реАрд╕реА рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрдИ
crt
рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ,
crt
рдЕрд░реНрде рд╣реИ 'C рдХреНрд░рдо'ред
рдпрд╣рд╛рдБ рдпрд╣ рд╡рд┐рд╕реНрддрд╛рд░
рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ
crt
рдХреНрдпрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо
crt0
рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ:
"рдЗрд╕ crt0] рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ _start
рд╡рд░реНрдг рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ, рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред"
"рдмреВрдЯрд╕реНрдЯреНрд░реИрдк" рдХрд╛ рд╕рд╛рд░ рдордВрдЪ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛, рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ рдкрд╛рд╕ рдХрд░рдирд╛ рдФрд░
main
рдХреЙрд▓ рдХрд░рдирд╛ред рд╣рд╛рдВ, рд╣рдореЗрдВ
рдЖрдЦрд┐рд░рдХрд╛рд░ рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рдорд┐рд▓ рдЧрдпрд╛: рдпрд╣
_start
рд╣рдорд╛рд░реЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХреЛ рдХрд╣рддрд╛ рд╣реИ!
рд╣рдорд╛рд░реЗ рдвреЗрд░ рдХреЛ рдЦреЛрдЬреЗрдВ
рд╣рдордиреЗ рдПрдХ рдкрд╣реЗрд▓реА рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрдВ рдореВрд▓ рд▓рдХреНрд╖реНрдп рдХреЗ рдХрд░реАрдм рдХреИрд╕реЗ рд▓рд╛рддрд╛ рд╣реИ -
gdb
рдореЗрдВ рдПрдХ рд╕рд░рд▓ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП? рдпрд╣ рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ: рдЙрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓реА рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдХрд┐
crt0
рд╣рдорд╛рд░реЗ рд╕реНрдЯреИрдХ рдХреЛ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рджреЗрдЦрд╛,
crt0
рд▓рд┐рдП
gcc
рдЪреВрдХред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХрдИ рдХрд╛рд░рдХреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ:
machine-vendor-operatingsystem
рдХреА рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд▓рдХреНрд╖реНрдп рдЯреНрд░рд┐рдкрд▓ ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ riscv64-unknown-elf
- рд▓рдХреНрд╖реНрдп рд╡рд╛рд╕реНрддреБрдХрд▓рд╛,
rv64imafdc
- рд▓рдХреНрд╖реНрдп ABI,
lp64d
рдЖрдорддреМрд░ рдкрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд░ RISC-V рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ,
crt0
рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реНрдЯреИрдХ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╣ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕реАрдкреАрдпреВ (
-machine
) рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдХрд╣рд╛рдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рд╡рд╣ рд╣рдорд╛рд░реА рдорджрдж рдХреЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред
qemu-system-riscv64 -machine virt -m 128M -gdb tcp::1234 -kernel a.out
рд╣рдордиреЗ
qemu-system-riscv64 -machine virt -m 128M -gdb tcp::1234 -kernel a.out
рдорд╢реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ,
qemu
рдорд╢реАрди рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ
dtb
рдбрдВрдк (рдбрд┐рд╡рд╛рдЗрд╕ рдЯреНрд░реА рдмреНрд▓реЙрдм) рдореЗрдВ рдбрдВрдк рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред
Dtb рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдкреНрд░рд╛рд░реВрдк рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ
dtc
рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрд┐рддрд╛ (рдбрд┐рд╡рд╛рдЗрд╕ рдЯреНрд░реА рдХрдВрдкрд╛рдЗрд▓рд░) рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреБрдЫ рдФрд░ рдкрдардиреАрдп рдореЗрдВ рдмрджрд▓ рд╕рдХрддреА рд╣реИред
рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓
riscv64-virt.dts
, рдЬрд╣рд╛рдВ рд╣рдо
riscv64-virt.dts
рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд░реЛрдЪрдХ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦрддреЗ рд╣реИрдВ: рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЙрдкрд▓рдмреНрдз рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдзреАрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдореЗрдореЛрд░реА рд▓реЛрдХреЗрд╢рди, рдЬреИрд╕реЗ UART, рдЖрдВрддрд░рд┐рдХ рдореЗрдореЛрд░реА (RAM) рдХрд╛ рд╕реНрдерд╛рдиред рд╕реНрдЯреИрдХ рдЗрд╕ рдореЗрдореЛрд░реА рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ
grep
рд╕рд╛рде рджреЗрдЦреЗрдВ:
grep memory riscv64-virt.dts -A 3 memory@80000000 { device_type = "memory"; reg = <0x00 0x80000000 0x00 0x8000000>; };
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдиреЛрдб рдореЗрдВ
device_type
рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ 'рдореЗрдореЛрд░реА' рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╣рдордиреЗ рд╡рд╣ рдкрд╛рдпрд╛ рдЬреЛ рд╣рдо рдвреВрдВрдв рд░рд╣реЗ рдереЗред
reg = <...> ;
рдЕрдВрджрд░ рдореВрд▓реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛
reg = <...> ;
рдЖрдк рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореЗрдореЛрд░реА рдмреИрдВрдХ рдХрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ рдХреНрдпрд╛ рд╣реИред
Devicetree рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдореЗрдВ, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐
reg
рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬреЛрдбрд╝реЗ рдХреА рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ
(base_address, length)
ред рд╣рд╛рд▓рд╛рдБрдХрд┐,
reg
рдЕрдВрджрд░ рдЪрд╛рд░ рдЕрд░реНрде рд╣реИрдВред рдЕрдЬреАрдм, рдХреНрдпрд╛ рдПрдХ рдореЗрдореЛрд░реА рдмреИрдВрдХ рдХреЗ рд▓рд┐рдП рджреЛ рдореВрд▓реНрдп рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВ?
рдлрд┐рд░ рд╕реЗ, devicetree рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди (
reg
рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ) рд╕реЗ рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдкрддреЗ рдФрд░ рд▓рдВрдмрд╛рдИ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
<u32>
рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдорд╛рддрд╛
#size-cells
рдкрд┐рддрд╛ рдиреЛрдб (рдпрд╛ рдиреЛрдб рдореЗрдВ) рдореЗрдВ
#address-cells
рдФрд░
#size-cells
рдЧреБрдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдпреЗ рдорд╛рди рд╣рдорд╛рд░реА рдореЗрдореЛрд░реА рдиреЛрдб рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдореВрд▓ рдореЗрдореЛрд░реА рдиреЛрдб рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рдХреА рдЬрдбрд╝ рд╣реИред рдЖрдЗрдП рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рджреЗрдЦреЗрдВ:
head -n8 riscv64-virt.dts /dts-v1/; / { #address-cells = <0x02>; #size-cells = <0x02>; compatible = "riscv-virtio"; model = "riscv-virtio,qemu";
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдкрддреЗ рдФрд░ рд▓рдВрдмрд╛рдИ рджреЛрдиреЛрдВ рдХреЛ рджреЛ 32-рдмрд┐рдЯ рдорд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐
reg = <0x00 0x80000000 0x00 0x8000000>;
рд╣рдорд╛рд░реА рдореЗрдореЛрд░реА
0x00 + 0x80000000 (0x80000000)
рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ рдФрд░
0x00 + 0x8000000 (0x8000000)
рдмрд╛рдЗрдЯреНрд╕ рдкрд░
0x88000000
,
0x88000000
рдпрд╣
0x88000000
рдкрд░ рд╕рдорд╛рдкреНрдд
0x88000000
, рдЬреЛ 128 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред
рд╡реНрдпрд╡рд╕реНрдерд╛
qemu
рдФрд░
dtc
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
dtc
рд╣рдордиреЗ рдЧреБрдгрд╛рддреНрдордХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ RAM рдкрддреЗ рдкрд╛рдПред рд╣рдо рдпрд╣ рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐
gcc
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ
crt0
рд░рдЪрдирд╛
crt0
рд╣реИ, рдмрд┐рдирд╛ рд╕реНрдЯреИрдХ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдмрд┐рдирд╛ рдЬреИрд╕реЗ рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдЕрдВрддрддрдГ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЪрд▓рд╛рдиреЗ рдФрд░ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?
рдЪреВрдВрдХрд┐
crt0
рд╣рдореЗрдВ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рдХрд▓реНрдк рд╣реИ: рдЕрдкрдирд╛ рдХреЛрдб рд▓рд┐рдЦреЗрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рд▓рд┐рдЦреЗрдВ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЕрдкрдиреЗ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдерд╛ред рд╣рдорд╛рд░реЗ
crt0
рдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдХреЛ рдареАрдХ рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рд╣рдо
crt0
рд▓рд┐рдП рд╕реАрдзреЗ
0x80000000
рдореВрд▓реНрдп рдорд╛рди рдХреЛ
crt0
рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреБрдХреНрдд рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдПред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рд╕реАрдкреАрдпреВ, рдЬреИрд╕реЗ рдХрд┐
sifive_e
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдо рдпрд╣ рд╕рд╡рд╛рд▓ рдкреВрдЫрдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред GNU
ld
рд▓рд┐рдВрдХрд░
рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ
crt0
рд╕реЗ рдЙрдкрд▓рдмреНрдз
рдЪрд░рд┐рддреНрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ ред рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд
__stack_top
рдкреНрд░рддреАрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЦрд░реЛрдВрдЪ рд╕реЗ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд▓рд┐рдВрдХрд░ рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ
ld
рд╕рд╛рде рд▓реЗрдиреЗ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреНрдпрд╛ рд╣реИ?
рдпрд╣рд╛рдБ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд░реНрдгрди рд╣реИ :
рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдлрд╛рдЗрд▓ рд╕реЗрдХреНрд╢рди рдХреИрд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдлрд╛рдЗрд▓ рдХреА рдореЗрдореЛрд░реА рдХреЗ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП, рдЖрдЗрдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ
riscv64-unknown-elf-ld
рдХреЛ рдПрдХ рдирдИ рдлрд╛рдЗрд▓ рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ:
cd ~/usys/riscv
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ
рдмрд╣реБрдд рд╕рд╛рд░реА рд░реЛрдЪрдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рдЬрд┐рддрдирд╛ рд╣рдо рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
--Verbose
рд╕рд╛рде рд╡рд┐рд╕реНрддреГрдд рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ
ld
рд╕рдВрд╕реНрдХрд░рдг, рд╕рдорд░реНрдерд┐рдд рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рдЬрд╛рдирдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдРрд╕рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдПрдбрд┐рдЯрд░ рдЦреЛрд▓реЗрдВ рдФрд░ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рдмрдХреБрдЫ рд╣рдЯрд╛ рджреЗрдВред
vim riscv64-virt.ld
# рдКрдкрд░ рдФрд░ =========== рд▓рд╛рдЗрди рд╕рд╣рд┐рдд рд╕рдм рдХреБрдЫ рдирд┐рдХрд╛рд▓реЗрдВ
GNU ld (GNU Binutils) 2.32
рд╕рдорд░реНрдерд┐рдд рдЙрддреНрд╕рд░реНрдЬрди:
elf64lriscv
elf32lriscv
рдЖрдВрддрд░рд┐рдХ рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:
==================================================
/ * рд╕реНрдХреНрд░рд┐рдкреНрдЯ for -z combreloc: рдЧрдардмрдВрдзрди рдФрд░ рд░реАрдХреЛрдХ рдЦрдВрдбреЛрдВ рдХреЛ рдЫрд╛рдБрдЯреЗрдВ * /
/ * рдХреЙрдкреАрд░рд╛рдЗрдЯ (C) 2014-2019 рдлреНрд░реА рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдлрд╛рдЙрдВрдбреЗрд╢рди, рдЗрдВрдХред
рд╕рдВрд╢реЛрдзрди рдХреЗ рд╕рд╛рде рдпрд╛ рдЙрд╕рдХреЗ рдмрд┐рдирд╛ рдЗрд╕ рд▓рд┐рдкрд┐ рдХреА рдирдХрд▓ рдФрд░ рд╡рд┐рддрд░рдг,
рд░реЙрдпрд▓реНрдЯреА рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рднреА рдорд╛рдзреНрдпрдо рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИ рдХреЙрдкреАрд░рд╛рдЗрдЯ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛
рдиреЛрдЯрд┐рд╕ рдФрд░ рдпрд╣ рдиреЛрдЯрд┐рд╕ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИред * /
OUTPUT_FORMAT ("elf64-littleriscv", "elf64-littlervv",
"Elf64-littleriscv")
... рдмрд╛рдХреА рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ ...
рдЙрд╕рдХреЗ рдмрд╛рдж,
__stack_top
рдХрдорд╛рдВрдб рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
__stack_top
рдХрд┐ рдХрд╣рд╛рдВ
__stack_top
рд╣реЛрдЧрд╛ред
OUTPUT_ARCH(riscv)
рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд▓рд╛рдЗрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдБ, рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рдХреЗ рдиреАрдЪреЗ
MEMORY
рдХрдорд╛рдВрдб рдЬреЛрдбрд╝реЗрдВ:
OUTPUT_ARCH(riscv) /* >>> Our addition. <<< */ MEMORY { /* qemu-system-risc64 virt machine */ RAM (rwx) : ORIGIN = 0x80000000, LENGTH = 128M } /* >>> End of our addition. <<< */ ENTRY(_start)
рд╣рдордиреЗ
RAM
рдирд╛рдордХ рдПрдХ рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдмрдирд╛рдпрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкрдврд╝рдирд╛ (
r
), рд▓реЗрдЦрди (
w
), рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб (
x
) рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред
рдорд╣рд╛рди, рд╣рдордиреЗ рдПрдХ рдореЗрдореЛрд░реА рд▓реЗрдЖрдЙрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ
virt
RISC-V рдорд╢реАрди рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЕрдм рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЕрдкрдиреЗ рдвреЗрд░ рдХреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЖрдкрдХреЛ
__stack_top
рдЪрд░рд┐рддреНрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдкрд╛рда рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдЕрдкрдиреА рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ (
riscv64-virt.ld
) рдЦреЛрд▓реЗрдВ рдФрд░ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ:
SECTIONS { /* Read-only sections, merged into text segment: */ PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x10000)); . = SEGMENT_START("text-segment", 0x10000) + SIZEOF_HEADERS; /* >>> Our addition. <<< */ PROVIDE(__stack_top = ORIGIN(RAM) + LENGTH(RAM)); /* >>> End of our addition. <<< */ .interp : { *(.interp) } .note.gnu.build-id : { *(.note.gnu.build-id) }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо
__stack_top
рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
__stack_top
рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреАрдХ рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЬреБрдбрд╝реЗ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рд╕реБрд▓рдн рд╣реЛрдЧрд╛ (рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реНрд╡рдпрдВ
__stack_top
рдирд╛рдо рдХреЗ рд╕рд╛рде рдХреБрдЫ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛)ред
ORIGIN(RAM)
__stack_top
рд╕реЗрдЯ рдХрд░реЗрдВред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдорд╛рди
0x80000000
рдкреНрд▓рд╕
LENGTH(RAM)
, рдЬреЛ 128 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ (
0x8000000
рдмрд╛рдЗрдЯреНрд╕) рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛
__stack_top
рд╕реЗрдЯ рд╣реИред
рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкреВрд░реА рд▓рд┐рдВрдХрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ
рдпрд╣рд╛рдБ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛; рдЖрдк рдЗрд╕реЗ
рдпрд╣рд╛рдБ рджреЗрдЦ рд╕рдХрддреЗ
рд╣реИрдВ ред
рдЗрд╕реЗ рд░реЛрдХреЛ! Hammertime! рд░рдирдЯрд╛рдЗрдо!
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрдирд╛ C рд░рдирдЯрд╛рдЗрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рдХрд╛рд░реНрдп рд╣реИ, рдпрд╣рд╛рдБ рдкреВрд░реА
crt0.s
рдлрд╝рд╛рдЗрд▓ рд╣реИ:
.section .init, "ax" .global _start _start: .cfi_startproc .cfi_undefined ra .option push .option norelax la gp, __global_pointer$ .option pop la sp, __stack_top add s0, sp, zero jal zero, main .cfi_endproc .end
рддреБрд░рдВрдд рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓рд╛рдЗрдиреЗрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреА рд╣реИрдВ рдЬреЛ рдПрдХ рдЕрд╡рдзрд┐ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВред рдпрд╣ рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИред рдбреЙрдЯреНрд╕ рд╡рд╛рд▓реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ
рдХреЛрдбрд╛рдВрддрд░рдХ рдирд┐рд░реНрджреЗрд╢ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╡реЗ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕реЗ RISC-V рдХреЛрдбрд╛рдВрддрд░рдХ рдирд┐рд░реНрджреЗрд╢ рдЬреИрд╕реЗ
jal
рдФрд░
add
ред
рдлрд╛рдЗрд▓ рд▓рд╛рдЗрди рд╕реЗ рд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВред рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдорд╛рдирдХ RISC-V рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП
рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рджреЗрдЦреЗрдВ , рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рд░рдЬрд┐рд╕реНрдЯрд░ рдФрд░ рдЙрдирдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
.section .init, "ax"
рдЬреИрд╕рд╛ рдХрд┐
GNU рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ 'рдореИрдиреБрдЕрд▓' рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛
рд╣реИ , рдпрд╣ рд▓рд╛рдЗрди рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЛ рдирд┐рдореНрди рдХреЛрдб рдХреЛ
.init
рд╕реЗрдХреНрд╢рди рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП
.init
, рдЬрд┐рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (
a
) рдФрд░ рдПрдХреНрдЬреАрдХреНрдпреВрдЯреЗрдмрд▓ (
x
)ред рдпрд╣ рдЦрдВрдб рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рднреАрддрд░ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░
рдЖрдо рд╕рдореНрдореЗрд▓рди рд╣реИред рд╣рдо рдПрдХ рдУрдПрд╕ рдХреЗ рдмрд┐рдирд╛ рд╢реБрджреНрдз рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рдирд┐рд░реНрджреЗрд╢ рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИред
.global _start _start:
.global
ld
рдХреЛ рдирд┐рдореНрди рд╡рд░реНрдг рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рд▓рд┐рдВрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ
ENTRY(_start)
_start
рдкреНрд░рддреАрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЛ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рд╣рдо
_start
рд╡рд░реНрдг рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
_start: .cfi_startproc .cfi_undefined ra ...other stuff... .cfi_endproc
рдпреЗ
.cfi
рдирд┐рд░реНрджреЗрд╢
рдЖрдкрдХреЛ рдлреНрд░реЗрдо рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рд╕реВрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
.cfi_startproc
рдФрд░
.cfi_endproc
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрд░рдВрдн рдФрд░ рдЕрдВрдд рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ, рдФрд░
.cfi_undefined ra
рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛ
_start
рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ
_start
рдЧрдП рдХреЛрдб рдХреЛ рдХрд┐рд╕реА рднреА рдорд╛рди рдореЗрдВ
рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред
.option push .option norelax la gp, __global_pointer$ .option pop
рдЬрдм рдЖрдк рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддреЛ рдпреЗ
.option
рдирд┐рд░реНрджреЗрд╢ рдХреЛрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рдЗрд╕ рдмрд╛рдд рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ
.option
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ:
... рдЪреВрдВрдХрд┐ рд╣рдо рд╕рдВрднрд╡рддрдГ GP рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЫреЛрдЯреЗ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП GP рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд▓реЛрдбрд┐рдВрдЧ рдХрдордЬреЛрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдРрд╕рд╛ рдХреБрдЫ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
.option push .option norelax la gp, __global_pointer$ .option pop
рддрд╛рдХрд┐ рд╡рд┐рд╢реНрд░рд╛рдо рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдорд┐рд▓реЗрдВ:
auipc gp, %pcrel_hi(__global_pointer$) addi gp, gp, %pcrel_lo(__global_pointer$)
рд╕рд░рд▓ рдХреЗ рдмрдЬрд╛рдп:
addi gp, gp, 0
рдФрд░ рдЕрдм рд╣рдорд╛рд░реЗ
crt0.s
рдХрд╛ рдЕрдВрддрд┐рдо рднрд╛рдЧ:
_start: ...other stuff... la sp, __stack_top add s0, sp, zero jal zero, main .cfi_endproc .end
рдпрд╣рд╛рдВ рд╣рдо рдЕрдВрддрддрдГ
__stack_top
рдкреНрд░рддреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдмрдирд╛рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдореЗрд╣рдирдд рдХреА рдереАред
рдЫрджреНрдо-рдирд┐рд░реНрджреЗрд╢ la
(рд▓реЛрдб рдкрддрд╛)
__stack_top
рдорд╛рди рдХреЛ
sp
рд░рдЬрд┐рд╕реНрдЯрд░ (рд╕реНрдЯреИрдХ рдкреЙрдЗрдВрдЯрд░) рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдмрд╛рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
рдлрд┐рд░
add s0, sp, zero
рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ
sp
рдФрд░
add s0, sp, zero
рдЬреЛрдбрд╝рддрд╛
zero
(рдЬреЛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 0 рдХреЗ рдХрдард┐рди рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░
x0
) рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░
s0
рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИред рдпрд╣ рдПрдХ
рд╡рд┐рд╢реЗрд╖ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИ рдЬреЛ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдПрдХ "рд▓рдЧрд╛рддрд╛рд░ рд░рдЬрд┐рд╕реНрдЯрд░" рд╣реИ, рдЕрд░реНрдерд╛рдд, рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдЗрд╕реЗ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реЗ,
s0
рдХрднреА-рдХрднреА рдПрдХ рдлреНрд░реЗрдо рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рд╕реА рдЬрдЧрд╣ рджреЗрддрд╛ рд╣реИред рд╕реНрдЯреИрдХ рдФрд░ рдлреНрд░реЗрдо рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╖рдп рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рдмрд╕ рдпрд╣ рдЬрд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдлреНрд░реЗрдо рдкреЙрдЗрдВрдЯрд░
s0
рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдЖрдЧреЗ рд╣рдо
jal zero, main
рдХрдерди рджреЗрдЦрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ
jal
рдорддрд▓рдм рд╣реИ рдЬрдВрдк рдФрд░ рд▓рд┐рдВрдХред рдирд┐рд░реНрджреЗрд╢ рдХреА рдЙрдореНрдореАрдж рд╣реИ рдХрд┐
jal rd (destination register), offset_address
ред рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ,
jal
rd
рдХреЛ рдЕрдЧрд▓реЗ рдирд┐рд░реНрджреЗрд╢ (
pc
рд░рдЬрд┐рд╕реНрдЯрд░ рдкреНрд▓рд╕ рдЪрд╛рд░) рдХрд╛ рдорд╛рди рд▓рд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░
pc
рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рд╡рд░реНрддрдорд╛рди
pc
рдореВрд▓реНрдп рдФрд░
рд╕рд╛рдЗрди рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рдСрдлрд╕реЗрдЯ рдкрддреЗ рдХреЛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ "рдХреЙрд▓рд┐рдВрдЧ" рдЗрд╕ рдкрддреЗ рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ,
x0
рдХрд╕рдХрд░ рд╢рд╛рдмреНрджрд┐рдХ рдорд╛рди 0 рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рдЗрд╕реЗ рд▓рд┐рдЦрдирд╛ рдмреЗрдХрд╛рд░ рд╣реИред ,
zero
, RISC-V
x0
.
offset_address
. , ?
jal zero, offset_address
. , , . ISA, . ,
jal
unconditional jump
, RISC-V
jal
,
jal zero, main
.
рдЖрд░рдЖрдИрдПрд╕рд╕реА-рд╡реА рдореЗрдВ рдХрдИ рдРрд╕реА рдЕрдиреБрдХреВрд▓рдирд┐рдпрд╛рдВ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рддрдерд╛рдХрдерд┐рдд рдЫрджреНрдо - рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд░реВрдк рд▓реЗрддреА рд╣реИрдВ ред рдЕрд╕реЗрдВрдмрд▓рд░реНрд╕ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рдХреИрд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, j offset_address
RISC-V рдЕрд╕реЗрдВрдмрд▓рд░реНрд╕ рдЫрджреНрдо- рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдХреВрдж рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ jal zero, offset_address
ред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рд╕рдорд░реНрдерд┐рдд рдЫрджреНрдо рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП , RISC-V рд╡рд┐рдирд┐рд░реНрджреЗрд╢ (рд╕рдВрд╕реНрдХрд░рдг 2.2) рджреЗрдЦреЗрдВ ред _start: ...other stuff... jal zero, main .cfi_endproc .end
рд╣рдорд╛рд░реА рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдХреЛрдбрд╛рдВрддрд░рдХ рдирд┐рд░реНрджреЗрд╢ рд╣реИ .end
, рдЬреЛ рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИредрдбреАрдмрдЧ рдХрд░реЗрдВ рд▓реЗрдХрд┐рди рдЕрдм рдЕрд╕рд▓реА рдХреЗ рд▓рд┐рдП
рдЖрд░рдЖрдИрдПрд╕рд╕реА-рд╡реА рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реБрдП, рд╣рдордиреЗ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, RISC-V рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рд╣рдорд╛рд░реА рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ qemu
рдФрд░ dtc
рдкрд╛рдпрд╛ рдЧрдпрд╛ virt
ред рдлрд┐рд░ рд╣рдордиреЗ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рд┐рдВрдХрд░ рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╣рдорд╛рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ riscv64-unknown-elf-ld
, рдЬрд┐рд╕рдиреЗ рд╣рдореЗрдВ рдкреНрд░рддреАрдХ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА __stack_top
ред рддрдм рд╣рдордиреЗ рдЗрд╕ рдкреНрд░рддреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрд┐рдпрд╛ crt0.s
, рдЬреЛ рд╣рдорд╛рд░реЗ рд╕реНрдЯреИрдХ рдФрд░ рдЧреНрд▓реЛрдмрд▓ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ main
ред рдЕрдм рдЖрдк рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ GDB рдореЗрдВ рд╣рдорд╛рд░реЗ рд╕рд░рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдпрд╣рд╛рдБ рд╕реНрдорд░рдг рдХрд░реЛ рд╕реА рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реА рд╣реИ: cat add.c int main() { int a = 4; int b = 12; while (1) { int c = a + b; } return 0; }
рд╕рдВрдХрд▓рди рдФрд░ рд▓рд┐рдВрдХрд┐рдВрдЧ: riscv64-unknown-elf-gcc -g -ffreestanding -O0 -Wl,--gc-sections -nostartfiles -nostdlib -nodefaultlibs -Wl,-T,riscv64-virt.ld crt0.s add.c
рдпрд╣рд╛рдВ рд╣рдордиреЗ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЭрдВрдбреЗ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛, рддреЛ рдЪрд▓рд┐рдП рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рдмрддрд╛рдпрд╛ рд╣реИред-ffreestanding
рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреА рдЕрдирд┐рд╡рд╛рд░реНрдп рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдзрд╛рд░рдгрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдкрдиреЗ рд╣реЛрд╕реНрдЯ (рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо) рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рдВрдХрд▓рдХ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред-Wl
- рд▓рд┐рдВрдХрд░ ( ld
) рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЭрдВрдбреЗ рдХреА рдПрдХ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рд╕реЗ рдЕрд▓рдЧ рд╕реВрдЪреА ред рдпрд╣рд╛рдВ, рдЗрд╕рдХрд╛ --gc-sections
рдЕрд░реНрде рд╣реИ "рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдЕрдиреБрднрд╛рдЧ", рдФрд░ ld
рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЕрдкреНрд░рдпреБрдХреНрдд рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЭрдВрдбреЗ -nostartfiles
, -nostdlib
рдФрд░ -nodefaultlibs
рдорд╛рдирдХ рдкреНрд░рдгрд╛рд▓реА рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдлрд╝рд╛рдЗрд▓реЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд┐рдлрд╝реЙрд▓реНрдЯ) рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХрд░ рдХреЛ рдмрддрд╛рдПрдВcrt0
), рд╕рд┐рд╕реНрдЯрдо stdlib рдХреЗ рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдорд╛рдирдХ рд╕рд┐рд╕реНрдЯрдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓рд┐рдВрдХреНрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реАред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ crt0
рдФрд░ рд▓рд┐рдВрдХрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрди рдЭрдВрдбреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рддрд╛рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣рдорд╛рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рди рдХрд░реЗрдВред-T
рд╣рдорд╛рд░реЗ рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдкрде рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд░рд▓ рд╣реИ riscv64-virt.ld
ред рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛, рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдФрд░ рд░рдЪрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: crt0.s
рдФрд░ add.c
ред рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рдкрд░рд┐рдгрд╛рдо рдПрдХ рдкреВрд░реНрдг рдФрд░ рддреИрдпрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ a.out
редрдЕрдм рд╣рдорд╛рд░реЗ рд╕реБрдВрджрд░ рдирдП рдмреНрд░рд╛рдВрдб рдХреЛ рдирдпрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдЪрд▓рд╛рдПрдВ qemu
:
рдЕрдм gdb
, a.out
рдЕрдВрддрд┐рдо рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВ : riscv64-unknown-elf-gdb --tui a.out GNU gdb (GDB) 8.2.90.20190228-git Copyright (C) 2019 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "--host=x86_64-apple-darwin17.7.0 --target=riscv64-unknown-elf". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from a.out... (gdb)
gdb
gdb
,
qemu
:
(gdb) target remote :1234 тФВ Remote debugging using :1234
main:
(gdb) b main Breakpoint 1 at 0x8000001e: file add.c, line 2.
:
(gdb) c Continuing. Breakpoint 1, main () at add.c:2
, 2! , -
L
,
PC:
L2
,
PC:
тАФ
0x8000001e
. , :

gdb
:
-s
,
info all-registers
. . тАж , , !
рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?
рдЖрдЬ рд╣рдордиреЗ рдмрд╣реБрдд рдХреБрдЫ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ, рдмрд╣реБрдд рдХреБрдЫ рд╕реАрдЦрд╛ рд╣реИ! рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рдФрд░ рдмрд╛рдж рдХреЗ рд▓реЗрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдФрдкрдЪрд╛рд░рд┐рдХ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдереА, рдореИрдВрдиреЗ рдмрд╕ рдЙрд╕рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд┐рдпрд╛ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рд╣рд░ рдХреНрд╖рдг рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рдЧрд╣рд░реА рддрд▓реНрд▓реАрдирддрд╛ рдкрд╕рдВрдж рд╣реИ jal
, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдпрд╣рд╛рдВ рдкреНрд░рд╛рдкреНрдд рдЬреНрдЮрд╛рди рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ add.c
рд╢реБрджреНрдз рдЖрд░рдЖрдИрдПрд╕рд╕реА-рд╡реА рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рдХреБрдЫ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдмрджрд▓ рджреЗрдВ ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдХреЛрдИ рдкреНрд░рд╢реНрди рдкреВрдЫрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЯрд┐рдХрдЯ рдЦреЛрд▓реЗрдВ редрдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореБрдЭреЗ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдорд┐рд▓рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ!рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА
рдпрджрд┐ рдЖрдк рд▓реЗрдЦ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ CppCon2018 рд╕рдореНрдореЗрд▓рди рд╕реЗ рдореИрдЯ рдмреАрдмреЛрд▓реНрдЯ рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ "рдмрд┐рдЯреНрд╕ рдмрд┐рдЯреНрд╕: рд╣рд╛рдЙ рд╡реА рд╡реА рдЧреЗрдЯ рдЗрди (рдореБрдЦреНрдп)" рд╢реАрд░реНрд╖рдХ рд╕реЗ рджреЗрдЦреЗрдВред рд╡рд╣ рд╡рд┐рд╖рдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╣рдо рдпрд╣рд╛рдБ рд╣реИрдВ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╡реНрдпрд╛рдЦреНрдпрд╛рди, рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ!