Fantik
Будущий главный специалист
Участник
Offline
|
|
« : 05-06-2008 23:26 » |
|
Здрасти!!! Подскажите пожалуйста, как в ОС Linux считать данные находящиеся в оперативной памяти по известному физическому адресу? Может функция есть какая, которой задаешь физический адрес а она вытаскивает данные по нему?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #1 : 06-06-2008 05:35 » |
|
Neznayka, см. устройство /dev/mem (по умолчанию права RW для root и R для группы kmem). Открываешь как файл, позиционируешься и читаешь/пишешь. Для удобства можно mmap сделать.
Если заглянуть в документацию по ядру, то можно найти назначение устройств.
|
|
« Последнее редактирование: 06-06-2008 05:37 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Fantik
Будущий главный специалист
Участник
Offline
|
|
« Ответ #2 : 06-06-2008 06:38 » |
|
Спасибо за совет. Я просто думал может функция какая есть
|
|
|
Записан
|
|
|
|
McZim
|
|
« Ответ #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
Будущий главный специалист
Участник
Offline
|
|
« Ответ #4 : 06-06-2008 10:36 » |
|
Я про функцию в которую вводишь физический адрес а она возвращает того кто живет по этому адресу. =)
|
|
|
Записан
|
|
|
|
McZim
|
|
« Ответ #5 : 06-06-2008 10:40 » |
|
Neznayka, я понимаю вам дали пищу для размышления.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
Fantik
Будущий главный специалист
Участник
Offline
|
|
« Ответ #6 : 06-06-2008 10:45 » |
|
Мне нужно считывать данные с оперативной памяти которые поступают по определенному физическому адресу - вот. Как разберусь так покажу исходник - кому интересно =)
|
|
|
Записан
|
|
|
|
McZim
|
|
« Ответ #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
Будущий главный специалист
Участник
Offline
|
|
« Ответ #8 : 06-06-2008 11:50 » |
|
Впринципе я так же и делаю. Текущую позицию задаю начало файла т.е. SEEK_SET . Сместиться нужно вперед, а вот на сколько, пока не догадался .
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #9 : 06-06-2008 11:58 » |
|
А физический адрес в памяти, что из себя представляет?
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Fantik
Будущий главный специалист
Участник
Offline
|
|
« Ответ #10 : 06-06-2008 12:02 » |
|
Только не бейте меня, еще вопрос. lseek - эта функция с физическим адресом работает, я думал с виртуальным, или адрес посчитать надо?
|
|
|
Записан
|
|
|
|
Fantik
Будущий главный специалист
Участник
Offline
|
|
« Ответ #11 : 06-06-2008 12:04 » |
|
физический адрес из себя представляет 16-тиричное число
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
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
Будущий главный специалист
Участник
Offline
|
|
« Ответ #13 : 06-06-2008 12:18 » |
|
Хорошо попробую. Спасибо за помощь. Вы такие славные =).
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #14 : 06-06-2008 12:18 » |
|
lseek - эта функция с физическим адресом работает, эта функция работает с байтами в файле... ну этоже линух... тут можно с памятью работать как с файлом.
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
McZim
|
|
« Ответ #15 : 06-06-2008 12:25 » |
|
В Linux, все, есть файл
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #16 : 06-06-2008 12:31 » |
|
ну не совсем... тут еще надо определиться что понимать под файлом... лучше сказать, что практически для всего есть образ работа с которым аналогична работе с фалом. имхо.
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #17 : 06-06-2008 12:34 » |
|
... ну вот я примеру не припомню, чтобы для каждого сокета создавался файловый образ... ну в смысле, работать с TCP соединением как с файлом нельзя, или я ошибаюсь?
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
McZim
|
|
« Ответ #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
|
|
« Ответ #19 : 06-06-2008 15:04 » |
|
Neznayka, виртуальное адресное пространство у каждого процесса свое. См. /proc/номер_процесса/mem
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Fantik
Будущий главный специалист
Участник
Offline
|
|
« Ответ #20 : 06-06-2008 15:24 » |
|
RXL я учел это =)
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #21 : 07-06-2008 04:41 » |
|
len = read(fSocket, (void *) toFill, maxToRead); тут fSocket не определяет файл... сокет это сокет, и я не помню чтобы у него был файловый образ... то есть, сущесть доступ к которой можно получить используя интерфейс работы с файловой системой... проще говоря, насколько я помню, в "ls" их не видно.
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
RXL
|
|
« Ответ #22 : 08-06-2008 07:15 » |
|
PooH, тут несколько разные понятия: файлы и файловая система. Символьные и блочные устройства, различные сокеты, трубы, обычные файлы - все они являются, с точки зрения API, файлами и не важно, имеют ли они имя в файловой системе (тут отличие только в способе открытия). Те же unix-сокеты и трубы могут быть как именованными, так и анонимными - это не значит, что в одном случае это файл, а в другом - нет.
Я хочу сказать, что файловая система - средство хранения файлов, а смысл как файл они обретают только внутри ОС.
В Линуксе есть утилита lsof - показывает, какой процесс какие файлы открыл.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
PooH
Глобальный модератор
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
|
|
« Ответ #24 : 09-06-2008 14:14 » |
|
PooH, Все объекты файловой системы - файлы, но не все файлы - из файловой системы В юниксах с каждым сокетом связан файловый дескриптор (file descriptor), который можно передать в низкоуровневые операции чтения/записи (read, write). Более того, такой "чисто сокетной" операции как select, можно передавать не только сокеты, но и дескрипторы файлов из файловой системы - в этом случае select будет срабатывать от чтения/записи в эти файлы. Функция fopen и компания - это утилиты для работы с определенным типом файлов: объектами из файловой системы. Да, с их помощью нельзя работать с сокетами, но от этого они не перестают быть файлами.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #25 : 09-06-2008 16:04 » |
|
С помощью потоковых функций можно работать с сокетами. Достаточно создать FILE из fd. Тоже самое с устройствами. Это ведь просто буферизированные функции-обертки. Различие только в способе создания дескриптора, а все IO-операции одинаковые.
PooH, эта утилита отображает все файловые дескрипторы процесса. Она вообще много что умеет. например, с ее помощью можно найти, кто открыл файл или директорию.
|
|
« Последнее редактирование: 09-06-2008 16:07 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|