~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_TW/io_ordering.txt

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 Chinese translated version of Documentation/driver-api/io_ordering.rst
  2 
  3 If you have any comment or update to the content, please contact the
  4 original document maintainer directly.  However, if you have a problem
  5 communicating in English you can also ask the Chinese maintainer for
  6 help.  Contact the Chinese maintainer if this translation is outdated
  7 or if there is a problem with the translation.
  8 
  9 Traditional Chinese maintainer: Hu Haowen <2023002089@link.tyut.edu.cn>
 10 ---------------------------------------------------------------------
 11 Documentation/driver-api/io_ordering.rst 的繁體中文翻譯
 12 
 13 如果想評論或更新本文的內容,請直接聯繫原文檔的維護者。如果你使用英文
 14 交流有困難的話,也可以向繁體中文版維護者求助。如果本翻譯更新不及時或
 15 者翻譯存在問題,請聯繫繁體中文版維護者。
 16 
 17 繁體中文版維護者: 胡皓文 Hu Haowen <2023002089@link.tyut.edu.cn>
 18 繁體中文版翻譯者: 胡皓文 Hu Haowen <2023002089@link.tyut.edu.cn>
 19 繁體中文版校譯者: 胡皓文 Hu Haowen <2023002089@link.tyut.edu.cn>
 20 
 21 
 22 以下爲正文
 23 ---------------------------------------------------------------------
 24 
 25 在某些平台上,所謂的內存映射I/O是弱順序。在這些平台上,驅動開發者有責任
 26 保證I/O內存映射地址的寫操作按程序圖意的順序達到設備。通常讀取一個「安全」
 27 設備寄存器或橋寄存器,觸發IO晶片清刷未處理的寫操作到達設備後才處理讀操作,
 28 而達到保證目的。驅動程序通常在spinlock保護的臨界區退出之前使用這種技術。
 29 這也可以保證後面的寫操作只在前面的寫操作之後到達設備(這非常類似於內存
 30 屏障操作,mb(),不過僅適用於I/O)。
 31 
 32 假設一個設備驅動程的具體例子:
 33 
 34         ...
 35 CPU A:  spin_lock_irqsave(&dev_lock, flags)
 36 CPU A:  val = readl(my_status);
 37 CPU A:  ...
 38 CPU A:  writel(newval, ring_ptr);
 39 CPU A:  spin_unlock_irqrestore(&dev_lock, flags)
 40         ...
 41 CPU B:  spin_lock_irqsave(&dev_lock, flags)
 42 CPU B:  val = readl(my_status);
 43 CPU B:  ...
 44 CPU B:  writel(newval2, ring_ptr);
 45 CPU B:  spin_unlock_irqrestore(&dev_lock, flags)
 46         ...
 47 
 48 上述例子中,設備可能會先接收到newval2的值,然後接收到newval的值,問題就
 49 發生了。不過很容易通過下面方法來修復:
 50 
 51         ...
 52 CPU A:  spin_lock_irqsave(&dev_lock, flags)
 53 CPU A:  val = readl(my_status);
 54 CPU A:  ...
 55 CPU A:  writel(newval, ring_ptr);
 56 CPU A:  (void)readl(safe_register); /* 配置寄存器?*/
 57 CPU A:  spin_unlock_irqrestore(&dev_lock, flags)
 58         ...
 59 CPU B:  spin_lock_irqsave(&dev_lock, flags)
 60 CPU B:  val = readl(my_status);
 61 CPU B:  ...
 62 CPU B:  writel(newval2, ring_ptr);
 63 CPU B:  (void)readl(safe_register); /* 配置寄存器?*/
 64 CPU B:  spin_unlock_irqrestore(&dev_lock, flags)
 65 
 66 在解決方案中,讀取safe_register寄存器,觸發IO晶片清刷未處理的寫操作,
 67 再處理後面的讀操作,防止引發數據不一致問題。
 68 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php