php小編蘋果在這裡為大家介紹一個關於修改Go語言以使用Gem5 m5ops的方法。 Gem5是一個廣泛使用的模擬器,而m5ops是Gem5中的一組作業系統介面。透過修改Go語言,我們可以使用Gem5的m5ops介面來進行效能分析和除錯。具體的步驟是,在Go的工具鏈中加入對m5ops的支持,然後使用m5ops提供的函數進行效能監測和除錯操作。透過這種方式,我們可以更了解Go語言在模擬環境中的運作情況,並進行相應的最佳化和偵錯工作。
我對 golang 還很陌生。
我正在嘗試將一些 c 函數呼叫(特別是 m5ops)插入到 golang 的執行時間(特別是 src/proc.go)。
我嘗試使用 cgo,這導致將此導入添加到 proc.go
的開頭:
// #cgo cflags: -i$(gem5_path)/include -static // #cgo ldflags: -l$(gem5_path)/util/m5/build/x86/out -lm5 // #include <gem5/m5ops.h> import "c"
但是當我嘗試使用 ./all.bash
重建時,腳本輸出然後退出:
./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
上述輸出的更詳細版本:
./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
嘗試了 cgo_enabled=1
標誌,似乎沒有任何區別。
嘗試只運行 make.bash
,似乎沒有任何區別。
我想知道是否是依賴問題,但沒有看到任何與偽包 cgo
相關的訊息,也沒有看到我的 vscode 出現任何錯誤。
好吧...最後,讓我來回答這個問題。
經過相當深入的調查,我發現似乎Go(工具dist)不允許在大多數go內部原始檔(連結)
仍然有一些解決方法可以實現該效果,即在 go 中使用 m5ops。
你可以在proc.go
中定義全域函數指針,並在你的go應用程式中導入cgo,並將這些全域函數指針指派給你執行m5ops的函數。 不支援呼叫C函數指標,所以需要用golang函數包裝它。
Go 在其內部原始檔案中使用了大量 Go Asm,以處理堆疊切換等。
另一方面,m5ops 最終將作為單一偽指令內聯。
因此遵循Go Asm 的語法和函數綁定,這發生在asm_amd64.s 和stubs.go a>,可以寫一個包含m5ops指令的asm函數,然後在runtime的任何地方都呼叫它。 go
應該不錯。
runtime.go
中,當它切換到系統堆疊時,它無法再執行檔案(或套件?)之外的函數,因此如果您嘗試插入這些函數調用,方法1將不起作用寫入將在系統堆疊上運行的程式碼。所以我終於發現了第二種方法。 以上是修改go以使用Gem5 m5ops:go tool dist顯示導入訊息然後退出的詳細內容。更多資訊請關注PHP中文網其他相關文章!