eflags 레지스터 보면 vm86 플래그가 있습니다.
v86 모드로 진입할때는 보호모드에서 이 플래그를 세팅해서 진입하는 걸로
알고 있습니다. (리얼모드에서 v86모드 바로 진입 불가합니다)
리얼모드와 v86모드의 차이점이라면
리얼모드의 경우 특권수준 0(최상)의 보호모드와 똑같은 취급을 받습니다.
하지만 v86모드는 특권수준 3(최하)의 취급을 받습니다.
이건 리얼모드에서는 cpu의 모든 부분을 무제한적으로 사용할 수는
있지만, v86모드는 cpu의 모든 부분을 다 못쓰게 되고, 또한 I/O 제한도
걸린다는 겁니다. (보호모드에서는 메모리뿐만 아니라 in, out명령에 의
한 외부와의 I/O도 제어할 수 있습니다. 비밀은 task segment가 담고 있는
I/O Map에 있습니다. 궁금하시면 인텔 프로세서 매뉴얼 찾아보세요)
v86모드에서 못쓰게 되는게 cr?레지스터같은 시스템 레지스터들입니다.
이들 명령어에 접근하면 예외가 발생하게 되어 있습니다.
특권수준 요구하는 명령어들도 v86에서는 모두다 블럭됩니다
(lgdt, lidt 등등)
또 페이징까지 켜져 있는 경우 v86모드에서는
seg:off로 전환된 주소가 물리주소가 아닌 선형주소가 됩니다.
선형주소는 MMU의 페이징 변환을 한단계 더 통과해야 실제 물리주소가
되는거 아시죠. 이때문에 페이지 매핑을 잘 하면 v86모드에서는 실제로 1M
이상의 메모리 영역을 쓰고 있음에도 불구하고 1M이하 영역을 쓰는
걸로 보여지죠. (MMU변환과정에서 메모리상에 없는걸로 판명나면 당연히
페이지 폴트도 생깁니다) 반대로 진짜 리얼모드이면, seg:off 계산한
값이 바로 물리주소가 됩니다.
흑기사님께서 말씀하신대로 v86 mode 가 tss 의 i/o map 에도 영향을 받고 이런걸로 봐서는 v86 mode 자체가 리얼 모드를 흉내내는 하나의 테스크라고 볼수도있겠네요?
그렇다면 v86 mode 내에서는 세그먼트 레지스터들이 셀렉터로 해석이 안되고 리얼모드처럼 베이스 주소로 해석이 되나요?
그리고 마지막으로 이해가 안되는 부분이...
v86 mode 도 어차피 보호 모드일때 v86 mode 에 할당해준 페이지들을 사용하고, 시스템 레지스터에 대해 접근이 불가한데 어떻게 v86 이 보호모드에 영향을 줄수 있있다는건가요? 이 말은 보호 모드에서 메모리 메핑을 잘못해놓으면 v86 이 보호 모드에 영향을 줄수있다는 말인가요??
제 생각엔 v86 내에서 고의 혹은 실수로 보호 모드를 파괴하거나 이런건 안될꺼같은데, 일반 테스크처럼요...
흑기사님께서 말씀하신대로 v86 mode 가 tss 의 i/o map 에도 영향을 받고 이런걸로 봐서는 v86 mode 자체가 리얼 모드를 흉내내는 하나의 테스크라고 볼수도있겠네요?
그렇다면 v86 mode 내에서는 세그먼트 레지스터들이 셀렉터로 해석이 안되고 리얼모드처럼 베이스 주소로 해석이 되나요?
그리고 마지막으로 이해가 안되는 부분이...
v86 mode 도 어차피 보호 모드일때 v86 mode 에 할당해준 페이지들을 사용하고, 시스템 레지스터에 대해 접근이 불가한데 어떻게 v86 이 보호모드에 영향을 줄수 있있다는건가요? 이 말은 보호 모드에서 메모리 메핑을 잘못해놓으면 v86 이 보호 모드에 영향을 줄수있다는 말인가요??
제 생각엔 v86 내에서 고의 혹은 실수로 보호 모드를 파괴하거나 이런건 안될꺼같은데, 일반 테스크처럼요...
아...괜히 v86 mode 를 봐서 맘 고생만 하고 있다는...-_-;;
즐거운 주말 보내세요~ ^^;
세그먼트 레지스터는 리얼모드와 동일한 방법으로 처리됩니다.
특별히 셀렉터 같은건 요구하지 않고요.
단 세그먼트와 오프셋의 조합으로 만들어진 주소는 바로 물리주소가
되는 게 아니라 선형주소가 되어서 MMU를 한번 거치게 됩니다.
그리고 물론 v86에서 매핑 잘못하면 작살날 수 있죠. 특히 INT 테이블이라든가
INT 진입코드 부분을 프로그램 조작미숙으로 날리는 경우와
(불행히도 리얼모드와 마찬가지로 v86에서도 INT 테이블을 아무나
조작할 수 있습니다. 기타 메모리상에 존재해야만 하는 시스템영역도 다 마찬가지입니다.
보호모드에서 v86의 상태를 얻기 위해 집어넣은 영역까지도 v86에서 전부 조작 가능합니다.
이러면 v86이 보호모드까지도 다 영향을 미치는거죠 ㅠ.ㅠ)
아니면 보호모드쪽에 버그가 있어서 v86 페이지 매핑이 보호모드
시스템 영역과 겹치는 경우 등등... 많이 발생할 소지가 있죠.
주변장치 입출력과정에서 과정에서 보호모드에서 따로 v86에서 따로
제어를 해서 주변장치의 혼동으로 문제가 생길수도 있고요. v86
여러개가 주변장치를 따로따로 접근하려다가 생길수도 있고요.
거기다 v86에 들어간다면 특정 OS를 띄우기 위해선 반드시 BIOS를
흉내내는 기능을 제공해야죠. 하나 이 BIOS에뮬레이트하는것도 상당히
어렵습니다. 거기다 BIOS에는 돈주고 사야만 하는 미공개 정보도 있고요.
얘네들까지 에뮬레이트해야 한다면 일반 개인은 거의 대책이 없죠
(특히 BIOS32 Service Directory라고 불리는 부류의 서비스들은 거의 공개가
안된 거 같군요. Ralf Brown의 인터럽트 리스트에도 리얼모드 BIOS
인터페이스는 거의 다 나와 있지만, 요 BIOS32는 얼마 없습니다)
v8086모드 자체가 문제 있는것은 아닐겁니다.v86모드로 돌아가
v8086모드 자체가 문제 있는것은 아닐겁니다.
v86모드로 돌아가도록 꾸미려면
감쪽같이 프로그램들을 속이는 것인데
그것이 너무도 많은 속이는 루틴이 필요합니다.
그것이 하나라도 속이지 못하면 fault가 나죠...
즉, 개발자가 정확히 지원을 못하는것일뿐 v86자체의 문제는 아닐겁니다.
하지만 그것도 이해할만 합니다. 막상 만들어보면
차라리 그냥 일반 보호모드로 돌리는게 낳다는 생각이 들겁니다.
너무 어려운 모드죠.
v86은 보호모드에 영향을 줍니다.
플밍은 안해봤지만 제가 아는 바로는
eflags 레지스터 보면 vm86 플래그가 있습니다.
v86 모드로 진입할때는 보호모드에서 이 플래그를 세팅해서 진입하는 걸로
알고 있습니다. (리얼모드에서 v86모드 바로 진입 불가합니다)
리얼모드와 v86모드의 차이점이라면
리얼모드의 경우 특권수준 0(최상)의 보호모드와 똑같은 취급을 받습니다.
하지만 v86모드는 특권수준 3(최하)의 취급을 받습니다.
이건 리얼모드에서는 cpu의 모든 부분을 무제한적으로 사용할 수는
있지만, v86모드는 cpu의 모든 부분을 다 못쓰게 되고, 또한 I/O 제한도
걸린다는 겁니다. (보호모드에서는 메모리뿐만 아니라 in, out명령에 의
한 외부와의 I/O도 제어할 수 있습니다. 비밀은 task segment가 담고 있는
I/O Map에 있습니다. 궁금하시면 인텔 프로세서 매뉴얼 찾아보세요)
v86모드에서 못쓰게 되는게 cr?레지스터같은 시스템 레지스터들입니다.
이들 명령어에 접근하면 예외가 발생하게 되어 있습니다.
특권수준 요구하는 명령어들도 v86에서는 모두다 블럭됩니다
(lgdt, lidt 등등)
또 페이징까지 켜져 있는 경우 v86모드에서는
seg:off로 전환된 주소가 물리주소가 아닌 선형주소가 됩니다.
선형주소는 MMU의 페이징 변환을 한단계 더 통과해야 실제 물리주소가
되는거 아시죠. 이때문에 페이지 매핑을 잘 하면 v86모드에서는 실제로 1M
이상의 메모리 영역을 쓰고 있음에도 불구하고 1M이하 영역을 쓰는
걸로 보여지죠. (MMU변환과정에서 메모리상에 없는걸로 판명나면 당연히
페이지 폴트도 생깁니다) 반대로 진짜 리얼모드이면, seg:off 계산한
값이 바로 물리주소가 됩니다.
v86과 보호모드가 서로 영향을 미친다고 하는건 이때문입니다.
Written By the Black Knight of Destruction
잘 이해는 안 가지만...-_-;...답변 감사드립니다~!흑기사님
잘 이해는 안 가지만...-_-;...답변 감사드립니다~!
흑기사님께서 말씀하신대로 v86 mode 가 tss 의 i/o map 에도 영향을 받고 이런걸로 봐서는 v86 mode 자체가 리얼 모드를 흉내내는 하나의 테스크라고 볼수도있겠네요?
그렇다면 v86 mode 내에서는 세그먼트 레지스터들이 셀렉터로 해석이 안되고 리얼모드처럼 베이스 주소로 해석이 되나요?
그리고 마지막으로 이해가 안되는 부분이...
v86 mode 도 어차피 보호 모드일때 v86 mode 에 할당해준 페이지들을 사용하고, 시스템 레지스터에 대해 접근이 불가한데 어떻게 v86 이 보호모드에 영향을 줄수 있있다는건가요? 이 말은 보호 모드에서 메모리 메핑을 잘못해놓으면 v86 이 보호 모드에 영향을 줄수있다는 말인가요??
제 생각엔 v86 내에서 고의 혹은 실수로 보호 모드를 파괴하거나 이런건 안될꺼같은데, 일반 테스크처럼요...
아...괜히 v86 mode 를 봐서 맘 고생만 하고 있다는...-_-;;
즐거운 주말 보내세요~ ^^;
이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~
[quote="kkojiband"]잘 이해는 안 가지만...-_-;...
세그먼트 레지스터는 리얼모드와 동일한 방법으로 처리됩니다.
특별히 셀렉터 같은건 요구하지 않고요.
단 세그먼트와 오프셋의 조합으로 만들어진 주소는 바로 물리주소가
되는 게 아니라 선형주소가 되어서 MMU를 한번 거치게 됩니다.
그리고 물론 v86에서 매핑 잘못하면 작살날 수 있죠. 특히 INT 테이블이라든가
INT 진입코드 부분을 프로그램 조작미숙으로 날리는 경우와
(불행히도 리얼모드와 마찬가지로 v86에서도 INT 테이블을 아무나
조작할 수 있습니다. 기타 메모리상에 존재해야만 하는 시스템영역도 다 마찬가지입니다.
보호모드에서 v86의 상태를 얻기 위해 집어넣은 영역까지도 v86에서 전부 조작 가능합니다.
이러면 v86이 보호모드까지도 다 영향을 미치는거죠 ㅠ.ㅠ)
아니면 보호모드쪽에 버그가 있어서 v86 페이지 매핑이 보호모드
시스템 영역과 겹치는 경우 등등... 많이 발생할 소지가 있죠.
주변장치 입출력과정에서 과정에서 보호모드에서 따로 v86에서 따로
제어를 해서 주변장치의 혼동으로 문제가 생길수도 있고요. v86
여러개가 주변장치를 따로따로 접근하려다가 생길수도 있고요.
거기다 v86에 들어간다면 특정 OS를 띄우기 위해선 반드시 BIOS를
흉내내는 기능을 제공해야죠. 하나 이 BIOS에뮬레이트하는것도 상당히
어렵습니다. 거기다 BIOS에는 돈주고 사야만 하는 미공개 정보도 있고요.
얘네들까지 에뮬레이트해야 한다면 일반 개인은 거의 대책이 없죠
(특히 BIOS32 Service Directory라고 불리는 부류의 서비스들은 거의 공개가
안된 거 같군요. Ralf Brown의 인터럽트 리스트에도 리얼모드 BIOS
인터페이스는 거의 다 나와 있지만, 요 BIOS32는 얼마 없습니다)
Written By the Black Knight of Destruction
헉...한 마디로 x86 시스템을 통째로 하나 구축하는거군요...-_-;
헉...한 마디로 x86 시스템을 통째로 하나 구축하는거군요...-_-;;;
늦은 시간까지 답변 넉넉히 달아주셔서 정말 감사드립니다...T.T
즐거운 주말 보내세요~!
이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~
v86 모드는 보호 모드에 영향을 끼칠 수 없습니다. 일반 프로그램이 커
v86 모드는 보호 모드에 영향을 끼칠 수 없습니다. 일반 프로그램이 커널 공간에 허락없이 접근할 수 없고(v86 모드는 특권 3이고 커널과 v86 모니터는 특권 0입니다), 시스템내 프로세스들끼리 세그멘테이션을 통해 서로 완전히 격리되는 것과 마찬가지 이유입니다.
댓글 달기