[yummyHitOS] 20 day (2017.08.05)

6 분 소요

짜라란~!! 오랜만에 돌아온 야미예여!! 여러분 추석 잘 지내셨나여?! 이번 연휴는 너무너무 길어서 시간이 느리게 가는 것 같았어여!!래서 약 7일간 제가 정말 싫어하는 웹을 해보았지여!! 처음 접해보는 Angular 4 + Firebase + SCSS + AngularFire2 등을 이용해 웹개발을 했는데, 드디어 완벽한 로그인과 회원가입을 맹글었어여!! 완전이뿜.. 웹사이트가 완벽히 구현되면 알려드릴게여!! 소스는 깃헙에 열씸히 커밋하고있답니당~ 데헷-☆

정말정말이지 웹은 하기 싫었는데.. 웹개발하다보니 자꾸 오기생기고 시간잘가고 재미쪼~~끔있던데여? 웨뱁웨뱁~

참 새로운 사실이었는데 제가 웹에 대한 지식이 정말 하~나도 없는 상태에서 Angular가 하태하태라고 들어서 해보았거든여!? 그런데 AngularJS와 Angular는 다르다고 하더라구여!! AngularJS는 말그대로 JS, 즉 Java Script(.js 파일)로 이루어진 것이고 Angular는 Type Script(.ts 파일)로 이루어 졌더라구여!! 자바스크립트를 1도 모르는 저는 타입스크립트가 그렇게 편할 줄 몰라써옇ㅎㅎㅎ여러분 타입스크립트하세여!! 웹도 모르는게 까분다구여? 죄송함댜...



참!! 제가 저번 포스팅에서 말씀 안드린 것이 있었네여!! 21장의 마지막을 장식하는 우리의 matrix!! 저 이거보고 반했자나여ㅜㅠ 그리고 주변사람들에게 욕을 먹었지여 헿헤헤헿지저분하다고... 젠쟝...



넹? 이거 다음 포스팅에서 결과물로 내야하는거 아니냐구여?! 아녜여 이건 더럽...♥ 더럽다구여? 넵 죄송함다.. 쭈굴...

아직도 쓰레드 설명이 부족한 것 같아여ㅜㅠ CreateThread() 함수보다 _beginthreadex() 함수가 좀 더 효율적이라고 하던데... 전 리눅스충이라 MSDN의 함수는 가볍게 넘어가버리겠어요!! 꺄를~

오늘따라 조증인 야미네영!! 이제 공부를 시작해볼까여!?


FPU

이번 챕터는 22장... 실수 연산 기능 추가인데 여기는 설명보다 저의 멘붕상태가 기억나는 챕터예여... 9일차10일차 포스팅 때 General Protection Fault가 나는 부분에 대해 미쳐가고있던 저였기에... 바로 이 챕터! 에서 멘붕! 이 와버렸지여 ㅜㅠ늉늉


이제 3.14159265358979.. 와 같은 실수를 사용할 수 있도록 해주는 연산 기능을 추가한다고 해요!! 이거.. 필요한가요? 이 멍츙한 야미는 잘 모르겠네염.. 땀삐질;



오랜만에 나타난 레지스터네여!! 예전에 열씸히 GDT, LDT 테이블과 함께 할 때 레지스터 열씸히 공부했었는데.. 다 기억나시져? 막 GS, CS, SS 등 6개의 세그먼트 레지스터 값과... 왜 기억을 하고있는지와... 잊고싶어짐과... 헿헤 혹시라도 기억 안나시는 분께서는 제 포스팅에서 15일차10일차, 3일차를 참고하시면 됩니당!! 참 많이도 등장했었네영!!


좌측이 정수를 저장하는 레지스터라고해요. Not Extended 인 것으로 보아 16bit 환경의 레지스터네요! 우측이 오늘 우리가 알아볼 실수 연산 기능에 대한 FPU 레지스터예요!


FPU(Floating Point Unit)는 두 가지를 의미해요. 첫 번째는 Floating Point Scheduler(부동 소수점 스케줄러)이고 두 번째는 Floating Point Execution Units(부동 소수점 실행 유닛)이예요.

딱! 봐도 우리는 두 번째를 알아볼 것 같지 않나여?! 그래도 한 번 두 가지 다 알아보아여!


첫 번째인 Floating Point Scheduler는 3번의 매크로 연산을 가능케 해요. 매크로는 x87 Floating Point, 3DNow!, MMX, SSE1/2/3/4a 명령어 세트에서 지원하는 명령어 조합 어느것이든지 매크로로 사용될 수 있지여!

점점 새로운게 나오는 양파같은 우리의 컴퓨터 @_@


x87

x87 Floating Point란 x86 아키텍쳐 명령어 집합에서 부동 소수점을 관리하는 서브 집합이예요. x86 아키텍쳐는 많이 들어보시지 않으셨나영!! 보호모드 진입할 때부터 많이 사용 언급되었던 것인데, 80x86 이라고도 부르며 intel에서 개발한 마이크로프로세서 계열과 프로세서들이 사용하는 명령어 집합을 통칭하죠! 그래서 우리가 64비트로 전환했을 때 x86-64 라는 용어가 나왔었어요! x86 명령어 집합 아키텍쳐 중 64비트에 대한 것이 x86-64 인 것이죠.

x87 레지스터는 피연산자를 통해 직접 접근할 수 있는 레지스터를 사용해 ST0 부터 ST7 까지의 8단계 스택 구조를 형성하고, 가장 상단부터 물리적 Offset이 아닌 Relative Offset을 이용해 Push, Pop을 수행해요. ST(i)는 Stack Top으로부터 i개 유닛만큼 떨어져 있는 레지스터를 가리키는데, TOP 포인터 값이 2일 경우, ST(0)은 제2번 레지스터이고, ST(1)은 제3번 레지스터.. 이처럼 순차적으로 가리켜요! 더 자세한 설명은 위키백갓님께 떠넘겨도 괜찮겠나여!? 넘나 길어여 ㅜㅠ 복붙하면 너무 날로 먹는 것 같자나영 헤헿

(출처 : https://en.wikipedia.org/wiki/X87)


3DNow!

다음으로 3DNow!는(항상 갑툭튀하는 여담인데 뒤에 느낌표 붙은게 참 귀엽지않나여? 나중에 내 프로그램도 yummy! 라고 지어버릴까...헿헤헿) AMD에서 자사의 프로세서를 위해 만든 멀티미디어 확장 집합이라고 해요. MMX 명령어 집합을 강화하기 위해 개발되었으며 3D 계산을 중점으로 제공하여 3차원 그래픽스가 인기일 동안에 개발되었다고 하네요!


MMX

그렇다면 MMX는 무엇일까여!? MMX(Multi Media eXtension)란 intel에서 설계한 SIMD 명령어 집합이라고 하는데, IA-32 프로세서에 보완하기 위해 개발된 기능이라고 해요! MM0 부터 MM7 까지 8개의 레지스터를 가지고 64비트의 패킹된 형식으로 작동하는 연산을 정의하는 것을 MMX라고 칭해요. MMX 레지스터의 그림은 책에서 FPU 레지스터 그림 우측에 표현되어 있지요!!


갑자기 SIMD가 튀어나왔는데, SIMD는 그림과 함께 살펴보아여!!



SIME

SIMD(Single Instruction, Multiple Data)는 여러 개의 데이터가 동일한 작업을 동시에 수행하는 Multi Processing Computer를 의미해요. 그래서 병렬 프로세서의 한 종류가 되는 것이죠. 위 그림을 보시면 뭔가 살~짝 감이 오시지 않나여?! Data Pool에서 다중 데이터가 PU(Process Unit)에 들어올 때 명령어 집합이 있는 Instruction Pool에서 필요한 명령어를 Vector Unit을 통해 알맞게 배분시켜주는 것이죠! 즉, 여러 개의 데이터에 하나의 명령어가 할당되는 것이기 때문에 Single Instruction, Multiple Data라고 하는 것이예요!! Vector Unit을 통하니 Vector Processor에서 많이 사용되지 않을까여?! 그림을 기억하시면 용어가 기억나실 거라고 굳게 믿어 의심치 않아여!!


SSE

이제 마지막으로 SSE 시리즈에 대해 알아볼까요? SSE(Streaming SIMD Extension)는 intel에서 펜티엄 3시리즈 프로세서부터 도입된 x86 아키텍쳐의 SIMD 명령어 확장 세트예요. 기존 명령어 확장 세트에서 70개의 명령어가 추가되었죠. SSE Floationg Point는 MMX 레지스터에 새로운 레지스터인 XMM 레지스터를 추가하여 작동하는데(XMM이 무슨 약어인지 도대체 안나오더라구여!! 아무래도 eXtended MM Register인 것 같아요!! MM 확장이라는 MMX와 확장된 MM 이라는 XMM은 무엇이 다른 것인지 작명 센스가 별로네영!!) 이 XMM 레지스터는 자신 고유의 명령어 외에 MMX 레지스터에 있는 정수 명령어 몇 가지를 추가했어요. 넘나 복잡하지만 한 마디로 SSE는 XMM0 부터 XMM7 까지 8개의 128bit 레지스터를 추가한 것이예요! 이 후 SSE2, SSE3, SSE4까지 확장된 것이죠! SSE2에서는 MMX와 크게 중복되었다고 하네요. 이 레지스터도 책에서 FPU 레지스터 그림 아래에 그려져있으니 참고하세요!

(출처 : https://en.wikipedia.org/wiki/Streaming_SIMD_Extensions)


되게 복잡한 용어들이 자꾸자꾸 등장했네여 T^T 다들 고생 많으셨으니 오랜만에 박수 쨖쨖~~

혹시 여러분 읽다가 막 이러시는거 아니져?! 다 던져버리고 인터넷창을 살포~시 닫기버튼을 누르시는 그런 포기 야레야레요!!



이제서야 두 번째인 Floating Point Execution Units를 알아볼 차례가 되었네여.. 초장에 힘을 너무 많이 뺀 것 같아여! 마음같아선 다음 포스팅으로 넘ㄱ..쿨럭


두 번째로 Floating Point Execution Units는 위에서 알아본 x87, 3DNow!, MMX 및 SSE시리즈의 명령어 세트 내 모든 레지스터 연산을 처리하는 것이예요. 저~~기 위에 있는 Integer Register, FPU Register 그림에서 FPU Register 그림 하단의 FADD, FMUL, FSTORE로 구성되어 FPU를 처리하는 싸이클이 보이시죠!?


FADD, FMUL, FSTORE

FADD는 모든 명령어 세트의 덧셈 및 뺄셈 명령을 처리하는 것이며, FMUL은 곱셈 / 나눗셈 / 역행렬 / 제곱근 / 초월연산을 수행하지요. FSTORE은 메모리 접근이 필요한 각 명령어에 단독 혹은 직렬로 사용되며 레지스터간 이동도 가능하답니당!


Floating Point Scheduler에서 알아본 x87 Floating Point가 Floating Point Execution Units의 대표이자 우리가 사용할 기능이예요. FPU 레지스터는 x87 스택이라고도 부르고, FPU 연산을 x87 명령어 세트라고도 부른다고 하네요!


문득 불길함을 감지하였어여.. 또 이렇게 초장에 설명 열씸히 하다가 설명할 것이 없다고 땡!! 할 것 같은 느낌이... 그래서 책의 다음 페이지로 넘겨보니 혹시나가 역시나라고 한승훈 선생님께서 열심히 설명해주셨었네요!!


FINIT, FXSAVE, FXRSTOR

FPU 연산을 할 때 FPU 레지스터를 저장하고 복원하는 작업이 필요한데, FINIT / FXSAVE / FXRSTOR 명령어를 이용한다고 해요. 먼저 FINIT은 마스크되지 않은 부동 소수점 예외를 확인한 후 FPU를 초기화 하는 명령이고, FXSAVE는 x87 FPU / MMX 기능 / SSE 시리즈에 대한 상태를 저장하는 명령어예요. 그리고 FXRSTOR는 FXSAVE와 반대로 x87 FPU / MMX 기능 / SSE 시리즈에 대한 상태를 복원하는 명령어구요! 이 명령어들 외에 많~은 명령어를 정말 자~세하게 설명해준 사이트가 있더라구여!! 여기서 참조했는데 링크드릴게영!!

(명령어 출처 : http://x86.renejeschke.de)

(FINIT 출처 : http://x86.renejeschke.de/html/file_module_x86_id_97.html)

(FXSAVE 출처 : http://x86.renejeschke.de/html/file_module_x86_id_128.html)

(FXRSTOR 출처 : http://x86.renejeschke.de/html/file_module_x86_id_127.html)


이렇게 자세히 설명되어있는 곳이 또 있을까여ㅜㅠ 찾고싶은 모든 것이 다 이렇게 설명되어있으면 정말 좋을거같아여... 늉늉 T^T

책에서도 설명이 참 자세히 나와있어여!! 한 페이지를 더 넘겨보니... 그림 22-6에 있는 [CR0 컨트롤 레지스터와 CR4 컨트롤 레지스터의 필드 구성] 그림 있잖아여.. 예전에 Qemu 다운그레이드 문제로 고생했을 때 OSFXSR 비트와 OSMMEXCPT 비트를 뭣도 모르면서 막 설정해보고... 제 깃헙에서 32비트(01.Kernel) ModeSwitch할 때 막 값 설정해두고 커밋한거 보이실거에여ㅜㅠ 으으 야미의 치부...


이론은 여기서 끝이네여!! 이제 구현만 하시면 되는데, 책에서의 한 가지 오류 알려드릴게여!! 저는 함수 설명부분을 구현과 함께 하지 않고 먼저 구현한 후 함수 설명을 읽어보며 이해하는 타입인데, 여기서 어마어마한 오류가 발생해써여!! 22장의 2.1절에 있는 [FPU 콘텍스트와 FPU 사용 여부가 추가된 태스크 자료구조] 함수 설명 부분에서 char vcPadding[ 11 ]; 이 적혀있는데, 이게 22장 3절의 구현에서는 ...생략... 으로 표시되어있어서 빼먹었었거든여... 저처럼 고생하시는 분이 없으시길 바랄게여!!


이번 챕터에서 오류가 났던 곳이 kTestPIE() 함수만 실행시키면 13번 벡터인 General Protection Fault가 나타나서 저를 괴롭혔던 것이예여 ㅜㅠ 바로 저 저 패딩 저거!! 저것 때문이었어여 늉늉... 1비트라도 오차가 있으면 잘못된 메모리에 접근할 수 있기 때문에 여러분도 눈 똥~그랗게 뜨고 오타내시면 안돼여!! 저만 고생하는 걸로 해여 우리!!


이렇게 포스팅을 끝내기는 아쉽네영! 요즘 웹과 네트워크를 하다보니 OS개발을 잠시 중단한 상태거든여!!(트러블 슈팅에서 애먹다가 잠시 놓아버렸지여 ㅜㅠ그놈의 마우스 포인터 Z 순서 에러가 T^T) 그래서!! 이 전 포스팅에서 투덜투덜댔던 HDCON의 미니언이 바나나먹는 문제 풀이(통상 write-up이라고 하지여!)로 끝마칠게여!! 꼭 이거 OS개발 포스팅이 아닌 잡담포스팅가툰... 쩝...



짜라잔~~ 이렇게 할 쑤 있어여!! 그런데 아마 답은 다를거예여.. 0x004012EB 주소에서 JMP를 이용하지 않고 EBP값으로부터 얼마만큼 떨어진 값을 이용했어야 했고, 0x004013E2 아래에서 SUB, PUSH, ADD를 하는 것이 아닌 0x004013E2 주소에서 EBP값으로부터 얼마만큼 떨어진 값을 이용해야 했거든여! 그래서 이게 답이었을텐데!! 아쉽따!! 하는 마음에 미련을 버리지 못하고 이렇게 적게 되어써여... 혹씨 이것도 답이 아니라면 저는 아마...



이러고 있었을테죠..?!?!!? 으잉!?!?! 니콜라스 케이지 넘나 연기력 짱짱맨!!

이렇게 미니언에게 바나나도 먹이고~ FPU 연산 기능도 마치고~ 큰 챕터를 끝내고 이제 실행 결과를 포스팅할 때가 왔어여!! 다음 포스팅에서는 11장부터 22장까지의 실행 결과와 함께 돌아오겠습니당!! 뿅~★


Check out the yummyhit’s website for more info on who am i. If you have questions, you can ask them on E-mail.

카테고리:

업데이트:

댓글남기기