Форум: "Потрепаться";
Текущий архив: 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.009 c