Heim  >  Artikel  >  Backend-Entwicklung  >  Ändern Sie „Go', um Gem5 m5ops zu verwenden: „Go Tool Dist' zeigt die Importmeldung an und wird dann beendet

Ändern Sie „Go', um Gem5 m5ops zu verwenden: „Go Tool Dist' zeigt die Importmeldung an und wird dann beendet

WBOY
WBOYnach vorne
2024-02-13 19:50:10632Durchsuche

修改go以使用Gem5 m5ops:go tool dist显示导入消息然后退出

PHP-Editor Apple ist hier, um Ihnen eine Methode zum Modifizieren der Go-Sprache für die Verwendung von Gem5 m5ops vorzustellen. Gem5 ist ein weit verbreiteter Emulator und m5ops ist eine Reihe von Betriebssystemschnittstellen in Gem5. Durch Modifizieren der Go-Sprache können wir die m5ops-Schnittstelle von Gem5 für Leistungsanalysen und Debugging verwenden. Die spezifischen Schritte bestehen darin, der Go-Toolkette Unterstützung für m5ops hinzuzufügen und dann die von m5ops bereitgestellten Funktionen für Leistungsüberwachungs- und Debugging-Vorgänge zu verwenden. Auf diese Weise können wir besser verstehen, wie die Go-Sprache in der Simulationsumgebung ausgeführt wird, und entsprechende Optimierungs- und Debugging-Arbeiten durchführen.

Frageninhalt

Ich bin ganz neu bei Golang.

Ich versuche, einige C-Funktionsaufrufe (insbesondere m5ops) in die Laufzeit von Golang (insbesondere src/proc.go) einzufügen.

Ich habe versucht, cgo zu verwenden, was dazu führte, dass dieser Import am Anfang von proc.go hinzugefügt wurde:

// #cgo cflags: -i$(gem5_path)/include -static
// #cgo ldflags: -l$(gem5_path)/util/m5/build/x86/out -lm5
// #include <gem5/m5ops.h>
import "c"

Aber wenn ich versuche, mit ./all.bash neu zu erstellen, gibt das Skript Folgendes aus und beendet es dann:

./all.bash
building go cmd/dist using /usr/local/go. (go1.20.5 linux/amd64)
building go toolchain1 using /usr/local/go.
building go bootstrap cmd/go (go_bootstrap) using go toolchain1.
go tool dist: /home/landerx/goroot/src/runtime/proc.go imports c

Eine detailliertere Version der obigen Ausgabe:

./all.bash -v
Building Go cmd/dist using /usr/local/go. (go1.20.5 linux/amd64)
cmd/dist

Building Go toolchain1 using /usr/local/go.
internal/goarch
internal/coverage/rtcov
internal/goos
internal/race
internal/unsafeheader
internal/goexperiment
unicode
runtime/internal/syscall
sync/atomic
runtime/internal/atomic
internal/cpu
unicode/utf8
internal/itoa
math/bits
internal/abi
runtime/internal/math
runtime/internal/sys
bootstrap/internal/goarch
bootstrap/internal/goexperiment
bootstrap/math/bits
encoding
bootstrap/internal/unsafeheader
bootstrap/internal/platform
bootstrap/internal/coverage
internal/bytealg
bootstrap/internal/abi
math
unicode/utf16
bootstrap/internal/goversion
internal/goversion
bootstrap/internal/race
bootstrap/cmd/compile/internal/test
runtime
internal/reflectlite
runtime/metrics
sync
internal/testlog
internal/godebug
bootstrap/internal/bisect
math/rand
errors
sort
bootstrap/sort
io
internal/oserror
internal/safefilepath
path
strconv
bootstrap/strconv
syscall
bootstrap/container/heap
hash
text/tabwriter
bytes
strings
hash/adler32
hash/fnv
hash/crc32
crypto
reflect
bootstrap/internal/types/errors
go/build/constraint
bootstrap/go/build/constraint
bufio
regexp/syntax
html
internal/syscall/execenv
internal/syscall/unix
time
regexp
context
io/fs
internal/poll
internal/fmtsort
bootstrap/internal/saferio
encoding/binary
os
bootstrap/cmd/internal/notsha256
encoding/base64
bootstrap/cmd/internal/sys
crypto/md5
bootstrap/internal/lazyregexp
internal/lazyregexp
path/filepath
fmt
os/exec
log
bootstrap/internal/buildcfg
flag
bootstrap/cmd/internal/src
text/scanner
bootstrap/cmd/internal/edit
bootstrap/cmd/internal/pkgpath
go/token
bootstrap/compress/flate
bootstrap/internal/zstd
go/doc/comment
bootstrap/debug/dwarf
encoding/json
runtime/debug
bootstrap/math/big
bootstrap/cmd/internal/bio
net/url
go/scanner
bootstrap/cmd/internal/objabi
bootstrap/cmd/compile/internal/abt
bootstrap/cmd/internal/goobj
bootstrap/cmd/internal/gcprog
bootstrap/cmd/internal/quoted
bootstrap/compress/zlib
encoding/hex
compress/flate
go/ast
internal/buildcfg
internal/goroot
bootstrap/cmd/internal/dwarf
runtime/trace
bootstrap/cmd/internal/archive
bootstrap/cmd/internal/obj
bootstrap/debug/macho
bootstrap/debug/elf
bootstrap/debug/pe
bootstrap/internal/xcoff
bootstrap/cmd/link/internal/dwtest
compress/gzip
bootstrap/internal/profile
runtime/pprof
go/doc
go/printer
go/internal/typeparams
go/parser
bootstrap/cmd/internal/codesign
bootstrap/go/constant
bootstrap/internal/pkgbits
bootstrap/cmd/compile/internal/syntax
bootstrap/cmd/link/internal/benchmark
bootstrap/cmd/compile/internal/pgo/internal/graph
go/build
go/format
bootstrap/cmd/cgo
bootstrap/cmd/internal/obj/loong64
bootstrap/cmd/internal/obj/mips
bootstrap/cmd/internal/obj/wasm
bootstrap/cmd/internal/obj/arm
bootstrap/cmd/internal/obj/arm64
bootstrap/cmd/internal/obj/s390x
bootstrap/cmd/internal/obj/riscv
bootstrap/cmd/internal/obj/ppc64
bootstrap/cmd/internal/obj/x86
bootstrap/cmd/asm/internal/flags
bootstrap/cmd/compile/internal/base
bootstrap/cmd/compile/internal/logopt
bootstrap/cmd/asm/internal/lex
bootstrap/cmd/link/internal/sym
bootstrap/cmd/link/internal/loader
bootstrap/cmd/compile/internal/bitvec
bootstrap/cmd/compile/internal/types
bootstrap/cmd/compile/internal/types2
bootstrap/cmd/link/internal/loadelf
bootstrap/cmd/link/internal/loadmacho
bootstrap/cmd/link/internal/loadpe
bootstrap/cmd/link/internal/loadxcoff
bootstrap/cmd/compile/internal/typebits
bootstrap/cmd/compile/internal/ir
bootstrap/cmd/asm/internal/arch
bootstrap/cmd/link/internal/ld
bootstrap/cmd/asm/internal/asm
bootstrap/cmd/asm
bootstrap/cmd/compile/internal/abi
bootstrap/cmd/compile/internal/deadcode
bootstrap/cmd/compile/internal/typecheck
bootstrap/cmd/compile/internal/objw
bootstrap/cmd/compile/internal/staticdata
bootstrap/cmd/compile/internal/compare
bootstrap/cmd/compile/internal/pgo
bootstrap/cmd/compile/internal/coverage
bootstrap/cmd/compile/internal/loopvar
bootstrap/cmd/compile/internal/importer
bootstrap/cmd/compile/internal/escape
bootstrap/cmd/compile/internal/inline
bootstrap/cmd/compile/internal/reflectdata
bootstrap/cmd/compile/internal/devirtualize
bootstrap/cmd/compile/internal/staticinit
bootstrap/cmd/compile/internal/ssa
bootstrap/cmd/link/internal/amd64
bootstrap/cmd/link/internal/loong64
bootstrap/cmd/link/internal/arm
bootstrap/cmd/link/internal/mips
bootstrap/cmd/link/internal/mips64
bootstrap/cmd/link/internal/arm64
bootstrap/cmd/link/internal/ppc64
bootstrap/cmd/link/internal/riscv64
bootstrap/cmd/link/internal/s390x
bootstrap/cmd/link/internal/wasm
bootstrap/cmd/link/internal/x86
bootstrap/cmd/link
bootstrap/cmd/compile/internal/liveness
bootstrap/cmd/compile/internal/ssagen
bootstrap/cmd/compile/internal/amd64
bootstrap/cmd/compile/internal/arm
bootstrap/cmd/compile/internal/arm64
bootstrap/cmd/compile/internal/dwarfgen
bootstrap/cmd/compile/internal/loong64
bootstrap/cmd/compile/internal/mips
bootstrap/cmd/compile/internal/mips64
bootstrap/cmd/compile/internal/wasm
bootstrap/cmd/compile/internal/s390x
bootstrap/cmd/compile/internal/riscv64
bootstrap/cmd/compile/internal/ppc64
bootstrap/cmd/compile/internal/walk
bootstrap/cmd/compile/internal/x86
bootstrap/cmd/compile/internal/noder
bootstrap/cmd/compile/internal/pkginit
bootstrap/cmd/compile/internal/gc
bootstrap/cmd/compile

Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1.
runtime
go tool dist: /home/landerx/goroot/src/runtime/proc.go imports C

Habe die cgo_enabled=1-Flagge ausprobiert, scheint keinen Unterschied zu machen.

Ich habe es nur mit Laufen versucht make.bash, schien keinen Unterschied zu machen.

Ich habe mich gefragt, ob es sich um ein Abhängigkeitsproblem handelt, aber ich habe keine Meldungen im Zusammenhang mit dem gefälschten Paket cgo oder Fehler in meinem vscode gesehen.

Lösung

Okay...Lassen Sie mich zum Schluss diese Frage beantworten.

Warum funktioniert es nicht?

Nach eingehender Untersuchung habe ich herausgefunden, dass Go (das Tool dist) anscheinend keine Quelldateien in den meisten Go-Interna zulässt (

Link)

Lösung

Es gibt noch einige Workarounds, um diesen Effekt zu erzielen, nämlich

die Verwendung von m5ops in go.

1. Funktionszeiger über globale Variable übergeben

Sie können globale Funktionszeiger in

definieren und cgo in Ihre Go-Anwendung importieren und diese globalen Funktionszeiger Ihren Funktionen zuweisen, die m5ops ausführen. proc.goDer Aufruf von C-Funktionszeigern wird nicht unterstützt und muss daher mit Golang-Funktionen umschlossen werden.

2. Zur Zusammenstellung gehen

Go verwendet in seinen internen Quelldateien viel Go Asm, um den Stapelwechsel usw. zu handhaben.

Andererseits werden m5ops irgendwann als einzelne Direktive eingebunden.

Wenn man also der Syntax und den Funktionsbindungen von Go Asm folgt, was in

asm_amd64.s und stubs.go geschieht, kann man eine ASM-Funktion schreiben, die die m5ops-Anweisungen enthält, und dann in a> sollte es gut sein. runtime的任何地方调用它。go

Weitere Informationen

    Es scheint, dass in
  • beim Wechsel zum Systemstapel keine Funktionen außerhalb der Datei (oder des Pakets?) mehr ausgeführt werden können, sodass Methode 1 nicht funktioniert, wenn Sie versuchen, diese Funktionsaufrufe einzufügen, deren Schreibvorgang auf dem System erfolgt Stack-Code, auf dem ausgeführt werden soll. Also habe ich endlich die zweite Methode entdeckt. runtime.go

Das obige ist der detaillierte Inhalt vonÄndern Sie „Go', um Gem5 m5ops zu verwenden: „Go Tool Dist' zeigt die Importmeldung an und wird dann beendet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen