Comment lire ring buffer dans l'espace du noyau linux?
j'écris un pilote de caractères Linux qui peut imprimer des journaux système dans l'espace utilisateur. Tout comme la commande 'dmesg' ne. J'ai appris que tout le journal que nous imprimons avec 'printk' sera envoyé à un espace appelé ring buffer. Si j'ai des questions:
- est-ce que ring buffer est dans l'espace du noyau?
- si oui, comment puis-je lire le tampon de bague dans l'espace du noyau? (J'ai essayé de lire le code source de dmesg.c. Mais il n'a pas aidé.)
2 réponses
Ce que vous cherchez est /proc/kmsg
. C'est le noyau de l'anneau de la mémoire tampon!
Oui, c'est dans l'espace du noyau. Tout processus essayant de le lire devrait avoir des super privilèges d'utilisateur pour le lire!
comment le lire le tampon annulaire? Voici une belle illustration D'IBM Developerworks
dmesg
serait votre première station! Comment fonctionne dmesg accomplir sa tâche? Par un appel à syslog()
! Comment fonctionne syslog faire son travail? Par l'intermédiaire de l'interface d'appel de système qui à son tour appel do_syslog()
. do_syslog()
la finition agir comme .
Voici quelques ressources pour vous plus d'infos sur /proc/kmsg
et la journalisation du noyau général-
C'est-à-Pavan est très bonne réponse (m'a beaucoup appris):
une distribution différente peut rediriger la sortie de /proc/kmsg vers les fichiers journaux physiques ou les périphériques virtuels (/dev / xxx) qu'ils aiment. Mais "/ proc/kmsg" est la source originale du journal du noyau, parce que le noyau implémente son opération de tampon annulaire à l'intérieur de fs/proc / kmsg.c:
static const struct file_operations proc_kmsg_operations = {
.read = kmsg_read,
.poll = kmsg_poll,
.open = kmsg_open,
.release = kmsg_release,
.llseek = generic_file_llseek,
};
alors comment voyez-vous la sortie:
sudo tail-f / proc/kmsg
Mais vous ne pouvez voir tous les les messages générés après que vous ayez émis cette commande - tous les messages précédents dans le tampon de l'anneau ne seront pas imprimés. Et donc pour voir la sortie du fichier physique, vous pouvez rechercher l'utilisateur de "/ proc/kmsg":
sudo lsof / grep proc.kmsg
Et ma machine a indiqué ceci:
rsyslogd 1743 syslog 3r REG 0,3 0 4026532041 /proc/kmsg
in:imuxso 1743 1755 syslog 3r REG 0,3 0 4026532041 /proc/kmsg
in:imklog 1743 1756 syslog 3r REG 0,3 0 4026532041 /proc/kmsg
rs:main 1743 1757 syslog 3r REG 0,3 0 4026532041 /proc/kmsg
alors maintenant c'est le pid 1743, voyons les fichiers ouverts par fd 1743:
sudo ls-al / proc / 1743 / fd
lrwx------ 1 root root 64 Dec 11 08:36 0 -> socket:[14472]
l-wx------ 1 root root 64 Dec 11 08:36 1 -> /var/log/syslog
l-wx------ 1 root root 64 Dec 11 08:36 2 -> /var/log/kern.log
lr-x------ 1 root root 64 Dec 11 08:36 3 -> /proc/kmsg
l-wx------ 1 root root 64 Dec 11 08:36 4 -> /var/log/auth.log
et voilà, le pid 1743 est rsyslogd, et il redirige la sortie de /proc /kmsg vers des fichiers comme/var/log /syslog et/var/log / kern.journal etc.