1. 程式人生 > >Linux時間管理之clocksource

Linux時間管理之clocksource

前面提到了Linux下的時間相關的硬體。TSC PIT,HPET,ACPI_PM,這些硬體以一定的頻率產生時鐘中斷,來幫助我們計時。Linux為了管理這些硬體,抽象出來clocksource。

  1. struct clocksource {
  2.     /*
  3.      * Hotpath data, fits in a single cache line when the
  4.      * clocksource itself is cacheline aligned.
  5.      */
  6.     cycle_t (*read)(struct clocksource *
    cs);
  7.     cycle_t cycle_last;
  8.     cycle_t mask;
  9.     u32 mult;
  10.     u32 shift;
  11.     u64 max_idle_ns;
  12.     u32 maxadj;
  13. #ifdef CONFIG_ARCH_CLOCKSOURCE_DATA
  14.     struct arch_clocksource_data archdata;
  15. #endif
  16.     const char *name;
  17.     struct list_head list;
  18.     int rating;
  19.     int (*enable)(struct clocksource *cs);
  20.     void (*disable)(struct clocksource *cs);
  21.     unsigned long flags;
  22.     void (*suspend)(struct clocksource *cs);
  23.     void (*resume)(struct clocksource *cs);
  24.     /* private: */
  25. #ifdef CONFIG_CLOCKSOURCE_WATCHDOG
  26.     /* Watchdog related data,
     used by the framework */
  27.     struct list_head wd_list;
  28.     cycle_t cs_last;
  29.     cycle_t wd_last;
  30. #endif
  31. } ____cacheline_aligned;
    這些引數當中,比較重要的是rating,shift,mult。其中rating在上一篇博文提到了:
  • 1--99: 不適合於用作實際的時鐘源,只用於啟動過程或用於測試;
  • 100--199:基本可用,可用作真實的時鐘源,但不推薦;
  • 200--299:精度較好,可用作真實的時鐘源;
  • 300--399:很好,精確的時鐘源;
  • 400--499:理想的時鐘源,如有可能就必須選擇它作為時鐘源;
   我們基本在前面看到:    
  1. include/linux/acpi_pmtmr.h
  2. ------------------------------------------
  3. #define PMTMR_TICKS_PER_SEC 3579545
  4. drivers/clocksource/acpi_pm.c
  5. ---------------------------------------------
  6. static struct clocksource clocksource_acpi_pm = {
  7.           .name = "acpi_pm",
  8.           .rating = 200,
  9.           .read = acpi_pm_read,
  10.           .mask = (cycle_t)ACPI_PM_MASK,
  11.           .mult = 0, /*to be calculated*/
  12.           .shift = 22,
  13.           .flags = CLOCK_SOURCE_IS_CONTINUOUS,
  14.  };
  15. dmesg output
  16. ------------------------
  17. [ 0.664201] hpet0: 8 comparators, 64-bit 14.318180 MHz counter
  18. arch/86/kernel/hpet.c
  19. --------------------------------
  20. static struct clocksource clocksource_hpet = {
  21.     .name = "hpet",
  22.     .rating = 250,
  23.     .read = read_hpet,
  24.     .mask = HPET_MASK,
  25.     .flags = CLOCK_SOURCE_IS_CONTINUOUS,
  26.     .resume = hpet_resume_counter,
  27. #ifdef CONFIG_X86_64
  28.     .archdata = { .vclock_mode = VCLOCK_HPET },
  29. #endif
  30. };
  31. dmesg output:
  32. -----------------------------
  33. [ 0.004000] Detected 2127.727 MHz processor. 
  34. arch/x86/kernel/tsc.c
  35. --------------------------------------
  36. static struct clocksource clocksource_tsc = {
  37.     .name = "tsc",
  38.     .rating = 300,
  39.     .read = read_tsc,
  40.     .resume = resume_tsc,
  41.     .mask = CLOCKSOURCE_MASK(64),
  42.     .flags = CLOCK_SOURCE_IS_CONTINUOUS |
  43.                   CLOCK_SOURCE_MUST_VERIFY,
  44. #ifdef CONFIG_X86_64
  45.     .archdata = { .vclock_mode = VCLOCK_TSC },
  46. #endif
  47. };
    從上面可以看到,acpi_pm,hpet tsc的rating分別是200,250,300,他們的rating基本是和他們的frequency符合,TSC以2127.727MHz的頻率技壓群雄,等級rating=300最高,被選擇成current_clocksource:
  1. [email protected]:~# cat /sys/devices/system/clocksource/clocksource0/available_clocksource 
  2. tsc hpet acpi_pm 
  3. [email protected]:~# cat /sys/devices/system/clocksource/clocksource0/current_clocksource 
  4. tsc
    除此外,還有兩個引數shift和mult,這兩個引數是幹啥的呢?
   我們想一下,假如我們需要給你個以一定頻率輸出中斷的硬體,你如何計時?比如我有一個頻率是1000Hz的硬體,當前時鐘源計數是3500,過了一段時間,我擡頭看了下時鐘源計數至是5500,過去了2000cycles,我就知道了過去了2000/1000 =2 second。
  1.  times_elapse = cycles_interval / frequency 
    從上面的例子中,我擡頭看了下當前計數值這個肯定是瞎掰了,實際上要想獲取時鐘源還是需要和硬體打交道的。在clocksource中有一個成員變數是read,這個就是一個時鐘源註冊的時候,提供的一個函式,如果你想獲得我的當前計數值,請呼叫這個read 函式。以TSC時鐘為例:
  1. static struct clocksource clocksource_tsc = {
  2.     .name = "tsc",
  3.     .rating = 300,
  4.     .read = read_tsc,
  5.     .resume = resume_tsc,
  6.     .mask = CLOCKSOURCE_MASK(64),
  7.     .flags = CLOCK_SOURCE_IS_CONTINUOUS |
  8.                   CLOCK_SOURCE_MUST_VERIFY,
  9. #ifdef CONFIG_X86_64
  10.     .archdata = { .vclock_mode = VCLOCK_TSC },
  11. #endif
  12. };
  13. /*--------- arch/x86/kernel/tsc.-------------------*/
  14. static cycle_t read_tsc(struct clocksource *cs)
  15. {
  16.     cycle_t ret = (cycle_t)get_cycles();
  17.     return ret >= clocksource_tsc.cycle_last ?
  18.         ret : clocksource_tsc.cycle_last;
  19. }
  20. /*------- arch/x86/include/asm/tsc.h----------------------*/
  21. static inline cycles_t get_cycles(void)
  22. {
  23.     unsigned long long ret = 0;
  24. #ifndef CONFIG_X86_TSC
  25.     if (!cpu_has_tsc)
  26.         return 0;
  27. #endif
  28.     rdtscll(ret);
  29.     return ret;
  30. }
  31. /*------arch/x86/include/asm/msr.h-----------------*/
  32. #define rdtscll(val)                        \
  33.     ((val) = __native_read_tsc()

    相關推薦

    Linux時間管理clocksource

    前面提到了Linux下的時間相關的硬體。TSC PIT,HPET,ACPI_PM,這些硬體以一定的頻率產生時鐘中斷,來幫助我們計時。Linux為了管理這些硬體,抽象出來clocksource。 struct clocksource {     /*

    linux系統管理存儲管理

    加利福尼亞 software university linux 控制器 存儲管理:這裏我們要學介紹兩種磁盤陣列:磁盤陣列是由很多價格較便宜的磁盤,組合成一個容量巨大的磁盤組,利用個別磁盤提供數據所產生加成效果提升整個磁盤系統效能。利用這項技術,將數據切割成許多區段,分別存放在各個硬盤上。一

    Linux賬號管理第二篇:對用戶組進行管理

    mov 切換 屬於 tom blog 用戶組 第二篇 roo clas 1、查看用戶的有效組群     groups 用戶名 註意:查看出來的結果可能有多個;第一個為主組群,後面的都是副組群    2、添加和刪除組群     添加一個組:groupadd 組

    Linux時間子系統八:動態時鐘框架(CONFIG_NO_HZ、tickless)

    sleep file rup linux時間 load 曾經 大致 獲取 conf 在前面章節的討論中,我們一直基於一個假設:Linux中的時鐘事件都是由一個周期時鐘提供,不管系統中的clock_event_device是工作於周期觸發模式,還是工作於單觸發模式,也不管定時

    Linux時間子系統四:定時器的引擎:clock_event_device

    到來 開始 register 工作模式 統一 10個 net 說過 序列 早期的內核版本中,進程的調度基於一個稱之為tick的時鐘滴答,通常使用時鐘中斷來定時地產生tick信號,每次tick定時中斷都會進行進程的統計和調度,並對tick進行計數,記錄在一個jiffies變量

    Linux時間子系統六:高精度定時器(HRTIMER)的原理和實現

    3.4 size 屬於 running return repr 而是 復雜度 ctu 上一篇文章,我介紹了傳統的低分辨率定時器的實現原理。而隨著內核的不斷演進,大牛們已經對這種低分辨率定時器的精度不再滿足,而且,硬件也在不斷地發展,系統中的定時器硬件的精度也越來越高,這也給

    Linux時間子系統七:定時器的應用--msleep(),hrtimer_nanosleep()

    get 關系 警告 mov signed num wakeup sch switch 我們已經在前面幾章介紹了低分辨率定時器和高精度定時器的實現原理,內核為了方便其它子系統,在時間子系統中提供了一些用於延時或調度的API,例如msleep,hrtimer_nanosleep

    Linux時間管理涉及數據結構和傳統低分辨率時鐘的實現

    load fin 手動 span div current lds 其中 context 上篇文章大致描述了Linux時間管理的基本情況,看了一些大牛們的博客感覺自己寫的內容很匱乏,但是沒辦法,只能通過這種方式提升自己……閑話不說,本節介紹下時間管理下重要的數據結構設備相關數

    Linux時間子系統二:Alarm Timer

    數據 類型 oid mtime orm 分別是 type mon 超時 一、前言 嚴格來講Alarm Timer也算POSIX Timer一部分,包含兩種類型CLOCK_REALTIME_ALARM和CLOCK_BOOTTIME_ALARM。分別是在CLOCK_REALTI

    linux系統管理進程管理

    進程管理進程管理的操作命令為了管理這些linux進程,用戶應該能夠: 查看所有運行中的進程 查看進程消耗資源 定位個別進程並且對其執行指定操作 改變進程的優先級 殺死指定進程 限制進程可用的系統資源等linux提供了許多命令來讓用戶來高效掌控上述的操作;1.pstree -

    linux系統管理服務管理,ipv6,tcp_wrappers練習

    linux系統管理之服務管理 ipv6 tcp_wrappers 服務管理ipv6tcp_wrappers本文出自 “大李子” 博客,謝絕轉載!linux系統管理之服務管理,ipv6,tcp_wrappers練習

    Linux服務管理NTP服務器配置

    ntpd ntpserver ntpq目標環境,3臺CentOS 6.6,一臺作為NTPD服務與外部公共NTP服務同步時間,同時作為內網的NTPD服務器,其他機器與這臺服務做時間同步。1、NTP時間同步方式選擇 NTP同步方式在linux下一般兩種:使用ntpdate命令直接同步和使用NTPD服務平滑同步

    Linux系統管理總結

    博客 linux 運維 遊戲 it 互聯網總結: 文件系統:基礎、文件、目錄管理,用戶及權限管理、bash基本特性: 命令歷史、hash、命令補全、路徑補全、glob、快捷鍵、IO重定向、管道、變量、vim、bash編程、變量、配置文件、算術運算、測試、grep,fgrep,egrep、測試、find、特殊

    linux系統管理http

    http80/tcp基於c/s模型裝httpd/var/www/html/etc/httpd/conf/httpd.conf 主配置文件selinux由美國安全局研發的一種訪問模式enabledisabledenforing:強制模式 如果我們的行為違反了selinux ,強制拒絕permissive: 如果

    Linux系統管理用戶權限

    blog 改密 並且 管理 ide stdin 用戶和組 rhel7 root 當我們用root用戶登陸linux時候 會顯示一些信息root@localhost 意思是 當前登陸用戶為root localhost是這臺linux的主機名~ 是當前的用戶目錄 那後面的#是什

    Linux系統管理Python生態工具、文本處理和系統管理

    相對 print 重復調用 示例 快捷 python編程 expr markup htm 一、Python生態工具 一、Python內置小工具   1、秒級啟動一個下載服務器   Python 內置了一個下載服務器就能夠顯著提升效率了 。 例如, 你的同事要讓你傳

    Linux系統管理硬盤管理

    本地文件 硬件raid disabled tune2fs support lin 重要 溫度 健康狀況 硬盤是計算的重要組成部件之一,硬盤為操作系統提供持久話存儲的功能,在Linux硬盤設備的性能和好壞可能關系到生成線的安全和用戶體驗等等。熟練的掌握硬盤管理相關的信息能讓我

    CMSIS-RTOS 時間管理虛擬定時器Virtual Timers

    space 一個 在線 給定 rpe hand 啟動 lan word 虛擬定時器Virtual Timers CMSIS-RTOS API裏有幾個向下計數的虛擬定時器,它們實現計數完成時用戶的回調功能。每個定時器都可以配置成單次計數或重復計數模式,它們可以在定義定時器結構

    CMSIS-RTOS 時間管理時間延遲Time Delay

    生命周期 分享圖片 oar ros eid 返回 define over lan 時間管理 Time Management 此RTOS除了可以把你的應用代碼作為線程運行,它還可以提供一些時間服務功能,使用這些功能你就可以訪問RTOS的一些系統調用。 時間延遲Time Del

    linux程序管理輕量級程序(四)

    在Linux中,輕量級程序可以是程序,也可以是執行緒。我們所說的執行緒,在Linux中,其實是輕量級程序之間共享程式碼段,檔案描述符,訊號處理,全域性變數時; 如果不共享,就是我們所說的程序。 程序是資源管理的最小單位,執行緒是程式執行的最小單位。在作業系統設計上,從程序演化出執行緒,最主要的目的就是減小