[yummyHitOS] 10 day (2017.07.22)

7 분 소요

General Protection Fault가 일어나는 부분을 확인하기 위한 세그먼트 레지스터 디버깅은 어떻게하는게 좋을까여...

아녜여!! 갑자기 시작부터 이렇게 축 쳐지면 글 읽기가 싫어지겠죠!? ㅜㅠㅜ열심히 개발도중 세그먼트 레지스터에서 막혀버리니 또 며칠 밤새 디버깅할 생각에 기분이 넘나 하늘로 날아갈것같아여!! 하핳하하하핳히힣힣히히ㅏ히하힣ㅎ 정신놓고 웃다보니 97년작 니콜라스 케이지 주연의 "Face Off" 영화가 생각나네요 핳하하헤하ㅔㅎㅎ힣히힣



이거 소리도 들으시면 더 웃겨요!! 니콜라스 웃음 이라고 검색하시면 아마 여기저기서 나올걸요?!


Interrupt

본격적으로 이번에 우리가 진행하는 부분은 인터럽트예요!! 인터럽트 많이 들어보신적 없나여? 겐세이와 비슷한 것 같아여! 우리말로는 새치기?!


인터럽트는 CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 또는 예외상황이 발생하여 처리가 필요할 경우에 마이크로프로세서에게 알려 처리할 수 있도록 하는 것을 말한다.


라고 역시 이론의 신 위키백갓이 있지요!!(https://ko.wikipedia.org/wiki/인터럽트) 넘나 친절하고 자세한 설명에 무릎을 탁! 치고 갑니다~!

코딩을 하다보면 우리가 if 조건문 / try-catch 구문 / throw / ... 등의 예외처리를 하는데, 여기서 나오는 예외와 우리가 공부할 인터럽트는 닮은꼴이예요! 사다리꼴이아니라 닮은ㄲ 이 둘 다 문제가 발생했을 때 프로세서에 의해서 처리를 해주어야 하는 이벤트라는 것이죠! 물론 예외는 앞서 말했듯 코드 수행 시의 명령오류이며, 인터럽트는 우리가 사용하는 장치들에 의해 발생하는 이벤트예요!

event

음.. 그렇다면 이벤트가 도대체 무엇을 의미할까요? 이벤트라곤 깜짝이벤트, 2017주년 이벤트같은 행사라는 의미로 자주 쓰이기도 하지만, 우리에게 이벤트란 행사가 아닌 모든 행위를 의미해요!

키보드의 어느 키를 누르든 그 행위, 마우스의 센서를 0.00001mm라도 움직이는 행위, 클릭하는 행위, 시간이 1초가 흐르는 행위, ... 등등 엄청나게 많지요!? 시간이 흐르는게 행위냐구요? 컴퓨터와 같은 기계들이 보기엔 움직이면 행위인가보죠 뭐... 저한테 뭐라고 하지마셔요 ㅜㅠㅜ마음만큼은 여리답니다ㅠㅜ

그렇다면 예외나 인터럽트는 행위에 대한 것을 처리해준다~ 그런 의미가 되는군요!!

인터럽트 처리 과정에 대해서는 이 책 외에도 운영체제에 관련된 책이라면 기본적으로!! 운영체제의 꽃이자 핵심이자 넘나 중요한 부분이기에 다 기재되어있어요!! 검색만 해도 잔뜩 나오지만 저도 그 잔뜩의 무리에 복사뼈에 물린 모기자국에 십자가 표시를 해둔 가장자리의 반경 1nm 정도로 낄껴 해보도록 하겠습니다! 왜 모기자국에다가 십자가 표시까지 나오냐구요? 그냥 아~무말이나 하는거죠! 이게 야미의 매력...☆


process


이렇게 인터럽트나 예외가 뙇!! 하고 들어왔을 때 가만히 있을 순 없죠!! 키보드의 키가 눌리는지 안눌리는지, 마우스가 잘 작동은 되는지 다 체크해보아야 하겠죠!? 체크하는 함수를 인터럽트(아니 인터럽트는 발생해도 인터럽트고 처리할 때도 인터럽트면 가가 가가 가가 가가? 이의 이승 이의 이승!?) 혹은 예외 핸들러라고 부른대요!


여기까지가 이번 챕터에서 배울 틀이었으니 이제 내용을 들여다보러 갈까요? 아직도 본론이 시작되지도 않았다니 안습안습 T^T

3일차에서 진행했었던 GDT, LDT 기억나시나요!? 이번엔 IDT랍니다!! 그런데... 소제목이 살짝 당황스럽네여.. IDT '게이트' 디스크립터라구여?! 게이트여?! 남자끼리 데이트한다는 그 게이트...

수 년 전까지만해도 게이트하면 게이트웨이가 먼저 떠올랐는데... 이제 저도 시대를 따라가나보네여 ㅜㅠ신시대는 받아들여야하는게 맞으니까요!!

죄송해여... 네... 공부나 하자구여 이런 이상한소리 집어치우고ㅜㅠㅜ


gate

게이트(Gate)란 인텔 프로세서들에서 정의해서 사용하는 특이한 구조인데, 게이트는 시스템에 서로 다른 privilege(우선순위) 레벨의 핸들러 혹은 procedure(프로시저; 특정 작업을 수행하기 위한 프로그램의 일부. 함수 / 루틴 / 서브루틴과 비슷!)를 호출하기 위해서 정의하고 있는 일종의 'gateway' 와 같은 역할을 하는 구조체라고 합니다. 이 구조체에는 호출할 핸들러 혹은 프로시저의 주소에 대한 정보, 우선순위 레벨에 대한 정보와 같은 것들이 담겨져있는데, 주로 이러한 게이트들은 64비트의 크기를 가진다고 해여!


그렇다면 IDT란 도대체 뭘까여? 뭔가 ID라고 하니까 IDentify... 아이디 인증의 T는 테이블..? 타입..?



답이없나보네여.. 그럼 IDT란 도대체 무엇입니꽈!!!!


IDT

IDT(Interrupt Descriptor Table)이란 인터럽트나 예외 핸들러들의 벡터와 벡터의 정보 등을 저장해 두는 구조체를 일컫는다고 합니다!


그렇다면 IDTR은 마지막에 R이 붙었으니 왜~~~ㄴ지 Register 같지 않으신가여!? 넘나 수상쩍게 레지스터같은데!!


IDTR은 예상대로 시스템의 IDT가 존재하는 메모리 주소의 베이스 어드레스와 IDT Entry의 갯수가 저장되기로 약속된 레지스터라고 해요! 이 레지스터는 크기가 48비트로, 상위 32비트에는 IDT 가 시작되는 곳의 베이스 어드레스 / 하위 16비트에는 IDT 엔트리의 갯수가 담겨져 있대여!!


그럼 IDTR과 IDT의 관계는 어떨까요!? 물논.. 책의 그림 12-2에 있긴 하지만 저는 개성야미자나여!!



책이랑 뭔가 달라보이지만 똑같답니당~!! 레지스터에서 인터럽트 벡터를 가지고 해당하는 IDT 엔트리를 찾아내는 것이었던 것입니다!!

(예를 들어 마우스 핸들러 오류이면 마우스 핸들러 오류에 해당하는 번호로 이동!!)

이렇게 찾아낸 IDT 엔트리에 대해 어떠한 작업을 요청해서 함수를 작동할까요!? 바로바로~~ 게이트호출!! 아까 이상한 단어로 느꼈던 그 게이트가!! 이렇게 호출되는 녀석이었네여!! 짜식.. 그동안 고생했고.. 다음에 웃으면서 보자 게이트 호출은 어떻게 되나영?!



요 그림처럼 IDTR 레지스터를 통해 온 인터럽트 벡터로 골라진 IDT 엔트리에서, GDT 혹은 LDT에서 세그먼트 셀렉터를 통해 세그먼트 디스크립터의 주소와 IDT 엔트리의 오프셋을 합해 코드세그먼트로 간다고 해요!! 어우 넘나 복잡하지여? 그냥 그림을 통째로 머리에 넣어두시면 좀 더 해석하기 쉽지 않을까 싶어영!!

그렇다면 IDT 게이트 디스크립터란 녀석은 어떤 구조를 가지고있을까여?! GDT할 때에도 머리 싸매면서 했던 그것...



GDT와 비교해보면 훨씬 간략하져!! 무슨 Base Address라거나, 7개가 넘던 그 필드들... IDT는 뭔가 이름부터 친숙하더니 이녀석 정감가네요 ㅎㅎ

각 필드의 설명은 책에 더 자세히 나와있으니 패쓰할께영!!! 갓승훈 선생님의 설명을 보면 보호모드에서 게이트 디스크립터 타입이 3가지나 있대여... 자꾸 게이트 게이트 하니까 이 늦은 새벽에 멜랑꼴리한 기분이 드네영 ㅎㅎㅎ

꼭 평소에는 약먹고 미친듯이 글쓰던 야미가 오늘따라 미치지 않고 진지해보이는 느낌적인 느낌!?


정말 이 책을 자세히 읽어보면 너무너무너무 필요한 중요한 정보가 쏙쏙 나와서 행복해여ㅜㅠㅜ 어떻게 이렇게 책을 쓸 수가 있는거징...

IST가 나오네여!! 위 그림인 IDT 게이트 디스크립터의 구조에서 사실 DPL 이 전 비트에 IST가 있거든여!! 책에는 있는데 위 그림에만 없는거예여!!


IST

IST(Interrupt Stack Table)란 TSS(Task State Segment)에 상주하는 것인데 논리적(Segment + Offset) 스택포인터를 내포하고있대여! 물논 책에 적혀있는대로 인터럽트나 예외가 발생했을 때 핸들러가 코드나 데이터영역을 덮어쓸까봐 별도 스택 공간을 할당하기위한 것도 있지만요!!


나닛... 그럼 TSS는 또 머시여..


TSS

TSS(Task State Segment)란 Task에 대한 정보가 들어있는 구조라고 해요. 프로세서 레지스터 상태 / 입출력 포트 권한 / IST가 있는 내부 레벨 스택 포인터 / 이 전 TSS 링크 이렇게 4가지의 정보를 가지고 있는 것이 바로 TSS !!

(GDT, IDT 얘네들은 쥐디티 아이디티 이렇게 편하게 읽을 수 있는데... 얘는 힘드네영 ㅜㅠ티에스ㅔ스...)


너무나도 다양한 테이블과 디스크립터와 게이트.. 오늘은 기승전-게이트네요 ㅋㅋㅋㅋ아닌가여?! IRQ도 나와버렸네여!?


IRQ

IRQ(Interrupt ReQuest)란 인터럽트 신호를 처리하는 데에 쓰이는 컴퓨터 버스 라인의 인터럽트 행위, 또는 프로그래머블 인터럽트 컨트롤러의 인터럽트 입력 라인을 가리키는데, 물리적 핀 번호 대신 IRQ 번호를 할당하여 1:1매칭 시킨 후 이것으로 인터럽트를 컨트롤한다고 해여!!


드디어 챕터 12에서 첫 번째 장이 끝났네요... 오늘 뭔가 스압주의인데여?! 제목에 넣어둬야겠당 스압스압 쌉싸라~



ㅋㅋㅋㅋㅋ여기서 진심 빵터졌어여 쌈싸라~~

책에 설명이 자세히 나와있지만, 부가적으로 설명을 조금 더 드릴게요!!

스택 스위칭은 권한 변경시에만 발생하는데, 그렇다면 권한이 변경되지 않으면 어떨까! 이것이 궁금해지지 않나여!?

(뭔가 이 책도 보다보면 약간 의식의 흐름 톸톸이 있는 것 같긴 해여...헿헤 동족데쓰☆)


DPL

프로세서는 인터럽트가 걸려오면, 그때 수행하던 프로그램의 실행을 잠시 중단하고 인터럽트 핸들러를 수행한 후 다시 인터럽트가 걸리기 전에 수행하던 프로그램의 실행 흐름으로 돌아와야해요. 그렇게 하기 위해서 인터럽트 핸들러의 코드로 점프하기 전에 프로세서는 하드웨어적으로 프로그램의 context를 저장하는 작업을 하는데, 어셈블리어에서 'call' 인스트럭션을 수행하는 것과 비슷한 동작을 하게 됩니다!

인터럽트가 걸려오면, 프로세서는 EFLAGS, CS, EIP 레지스터를 스택에 저장하고, 그 중, CS 와 EIP 레지스터의 값들은 인터럽트 핸들링이 완료된 후에 다시 리턴해서 돌아올 곳의 지시자 포인터(instruction porinter)의 역할을 하게 되어요!!

만약, 인터럽트 벡터가 가리키는 IDT 의 엔트리가 현재 수행되는 프로그램보다 더 낮은 DPL(Descriptor Privilege Level)을 가졌을 때(높은 권한을 가지는 경우) 스택 스위칭이 일어나요. 스택 스위치가 일어나게 되면, 핸들러가 수행을 완료하고, 리턴해야 할 코드가 사용하던 스택의 주소에 대한 정보 또한 스택에 저장되게 되는데, 이 경우 먼저 스택 체인지가 일어나고, SS, ESP 가 체인지된 스택(핸들러의 스택)에 저장되고, 그 후 EFLAGS, CS, EIP가 핸들러의 스택에 저장되게 된다고 해요!


넘나 복잡하면서도 DPL 자꾸 나오는데 기억 잘 안나시지 않나여? 3일차로 돌아가라! 는 말도 참 많이해서 못하겠네여... 한 번 더 설명 드리도록 하겠습니다!! 야미는 넘나 친절하지 않나여? 죄송해여..


DPL(Descriptor Privilege Level)은 디스크립터에 의해 기술되어지는 세그먼트 혹은 게이트의 우선순위 레벨로 세그먼트 디스크립터 혹은 게이트 디스크립터의 DPL 필드에서 나왔었어요!! 기억하셔야해요! 0 에서 3 까지의 값을 갖고, 리눅스는 0 과 3 두 개의 값만 사용한다고 해요. DPL은 디스크립터에 의해서 기술되어지는 세그먼트로의 접근(Access)을 컨트롤 한대요. 해당 세그먼트에 접근할 수 있는 권한 레벨(Privilege Level) 을 정의해요.

예를 들어, 2 라는 값의 DPL을 가지는 디스크립터에 의해 기술되어지는 세그먼트에 접근하기 위해서는 프로세서가 0, 1, 혹은 2 의 Privilege Level에서 동작하고 있어야 하죠.


음 뭔가 3일차보다 더욱 더 자세해지고 예시까지 들어주는 졸린 야미예여!! 날씨가 갑자기 시원해지니까 졸리네여 ㅎㅎㅎ불면증 끝인가봉가

그럼 스택 스위칭이 일어날 때의 스택은 어떤 변화가 이루어질까여?!


<얘는 특별히 이름을 적어줘서 with Privilege Level>


DPL의 변경으로 인한 Stack Switching이 있을 경우의 인터럽트 핸들러 게이트 호출시의 스택을 그린 그림이예요.

아무래도 이 그림만 봐서는 감이 잘 안잡히시져?! 그럼 특별히 이름을 한 번 더 써줘야 겠네여!


<얘도 특별히 이름을 적어줘서 don't use Privilege Level>


오홍!! 스택이 2개나 생기는 그런 구조였군여!! 네? 스택이 2개나 생길 수 있나여? 멍청이인가여 야미님?

아녀.. 그게아니라 ㅜㅠㅜ 논리적으로 볼 때 스택이 2개인 것처럼 보이잖아여!! 당연히 메모리주소가 다른 공간에다가 저멀리 두고 2개의 스택인 마냥 저렇게 사용하겠지만여!! 멍청이라니 너무한것 ㅜㅠㅜ

참 아까 멜랑꼴리라는 표현을 썼었는데, 프랑스어로 우울하고 슬픈 것을 의미한대여!! 게이트와 멜랑꼴리가 무슨 관계일까여?! 그냥 제가 기분이 변덕이라 그 때 잠깐 멜랑꼴리 했을 뿐이예여!! 오해하지마세여!!


이렇게 스택 스위칭을 영차영차 설명했는데, 슬픈 소식이 있어여 ㅜㅠㅜ 보호 모드에서는 스택 스위칭의 단점때문에 IST와 함께 써야한다고 ㅎㅐ여!! 그러면 권한과 관계없이 무조건 스택 스위칭이 발생한다고 하는군여!!

그리고 조금 전 우리가 미리 알아보았던 TSS에 대해 설명이 아주 잘 되어있어요.


그 후로는 이제 코드 설명이 나와있네요!! 오호... 생각보다는 스압이 크지 않아서 다행이예요!! 이렇게 이론쟁이 위키백갓이 있어야 할 것 같은 챕터도 무사히 통과!!

했지만 저는 디버깅...을 해야죠...왜 인터럽트 벡터 13번이 자꾸 발생하는 것인가... 보호 영역에 무엇을 잘못저지른것인가 ㅜㅠㅜ

뭔가 제가 하는 짓은 꼭... 이 짤같이 바보같은 삽질을 하고있는 것 같지만!!

네 그렇습니다 바보야미는 이 삽질 외에 방법을 알지 못합니다 ㅜㅠ넘나 상상력 딸린 것...



오늘은 짤 투척이 적었어여!! 이제 좀 포스팅 다웠나여!? 아님 말구여...

그럼 우리 다음 챕터에서 뵈어요!! 다음 챕터도.. 이름부터가 PIC 컨트롤러와 인터럽트 핸들러로 인터럽트 처리... 이론이 쵸큼 있어보이지만 저 야미는 하..할 쑤 있을테니깐여!! 핳ㅎ하하핳핳하하핳...후...

어랏 그러고보니 '인터럽트 핸들러' 라고 하네여!? 아깐 발생이나 처리나 둘 다 인터럽트라고 하는줄 알고 궁시렁댔는데!! 인터럽트야 내가 미안하다!!



꼭 학교에서 연세드신 교수님이나 선생님들이 처음엔

"이건 A고 이건 B라서 결국 AB가 된다." 라고 알려주셨다가 나중에 "아참 아까 A가 아니라 C였다." 라고 하셔서 필기한거 다시 돌아가서 고치고...

꼭 제가 그런 사람이 된 것 같아 넘나 송구스럽사옵나이다.... 이 송구함을 받아주시옵고 다음 포스팅에서 뵈어용 뿅☆


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

카테고리:

업데이트:

댓글남기기