본문 바로가기
코스웨어/12년 내장형하드웨어

2010.10.10 오전[리눅스 시스템호출, 예제소스]

by 알 수 없는 사용자 2012. 10. 10.
728x90
반응형

리눅스 시스템 호출

system.map -> 메모리 상의 함수위치를 가지고 있음.

- 함수의 심볼테이블을 주소로 출력함.

리눅스 시스템 호출에서 진행되는 과정은

- 사용자 프로세스에서 시스템 호출 사용 (예 : open())

- C언어 라이브러리(libc)에서 시스템 호출 준비

시스템 호출에 필요한 인자를 register stack에 넣음

시스템 호출 번호 저장

인터럽트 발생(소프트웨어 인터럽트이므로 실제로는 트랩)

- system_call()

= IDT에 의해 인터럽트 시작

=sys_call_table 사용

= 인터럽트 서비스 루틴 실행

- 결과값 사용자에게 반환

IDT = 인터럽트 백터

read, write, open함수는 reg로 호출되고, 번호를 구분하기 위해 fork()라는 함수를 쓴다.

fork()함수는 한번 호출 할때마다, 자기 자신을 분리하며 2개로 나눠서 실행하고, 만약 열번을 호출한다면 10번 분리하여 실행하게 되는것이다.

user task(앱) 안에서 fork() 함수가 main함수 안에 있는데 이것을 system_call함수의 시작이고, fork()함수가 호출되면, libc.c로 이동하여 fork()함수안에있는 내용을 실행한다.

fork()

{

movl2,%eax -> name방식 앞에서 뒤로 넣는다. 레지스터앞에는 반드시 %붙여야됨

int 80h -> 0x80을 발생시켜 시스템 호출 시작!

}

EAX 레지스터 값을 참고로 sys_call_table에서 함수를 호출하게 되고

sys_call_table함수로 인해 번호가 매겨지게되고, sys_fork = 2번, sys_read = 3번식으로 번호를 매겨 구분함.

-----------------------

"Hello, Kernel"을 출력할 간단한 C,어셈블리로 각각 작성 컴파일 해보겠다.

728x90