LINUX.ORG.RU

/proc/iomem

 , , ,


0

1

Привет, Лор! Пишу свой небольшой модуль ядра, в котором хочу управлять одним внешним устройством непосредственно, используя специально предназначенные для этого регистры. Однако эти регистры (вообще говоря, некий набор физических адресов) уже отображены в виртуальную память ядра, информация об этом есть /proc/iomem. Таким образом, я не могу их заново отмапить куда-то (request_mem_region() всегда завершается с ошибкой). Возникает вопрос: можно ли как-то узнать, куда отображены физические адреса, указанные в одной из записей в /proc/iomem? Заранее спасибо.

Я не спец, но, пробежавшись по ldd, поимел впечатление, что если адреса есть в /proc/iomem , это совсем не значит, что они отображены в виртуальную память, и request_mem_region вовсе не возвращает виртуального адреса.

anonymous
()
Ответ на: комментарий от ziemin

Спасибо за ответ. К сожалению, это не то. Речь идет о том, что они этот модуль используют и для памяти, и для портов. А про обход ремаппинга я ничего не нашел.
К тому же, вот кусочек из init-функции предлагаемого драйвера:

/* Get our needed resources. */
557         if (!use_mem) {
558                 if (! request_region(short_base, SHORT_NR_PORTS, "short")) {
559                         printk(KERN_INFO "short: can't get I/O port address 0x%lx\n",
560                                         short_base);
561                         return -ENODEV;
562                 }
563 
564         } else {
565                 if (! request_mem_region(short_base, SHORT_NR_PORTS, "short")) {
566                         printk(KERN_INFO "short: can't get I/O mem address 0x%lx\n",
567                                         short_base);
568                         return -ENODEV;
569                 }
570 
571                 /* also, ioremap it */
572                 short_base = (unsigned long) ioremap(short_base, SHORT_NR_PORTS);
573                 /* Hmm... we should check the return value */
574         }
При любом раскладе используется тот же самый request, так что, к сожалению, это не решение.

happycorsair
() автор топика
Ответ на: комментарий от anonymous

К сожалению, дорогой аноним, в моём случае он точно возвращает NULL. Но, возможно, это не всегда так, спасибо за информацию.

happycorsair
() автор топика
Ответ на: комментарий от happycorsair

При любом раскладе используется тот же самый request

Тот же, да не тот. Может ему эта область для буфера нужна. У тебя такие же аргументы?

ziemin ★★
()
Ответ на: комментарий от ziemin

Я не очень понял твой вопрос. Конечно же, у меня свои аргументы :) Ну а вызов request_mem_region() я делаю совершенно аналогично, да.

happycorsair
() автор топика

Таким образом, я не могу их заново отмапить куда-то (request_mem_region() всегда завершается с ошибкой). Возникает вопрос: можно ли как-то узнать, куда отображены физические адреса, указанные в одной из записей в /proc/iomem?

Возникает вопрос - а нахера по-твоему нужен вызов request_mem_region() ? это как раз для того чтобы ты не имел одновременный доступ к регистрам из разных мест. Так что ищи драйвер который использует этот регион памяти и отключай его сначала, а потом делай в своем драйвере

request_mem_region() ioremap()

anonymous
()
Ответ на: комментарий от anonymous

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

happycorsair
() автор топика
Ответ на: комментарий от happycorsair

Конечно же, у меня свои аргументы :) Ну а вызов request_mem_region() я делаю совершенно аналогично, да.

Всерьёз думаешь, что request_mem_region при любых аргументах фейлится?

ziemin ★★
()
Ответ на: комментарий от happycorsair

мой вопрос в том, как узнать, куда смаплен этот регион памяти

Найди драйвер который _уже_ использует эти регистры и отключи его - не надо тут знать куда они отображены, херню ты получишь если один драйвер например выставит делитель частоты 4 а другой потом перестроит на 8. И почитай что такое драйвер перед тем как что-то писать, а лучше вообще ничего не пиши - к ЕГЭ готовься.

anonymous
()
Ответ на: комментарий от ziemin

Если этот регион памяти уже смаплен, как в моем случае, то фейлится - такая у request_mem_region() работа. Если я пробую работать с какой-то другой областью памяти, которая никуда не отображена, с ней все ок.

happycorsair
() автор топика
Ответ на: комментарий от happycorsair

Не факт, что этот short работает на реквесте. Вон и в комментарии написано, что ресурсы резервирует. Может ему окошко нужно, что бы обмениваться данными.

ziemin ★★
()
Ответ на: комментарий от ziemin

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

happycorsair
() автор топика
Ответ на: комментарий от happycorsair

Да вроде факт. Я же скинул кусочек кода, все через него :(

Не ну ты реальный болван. Если тебе все равно использует ли кто-то кроме тебя регистры вызывай сразу ioremap() без request_mem_region() - получишь второе отображение физических адресов в том же виртуальном пространстве, только лучше к ЕГЭ готовься.

anonymous
()
Ответ на: комментарий от anonymous

Да, я реальный болван, и я так и буду делать, если надо будет. Но вопрос сейчас не в этом, а в другом. Я хочу знать, КУДА УЖЕ ОТОБРАЖЕНЫ ЭТИ АДРЕСА, мапить второй раз их мне не с руки совсем. К ЕГЭ готов, борщ на кухне.

happycorsair
() автор топика
Ответ на: комментарий от anonymous

Отображены, т.к.: 1) запись в iomem; 2) внешнее устройство работает.

happycorsair
() автор топика
Ответ на: комментарий от happycorsair

Я хочу знать, КУДА УЖЕ ОТОБРАЖЕНЫ ЭТИ АДРЕСА

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.