/* tokenize the 'string' with a deliminator " ",
   returns how many arguments in 'string' */
int get_argument_count(const char * string)
{
  char * new_string = (char *)malloc(sizeof(char)*(strlen(string)+1));
  strlcpy(new_string, string, strlen(string)+1);

  char *token, *save_ptr;
  int i=0;
  for(token=strtok_r(new_string, " ", &save_ptr); token;
      token=strtok_r(NULL, " ", &save_ptr))
  {
    i++;
  }
  free(new_string);
  return i;
}

/* tokenize the 'parse' with a deliminator " ",
   each arguments will be saved into the 'esp'. */
void argument_stack(char ** parse, int count, void ** esp)
{
/* parse = sentence including 'process and arguments'
   count = argc(argument counts) through 'GetArgumentCount' func.
   esp = &if_.esp */

  char * command_line = *parse; // like 'echo x y z'

  char * fn_copy;
  fn_copy = palloc_get_page(PAL_USER);
  if(fn_copy == NULL)
    thread_exit();
  strlcpy(fn_copy, command_line, PGSIZE);

  char * token, * save_ptr;
  int i=0;
  int * variable_index = (int *)malloc(sizeof(int)*count);

  for(token = strtok_r(fn_copy, " ", &save_ptr); token;
      token = strtok_r(NULL, " ", &save_ptr))
  {
    printf("'%s'\n", token);
    variable_index[i++] = token - fn_copy;
  }

  int size = strlen((char*)(*parse));

  *esp -= size + 1;
  int command_position = (int)*esp; // stack pointer position for command line

  for(i=0; i<=size; i++)
  {
    *(char*)(*esp) = fn_copy[i];
    *esp += 1;
  }
  *esp = (int)command_position;

  *esp -= ((int)(*esp)%4<0? (int)(*esp)%4+4 : (int)(*esp)%4);
  *esp -= 4;
  *(int*)(*esp) = 0;

  // argv[1,2,3,...]: arguments
  for(i=count-1; i>=0; i--)
  {
    *esp -= 4;
    *(void**)(*esp) = command_position + variable_index[i];
  }

  // argv[0]: process_name
  *esp -= 4;
  *(char **)(*esp) = (*esp + 4);
  // argc: argument count
  *esp -= 4;
  *(int *)(*esp) = count;
  // return address - fake (0)
  *esp -= 4;
  *(int*)(*esp) = 0;

  free(variable_index);
}


'핀토스' 운영체제의 몇몇 기능들을 구현해나가며 개선하는 것이 목표입니다.


프로젝트 개요는 다음과 같습니다.


1. Command Line Parsing

2. System Call

3. Hierarchical Process Structure

4. File Description

5. Alarm System Call

6. Priority Scheduling and Synchronization

7. Priority Inversion Problem

8. Virtual Memory

9. Memory Mapped File

10. Swapping

11. Buffer Cache

12. Extensible File

13. Subdirectory





| 핀토스 운영체제란?


핀토스 운영체제는 x86 아키텍처에서 운영체제의 기본을 이해하기 위해 고안된 교육용 운영체제입니다. 2004년 스탠포드 대학에서 Ben Pfaff라는 사람에 의해 만들어졌고, 이 운영체제는 커널 스레드, 유저 프로그램을 로딩하고 실행하는 것, 파일 시스템 등 운영체제가 갖춰야 할 기본적인 기능들을 지원하고 있습니다. 핀토스 운영체제는 Bochs나 QEMU 등 x86 시뮬레이터 위에서 사용해야 합니다.


포스트에서는 '리눅스 우분투' 운영체제에서 'Bochs' 시뮬레이터를 통해서 Pintos를 설치하고 정상작동 확인하는 것 까지 다뤄보도록 하겠습니다.




| 핀토스 운영체제 설치하기


1. 가상머신 혹은 호스트 운영체제로 '우분투' 운영체제 등 리눅스 계열 운영체제를 설치한다. 


※ 가상머신 Virtual Box에 리눅스 우분투 설치하기 ► http://thinkpro.tistory.com/40



2. 우분투 위에 Bochs 시뮬레이터를 설치한다.


2-1. 다음 사이트에서 Bochs 다운로드받기

► http://bochs.sourceforge.net



tar.gz 확장자를 받으셔야 합니다.



2-2. 다운 받은 압축 파일을 원하는 폴더로 이동한 후, 다음 명령어로 파일 압축 해제 해줍니다.


$ cd ~ // 홈 디렉토리에 bochs 파일을 압축 해제. 원하는 경로로 설정하세요.

$ tar xvf bochs-2.6.2.tar.gz


2-3. bochs 폴더로 이동합니다. 그리고 컴파일 및 설치 과정을 진행합니다.


$ ./configure --enable-gdb-stub --with-nogui

$ make

$ sudo make install


※ "C compiler cannot create executables" 오류가 난다면

$ sudo apt-get install libc6-dev g++ gcc 


※ "X windows libraries were not found" 오류가 난다면

$ sudo apt-get install xorg-dev


※ 그 외 오류의 경우 gcc 버전이 호환되지 않는 경우가 많습니다.

gcc 버전을 다운그레이드하세요.

$ sudo apt-get install gcc-4.6

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 50




3. Pintos 설치 및 작동 확인하기


여기서 소스 코드를 다운로드 받읍시다.

► http://pintos.software.informer.com/download/


3-1. 소스 코드를 압축 해제합니다.

$ tar xvf pintos.tar.gz


3-2. bashrc 파일에 환경 설정

$ vi ~/.bashrc


파일 내에 마지막에 

export PATH="$PATH:/home/usr/pintos/src/utils"

추가(usr는 자신의 username으로 변경해야 함.)


$ source ~/.bashrc // 이는 환경설정을 등록하는 명령어임.




4. Pintos 가 제대로 작동하는지 확인하기.


$ cd pintos/src/threads

$ make

$ cd build

$ pintos -- run alarm-multiple


오류없이 프로그램이 돌아간다면 성공한것입니다.

+ Recent posts