Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.14;
Скачать: CL | DM;

Вниз

работа с памятью   Найти похожие ветки 

 
azra3L   (2003-03-25 21:27) [0]

люди помогите, чем могёте. подкиньте немного инфы (ссылок) по работе с памятью: чтение/запись из/в определённого адреса в памяти (если это возможно)... и вообще всё про работу с памятью!
P.S.
если это ВАС не обременит. заранее СПАСИБО


 
Digitman ©   (2003-03-26 08:29) [1]

var i, k: Integer;
p: PInteger;
...
p := @i;
i := 1;
k := p^;
p^:= 2;
i := p^;
и т.п.

чем тебе это не "работа с памятью" ?


 
Tano ©   (2003-03-26 12:07) [2]

Для чтения/записи из/по определенного(ому) адреса(у) можно использовать ASM, либо просто присвоить переменной типа Pointer какое-то число, оно то и будет при обращении адресом.

var
P :^Byte;
B :Byte;
begin
Cardinal(P):=адрес;
P^:=данные; //ПОПЫТКА_записи_байта
B:=P^; //ПОПЫТКА_чтения_байта
end;

Проблема в том, какие именно адреса тебя интересуют. Могу сэкономить твое время, если скажу, что ни в системные области, ни в области других приложений тебя не пустят (это на уровне механизма защищенного режима процессора), если только этими приложениями память не дана в общий доступ.

Кидаю на mail мини-прогу, в которой я эксперемнтировал с разным обращением/выделением памяти. Там есть 4 метода выделения памяти и обращение к ней. Как есть не запускай, разбирайся (кажись последнее, что делал - выделял 1,5Gb памяти :-) для побайтовой адресации).


 
Tano ©   (2003-03-26 12:09) [3]

P.S. прошу мастеров не тратить свое время на дискуссию и не ловить меня на словах. Месяца два назад я уже учавствовал в такой баталии :-) Факт то, что моя прога именно по адресам обращается => отвечает на вопрос.


 
SeF ©   (2003-03-26 18:49) [4]


> Tano © (26.03.03 12:09)
а мне можно кинуть? plz


 
Alex Konshin ©   (2003-03-26 19:28) [5]

2 Tano: из вопроса совершенно не ясно, к какой памяти нужно обращаться. Например, к абсолютной памяти ты так не обратишься.

Приведение к Cardinal не желательно, т.к. может работать, например, в Delphi3 (обрезается старший бит). Уж лучше писать так:
P := Pointer(адрес);


 
Palladin ©   (2003-03-26 20:03) [6]


> azra3L (25.03.03 21:27)

var
c,
i:integer;

....
i:=5; // запись в определенный адресс памяти
c:=i; // чтение и запись из определенного адреса памяти в определенный адрес памяти

вот тебе все про работу с памятью...
если мало, то конкретней вопрос задавай...


 
Tano ©   (2003-03-26 21:31) [7]

>SeF © (26.03.03 18:49)
Отправил

>Palladin © (26.03.03 20:03)
Я так подумал, что под ОПРЕДЕЛЕННЫМ адресом понимается тот, который задается вручную (вычислением в неком алгоритме), а не компилятором+Windows, как в твоем примере.

>Alex Konshin © (26.03.03 19:28)
Сачала о Cardinal:
1. Речь идет о D6, на котором я все и разбирал.
2. Там, где гоняют D3 вероятность наличия 2Gb (если урезать старший бит) памяти ничтожна.
3. С твоим предложением P:=Pointer(адрес) я не спорю, просто сам указатель никому не нужен - интересуют данные, а это уже какой-нибудь да тип. Поэтому что-то к чему-то приводить так и так прийдется. Я предложил одно - ты другое.

Теперь о больной теме.
Все адресное пространство отсчитывается от 0 и идет по порядку - ЛИНЕЙНО. Каждому процессу выдается окошко от Adr1 до Adr2, процесс может выделять себе новые окошки памяти, но их адреса будут начинаться с некоторого соверенно абсолютного числа (BASE). Для адресации этого окошка на ASM и так, как я написал выше, необходимо вычислять адрес данных как BASE+свое_смещение_внутри_окошка_памяти. Если результирующее число выпадает из выделенного диапазона, возникает Access violation at address XXXXXXXX - это работает механизм защиты.
Для облегчения управления памятью придумали нехитрый механизм. Ты, выделяя память, можешь получать не адрес на фиксированный блок памяти, а дискриптор этого блока. При обращении к блоку необходимо его зафиксировать в памяти (на время обращения) и получить его АБСОЛЮТНЫЙ базовый адрес (использование - см.выше), все остальное время менеджер памяти волен пинать этот блок для более оптимального расположения (а-ля дефрагментация).

Все это не самые типичные задачи и так извращаться приходиться редко, в остальное время хватает обычных методов (динамические переменные, записи и прочее).
Ручную адресацию приходится применять ,например, когда некоторые программы используют один блок памяти для взаимодействия, да и это можно решить проще.



 
Tano ©   (2003-03-26 21:34) [8]

P.S. без дискуссии - никак :-))))))


 
Alex Konshin ©   (2003-03-27 01:39) [9]

Я тебе про Фому - ты про Ерему!
Я говорю, что спрашивающий не сказал, к какой памяти надо обращаться: к физической или виртуальной.
И не надо нас учить работать с виртуальной памятью - мы сами научить можем. И уж механизм выделения памяти Windows тут вообще ни при чем - в вопросе этого не было.


 
Ihor Osov'yak ©   (2003-03-27 01:45) [10]

2 Tano © (26.03.03 12:07)

> Для чтения/записи из/по определенного(ому) адреса(у) можно использовать ASM

А можно и не использовать...
Что за привычка строить сентенции вида "нельзя, но вот на асме..." ?





 
Tano ©   (2003-03-27 09:32) [11]

Все, задавили. Уже лень отписываться.

>Alex Konshin © (27.03.03 01:39)
Я почему-то не заметил особых отличий при ОБРАЩЕНИИ к физической или виртуальной памяти. Управление - это да.

>Ihor Osov"yak © (27.03.03 01:45)
А дочитать предложение, слабо?
Я не строю "сентенции", а даю альтернативы. Человек интересовался как работать с памятью и если его не устраивают простые переменные, то и упоминание асма никого не должно смутить. Я не говорю "Только на асме..." И НИКОГДА НЕ УТВЕРЖДАЛ!!! /можно на C :-))/, шутка.
Я не слишком люблю сверх-высоко-уровеневое программирование. Чем больше за тебя делает компилятор, тем сложнее искать непонятные глюки.
Можете назвать меня лохом корявым, но пока никто не отменил машинные коды и запретить их использовать для НЕКОТОРОГО КЛАССА ПРИЛОЖЕНИЙ мне никто не может.
Слабо без асма организовать обмен с портом $280, на котором висит самодельное и постоянно рихтуемое ISA-устройство промышленного назначения. Чисто для проверки и подбора оптимального режима работы и протокола обмена.

Не зря нас закинули в "Потрепаться".

Epilogue.
Верх упорства: набирать неверный пароль, пока компьютер не согласится.

Всем доброго дня! Давайте направлять свободное время в полезное русло.


 
MBo ©   (2003-03-27 09:37) [12]

>Я почему-то не заметил особых отличий при ОБРАЩЕНИИ к физической или виртуальной памяти
??????????????????????


 
Palladin ©   (2003-03-27 09:41) [13]


> Я почему-то не заметил особых отличий при ОБРАЩЕНИИ к физической
> или виртуальной памяти

:) видимо небыло у тебя никогда pagefile.sys размером в 1Гб...


 
Tano ©   (2003-03-28 20:36) [14]

Уточню свою реплику:
Я сделал тестовую программку, в которой перепробовал все попавшиеся в Helpах процедуры выделения памяти:
1.GetMem
2.LocalAlloc
3.HeapAlloc
4.VirtualAlloc
У всех у них конечная цель одна - предоставить мне в безвоздмездное пользование область памяти запрошенного размера. Возвращают они указатель на эту область /у меня - BASE_PTR/, использовал FIXED блок, MOVABLE меня не интересовал, потому, что все-равно при обращении к блоку по адресу нужно фиксировать его и получать уже точный адрес.
Далее - проверка используемости памяти:

var
MOffs, MPtr :Cardinal; B :Byte;
begin
for MOffs:=0 to (Длина_занятого_блока - 1) do
begin
MPtr:=BASE_PTR+MOffs;
B:=Byte(MOffs); //предсказуемые разные числа
asm
push eax
push ebx

mov ebx, DWORD PTR MPtr //Загружаю в EBX адрес, содержащийся в переменной.

mov al, B
mov [ebx], al //кидаю байт в память

pop ebx
pop eax
end;
end;
end;

Далее шла аналогичная конструкция для чтения этой области и проверки, тот ли байт считал, который записывал.

Так вот. VirtualAlloc выделяет (не резервирует! - я читал про параметры вызова) мне память, которую я могу пользовать так же, как и от GetMem. Вот что я имел ввиду под "нет отличий при ОБРАЩЕНИИ" - процессору по боку, каким образом я выделил себе память. Еще раз акцентирую - управление и обращение я рассматривал независимо друг от друга.

А насчет SWP в гиг - не пугайте большими числами. Пока все это разбирал, сделал себе pagefile.sys таким, каким позволила винда (правда разбросаным по дискам и "Властелина Колец" пришлось стереть :). А максимальный блок, который смог отхватить у винды был 1_800_000_000 байт.

P.S.
Я просто пытался коротко описать свои мысли, но, к сожалению, не вышло. Если можно не просто опровергайте мои слова, а пишите, как правильно надо собственно. Я ж не мастер, только учусь :)


 
Tano ©   (2003-03-28 20:36) [15]

Уточню свою реплику:
Я сделал тестовую программку, в которой перепробовал все попавшиеся в Helpах процедуры выделения памяти:
1.GetMem
2.LocalAlloc
3.HeapAlloc
4.VirtualAlloc
У всех у них конечная цель одна - предоставить мне в безвоздмездное пользование область памяти запрошенного размера. Возвращают они указатель на эту область /у меня - BASE_PTR/, использовал FIXED блок, MOVABLE меня не интересовал, потому, что все-равно при обращении к блоку по адресу нужно фиксировать его и получать уже точный адрес.
Далее - проверка используемости памяти:

var
MOffs, MPtr :Cardinal; B :Byte;
begin
for MOffs:=0 to (Длина_занятого_блока - 1) do
begin
MPtr:=BASE_PTR+MOffs;
B:=Byte(MOffs); //предсказуемые разные числа
asm
push eax
push ebx

mov ebx, DWORD PTR MPtr //Загружаю в EBX адрес, содержащийся в переменной.

mov al, B
mov [ebx], al //кидаю байт в память

pop ebx
pop eax
end;
end;
end;

Далее шла аналогичная конструкция для чтения этой области и проверки, тот ли байт считал, который записывал.

Так вот. VirtualAlloc выделяет (не резервирует! - я читал про параметры вызова) мне память, которую я могу пользовать так же, как и от GetMem. Вот что я имел ввиду под "нет отличий при ОБРАЩЕНИИ" - процессору по боку, каким образом я выделил себе память. Еще раз акцентирую - управление и обращение я рассматривал независимо друг от друга.

А насчет SWP в гиг - не пугайте большими числами. Пока все это разбирал, сделал себе pagefile.sys таким, каким позволила винда (правда разбросаным по дискам и "Властелина Колец" пришлось стереть :). А максимальный блок, который смог отхватить у винды был 1_800_000_000 байт.

P.S.
Я просто пытался коротко описать свои мысли, но, к сожалению, не вышло. Если можно не просто опровергайте мои слова, а пишите, как правильно надо собственно. Я ж не мастер, только учусь :)


 
Alex Konshin ©   (2003-03-29 05:06) [16]

Да ты, холоп, все не уймешься!? (c) Иван Васильевич

Из всего тобой сказанного следует только одно - ты просто никогда не работал с физической памятью и не знаешь в чем ее отличие от виртуальной.
Посмотри, например, здесь, как действительно можно работать с физической памятью http://www.sysinternals.com/ntw2k/info/tips.shtml#KMem


 
Tano ©   (2003-03-29 06:18) [17]

Спасибо, что прояснили ситуацию. Теперь понял, о каком отличии шла речь.



Страницы: 1 вся ветка

Текущий архив: 2003.04.14;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.012 c
4-44500
GreatMaster
2003-02-14 07:18
2003.04.14
Как узнать установлен ли в св-вах системы размер шрифта


3-44069
AlexanderSK
2003-03-26 15:01
2003.04.14
Как получить данные из DOMAIN-а?


1-44154
Neznaika
2003-03-31 09:49
2003.04.14
Прозрачный фон под текстом.


3-44026
Gaber
2003-03-25 17:45
2003.04.14
Транзакция (уровень изоляции)


1-44127
stur
2003-04-03 10:58
2003.04.14
Можно ли имя компонента выбирать автоматически..