Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| |
До Кучи 12.12.01 12:29 Число просмотров: 1118
Автор: Cyril <sc> Статус: Member
|
Во первых не надо смешивать DOS и WIN
> > проблематично выполнять две и более пользовательские > > (программерские) программы одновременно или > запрашивать > > дополнительную > > > > память /int 48/ (речь идет о DOS). В данном случае > "этот" > > ("максимальный") участок памяти (он располагается > > непосредственно Во вторых что подразумевается под "программерскими" программами?
Если я ничего не путаю :-) то DOS это не многозадачная OS,
естественно проблематично выполнять две и более программ "одновременно".
Если программа одна, то запрашивать дополнительную память (int 48 - для асма) совсем не проблематично (в bс или bp) свои собственные менеджеры памяти
> > программа на ассемблере об этом не знает и в пустую > > расходует память. В случае программы на си (BC++ 3.0) > > происходит > > > > следующая фича - в случае малой модели памяти куча > > формируется между стеком и исполняемым модулем
об этом не знает не программа на ассемблере, а программист который ее писал, собственно если он не писал резидентную программу, то его это вообще не колышит.
В третьих, при чем здесь модели памяти, если DOS выделяет всю
память, что осталась, под задачу (вот такая она щедрая :-),
Еще раз повторяю, DOS НЕ МНОГОЗАДАЧНАЯ СИСТЕМА !!!
|
<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
В сетевых библиотеках их работ тоже нет.
Обидно.
|
| | | |
может поможет... 12.12.01 15:36
Автор: kar Статус: Незарегистрированный пользователь
|
поищи ответ чуть глубже (forum'a)...
не так давно и я задавался подобным вопросом.
|
|
|