информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetСтрашный баг в WindowsВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
Куча 12.12.01 19:02  Число просмотров: 1120
Автор: :-) <:-)> Статус: 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-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach