2017-02-13 2 views
0

現在のプログラムの仮想メモリの内容を0x10000から0x50000(システム上のシステムコールトランポリンを含む領域)に印刷したいと考えています。私はそのエラーになってるコンパイルしようとしたときにfmt.Println()メモリは、goプログラムによって割り当てられていないのですか?

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はそれを行う唯一の方法ですか?

+0

私はゴランで知っています。私はこれが境界外の読み取りと見なすことができることを知っていますが、これは特定のシステムコールが有効かどうかを知るために必要です。 – user2284570

答えて

2

このアドレスをバイトスライスに変換してから、Writeメソッドに渡すことができます。あなたはサイズが常に静的である場合は、あなただけの

を開始するために適切なサイズに配列を設定することができ

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

を使用することになり、0x30000の長さとバイトのスライスにアドレス0x10000を変換するには

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

'[1 << 30]バイトは何を意味しますか? – user2284570

+0

@ user2284570:サイズが '1 << 30'の配列型です – JimB

+0

syscallパッケージなしでこの種の配列を出力する方法はありますか? – user2284570

1

直面している直面する問題は、unsafe.Pointerではなくuintptrに直接0x10000を変換することです。私はあなたの問題の残りの部分を解決するかどうかわからない。

+0

おかげさまで、 'syscall.Syscall'を直接使用するのではなく、' fmt.Printf() 'や' '' '' '' '' '' '' '' ' – user2284570

+0

JimBの答えはそれをカバーしているようです。 – andybalholm

関連する問題