Я начинающий программист, и у меня возникла проблема. Это проблема настолько общего характера, что это меня тревожит. Возможно, я выбрал неудачную тему для своего вопроса, поэтому заранее прошу прощения у модератора, если это так.
Итак, есть некий комплекс ПО (несколько программ и драйверов), которые работают на контроллерах под управлением (если я правильно понимаю) ОС DOS. Мне поручено разобраться в одной из этих программ, но вот затык: одна из самых важных функций в коде программы не вызывается. Вообще! Тем не менее, известно абсолютно точно, что она выполняется. И вот вопрос: каким образом? Есть предположение, что функция вызывается из другой программы, точнее из драйвера, т.к. эта программа работает в содружестве с драйвером — так ли это? Если да, то что это за механизм и где про него прочитать? Если нет, то как еще это объяснить?
16.09.09 11:49: Перенесено модератором из 'C/C++' — Кодт
Здравствуйте, Аноним, Вы писали:
А>Добрый вечер.
А>Я начинающий программист, и у меня возникла проблема. Это проблема настолько общего характера, что это меня тревожит. Возможно, я выбрал неудачную тему для своего вопроса, поэтому заранее прошу прощения у модератора, если это так.
А>Итак, есть некий комплекс ПО (несколько программ и драйверов), которые работают на контроллерах под управлением (если я правильно понимаю) ОС DOS. Мне поручено разобраться в одной из этих программ, но вот затык: одна из самых важных функций в коде программы не вызывается. Вообще! Тем не менее, известно абсолютно точно, что она выполняется. И вот вопрос: каким образом? Есть предположение, что функция вызывается из другой программы, точнее из драйвера, т.к. эта программа работает в содружестве с драйвером — так ли это? Если да, то что это за механизм и где про него прочитать? Если нет, то как еще это объяснить?
Оффтоп: угораздило же тебя, в век космических полетов на марс, и других великих откровений типа windows 7, начинать карьеру с DOS.
Здравствуйте, Аноним, Вы писали:
А>Добрый вечер.
А>Я начинающий программист, и у меня возникла проблема. Это проблема настолько общего характера, что это меня тревожит. Возможно, я выбрал неудачную тему для своего вопроса, поэтому заранее прошу прощения у модератора, если это так.
А>Итак, есть некий комплекс ПО (несколько программ и драйверов), которые работают на контроллерах под управлением (если я правильно понимаю) ОС DOS.
Что-то мне подозрительна MS-DOS на контроллерах. Можно подробнее про эти контроллеры ? Процессор там какой ?
>Мне поручено разобраться в одной из этих программ, но вот затык: одна из самых важных функций в коде программы не вызывается. Вообще! Тем не менее, известно абсолютно точно, что она выполняется. И вот вопрос: каким образом? Есть предположение, что функция вызывается из другой программы
Что еще за другая программа в DOS ? MS-DOS — однопрограммная ОС.
>точнее из драйвера, т.к. эта программа работает в содружестве с драйвером — так ли это?
Теоретически в MS-DOS возможно все без исключения, но чтобы драйвер вызывал программу — вряд ли. Как он без программы-то работать будет ?
>Если да, то что это за механизм и где про него прочитать? Если нет, то как еще это объяснить?
Давай побольше подробностей, пока что сказать что-то трудно.
Здравствуйте, Nik_1, Вы писали:
N_>а если брекпоинт поставить попадает туда?
Нет, не попадает, но это ничего не значит: прога запускалась на ПК и только она (полагаю, тот драйвер запускать под Виндой бессмысленно). А на контроллере Борланд С не поставишь для дебаггинга =(.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Что-то мне подозрительна MS-DOS на контроллерах. Можно подробнее про эти контроллеры ? Процессор там какой ?
Я тоже сначала удивился =). Но, по-видимому, все программы кроме главной являются резидентными. Иначе как это еще объяснить?
>>Если да, то что это за механизм и где про него прочитать? Если нет, то как еще это объяснить? PD>Давай побольше подробностей, пока что сказать что-то трудно.
Я думал, это достаточно общий вопрос. Не знаю, что еще добавить, чтобы еще более полно раскрыть ситуацию.
Kernel0 wrote:
> PD>Что еще за другая программа в DOS ? MS-DOS — однопрограммная ОС. > > Я тоже сначала удивился =). Но, по-видимому, все программы кроме главной > являются резидентными. Иначе как это еще объяснить?
Запросто в досе может быть несколько программ. Одна программа, не
выгружаясь, или выгружаясь частично (это правда будет её собственные
проблемы), может запустить другую. Это входит в функции операционной
системы DOS. Ну и ещё есть TSR-программы, работающие "в фоне".
Ну, и драйвера, конечно, хотя это уже не совсем программы.
Здравствуйте, MasterZiv, Вы писали:
MZ>Запросто в досе может быть несколько программ. Одна программа, не MZ>выгружаясь, или выгружаясь частично (это правда будет её собственные MZ>проблемы), может запустить другую.
Может, конечно, но чтобы эта запущенная программа вдруг начала вызывать функции из своего родителя — вряд ли. Хотя чего не бывает...
> Это входит в функции операционной системы DOS. Ну и ещё есть TSR-программы, работающие "в фоне".
TSR обычно с программой, работающей сейчас, не взаимодействуют. Наоборот — возможно.
Здравствуйте, Kernel0, Вы писали:
K>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>Что-то мне подозрительна MS-DOS на контроллерах. Можно подробнее про эти контроллеры ? Процессор там какой ?
K>Там точно MS-DOS. А вот этот процессор: http://ru.wikipedia.org/wiki/Am5x86#Am5x86
Здравствуйте, Аноним, Вы писали:
А>Итак, есть некий комплекс ПО (несколько программ и драйверов), которые работают на контроллерах под управлением (если я правильно понимаю) ОС DOS. Мне поручено разобраться в одной из этих программ, но вот затык: одна из самых важных функций в коде программы не вызывается. Вообще! Тем не менее, известно абсолютно точно, что она выполняется. И вот вопрос: каким образом? Есть предположение, что функция вызывается из другой программы, точнее из драйвера, т.к. эта программа работает в содружестве с драйвером — так ли это? Если да, то что это за механизм и где про него прочитать? Если нет, то как еще это объяснить?
Для начала я бы предложил прогнать полнотекстовый поиск по всем файлам проекта на имя этой функции (если это ещё не проделано). Есть неплохой шанс, что эта функция регистрируется в качестве callback'а в драйвере -- или даже в самой программе -- путём передачи указателя на неё куда-то, откуда она затем вызывается по указателю.
Если это не так, то надо искать различные трюки, с помощью которых адрес функции может стать известен вовне. Например, она может быть первой функцией сегмента. Или даже map-файл программы может парситься на предмет извлечения адреса функции, и потом этот адрес зашивается в драйвер. Но это маловероятно, потому как негибко (отлаживать/поддерживать неудобно). Технически для драйвера или TSR нет никакой проблемы вызвать что угодно где угодно -- адресное пространство под ДОС одно на всех. Тут я бы предложил начинать копать от установления связи программы с драйвером (она же наверно делает какую-то инициализацию в начале работы).
Здравствуйте, Kernel0, Вы писали:
N_>>а если брекпоинт поставить попадает туда?
K>Нет, не попадает, но это ничего не значит: прога запускалась на ПК и только она (полагаю, тот драйвер запускать под Виндой бессмысленно). А на контроллере Борланд С не поставишь для дебаггинга =(.
Тебе отладчик надо не от Борланд С, а soft ice досовский — кажется последняя версия была 2.81. Он через com-порт работать умеет. Правда глюкало жуткое. Что же касается вопроса, то та функция наверняка вызывается как обработчик прерывания.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Чем быстрее и дружнее народ будет валить из подобных контор, тем быстрее народ осознает, кто контроллеры бывают с JTAG-ом, отладочные комплексы для них существуют не только на бумаге, а ДОС умер давным-давно.
Мой совет, не надо портить себе жизнь — валите из этой конторы. Всё равно, софт с таким подходом будет наиглючнейший, а крайним выйдете Вы.
Здравствуйте, Аноним, Вы писали:
А>...одна из самых важных функций в коде программы не вызывается. Вообще! Тем не менее, известно абсолютно точно, что она выполняется.
1. Эта функция — обработчик прерывания.
2. Функция может вызываться через переменную-указатель-на-функцию.
Поищи по исходникам все места, где фигурирует имя этой функции — ситуация должна проясниться.
Здравствуйте, bazis1, Вы писали:
B>Чем быстрее и дружнее народ будет валить из подобных контор, тем быстрее народ осознает, кто контроллеры бывают с JTAG-ом, отладочные комплексы для них существуют не только на бумаге, а ДОС умер давным-давно. B>Мой совет, не надо портить себе жизнь — валите из этой конторы. Всё равно, софт с таким подходом будет наиглючнейший, а крайним выйдете Вы.
Вы неправы. Есть довольно узкая, но отнюдь не микроскопическая ниша "промышленных PC", которые строятся на контроллерных вариантах x86 (начиная с 80186, хотя nowadays всё же в основном пентиумы) и комплектуются ДОСом на флэш-диске. Погуглите Octagon Systems для примера.
Всем спасибо за ответы. Все гораздо проще: функция все же вызывается из этой программы, но настолько залихватским образом, что я чуть не сломал себе мозг. В общем, обожаю ООП. Сорри тем, у кого отнял время, это, как говорится, меа кульпа.
Здравствуйте, quodum, Вы писали:
Q>Вы неправы. Есть довольно узкая, но отнюдь не микроскопическая ниша "промышленных PC", которые строятся на контроллерных вариантах x86 (начиная с 80186, хотя nowadays всё же в основном пентиумы) и комплектуются ДОСом на флэш-диске. Погуглите Octagon Systems для примера.
Это единственный тип контроллеров, решающих свой круг задач? Абсолютно нет альтернатив? Есть рынок, но на нем нет развития за последние 20 лет? ИМХО, дело в инерционности конторы, не желающей разово вложиться в переход на новое железо с куда более коротким циклом разработки.
Re[4]: Оффтопик, но
От:
Аноним
Дата:
16.09.09 20:58
Оценка:
Здравствуйте, bazis1, Вы писали:
B>Это единственный тип контроллеров, решающих свой круг задач? Абсолютно нет альтернатив? Есть рынок, но на нем нет развития за последние 20 лет? ИМХО, дело в инерционности конторы, не желающей разово вложиться в переход на новое железо с куда более коротким циклом разработки.
Переход на новое железо давно сделан. Но надо поддерживать и старое...
Здравствуйте, bazis1, Вы писали:
B>Это единственный тип контроллеров, решающих свой круг задач? Абсолютно нет альтернатив? Есть рынок, но на нем нет развития за последние 20 лет? ИМХО, дело в инерционности конторы, не желающей разово вложиться в переход на новое железо с куда более коротким циклом разработки.
Есть.
Только переход на новое железо тянет за собой большие проблемы. Это промышленные контроллеры, а не consumer-electronics (и тем более не софт для РС).
Чтобы перейти на новое железо, надо перерисовать все схемы, переразвести платы, переписать все драйверы, а потом пройти кучу сертификаций на электромагнитную совместимость, вибростойкость, надежность и т.д.
Все это стоит дофига денег. Гораздо проще сидеть на старом железе.
А вот привязка к ОС не совсем понятна... Но если посмотреть на производимые РС104 модули, то почти все они окажутся на х86. А драйверы уже давно под DOS написаны.
Bloody legacy
Здравствуйте, Kernel0, Вы писали:
K>Всем спасибо за ответы. Все гораздо проще: функция все же вызывается из этой программы, но настолько залихватским образом, что я чуть не сломал себе мозг. В общем, обожаю ООП. Сорри тем, у кого отнял время, это, как говорится, меа кульпа.
Можешь озвучить подробности? Мало ли, кому-то покажется интересным, а у других, кроме того, выжмет скупую мужскую слезу.
Здравствуйте, bazis1, Вы писали:
B>Здравствуйте, quodum, Вы писали:
Q>>Вы неправы. Есть довольно узкая, но отнюдь не микроскопическая ниша "промышленных PC", которые строятся на контроллерных вариантах x86 (начиная с 80186, хотя nowadays всё же в основном пентиумы) и комплектуются ДОСом на флэш-диске. Погуглите Octagon Systems для примера.
B>Это единственный тип контроллеров, решающих свой круг задач? Абсолютно нет альтернатив? Есть рынок, но на нем нет развития за последние 20 лет? ИМХО, дело в инерционности конторы, не желающей разово вложиться в переход на новое железо с куда более коротким циклом разработки.
Могу сказать с чем столкнулся лично — скорость запуска после подачи питания. Для нас это было критично, а микроконтроллер с DOS стартовал менее чем за 2 секунды (это вместе с BIOS, загрузкой DOS и программой управления устройством). Linux мне не удалось заставить стартовать менее чем за 18 секунд. Это без программы.
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, Dzirt2005, Вы писали:
D>>Linux мне не удалось заставить стартовать менее чем за 18 секунд. Это без программы.
ДД>CONFIG_PRINTK пробовали отключать?
Нет, но попробую. Хотя все равно я сомневаюсь, что он стартует как DOS, за ~1.5 сек...
Здравствуйте, Dzirt2005, Вы писали:
ДД>>CONFIG_PRINTK пробовали отключать?
D>Нет, но попробую. Хотя все равно я сомневаюсь, что он стартует как DOS, за ~1.5 сек...
За 1.5 сек на PC вряд ли. Но мне удавалось сократить время загрузки с момента включения до старта приложения до 5 сек, на материнке VIA Epia и каким-то Cyrix 1 Ггц. Около половины времени при этом занимала POST BIOS'а.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, Dzirt2005, Вы писали:
ДД>>>CONFIG_PRINTK пробовали отключать?
D>>Нет, но попробую. Хотя все равно я сомневаюсь, что он стартует как DOS, за ~1.5 сек...
ДД>За 1.5 сек на PC вряд ли. Но мне удавалось сократить время загрузки с момента включения до старта приложения до 5 сек, на материнке VIA Epia и каким-то Cyrix 1 Ггц. Около половины времени при этом занимала POST BIOS'а.
У меня CPC303 на AMD Geode на 133/233/300 МГц. BIOS какой-то специальный, производитель гарантирует 400 мс от снятия сброса до начала загрузки системы.
Вобщем, я попробую. К сожалению прямо сейчас у меня нет доступа к этому контроллеру, а информацию я себе оставил. Спасибо
Здравствуйте, ДимДимыч, Вы писали: ДД>За 1.5 сек на PC вряд ли. Но мне удавалось сократить время загрузки с момента включения до старта приложения до 5 сек, на материнке VIA Epia и каким-то Cyrix 1 Ггц. Около половины времени при этом занимала POST BIOS'а.
Удавалось-то удвавалось, но ты вспомни, сколько ты времени убил, чтобы этого добиться?
Неавно натыкался на информацию, что кто-то добился времени загрузки (до первой картинки приложения на встроенной системе) равного 2 секундам.
Ну и еще рекомендую в этом направлении поинтересоваться Moblin(просто ради интереса) в частности, а также творчеcтвом товарища Arjan van de Ven (начать можно здесь)
Здравствуйте, MaxGl, Вы писали:
MG>Здравствуйте, ДимДимыч, Вы писали: ДД>>За 1.5 сек на PC вряд ли. Но мне удавалось сократить время загрузки с момента включения до старта приложения до 5 сек, на материнке VIA Epia и каким-то Cyrix 1 Ггц. Около половины времени при этом занимала POST BIOS'а. MG>Удавалось-то удвавалось, но ты вспомни, сколько ты времени убил, чтобы этого добиться? MG>Неавно натыкался на информацию, что кто-то добился времени загрузки (до первой картинки приложения на встроенной системе) равного 2 секундам. MG>Ну и еще рекомендую в этом направлении поинтересоваться Moblin(просто ради интереса) в частности, а также творчеcтвом товарища Arjan van de Ven (начать можно здесь)
Не так сложно написать свой BIOS, учитывая то, что современные программаторы микросхем Flash-памяти стоят весьма адекватных денег. Единственная проблема — инициализировать системную память. Тут нужно программировать конкретный чипсет (хотя современные в этом плане довольно стандартизированы) — регистры MTTR для отображения физических модулей памяти на физическое адресное пространство ЦП. Можно также использовать кэш ЦП как оперативную память. Есть книжка "BIOS. Дизассемблирование. Модификация. Программирование.". На платформенном симуляторе типа Bochs или Qemu можно поиграться.
Здравствуйте, Аноним, Вы писали:
А>Добрый вечер.
А>Я начинающий программист, и у меня возникла проблема. Это проблема настолько общего характера, что это меня тревожит. Возможно, я выбрал неудачную тему для своего вопроса, поэтому заранее прошу прощения у модератора, если это так.
А>Итак, есть некий комплекс ПО (несколько программ и драйверов), которые работают на контроллерах под управлением (если я правильно понимаю) ОС DOS. Мне поручено разобраться в одной из этих программ, но вот затык: одна из самых важных функций в коде программы не вызывается. Вообще! Тем не менее, известно абсолютно точно, что она выполняется. И вот вопрос: каким образом? Есть предположение, что функция вызывается из другой программы, точнее из драйвера, т.к. эта программа работает в содружестве с драйвером — так ли это? Если да, то что это за механизм и где про него прочитать? Если нет, то как еще это объяснить?
Если процессор класса i486 и выше, то можно просто поставить аппаратную точку останова на нужном адресе и потом уже смотреть, кто вызвал эту процедуру.
Здравствуйте, MaxGl, Вы писали:
MG>Удавалось-то удвавалось, но ты вспомни, сколько ты времени убил, чтобы этого добиться?
Там параллельно и другие задачи решались, так что сколько именно на это — трудно сказать. Да и со многим с нуля приходилось разбираться, а при отсутствии инета под рукой практически единственный разумный путь — экспериментальный
Но даже отключение только printk() дает заметный выигрыш в скорости загрузки, как по основной причине — не тратится время на вывод сообщений, так и по второстепенной — уменьшается размер ядра и загрузчик его быстрее загружает с носителя.
MG>Неавно натыкался на информацию, что кто-то добился времени загрузки (до первой картинки приложения на встроенной системе) равного 2 секундам.
От требований к системе зависит. Если избавиться от стандартного BIOS'а и разместить ядро прямо в ПЗУ, то вполне нормально.
MG>Ну и еще рекомендую в этом направлении поинтересоваться Moblin(просто ради интереса) в частности, а также творчеcтвом товарища Arjan van de Ven (начать можно здесь)
Coreboot еще можно приспособить.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Здравствуйте, Privalov, Вы писали:
K>>Всем спасибо за ответы. Все гораздо проще: функция все же вызывается из этой программы, но настолько залихватским образом, что я чуть не сломал себе мозг. В общем, обожаю ООП. Сорри тем, у кого отнял время, это, как говорится, меа кульпа.
P>Можешь озвучить подробности? Мало ли, кому-то покажется интересным, а у других, кроме того, выжмет скупую мужскую слезу.
Наверное открыл для себя таблицы виртуальных (или того хуже динамических) методов, но молчит.
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true
Здравствуйте, Аноним, Вы писали:
А>Добрый вечер.
А>Я начинающий программист, и у меня возникла проблема. Это проблема настолько общего характера, что это меня тревожит. Возможно, я выбрал неудачную тему для своего вопроса, поэтому заранее прошу прощения у модератора, если это так.
А>Итак, есть некий комплекс ПО (несколько программ и драйверов), которые работают на контроллерах под управлением (если я правильно понимаю) ОС DOS. Мне поручено разобраться в одной из этих программ, но вот затык: одна из самых важных функций в коде программы не вызывается. Вообще! Тем не менее, известно абсолютно точно, что она выполняется. И вот вопрос: каким образом? Есть предположение, что функция вызывается из другой программы, точнее из драйвера, т.к. эта программа работает в содружестве с драйвером — так ли это? Если да, то что это за механизм и где про него прочитать? Если нет, то как еще это объяснить?
Если у вас MS-DOS то проблем вызова программы из драйвера нету. Это 16 битная real-mode где все работает в одном адресном пространстве. Я не знаю какая у вас архитектура software, так как вы не дали практически никаких деталей, но если у вас есть сомнения как работает драйвер то могу дать несколько советов. Может они вам помогут. Пару лет назад меня попросили написать программу по тестированию прерываний I/O модуля. Написать все надо было под MS-DOS. Меня это конечно очень удивило. С MS-DOS я не занимался уже лет 15 тоесть интрументов для написание програм конечно не было.И все надо было сделать за один-два дня. Я нашел и загрузил Turbo C одной из ранних версий которое работает под MS-DOS. С программы которую можно создать на Turbo C можно программировать напрямую железо, включая PIC/APIC . Также можно было создать call back функцию с прерывания. То есть использую Turbo C я смог проверить железо.