Сегментные регистры

Тема в разделе "WASM.BEGINNERS", создана пользователем Zmiy, 10 июл 2008.

  1. Zmiy

    Zmiy New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2007
    Сообщения:
    29
    Объясните пожалуйста, как и для чего в win32 приложениях могут использоваться сегментные регистры?
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    для описания сегмента (указания номера дескриптора и его расположения). хотя можно там просто какоето левое число хранить, что накладывает ограниченей на их использование
     
  3. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    CS, DS, ES, SS меняться по-хорошему не должны: с их помощью, собсно, программа и работает в плоском адресном пространстве. FS меняться тоже не должен -- ссылается на локальную память потока. Остаётся свободным только GS, насколько знаю.

    Но вообще сегментные регистры фактически бесполезны.
     
  4. Zmiy

    Zmiy New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2007
    Сообщения:
    29
    И зачем это нужно?

    Что значит с их помощью?

    Вот например в одной статье на этом сайте написано:
    И где-то ещё я что-то подобное слышал. Хотелось бы понять, что это значит.
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Zmiy
    Почитай про работу процессора в защищенном режиме.
     
  6. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Zmiy
    Всё это значит, что сегментные регистры никуда не испарились и свои функции выполняют, но программисту использовать их явным образом нужды нет: их содержимое установлено системой, а менять их в ходе работы никакой нужды нет. Это не 16-разрядная адресация, когда для получения доступа к памяти, превышающей по объёму 64 килобайта, программисту приходилось менять содержимое сегментных регистров.

    Исключением -- как раз в сУрьезных программах -- является регистр FS, поскольку таким программам может потребоваться доступ к локальной памяти потока, которая через этот регистр и адресуется. Но на асме настолько сУрьезные программы обычно не пишутся, а в случае ЯВУ обо всём позаботится компилятор.

    Ну а вообще Pavia правильный совет дал, и я могу разве что присоединиться к нему да дополнить: следует хорошо понять, как процессор вообще эти самые сегментные регистры использует и в реальном, и в защищённом режимах.
     
  7. Zmiy

    Zmiy New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2007
    Сообщения:
    29
    SII
    Pavia
    Спасибо
     
  8. Osen

    Osen Рие

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    283
    Адрес:
    Париж
    Ребята FS никогда не указывал на локальную память потока. Базовый адрес сегмента описующего регистром FS указывает на структуру TEB (TIB). Локальная память потока это немножко из другой оперы.
     
  9. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    А что в TEB находится? Не информация ли, уникальная для данного потока, а не процесса целиком? Хотя формально я действительно неправ: FS не указывает прямо на локальную память потока.
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    SII
    Локальная память потока это TLS.
    А TEB это блок среды потока.
     
  11. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    И что в этом блоке помимо инфы, связанной с обработкой исключений?
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    SII
    Хорошо спросил, что тут скажешь..
    Код (Text):
    1. TEB struct
    2. Tib             NT_TIB <>       ;00h
    3. EnvironmentPointer      PVOID ?         ;1Ch
    4. Cid             CLIENT_ID <>        ;20h
    5. RpcHandle           PVOID ?         ;28h        [ActiveRpcInfo]
    6. ThreadLocalStorage      PVOID ?         ;2Ch
    7. Peb             PPEB ?          ;30h
    8. LastErrorValue          ULONG ?     ;34h
    9. CountOfOwnedCriticalSections    ULONG ?     ;38h
    10. CsrClientThread         PVOID ?         ;3Ch
    11.  Win32ThreadInfo_       PVOID ?         ;40h        [struct _W32THREAD* Win32ThreadInfo]  
    12.  Win32ClientInfo_       ULONG 1Fh DUP (?)   ;44h
    13. WOW32Reserved       PVOID ?         ;C0h
    14. CurrentLocale           ULONG ?     ;C4h        [LCID CurrentLocale]
    15. FpSoftwareStatusRegister    ULONG ?     ;C8h
    16. SystemReserved1     PVOID 36h DUP (?)   ;CCh
    17. ExceptionCode           LONG ?          ;1A4h
    18. ActivationContextStack      ACTIVATION_CONTEXT_STACK <>     ;1A8h
    19. SpareBytes1             UCHAR 18h dup (?)   ;1BCh
    20. GdiTebBatch             GDI_TEB_BATCH <>    ;1D4h
    21. gdiRgn              ULONG ?     ;6A8h
    22. gdiPen              ULONG ?     ;6ACh
    23. gdiBrush                ULONG ?     ;6B0h
    24. RealClientId            CLIENT_ID <>        ;6B4h
    25. GdiCachedProcessHandle      PVOID ?         ;6BCh
    26. GdiClientPID            ULONG ?     ;6C0h
    27. GdiClientTID            ULONG ?     ;6C4h
    28. GdiThreadLocaleInfo     PVOID ?         ;6C8h
    29. Win32ClientInfo         PVOID 3Eh dup (?)   ;6CCh
    30. glDispatchTable         PVOID 0E9h dup (?)  ;7C4h
    31. glReserved1             ULONG 1Dh dup (?)   ;B68h
    32. glReserved2         PVOID ?         ;BDCh
    33. glSectionInfo           PVOID ?         ;BE0h
    34. glSection           PVOID ?         ;BE4h
    35. glTable             PVOID ?         ;BE8h
    36. glCurrentRC         PVOID ?         ;BECh
    37. glContext           PVOID ?         ;BF0h
    38. LastStatusValue         NTSTATUS ?      ;BF4h
    39. StaticUnicodeString     UNICODE_STRING <>   ;BF8h
    40. StaticUnicodeBuffer     WCHAR 106h DUP (?)  ;C00h
    41. DeallocationStack       PVOID ?                 ;E0Ch
    42. TlsSlots                PVOID 40h DUP (?)   ;E10h
    43. TlsLinks                LIST_ENTRY <>       ;F10h
    44. Vdm             PVOID ?         ;F18h
    45. ReservedForNtRpc        PVOID ?         ;F1Ch
    46. DbgSsReserved           PVOID 2h DUP (?)    ;F20h
    47. HardErrorDisabled       ULONG ?     ;F28h
    48. Instrumentation         PVOID 10h DUP (?)   ;F2Ch
    49. WinSockData         PVOID ?         ;F6Ch
    50. GdiBatchCount           ULONG ?     ;F70h
    51. InDbgPrint              BOOLEAN ?       ;F74h
    52. FreeStackOnTermination      BOOLEAN ?       ;F75h
    53. HasFiberData            BOOLEAN ?       ;F76h
    54. IdealProcessor              UCHAR ?     ;F77h
    55. Spare3              ULONG ?     ;F78h
    56. ReservedForPerf         ULONG ?     ;F7Ch  
    57. ReservedForOle          PVOID ?         ;F80h
    58. WaitingOnLoaderLock     ULONG ?     ;F84h
    59. Wx86Thread              Wx86ThreadState <>  ;F88h
    60. TlsExpansionSlots           PVOID ?         ;F94h
    61. ImpersonationLocale         ULONG ?     ;F98h
    62. IsImpersonating         ULONG ?     ;F9Ch
    63. NlsCache            PVOID ?         ;FA0h
    64. pShimData               PVOID ?         ;FA4h
    65. HeapVirtualAffinity         ULONG ?     ;FA8h
    66. CurrentTransactionHandle    PVOID ?         ;FACh
    67. ActiveFrame             PTEB_ACTIVE_FRAME <>;FB0h
    68. FlsSlots            PVOID ?         ;FB4h
    69. TEB ends
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Чтобы хранить селекторы=)
    читай интел маны. ну а расписанное выше - это обычное использование cs,ds,ss,es,fs..
     
  14. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Clerk
    Спасибо за содержательный ответ, точного описания у меня под рукой нет, а искать лень :)

    Как видим, в TEB есть поле ThreadLocalStorage, т.е. указатель на локальную память потока. Собсно, это я и имел в виду, но выразился, конечно, некорректно. Правильней было бы сказать, что FS позволяет обращаться к структуре данных, содержащей инфу для данного потока, в т.ч. и указатель на его локальную память.