как такое может быть вообще?

Тема в разделе "WASM.UNIX", создана пользователем CLG, 9 ноя 2010.

  1. CLG

    CLG New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2010
    Сообщения:
    7
    код примерно такой -

    mov byte [ebx+10],0 ; тут ebx указывает на буффер в памяти

    бла бла бла pthread_create

    push 300000
    call usleep
    add esp,4

    push dword [ebx+10] ; тут всё тот же ebx

    как бы всё работает...
    но вот один раз вывесилось на push dword [ebx+10], причём ebx имел значение указывающее куда то в жопу (0xFF**)

    если бы он изначально был неверный, то ошибка был бы на 10 инструкций раньше (см начало)
    получается pthread_create или usleep изменили значение ebx - такое разве допускается?
     
  2. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    эм, тред получает буфер из глобальной переменной?
     
  3. CLG

    CLG New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2010
    Сообщения:
    7
    буффер выделяется из большого блока предвыделенной памяти
    выделения-освобождения физически не происходит и память лежит уж точно не на (0xFF**)
    в любом случае получается что в процессе выполнения двух функций ebx изменился.
    я смотрел их обе - вообщем то они у себя сохраняют и восстанавливают регистры, другое дело нет ли там багов в либах и нет ли ситуация когда прерывание чем то выполнения функции не влечёт восстановление состояния регистов
     
  4. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    CLG
    Я подумал, и не придумал способа как функция может обойти pushad/popad. То есть она конечно же может, но для этого надо специально заморачиваться, случайно это не выйдет, тем более если писать на C. Можно ещё предположить что компилятор C глючный, но я не думаю что влияет это.

    Собственно идей у меня нет, почему так может случаться. Может код у тебя как-то неявно меняет %ebx? Я не припомню инструкций, которые могут _неявно_ менять %ebx, но всё же. Обычно неявно меняется %edx, скажем при idiv. Да и если функцию ты вызывал, которая long long возвращает, то тоже менялся бы %edx. Да и эпизодичность проявления бага, как бы намекает на войны потоков.
    А что за реализация pthreads используется? Там точно kernel-space потоки, или что-нибудь юзерспейсное в стиле libpth?
    Кстати, а ядерные потоки где сохраняют контекст при переключении? В ядерном адресном пространстве, или на стеке потока? Любопытный вопрос, будет время, я гляну. А ты посмотри -- нигде у тебя нет какого-нибудь переполнения буфера, может ты сам затираешь сохранённое значение %ebx контекста?

    ps. Сорри за поток сознания, но я без идей, и судя по всему остальные -- тоже.