Как использовать dd if=/dev/mem вместо devmem?

Это сообщение довольно тонкое; он даже не говорит вам, что на самом деле проблема.

Это как-то связано с фильтрацией источника многоадресной рассылки .

Обычно при многоадресной рассылке машина IPv4 присоединяется к группе многоадресной рассылки по протоколу IGMP - вот почему вы видите igmp в строке журнала - который сообщает всему сетевому оборудованию вокруг него, что он хочет получить что-либо. отправлено в эту группу многоадресной рассылки. RFC3678 определяет способ изменить это, говоря такие вещи, как «... но только если он исходит из этого набора IP-адресов» или «... но не если он исходит из IP 1.2.3.4».

Почему вы должны видеть это на интернет-маршрутизаторе, меня сбивает с толку. Многоадресная рассылка обычно не работает через Интернет. Так всегда было задумано, но провайдеры и магистральные сети никогда не делали ничего, чтобы позволить это. (По той же причине, по которой мы все еще ждем IPv6, в нескольких минутах от полуночи IPv4.")

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

Остерегайтесь, если этот маршрутизатор является чем-то вроде домашнего Комбинация Wi-Fi / коммутатор / маршрутизатор, вы, вероятно, не захотите отключать эту функцию. Вероятно, вы предотвратите многоадресную рассылку в локальной сети. Многоадресная рассылка в локальной сети все еще относительно редка по сравнению с широковещательной и одноадресной, но обычно привыкает незаметно, поэтому вы можете даже не знать, что используете его. В то время как вы можете быть совершенно уверены в том, используете ли вы многоадресную передачу через Интернет, потому что вам, вероятно, придется спросить своего интернет-провайдера, могут ли они и, чтобы включить его для вас, предполагается, что он всегда работает в локальных сетях, особенно в бизнес-классе. В результате многие бизнес-приложения просто предполагают, что они могут это сделать. Norton Ghost многоадресная рассылка изображений, например, при восстановлении фантомных изображений на нескольких машинах.

3
25.08.2018, 04:52
2 ответа

Частичный ответ:

Если ваш devmemвзят из busybox, он использует /dev/mem для чтения и записи значений, поэтому вы должны получить такие же результаты.

Тем не менее, обратите внимание, что единицей skipявляются блоки(bsбайтов ), поэтому bs=16 count=1 skip=2149646336будет читаться не по адресу 0x80210000, а по адресу 0x802100000, что, вероятно, переносится на 0x02100000.

Поскольку MSB ваших пропусков равен единице, если где-то в исходном коде и/или компиляторе есть путаница со знаком/без знака, это также может все испортить.

Итак, первое, что я бы сделал, это проверил чтение по адресу 0x80210000, используя что-то вроде bs=16 skip=134352896. Если это все еще не работает, второе, что я бы сделал, это написал небольшую программу на C, которая напрямую читает /dev/memи проверяет, работает ли и .

3
27.01.2020, 21:25

Это действительно ошибка знака(для версии busybox):

if (skip) {
    if (lseek(ifd, skip * ibs, SEEK_CUR) < 0) {
        do {
            ssize_t n = safe_read(ifd, ibuf, ibs);
            if (n < 0)
                goto die_infile;
            if (n == 0)
                break;
        } while (--skip != 0);
    }
}

lseek()возвращает смещение файла (2149646336 ), которое преобразуется в int32, делая его отрицательным (-2145320960 ), поэтому ddсчитает, что это код ошибки. Затем он считывает все байты из файла до заданного смещения, пытаясь реализовать базовый поиск. Это означает чтение всех байтов на шине от 0 до вашего адреса, что может привести только к неприятностям.

Вы можете попытаться исправить dd, проверив, является ли возвращаемое значение допустимым кодом ошибки (что-то между -1 и -4095 ), но написание собственной программы на C, вероятно, будет быстрее, чем повторная компиляция busybox.

Кстати, devmemиспользует mmap()для чтения /dev/mem, что немного отличается.

1
25.04.2020, 02:44

Теги

Похожие вопросы