如何fmt.Println()内存未由go程序分配



我想将当前程序的虚拟内存内容从0x10000打印到0x50000(系统上包含syscall蹦床的区域)

package main
import (
"syscall"
"unsafe"
)
func main() {
syscall.Syscall(SYS_WRITE, uintptr(1), uintptr(unsafe.Pointer(0x10000)), uintptr(0x40000))
}

然而,当我试图编译时,我得到了错误:

cannot convert 65536 (type int) to type unsafe.Pointer

在我的例子中,cgo被禁用(import "C"在编译时失败)
syscall.Syscall(SYS_WRITE也是唯一的方法吗?

您可以将该地址转换为字节片,然后将其传递给任何Write方法。

要将地址0x10000转换为长度为0x30000的字节片,可以使用

mem := (*[1 << 30]byte)(unsafe.Pointer(uintptr(0x10000)))[:0x30000:0x30000]

如果大小始终是静态的,您可以将数组设置为适当的大小来启动

mem := (*[0x30000]byte)(unsafe.Pointer(uintptr(0x10000)))[:]

您面临的直接问题是应该将0x10000直接转换为uintptr,而不是通过unsafe。指针。我不知道解决这个问题是否能解决你剩下的问题。

最新更新