2012-10-18 20 views
6

Tôi đã đọc về các cuộc gọi hệ thống trong Linux và ở mọi nơi mô tả được đưa ra liên quan đến kiến ​​trúc x86 (ngắt bò và SYSENTER). Nhưng tôi không thể theo dõi các tập tin và quá trình cho một cuộc gọi hệ thống trong kiến ​​trúc ARM. Có ai giúp đuợc không.Gọi hệ thống trong ARM

vài file có liên quan mà tôi đã nhận biết là

\ vòm \ tay \ hạt nhân \ calls.S

\ vòm \ tay \ hạt nhân \ entry-common.S (giải thích cần thiết)

+0

Đó có phải là cách mà không gian người dùng thực hiện một cuộc gọi hệ thống mà bạn đang phân vân hoặc cách nó được xử lý trong không gian hạt nhân? – auselen

+0

@auselen cách xử lý trong không gian hạt nhân. và như xa như không gian người dùng là có liên quan, tôi không nghĩ rằng nó sẽ được cánh tay cụ thể. cảm ơn – shingaridavesh

+0

suy nghĩ về câu trả lời bạn đã chấp nhận bên dưới, tôi tự hỏi bạn đã thấy hạt nhân nào cụ thể? – auselen

Trả lời

10

Trong thế giới ARM, bạn thực hiện software interrupt (cơ chế báo hiệu hạt nhân) theo supervisor call/svc (trước đây gọi là SWI).

lắp ráp ARM (UAL) cú pháp như sau:

SVC{<c>}{<q>} {#}<imm> 

(Trong Linux, bạn cần phải vượt qua # 0)

Bạn nên gian lận từ các dự án khác như bionic/write hoặc uClibc boilerplate.

+0

nhờ liên kết, rõ ràng là các đối số được tải trong sổ đăng ký. Linux cho phép 5 đối số như đã đề cập, do đó, phải có nơi nào đó trong sổ đăng ký mục đích chung trong mã linux (cho cánh tay). Tôi không thể tìm thấy tệp tương ứng trong mã linux. – shingaridavesh

+0

bạn có thể chuyển chúng như trong ví dụ uClibc. – auselen

5

Câu trả lời chung chung hơn những gì bạn đã hỏi.

Trên Linux, man syscall là một khởi đầu tốt để tìm hiểu cách thực hiện cuộc gọi hệ thống trong các kiến ​​trúc khác nhau.

sao chép các phần có liên quan tôi nhận được trên máy tính của tôi:

Architecture calling conventions 
    Every architecture has its own way of invoking and passing arguments to the 
    kernel. The details for various architectures are listed in the two tables 
    below. 

    The first table lists the instruction used to transition to kernel mode, 
    (which might not be the fastest or best way to transition to the kernel, so 
    you might have to refer to the VDSO), the register used to indicate the system 
    call number, and the register used to return the system call result. 

    arch/ABI instruction   syscall # retval Notes 
    ─────────────────────────────────────────────────────────────────────────────────── 
    arm/OABI swi NR    -   a1  NR is syscall # 
    arm/EABI swi 0x0    r7   r0 
    blackfin excpt 0x0   P0   R0 
    i386  int $0x80   eax   eax 
    ia64  break 0x100000  r15   r10/r8 
    parisc  ble 0x100(%sr2, %r0) r20   r28 
    s390  svc 0    r1   r2  NR may be passed directly with 
    s390x  svc 0    r1   r2  "svc NR" if NR is less than 256 
    sparc/32 t 0x10    g1   o0 
    sparc/64 t 0x6d    g1   o0 
    x86_64  syscall    rax   rax 

    The second table shows the registers used to pass the system call arguments. 

    arch/ABI arg1 arg2 arg3 arg4 arg5 arg6 arg7 
    ────────────────────────────────────────────────────────── 
    arm/OABI a1  a2  a3  a4  v1  v2  v3 
    arm/EABI r0  r1  r2  r3  r4  r5  r6 
    blackfin R0  R1  R2  R3  R4  R5  - 
    i386  ebx ecx edx esi edi ebp - 
    ia64  r11 r9  r10 r14 r15 r13 - 
    parisc  r26 r25 r24 r23 r22 r21 - 
    s390  r2  r3  r4  r5  r6  r7  - 
    s390x  r2  r3  r4  r5  r6  r7  - 
    sparc/32 o0  o1  o2  o3  o4  o5  - 
    sparc/64 o0  o1  o2  o3  o4  o5  - 
    x86_64  rdi rsi rdx r10 r8  r9  - 

    Note that these tables don't cover the entire calling convention—some archi‐ 
    tectures may indiscriminately clobber other registers not listed here. 

Vì vậy, nó phụ thuộc vào việc hệ thống sử dụng OABI hoặc EABI.

Vì vậy, trong EABI bạn sử dụng r7 để vượt qua số hệ thống gọi, sử dụng r0-r6 để vượt qua các đối số, sử dụng SWI 0 để thực hiện cuộc gọi hệ thống, mong đợi kết quả trong r0.

Trong OABI mọi thứ đều giống nhau trừ khi bạn sử dụng SWI <number> để thực hiện cuộc gọi hệ thống.

+0

Bất kỳ ý tưởng nào về # sau 'SWI' đại diện cho? Là địa chỉ của bảng dịch vụ? – Talaria

+0

Tôi đã tìm thấy "immed_8 bị bỏ qua bởi bộ vi xử lý. Tuy nhiên, nó hiện diện bằng bit [7: 0] của opcode lệnh. Nó có thể được trình xử lý ngoại lệ lấy ra để xác định dịch vụ nào đang được yêu cầu." [ở đây] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/BABFCEEG.html), một thời gian trở lại nhưng vẫn chưa bao giờ hiểu những gì đã thực sự xảy ra. Ví dụ, tại sao nó muốn biết những gì dịch vụ đã được yêu cầu? – Talaria