如何 fmt.Println() 没有被 go 程序分配的内存?

How to fmt.Println() memory not allocated by the go program?

我想打印当前程序的虚拟内存内容,从 0x100000x50000 (我系统上包含系统调用蹦床的区域).

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 是唯一的方法吗?

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

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

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

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

如果大小始终是静态的,您只需将数组设置为合适的大小即可开始

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