рднрд╛рдЧ 6: рдкреЛрд░реНрдЯрд┐рдВрдЧ рдореЗрдордЯреЗрд╕реНрдЯреА + рд╕реЗ рдЖрд░рдЖрдИрдПрд╕рд╕реА-рд╡реА


рд╢рд╛рдпрдж рдХреБрдЫ рдЖрдИрдЯреА рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдореЗрдореЗрд╕реНрдЯреЛрд░реА + рдХреНрдпрд╛ рд╣реИ - рд╢рд╛рдпрдж рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреАрд╕реА рдкрд░ рд░реИрдо рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдорд╛рдирдХ рдмрди рдЧрдпрд╛ рд╣реИред рдЬрдм рдкрд┐рдЫрд▓реЗ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдореИрдВ рдПрдХ рдЯреВрдЯреА рд╣реБрдИ рдореЗрдореЛрд░реА рдмрд╛рд░ рдореЗрдВ рдЖрдпрд╛ рдерд╛ рдЬреЛ рдмреЛрд░реНрдб рдХреЗ рд╕рд╛рде рдмрдВрдбрд▓ рдореЗрдВ рдЖрдпрд╛ рдерд╛, рддреЛ рдпрд╣ (рдПрдХ рдбреАрдбреАрдЖрд░ 2-рд╕рдХреНрд╖рдо рдиреЗрдЯрдмреБрдХ рдХреЗ рд╕рд╛рде) рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдБ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЕрд╕реНрдерд┐рд░ рд╕рдВрдЪрд╛рд▓рди рдирдЧреНрди рдЖрдВрдЦреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рдерд╛ред рдЕрдзрд┐рдХ рдкреЗрдЪреАрджрд╛ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореИрдВрдиреЗ рд╕реБрдирд╛ рд╣реИ рдХрд┐ рдЗрдиреНрдлрд┐рдирд┐рдЯреА рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдХреЗрд▓реЗрд▓ "рдЯреИрдкрд┐рдВрдЧ" рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЙрдкрдХрд░рдг рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдбреЗрдЯрд╛ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдбреАрдбреАрдЖрд░ рдСрдкрд░реЗрд╢рди рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рдЕрджреНрднреБрдд рдмрд╛рдд, рдпрд╣ рдПрдХ рджрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдирд╛рдо рдореЗрдВ рдпрд╣ рднреА рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ: 86 - "рдХреЗрд╡рд▓ x86- рд╕рдВрдЧрдд рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдПред" рдпрд╛ рдирд╣реАрдВ?


рдХрдЯ рдХреЗ рддрд╣рдд рдЖрдк RISC-V рдФрд░ рдЙрдк-рдпреЛрдЧ рдореЗрдореЗрд╕реНрдЯреЛрд░реА + v5.1 рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рдореЗрд░реЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред Spoiler: рдпрд╣ рдЪрд▓рддрд╛ рд╣реИ!


рдЕрд╕реНрд╡реАрдХрд░рдг: рдкрд░рд┐рдгрд╛рдореА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмреЛрд░реНрдб рдкрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реЙрдХреЗрдЯ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкрд░ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рдЯреАрдХрддрд╛ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдЕрдиреНрдп рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдкрд░) рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИред рдЕрдкрдиреЗ рдЬреЛрдЦрд┐рдо рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЖрд░рдХреНрд╖рд┐рдд рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рд╡реЗ рд░реИрдо рд░реЗрдВрдЬ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛, рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ рдореИрдВрдиреЗ рдЕрд▓реАрдПрдХреНрд╕рдкреНрд░реЗрд╕ рдкрд░ рд╕рд╛рдЗрдХреНрд▓реЛрди IV рдХреЗ рд╕рд╛рде рдПрдХ рдорджрд░рдмреЛрд░реНрдб рдЦрд░реАрджрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдореЗрдореЛрд░реА рдЫреЛрдЯреА рдереАред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдмреЛрд░реНрдб рдХреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ DDR2 SO-DIMM рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдерд╛ - рдореЗрд░реА рдкреБрд░рд╛рдиреА рдиреЗрдЯрдмреБрдХ рдХреА рддрд░рд╣ред рдлрд┐рд░ рднреА, рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрдореЛрд░реА рдореЙрдбреНрдпреВрд▓ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡-рд╣реЛрд╕реНрдЯреЗрдб рд╕рдорд╛рдзрд╛рди (рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдирд┐рдпрдВрддреНрд░рдХ рднреА)ред рдмреБрд░реА рдпрд╛рджреЛрдВ рдХреА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдореЗрд░реА рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рдбрд┐рдмреЗрдЯ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕рдиреНрди рдирд╣реАрдВ рдереАред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рддреНрд╡рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ рдФрд░ рдорд╛рдирд╕рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рдкреВрд░реНрдг рдкреБрдирд░реНрд▓реЗрдЦрди рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреА рддреИрдпрд╛рд░реА рдХрд░ рд░рд╣рд╛ рд╣реИ, рдореИрдВрдиреЗ рдореЗрдордЯреЗрд╕реНрдЯреА + рдкрд░ рдПрдХ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд▓реЗрдЦ рдЦреЛрд▓рд╛ рдФрд░ рдЕрдЪрд╛рдирдХ рдХрд╛рд░реНрдб рдореЗрдВ "рд▓рд┐рдЦрд┐рдд: рд╕реА рдФрд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛" рд▓рд┐рдЦрд╛ред рд╣рдореНрдо, рд╡рд╣ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╣ "... 86" рд╣реИ, рд▓реЗрдХрд┐рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реИ? рдпрд╣ рдЙрддреНрд╕рд╛рд╣рдЬрдирдХ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рд░рд┐рд╢реНрддреЗ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред


рддреЛ, memtest.org рдкрд░ рдЬрд╛рдПрдВ рдФрд░ GPL2 рдХреЗ рддрд╣рдд рд╕рдВрд╕реНрдХрд░рдг 5.01 рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕реЗ GitHub рдкрд░ рдкреБрдирдГ рд▓реЛрдб рдХрд┐рдпрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╕реНрд░реЛрдд рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╣реА рд╕рд╣реА, рд╣рдореЗрдВ README.background рдлрд╝рд╛рдЗрд▓ рджреНрд╡рд╛рд░рд╛ рдмрдзрд╛рдИ рджреА рдЬрд╛рддреА рд╣реИ, рд╣рдХрджрд╛рд░


рдореЗрдореНрдиреЗрд╕реНрдЯреЛрд░реА-рдПрд╕рдПрдордкреА рдХреЗ рдПрдирд╛рдЯреЙрдореА рдФрд░ рдлрд┐рдЬрд┐рдпреЛрд▓реЙрдЬреА

рдпрд╣ рдХреБрдЫ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ (рдФрд░ рдПрдПрд╕рд╕реАрдЖрдИрдЖрдИ-рдХрд▓рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде) рдХреЛрдб рдХреЗ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рд╕рдВрдЪрд╛рд▓рдиред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рдмрд╛рдЗрдирд░реА рд▓реЗрдЖрдЙрдЯ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ , рдЬрд┐рд╕рдореЗрдВ setup.o , head.o , head.o рдФрд░ рдХреБрдЫ memtest_shared ред рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЗрди рддреАрди рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдбрд╛рдВрддрд░рдХ рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдмрд╛рдХреА рд╕рдм рд╕реА рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ! рдмреБрд░рд╛ рдирд╣реАрдВ, рдмреБрд░рд╛ рдирд╣реАрдВ ...


рдирддреАрдЬрддрди, рдореИрдВрдиреЗ Makefile рдХреЛ Makefile.arch рдХреЙрдкреА рдХрд┐рдпрд╛ рдФрд░ рд╕рдм рдХреБрдЫ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рдФрд░ рдЬреЛ рдХреБрдЫ рднреА рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИ рдЙрд╕реЗ рдмрд╛рд╣рд░ рдлреЗрдВрдХрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ RISC-V рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреВрд▓рдХрд┐рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЬреЛ рдХрд┐ рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдкрд┐рдЫрд▓реЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмрд╛рдж рднреА рдореЗрд░реЗ рд╕рд╛рде рд╣реИред рдкрд╣рд▓реЗ рддреЛ рдореИрдВрдиреЗ 32-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореБрдЭреЗ рдпрд╛рдж рдЖрдпрд╛ рдХрд┐ рдПрдХ 64-рдмрд┐рдЯ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдмреЛрд░реНрдб рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ riscv64- рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде riscv64- ред


рдЧреАрддрд╛рддреНрдордХ рд╡рд┐рд╖рдпрд╛рдВрддрд░: рдмреЗрд╢рдХ, 32- рдФрд░ 64-рдмрд┐рдЯ рдХреЛрдб рдХреА рд╕рдВрдЧрддрддрд╛ рдХреЗ рдореБрджреНрджреЗ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдмрд╛рдд рдереАред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, 1.3 RISC-V ISA Overview рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдкреИрд░рд╛ 1.3 RISC-V ISA Overview рдореЗрдВ ISA (рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рд╕реЗрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░) рдХреЗ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди:


рдЖрдзрд╛рд░ рдЖрдИрдПрд╕рдП рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЖрдзрд╛рд░ рдЖрдИрдПрд╕рдП рдХреЛ рдЕрдиреНрдп рдЖрдзрд╛рд░ рдЖрдИрдПрд╕рдП рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, RV64I рдирд┐рд░реНрджреЗрд╢ рдФрд░ CSR рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ RV32I рдореЗрдВ рд╕рдВрдХрд░реЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред RV32I рд╡рд┐рдХрд▓реНрдк рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЕрдиреНрдпрдерд╛ рдХреЗрд╡рд▓ рд╡реНрдпрд╛рдкрдХ рдкрддреЗ-рд╕реНрдерд╛рди рд╡реЗрд░рд┐рдПрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИрдВред

рдореИрдВ рдпрд╣ рднреА рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ riscv64- рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде riscv64- 32-рдмрд┐рдЯ рдХреЛрдб рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдЕрдЧрд░ рд▓рдХреНрд╖реНрдп рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИ - рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдФрд░ рдЕрдзрд┐рдХред


рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╕рдордп, рдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЛ рдХрд╛рдо рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ:



рд╕реЗрдЯрдЕрдк рдмрдирд╛рдПрдБ


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


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдЦрд┐рд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ: рддреАрди setup.S рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ: setup.S , setup.S рдФрд░ head.S рдкрд╣рд▓реЗ рджреЛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗрд╡рд▓ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╣реЛрддреА рд╣реИ, рдФрд░ рддреАрд╕рд░реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рдХрд┐рд╕реА рдЕрдиреНрдп рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рдХреЛ "рд╕реНрд╡рдпрдВ рдХреЗ рдиреАрдЪреЗ" рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХреЛ рдкрд╣рд▓реЗ рдПрдХ рдирдП рд╕реНрдерд╛рди рдкрд░ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред ELF рдореЗрдВ Sich рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реЗ рдХреЛрдб, рдбреЗрдЯрд╛ рдЖрджрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕реЗ PIC (рд╕реНрдерд┐рддрд┐ рд╕реНрд╡рддрдВрддреНрд░ рдХреЛрдб) рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдкрд╣рд▓реЗ рддреЛ рдореБрдЭреЗ рдФрд░ рднреА рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ: рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдХреЛрдб рдлреНрд░реАрд╕реНрдЯреИрдВрдбрд┐рдВрдЧ рд╣реИ (рдЬреЛ рдХрд┐ рдХрд░реНрдиреЗрд▓, libc рдЗрддреНрдпрд╛рджрд┐ рдХреЗ рдмрд┐рдирд╛), рдпрд╣ рдРрд╕реА рдЙрдиреНрдирдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ рд╕рдордп-рд╕рдордп рдкрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, -m32 рдореЗрдВ рдЖрддреЗ рд╣реИрдВ: -march=i486 , -m32 рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдореБрдЭреЗ рдРрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдФрд░ рдлрд┐рд░ рдПрдХ рдЪреВрд╕рдиреЗ рд╡рд╛рд▓реЗ рдХреА рддрд░рд╣ ред RISC-V рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ: rv32 рдФрд░ rv64 (рдЬреИрд╕реЗ, рдЕрднреА рднреА рд╕рдмрд╕реЗ рдЯреНрд░рдВрдХреЗрдЯреЗрдб рдПрдореНрдмреЗрдбреЗрдб рдФрд░ rv128 рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрдирдореЗрдВ рдмрд╣реБрдд рд░реБрдЪрд┐ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ), рдФрд░ рдЗрд╕ рдЙрдкрд╕рд░реНрдЧ рдХреЛ рдЕрдХреНрд╖рд░ рдЕрд╕рд╛рдЗрди рдХрд░рдХреЗ ISA рдирд╛рдо рдмрдирддрд╛ рд╣реИ рдПрдХреНрд╕рдЯреЗрдВрд╢рди: i - рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдореВрд▓ рдкреВрд░реНрдгрд╛рдВрдХ рд╕реЗрдЯ, m - рдкреВрд░реНрдгрд╛рдВрдХ рдЧреБрдгрди рдФрд░ рд╡рд┐рднрд╛рдЬрди, ... рдмреЗрд╢рдХ, рдореИрдВ rv64i рдХрд░рдирд╛ rv64i , рд▓реЗрдХрд┐рди Memtest86 рд╢рд╛рдпрдж рд╣реА рдЖрд╕рд╛рдиреА рд╕реЗ рдЧреБрдгрди рдХреЗ рдмрд┐рдирд╛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ rv64i рдЬрд╛рдПрдЧрд╛ред рд╕рдЪ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ "рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд" рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдХрдо рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рд╢реЗрд╖ рд░рд╣рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рд╣реИ (рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдпрд╛ рдХрд╣реАрдВ рд▓реЗ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА)ред


рдЖрдкрдХреЛ рд▓рд╛рдЗрди рдПрдмреАрдЖрдИ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХреЙрд▓рд┐рдВрдЧ рдХрдиреНрд╡реЗрдВрд╢рди рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ Volume I рдореЗрдВ "RISC-V рдЕрд╕реЗрдВрдмрд▓реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рд╣реИрдВрдбрдмреБрдХ" рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдРрд╕рд╛ рдХреБрдЫ рдХрд░реВрдВрдЧрд╛


 $ riscv64-linux-gnu-gcc-9 -mabi=help riscv64-linux-gnu-gcc-9: error: unrecognized argument in option '-mabi=help' riscv64-linux-gnu-gcc-9: note: valid arguments to '-mabi=' are: ilp32 ilp32d ilp32e ilp32f lp64 lp64d lp64f riscv64-linux-gnu-gcc-9: fatal error: no input files compilation terminated. 

рдФрд░ lp64 рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд┐рдирд╛, рдореИрдВ lp64 ред рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ ABI рдХреЗ рд╕рд╛рде, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА lp64f , рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ lp64f рдФрд░ ARCH рдХреЛ "рдЕрдкрдЧреНрд░реЗрдб" рдХрд┐рдпрд╛ред рдШрдмрд░рд╛рд╣рдЯ рдХреЗ рдмрд┐рдирд╛, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрдиреЗ рдкреЛрд░реНрдЯ рдореЗрдВ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реВрдВред


рдЪреВрдБрдХрд┐ рдореИрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ - рдФрд░ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рддреБрд░рдВрдд ld рдХреА рдЪрд╛рдмреА рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣реА рдереА , рдореИрдВрдиреЗ рдХреЛрдбрд╛рдВрддрд░рдХ head.S рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдлрд╝рд╛рдЗрд▓, memtest_shared.arch.lds рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ memtest_shared.arch.lds рдлрд╝рдВрдХреНрд╢рди рд╕реЗ memtest_shared.arch.lds ред рдореИрдВрдиреЗ рдЗрд╕рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рд░реВрдк рдФрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрдд рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ (рдЖрдЦрд┐рд░рдХрд╛рд░, рдЗрд╕реЗ DISCARD рдореЗрдВ рдПрдХ рдЪрд░ рд╕реЗ рдмрджрд▓рдирд╛ рдЖрд╕рд╛рди рд╣реИ), рдФрд░ рдЕрдВрдд рдореЗрдВ DISCARD рдХреА рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЯрд┐рдкреНрдкрдгреА рднреА рдХреА, рдореБрдЭреЗ рдбреАрдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЦрдВрдбреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред (рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП: рдареАрдХ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА, рд▓реЗрдХрд┐рди .rela рдХреЛ .rela рдкрдбрд╝рд╛) рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓рддреЗ рд╣реБрдП, x86 рд╕рдВрд╕реНрдХрд░рдг рдиреЗ 64k рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░ рдЬреЛрд░ рджрд┐рдпрд╛ - рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЛрдб рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдФрд░ RISC-V рд╕реЗ рд╣рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, PIC рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдХреЛ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореВрд▓ рдореЗрдВ рд╣реИ, рдХреЛрдб рдФрд░ рдбреЗрдЯрд╛ рдЬрд┐рд╕реЗ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЙрд╕реЗ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рд╣рдо рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ ... рдФрд░ рд╕рдВрдХрд▓рди рдкрд╣рд▓реА reloc.c рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЖрддрд╛ рд╣реИ - рдпрд╣, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдХреБрдЫ ld-linux.so рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЧреНрд▓реЛрдмрд▓ рдСрдлрд╝рд╕реЗрдЯ рдЯреЗрдмрд▓ рдЖрджрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред x86 рдХреЗ рд▓рд┐рдП рдХреЙрд▓рд┐рдВрдЧ рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдбрд╛рдВрддрд░рдХ рдЖрд╡реЗрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо RISC-V рдкрд░ рд╣реИрдВ - рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ PIC рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП reloc.c рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрднреА рднреА рдЖрд╡реЗрд╖рдг рдереЗ, рдХрднреА-рдХрднреА рдХрд╛рдлреА рд▓рдВрдмреЗред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╡реЗ рдпрд╛ рддреЛ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдореЗрдВ рд╕реА рдХреЛрдб рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдереЗ, рдЬрд┐рд╕реЗ рд╡реЗ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ (рдЙрдирд╕реЗ рдореИрдВрдиреЗ рдлрд┐рд░ рд╕реЗ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рд┐рдЪ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рдкреВрд░реНрдг рдЯреБрдХрдбрд╝реЗ рдХрд┐рдП) рдпрд╛ рдХреБрдЫ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдирд┐рд░реНрднрд░, рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛, рдЪрд░рдо рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореИрдВ (рд╢рд╛рдпрдж) рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд░рдирд╛ (рдЬреИрд╕реЗ рдХреИрд╢ рдХреЛ рдЪрд╛рд▓реВ / рдмрдВрдж рдХрд░рдирд╛, рд╕реАрдкреАрдпреВрдЖрдИрдбреА рдХреЛ рдШрдЯрд╛рдирд╛, рдЖрджрд┐)ред рдЕрдВрдд рдореЗрдВ, rdtsc рдХреЙрд▓ рдЬреИрд╕реА рдХреБрдЫ рдЪреАрдЬреЗрдВ рдереАрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ rdtsc , рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдирд┐рд░реНрднрд░ рд╣реЗрдбрд░ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ RISC-V рдкрд░ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред


рдирддреАрдЬрддрди, рд╣рдореЗрдВ arch/i386 рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдорд┐рд▓реА, рдЬрд╣рд╛рдВ рдкреАрд╕реАрдЖрдИ рд╕рдорд░реНрдерди рдХреЛрдб рдХреА рдПрдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдЪрд▓реА рдЧрдИ, рдЪрд┐рдкрд╕реЗрдЯ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА, рдореЗрдореЛрд░реА-рдореИрдк рдХрд┐рдП рдЧрдП рдкрддреЗ рдХреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ, рдЖрджрд┐ рдкрдврд╝реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, test_start рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд test_start , рдЬреЛ setup.S рд╕реЗ C рдХреЛрдб рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИред рдХрд┐рддрдиреА рд▓рдВрдмреА, рдЫреЛрдЯреА, рд▓реЗрдХрд┐рди рд╣рд░ рдЙрд╕ рдЪреАрдЬрд╝ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдирд╛ рдЬреЛ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдЙрд╕ рдЪреАрдЬрд╝ рдХреЛ рд╕рд╛рдХрд╛рд░ рдХрд░рдирд╛ рдЬреЛ RISC-V (рдЬреИрд╕реЗ setup.S рдФрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЗ рддрд╣рдд рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреАред SiFive рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ), рдореБрдЭреЗ arch/riscv , рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╕рдВрдХрд▓рд┐рдд рдерд╛ред


рдпрд╣рд╛рдВ рдореБрдЭреЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрди рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдпреЛрдЧ рдЦреБрдж рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдП рдЧрдП рдереЗ, рдЗрд╕рд▓рд┐рдП рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ "рдХрд▓рд╛рддреНрдордХ рдХрдерд╛" рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░рд╛рд╕реНрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ (рдореИрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реВрдВ, рдореБрдЭреЗ рд╡рд╣ рдпрд╛рдж рд╣реИ) ред рддреЛ рдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдПред


рд▓реЛрд╣реЗ рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ


рдкрд┐рдЫрд▓реЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмрд╛рдж рд╕реЗ, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рд╕реЗ рдзреВрд▓ рднрд░рд╛ "рд╕реНрдЯреИрдВрдб" рд╣реИ, рдЬрд┐рд╕реЗ рдбрд┐рдмрдЧ рдмреЛрд░реНрдб рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рддрд╛рд░реЛрдВ UART, JTAG рдФрд░ рдПрдХ рдПрд╕рдбреА рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рдПрдбрд╛рдкреНрдЯрд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред DDR2 рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд RV64 рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдореЛрд░реА рдореЗрдВ рд╕реАрд╡рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд╕рдордп рдореЗрдВ, рдореИрдВ "рд░рд╛рд╕реНрдкрдмреЗрд░реА" рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рдХреЗ рдкрд╣рд▓реЗ рджреЛ рдПрд╕рдПрд╕рдПрдЪ рд╕рддреНрд░ рдЦреЛрд▓реЗрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдУрдкрдирдУрд╕реАрдбреА рдореЗрдВ рдЬреАрдбреАрдмреА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП 3333 рдЯреАрд╕реАрдкреА рдкреЛрд░реНрдЯ рдХреЗ рдЖрдЧреЗред рдПрдХ рд╕рддреНрд░ рдореЗрдВ, рдореИрдВ UART рдХреЗ рд▓рд┐рдП рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рдирд┐рдХреЙрдо рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ, рджреВрд╕рд░реЗ рдореЗрдВ - JTAG рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЗрдЬрдмрд╛рди рд╕реЗ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдУрдкрдирдХрд╛рдбред рдореИрдВ рдмреЛрд░реНрдб рдХреА рд╢рдХреНрддрд┐ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реВрдВ - рдФрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╕рдВрджреЗрд╢ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрд╕рдбреА рд╕реЗ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред


рдЕрдм рдЖрдк рдХрдорд╛рдВрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:


 riscv64-unknown-elf-gdb \ -ex 'target remote 127.0.0.1:3333' \ -ex 'restore /path/to/memtest_shared.bin binary 0x80010000' \ -ex 'add-symbol-file /path/to/memtest_shared 0x80010000' -ex 'set $pc=0x80010000' 

-ex рд╡рд┐рдХрд▓реНрдк gdb рдХреЛ рдпрд╣ рдвреЛрдВрдЧ рдХрд░рдиреЗ рдХрд╛ -ex рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдХрдВрд╕реЛрд▓ рд╕реЗ рдЗрди рдХрдорд╛рдВрдбреЛрдВ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд┐рдпрд╛ рд╣реИ:


  • рдкрд╣рд▓реЗ OpenOCD рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдз рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ
  • рджреВрд╕рд░реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ
  • рддреАрд╕рд░реЗ рдиреЗ gdb рдХреЛ рд╕рдордЭрд╛рдпрд╛ рдХрд┐ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд▓реА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдЗрд╕ рддрдереНрдп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХрд┐ рдЗрд╕реЗ рдЗрд╕ рдкрддреЗ рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдФрд░ рдЗрд╕рдореЗрдВ рдЬреЛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣реА рдирд╣реАрдВ)
    • рдиреЛрдЯ: рд╣рдо ELF рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╡рд░реНрдг рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ "рдХрдЪреНрдЪреЗ" рдмрд╛рдЗрдирд░реА рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ
  • рдЕрдВрдд рдореЗрдВ, рдЪреМрдерд╛ рд╡рд░реНрддрдорд╛рди рдХрдорд╛рдВрдб рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рдЬрдмрд░рди рдЯреНрд░рд╛рдВрд╕рд▓реЗрдЯ рдХрд░рддрд╛ рд╣реИ

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕рдм рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ, рдФрд░ рдпрджреНрдпрдкрд┐ рдбрд┐рдмрдЧрд░ рдореЗрдВ рдХреЛрдб рдХреА рд░реЗрдЦрд╛рдПрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рднреА рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ - рд╢реВрдиреНрдп рдореЗрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рд╣рдо gdb рдореЗрдВ рдлреЙрд░реНрдо p &global_var рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ, рд╣рдо, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбрд╛рдЙрдирд▓реЛрдб рдкрддреЗ (рдореЗрд░реЗ рдкрд╛рд╕ 0x0 ) рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрддрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬреЛ add-symbol-file рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдПрдХ рдмреИрд╕рд╛рдЦреА рдХреЗ рд░реВрдк рдореЗрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди, рдореИрдВрдиреЗ рдмрд╕ 0x80010000 рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рд╛ рдФрд░ рдореЗрдореЛрд░реА рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ x/x 0xADDR рдорд╛рдзреНрдпрдо рд╕реЗ x/x 0xADDR ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рд╣реА рд╢реБрд░реБрдЖрддреА рдкрддреЗ рдХреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдЬреЛ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдкрддреЗ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рдПрдЧрд╛ ред


рдЖрдзреБрдирд┐рдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░ рдкреБрдирд░реНрд╡рд╛рд╕ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ


рдЦреИрд░, рдХреЛрдб рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рдирд┐рдХрд╛рд▓рд╛ - рд╣рдо рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЪрд░рдг-рджрд░-рдЪрд░рдг рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдо switch_to_main_stack рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рдЖрддреЗ рд╣реИрдВ - рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдХрд╛рд░реНрдп рд╕реНрдЯреИрдХ рдХреЗ рдЕрдиреБрд░реВрдк рдкреНрд░рддреАрдХ рдХреЗ рдкрддреЗ рдХреЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред


рд╕рднреА рд╕рдорд╛рди, рдкреНрд░рд▓реЗрдЦрди рдХреА рдкрд╣рд▓реА рдорд╛рддреНрд░рд╛ рд╣рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЫрджреНрдо рдирд┐рд░реНрджреЗрд╢реЛрдВ рдФрд░ рдкреАрдЖрдИрд╕реА рдХреЗ рд╕рд╛рде рдЙрдирдХреЗ рдХрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддреА рд╣реИ:


рдХреБрдЫ рдЖрд░рдЖрдИрдПрд╕рдПрд╕рд╕реА-рд╡реА рдЫрджреНрдо рдирд┐рд░реНрджреЗрд╢


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдореГрддрд┐ рдореЗрдВ рдкрддреЗ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рдЧрд┐рдиреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рдСрдлрд╕реЗрдЯ рдХреЗ рд╢реАрд░реНрд╖ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдЧрд▓рд╛ add рдХрдо-рдСрд░реНрдбрд░ рдмрд┐рдЯреНрд╕ рдХреЛ рдкреЙрд▓рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╢рд╛рдпрдж рд╣реА рдХрд┐рд╕реА рд╡реИрд╢реНрд╡рд┐рдХ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ


 struct vars * const v = &variables; 

рдЗрд╕рд▓рд┐рдП, рд╣рдо RISC-V ELF psABI рдкреНрд░рд▓реЗрдЦрди рдХреЛ рд░рд┐рд▓реЛрдХреЗрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ reloc.c рд▓рд┐рдП рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рдЧ reloc.c ред рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореВрд▓ рдлрд╝рд╛рдЗрд▓, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЛрдб рд╕реЗ рд▓реА рдЧрдИ рдереАред рд╡рд╣рд╛рдВ рднреА, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рдЯ рдЧрд╣рд░рд╛рдИ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, ElfW(Addr) рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ ElfW(Addr) , рдЬреЛ Elf32_Addr рдпрд╛ Elf64_Addr рдореЗрдВ Elf32_Addr Elf64_Addr ред рд╣рд░ рдЬрдЧрд╣ рдирд╣реАрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ (рд╕рд╛рде рд╣реА рд╕рд╛рде arch/riscv/reloc.inc.c - рдЖрдЦрд┐рд░рдХрд╛рд░, RISC-V рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рдЯ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдмрдВрдзрд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЕрд░реНрде рдирд╣реАрдВ рд╣реИ, рдЬрд╣рд╛рдВ рдпрд╣ рдирд╣реАрдВ рд╣реИ рдЖрд╡рд╢реНрдпрдХ)ред


рдирддреАрдЬрддрди, switch_to_main_stack (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдирд┐рд░реНрднрд░ switch_to_main_stack рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ) рдкрд╛рд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдбрд┐рдмрдЧрд░ рдЕрднреА рднреА рдХреБрдЯрд┐рд▓ рд░реВрдк рд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдареАрдХ рд╣реИ, рдареАрдХ рд╣реИ :(


рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░рд┐рднрд╛рд╖рд╛


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


zeowaa-1gb.dts
 /dts-v1/; / { #address-cells = ^_^lt gt^_^; #size-cells = ^_^lt gt^_^; compatible = "freechips,rocketchip-unknown-dev"; model = "freechips,rocketchip-unknown"; chosen { bootargs = "console=ttySIF0,125200 debug loglevel=7"; }; firmware { sifive,uboot = "YYYY-MM-DD"; }; L16: aliases { serial0 = &L8; }; L15: cpus { #address-cells = ^_^lt gt^_^; #size-cells = ^_^lt&#0;gt^_^; timebase-frequency = ^_^ltє┤ЙАgt^_^; L5: cpu@0 { device_type = "cpu"; clock-frequency = ^_^lt&#0;gt^_^; compatible = "sifive,rocket0", "riscv"; d-cache-block-size = ^_^lt gt^_^; d-cache-sets = ^_^lt@gt^_^; d-cache-size = ^_^ltсААgt^_^; d-tlb-sets = ^_^lt gt^_^; d-tlb-size = ^_^lt gt^_^; i-cache-block-size = ^_^lt gt^_^; i-cache-sets = ^_^lt@gt^_^; i-cache-size = ^_^ltсААgt^_^; i-tlb-sets = ^_^lt gt^_^; i-tlb-size = ^_^lt gt^_^; mmu-type = "riscv,sv39"; next-level-cache = <&L10>; reg = <0x0>; riscv,isa = "rv64imafdc"; status = "okay"; timebase-frequency = ^_^ltє┤ЙАgt^_^; tlb-split; L3: interrupt-controller { #interrupt-cells = ^_^lt gt^_^; compatible = "riscv,cpu-intc"; interrupt-controller; }; }; }; L10: ram@80000000 { device_type = "memory"; reg = <0x0 0x80000000 0x0 0x40000000>; reg-names = "mem"; }; L14: soc { #address-cells = ^_^lt gt^_^; #size-cells = ^_^lt gt^_^; compatible = "freechips,rocketchip-unknown-soc", "simple-bus"; ranges; L1: clint@2000000 { compatible = "riscv,clint0"; interrupts-extended = <&L3 3 &L3 7>; reg = <0x2000000 0x10000>; reg-names = "control"; }; L2: debug-controller@0 { compatible = "sifive,debug-013", "riscv,debug-013"; interrupts-extended = <&L3 65535>; reg = <0x0 0x1000>; reg-names = "control"; }; L9: gpio@64002000 { #gpio-cells = ^_^lt gt^_^; #interrupt-cells = ^_^lt gt^_^; compatible = "sifive,gpio0"; gpio-controller; interrupt-controller; interrupt-parent = <&L0>; interrupts = <3 4 5 6 7 8>; reg = <0x64002000 0x1000>; reg-names = "control"; }; L0: interrupt-controller@c000000 { #interrupt-cells = ^_^lt gt^_^; compatible = "riscv,plic0"; interrupt-controller; interrupts-extended = <&L3 11 &L3 9>; reg = <0xc000000 0x4000000>; reg-names = "control"; riscv,max-priority = ^_^lt gt^_^; riscv,ndev = ^_^lt gt^_^; }; L6: rom@10000 { compatible = "sifive,maskrom0"; reg = <0x10000 0x2000>; reg-names = "mem"; }; L8: serial@64000000 { compatible = "sifive,uart0"; interrupt-parent = <&L0>; clocks = <&tlclk>; interrupts = ^_^lt gt^_^; reg = <0x64000000 0x1000>; reg-names = "control"; }; L7: spi@64001000 { #address-cells = ^_^lt gt^_^; #size-cells = ^_^lt&#0;gt^_^; compatible = "sifive,spi0"; interrupt-parent = <&L0>; interrupts = ^_^lt gt^_^; reg = <0x64001000 0x1000>; clocks = <&tlclk>; reg-names = "control"; L12: mmc@0 { compatible = "mmc-spi-slot"; disable-wp; reg = <0x0>; spi-max-frequency = ^_^lt gt^_^; voltage-ranges = <3300 3300>; }; }; tlclk: tlclk { #clock-cells = ^_^lt&#0;gt^_^; clock-frequency = ^_^lt gt^_^; clock-output-names = "tlclk"; compatible = "fixed-clock"; }; }; }; 

рдореИрдВ рдИрдПрд▓рдПрдл рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ рдлрд┐рд░ рд╕реЗ рдПрдлрдбреАрдЯреА (рдлреНрд▓реИрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдЯреНрд░реА) рдХреЗ рд╕рд╛рде рдЖрд╢реНрд╡рд╕реНрдд рд╣реВрдВ: рдЗрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЕрдЪреНрдЫреА рджреЗрдЦрднрд╛рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧ рд▓рд┐рдЦрддреЗ рд╣реИрдВ (рдлрд┐рд░ рднреА, рд╡реЗ рдЦреБрдж рддреЛ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ!) рдФрд░ рдРрд╕реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ (рдХрдо рд╕реЗ рдХрдо рдЬрдм рддрдХ рдЖрдкрдХреЛ рдЕрд╡рд┐рд╢реНрд╡рд╛рд╕рд┐рдд рдЗрдирдкреБрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ) рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рддреЛ рдпрд╣рд╛рдБ: рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╣реЗрдбрд░ рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореИрдЬрд┐рдХ рдирдВрдмрд░ 0xd00dfeed рдФрд░ рдХреБрдЫ рдФрд░ рдлрд╝реАрд▓реНрдб рд╣реЛрддреЗ рд╣реИрдВред рд╣рдо "рдлреНрд▓реИрдЯ рдЯреНрд░реА" off_dt_struct рдФрд░ рдкрдВрдХреНрддрд┐ рддрд╛рд▓рд┐рдХрд╛ off_dt_strings рдХреА рдСрдлрд╝рд╕реЗрдЯ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рджрд░рдЕрд╕рд▓, рдЖрдкрдХреЛ off_mem_rsvmap рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ off_mem_rsvmap , рдЬреЛ рдХрд┐ рд╕реНрдореГрддрд┐ рд╕реЗ рдмрдЪрдиреЗ рд╡рд╛рд▓реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЕрднреА рднреА рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реВрдВ (рд╡реЗ рдореЗрд░реЗ рдмреЛрд░реНрдб рдкрд░ рдирд╣реАрдВ рд╣реИрдВ), рд▓реЗрдХрд┐рди рдШрд░ рдкрд░ рдЗрд╕реЗ рджреЛрд╣рд░рд╛рдПрдВ рдирд╣реАрдВ ред


рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ: рдЖрдкрдХреЛ рдмрд╕ рдЯреЛрдХрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рд╕рдкрд╛рдЯ рдкреЗрдбрд╝ рдкрд░ рдЪрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддреАрди рдкреНрд░рдореБрдЦ рдЯреЛрдХрди рд╣реИрдВ:


  • FDT_BEGIN_NODE - рдЗрд╕рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдореЗрдВ, рд╢реВрдиреНрдп-рд╕рдорд╛рдкреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдмрдЯреНрд░реА рддрддреНрд╡ рдХрд╛ рдирд╛рдо рдЖрддрд╛ рд╣реИред рдмрд╕ рд╕реНрдЯреИрдХ рдореЗрдВ рдирд╛рдо рдЬреЛрдбрд╝реЗрдВ
  • FDT_END_NODE - рд╕рдмрдЯреНрд░реА рдЦрддреНрдо рд╣реЛ рдЧрдИ рд╣реИ, рд╕реНрдЯреИрдХ рд╕реЗ рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ
  • FDT_PROP - рдпрд╣рд╛рдБ рдереЛрдбрд╝рд╛ рдкреЗрдЪреАрджрд╛ рдорд╛рдорд▓рд╛ рд╣реИ: рдпрд╣ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рдкреАрдЫрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдж рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдХреЗ рд▓реЗрди рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВред "рд╡реИрд░рд┐рдПрдмрд▓" рдХрд╛ рдирд╛рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЯреЗрдмрд▓ рдореЗрдВ рдСрдлрд╕реЗрдЯ nameoff рд╣реИ
     struct { uint32_t len; uint32_t nameoff; } 

рдареАрдХ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╕рдм: рд╣рдо рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, 4 рдмрд╛рдЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░реЗрдЦрдг рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдирд╣реАрдВ рднреВрд▓рддреЗ рд╣реИрдВред рдЕрд░реЗ рд╣рд╛рдВ, рдорд░рд╣рдо рдореЗрдВ рдПрдХ рдордХреНрдЦреА: рдПрдлрдбреАрдЯреА рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдПрдВ рдмрдбрд╝реЗ рдПрдВрдбрд┐рдпрди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ


 static inline uint32_t be32(uint32_t x) { return (x << 24) | (x >> 24) | ((x & 0xff0000) >> 8) | ((x & 0xff00) << 8); } 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, riscv_entry рдкрд╣рд▓реА рдмрд╛рдд FDT рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╣реИ, рдФрд░ head.S рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЬреЛ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ riscv_entry рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, riscv_entry рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ


  .globl startup_32 #  --    ... startup_32: lla sp, boot_stack_top mv s0, a0 # s0, s1 -- callee-saved mv s1, a1 # ...  .bss #   jal _dl_start #      mv a0, s0 mv a1, s1 j riscv_entry 

рд░рдЬрд┐рд╕реНрдЯрд░ a0 hart id рд╣рдореЗрдВ рджреА рдЧрдИ рд╣реИ (hart RISC-V рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдПрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕реНрдЯреНрд░реАрдо рдХреА рддрд░рд╣ рд╣реИ) - рдореИрдВ рдЕрднреА рддрдХ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛, рдореБрдЭреЗ рдЗрд╕реЗ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдордЭрд╛рдирд╛ рд╣реЛрдЧрд╛ред a1 рдмреВрдЯрд▓реЛрдбрд░ FDT рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд░рдЦрддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдлрдВрдХреНрд╢рди void riscv_entry(ulong hartid, uint8_t *fdt_address) ред


рдЕрдм, рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ FDT рдкрд╛рд░реНрд╕рд┐рд▓реНрдХрд╛ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рдмреЛрд░реНрдб рдХрд╛ рд▓реЛрдбрд┐рдВрдЧ рдХреНрд░рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛ рдЧрдпрд╛:


  • рд╕рддреНрддрд╛ рдЪрд╛рд▓реВ рдХрд░реЛ
  • U- рдмреВрдЯ рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ
  • рд╕рд╣реА FDT рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдХрдорд╛рдВрдб рджрд░реНрдЬ рдХрд░реЗрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, /chosen/bootargs рдХрдорд╛рдВрдб /chosen/bootargs рдХрд░реНрдиреЗрд▓ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдЬреЛ рдореИрдВ рдПрдлрдбреАрдЯреА рд╕реЗ рд▓реЗрддрд╛ рд╣реВрдВ - рд░реИрдо рд░реЗрдВрдЬ, рдпреВрдПрдЖрд░рдЯреА рдкрддрд╛, ... - рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
     run fdtsetup fdt set /chosen bootargs "console=ttyS0 btrace" 
  • fdt addr рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдпрджрд┐ рдЖрдкрдиреЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рддреЛ FDT рдбрд╛рдЙрдирд▓реЛрдб рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

рдФрд░ gdb рдХреА рддрд░рдл рд╕реЗ рдХрдорд╛рдВрдб рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ


  • -ex 'set $a1=0xfdtaddr'

рд╕реНрдХреНрд░реАрди рдкрд░ рд╕реВрдЪрдирд╛ рдЙрддреНрдкрд╛рджрди


рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдХреЛрдбрд╛рдВрддрд░рдХ рдЖрд╡реЗрд╖рдг рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдореГрддрд┐ рдкрддреЗ рднреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП SCREEN_ADR (рдареАрдХ рдЙрд╕реА рддрд░рд╣, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ D рд╕рд╛рде), рдЬреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдЕрдиреБрд░реВрдк рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬрдм рдореИрдВ рдЗрд╕ рдкрд╛рд░ рдЖрдпрд╛, рддреЛ рдореИрдВрдиреЗ рдмрд╕ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдЗрд╢рд╛рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд░рдЦрд╛ рдЬреЛ рдЗрд╕реЗ #if HAS_SCREEN рддрд╣рдд рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ #if HAS_SCREEN рдбрд┐рдмрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдХреБрдЫ рд╕рдордп рдореЗрдВ рдПрдХ рдмрд╛рд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдпрд╣ рд╕рдм рд╕рд╛рдВрддреНрд╡рдирд╛ рдХреЗ рд▓рд┐рдП рдбрдВрдк рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдПрдХ рд╣реА рдХреЛрдб рджрд░реНрджрдирд╛рдХ рд░реВрдк рд╕реЗ рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдХрдИ рдПрд╕реНрдХреЗрдк рд╕реАрдХреНрд╡реЗрдВрд╕ рдЖрдЙрдЯрдкреБрдЯ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦрд╛ рдЬрд╛ рдЪреБрдХрд╛ рдерд╛, рдЖрдкрдХреЛ рдмрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдФрд░ рдпрд╣рд╛рдВ рдпрд╣ рд╣реИ, рдорд┐рдиреАрдХреИрдо рд╡рд┐рдВрдбреЛ рдореЗрдВ рдкрд░рд┐рдЪрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрдж)! (рдлрд┐рд▓рд╣рд╛рд▓, HAS_SCREEN рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдореИрдВрдиреЗ рдореВрд▓ рдХреЛрдб рдХреЛ рдиреНрдпреВрдирддрдо рдкрд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП dummy_con рд╕рд░рдгреА рд╢реБрд░реВ рдХреА рд╣реИред)


QEMU рдкрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ


рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдЕрд╕рд▓реА рдмреЛрд░реНрдб рдкрд░ рд╕рдм рдХреБрдЫ рдбрд┐рдмреЗрдЯ рдХрд┐рдпрд╛, рдФрд░ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП - рдЖрдБрдЦ рдмрдВрдж рдХрд░рдХреЗ рднреА рдирд╣реАрдВред рд▓реЗрдХрд┐рди JTAG рдкрд░ рд╕рдм рдХреБрдЫ рдзреАрдорд╛ рд╣реЛ рдЧрдпрд╛ - рдЖрддрдВрдХ! рдЦреИрд░, рдЕрдВрдд рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди QEMU рдкрд░ рдбрд┐рдмрдЧ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рдж, рдХреБрдЫ рдПрдХ рдмреИрд╕рд╛рдЦреА рдирд┐рдХрд▓рд╛, рд▓реЗрдХрд┐рди рдмреЛрд░реНрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди:


 $ qemu-system-riscv64 -M help Supported machines are: none empty machine sifive_e RISC-V Board compatible with SiFive E SDK sifive_u RISC-V Board compatible with SiFive U SDK spike_v1.10 RISC-V Spike Board (Privileged ISA v1.10) (default) spike_v1.9.1 RISC-V Spike Board (Privileged ISA v1.9.1) virt RISC-V VirtIO Board (Privileged ISA v1.10) 

рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рдмреЛрд░реНрдб QEMU рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рдореБрдЭреЗ sifive_u рд╕рдВрдЧрдд рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред


 $ qemu-system-riscv64 -M sifive_u,dumpdtb -m 1g # - QEMU      on --  strace   $ ls -l on -rw-rw-r-- 1 trosinenko trosinenko 1923  19 20:14 on $ dtc -I dtb < on > on.dts #   $ vim on.dts #  bootargs $ dtc < on.dts > on.dtb <stdout>: Warning (clocks_property): /soc/ethernet@100900fc:clocks: cell 0 is not a phandle reference <stdout>: Warning (clocks_property): /soc/ethernet@100900fc:clocks: cell 1 is not a phandle reference <stdout>: Warning (clocks_property): /soc/ethernet@100900fc:clocks: cell 2 is not a phandle reference <stdout>: Warning (interrupts_extended_property): /soc/interrupt-controller@c000000:interrupts-extended: cell 0 is not a phandle reference <stdout>: Warning (interrupts_extended_property): /soc/interrupt-controller@c000000:interrupts-extended: cell 2 is not a phandle reference <stdout>: Warning (interrupts_extended_property): /soc/clint@2000000:interrupts-extended: cell 0 is not a phandle reference <stdout>: Warning (interrupts_extended_property): /soc/clint@2000000:interrupts-extended: cell 2 is not a phandle reference 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ "рдлрд┐рдХреНрд╕реНрдб" рдбрд┐рд╡рд╛рдЗрд╕ рдЯреНрд░реА рдмреНрд▓реЙрдм рд╣реИред VM (рдмреИрд╕рд╛рдЦреА!) рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ , рдЪрд▓рд╛рдПрдВ:


 qemu-system-riscv64 \ -M sifive_u -m 1g \ -serial stdio \ -s -S 

-serial stdio рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рдХреЛ рдХрдВрд╕реЛрд▓ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрд╕реНрдХреЗрдк рдЕрдиреБрдХреНрд░рдо рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред -s -S рд╡рд┐рдХрд▓реНрдк рдХреНрд░рдорд╢рдГ gdbserver рдмрдврд╝рд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ VM рдХреЛ рд╡рд┐рд░рд╛рдо рджреЗрддреЗ рд╣реИрдВред рдЖрдк loader рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдкрдХреЛ рд╣рд░ рдмрд╛рд░ QEMU рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рдЖрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ


 riscv64-unknown-elf-gdb \ -ex 'target remote 127.0.0.1:1234' \ -ex 'restore /path/to/on.dtb binary 0x80100000' \ -ex 'restore /path/to/memtest_shared.bin binary 0x80020000' \ -ex 'add-symbol-file memtest_shared 0x80100000' \ -ex 'set $a1=0x80020000' \ -ex 'set $pc=0x80100000' 

рдирддреАрдЬрддрди, рд╕рдм рдХреБрдЫ рдЪрд╛рд▓рд╛рдХреА рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!


рдХрд╛рдо рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд


, , , Memtest86+ btrace , , ( , QEMU):


btrace рдореЛрдб


, , memtest . , (, trap): , , QEMU - ! ┬л┬╗ Illegal instruction , . mcause (?), тАФ mepc (?), тАФ mtval ( ?), .


рдЕрд╡реИрдз рдирд┐рд░реНрджреЗрд╢


, :


head.S:


 #       #   = 0 ---   ,   #  ,    ,     ... lla t1, _trap_entry csrw mtvec, t1 # ... _trap_entry: csrr a0, mcause csrr a1, mepc csrr a2, mtval jal riscv_trap_entry 

, calling convention, . memtest, HiFive_U-Boot, Volume II :


arch.c:


 static const char *errors[] = { "Instruction address misaligned", "Instruction access fault", "Illegal instruction", "Breakpoint", "Load address misaligned", "Load access fault", "Store/AMO address misaligned", "Store/AMO access fault", ^_^quot quot^_^, ^_^quot quot^_^, ^_^quot quot^_^, ^_^quot quot^_^, "Instruction page fault", "Load page fault", ^_^quot quot^_^, "Store/AMO page fault", }; void riscv_trap_entry(ulong cause, ulong epc, ulong tval) { char buf[32]; cprint(12, 0, "EXCP: "); if (cause < sizeof(errors) / sizeof(errors[0])) { cprint(12, 8, errors[cause]); } else { itoa(buf, cause); cprint(12, 8, buf); } cprint(13, 0, "PC: "); hprint3(13, 8, epc, 8); cprint(14, 0, "Addr: "); hprint3(14, 8, tval, 8); HALT(); } 

тАФ ┬л ┬╗ . , ┬л┬╗ , , , .


: . , memtest : : ┬л , , . ┬╗. : do_test main.c 2, ( ), тАФ ┬л┬╗ , memtest. , run_at , memtest _start _end ( ┬л┬╗ ), - spinlock' goto *addr; . , , ┬л┬╗ , ┬л┬╗.


, bss тАФ _dl_start , riscv_entry , trap entry. , : L1I-, . , fence.i .


, Memtest86+ тАФ , barrier_s . , . , , .



, : . : . : , - (Own Address, ) . , , . . - . , x86 , , uint64_t 0x80000002 . , : , load/store x86 , тАФ . , QEMU , ┬л , ┬╗.


, , тАФ unaligned access ..


, , RocketChip, тАФ QEMU, , , RocketChip тАФ unaligned access trap, QEMU ┬л ┬╗.
┬лmisaligned┬╗ ,


Changed description of misaligned load and store behavior. The specification now allows visible misaligned address traps in execution environment interfaces, rather than just mandating invisible handling of misaligned loads and stores in user mode. Also, now allows access exceptions to be reported for misaligned accesses (including atomics) that should not be emulated.

, , тАФ , user-mode code , . . , , . , тАФ - machine mode . , rdtsc (x86) rdtime (rv64), trap, . , , memory-mapped .


: , low_test_addr ( ), , fdt . , , low_test_addr , , 2 high_test_adr тАж , тАФ : head.S initial_load_addr , riscv_entry move_to_correct_addr :


 static void move_to_correct_addr(void) { uintptr_t cur_start = (uintptr_t)&_start; uintptr_t cur_end = (uintptr_t)&_end; if (cur_start == low_test_addr || cur_start == high_test_adr) { //  ,     return; } if (cur_start == initial_load_addr && (cur_start - low_test_addr) < (cur_end - cur_start) ) { //   " ":   , //           //     ,    ,   //     ... serial_echo_print("FIRST STARTUP RELOCATION...\n"); void *temp_addr = (((uintptr_t)&_end >> 12) + 1) << 12; run_at(temp_addr, 0); } else { // ,    --- ,  . serial_echo_print("FINAL STARTUP RELOCATION...\n"); run_at(low_test_addr, 0); } } 

, тАФ , memtest , RAM - . RISC-V , v->plim_lower .


, ┬л┬╗ , -, тАФ test.c ulong ( unsigneg long ), 32- x86 uint32_t , ┬л 64 ┬╗ uint64_t . ┬л!!! Good: ffffffff Real: ffffffff Bad bits: 00000000┬╗. ? - -1, 32 1. , , 0тАж , : , ulong ( uint32_t ), ( uintptr_t ). , . , uint64_t 4. RISC-V , C, , тАФ UB. memtest UBSan. , , UBSan trap-on-error JTAG.



, memtest - , , U-Boot.


: mkimage U-Boot Linux :


 mkimage -A riscv -O linux -T kernel -C none \ -a 0x80000000 -e 0x80000000 \ -n memtest -d memtest.bin memtest.uboot 

SD-


 run mmcsetup; run fdtsetup; fdt set /chosen bootargs "console=ttyS0"; fatload mmc 0:1 82000000 memtest.uboot; bootm fdt; bootm 82000000 - ${fdtaddr} 

( , run тАФ ).


: FDT: 0xbffb7c80 . , : ffffffff , . , ( ), : HiFive_U-Boot :


  theKernel(machid, (unsigned long)images->ft_addr); 

,


  void (*theKernel)(int arch, uint params); 

, , , , 32 , head.S :


  li t0, 0xffffffffL and a1, a1, t0 


, , - , , , :


  • x86. тАФ review
  • SMP RISC-V
  • arch/ -
  • test.c RISC-V ( -O0 !)

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


All Articles