Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с памятью в Linux  (Прочитано 29270 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Fantik
Будущий главный специалист
Участник

ru
Offline Offline

« : 05-06-2008 23:26 » 

Здрасти!!!
Подскажите пожалуйста, как в ОС Linux считать данные находящиеся в оперативной памяти по известному физическому адресу? Может функция есть какая, которой задаешь физический адрес а она вытаскивает данные по нему?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 06-06-2008 05:35 » 

Neznayka, см. устройство /dev/mem (по умолчанию права RW для root и R для группы kmem).
Открываешь как файл, позиционируешься и читаешь/пишешь. Для удобства можно mmap сделать.

Если заглянуть в документацию по ядру, то можно найти назначение устройств.
« Последнее редактирование: 06-06-2008 05:37 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Fantik
Будущий главный специалист
Участник

ru
Offline Offline

« Ответ #2 : 06-06-2008 06:38 » 

Спасибо за совет. Я просто думал может функция какая есть Улыбаюсь
Записан
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #3 : 06-06-2008 09:22 » 

Neznayka, конечно есть Улыбаюсь open() read() fopen() fread() Улыбаюсь
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Fantik
Будущий главный специалист
Участник

ru
Offline Offline

« Ответ #4 : 06-06-2008 10:36 » 

Я про функцию в которую вводишь физический адрес а она возвращает того кто живет по этому адресу. =)
Записан
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #5 : 06-06-2008 10:40 » 

Neznayka, я понимаю Улыбаюсь вам дали пищу для размышления.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Fantik
Будущий главный специалист
Участник

ru
Offline Offline

« Ответ #6 : 06-06-2008 10:45 » 

Мне нужно считывать данные с оперативной памяти которые поступают по определенному физическому адресу - вот. Как разберусь так покажу исходник - кому интересно =)
Записан
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #7 : 06-06-2008 11:28 » 

Neznayka, ну так вам и сказали открываете, позиционируетесь/смещаетесь и читаете.

Код:
fd = open("/dev/mem", O_RDONLY);
lseek(fd, на сколько нужно сместиться, текущая позиция);
res = read(fd, куда, сколько);
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Fantik
Будущий главный специалист
Участник

ru
Offline Offline

« Ответ #8 : 06-06-2008 11:50 » 

Впринципе я так же и делаю. Текущую позицию задаю начало файла т.е. SEEK_SET . Сместиться нужно вперед, а вот на сколько, пока не догадался Жаль .
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #9 : 06-06-2008 11:58 » 

А физический адрес в памяти, что из себя представляет? Ага
Записан

Удачного всем кодинга! -=x[PooH]x=-
Fantik
Будущий главный специалист
Участник

ru
Offline Offline

« Ответ #10 : 06-06-2008 12:02 » 

Только не бейте меня, еще вопрос.
lseek - эта функция с физическим адресом работает, я думал с виртуальным, или адрес посчитать надо?Здесь была моя ладья...
Записан
Fantik
Будущий главный специалист
Участник

ru
Offline Offline

« Ответ #11 : 06-06-2008 12:04 » 

физический адрес из себя представляет 16-тиричное число
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #12 : 06-06-2008 12:15 » 

Цитата
Name
mem, kmem, port - system memory, kernel memory and system ports
Description
 
mem is a character device file that is an image of the main memory of the computer. It may be used, for example, to examine (and even patch) the system.

Byte addresses in mem are interpreted as physical memory addresses. References to non-existent locations cause errors to be returned.
просто переведи 16-ое в 10-ое в Калькуляторе (я так понял что адрес постоянный) и смещайся.
« Последнее редактирование: 06-06-2008 12:17 от PooH » Записан

Удачного всем кодинга! -=x[PooH]x=-
Fantik
Будущий главный специалист
Участник

ru
Offline Offline

« Ответ #13 : 06-06-2008 12:18 » 

Хорошо попробую. Спасибо за помощь. Вы такие славные =).
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #14 : 06-06-2008 12:18 » 

Цитата
lseek - эта функция с физическим адресом работает,
эта функция работает с байтами в файле... ну этоже линух... тут можно с памятью работать как с файлом.
Записан

Удачного всем кодинга! -=x[PooH]x=-
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #15 : 06-06-2008 12:25 » 

В Linux, все, есть файл  Внимание! Говорит и показывает...
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #16 : 06-06-2008 12:31 » 

ну не совсем... тут еще надо определиться что понимать под файлом... лучше сказать, что практически для всего есть образ работа с которым аналогична работе с фалом. имхо.
Записан

Удачного всем кодинга! -=x[PooH]x=-
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #17 : 06-06-2008 12:34 » 

... ну вот я примеру не припомню, чтобы для каждого сокета создавался файловый образ... ну в смысле, работать с TCP соединением как с файлом нельзя, или я ошибаюсь?
Записан

Удачного всем кодинга! -=x[PooH]x=-
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #18 : 06-06-2008 13:02 » 

Код:
unsigned int UnixHTTPURLInputStream::readBytes(XMLByte* const    toFill
                                      , const unsigned int    maxToRead)
{
    unsigned int len = fBufferEnd - fBufferPos;
    if (len > 0)
    {
        // If there's any data left over in the buffer into which we first
        //   read from the server (to get the http header), return that.
        if (len > maxToRead)
            len = maxToRead;
        memcpy(toFill, fBufferPos, len);
        fBufferPos += len;
    }
    else
    {
        // There was no data in the local buffer.
        // Read some from the socket, straight into our caller's buffer.
        //
        len = read(fSocket, (void *) toFill, maxToRead);
        if (len == -1)
        {
            ThrowXMLwithMemMgr(NetAccessorException, XMLExcepts::NetAcc_ReadSocket, fMemoryManager);
        }
    }

    fBytesProcessed += len;
    return len;
}
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 06-06-2008 15:04 » 

Neznayka, виртуальное адресное пространство у каждого процесса свое. См. /proc/номер_процесса/mem
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Fantik
Будущий главный специалист
Участник

ru
Offline Offline

« Ответ #20 : 06-06-2008 15:24 » 

RXL я учел это =)
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #21 : 07-06-2008 04:41 » new

Цитата
len = read(fSocket, (void *) toFill, maxToRead);
тут fSocket не определяет файл... сокет это сокет, и я не помню чтобы у него был файловый образ... то есть, сущесть доступ к которой можно получить используя интерфейс работы с файловой системой... проще говоря, насколько я помню, в "ls" их не видно.
Записан

Удачного всем кодинга! -=x[PooH]x=-
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 08-06-2008 07:15 » 

PooH, тут несколько разные понятия: файлы и файловая система.
Символьные и блочные устройства, различные сокеты, трубы, обычные файлы - все они являются, с точки зрения API, файлами и не важно, имеют ли они имя в файловой системе (тут отличие только в способе открытия). Те же unix-сокеты и трубы могут быть как именованными, так и анонимными - это не значит, что в одном случае это файл, а в другом - нет.

Я хочу сказать, что файловая система - средство хранения файлов, а смысл как файл они обретают только внутри ОС.

В Линуксе есть утилита lsof - показывает, какой процесс какие файлы открыл.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #23 : 09-06-2008 05:57 » 

RXL, я про то, что насколько я помню у обычного TCP/UDP-сокета нет ничего похожего на файл даже с точки зрения API, ну, например, нет fopen, fclose... то есть, у памяти есть /dev/mem у просессов /proc да и еще у кучи всего есть "файловый образ"... а вот для TCP/UDP-сокета я такого не припомню... это все к тому, что McZim говорит что в линухе все файл, я вот как-то в этом сомневаюсь.

ps: lsof под рукой нет, когда открывается сокет на прослушку - она это отображает?
« Последнее редактирование: 09-06-2008 05:59 от PooH » Записан

Удачного всем кодинга! -=x[PooH]x=-
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #24 : 09-06-2008 14:14 » 

PooH,

Все объекты файловой системы - файлы, но не все файлы - из файловой системы Улыбаюсь

В юниксах с каждым сокетом связан файловый дескриптор (file descriptor), который можно передать в низкоуровневые операции чтения/записи (read, write). Более того, такой "чисто сокетной" операции как select, можно передавать не только сокеты, но и дескрипторы файлов из файловой системы - в этом случае select будет срабатывать от чтения/записи в эти файлы.

Функция fopen и компания - это утилиты для работы с определенным типом файлов: объектами из файловой системы. Да, с их помощью нельзя работать с сокетами, но от этого они не перестают быть файлами.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #25 : 09-06-2008 16:04 » 

С помощью потоковых функций можно работать с сокетами. Достаточно создать FILE из fd. Тоже самое с устройствами. Это ведь просто буферизированные функции-обертки. Различие только в способе создания дескриптора, а все IO-операции одинаковые.

PooH, эта утилита отображает все файловые дескрипторы процесса. Она вообще много что умеет.
например, с ее помощью можно найти, кто открыл файл или директорию.
« Последнее редактирование: 09-06-2008 16:07 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines