MIPS에서 syscall 명령어의 역할은 무엇입니까?MIPS 아키텍처 syscall 명령어
답변
syscall은 커널에서 서비스를 요청하는 데 사용됩니다. MIPS의 경우, 서비스 번호/코드는 $ v0로 전달되어야하며 인수는 다른 지정된 레지스터 중 일부에서 전달됩니다. 예를 들어 다음과 같이 인쇄 할 수 있습니다.
li $v0, 1
add $a0, $t0, $zero
syscall
이 경우 1은 인쇄 정수의 서비스 코드입니다. 두 번째 명령어는 $ t0에서 $ a0까지 복사를 수행하는데,이 인수는 인수가 저장되는 지정된 레지스터 (이 경우 인쇄 할 정수)입니다. 서비스 목록과 해당 인수는 다음과 같습니다. http://courses.missouristate.edu/KenVollmar/Mars/Help/SyscallHelp.html
시스템 호출이 다소 인공적 인 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 버전을 호출하는 것 (놀라 울 정도로 쉽게 할 수 있지만 다른 토론)이 있습니다.