Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.04.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.007 c
14-44389
romychk
2003-03-25 11:24
2003.04.14
SQL сервер PostgreSQL


1-44090
Непоседа
2003-04-02 15:31
2003.04.14
Подскажите как документе Worda, через OLE перейти на закладку


3-44056
minva74
2003-03-21 21:02
2003.04.14
Компоненты прямого доступа к SQL Server


1-44092
waw
2003-04-02 14:55
2003.04.14
Не правильно считается итого в QReport с условным подсчетом


14-44442
a3m
2003-03-29 19:01
2003.04.14
C++ vs Pascal: что роднее?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский