v8086 mode의 문제점...?

kkojiband의 이미지

갑자기 v8086 이라는게 어떤 식으로 구현이 되는걸까 궁금해져서 여기저기 찾아보고 있는데요...

근데 찾아보니 v8086 mode 에서 문제가 많이 발생한다고 하더라구요??

그 문제가 보호 모드에까지 영향을 미친다고 하던데...

어떻게해서 보호 모드에까지 영향을 미칠수가 있죠?

이에 대해 공부할수있는 자료 혹시 아시는 분 알려주세요~

익명 사용자의 이미지

v8086모드 자체가 문제 있는것은 아닐겁니다.

v86모드로 돌아가도록 꾸미려면
감쪽같이 프로그램들을 속이는 것인데
그것이 너무도 많은 속이는 루틴이 필요합니다.
그것이 하나라도 속이지 못하면 fault가 나죠...

즉, 개발자가 정확히 지원을 못하는것일뿐 v86자체의 문제는 아닐겁니다.
하지만 그것도 이해할만 합니다. 막상 만들어보면
차라리 그냥 일반 보호모드로 돌리는게 낳다는 생각이 들겁니다.
너무 어려운 모드죠.

Necromancer의 이미지

플밍은 안해봤지만 제가 아는 바로는

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

kkojiband의 이미지

잘 이해는 안 가지만...-_-;...답변 감사드립니다~!

흑기사님께서 말씀하신대로 v86 mode 가 tss 의 i/o map 에도 영향을 받고 이런걸로 봐서는 v86 mode 자체가 리얼 모드를 흉내내는 하나의 테스크라고 볼수도있겠네요?

그렇다면 v86 mode 내에서는 세그먼트 레지스터들이 셀렉터로 해석이 안되고 리얼모드처럼 베이스 주소로 해석이 되나요?

그리고 마지막으로 이해가 안되는 부분이...

v86 mode 도 어차피 보호 모드일때 v86 mode 에 할당해준 페이지들을 사용하고, 시스템 레지스터에 대해 접근이 불가한데 어떻게 v86 이 보호모드에 영향을 줄수 있있다는건가요? 이 말은 보호 모드에서 메모리 메핑을 잘못해놓으면 v86 이 보호 모드에 영향을 줄수있다는 말인가요??

제 생각엔 v86 내에서 고의 혹은 실수로 보호 모드를 파괴하거나 이런건 안될꺼같은데, 일반 테스크처럼요...

아...괜히 v86 mode 를 봐서 맘 고생만 하고 있다는...-_-;;

즐거운 주말 보내세요~ ^^;

이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~

Necromancer의 이미지

kkojiband wrote:
잘 이해는 안 가지만...-_-;...답변 감사드립니다~!

흑기사님께서 말씀하신대로 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는 얼마 없습니다)

Written By the Black Knight of Destruction

kkojiband의 이미지

헉...한 마디로 x86 시스템을 통째로 하나 구축하는거군요...-_-;;;

늦은 시간까지 답변 넉넉히 달아주셔서 정말 감사드립니다...T.T

즐거운 주말 보내세요~!

이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~

익명 사용자의 이미지

v86 모드는 보호 모드에 영향을 끼칠 수 없습니다. 일반 프로그램이 커널 공간에 허락없이 접근할 수 없고(v86 모드는 특권 3이고 커널과 v86 모니터는 특권 0입니다), 시스템내 프로세스들끼리 세그멘테이션을 통해 서로 완전히 격리되는 것과 마찬가지 이유입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.