Форум: "WinAPI";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
ВнизОбласть только для чтения. Найти похожие ветки
← →
Тимохов © (2004-06-29 11:36) [0]Не совсем понимаю, куда отнести этот вопрос - ясно не в общую (т.к. наиболее важная часть вопроса относится к win), и не в потрепаться (:)).
В одной из книг (Фень Юань, Программирование графики в windows) увидел такой код:const TCHAR szOperation[] = _T("open");
К данной строчке есть комментарий:The two “const TCHAR” array definitions ensure that those constant strings are put into the read-only data section in the final binary code generated by the compiler and linker
Т.е. в cи есть возможность явно управлять куда помещать данные: в область кода (т.е. только read) или в область данных (т.е. r/w).
Вопросы:
1. Есть в дельфи возможность упарвлять размещением, например константной строки или дельфи автоматически распологает ее в области кода? Если второе, то я тогда понимаю, почему не работает код (ну или примерно такой - на память писано)var
s: string;
begin
s := "abc";
CharToOem(s, s);
end;
т.к. константа "abc" находится в области кода, сразу за указанными кодом.
2. Как windows определяет какая область какая? Т.е. где это задается и как это можно изучить по готовому exe. Насколько я понимаю для того, чтобы изучить exe и dll нужно использовать утилиту dumpbin? Понимаю, что вопрос (вернее ответ на него) слишком развернут. Поэтому был бы признателен, если бы мне указали, где можно про это почитать, желательно в доступной форме (рус/англ - не важно). Желательно, что-нибудь кроме Рихтера.
Заранее благодарен.
ЗЫ. Надеюсь угадал с расположением вопроса в данном форуме :)
← →
Тимохов © (2004-06-29 12:37) [1]Хотел бы уточнить вопрос 1 из оригинального поста.
Что определяет, что данная область памяти является областью кода, а данная областью данных. Правильно ли я понимаю, что это определяется режимами доступа к виртуальной памяти?
К тому же тот же Фень Юань сказал, что в случае такого описания строки она может быть повтороно использована разными копиями одного же приложения. Как это может быть?
ЗЫ. В общем я понимаю, что у меня есть серьезные пробелы в понимании загрузки и выполнения исполняемых модулей. Еще раз повторяю, что был бы рад отсыткой к каким-нибудь источникам.
← →
Игорь Шевченко © (2004-06-29 13:09) [2]
> Что определяет, что данная область памяти является областью
> кода, а данная областью данных.
Флажки в секции PE-файла.
> 1. Есть в дельфи возможность упарвлять размещением, например
> константной строки или дельфи автоматически распологает
> ее в области кода? Если второе, то я тогда понимаю, почему
> не работает код (ну или примерно такой - на память писано)
Автоматически
> 2. Как windows определяет какая область какая? Т.е. где
> это задается и как это можно изучить по готовому exe.
Program Files\Borland\Delphi\Bin\TDUMP.EXE
> ЗЫ. Надеюсь угадал с расположением вопроса в данном форуме
>
С равным успехом ее можно расположить и в "Потрепаться"
← →
Тимохов © (2004-06-29 13:10) [3]
> С равным успехом ее можно расположить и в "Потрепаться"
Игорь, вы как всегда вселяете оптимизм.
← →
Anatoly Podgoretsky © (2004-06-29 13:15) [4]Зависит от параметров проекта, "изменяемые" константы или нет.
И ошибка - надо PChar(S) только S должна быть записываемапя и не пустая
← →
Тимохов © (2004-06-29 13:19) [5]
> Anatoly Podgoretsky © (29.06.04 13:15) [4]
да понятно, что ошибка - я без компа не могу писать корректно :)))
Я знаю, что строковые константы, типа
s := "dima";
пишутся сразу за функцией.
А что, может быть и по-другому - может строка "dima" быть расположена где-то еще?
← →
Тимохов © (2004-06-29 13:22) [6]Все-таки, может поможет кто-нибудь документацией отличной от Рихтера: его я потом еще раз прочту, т.к. с первого раза в области dll ничего не понял :(((
1. Рус/англ - не важно
2. online/книга - не важно
← →
Тимохов © (2004-06-29 13:58) [7]
> Игорь Шевченко © (29.06.04 13:09) [2]
Правильно ли я понимаю, что:
1. по флажкам в секциях PE файла загрузчик понимает какая область соответствует кода, какая данным.
2. соответствующим образом для областей памяти виртуальной памяти проставляет флаги доступа - для чтения, для чтения/записи и т.д.
?
← →
Игорь Шевченко © (2004-06-29 14:02) [8]
> 1. по флажкам в секциях PE файла загрузчик понимает какая
> область соответствует кода, какая данным.
> 2. соответствующим образом для областей памяти виртуальной
> памяти проставляет флаги доступа - для чтения, для чтения/записи
> и т.д.
Именно так. Для этого флажки и придуманы
← →
Тимохов © (2004-06-29 14:06) [9]
> Игорь Шевченко © (29.06.04 14:02) [8]
Повторю, часть вопроса (выше была):
"Фень Юань сказал, что в случае такого описания строки она может быть повтороно использована разными копиями одного же приложения. Как это может быть?"
Я пониамаю, что в общем случае exe загружаются через механизм filemapping, т.е. не копируется в файл подкачки, а проецируются на область виртуальной памяти.
Как вы думаете ФЮ имел в виду этот механизм проецирования, когда говорил повторное использование констант?
← →
Игорь Шевченко © (2004-06-29 14:13) [10]Тимохов © (29.06.04 14:06)
>
> "Фень Юань сказал, что в случае такого описания строки она
> может быть повтороно использована разными копиями одного
> же приложения. Как это может быть?"
Фень Юань сказал абсолютно правильно. Когда загружается EXE-файл, то та его часть (те секции), которые не помечены атрибутом Writeable, отображается на адресное пространство процесса как FileMapping. Отсюда следует, что в оперативной памяти эти секции будут находиться единожды, если EXE-файл отображается по предпочтительному базовому адресу.
← →
Тимохов © (2004-06-29 14:15) [11]Ну тогда я спокоен: в дельфи константы и так хранятся в области кода (судя по cpu), а эта область radable. Т.е. озабачиваться этим особенно не надо.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.031 c