Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ubah suai go untuk menggunakan Gem5 m5ops: go tool dist memaparkan mesej import dan kemudian keluar

Ubah suai go untuk menggunakan Gem5 m5ops: go tool dist memaparkan mesej import dan kemudian keluar

WBOY
WBOYke hadapan
2024-02-13 19:50:10632semak imbas

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

Editor PHP Apple di sini untuk memperkenalkan kepada anda kaedah mengubah suai bahasa Go untuk menggunakan Gem5 m5ops. Gem5 ialah emulator yang digunakan secara meluas, dan m5ops ialah satu set antara muka sistem pengendalian dalam Gem5. Dengan mengubah suai bahasa Go, kami boleh menggunakan antara muka m5ops Gem5 untuk analisis prestasi dan penyahpepijatan. Langkah khusus ialah menambah sokongan untuk m5ops pada rantai alat Go, dan kemudian menggunakan fungsi yang disediakan oleh m5ops untuk pemantauan prestasi dan operasi penyahpepijatan. Dengan cara ini, kita boleh lebih memahami cara bahasa Go berjalan dalam persekitaran simulasi dan melaksanakan kerja pengoptimuman dan penyahpepijatan yang sepadan.

Isi soalan

Saya sangat baru mengenali golang.

Saya cuba memasukkan beberapa panggilan fungsi c (khususnya m5ops) ke dalam masa jalan golang (khususnya src/proc.go).

Saya cuba menggunakan cgo, yang mengakibatkan penambahan import ini pada permulaan 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"

Tetapi apabila saya cuba membina semula menggunakan ./all.bash output skrip dan kemudian keluar:

./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

Versi yang lebih terperinci bagi output di atas:

./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

Mencuba bendera cgo_enabled=1, nampaknya tidak ada perbezaan.

Cuba berlari sahaja make.bash, nampak tak ada perbezaan.

Saya tertanya-tanya sama ada ia adalah isu pergantungan, tetapi saya tidak melihat sebarang mesej yang berkaitan dengan pakej palsu cgo atau sebarang ralat dengan vscode saya.

Penyelesaian

Baiklah...Akhir sekali, biar saya jawab soalan ini.

Mengapa ia tidak berkesan

Selepas penyiasatan yang agak mendalam, saya mendapati nampaknya Go (alat dist) tidak membenarkan fail sumber dalam kebanyakan bahagian dalam go (Pautan)

Penyelesaian

Masih terdapat beberapa penyelesaian untuk mencapai kesan ini, iaitu menggunakan m5ops in go.

1. Lulus penunjuk fungsi melalui pembolehubah global

Anda boleh menentukan penunjuk fungsi global dalam proc.go dan import cgo dalam aplikasi go anda dan tetapkan penunjuk fungsi global ini kepada fungsi anda yang melaksanakan m5ops. Memanggil penunjuk fungsi C tidak disokong, jadi ia perlu dibalut dengan fungsi golang.

2. Pergi ke kompilasi

Go menggunakan banyak Go Asm dalam fail sumber dalamannya untuk mengendalikan penukaran tindanan dsb.

Sebaliknya, m5ops akhirnya akan diselaraskan sebagai arahan tunggal.

Jadi mengikut sintaks dan pengikatan fungsi Go Asm, yang berlaku dalam asm_amd64.s dan stubs.go a>, seseorang boleh menulis fungsi asm yang mengandungi arahan m5ops, dan kemudian dalam runtime的任何地方调用它。go ia sepatutnya bagus.

Maklumat lain

  • Nampaknya dalam runtime.go apabila ia beralih kepada timbunan sistem, ia tidak lagi dapat melaksanakan fungsi di luar fail (atau pakej?) jadi kaedah 1 tidak akan berfungsi jika anda cuba memasukkan panggilan fungsi tersebut, tulis akan berada pada sistem kod tindanan untuk dijalankan. Jadi saya akhirnya menemui kaedah kedua.

Atas ialah kandungan terperinci Ubah suai go untuk menggunakan Gem5 m5ops: go tool dist memaparkan mesej import dan kemudian keluar. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam