2012-10-18 9 views
6

Przeczytałem o wywołaniach systemowych w systemie Linux i wszędzie podano opis architektury x86 (przerwanie ox80 i SYSENTRUM). Ale nie jestem w stanie wyśledzić plików i przetworzyć wywołania systemowego w architekturze ARM. Czy ktoś może ci pomóc.Wywołanie systemowe w ARM

Mało istotne pliki, które poznałem są

\ \ arch ramię \ kernel \ calls.S

\ arch \ ramię \ kernel \ entry-common.S (wyjaśnienie potrzebne)

+0

Czy to, w jaki sposób przestrzeń użytkownika wywołuje systemowe wywołanie, zastanawiasz się i jak jest obsługiwane w przestrzeni jądra? – auselen

+0

@auselen jak to jest obsługiwane w przestrzeni jądra. i jeśli chodzi o przestrzeń użytkownika, nie sądzę, że będzie to specyficzne dla ramienia. dzięki – shingaridavesh

+0

myśląc o odpowiedzi, którą zaakceptowałeś poniżej, zastanawiam się, co widziałeś w tym konkretnym jądrze? – auselen

Odpowiedz

10

W świecie ARM wykonujesz software interrupt (mechanizm sygnalizowania jądra) przez supervisor call/svc (poprzednio nazywany SWI).

montaż ARM składnia (UAL) wygląda następująco:

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

(W Linuksie trzeba zdać # 0)

należy oszukiwać innych projektów, takich jak bionic/write lub uClibc boilerplate.

+0

dzięki za link, jasne jest, że argumenty są ładowane do rejestrów. Linux pozwala na 5 argumentów, jak wspomniano, więc musi być ładowanie gdzieś w rejestrach ogólnego przeznaczenia w kodzie linux (na ramię). Nie mogę znaleźć odpowiedniego pliku w kodzie linuxowym. – shingaridavesh

+0

możesz przekazać je tak, jak w przykładzie uClibc. – auselen

5

Bardziej ogólna odpowiedź niż to, o co prosiłeś.

W systemie Linux man syscall to dobry początek, aby dowiedzieć się, jak wykonać wywołanie systemowe w różnych architekturach.

skopiował odpowiedni rozdział I dostać się na moim komputerze:

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. 

Więc to zależy od tego, czy system korzysta OABI lub EABI.

Więc w EABI użyć r7 przekazać liczbę wywołań systemowych, korzystanie r0-r6 przekazać argumentów korzystanie SWI 0 aby wywołanie systemowe, oczekiwać wynik w r0.

W OABI wszystko jest takie samo, z wyjątkiem, gdy używasz SWI <number> do wywołania systemowego.

+0

Jakieś pojęcie, co stanowi # po "SWI"? Czy jest adres tabeli usług? – Talaria

+0

Znalazłem "immed_8 jest ignorowany przez procesor.Jednakże jest on obecny w bitach [7: 0] kodu instrukcji instrukcji.Można go pobrać przez procedurę obsługi wyjątku w celu ustalenia, która usługa jest żądana." [tutaj] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/BABFCEEG.html), jakiś czas temu, ale wciąż nie rozumiałem, co się naprawdę wydarzyło. Na przykład, dlaczego chciałby wiedzieć, o jaką usługę prosiliśmy? – Talaria

Powiązane problemy