본문 바로가기
KraftonJungle2기/회고

[WIL] Pintos 2주차 - Userprog (주간공유)

by SooooooooS 2023. 6. 12.
728x90

1. 일정 계획

06.01

  • 대략적인 일정 조율
  • 개인 이론 공부

06.02

  • gitbook 및 강의 학습

06.03 ~ 06.05

  • passing argument 구현

06.06 ~ 06.11

  • system call 구현

2. 주요 학습

user mode vs kernel mode

1. user mode

    • User 모드에서는 제한된 시스템 자원에만 접근 가능
    • 파일 시스템, 네트워크 연결, 입출력 장치등과 같은 일반적인 작업을 수행할 수 있지만, 직접적으로 시스템 리소스에 접근하거나 시스템 제어 명령을 실행할 수 없다. 

2. kernel mode

  1. 유저 모드에서 요청 → syscall_entry를 통해 어셈블리어로 진입 → rsp = 커널 스택 포인터
  2. syscall_handler : 시스템 호출의 요구에 따라 필요한 작업을 수행, (ex) create요청이 들어온 상황
  3. check_address함수 :  주어진 주소가 유저 영역의 주소인지 확인
  4. filesys_create(file, initial_size)를 호출하여 파일 시스템에 새로운 파일을 생성
  5. 생성된 파일의 FD 값을 리턴하고 do_iret을 통해 유저 모드로 복귀하게 됩니다

3. 회고

Stack에 인자 저장하는 방식에 관한 문제

1. 오류

작성한 오류 코드

// command 오른쪽 단어부터 스택에 삽입
for (int i = argc - 1; i >= 0; i--) {
  int arg_len = strlen(argv[i]);
  (*rsp) -= arg_len;
  memcpy(rsp, argv[i], arg_len);
  argv[i] = *(char **)rsp; // 인자가 스택에 저장되어있는 주소를 배열에 저장
}

2. 정답

작성한 정답 코드

// command 오른쪽 단어부터 스택에 삽입
for (int i = argc - 1; i >= 0; i--) {
  //입력 받은 인자 1개 또한 스택에 넣어주는 것이므로 오른쪽 글자부터 넣어준다.
  for (int j = strlen(argv[i]); j >= 0; j--) {
    (*rsp)--; // 스택 주소 감소
    **(char **)rsp = argv[i][j]; // 주소에 문자 저장
  }
  argv[i] = *(char **)rsp; // 인자가 스택에 저장되어있는 주소를 배열에 저장
}

 🗒️ 이번 주차 후기

👩🏻‍💻 수빈
  지난주보다 차근차근 진행하면서 혼란은 덜했지만 잔실수가 많아서 시간을 많이 소비한게 아쉬웠습니다. 그래도 같이 하니까 버틸 수 있었던 것 같습니다:)
🧑🏻‍💻 재균 
  팀원들과 협업을 통해 하나의 코드를 만드는 경험이 처음이었고 좋은 경험이었습니다 :)
🧑🏻‍💻 진우
  같이 하는 것에 조금 익숙해져서 훨씬 시간을 효율적으로 사용하였지만 아직은 조금 뭔가 아주 조금은 부족한 그런느낌? XD

 

728x90