wake-up-neo.net

Wie bekomme ich die aktuelle Stunde (Uhrzeit) im Linux Kernel Space?

Ich schreibe ein Kernel-Modul, das prüft, ob die Zeit zwischen zwei angegebenen Stunden liegt, und deaktiviert die Eingabe, falls dies der Fall ist. Das hat damit zu tun, dass ich früh ins Bett gehen will. (Ich weiß, ich könnte auch eine beliebige Anzahl verschiedener Techniken verwenden, einschließlich cron usw., aber ich wollte die Kernel-Programmierung lernen ...)

Als erste Version überprüfe ich deshalb, ob die aktuelle Stunde zwischen Anfang und Ende liegt, die über Parameter am Modul eingestellt werden.

Meine Frage lautet daher: Wie bekomme ich die aktuelle Stunde? Ich habe keinen Zugriff auf die üblichen Zeitfunktionen in der Standardbibliothek, da ich mich im Kernel befinde. Ich vermute, dass ich do_gettimeofday () dafür verwenden sollte, aber das gibt mir nur Sekunden und Nanosekunden und ich brauche Stunden am aktuellen Tag.

Vielen Dank.

21
Tom Macdonald

time_to_tm Funktion kann Ihnen dabei helfen, die Struktur tm zurückzugeben. In der Variablen sys_tz verfügbare Zeitzone kann es Ihnen helfen, den Offset richtig einzustellen, um Ortszeit zu erhalten.

15
Zimbabao

Um die Ortszeit im Kernel zu ermitteln, fügen Sie den folgenden Code-Snippet Ihres Kernel-Treibers hinzu:

struct timeval time;
unsigned long local_time;

do_gettimeofday(&time);
local_time = (u32)(time.tv_sec - (sys_tz.tz_minuteswest * 60));
rtc_time_to_tm(local_time, &tm);

printk(" @ (%04d-%02d-%02d %02d:%02d:%02d)\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
6
Bharath

Das funktioniert gut für mich:

#include <linux/time.h>
...
/* getnstimeofday - Returns the time of day in a timespec */
void getnstimeofday(struct timespec *ts)

Für das normale Zeitformat können Sie Folgendes verwenden:

printk("TIME: %.2lu:%.2lu:%.2lu:%.6lu \r\n",
                   (curr_tm.tv_sec / 3600) % (24),
                   (curr_tm.tv_sec / 60) % (60),
                   curr_tm.tv_sec % 60,
                   curr_tm.tv_nsec / 1000);
1
Roman

Wir können die Funktion clock_gettime mit CLOCK_REALTIME als Uhrentyp verwenden.

Referenz http://linux.die.net/man/3/clock_gettime

Wenn Sie nur eine ausführliche Datei mit dem Datum ausführen, erhalten Sie eine Idee, das aktuelle Datum im Kernelmodus zu erhalten.

0
sunmoon