Shell-Befehl zum Lesen von Geräteregistern?


18

Gibt es auf einem Einplatinencomputer unter Linux eine Möglichkeit, den Inhalt der Gerätekonfigurationsregister zu lesen, die die Hardware steuern? Ich denke, es wäre ein Wrapper für inw().

Ich suche nach etwas, das dem mdBefehl U-boot memory dump ( ) entspricht und im Kontext des Treiber-Debuggens verwendet werden kann.


2
Dies kann hilfreich sein, aber lesen Sie unbedingt
Gilles '

Irgendwelche Updates dazu ??
Sen

@Sen: Negativ. Ich bin immer noch ratlos. Ich habe den verknüpften Thread gelesen, der darauf hinweist, dass inw () nicht das tut, was ich dachte: "inb () und friends dienen nur zur Emulation des PCI- und ISA IO-Adressraums." Ich benutze ein Oszilloskop und lese eine Menge Kerneltreibercode als meine nächstbesten Optionen.
Pingswept

Antworten:


14

Wenn Sie die physikalische Adresse des Geräts kennen, können Sie devmem2 verwenden.

devmem2 <physical address> <size (b/h/w)> [value]

3

Ich weiß nicht, ob man das direkt mit einem Vanillekern machen kann.

Aber es sollte ziemlich knapp sein, einen einfachen Treiber zu schreiben, der eine "Datei" in / proc verwendet, um den Speicherinhalt zu exportieren, den Sie sehen möchten.

Dann können Sie Ihre "Datei" mit einem einfachen Skript lesen und haben Zugriff auf diesen Speicher.


1

Ich könnte völlig falsch liegen und mir verzeihen, wenn ich das tue, aber wenn der md-Befehl von uboot nur Speicheradressen liest, die den Geräteregistern zugeordnet sind, und die Inhalte an Sie zurückgibt, könnten Sie nicht dieselben Speicherorte mit geschickter Verwendung lesen von dd if=/dev/mem ...?


Ich denke, diese Route hat Potenzial, aber es scheint, dass es ein Problem gibt. Dieser als root ausgeführte Befehl: "dd if = / dev / mem bs = 1 skip = 10000 count = 512" gibt diesen Fehler aus: "dd: / dev / mem: Bad address" Ich bin nicht sicher, was das bedeutet. Google sagt mir, dass es etwas mit den Änderungen zu tun hat, die im 2.6-Kernel eingeführt wurden, aber ich verstehe noch nicht genug darüber, um es zu umgehen.
Pingswept

1
Vielleicht versuchen Sie es mit dem Mtdblock-Treiber. Überprüfen Sie dies: en.gentoo-wiki.com/wiki/Using_Graphics_Card_Memory_as_Swap Aber anstatt es auf den RAM Ihrer Grafikkarte zu verweisen, versuchen Sie vielleicht, es auf die Geräteregister zu verweisen.
LawrenceC

0

Ist die PCI-Gerätekonfiguration in / sys / bus / pci / devices / * / config hilfreich?


2
Dies ist wirklich ein Kommentar, keine Antwort auf die Frage. Bitte benutze "Kommentar hinzufügen" um dem Autor eine Bewertung zu geben.
Renan

@Renan "Das ist wirklich ein Kommentar" Wahrscheinlich ungewollt, aber trotzdem lustig. +1 für die Aufhellung meines Tages mit Tautologie. edit: Mir ist gerade klar geworden, dass dies sarkastisch wirken könnte. Ich meine es nicht so.
root

0

busybox devmem

busybox devmemist meine bevorzugte Version, von devmem2der unter /unix//a/134661/32558 erwähnt wurde

devmem2kam in vielen verschiedenen Versionen von verschiedenen Upstreams, insbesondere Buildroot http://free-electrons.com/pub/mirror/devmem2.c

Ein Busybox-Dienstprogramm ist jedoch kanonischer, allgemein verfügbar und wird gewartet.

Beispielsweise devmem2wurde von Debian abgelehnt: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=595805 (aber trotzdem wurde ein Ubuntu-Paket erstellt).

Du kannst es in Ubuntu bekommen mit:

sudo apt-get install busybox

Verwendung: 4 Bytes von der physikalischen Adresse lesen 0x12345678:

sudo busybox devmem 0x12345678

Schreiben Sie 0x9abcdef0an diese Adresse:

sudo busybox devmem 0x12345678 w 0x9abcdef0

Hier sind einige coole Möglichkeiten zum Testen devmem: /programming/12040303/accessing-physical-address-from-user-space/45127890#45127890


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.