Перейти к содержанию
    

тама смещенные адреса - тоже пободался чутка, было дело ..

 

факт лишь тот - что прямой доступ только по руту или драйвер ...

 

ПС: по факту, в итоге - плюнул - для простеньких задач быстрее прямо на контроллере ...

 

Смещенные гигабайт :). Я бодался пока не нашел какую-то апликацию в сети и в ней увидел, что вместо

7f200000-7f2000b3 адреса 3f200000-3f2000b3. Меня это разозлило и я написал апликацию, которая сама видит где правильные адреса.

 

Мне то что по руту не мешает. Я для поиска правильной конфигурации регистров писал апликацию, которую и с рутом можно запустить. Мне в тот момент надо было измерить джиттер кернелного таймера. Просто было любопытно если драйвер телефонного таймера без железа, а чисто на софте -- сильно будет гулять интервал. Дело в том, что для VOIP телефонов подклученых к Asterisk можно потерять синхронизацию в conference call (не знаю как по-русски -- уехал из республики развалившегосю СССР когда такого еще не было). Для этого последним в конфигурации ставят телефон на железе, а не программный или если нет такого -- то таймер. Самое смешное, что все сделал -- увидел осциллографом сигнал. Сделал логгер и осталось сделать резисторный делитель, чтобы согласовать выход 3.3V GPIO со входом логгера 250 милливольт аудио. Уже несколько месяцев некогда.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выложил:

https://github.com/stepanovr/linuxreg

 

Поскольку делал для Raspberry PI, то на 32 бита получилось. 64 бита криво выглядят -- надо будет найти время.

Вам, olej, она навряд ли подойдет. Ведь вы в основном на 386 архитектуре, а она сегодня 64 бита.

 

Насколько по основе данный сервис схож с devmem2 + mem2io.c?

 

http://sg.danny.cz/foxg20/ag25g20_utils-0.96r10/

 

http://www.makelinux.net/books/embedded_li...drivers/text152

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насколько по основе данный сервис схож с devmem2 + mem2io.c?

 

http://sg.danny.cz/foxg20/ag25g20_utils-0.96r10/

 

http://www.makelinux.net/books/embedded_li...drivers/text152

 

Не очень понимаю о чем вы. Никакого сервиса нет. Я просто апликацию написал, которая находит по каким адресам находится периферия и мапирует адреса для получения доступа к ним. Как я описывал ранее.

Если ядро скомпилировано с защитой от доступа,то никакая апликация не сможет увидеть. Нужно писать драйвер, что позволит влегкую подвесить ядро вводом неверных параметров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не очень понимаю о чем вы. Никакого сервиса нет. Я просто апликацию написал, которая находит по каким адресам находится периферия и мапирует адреса для получения доступа к ним. Как я описывал ранее.

Если ядро скомпилировано с защитой от доступа,то никакая апликация не сможет увидеть. Нужно писать драйвер, что позволит влегкую подвесить ядро вводом неверных параметров.

 

Да, хорошая аппликация. Вопрос, собственно был о разнице или, наоборот, схожести методов получения доступа к регистрам, который применили вы и который используется в devmem2.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, хорошая аппликация. Вопрос, собственно был о разнице или, наоборот, схожести методов получения доступа к регистрам, который применили вы и который используется в devmem2.

Спасибо не добром слове. Думаю, что не так много способов есть доступа. Открывается файл и затем маппируется. Все функции в этом файле кроме самой первой это делают. Весь трюк доступа здесь и есть -- остальное оформление и удобства:

https://github.com/stepanovr/linuxreg/blob/...ter/app/rdmem.c

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В продолжение темы о доступе к регистрам. 

 

Вот есть PCIe устройство, для него выделен регион памяти (через BAR0), в котором реализованы регистры управления этим устройством. Адрес (физический) этого региона, положим, 0xfb0a4000.

 

Вопрос: как с помощью inb/inw/inl/outb/outw/outl и прочих обратиться к регистру (32-битному), находящемуся по этому адресу? 

 

P.S. Платформа x86.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 5/6/2019 at 4:54 AM, dxp said:

В продолжение темы о доступе к регистрам. 

 

Вот есть PCIe устройство, для него выделен регион памяти (через BAR0), в котором реализованы регистры управления этим устройством. Адрес (физический) этого региона, положим, 0xfb0a4000.

 

Вопрос: как с помощью inb/inw/inl/outb/outw/outl и прочих обратиться к регистру (32-битному), находящемуся по этому адресу? 

 

P.S. Платформа x86.

Надо создать виртуальный поинтер при помощи mmap и по нему обращаться как к памяти. Посмотрите как это делается в моей апликации, что я упомянул ранее.

https://github.com/stepanovr/linuxreg

Возможно вам и апликации хватит, а если она не покажет нужную память, то можете ее модифицировать и получить нужное.

Если вашу память видно в /proc/iomem, то апликация даст вам доступ к ней.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обращаться как к памяти, преобразовав адреса через mmap, я умею (и из Си, и из Питона получилось). Но речь шла именно о командах in/out, которые из userspace дают возможность добраться до регистров периферии, что вроде как заявляется как предпочтительным способом работы с периферией вместо того, чтобы городить интерфейс через драйвер. И вот не ясно, как в описанном выше случае это сделать.

В 12.04.2017 в 16:13, Olej сказал:

Программный код пользовательского режима вполне может (с существенными ограничениями) обращаться к регистрам внешних устройств. См. прямо в системе man по:

ioperm(2), iopl(2), inb(2), outb(2), capabilities(7) и т.д. (процессор i386 только).

Кроме того, Linux предоставляет даже специальное символьное устройство /dev/port для прямых чтения и записи в порты внешних устройств (с правами root, естественно).

 

Более того, во многих случаях в Linux всячески поощряется организация ввода/вывода именно из пространства пользователя, без написания модулей ядра (драйверов). Для того делаются специальные и достаточно сложные инструменты промежуточного слоя. Самые известные тому примеры: проект libusb и файловая система FUSE, на которых в последние годы реализуется стандартная поддержка тысяч разнообразных устройств от их производителей.

Насколько я понимаю, в моём случае этого сделать нельзя, т.к. in/out - это интерфейс работы через порты ввода-вывода, а они определены для ограниченного перечня устройств (типа стандартных COM/LPT портов), и в общем случае для произвольного периферийного устройства их нет. Поэтому либо через отображение памяти, либо через API драйвера. Так?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 5/20/2019 at 10:42 PM, dxp said:

Обращаться как к памяти, преобразовав адреса через mmap, я умею (и из Си, и из Питона получилось). Но речь шла именно о командах in/out, которые из userspace дают возможность добраться до регистров периферии, что вроде как заявляется как предпочтительным способом работы с периферией вместо того, чтобы городить интерфейс через драйвер. И вот не ясно, как в описанном выше случае это сделать.

Насколько я понимаю, в моём случае этого сделать нельзя, т.к. in/out - это интерфейс работы через порты ввода-вывода, а они определены для ограниченного перечня устройств (типа стандартных COM/LPT портов), и в общем случае для произвольного периферийного устройства их нет. Поэтому либо через отображение памяти, либо через API драйвера. Так?

 

Ну что-то вроде того. Для этих команд нужно специальное исполнение в железе. Они в другом адресном пространстве. Если разработчики железа подкючат сигналы к узлам выработки сигнала выбора устройства, то они будут работать. Причем только таким способом и никаким другим к ним можно будет добраться.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...