Как я могу сказать компилятору / ЦПУ выполнять инструкции вплотную в коде пространства ядра?

Как я могу сказать компилятору не оптимизировать и не добавлять какие-либо другие инструкции между ними, и заставить процессор выполнять их вплотную?

Например, я бы хотел, чтобы модуль ядра выполнял команды записи (или чтения или смешивания) как можно быстрее

writel(0, addr);
writel(1, addr);
writel(0, addr);

или же

writel(0, addr1);
writel(1, addr2);
writel(0, addr3);

Редактировать:

  • Я заменил iowrite32 на writel с определением volatile void __iomem *addr

  • addr* может быть выделен с помощью dma_alloc_coherent() или просто ioremap() .

  • Мой вопрос не о порядке выполнения (который решается с помощью барьера памяти или volatile ), а о задержке между ними.

  • Может быть возможно объединить мои команды в одну сборку asm volatile() но я бы предпочел использовать что-то более безопасное.

Всего 1 ответ


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

Руководство gcc говорит об этом явно (6.47.2.2):

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

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

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


Есть идеи?

10000