GNU/Linux >> Belajar Linux >  >> Linux

Contoh penggunaan getnstimeofday di kernel Linux

getnstimeofday adalah front-end untuk __get_realtime_clock_ts tetapi juga berfungsi jika tidak ada jam resolusi tinggi yang tersedia di sistem. Dalam hal ini, getnstimeofday sebagaimana didefinisikan dalam kernel/time.c (bukan kernel/time/timekeeping.c) digunakan untuk menyediakan spesifikasi waktu yang hanya memenuhi persyaratan resolusi rendah.

Kernel linux menyediakan sejumlah antarmuka untuk mengatur waktu. getnstimeofday adalah salah satunya, yang memberikan waktu dalam detik dan nanodetik. Fungsi tersebut diimplementasikan dalam “timekeeping32.h” dan mengembalikan struktur tipe timespec yang memiliki dua anggota.

struct timespec64 {
 time64_t tv_sec;   /* seconds */
 long  tv_nsec;  /* nanoseconds */
};

Untuk mencetak waktu, kita hanya perlu mencetak nilai tv_sec dan tv_nsec yang diisi oleh pemanggilan fungsi getnstimeofday. Dalam kode contoh berikut, kami telah membuat entri proc yang disebut gettime, yang mencetak nilai detik dan nanodetik saat dibaca.

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/slab.h>

int len;
char *msg;
ssize_t size;
struct timespec ts;

ssize_t read_proc(struct file *filp,char *buf,size_t count,loff_t *offp ) 
{
struct timespec ts;
char *temp;
temp=kmalloc(50*sizeof(char),GFP_KERNEL);
getnstimeofday(&ts);
sprintf(temp,"%ld seconds \n%ld nanoseconds\n",ts.tv_sec, ts.tv_nsec);
len=strlen(temp);
size=sizeof(char)*len;

return simple_read_from_buffer(buf,count,offp,temp,size);
}

struct file_operations proc_fops = {
read:   read_proc
};
void create_new_proc_entry(void) 
{
proc_create("gettime",0,NULL,&proc_fops);
}

int proc_init (void) {
    create_new_proc_entry();
    return 0;
}

void proc_cleanup(void) {
        remove_proc_entry("gettime",NULL);
}

MODULE_LICENSE("GPL");  
module_init(proc_init);
module_exit(proc_cleanup);

Simpan kode di atas sebagai proc_read_gettimeofday.c dan kompilasi kode menggunakan makefile berikut.

ifneq ($(KERNELRELEASE),)    
   obj-m := proc_read_gettimeofday.o 
else 

KERNELDIR ?= /lib/modules/$(shell uname -r)/build 
PWD := $(shell pwd)

default:
 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules  
clean:
 $(MAKE) -C $(KERNELDIR) M=$(PWD) clean
endif

Kompilasi dan masukkan modul menggunakan:

$ make
$ sudo insmod proc_read_getnstimeofday.ko

Untuk melihat output, cukup baca entri proc gettime, menggunakan perintah cat.

# cat /proc/gettime 
1584690328 seconds 
290430470 nanoseconds


Linux
  1. Debug Linux menggunakan ProcDump

  2. Siklus hidup pengujian kernel Linux

  3. Linux – Kernel:Dukungan Namespaces?

  1. Linux – Penerusan Ip Kernel?

  2. Linux – Apakah Kernel Linux/unix yang Berbeda Dapat Dipertukarkan?

  3. Contoh penggunaan pipa bernama di Linux Bash

  1. Cara memutakhirkan Kernel di Desktop Linux

  2. Linux – Kernel Tercemar Di Linux?

  3. Linux – Metode Panggilan Sistem di Kernel Baru?