GNU/Linux >> Linux の 問題 >  >> Linux

Linux カーネルで getnstimeofday を使用する例

getnstimeofday は __get_realtime_clock_ts のフロントエンドですが、システムで高解像度のクロックが利用できない場合にも機能します。この場合、(kernel/time/timekeeping.c の代わりに) kernel/time.c で定義されている getnstimeofday を使用して、低解像度の要件のみを満たす timespec を提供します。

Linux カーネルは、時間を管理するための多数のインターフェースを提供します。 getnstimeofday はその 1 つで、秒単位とナノ秒単位の時間を提供します。この関数は「timekeeping32.h」に実装されており、2 つのメンバーを持つ timespec 型の構造体を返します。

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

時刻を出力するには、関数 getnstimeofday の呼び出しによって埋められる tv_sec と tv_nsec の値を出力するだけで済みます。次のコード例では、読み取り時に秒とナノ秒の値を出力する gettime という proc エントリを作成しました。

#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);

上記のコードを proc_read_gettimeofday.c として保存し、次の makefile を使用してコードをコンパイルします。

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

以下を使用してモジュールをコンパイルして挿入します。

$ make
$ sudo insmod proc_read_getnstimeofday.ko

出力を表示するには、cat コマンドを使用して proc エントリ gettime を読み取るだけです。

# cat /proc/gettime 
1584690328 seconds 
290430470 nanoseconds


Linux
  1. Linuxカーネルテストのライフサイクル

  2. Linux –異なるLinux / UNIXカーネルは交換可能ですか?

  3. Linux Bash での名前付きパイプの使用例

  1. ProcDumpを使用してLinuxをデバッグする

  2. Linuxデスクトップでカーネルをアップグレードする方法

  3. Linux –カーネル:名前空間のサポート?

  1. Linux –カーネルIP転送?

  2. Linux – Linuxの汚染されたカーネル?

  3. Linux –新しいカーネルのシステムコール呼び出しメソッド?