본문 바로가기

SW Jungle/Week 09

project 02 User program(background)

- 노트 정리

process_excute()호출 -> thread_creat()으로 할당 해줌

지금은 유저 프로세스가 실행되고 나면 kernel이 꺼지는데, 이번 프로젝트의 목표는 유저 프로세스가 실행되면 유저프로세스가 끝날 때까지 커널이 기다리게끔 하는 것

echo x y z 라는 함수가 들어 왔을 때, echo라는 프로그램과 x, y, z 라는 인자로 구분해야함

그러기 위해서 argument를 파싱해서 유저 스택에 넣어야함

 

관련 Q1. process.c의 do_iret 함수를 통해서 intr_fram if_에 있던 데이터들이 레지스터에 저장되고  if_ -> rip인 e_entry가 레지스터의  rsp에 저장되는것으로 이해, 이후 실행되는 iretq함수를 실행되면 레지스터의 rsp에 저장된 주소로 이동, load 함수에서 if -> rip를 e_entry로 지정이 맞는 건가요?

A1. if->rip가 rsp에 저장되어 그곳으로 점프하는 것은 아닙니다. do_iret함수 내에서는 저장된 값을 레지스터에 집어넣고, 현재의 rsp  값을 적절하게 변환시킵니다. 그 후 iret q 명령어를 실행시키면 하드웨어가 자동으로 if->rip, if->cs, ...... if->__pad8 까지의 데이터를 적절한 레지스터에 집어넣은 후 rip 레지스터에 담긴 위치로 점프하는 역활입니다.

e_entry는 elf 형식의 바이너리 파일에서 응용프로그램이 처음 시작되어야 하는 명령어의 위치가 담겨있습니다. (entry point라고 불리는) entry point에서 명령어가 실행되어서 간단한 셋업을 한 후 흔히 하는 main() 함수가 자동적으로 호출되어서 응용 프로그램이 본격적으로 시작합니다. 

'SW Jungle > Week 09' 카테고리의 다른 글

project 02 User program(fork)  (0) 2023.05.09
project 02 User program(System_call)  (0) 2023.05.09
project 02 User program(Argument passing)  (0) 2023.05.09