2012-05-14 17 views
7

Tôi muốn kiểm tra mã để thực hiện các cuộc gọi hệ thống trong glibc. Tôi tìm thấy một cái gì đó như thế này.Syscall có phải là hướng dẫn trên x86_64 không?

ENTRY (syscall) 
    movq %rdi, %rax  /* Syscall number -> rax. */ 
    movq %rsi, %rdi  /* shift arg1 - arg5. */ 
    movq %rdx, %rsi 
    movq %rcx, %rdx 
    movq %r8, %r10 
    movq %r9, %r8 
    movq 8(%rsp),%r9 /* arg6 is on the stack. */ 
    syscall   /* Do the system call. */ 
    cmpq $-4095, %rax /* Check %rax for error. */ 
    jae SYSCALL_ERROR_LABEL /* Jump to error handler if error. */ 
L(pseudo_end): 
    ret   /* Return to caller. */ 

Bây giờ câu hỏi của tôi là nếu syscall (trước lệnh cmpq) là hướng dẫn? Thứ hai, nếu nó là một chỉ dẫn, ý nghĩa của ENTRY (syscall) là gì? Cùng tên cho ENTRY (Tôi không biết ENTRY là gì) và chỉ dẫn? Thứ hai, L là gì (pseudo_end)?

+0

Đó là. Nó giống như 'int 0x80' trong x86. – Dave

+0

Lưu ý rằng mã chuyên dùng thông thường được sử dụng cho mỗi cuộc gọi hệ thống, để đặt '% rax' từ hằng số (lưu một thanh ghi) và bỏ qua thiết lập các đối số không được sử dụng. – o11c

Trả lời

3

Có, syscall là hướng dẫn trên x86-64. Có một hướng dẫn tương tự sysenter trên i686.

ENTRY(syscall) sẽ là macro. Có lẽ mở rộng đến định nghĩa biểu tượng, bạn phải grep cho điều đó.

7

syscall là hướng dẫn trong x86-64 và được sử dụng như một phần của ABI for making system calls. (ABI 32 bit sử dụng int 80h hoặc sysenter và cũng có sẵn ở chế độ 64 bit, nhưng sử dụng ABI 32 bit từ mã 64 bit là một ý tưởng tồi, đặc biệt là đối với các cuộc gọi với đối số con trỏ.)

Nhưng cũng có một C library function named syscall(2), một trình bao bọc chung cho ABI gọi hệ thống. Mã của bạn cho thấy kết xuất của hàm đó, bao gồm giải mã giá trị trả về của nó thành errno. ENTRY(syscall) chỉ có nghĩa là hàm bắt đầu ở đó.

L()ENTRY() là các macro CPP.

L(pseudo_end) chỉ là một Nhãn có thể là mục tiêu nhảy. Có lẽ mã ở số SYSCALL_ERROR_LABEL nhảy trở lại đó, mặc dù nó sẽ hiệu quả hơn đối với khối mã đó chỉ với ret, vì vậy có thể đó là một di tích từ một phiên bản cũ hoặc được sử dụng cho một thứ khác.

+1

Nếu đây là một hướng dẫn thực tế, opcode của nó là gì? – SasQ

+1

Đó là 0x0F 0x05 (chỉ cần xem hướng dẫn phát triển phần mềm của Intel). – flolo

Các vấn đề liên quan