목차
1. Wrapper Routine
example
macro들
test program
wrapper routine
sample.s
2. System call handler
macro들
system call handler 수행과정
example
macro들
test program
wrapper routine
sample.s
2. System call handler
macro들
system call handler 수행과정
본문내용
1. Wrapper Routines
example : write() system call _syscall3()을 이용.
argument가 3개이므로..
wapper routine에 필요한 macro들(/include/asm-i386/unistd.h)
#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
type name(type1 arg1,type2 arg2,type3 arg3) \
{ \
long __res; \
__asm__ volatile (“int $0x80” \
: “=a” (__res) \
: “0” (__NR_##name),”b” ((long)(arg1)),”c” ((long)(arg2)), \
“d” ((long)(arg3))); \
__syscall_return(type,__res); \
}
#define __syscall_return(type, res) \
do { \
if ((unsigned long)(res) >= (unsigned long)(-125)) { \
errno = -(res); \
res = -1; \
} \
return (type) (res); \
} while (0)
#define __NR_write 4
test program : sample.c
compile할 때 결과가 assembly code로 나오게
(gcc –S sample.c)
#include
int main(){
_syscall3(int, write , int, fd, const char*, buf, int, count)
}
wrapper routine :
_syscall3(int, write, int, fd, const char*, buf, unsigned int, count)
int write(int fd, const char *buf, unsigned int count)
{
long __res;
asm(“int $0x80”
: “=a” (__res) // __res가 eax가 되고, 4가 된다.
: “0” (__NR_write), “b” ((long)fd),
“c” ((long)buf), “d” ((long)count);
if((unsigned long)__res >= (unsigned long)-125) {
errno = -__res;
__res = -1;
}
return (int) __res;
}
assem code로 변환.
현재 user mode stack에 함수 리턴주소와 인자값이 들어가 있다.
write :
pushl %ebx ; ebx를 보호하기 위해 stack에 저장
movl 8(%esp), %ebx ; stack의 8번지의 첫번째 인자를 ebx에 저장
movl 12(%esp), %ecx ; stack의 12번지의 두번째 인자를 ecx에 저장
movl 16(%esp), %edx ; stack의 16번지의 세번째 인자를 edx에 저장
movl $4, %eax ; eax에 __NR_writ(4)를 저장
int $0x80 ; system call을 invoke
cmpl $-126, %eax ; eax(4)와 –125를 비교(error인지 check)
jbe .L1 ; 작으면 즉, error가 없으면 return으로 jump
negl %eax ; 크거나 같으면 eax의 값을 complement
movl %eax, errno ; eax를 errno에 저장
movl $-1, %eax ; eax에 –1을 저장
L1.: popl %ebx ; stack에 있는 ebx값을 다시 가져온다.
ret ; return to calling program
return시 정상이면 4가 return되고, error이면 –1이 return된다.
example : write() system call _syscall3()을 이용.
argument가 3개이므로..
wapper routine에 필요한 macro들(/include/asm-i386/unistd.h)
#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
type name(type1 arg1,type2 arg2,type3 arg3) \
{ \
long __res; \
__asm__ volatile (“int $0x80” \
: “=a” (__res) \
: “0” (__NR_##name),”b” ((long)(arg1)),”c” ((long)(arg2)), \
“d” ((long)(arg3))); \
__syscall_return(type,__res); \
}
#define __syscall_return(type, res) \
do { \
if ((unsigned long)(res) >= (unsigned long)(-125)) { \
errno = -(res); \
res = -1; \
} \
return (type) (res); \
} while (0)
#define __NR_write 4
test program : sample.c
compile할 때 결과가 assembly code로 나오게
(gcc –S sample.c)
#include
int main(){
_syscall3(int, write , int, fd, const char*, buf, int, count)
}
wrapper routine :
_syscall3(int, write, int, fd, const char*, buf, unsigned int, count)
int write(int fd, const char *buf, unsigned int count)
{
long __res;
asm(“int $0x80”
: “=a” (__res) // __res가 eax가 되고, 4가 된다.
: “0” (__NR_write), “b” ((long)fd),
“c” ((long)buf), “d” ((long)count);
if((unsigned long)__res >= (unsigned long)-125) {
errno = -__res;
__res = -1;
}
return (int) __res;
}
assem code로 변환.
현재 user mode stack에 함수 리턴주소와 인자값이 들어가 있다.
write :
pushl %ebx ; ebx를 보호하기 위해 stack에 저장
movl 8(%esp), %ebx ; stack의 8번지의 첫번째 인자를 ebx에 저장
movl 12(%esp), %ecx ; stack의 12번지의 두번째 인자를 ecx에 저장
movl 16(%esp), %edx ; stack의 16번지의 세번째 인자를 edx에 저장
movl $4, %eax ; eax에 __NR_writ(4)를 저장
int $0x80 ; system call을 invoke
cmpl $-126, %eax ; eax(4)와 –125를 비교(error인지 check)
jbe .L1 ; 작으면 즉, error가 없으면 return으로 jump
negl %eax ; 크거나 같으면 eax의 값을 complement
movl %eax, errno ; eax를 errno에 저장
movl $-1, %eax ; eax에 –1을 저장
L1.: popl %ebx ; stack에 있는 ebx값을 다시 가져온다.
ret ; return to calling program
return시 정상이면 4가 return되고, error이면 –1이 return된다.
키워드
추천자료
[경영정보시스템] 기업의 경영정보시스템의 시대별 변천사
HACCP 시스템과 ISO22000 시스템과의 비교분석
[IT와경영정보시스템]컴퓨터 시스템의 하드웨어 직렬처리 및 병렬처리방식 분석과 소프트웨어...
실시간 시스템 (무인 잠수정 UUV, 항공 전자 시스템) 핵심 기술 레포트
[농업정보시스템][해외농업개발사업][농업재해대책][농업정책평가][농업협동조합경제사업][농...
경영정보시스템에 대한 종합적인 분석 및 사례 : 품질 경영, 지식 경영 및 정보시스템의 연관...
[IT와경영정보시스템공통] 정보시스템에 BPR(Business Peocess Reengineering)을 적용하는 방...
[IT와경영정보시스템 공통] 정보시스템에 BPR(Business Peocess Reengineering)을 적용하는 ...
[IT와경영정보시스템] 정보시스템에 BPR(Business Peocess Reengineering)을 적용하는 방식 ...
대한통운의 자동통합배차시스템,CJ GLS 통합배차시스템,첨단물류기술과 물류공동화,3PL(3자 ...