Как отследить прямой доступ к памяти?

С starваша командная строка выглядит:

touch -t201802280000 ref
star -c -f file.tar -find. -newer ref

Кстати,:-newermt может стать хорошим улучшением для libfindв будущем.

Если вам также нравится дата окончания:

touch -t201802280000 start
touch -t201802282359.59 end
star -c -f file.tar -V pat='start!end' -find. -newer start ! -newer end

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

Поскольку 2018 год не високосный, вы можете использовать touch -t201803010000 end.

4
15.08.2020, 09:06
1 ответ

Воодушевленный комментарием @dirkt, я присмотрелся к драйверам и нашел прерывания PCI MSI, соответствующие этим транзакциям DMA.

Драйвер разрешает эти прерывания вызовом

pci_enable_msix(.., msixTable,..)

, который устанавливает struct msix_entry msixTable[MAXMSIX]. Затем он передает их обработчику static irqreturn_t irqHandler(), вызывая request_irq()в цикле:

request_irq(msixTable[interrupt].vector, irqHandler, 0, devName,...)

Обработчик просто подсчитывает прерывания в локальном intмассиве. Эти счетчики экспортируются в файл /proc/<devName>, который этот драйвер создает для диагностики и т. д. На самом деле файл proc — это то место, откуда я начал поиск прерываний.

Но есть лучший способ :файла /proc/interrupts. Включенные прерывания MSI -X отображаются в строках, подобных этим:

$ cat /proc/interrupts 
            CPU0       CPU1 ...  CPU5       CPU6       CPU7       
  66:          0          0 ...     0          0          0  IR-PCI-MSI-edge      <devName>
  67:          0          0 ...     0          0          0  IR-PCI-MSI-edge      <devName>
  68:         33          0 ...     0          0          0  IR-PCI-MSI-edge      <devName>
  69:          0          0 ...     0          0          0  IR-PCI-MSI-edge      <devName>
  70:          0          0 ...     0          0          0  IR-PCI-MSI-edge      <devName>
  71:          0          0 ...     0          0          0  IR-PCI-MSI-edge      <devName>
  72:          0          0 ...     0          0          0  IR-PCI-MSI-edge      <devName>
  73:          0          0 ...     0          0          0  IR-PCI-MSI-edge      <devName>

И еще один способ — найти PCI-адрес карты в выводе lspciи проверить назначенные плате прерывания в каталоге /sys:

$ ls  /sys/bus/pci/devices/0000:17:00.0/msi_irqs
66  67  68  69  70  71  72  73

# but these are empty
$ cat  /sys/bus/pci/devices/0000:17:00.0/irq
0

Прерывание номер 68 срабатывает к концу транзакций. Обработчики прерываний имеют статическую точку трассировки irq:irq_handler_entryв Linux. Параметры точки трассировки в /sys/kernel/debug/tracing/events/irq/irq_handler_entry/formatимеют номер прерывания в поле int irq. Следовательно, это прерывание можно отследить стандартными средствами Linux по этой точке трассировки с условием фильтрации:

# setup the ftrace
trace-cmd start -e irq:irq_handler_entry -f "irq == 68"
# for live stream
cat /sys/kernel/debug/tracing/trace_pipe
# or just
trace-cmd stop
trace-cmd show
trace-cmd reset

# with perf
perf record -e "irq:irq_handler_entry" --filter "irq == 68"

При этом стоит еще раз подтвердить, что эти прерывания необходимы для прямого доступа к памяти, чтобы быть уверенным, что я отслеживаю что-то важное для системы, а не просто удобный счетчик для файла proc, который может не быть реализуется в другой ситуации.Но я не мог обнаружить какие-либо другие соответствующие прерывания, наблюдая за тем, как они увеличиваются в /proc/interrupts. Есть прерывания для устройств dmar[0123], которые кажутся чем-то вроде DMA, но они никогда не увеличивались. И этого следовало ожидать, так как в этом случае механизм DMA должен быть реализован как ядро ​​FPGA в самой плате PCI.

2
18.03.2021, 23:12

Теги

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