Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.048 c
4-1088494582
Тимохов
2004-06-29 11:36
2004.08.08
Область только для чтения.


14-1089975030
Kerk
2004-07-16 14:50
2004.08.08
Кондиционеры. Кто они?


3-1089880727
Алексей
2004-07-15 12:38
2004.08.08
Смерть ADO. Как восстановить?


1-1090510591
glGLU
2004-07-22 19:36
2004.08.08
Timer


1-1090381835
Димон
2004-07-21 07:50
2004.08.08
Я доделал мою прогу "Блокнот" и теперь возникла одна проблемка...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский