рдЦрд░реЛрдВрдЪ рд╕реЗ рдЖрд░рдЖрдИрдПрд╕рд╕реА-рд╡реА

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо RISC-V рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рдЙрд╕рдХреЗ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЗ рдкреНрд░рд┐рдЬреНрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ (рд╕рдВрдХрд▓рди рдФрд░ рд▓реЗрдЖрдЙрдЯ, рдЖрджрд┐рдо runtimes, рдХреЛрдбрд╛рдВрддрд░рдХ, рдФрд░ рдЕрдзрд┐рдХ) рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред рдореИрдВ рд╕реНрд╡рдпрдВ рдПрдХ рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░ рд╣реВрдВ, рдореИрдВ рдХрд╛рдо рдкрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╕реЗ рд▓реЗрдЦ рдЖрдпрд╛ рдерд╛! рдирд┐рдореНрди-рд╕реНрддрд░ рдХреА рдЕрд░рд╛рдЬрдХрддрд╛ рдХреА рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдЗрд╕ рд╡реНрдпрд╕реНрдд рдпрд╛рддреНрд░рд╛ рдкрд░ рдореБрдЭреЗ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред

рдкрд╣рд▓реЗ, рдЖрдЗрдП RISC-V рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рдмрд╛рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдорд╣рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВ, RISC-V рдЯреВрд▓рдХрд┐рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ, рдФрд░ рдПрдХ рд╕рд░рд▓ C рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ RISC-V рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдЪрд▓рд╛рдПрдБред

рд╕рд╛рдордЧреНрд░реА


  1. RISC-V рдХреНрдпрд╛ рд╣реИ?
  2. QEMU рдФрд░ RISC-V рдЯреВрд▓реНрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
  3. рд╣рд╛рдп RISC- рд╡реА!
  4. рднреЛрд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг
  5. рдкрд░реНрджрд╛ рдЙрдард╛рдирд╛ -рд╡
  6. рд╣рдорд╛рд░реЗ рдвреЗрд░ рдХреЛ рдЦреЛрдЬреЗрдВ
  7. рд╡реНрдпрд╡рд╕реНрдерд╛
  8. рдЗрд╕реЗ рд░реЛрдХреЛ! Hammertime! рд░рдирдЯрд╛рдЗрдо!
  9. рдбреАрдмрдЧ рдХрд░реЗрдВ рд▓реЗрдХрд┐рди рдЕрдм рдЕрд╕рд▓реА рдХреЗ рд▓рд┐рдП
  10. рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?
  11. рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА

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 рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрд╕ рдПрдХ рдХрдорд╛рдВрдб рджрд░реНрдЬ рдХрд░реЗрдВ:

# also available via MacPorts - `sudo port install qemu` brew install qemu 

рдЖрд╕рд╛рдиреА рд╕реЗ, 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 рдЬреЛрдбрд╝рд╛ред

 # I put these two exports directly in my ~/.zshenv file - you may have to do something else. export RISCV_OPENOCD_PATH="$HOME/usys/riscv/openocd-<date>-<version>" export RISCV_PATH="$HOME/usys/riscv/riscv64-unknown-elf-gcc-<date>-<version>" # Reload .zshenv with our new environment variables. Restarting your shell will have a similar effect. source ~/.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 ред

 # Symbolically link our gcc executable into /usr/local/bin. Repeat this process for any other executables you want to quickly access. ln -s ~/usys/riscv/riscv64-unknown-elf-gcc-8.2.0-<date>-<version>/bin/riscv64-unknown-elf-gcc /usr/local/bin 

рдФрд░ рд╡реЛрдЗрд▓рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ 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 рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

 # -O0 to disable all optimizations. Without this, GCC might optimize # away our infinite addition since the result 'c' is never used. # -g to tell GCC to preserve debug info in our executable. riscv64-unknown-elf-gcc add.c -O0 -g 

рдпрд╣ a.out рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЪреВрдХ рдХрд░рддреА рд╣реИред рдЕрдм рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ qemu рдореЗрдВ рдЪрд▓рд╛рдПрдВ:

 # -machine tells QEMU which among our list of available machines we want to # run our executable against. Run qemu-system-riscv64 -machine help to list # all available machines. # -m is the amount of memory to allocate to our virtual machine. # -gdb tcp::1234 tells QEMU to also start a GDB server on localhost:1234 where # TCP is the means of communication. # -kernel tells QEMU what we're looking to run, even if our executable isn't # exactly a "kernel". qemu-system-riscv64 -machine virt -m 128M -gdb tcp::1234 -kernel a.out 

рд╣рдордиреЗ riscv-qemu рдорд╢реАрди рдХреЛ рдЪреБрдирд╛ рдЬреЛ рдХрд┐ рдореВрд▓ рд░реВрдк рд╕реЗ riscv-qemu рдХреЗ riscv-qemu рдЖрдИ riscv-qemu ред

рдЕрдм рдЬрдм рд╣рдорд╛рд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо QEMU рдХреЗ рдЕрдВрджрд░ GDB рд╕рд░реНрд╡рд░ рдкрд░ localhost:1234 рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ RISC-V GDB рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдПрдХ рдЕрд▓рдЧ рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

 # --tui gives us a (t)extual (ui) for our GDB session. # While we can start GDB without any arguments, specifying 'a.out' tells GDB # to load debug symbols from that file for the newly created session. riscv64-unknown-elf-gdb --tui a.out 

рдФрд░ рд╣рдо 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 # this is the line within the forever-while loop. int c = a + b; Breakpoint 2 at 0x1019a: file add.c, line 5. 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдХрд┐ GDB continue (рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрдорд╛рдВрдб c ) рдЬрдм рддрдХ рд╣рдо рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддреЗ:

 (gdb) c Continuing. 

рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рдиреЛрдЯрд┐рд╕ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдпрд╣ рдЕрдЬреАрдм рд╣реИ ... рдХреНрдпрд╛ рд╣рдореЗрдВ рддреБрд░рдВрдд рдмреНрд░реЗрдХрдкрд╛рдЗрдВрдЯ b 5 рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпрд╛ рд╣реБрдЖ?



рдпрд╣рд╛рдБ рдЖрдк рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

  1. рдкрд╛рда UI рд╕реНрд░реЛрдд рдирд╣реАрдВ рдвреВрдБрдв рд╕рдХрддрд╛ред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдФрд░ рдкрд╛рд╕ рдХреЗ рдХрд┐рд╕реА рднреА рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  2. GDB рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╡рд░реНрддрдорд╛рди рдкрдВрдХреНрддрд┐ ( L?? ) рдХреЛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ рдФрд░ рдХрд╛рдЙрдВрдЯрд░ 0x0 ( PC: 0x0 ) рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
  3. рдЗрдирдкреБрдЯ рд▓рд╛рдЗрди рдореЗрдВ рдХреБрдЫ рдкрд╛рда, рдЬреЛ рдЕрдкрдиреА рд╕рдВрдкреВрд░реНрдгрддрд╛ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ: 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 рдбрдВрдк (рдбрд┐рд╡рд╛рдЗрд╕ рдЯреНрд░реА рдмреНрд▓реЙрдм) рдореЗрдВ рдбрдВрдк рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред

 # Go to the ~/usys/riscv folder we created before and create a new dir # for our machine information. cd ~/usys/riscv && mkdir machines cd machines # Use qemu to dump info about the 'virt' machine in dtb (device tree blob) # format. # The data in this file represents hardware components of a given # machine / device / board. qemu-system-riscv64 -machine virt -machine dumpdtb=riscv64-virt.dtb 

Dtb рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдкреНрд░рд╛рд░реВрдк рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ dtc рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрд┐рддрд╛ (рдбрд┐рд╡рд╛рдЗрд╕ рдЯреНрд░реА рдХрдВрдкрд╛рдЗрд▓рд░) рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреБрдЫ рдФрд░ рдкрдардиреАрдп рдореЗрдВ рдмрджрд▓ рд╕рдХрддреА рд╣реИред

 # I'm running MacOS, so I use Homebrew to install this. If you're # running another OS you may need to do something else. brew install dtc # Convert our .dtb into a human-readable .dts (device tree source) file. dtc -I dtb -O dts -o riscv64-virt.dts riscv64-virt.dtb 

рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ 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 # Make a new dir for custom linker scripts out RISC-V CPUs may require. mkdir ld && cd ld # Copy the default linker script into riscv64-virt.ld riscv64-unknown-elf-ld --verbose > riscv64-virt.ld 

рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд░реЛрдЪрдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рдЬрд┐рддрдирд╛ рд╣рдо рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред --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_addressRISC-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:

 # -S freezes execution of our executable (-kernel) until we explicitly tell # it to start with a 'continue' or 'c' from our gdb client qemu-system-riscv64 -machine virt -m 128M -gdb tcp::1234 -S -kernel a.out 

рдЕрдм 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 рд╕рдореНрдореЗрд▓рди рд╕реЗ рдореИрдЯ рдмреАрдмреЛрд▓реНрдЯ рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ "рдмрд┐рдЯреНрд╕ рдмрд┐рдЯреНрд╕: рд╣рд╛рдЙ рд╡реА рд╡реА рдЧреЗрдЯ рдЗрди (рдореБрдЦреНрдп)" рд╢реАрд░реНрд╖рдХ рд╕реЗ рджреЗрдЦреЗрдВред рд╡рд╣ рд╡рд┐рд╖рдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╣рдо рдпрд╣рд╛рдБ рд╣реИрдВ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╡реНрдпрд╛рдЦреНрдпрд╛рди, рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ!

Source: https://habr.com/ru/post/hi454208/


All Articles