_chkstk и Линукс

Тема в разделе "WASM.UNIX", создана пользователем synapse, 13 янв 2006.

  1. synapse

    synapse New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2005
    Сообщения:
    5
    У меня есть функция внутри которой создается массив.

    Так вот в виндовсе я просто записывал в регистр eax необходимое количество байт и вызываю _chkstk и она резервирует мне память в стеке.

    Подскажите что мне делать для того чтобы зарезервировать стековую память линуксе.
     
  2. ssx

    ssx Member

    Публикаций:
    0
    Регистрация:
    19 авг 2003
    Сообщения:
    336
    я думал _chkstk компилер сам использует, а нормальные люди ее не вызывают ?
     
  3. synapse

    synapse New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2005
    Сообщения:
    5
    Я говорю об ассемблере, как он может узнать сколько мне потребуется стековой памяти?
     
  4. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    _chkstk проверяет значение стэка до и после вызова процедуры

    и ничего никуда не выделяет для выделения места в стеке надо передвинуть указатель стека и использовать это протсранство по своему усмотрению.



    обычно это что - то вроде

    mov esp, ebp ;save old stack frame

    sub esp,sizeofstackvariables



    ...

    mov esp,ebp;

    [add esp,sizeof_stack_parameters ];optional

    ret





    что в линуксе , что в виндовсе , что в os kuku
     
  5. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    staier

    _chkstk гарантирует тебе что при выделении слишком большого куска стековой памяти ты не получил AV при обращении к отсутствующей странице.
     
  6. synapse

    synapse New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2005
    Сообщения:
    5
    В виндовс:_chkstk выделяет память маленькими страничками (4кб).

    В линукс: также есть одноименная функция но она просто выполняет проверку на buffer overflow.



    В чем проблема, у меня есть кусок кода на ассемблере который я скомпилировал nasm'ом. В винде все работает прекрасно, а вот при переносе в линукс вылетает segmentation faulth.

    При переносе единственное что я поменял это

    _chkstk

    на

    sub esp,stack_size



    Может конечно причина не в этом...
     
  7. synapse

    synapse New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2005
    Сообщения:
    5
    ps: почему сомнения потому что я не знаю как в линуксе выделяется память может там тоже надо постранично(хотя пробовал не помогло).

    Для справки: мне всего надо 16кб стековой памяти...
     
  8. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    Копай мануал на sys_brk и sys_mmap. Правда, не знаю насчет стэка.
     
  9. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    synapse
    Код (Text):
    1.  
    2. ;_chkstk - check stack upon procedure entry
    3. ;
    4. ;Purpose:
    5. ;       Provide stack checking on procedure entry. Method is to simply probe
    6. ;       each page of memory required for the stack in descending order. This
    7. ;       causes the necessary pages of memory to be allocated via the guard
    8. ;       page scheme, if possible. In the event of failure, the OS raises the
    9. ;       _XCPT_UNABLE_TO_GROW_STACK exception.
    10. ;
    11. ;       NOTE:  Currently, the (EAX < _PAGESIZE_) code path falls through
    12. ;       to the "lastpage" label of the (EAX >= _PAGESIZE_) code path.  This
    13. ;       is small; a minor speed optimization would be to special case
    14. ;       this up top.  This would avoid the painful save/restore of
    15. ;       ecx and would shorten the code path by 4-6 instructions.
    16. ;
    17. ;Entry:
    18. ;       EAX = size of local frame
    19. ;
    20. ;Exit:
    21. ;       ESP = new stackframe, if successful
    22. ;
    23. ;Uses:
    24. ;       EAX
    25. ;
    26. ;Exceptions:
    27. ;       _XCPT_GUARD_PAGE_VIOLATION - May be raised on a page probe. NEVER TRAP
    28. ;                                    THIS!!!! It is used by the OS to grow the
    29. ;                                    stack on demand.
    30. ;       _XCPT_UNABLE_TO_GROW_STACK - The stack cannot be grown. More precisely,
    31. ;                                    the attempt by the OS memory manager to
    32. ;                                    allocate another guard page in response
    33. ;                                    to a _XCPT_GUARD_PAGE_VIOLATION has
    34. ;                                    failed.
    35. ;
    36. ;********************************************************************* **********
    37.  
    38. public _alloca_probe
    39.  
    40. _chkstk proc
    41.  
    42. _alloca_probe    =  _chkstk
    43.  
    44.         cmp     eax, _PAGESIZE_         ; more than one page?
    45.         jae     short probesetup        ;   yes, go setup probe loop
    46.                                         ;   no
    47.         neg     eax                     ; compute new stack pointer in eax
    48.         add     eax,esp
    49.         add     eax,4
    50.         test    dword ptr [eax],eax     ; probe it
    51.         xchg    eax,esp
    52.         mov     eax,dword ptr [eax]
    53.         push    eax
    54.         ret
    55.  
    56. probesetup:
    57.         push    ecx                     ; save ecx
    58.         lea     ecx,[esp] + 8           ; compute new stack pointer in ecx
    59.                                         ; correct for return address and
    60.                                         ; saved ecx
    61.  
    62. probepages:
    63.         sub     ecx,_PAGESIZE_          ; yes, move down a page
    64.         sub     eax,_PAGESIZE_          ; adjust request and...
    65.  
    66.         test    dword ptr [ecx],eax     ; ...probe it
    67.  
    68.         cmp     eax,_PAGESIZE_          ; more than one page requested?
    69.         jae     short probepages        ; no
    70.  
    71. lastpage:
    72.         sub     ecx,eax                 ; move stack down by eax
    73.         mov     eax,esp                 ; save current tos and do a...
    74.  
    75.         test    dword ptr [ecx],eax     ; ...probe in case a page was crossed
    76.  
    77.         mov     esp,ecx                 ; set the new stack pointer
    78.  
    79.         mov     ecx,dword ptr [eax]     ; recover ecx
    80.         mov     eax,dword ptr [eax + 4] ; recover return address
    81.  
    82.         push    eax                     ; prepare return address
    83.                                         ; ...probe in case a page was crossed
    84.         ret
    85. _chkstk endp
    86.  
     
  10. green5

    green5 New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    29
    Адрес:
    Protvino
    Не это?

    #include <stdio.h>

    #include <stdlib.h>

    main()

    {

    void *p1,*p2;

    int esp=0;

    p1=alloca(4096);

    __asm__("mov %%esp,%0":"=g"(esp));

    p2=alloca(4096);

    printf("%08x: %08x %08x\n",esp,p1,p2);

    return 0;

    }

    $ gcc stk.c

    $ ./a.out

    bff6ec00: bff6ec00 bff6dc00