인터럽트 핸들링 루틴에 대해서는
PG비트가 켜져있더라도 세그먼트 모드로 실행된다고 생각하면 편함.
그리고, PG비트가 켜져있더라도 세그먼트 모드가 발동될 수 있다는 가정하에
(일단은 연산 오버헤드라고 가정했음)
쓸데없이 각종 세그먼트 정보들까지 전부 올린다고 보면 해결임.
나는 세그먼트레지스터들이 혹시
mm_struct 에서 페이지폴트를 세그폴트로 연결시켜주는 그 작업을 쉽게 진행하기 위해서
현재 세그먼트 정보들을 올려두는건가? 이 의심을 했음
이 의심이 맞다면, 세그레지스터들은 가상메모리주소를 담아야함
그러다보니까 여기서 카오스가 시작된거였는데,
그냥 연산 오버헤드라는것을 받아들이고,
또한,
특정 영역에서 세그먼트모드가 쓰인다던지, 등등 하드웨어가 혹시 페이지모드를 쓸 수 없을 경우를 대비해서 세그먼트모드를 상비한다던지
이런 관점에서 보면
세그먼트 레지스터 안에는 물리주소가 들어가는거.
그리고
IDT안에 세그먼트 셀렉터가 들어가는것도 ㅇㅋ고, (다만, 여기서 코드세그먼트는 ㅇㅋ인데, 스택세그먼트는 왜 안들어가는지는 또 애매)
(애초에, 베이스어드레스라는것도 이 관점에서는, IP 에 들어갈 32비트인건데, 마찬가지로 SP에 들어갈 32비트 정보는 어디있는지도 애매)
인터럽트 루틴에 들어갈때에
CR3을 바꾸거나 저장하지 않는것도 이해 감.
애초에 페이징 모드를 안쓴다는거임!
그냥 병신같이 페이징모드중인데도 세그먼트 레지스터들을 싹다 가져간다고 생각하면 편하고, 또한 내가 세그먼트주소방식을 자꾸 16비트를 20비트화시키는거에만 초점을 맞춰서 그런데, 세그먼트 이거의 진짜 목적은, 가상메모리화에 있는거같음. 가상메모리라고 하기엔 조금 웃기긴한데, 오프셋으로 따지는거임. 모든 주소를. 마치 PIC 같은 느낌으로, 세그먼트가 물리메모리의 어디에 위치하더라도, 그거과 무관하게 작동할수 있도록 offset 주소방식을 쓰던거라고 생각하면 편함
그리고 페이징시스템이 획기적인 이유는, offset 주소방식을 안써도 된다는점이고 그리고, 세그먼트 셀렉터 안에 권한정보가 들어가는것 또한 이해가 감. PTE에서 권한정보를 기입해주는거랑 같은 원리임. 페이징모드에는 세그먼트 셀렉터가 다른 일로 전환되는게 아니라, 그냥 쓸데없이 연산오버헤딩을 하는거고 실제로 그 연산 오버헤딩이 필요한 영역이 인터럽트핸들링 루틴이라고 보면 ㅈㄴ 클리어해짐. 그냥 운영체제가 조금 병신같을 뿐임
pae같은것도 지금 보면 오버헤드에 븅신같아 보이지만 당시에는 최선이지 않았을까?
사실 공부할게많아서 징징대는것 뿐이지 역사도 중요하다고 생각하고 (왜냐면 지금 있는 기술들도 언젠간 다 과거의 유물이 될테니까요) 재미있다고 생각하는 중이에요