'컴퓨터'에 해당되는 글 13건

  1. 2009.04.29 MPX 설치 완료 +_+
  2. 2009.03.22 IP로 사는 위치를 추적할 수 있을까요?
  3. 2007.01.15 멀티 도스에서의 문제점 기술 2

MPX 설치 완료 +_+

2009. 4. 29. 05:17 from 컴퓨터/Linux
멀티터치스크린 디바이스 드라이버 제작한다고 선언(?)한 후, 꼬박 한달여 기간이 지났다.

드라이버의 테스트를 위해선 X-window 내에서 두개의 포인터가 필요했다. 그래야 동시에 두좌표 이상이 되는지 확인할 수 있기 때문이다.;; 너무나 당연하다.

검색을 해보니, 새로운 윈도우 버전에서나 볼 수 있는 두개의 포인터 기술이 리눅스에선 이미 있었다.(역시!)
MPX(Multi-Pointer X server)라는 기술인데, Peter Hutterer라는 X input hacker가 개발한 것이 있었다.
그리고, 데모 동영상도 꽤 있었다. 하지만, 실제 구현하는 순서 같은 것은 거의 없었다 ㅡ.ㅡ^

최신 버전의 X-window를 설치하느라 꽤 삽질을 했었다. git, tar, jhbuild, deb 파일, apt-get, emerge 등....
결국은 jhbuild에서도 컴파일 에러를 수정해가면서 되게 했다.



위 동영상과 같이 두 개의 USB 마우스에서 두 개의 포인터는 나오게 했지만, 결국 두 개의 이벤트를 동시에 보여주는 프로그램이 없는 관계로 이정도로... 위 과정이 되기에도 꽤 많은 삽질이 있어서 아래에 기록해본다.

- http://www.x.org/wiki/JhBuildInstructions 페이지를 참고하여 jhbuild를 이용해서 빌드를 시작했다.
   # jhbuild -f modular-jhbuildrc build xserver xf86-video-nv xf86-input-keyboard
                                xf86-input-mouse
xorg-drivers xorg-libs xorg-apps

- 컴파일 과정에서 xf86Version.h 파일이 없다는 메시지가 자주 나와서, 그냥 /usr/include/xorg/xf86Version.h으로 지정해버렸다. 같은 디렉토리에 있는 어떤 파일들도 잘 참조가 되지 않아, 어찌어찌 통과하는 방향으로 했다. 중간에 asm/@!@!@.h 파일은 그냥 무시하고,..

- 기본 디렉토리(prefix)는 /root/xorg로 잡혀있으며, 해당 디렉토리/bin 에 startx 가 있는지 확인해야 하며, 없으면 다시 컴파일 시도한다.;;

- xorg.conf 파일의 작성... 여기서 실제로 많이 막혔다. 그래서 다시 컴파일하여 mouse와 keyboard 드라이버를 재로딩했다.

Section "ServerLayout"
        Identifier     "X.org Configured"
        Screen      0  "Screen0" 0 0
        #InputDevice    "Mouse0" "CorePointer"
        InputDevice    "Mouse0" "SendCoreEvents"
        InputDevice    "Mouse1" "SendCoreEvents"
        InputDevice    "Keyboard0" "CoreKeyboard"
        #InputDevice    "Keyboard0" "SendCoreEvents"
        Option         "AllowEmptyInput" "off"
        Option         "AutoAddDevices" "off"
EndSection

Section "Files"
        ModulePath   "/root/xorg/lib/xorg/modules"
        FontPath     "/usr/share/fonts/misc/"
        FontPath     "/usr/share/fonts/TTF/"
        FontPath     "/usr/share/fonts/OTF"
        FontPath     "/usr/share/fonts/Type1/"
        FontPath     "/usr/share/fonts/100dpi/"
        FontPath     "/usr/share/fonts/75dpi/"
EndSection

Section "Module"
        Load  "dbe"
        Load  "dri"
        Load  "record"
        Load  "extmod"
        Load  "xtrap"
        Load  "glx"
EndSection

Section "InputDevice"
        Identifier  "Keyboard0"
        Driver      "kbd"
        Option      "XkbRules" "xorg"
        Option      "XkbModel" "pc105"
        Option      "XkbLayout" "us"
EndSection

Section "InputDevice"
        Identifier  "Mouse0"
        Driver      "mouse"
        #Option     "Protocol" "PS/2"
        Option      "Protocol" "auto"
        #Option     "Protocol" "ExplorerPS/2"
        #Option     "Protocol" "IMPS/2"
        Option      "Device" "/dev/input/mouse1"
        #Option     "Device" "/dev/input/mice"
        #Option      "Device" "/dev/input/by-path/pci-0000:00:1d.0-usb-0:1:1.0-e
vent-mouse"
        #Option      "Device" "/dev/input/event2"

        Option      "ZAxisMapping" "4 5"
        #Option     "ZAxisMapping" "4 5 6 7"
        #Option      "Emulate3Buttons" "no"
EndSection

Section "InputDevice"
        Identifier  "Mouse1"
        Driver      "mouse"
        Option      "Protocol" "auto"
        #Option     "Protocol" "ExplorerPS/2"
        Option      "Device" "/dev/input/mouse2"
        Option      "ZAxisMapping" "4 5"
EndSection

Section "Monitor"
        #DisplaySize      380   300     # mm
        Identifier   "Monitor0"
        VendorName   "SAM"
        ModelName    "SyncMaster"
        HorizSync    30.0 - 81.0
        VertRefresh  56.0 - 75.0
        Option      "DPMS"
EndSection

Section "Device"
        ### Available Driver options are:-
        ### Values: <i>: integer, <f>: float, <bool>: "True"/"False",
        ### <string>: "String", <freq>: "<f> Hz/kHz/MHz"
        ### [arg]: arg optional
        #Option     "SWcursor"                  # [<bool>]
        #Option     "HWcursor"                  # [<bool>]
        #Option     "NoAccel"                   # [<bool>]
        #Option     "ShadowFB"                  # [<bool>]
        #Option     "UseFBDev"                  # [<bool>]
        #Option     "Rotate"                    # [<str>]
        #Option     "VideoKey"                  # <i>
        #Option     "FlatPanel"                 # [<bool>]
        #Option     "FPDither"                  # [<bool>]
        #Option     "CrtcNumber"                # <i>
        #Option     "FPScale"                   # [<bool>]
        #Option     "FPTweak"                   # <i>
        #Option     "DualHead"                  # [<bool>]
        #Option     "ShadowFB"                  # [<bool>]
        #Option     "UseFBDev"                  # [<bool>]
        #Option     "Rotate"                    # [<str>]
        #Option     "VideoKey"                  # <i>
        #Option     "FlatPanel"                 # [<bool>]
        #Option     "FPDither"                  # [<bool>]
        #Option     "CrtcNumber"                # <i>
        #Option     "FPScale"                   # [<bool>]
        #Option     "FPTweak"                   # <i>
        #Option     "DualHead"                  # [<bool>]
        Identifier  "Card0"
        Driver      "nv"
        VendorName  "nVidia Corporation"
        BoardName   "NV18 [GeForce4 MX 440 AGP 8x]"
        BusID       "PCI:1:0:0"
EndSection

Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "Monitor0"
        SubSection "Display"
                Viewport   0 0
                Depth     1
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     4
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     8
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     15
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     16
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     24
        EndSubSection
EndSection


위에 살펴보면 알겠지만,
 1. Option "AllowEmptyInput" "off" 이 없으면 시작할 때 에러가 발생했다. (최신 버전에만 그러는 듯)
 2. ModulePath "/root/xorg/lib/xorg/modules" 도 꽤나 중요하다.
     나는 /root/xorg에 설치했기 때문에, 모든 모듈들이 해당 디렉토리 내에 존재했었다.
 3. InputDevice "Mouse0" "SendCoreEvents" 는 마우스 두개가 될 경우, 이벤트를 따로 발생하라는 의미이다.
     원래 하나의 포인터로 사용할 때에는 "CorePointer" 값이다.

- 위 설정대로 x-window가 실행되는지 해봐야 한다. (/root/xorg/bin 내에 있는 startx 나 xinit가 실행되도록 유도해야 한다.)
  # export PATH=/root/xorg/bin:$PATH
  # export LD_LIBRARY_PATH=/root/xorg/lib
  # startx -- -verbose 6

- 나오는 메시지를 잘 살펴보고, 에러가 있으면 나름대로 해결해야 한다. 나에게는 xcb 관련 에러가 발생했는데, 이미 gentoo 패키지 시스템인 emerge를 이용해서 x-window를 /usr에 설치된 상황이기 때문에 이곳에 있는 xcb 자료를 복사해서 사용했다.
  # cp -ap /usr/share/X11/xkb/* /root/xorg/share/X11/xkb/

- 마우스 관련 에러도 많이 나왔었다. 이것은 실제로 /dev/input/mouse1에 접근해보는 것으로 실제 동작하는 지 알 수 있다.
  # cat /dev/input/mouse1  (실행한 상태에서 마우스를 움직이거나 클릭해본 후, 이상한 쓰레기 값이 나오면 동작하는 것이다)
   물론, 두번째 마우스는 /dev/input/mouse2 가 될 것이다. 여기서 동작하는 값으로 xorg.conf 에 설정해주어야 하는 것은 당연하다.
   (원래 보통 /dev/input/mice로 되어 있을 것이다.)

- 이제 에러를 해결했으면, x-window가 정상적으로 뜰 것이다. 아직 포인터가 하나 뿐일 것이다.
   xinput를 통해 설정을 해주어야 하기 때문이다. (x-window 내 xterm이 띄워져 있을 것이다. 그 안에서 실행해야 한다.)
  # xinput --list --short
  "Virtual core pointer"  id=0    [XPointer]
  "Virtual core keyboard" id=1    [XKeyboard]
  "Virtual core Xtst pointer"     id=2    [XExtensionPointer]
  "Virtual core Xtst keyboard"    id=3    [XExtensionKeyboard]
  "Mouse0"        id=4    [XExtensionPointer]
  "Mouse1"        id=5    [XExtensionPointer]
  "Keyboard0"     id=6    [XExtensionKeyboard]
  "Mouse0"        id=7    [XExtensionPointer]
  # xinput --create-master "foobar"
  # xinput --reattach "Mouse1" "foobar pointer"
    (foobar pointer로 방향을 바꾸는 것으로 따로 동작이 가능해진다)

- 아래와 같이 포인터 두 개가 나오면 성공한 것이다.

포인터 두개 모습

I 포인터 두개의 모습



포인터 두개 모습

X 포인터 두개의 모습



동작이 제대로 되는지 확인하기 위해 나는 emerge gimp로 gimp를 설치하였다. 하지만, 아직, 한 쪽 마우스가 클릭한 상태에서 다른 마우스 클릭이 제대로 먹히지 않는데, 아마도 /dev/input/mice와 같이 중첩사용되는 장치 이벤트만 처리하나 보다. 아직 모르겠다.

- 마지막으로 이 xinput를 개발한 사람 블로그(?)에 샘플 소스가 있어서 컴파일을 해보았다.
  * 사이트 : http://wearables.unisa.edu.au/mpx/?q=xi2_sample
  # gcc -o xi2_sample xi2_sample.c `pkg-config --cflags --libs xi`
    -I/root/xorg/include -L/root/xorg/lib


참고 사이트 정보 :
1. http://live.gnome.org/Metacity/MpxHowto - How to install MPX and Metacity
2. http://wearables.unisa.edu.au/mpx/ - MPX 공식 홈페이지
3. http://www.x.org/wiki/JhBuildInstructions - JhBuildInstructions 설치방법

p.s. 이젠 멀티터치 디바이스 드라이버를 제작하기만 하면 된다 ㅡ.ㅜ
Posted by wbhacker :

누구에게 쫓기는 것도 아니고 그렇다고, 누구를 찾는 상황도 아닙니다만 -물론 보고 싶은 사람들은 있죠 ㅎㅎ-, 아는 형께서 가출한 학생의 위치를 찾아 달라고 했습니다.

물론, 미천한 바닥의 실력으로 시도를 해보았습니다. (몇시간을 그렇게 인터넷에서 허덕였죠)
결론적으로, 정보를 제공해주는 회사가 아니면 기타 정보(?) 정도 밖에 알아내지 못하다는 판단이 들었습니다.

그럼 어디까지 알아낼 수 있을까요?
국내 사이트, 국외 사이트를 뒤적거려본 결과, 인터넷에서 위치를 표시해주는 서비스가 있었습니다.

1) 먼저, IP를 제공하는 ISP(Internet Service Provider, 한국통신이나 하나로통신과 같은 업체)를 통해 기본적인 정보 습득이 가능합니다.
   - 사이트 : http://whois.nic.or.kr

whois 조회 결과


이 정보를 바탕으로 어느 정도 판단이 가능합니다. 바로 기관명을 보고 말이죠.
“KT전주지사”면 무엇일까요? 추측 가능한 곳은 바로 유동 IP 사용하는 곳입니다. 어디어디가 있을까요?
생각해보면 일반 가정집, 아파트, 모텔, 고시원 등이 있겠죠?

아래 그림은 기관명으로 어떻게 판단하는지를 알려드리기 위해 추가적으로 검색 결과 올립니다.

다음으로 얻을 수 있는 정보를 알아보겠습니다.

2) 위 정보가 부족할 경우, 따로 IP 정보를 데이터베이스화한 곳에서 검색이 가능합니다. 물론 위 정보와 동일할 수 있습니다.
   - 사이트 : http://www.ipsearch.co.kr


사실 위에 있는 정보로 조회가 안되는 경우도 있습니다.
해외 IP주소인 경우이죠. 그건 외국 whois 서버를 찾으시면 같은 방식으로 검색이 가능합니다. ^^
proxy 서버(공유기와 같은 사설망 포함)를 사용하는 경우에는 외부 IP 하나만을 사용하게 되므로, 물론 직접적인 접근을 막을 순 있겠지만 그 기관에 속해있는 것이므로 결국은 어느 정도 접근이 된 것이죠.

제가 추측하기에는 이 이상의 정보는 해당 ISP의 DHCP 서버나 DNS 서버 등에 자료가 있을 것으로 보입니다. 거기에도 나름대로 인증 시스템이 갖추어져 있기 때문이죠. 사용자 누가 어떤 IP를 몇시에 할당받았다 정도.. 실제로 보지 않아서 모르겠습니다. ^^

3) 지도로 나오는 서비스가 있습니다. 하지만, 아직 한국은 지원이 미흡한 실정입니다.
   - 사이트 : http://www.ip-adress.com/ip_tracer/

위치 검색 결과


보시면, 현혹되기 쉽습니다만, 이것도 결국 유료 서비스입니다. ^^ 그리고, 저 서비스는 위에서 소개해드린 whois 서비스에서의 주소 정보를 바탕으로 구글맵에 표시하는 역할 밖에 없습니다. (이것으로 돈을 받는다니... 이 이상의 서비스가 있는지는 모르겠습니다) 우리나라 정보가 구축되어 있지 않아, 검색 결과가 서울 밖에 안나오는 것으로 알고 있습니다. 인터넷의 다른 포스팅들을 보니, 실제 검색했다는 얘기도 있는데, (두 군데 정도 있었음) 그게 실제로 된 것인지 조작인지는 알 길이 없습니다.

자세한 위치 검색 결과


좀 더 자세한 검색을 한 것입니다만, 이 페이지는 기본적으로 오류가 발생할 겁니다. 한글에 대한 인코딩 때문인데, 유니코드(UTF-8)로 설정하면 잘 나올 겁니다. ^^ 하지만, 여전히 제대로된 정보인지는 모릅니다. 그리고 IP에서 체크가 이루어지는 것 같습니다. 저는 현재, 10번 이상의 IP 검색으로 무료 검색이 차단된 상태인 듯 하군요~ (순전히 결과로 판단한 거라 신빙성이 없습니다)

어떤 사이트를 보면, 위 그림과 같이 자신의 위치를 그려놓고, 얼마 차이 안 남는 것으로 보인다고 알려줍니다. 위에서 본 것과 같이 바로 whois 조회 결과의 주소가 지도에 표시됨과 차이가 없음을 알 수 있죠. 뭐 위 결과가 제대로 나온 것이라고도 말씀 드리기 어렵긴 합니다.

구글링해서 IP TRACER와 같은 키워드로 검색을 하면, 자료가 수두룩하게 나옵니다. 거의 대부분의 자료가 TraceRoute (리눅스에선 traceroute, 윈도우에선 tracert 명령 이용)를 통해서 해당 IP까지의 경로를 보는 것으로 추적이 가능하다고 합니다. 좀 어처구니가 없죠? ^^

tracert 사용


단순히 현재 패킷이 가능 경로일 뿐인데 말이죠. 결론적으로, 우리가 왜 라우터들의 위치를 알아야 되느냐고 반문할 수 있습니다.
네트워크 속도나 경로(방화벽 확인 등)를 체크할 경우에는 사용할 수 있겠죠.

아, 처음에 IP는 어떻게 알아내는지는 검색하시면 쉽게 나올 겁니다. 간단하게 언급하면, 그 사람이 보낸 이메일의 헤더, 메신저 로그인 했을 때 파일 주고 받기 등을 통해서 알 수 있다고 하는 군요... 저는 실제로 필요성을 못 느껴서 안해봤기 때문에 잘 모르겠습니만, 우리가 언제 IP의 기록이 남는지 잘 살펴보면 알 수 있겠죠.ㅎㅎ

다음 메일 헤더


그럼 다시 원래대로 가출한 학생의 위치는 어떻게 찾을 수 있을까요? 위치를 찾아주는 업체도 있었습니다. 약 20만원의 비용을 요구하지만... 이용하신 분의 후기가 궁금하군요. 아마도 위에서 잠시 기술했던 ISP 업체의 도움이 있지 않을까 생각이 듭니다. 그리고 사용자가 자주 접근하는 사이트 관리자에게 요청을 하겠죠.

이 이상의 정보는 구하기 어렵다고 보는 게, 제 현재의 입장입니다. 이 이상의 정보를 구할 수 있거나 가능하다는 분 계신가요? ^^
혹시 있을지 모르는, 아무도 모르는 KT에서 제공하는 DNS 정보 검색 사이트 같은 거 말이죠 ㅋ

Posted by wbhacker :

내가 만드는 프로그램에 문제점이 있다.
이 프로그램의 목적은 도스에서도 여러개의 화면 전환이 이루어지게끔 하는 것이다. 프로그램이 수행되지 않는 상황에서 화면 전환은 쉽게 이루어진다. 하지만, 프로그램이 이미 수행중에 있는 상태에서 화면 전환을 시도하면 어떻게 되는가?
간단히 계속 Blocking 되고 있는 것이다. 입력을 해도, 이전에 수행되고 있는 프로그램의 입력으로 쏙 들어가 버린다. 이것은 리눅스의 기본 Console이나 screen 명령에서 지원되는 수준에 훨씬 못 미치는 수준으로 밖에 안보인다. 스크립트 수준...

그래서, 이 프로그램은 태스크 전환을 시도하며, 그것을 위해서 두개의 태스크를 생성한다. Task1과 Task2가 있는데, 간단히 말하면, Task1은 화면에 무한적으로 '2'라는 값을 출력하는 것이고, Task2는 입력되는 문자를 화면에 바로 뿌려주며, 그에 맞춰서 ASCII 코드를 0부터 차례대로 출력을 한다.

본 프로그램을 수행하면 Task1을 수행하게 된다. 그리고 F2키를 누르면, Task2로 전환이 이루어지는데, 화면과 프로그램이 동시에 전환이 되는 것이다.
이 상황에서 F1키를 눌러, Task1로 전환을 시도하면 잘 변환이 된다. 그리고 다시 F2키를 눌러, Task2로 전환을 시도하면 되지 않는다.

이것의 문제점을 파악하기 위해서 SoftIce를 이용하였다. F1이나 F2키에 의해서 수행되는 소스 위치에 break point를 지정하여 간단히 살펴볼 수 있었다.

결과는 내가 임의로 지정한 스택의 공간을 사용하지 않는 데서 따른 문제였다. 하지만 ISR을 수행하게 될 때는, 인터럽트가 발생되는 시점에 수행중인 프로그램의 CS:IP를 현재 사용중인 SS:SP에 저장을 하는 것이라서, 예측이 불가능한 상황에 ISR로 들어가는 것이 된다.

다시 처음부터 코드 레벨로 설명을 하면,

Task1는 CS=2A8E인 공간에 있고, Task2는 CS=4000인 공간에 할당되어 있다. Task1이 수행되는 상황에서 F2키에 의해서 ISR로 들어가게 되는데, 이 때는 SS=2A8E이기 때문에, Task1이 위치한 공간에 CS:IP(복귀주소)가 저장된다. 그리곤 Task2로 스위칭이 되는데, 이 때는 Task2를 생성하면서 미리 저장해놓은 스택공간(SS=4000)을 사용하여 pop이 이뤄지기 때문에, 복귀주소인 CS:IP도 SS=4000에 위치하게 된다. 결국, SS=4000, CS=4000 인 공간으로 전환이 이루어져 Task2는 수행되게 되는 것이다.

이젠 CPU는 Task2를 수행하고 있으며, CS=4000인 공간에 있다. 이 상황에서 Task1로 가기 위해서는 F1키를 눌러서 ISR로 들어가게 되는데, 인터럽트 발생되는 시점이 코드 수행 시점인데, CS가 4000이 아니라, 00C9가 되어 있다. 어쩔 수 없이 SS=00C9가 되며, 따라서 그 공간에 복귀주소인 CS:IP가 저장되게 된다. 결국 Task2가 ISR로 들어올 때는 CS=00C9이며, Task1로 전환된 후에, 다시 Task2로 전환되려고 할 때, 이 공간 CS=00C9의 스택공간 SS=00C9를 사용하게 된다. 근데, 문제는 주소가 아니라, 그 안에 내용이었다.

바껴서는 안될 스택 공간 내용이 어느새 바뀌어져 있는 것이다. 이 결과는 당연히 메모리 접근 문제로 발생될 수 밖에 없는 것이다.

직접 노트에 기록한 것을 보면 다음과 같다.

Task1에서 F2키에 의해서 Task2로 전환이 된 후,
F1키 눌렀을 때 Break Point에 의해서 멈춤
( CS:IP = 11CD:0397 [_my_proc 처음위치] )
이 때의 스택값
( SS:SP = 00C9:0A7A [내가 지정한 위치가 아님] )
---------------------------------------------------------
          00 01 02 03 04 05 06 07-08 09 0A 0B 0C 0D 0E 0F
00C9:0A70 .......................... C9 00 8F 84 97 2E
00C9:0A80 C8 FC 02 32 F7 2F B2 FC-01 01 02 01 F0 FF 00 40
00C9:0A90 B5 60 00 ......................................
---------------------------------------------------------
아무튼, 그래도 Task1로 전환이 되었다. 이것은 복귀값이 Task1의 스택공간을 사용했기 때문에, 문제가 없는 것이다.
Task2로의 전환을 위해,
F2키를 눌렀을 때 Break Point에 의해서 멈춤
 ( CS:IP = 11CD:0397 [_my_proc 처음위치] )
 이 때의 스택값 또한 내가 예상한 값들로 채워져 있었다.
 ( SS:SP = 2A8E:FFEE [내가 지정한 위치임] )
 TASK_SW 소스 수행....
 Task sw 준비
  ( SS:SP = 11CD:0260 [예상한 위치임] )
  pushf
  pusha
  .....
  ( SS:SP = 11CD:0244 [예상한 위치임] )
 SS:SP 교체로 Task sw 유도함
  ( saved_sp1 <- 11CD:0244
    SS:SP <- saved_sp2 (11CD:0344) )
  .....
  popa
  popf
  ( SS:SP = 11CD:0360 [예상한 위치임] )
 ISR 종료를 위해 코드수행 복귀주소의 반환을 위해서
 SS과 SP를 설정하는데, 이것은 저장되어 있는 SS:SP값으로 00C9:0A74가 되었다.
  pop dx ; ffff
  pop bx ; 3816
  pop cx ; 0000
---------------------------------------------------------
          00 01 02 03 04 05 06 07-08 09 0A 0B 0C 0D 0E 0F
00C9:0A70 00 00 63 06 FF FF 16 38-00 00 00 00 12 09 00 40
00C9:0A80 0D 01 32 02 4E 60 42 FF-46 32 C9 00 00 00 00 61
---------------------------------------------------------

스택값은 어느새 이렇게 바껴있었다. 위에 그려진 메모리와는 너무나 다르지 않은가...
나는 저 공간(00C9 Segment)을 사용하고 싶지 않다. 그렇지만, 키 입력이 들어가 있는 프로그램에서 인터럽트가 걸리면, 수행중인 프로그램이 아닌, 내부적인 코드 위치에서 바로 ISR로 들어가 버리는 것 같다. 그래서 cli나 sti 명령을 이용해서 키 입력 부분 AH=01/INT 21H에 감싸서 해봤지만, 소용이 없었다. 어차피 소프트웨어 인터럽트이기 때문인 것 같다. cli 명령에 의해서 영향을 받지 않기 때문이다. 또한 내부적으로 sti 해버리면 소용이 없지 않은가...

저 공간을 사용하지 않고 바로 Task1에서와 같이 전환이 된다면 문제가 없을텐데... 실제로 Task1과 비슷한 Task2를 수행했을 때에는 태스크 전환이 잘 이루어졌다.

http://asmlove.co.kr/zBdC7/viewtopic.php?t=1326 에도 질문을 방금 올렸었는데, 아직 답변이 없다. 결국 해결이 안될까?

Posted by wbhacker :