3/37(시스템콜)
프로세스부터 시작해서 시스템콜까지.
운영체제(OSTEP 4,5 복습)
작업관리자 열면 →프로세스가 다 뜬다.
컴퓨터가 한번에 하나만 실행하지만 이렇게 멀티태스킹이 된다. WHY?
CORE가 1개여도 TIME DIVISION을 사용해서 멀티태스킹을 구현한다.(time sharing)
virtualizing(pc가 1개여도 환상을 보여준다)
멀티태스킹을 구현하기 위하여 mechanisms, policies를 고려해야함.
mechanisms : 어떻게 멀티태스킹을 구현?
policies : ready, run 상태 알고리즘을 어떻게?
프로세스 : 실행되고있는 프로그램
time sharing : core가 하나여도 프로세스를 여러개 사용할 수 있는것.

프로그램은 1개인데 프로세스는 여러개 만들 수 있는 one to many이다.
운영체제 : 프로세스 관리에 대한 API를 제공한다.
→프로세스 생성 API
실행이란 : 디스크에 있는 코드를 메모리에 올려서 실행하는것.
1)디스크에 있는 것을 메모리에 올린다.
2)동적으로 할당되는 STACK과 HEAP은 프로세스를 만들기 전에 준비한다.
프로그램 실행할 때 일부분만 사용하는데,,, 다른 부분은 로드할 필요가 없지 않나?
→ lazily 방식. 일단 마킹만 해놓고 필요할때 그때 접근해서 가져온다.
- std를 시작한다.
- pc 레지스터의 주소를 main함수 위치로 setting한다.

메모리 공간
코드는 text 영역
함수 실행시 stack영역 등등.. 자세한건 시험 안나오지만 상식임.
TCB : READY, BLOCKED같은 상태를 저장하는 공간도 필요하다. 각 프로세스별 상태를 나타내는 메모리를 PCB라고 한다.(process control block)
CH 6) Direct Execution
운영체제가 안돌아가고 user program만 돌아가고 있다고 가정하자.
그러면 control 부분을 잃게 된다.
운영체제가 허가되지 않는 작업을 어떻게 막는지.
1)무한루프를 돌면서 자원 사용 →운영체제는 권리가 없는 상태에서 권리 가져오기
2)허용되지 않는 메모리공간 접근

7,8단계에서는 운영체제가 제어 권한이 없다.
성능관점에서는 물론 program을 cpu에 그냥 넣는게 좋겠지만, 제어를 해야겠지?
→solution!!
하드웨어와 운영체제의 협업이 필요하다.
user mode, kernal mode라고 2가지 모드를 만들었다.
user mode는 제한된 작업
kernal mode는 모든 작업을 수행할 수 있다.
이때, user program이 파일을 access 하거나, memory를 더 할당하거나 하려면 직접할 수 없고, systemcall을 통해서 응답을 받고 진행해야 한다.

이제 여기서 8단계 사이에서 user모드가 os에 권한을 계속 물어보는것!
실습에서 sv6 실습을 통해 해볼것이다.
하드웨어에서 하나의 지원을 더 해줘야 권한을 가져올 수 있는데
- trap —>user모드에서 커널모드로 이동하는것
- return-from-trap

user모드에서 kernal모드로 전환을 할때 context switching이 발생하기 때문에 systemcall을 많이 부르면 느려진다.
trap명령어를 실행했을 때 실행되는 코드를 특정 코드로 제한해야된다.
table에 세팅하고 booting 할때 초기화해야 한다.
—>결론적으로 user는 정해진 call만 사용 가능.
trap이 여러개 있는데 그중에 하나가 systemcall로 사용되는것.(timer도 trap이다)
systemcall handler에서 또다른 테이블을 불러오고, 그 다른 테이블에서 디테일한 값을 본다.
ex) printf를 사용한다.
printf는 stdio이기 때문에 syscall을 하고, 커널모드로 들어가서 write 시스템콜을 실행하는것.

os의 부팅 과정 → trap table을 세팅해야한다. 실행될 주소를 하드웨어에 등록을 해놓는 것이다.
os의 실행 과정 → user program을 실행하다가 함수가 호출되면 trap명령이 실행되고 int 0x80명령을 하면 trap table로 간 후, table에서 0x80번지의 주소를 실행하게 되고 내부에서 시슽템콜 번호를 찾아서 실행한다.

printf의 시스템 호출 관점에서의 실행 과정 요약
- 유저 모드에서
printf호출printf→vfprintf→_IO_write를 거쳐syscall(SYS_write)실행
write시스템 호출 발생mov eax, 4(SYS_write 호출)int 0x80(x86) 또는syscall(x86-64) 실행
- IDT (Interrupt Descriptor Table) 처리
- CPU가 IDT에서 시스템 호출 핸들러 (
system_call_entry)로 점프
- CPU가 IDT에서 시스템 호출 핸들러 (
- System Call Table 조회 및 실행
sys_write(시스템 호출 번호 1) 실행vfs_write()를 통해 출력 장치 처리
- TTY 드라이버를 통한 출력
tty_write()→uart_write()→ 하드웨어(UART, VGA 등)로 전송
- 유저 모드로 복귀
- 커널이 시스템 호출 반환값 저장 후
retq실행 printf종료 및 프로그램 실행 계속됨
- 커널이 시스템 호출 반환값 저장 후
운영체제의 자원얻기
만약에 systemcall을 사용하지 않고 while문만 돌아서 자원을 차지하고있을때
→협조 없이 하는 방법 : timmer interrupt를 사용해서 주기적으로 실행되는 애를 감시하는것. user program이 그냥 실행하고 있어도 timmer interrupt가 터질때마다 systemcall이 발생하니깐 커널모드로 진입한다. 따라서 협조 없이도 가능하다.
→협조 받아서 하는 방법 : yield system call을 부른 뒤 협조해주길 기도하는것

'SW > System Programming' 카테고리의 다른 글
| ls 명령어 (0) | 2025.03.30 |
|---|---|
| who command (0) | 2025.03.30 |
| Linux 커널 (0) | 2025.03.30 |