информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Где водятся OGRыСтрашный баг в WindowsСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Куча 12.12.01 19:02  Число просмотров: 1039
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка>
[skipped]
> 3. Я долго искал информацию относительно кучи, но так
> ничего хорошего не нашел ни в сети, ни на "книжных полках"
> ,- поэтому решил просветиться относительно правильности
> понимания мною данного вопроса на формуме.

Все правильно ты понимаешь IMHO.
Есть серия "Библиотека системного программиста" братьев Фроловых - около 30 томов, половина из них по ДОС. Ее можно найти в Инете в HTML-варианте.

> ЗЫ:
> - есть ли где-нибудь дельная документация на кучи.

Маханизм работы с кучами зависит от конкретного компилятора, поэтому посмотри исходники RTL например у Borland C++, лучше доки IMHO не найдешь.

> - все ли компиляторы си (DOS, WIn, UNIX) встраивают в
> программы библиотеки для управления кучей.

malloc() и free() это вообще-то стандарт ANSI C, и поэтому они есть в DOS/Win/Unix (если ты про это спрашивал :-))

> - Каким интерфейсом лучше пользоваться для доступа из DOS к
> памяти выше 1Мб (какой из них двоих все-таки быстрее и
> менее глючнее).

У Фроловых неплохо описаны XMS/EMS, VCPI/DPMI.
Еще можно юзать какой-нибудь DOS-Extender (например Phar Lap для BC++. Просто без всяких изменений перекомпилируешь исходники под этот экстендер и можно с помощью malloc() или int 21h/ah=48h выделять хоть 10 Мб сразу, но к абсолютным адресам типа 0xB800 надо обращаться через API экстендера).
<programming>
Куча 11.12.01 21:51    Штраф: 10 [+]
Автор: TROi Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Хотел бы прояснить (для себя, в первую очередь) одну проблему.
Такое понятие как "куча" ,- Что оно (она) ?

1. Программа на си под Windows инииализирует кучу в качестве блока для динамического выделения памяти в процессе выполнения.

ИМХО, эта фича придумана для независимости программы от ОС в процессе выполнения. Однако в случае нехватки памяти в куче

происходит запрос дополнительной памяти у ОС, причем для пользователя (программиста) это происходит прозрачно, если

используются стандартные функции. В качестве продолжения этой мысли - программа на си (C++) (в любой ли ОС ?) начинает

выполняться не с функции main() или WinMain(), а с участка программы, который производит "кое-что" и в том числе производит

инициализацию кучи, а затем уже вызывается одна из названных функций.
2. В заголовке экзешника (для DOS) есть участок содержащий максимальную и минимальную необходимую память программе. По

умолчанию компилятором (ассемблера) в "максимальную" часть записывается значение, заставляющее систему отдавать программе всю

свободную ОЗУ (непрерывный участок ОЗУ) (комовская программа пользуется таким "провом" автоматически) ,- по этой причине

проблематично выполнять две и более пользовательские (программерские) программы одновременно или запрашивать дополнительную

память /int 48/ (речь идет о DOS). В данном случае "этот" ("максимальный") участок памяти (он располагается непосредственно

за программой и простирается до первого встреченного блока управления памятью) фактически тоже является кучей, одннако

программа на ассемблере об этом не знает и в пустую расходует память. В случае программы на си (BC++ 3.0) происходит

следующая фича - в случае малой модели памяти куча формируется между стеком и исполняемым модулем (данные и код), а для

остальных моделей - за программой ,- в данном случае куча контролируется библиотечными функциями си.


Это костяк, который я прошу прокоментировать и дополнить (по существу).
ЗЫ: Есть ли в сети где-нибудь "ЭНЦИКЛОПЕДИЯ DOS 6/x" (3.0 - я нашел) или может быть где-то еще продается такой раритет ?
seichas 2001 god , kakoi v zhopu DOS?? Vy che rehnulis`? 12.12.01 21:39  
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
seichas 202X god , kakoi v zhopu WIN ?? Vy che rehnulis`? 13.12.01 09:59  
Автор: Chingachguk <Chingachguk> Статус: Member
<"чистая" ссылка>
Так могут написать наши внучата, блин... Про нас же ... ;)
Konechno mogut, A v chem sobstvenno umor to? 13.12.01 21:47  
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
Точно, 2001 год, а народ никак русский шрифт не поставит. 13.12.01 09:28  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
Hmm, ne vizhu ni kakoi sviazi. 13.12.01 21:49  
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
seichas 2001 god , kakoi v zhopu DOS?? Vy che rehnulis`? 13.12.01 02:09  
Автор: OverKill <::.0v3rK1LL.::> Статус: Member
Отредактировано 13.12.01 02:10  Количество правок: 1
<"чистая" ссылка>
А какая в %опу разница какой сейчас год...
У меня например по-приколу уже давно стоит четвёрка под досом и сгребает почту... как почтовый клиент рабоает.
Глупо? Может и так...
Зато прикольно и напоминает об ушедших временах.
Куча 11.12.01 22:19  
Автор: Heromantor Статус: Незарегистрированный пользователь
<"чистая" ссылка>
. В качестве продолжения
> этой мысли - программа на си (C++) (в любой ли ОС ?)
> начинает
>
> выполняться не с функции main() или WinMain(), а с участка
> программы, который производит "кое-что" и в том числе
> производит
>
> инициализацию кучи, а затем уже вызывается одна из
> названных функций.

Ну на самом-то деле до выполнения main() очень далеко от начала исполнения кода. Там инициализируеться все что только можно, не только "куча"

> 2. В заголовке экзешника (для DOS) есть участок содержащий
> максимальную и минимальную необходимую память программе. По
>
> умолчанию компилятором (ассемблера) в "максимальную" часть
> записывается значение, заставляющее систему отдавать
> программе всю
>
> свободную ОЗУ (непрерывный участок ОЗУ) (комовская
> программа пользуется таким "провом" автоматически) ,- по
> этой причине
>
> проблематично выполнять две и более пользовательские
> (программерские) программы одновременно или запрашивать
> дополнительную
>
> память /int 48/ (речь идет о DOS). В данном случае "этот"
> ("максимальный") участок памяти (он располагается
> непосредственно
>
> за программой и простирается до первого встреченного блока
> управления памятью) фактически тоже является кучей, одннако
>
> программа на ассемблере об этом не знает и в пустую
> расходует память. В случае программы на си (BC++ 3.0)
> происходит
>
> следующая фича - в случае малой модели памяти куча
> формируется между стеком и исполняемым модулем (данные и
> код), а для
>
> остальных моделей - за программой ,- в данном случае куча
> контролируется библиотечными функциями си.
>
>
> Это костяк, который я прошу прокоментировать и дополнить
> (по существу).
> ЗЫ: Есть ли в сети где-нибудь "ЭНЦИКЛОПЕДИЯ DOS 6/x" (3.0 -
> я нашел) или может быть где-то еще продается такой раритет
> ?

Причем тут заголовок EXE и куча вообще, теоритически загрузчик должен читать это поле и если объем доступной памяти меньше чем там указано то он пишет что-то вроде: "Недочтаочно памяти" или в этом роде, загрузчик не выделяет память для программы
Куча 12.12.01 13:44  
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка>
> Причем тут заголовок EXE и куча вообще, теоритически
> загрузчик должен читать это поле и если объем доступной
> памяти меньше чем там указано то он пишет что-то вроде:
> "Недочтаочно памяти" или в этом роде, загрузчик не выделяет
> память для программы

Ошибаешься :)
Загрузчик DOS EXE:
1) выделяет блок памяти в соответствии с размером загружаемой части .exe файла и полями MZ-заголовка minalloc/maxalloc.
2) создает в этом блоке памяти PSP;
3) cчитывает в сегмент PSP+10h загружаемую часть .exe и передает ей управление.
Да ты прав... 12.12.01 16:34  
Автор: Heromantor Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Мда старею,забываю....

Since an EXE file may be loaded on any segment, all absolute segment
references (such as FAR CALLs, long address pointers, and references such
as MOV AX,data_seg) must be adjusted to work for the memory location in
which they are loaded. Here are the steps used by the DOS program loader
(fn 4bH ) to load an EXE file:

1. Create a PSP via DOS Fn 26H.

2. Read 1cH bytes of the EXE file (the formatted portion of the EXE
header) into a local memory area.

3. Determine the load module size:
size=((wPageCnt*512)-(wHdrSize*16))-wPartPage

4. Determine file offset of load module = (wHdrSize * 16)

5. Select a segment addr, START_SEG, for loading (usually PSP+10H)

6. Allocate enough memory to hold the load module, honoring the
settings in wMaxMem and wMinMem.

7. Read the load module into memory starting at START_SEG:0000

8. LSEEK to the start of the relocation table (wTablOff)

9. For each relocation item (wReloCnt):
a. read the item as two 16-bit words (I_OFF,I_SEG)
b. add RELO_SEG=START_SEG+I_SEG (find the address of
relocation ref)
c. fetch the word at RELO_SEG:I_OFF (read current value)
d. add START_SEG to that word (perform the segment fixup)
e. store the sum back at its original address (RELO_SEG:I_OFF)

10. Allocate memory for the program according to wMaxMem and wMinMem

11. Initialize registers and execute the program:
a. ES = DS = PSP
b. Set AX to indicate the validity of drive IDs in command line
c. SS = START_SEG+ReloSS, SP = ExeSP
d. CS = START_SEG+ReloCS, IP = ExeIP
До Кучи 12.12.01 12:29  
Автор: Cyril <sc> Статус: Member
<"чистая" ссылка>
Во первых не надо смешивать DOS и WIN
> > проблематично выполнять две и более пользовательские
> > (программерские) программы одновременно или
> запрашивать
> > дополнительную
> >
> > память /int 48/ (речь идет о DOS). В данном случае
> "этот"
> > ("максимальный") участок памяти (он располагается
> > непосредственно
Во вторых что подразумевается под "программерскими" программами?
Если я ничего не путаю :-) то DOS это не многозадачная OS,
естественно проблематично выполнять две и более программ "одновременно".

Если программа одна, то запрашивать дополнительную память (int 48 - для асма) совсем не проблематично (в bс или bp) свои собственные менеджеры памяти

> > программа на ассемблере об этом не знает и в пустую
> > расходует память. В случае программы на си (BC++ 3.0)
> > происходит
> >
> > следующая фича - в случае малой модели памяти куча
> > формируется между стеком и исполняемым модулем

об этом не знает не программа на ассемблере, а программист который ее писал, собственно если он не писал резидентную программу, то его это вообще не колышит.

В третьих, при чем здесь модели памяти, если DOS выделяет всю
память, что осталась, под задачу (вот такая она щедрая :-),

Еще раз повторяю, DOS НЕ МНОГОЗАДАЧНАЯ СИСТЕМА !!!
Куча 12.12.01 14:40  
Автор: TROi Статус: Незарегистрированный пользователь
<"чистая" ссылка>
1. Я вообще ничего не утверждаю, а просто спрашиваю.
2. Я не смешиваю DOS & Win, хотя (к сожалению для меня) DOS я знаю лучше, чем Win. А то, что DOS НЕ МНОГОЗАДАЧНАЯ (очевидно, подразумевается, что работает в реальном режиме) я подозревал давно ;(
Тем не менее сделать DOS многозадачной (в буквальном толковании этого слова) непроблематично, если использовать для начала TSR-проги + синхронизирующую прогу(таймерную) - система получится даже приоритетно-многозадачной (круче win 9.x) - это шутка.
3. Я долго искал информацию относительно кучи, но так ничего хорошего не нашел ни в сети, ни на "книжных полках" ,- поэтому решил просветиться относительно правильности понимания мною данного вопроса на формуме.
4. Выделять память /int48/ непроблематично, если только знаешь, что компилятор заносит в заголовок экзешника. При этом обобщать программы написанные на Си (MSC++, BC++) и ассемблере (MASM, TASM), видимо, не следует, потому что даже запустив 1Кб прогу после ассемблирования можно не обнаружить ни байта свободной памяти в ОЗУ - буду благодарен, если меня разубедят в этом.
5. Модели памяти ,- это, ИМХО, самое прикольное в данном вопросе (о куче). Я только предполагаю, что "максимум" в заголовке экзешника является той самой кучей, о которой идет речь. Однако согласно документации на BC++ 3.0 куча формируется именно исходя из модели памяти (см выше). Никакого противоречия я здесь не вижу.

ЗЫ:
- есть ли где-нибудь дельная документация на кучи.
- все ли компиляторы си (DOS, WIn, UNIX) встраивают в программы библиотеки для управления кучей.
- Каким интерфейсом лучше пользоваться для доступа из DOS к памяти выше 1Мб (какой из них двоих все-таки быстрее и менее глючнее).
Куча 12.12.01 19:02  
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка>
[skipped]
> 3. Я долго искал информацию относительно кучи, но так
> ничего хорошего не нашел ни в сети, ни на "книжных полках"
> ,- поэтому решил просветиться относительно правильности
> понимания мною данного вопроса на формуме.

Все правильно ты понимаешь IMHO.
Есть серия "Библиотека системного программиста" братьев Фроловых - около 30 томов, половина из них по ДОС. Ее можно найти в Инете в HTML-варианте.

> ЗЫ:
> - есть ли где-нибудь дельная документация на кучи.

Маханизм работы с кучами зависит от конкретного компилятора, поэтому посмотри исходники RTL например у Borland C++, лучше доки IMHO не найдешь.

> - все ли компиляторы си (DOS, WIn, UNIX) встраивают в
> программы библиотеки для управления кучей.

malloc() и free() это вообще-то стандарт ANSI C, и поэтому они есть в DOS/Win/Unix (если ты про это спрашивал :-))

> - Каким интерфейсом лучше пользоваться для доступа из DOS к
> памяти выше 1Мб (какой из них двоих все-таки быстрее и
> менее глючнее).

У Фроловых неплохо описаны XMS/EMS, VCPI/DPMI.
Еще можно юзать какой-нибудь DOS-Extender (например Phar Lap для BC++. Просто без всяких изменений перекомпилируешь исходники под этот экстендер и можно с помощью malloc() или int 21h/ah=48h выделять хоть 10 Мб сразу, но к абсолютным адресам типа 0xB800 надо обращаться через API экстендера).
Спасибо 12.12.01 22:01  
Автор: TROi Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Фроловы действительно писали хорошие книги для DOS, но за последние 4 года я не встречал ни одной их работы (у меня есть 33 том - 1997 г.).
В сети их сайты более (почему-то) недоступны
www.glasnet.ru/~frolov
www.dials.ccas.ru/frolov
В сетевых библиотеках их работ тоже нет.
Обидно.
Ссылка на Библиотеку системного программиста 13.12.01 12:26  
Автор: Cyril <sc> Статус: Member
Отредактировано 13.12.01 12:28  Количество правок: 1
<"чистая" ссылка>


http://src.fitkursk.ru/books.asp?page=4
может поможет... 12.12.01 15:36  
Автор: kar Статус: Незарегистрированный пользователь
<"чистая" ссылка>
поищи ответ чуть глубже (forum'a)...
не так давно и я задавался подобным вопросом.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach