2017-06-18 20 views
0

私はMac OS Xで標準のライブラリではなくsyscallsだけを使って簡単なアプリケーションを作成しようとしています。Mac OS Xでmmapシステムコールの問題点は何ですか?

main.cの

#define PROT_READ 0x1 
#define PROT_WRITE 0x2 
#define MAP_ANONYMOUS 0x20 
#define MAP_PRIVATE 0x02 

#define PAGE_SIZE 4096 

#define NULL 0 

#define STDOUT 1 

#define SYSCALL_BASE 0x2000000 
#define SYSCALL_GET(num) SYSCALL_BASE + num 

long long syscall(long long arg1, long long arg2, long long arg3, long long arg4, long long arg5, long long arg6, long long cn); 

void exit(long long status) { 
    syscall(status, 0, 0, 0, 0, 0, SYSCALL_GET(1)); 
} 

long long write(long long fd, char *buf, long long len) { 
    return syscall(fd, buf, len, 0, 0, 0, SYSCALL_GET(4)); 
} 

void *mmap(void *addr, long long length, long long prot, long long flags, long long fd, long long offset) { 
    return syscall(addr, length, prot, flags, fd, offset, SYSCALL_GET(197)); 
} 

long long munmap(void *addr, long long length) { 
    return syscall(addr, length, 0, 0, 0, 0, SYSCALL_GET(73)); 
} 

int strlen(char *s) { 
    int len = 0; 
    while (*(s++) != '\0') { 
    len++; 
    } 
    return len; 
} 

int putchar(char c) { 
    return write(STDOUT, &c, 1); 
} 

int main(int argc, char *argv[]) { 
    if (argc <= 1) { 
    return 0; 
    } 

    int *lengths = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); 

    for (int i = 1; i < argc; i++) { 
    lengths[i] = strlen(argv[i]); 
    } 

    for (int i = 1; i < argc; i++) { 
    write(STDOUT, argv[i], lengths[i]); 
    putchar(' '); 
    } 

    putchar('\n'); 

    munmap(lengths, PAGE_SIZE); 
    return 0; 
} 

start.s

.global start 
.global _syscall 

.text 
start: 
popq %rdi 
movq %rsp, %rsi 
andq $0xfffffffffffffff0, %rsp 
call _main 
movq %rax, %rdi 
call _exit 

_syscall: 
movq %rcx, %r10 
movq 8(%rsp), %rax 
pushq %rbx # alignment 
syscall 
popq %rbx 
retq 

あなたが見ることができるように、アプリケーションは基本的にシンプルなechoを反映しています。引数を指定しないでプログラムを実行すると、正常に終了します。したがって、exitコールが動作すると仮定します。しかし、私はそれを引数で実行すると、Segmentation fault: 11でクラッシュします。私が今理解している限り、mmapが呼び出されると、カーネルは奇妙な値を返します。9.私は、9が適切なアドレスではないと思いますが、ドキュメントによれば、syscallに渡された値はすべて正しいので、 。システムコール番号はhereから取得されます。

+0

を試してみてください。 –

答えて

関連する問題