Naïvemdriver를 실솝킨 결과이다. mm-naive.c에 대해?A는 코드를 따 성하 않았음으 , 이 mm-naive에?A 사용된 분?B해 볼 예정이다. 구현 방법우선 정의부분부터 살펴뱍면, ALIGNMENT 8이라고 정의되어 있는 모습을 볼 수 있고, 그 아래에 ALIGN(size)라는 것이 정의되어 있는 모습을 볼 수 있다. 이것은 8의 배수 단위 할당을 하기 위해?A 들어온 size에 게 8의 배수 사이를 다솝 정의해주는 부분이라고 해?B다 . 예를 들어 할당하고 싶은 size 4라고 . 그렇다면 ALIGNMENT 8이므 , 4+7이 되고, 값은11이 되는데, 이것을 0x7의 뱍수와 비 연산 and 를 해주게 된다. 기?A 0x7을 이진수 나타내면 0000 0111 이 되는데, 이것을 뱍수 만들어준다면 1111 1000 이 되고, 11인 0000 1011 과 AND를 한다면 결과으 0000 1000 이 되는 모습을 볼 수 있는데, 결과값은 십진수 8을 알 수 있다.
Phase 1[결과 화면 캡처]Phase 1[진행 과정 설명]우선 처음에, phase_1의 코드를 disas 명령어로 접근해보았다. 위의 화면처럼 긴 어셈블리어 코드들이 나왔다. 우선 제일 먼저 눈에 띄는 것은 (strings_not_equal)이라는 함수였다. 함 수 명을 보고 이 함수는 input으로 들어온 문자열이 어떠한 특정 문자열과 같은지 다른지 체크하는 문자열이라는 것을 짐작하였다. 그래서 r을 입력하고, ‘hello’라는 문자열을 입력한 뒤 다시 disas로 phase_1을 실행해보았다. 그리고 이 함수가 정확히 와 같은 코드가 나왔다. 어떤 역할을 하는 함 수인지를 보기 위해서 (strings_not_equal)에 breakPoint를 걸고 함수를 열어보았더니 아래와 같은 코드가 나왔다.꽤나 긴 코드가 나왔지만 결국 포인트로 잡아내었던 부분은 함수에 들어가기 전에 위에서 r12 레지스터를 push해주는 것을 볼 수 있다. 이것을 eax와 비교하는 부분이 있다. 여기서 eax값과 r12d의 값이 궁금했다. 그래서 x/s를 이용해 이 레지스터 안에 있는 값을 확인했다.
1 bitOr(int x, int y)int OR = ~((~x) & (~y));return OR;~와 &연산자만 이용하여 OR 기능을 구현하였다. 이 문제는 예를 들어서 생각해보았다. x의 값을 1(0001)로 두고 y의 값을 2(0010)로 두었을 경우 원래대로라면 x|y의 결과는 3(0011)임을 알 수 있다. 이것과 같은 결과를 얻기 위해서는 x의 비트를 뒤집고, y의 비트를 뒤집어서 AND 연산을 한 결과 값을 NOT으로 뒤집는다면 동일한 결과가 나오는 것을 볼 수 있다.2 tmax(void)return ~(1 << 31);2의 보수 중 가장 큰 값은, 부호 비트가 0 즉 양수이고, 나머지 자릿수가 1로 채워진 수를 말하는 것이다. 그러므로, 32비트를 기준으로 1(0000...0001)을 왼쪽으로 31번 시프트 연산을 진행하면 (1000...0000)이 되는데, 맨 앞쪽 MSB의 값은 부호비트이므로 이를 바꿔주기 위해 NOT 연산을 진행하면 값은 0111...1111이 되어 2의 보수 중 가장 큰 값을 리턴하게 된다.
T race 번호 (07)각 trace 별 플로우 차트T race 해결 방법 설명Trace 07 번은 bulit_in 명령어인 job 을 보여주게 하는 기능을 구현하는 것이었다. 이전에는 프로세서들을 이용하여 이것을 pid 에 매핑시켜주거나 background 로 실행을 시키게 하는 등의 동작을 구현하였다면 이번에는 이것들이 제대로 잘 실행이 잘 되고 있는지 그것들의 목록을 출력하는 기능을 구현해야 했다. 그렇다면 어떠한 명령어를 입력했을 때 프로세서들의 목록을 볼 수 있게 만들기 위해서는 builtin_cmd 함수에 명령어를 처리해야겠다는 생각이 들었다. 들어온 입력이 ‘jobs'일 때를 처리해야하는 것을 함수를 이용해서 처리하면 되겠다는 생각을 했는데 이 때 list_jobs 라는 함수가 눈에 띄여 이것을 분석해보았다.<중 략>Job 의 pid 가 0 이 아닐 때 즉 제대로 된 pid 값이 할당되어 있을 때, 조건문 안에 있는 동작을 실행하게 되는데 write 함수를 이용해 문자열을 쓰는 동작이 정의되어 있었다. 애매한 문법들이 있는 것 같아서 코드를 분석하며 하나씩 다 알아낸 결과 아래와 같이 정리할 수 있었다.⚫ Memset() : 어떤 메모리의 시작점부터 연속된 범위를 어떤 값으로 바이트 단위로 모두 지정할 때 사용하는 함수이다. 채우고자 하는 메모리의 시작 포인터 (시작 주소), 메모리에 채우고자 하는 값 채우고자 하는 바이트의 수 순서대로 인자를 채운다. 인자는 아래의 코드처럼 세 개를 받는 것을 알 수 있다.⚫ Sprintf () : 배열 서식 값 의 형식으로 사용하는 함수로 화면에 출력하지 않고 문자열을 만들어서 따로 저장하는 함수이다.⚫ Write() : 참조하는 파일의 현재 위치에 문자열을 기록 저장할 문자열 문자열의 크기 형식으로 사용하는 함수이다.