![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Область только для чтения. [D6]
Тимохов © (2004-06-29 11:36:00)Не совсем понимаю, куда отнести этот вопрос - ясно не в общую (т.к. наиболее важная часть вопроса относится к 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 14:15:00) [1]Ну тогда я спокоен: в дельфи константы и так хранятся в области кода (судя по cpu), а эта область radable. Т.е. озабачиваться этим особенно не надо.
Игорь Шевченко (2004-06-29 14:13:00) [2]Тимохов © (29.06.04 14:06)
>
> "Фень Юань сказал, что в случае такого описания строки она
> может быть повтороно использована разными копиями одного
> же приложения. Как это может быть?"
Фень Юань сказал абсолютно правильно. Когда загружается EXE-файл, то та его часть (те секции), которые не помечены атрибутом Writeable, отображается на адресное пространство процесса как FileMapping. Отсюда следует, что в оперативной памяти эти секции будут находиться единожды, если EXE-файл отображается по предпочтительному базовому адресу.
Тимохов (2004-06-29 14:06:00) [3]
> Игорь Шевченко © (29.06.04 14:02) [8]
Повторю, часть вопроса (выше была):
"Фень Юань сказал, что в случае такого описания строки она может быть повтороно использована разными копиями одного же приложения. Как это может быть?"
Я пониамаю, что в общем случае exe загружаются через механизм filemapping, т.е. не копируется в файл подкачки, а проецируются на область виртуальной памяти.
Как вы думаете ФЮ имел в виду этот механизм проецирования, когда говорил повторное использование констант?
Игорь Шевченко (2004-06-29 14:02:00) [4]
> 1. по флажкам в секциях PE файла загрузчик понимает какая
> область соответствует кода, какая данным.
> 2. соответствующим образом для областей памяти виртуальной
> памяти проставляет флаги доступа - для чтения, для чтения/записи
> и т.д.
Именно так. Для этого флажки и придуманы
Тимохов (2004-06-29 13:58:00) [5]
> Игорь Шевченко © (29.06.04 13:09) [2]
Правильно ли я понимаю, что:
1. по флажкам в секциях PE файла загрузчик понимает какая область соответствует кода, какая данным.
2. соответствующим образом для областей памяти виртуальной памяти проставляет флаги доступа - для чтения, для чтения/записи и т.д.
?
Тимохов (2004-06-29 13:22:00) [6]Все-таки, может поможет кто-нибудь документацией отличной от Рихтера: его я потом еще раз прочту, т.к. с первого раза в области dll ничего не понял :(((
1. Рус/англ - не важно
2. online/книга - не важно
Тимохов (2004-06-29 13:19:00) [7]
> Anatoly Podgoretsky © (29.06.04 13:15) [4]
да понятно, что ошибка - я без компа не могу писать корректно :)))
Я знаю, что строковые константы, типа
s := 'dima';
пишутся сразу за функцией.
А что, может быть и по-другому - может строка 'dima' быть расположена где-то еще?
Anatoly Podgoretsky (2004-06-29 13:15:00) [8]Зависит от параметров проекта, "изменяемые" константы или нет.
И ошибка - надо PChar(S) только S должна быть записываемапя и не пустая
Тимохов (2004-06-29 13:10:00) [9]
> С равным успехом ее можно расположить и в "Потрепаться"
Игорь, вы как всегда вселяете оптимизм.
Игорь Шевченко (2004-06-29 13:09:00) [10]
> Что определяет, что данная область памяти является областью
> кода, а данная областью данных.
Флажки в секции PE-файла.
> 1. Есть в дельфи возможность упарвлять размещением, например
> константной строки или дельфи автоматически распологает
> ее в области кода? Если второе, то я тогда понимаю, почему
> не работает код (ну или примерно такой - на память писано)
Автоматически
> 2. Как windows определяет какая область какая? Т.е. где
> это задается и как это можно изучить по готовому exe.
Program Files\Borland\Delphi\Bin\TDUMP.EXE
> ЗЫ. Надеюсь угадал с расположением вопроса в данном форуме
>
С равным успехом ее можно расположить и в "Потрепаться"
Тимохов (2004-06-29 12:37:00) [11]Хотел бы уточнить вопрос 1 из оригинального поста.
Что определяет, что данная область памяти является областью кода, а данная областью данных. Правильно ли я понимаю, что это определяется режимами доступа к виртуальной памяти?
К тому же тот же Фень Юань сказал, что в случае такого описания строки она может быть повтороно использована разными копиями одного же приложения. Как это может быть?
ЗЫ. В общем я понимаю, что у меня есть серьезные пробелы в понимании загрузки и выполнения исполняемых модулей. Еще раз повторяю, что был бы рад отсыткой к каким-нибудь источникам.