Jump to content

    

Доступ к регистрам

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

 

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

 

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

 

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

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

 

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

Share this post


Link to post
Share on other sites
Выложил:

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

Share this post


Link to post
Share on other sites
Насколько по основе данный сервис схож с devmem2 + mem2io.c?

 

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

 

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

 

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

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

Share this post


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

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

 

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

Share this post


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

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

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites
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, то апликация даст вам доступ к ней.

Share this post


Link to post
Share on other sites

Обращаться как к памяти, преобразовав адреса через 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 драйвера. Так?

 

Share this post


Link to post
Share on other sites
On 5/20/2019 at 10:42 PM, dxp said:

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

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

 

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now