2011-05-09 9 views

답변

9

syscall은 커널에서 서비스를 요청하는 데 사용됩니다. MIPS의 경우, 서비스 번호/코드는 $ v0로 전달되어야하며 인수는 다른 지정된 레지스터 중 일부에서 전달됩니다. 예를 들어 다음과 같이 인쇄 할 수 있습니다.

li $v0, 1 
add $a0, $t0, $zero 
syscall 

이 경우 1은 인쇄 정수의 서비스 코드입니다. 두 번째 명령어는 $ t0에서 $ a0까지 복사를 수행하는데,이 인수는 인수가 저장되는 지정된 레지스터 (이 경우 인쇄 할 정수)입니다. 서비스 목록과 해당 인수는 다음과 같습니다. http://courses.missouristate.edu/KenVollmar/Mars/Help/SyscallHelp.html

5

시스템 호출이 다소 인공적 인 MARS 또는 SPIM과 같은 에뮬레이터 컨텍스트 외부로 나가면 훨씬 더 분명 해집니다. 실제 MIPS 머신에서는 커널을 통해 특정 기능을 호출하는 커널을 제어 할 수 있습니다.

예를 들어, 이것은 리눅스 머신에 대한 MIPS 32 비트 어셈블리의 기본 안녕하세요 세계 프로그램입니다

(I이는이 질문에 대해 많이 중요하지 않는 것이, 설치할에는 mipsel에 있던 95 % 확신)
# CS341L Fall 2008 
# Lab Exercise #1 
# Matthew J. Barrick <[email protected]> 

#include <asm/regdef.h> 
#include <sys/syscall.h> 

.data 
    hello: .asciz "Hello World\n" 
    length: .word 12 
.text 
    .globl main 
    .ent main 
main: 
    li a0, 1 
    la a1, hello 
    lw a2, length 
    li v0, SYS_write 
    syscall 
    move v0, zero 
    jr ra 
    .end main 

이것은 MIPS 어셈블리를 따르는 데 문제가있는 경우 C 코드와 매우 유사합니다.

#include <stdio.h> 

int main(int argc, char** argv) { 
    char* hello = "Hello World\n"; 
    write(STDOUT_FILENO,hello, 12); 
    return 0; 
} 
헤더가 레지스터 상징적 인 이름 (ASM/regdef.h) 시스템 호출 (SYS/syscall.h)에 대한 상징적 인 이름에 끌어 헤더를 제공하기 위해 포함되어 있습니다 그래서 우리는 돈

첫째 주 ' syscalls를 번호로 참조해야합니다. 여기에 시스템 호출을하기위한 규칙은 함수를 호출하고 인수를 # 레지스터에로드 한 다음 $ v0에 원하는 시스템 호출을로드하고 syscall을 호출하는 것과 거의 같습니다. SYS_write는 linux/unix (1은 표준 출력)의 기본 write (2) 기능에 해당합니다.

ssize_t write(int fd, const void *buf, size_t count); 

커널이 파일 핸들 1 (stdout)에 길이 바이트를 사용하는 hello 문자열을 쓰도록 명령합니다. 리눅스에서는 사용할 수있는 모든 syscall에 대해 syscalls (2)를 볼 수 있지만 커널이 제공하는 핵심 기능과 거의 비슷합니다. (g) libc는 C/C++ 프로그램을 위해 랩하거나 빌드합니다.

리눅스 (그리고 대부분의 유닉스 계열의 사람들은 4BSD 라우트로 돌아 간다)는 사실상 똑같은 syscall (2) 기능을 가지고있다.

좀 더 복잡한 작업을 시작하면 편리한 기능을 호출하는 syscall을 래핑하거나 또는 해당 libc 버전을 호출하는 것 (놀라 울 정도로 쉽게 할 수 있지만 다른 토론)이 있습니다.