2016年8月22日 星期一

/var/log/message time 怎麼來的

Aug 22 14:40:13 (none) syslog.info syslogd started: BusyBox v1.24.1
Aug 22 17:41:39 jimmy-deb6-2 kernel: [    0.000000]  BIOS-e820: 0000000000000000 - 000000000009fc00 (usable)



Aug 22 17:41:39:
syslogd.c  timestamp_and_log ,jiffies




[    0.000000]:
這個時間是printk.c   print_time函數印出的 , 而時間的取值,  local_clock();



遇到jiffies不準,先查看現在是用哪種timer?
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
有哪些timer是被支援的
cat /sys/devices/system/clocksource/clocksource0/available_clocksource
而  kvm-clock tsc hpet acpi_pm  這幾個是可選的



x86_init.c
x86_init_ops x86_init __initdata  有設定硬體的設定


在entry_64.S這個檔案裡可以看到
apicinterrupt LOCAL_TIMER_VECTOR \
apic_timer_interrupt smp_apic_timer_interrupt
做註冊interrput的動作. 而jiffies的增加是透過smp_apic_timer_interrupt(我有開smp)
在往上追apic.c 可以看到
__setup_APIC_LVTT
lapic_timer_setup
使用了LOCAL_TIMER_VECTOR
apic_write(APIC_LVTT, lvtt_value);  對reigster寫值. 參考了一下intel spec
http://www.intel.com/content/dam/doc/specification-update/64-architecture-x2apic-specification.pdf
APIC_LVTT 0x320
0320H 032H LVT Timer Register Read/Write
的確有對上.



在這個修改案例中也遇到了request_irq ,這個主要是使用kthread來處理觸發的動作
在kernel/irq/manage.c   setup_irq_thread()  可以看到kthread_create



ibm 時鐘文章:
https://www.ibm.com/developerworks/cn/linux/l-cn-clocks/
https://www.ibm.com/developerworks/cn/linux/l-cn-timerm/


可以透過下面ftrace , do_timer開始追相關的函數
https://drive.google.com/file/d/0B8hm-I2M8BD7aXlua1hIa0pJOEU/view?usp=sharing



在cat /proc/timer_list 可以看到目前timer的設定部分

沒有留言:

張貼留言