Commit 76f1fc26 authored by Hu Haowen's avatar Hu Haowen Committed by Jonathan Corbet

docs: add traditional Chinese translation for kernel Documentation

Add traditional Chinese translation (zh_TW) for the Linux Kernel
documentation with a series of translated files.
Signed-off-by: default avatarHu Haowen <src.res@email.cn>
Reviewed-by: default avatarPan Yunwang <panyunwang849@gmail.com>
Link: https://lore.kernel.org/r/20210729155627.41744-1-src.res@email.cnSigned-off-by: default avatarJonathan Corbet <corbet@lwn.net>
parent 4a52225d
......@@ -8,6 +8,7 @@ Translations
:maxdepth: 1
zh_CN/index
zh_TW/index
it_IT/index
ko_KR/index
ja_JP/index
......
Chinese translated version of Documentation/core-api/irq/index.rst
If you have any comment or update to the content, please contact the
original document maintainer directly. However, if you have a problem
communicating in English you can also ask the Chinese maintainer for
help. Contact the Chinese maintainer if this translation is outdated
or if there is a problem with the translation.
Maintainer: Eric W. Biederman <ebiederman@xmission.com>
Traditional Chinese maintainer: Hu Haowen <src.res@email.cn>
---------------------------------------------------------------------
Documentation/core-api/irq/index.rst 的繁體中文翻譯
如果想評論或更新本文的內容,請直接聯繫原文檔的維護者。如果你使用英文
交流有困難的話,也可以向繁體中文版維護者求助。如果本翻譯更新不及時或
者翻譯存在問題,請聯繫繁體中文版維護者。
英文版維護者: Eric W. Biederman <ebiederman@xmission.com>
繁體中文版維護者: 胡皓文 Hu Haowen <src.res@email.cn>
繁體中文版翻譯者: 胡皓文 Hu Haowen <src.res@email.cn>
繁體中文版校譯者: 胡皓文 Hu Haowen <src.res@email.cn>
以下爲正文
---------------------------------------------------------------------
何爲 IRQ?
一個 IRQ 是來自某個設備的一個中斷請求。目前,它們可以來自一個硬體引腳,
或來自一個數據包。多個設備可能連接到同個硬體引腳,從而共享一個 IRQ。
一個 IRQ 編號是用於告知硬體中斷源的內核標識。通常情況下,這是一個
全局 irq_desc 數組的索引,但是除了在 linux/interrupt.h 中的實現,
具體的細節是體系結構特定的。
一個 IRQ 編號是設備上某個可能的中斷源的枚舉。通常情況下,枚舉的編號是
該引腳在系統內中斷控制器的所有輸入引腳中的編號。對於 ISA 總線中的情況,
枚舉的是在兩個 i8259 中斷控制器中 16 個輸入引腳。
架構可以對 IRQ 編號指定額外的含義,在硬體涉及任何手工配置的情況下,
是被提倡的。ISA 的 IRQ 是一個分配這類額外含義的典型例子。
This diff is collapsed.
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Original: :doc:`../../../admin-guide/bug-bisect`
:譯者:
吳想成 Wu XiangCheng <bobwxc@email.cn>
胡皓文 Hu Haowen <src.res@email.cn>
二分(bisect)缺陷
+++++++++++++++++++
(英文版)最後更新:2016年10月28日
引言
=====
始終嘗試由來自kernel.org的原始碼構建的最新內核。如果您沒有信心這樣做,請將
錯誤報告給您的發行版供應商,而不是內核開發人員。
找到缺陷(bug)並不總是那麼容易,不過仍然得去找。如果你找不到它,不要放棄。
儘可能多的向相關維護人員報告您發現的信息。請參閱MAINTAINERS文件以了解您所
關注的子系統的維護人員。
在提交錯誤報告之前,請閱讀「Documentation/admin-guide/reporting-issues.rst」。
設備未出現(Devices not appearing)
====================================
這通常是由udev/systemd引起的。在將其歸咎於內核之前先檢查一下。
查找導致缺陷的補丁
===================
使用 ``git`` 提供的工具可以很容易地找到缺陷,只要缺陷是可復現的。
操作步驟:
- 從git原始碼構建內核
- 以此開始二分 [#f1]_::
$ git bisect start
- 標記損壞的變更集::
$ git bisect bad [commit]
- 標記正常工作的變更集::
$ git bisect good [commit]
- 重新構建內核並測試
- 使用以下任一與git bisect進行交互::
$ git bisect good
或::
$ git bisect bad
這取決於您測試的變更集上是否有缺陷
- 在一些交互之後,git bisect將給出可能導致缺陷的變更集。
- 例如,如果您知道當前版本有問題,而4.8版本是正常的,則可以執行以下操作::
$ git bisect start
$ git bisect bad # Current version is bad
$ git bisect good v4.8
.. [#f1] 您可以(可選地)在開始git bisect的時候提供good或bad參數
``git bisect start [BAD] [GOOD]``
如需進一步參考,請閱讀:
- ``git-bisect`` 的手冊頁
- `Fighting regressions with git bisect(用git bisect解決回歸)
<https://www.kernel.org/pub/software/scm/git/docs/git-bisect-lk2009.html>`_
- `Fully automated bisecting with "git bisect run"(使用git bisect run
來全自動二分) <https://lwn.net/Articles/317154>`_
- `Using Git bisect to figure out when brokenness was introduced
(使用Git二分來找出何時引入了錯誤) <http://webchick.net/node/99>`_
This diff is collapsed.
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Translator: 胡皓文 Hu Haowen <src.res@email.cn>
清除 WARN_ONCE
--------------
WARN_ONCE / WARN_ON_ONCE / printk_once 僅僅列印一次消息.
echo 1 > /sys/kernel/debug/clear_warn_once
可以清除這種狀態並且再次允許列印一次告警信息,這對於運行測試集後重現問題
很有用。
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Translator: 胡皓文 Hu Haowen <src.res@email.cn>
========
CPU 負載
========
Linux通過``/proc/stat``和``/proc/uptime``導出各種信息,用戶空間工具
如top(1)使用這些信息計算系統花費在某個特定狀態的平均時間。
例如:
$ iostat
Linux 2.6.18.3-exp (linmac) 02/20/2007
avg-cpu: %user %nice %system %iowait %steal %idle
10.01 0.00 2.92 5.44 0.00 81.63
...
這裡系統認爲在默認採樣周期內有10.01%的時間工作在用戶空間,2.92%的時
間用在系統空間,總體上有81.63%的時間是空閒的。
大多數情況下``/proc/stat``的信息幾乎真實反映了系統信息,然而,由於內
核採集這些數據的方式/時間的特點,有時這些信息根本不可靠。
那麼這些信息是如何被搜集的呢?每當時間中斷觸發時,內核查看此刻運行的
進程類型,並增加與此類型/狀態進程對應的計數器的值。這種方法的問題是
在兩次時間中斷之間系統(進程)能夠在多種狀態之間切換多次,而計數器只
增加最後一種狀態下的計數。
舉例
---
假設系統有一個進程以如下方式周期性地占用cpu::
兩個時鐘中斷之間的時間線
|-----------------------|
^ ^
|_ 開始運行 |
|_ 開始睡眠
(很快會被喚醒)
在上面的情況下,根據``/proc/stat``的信息(由於當系統處於空閒狀態時,
時間中斷經常會發生)系統的負載將會是0
大家能夠想像內核的這種行爲會發生在許多情況下,這將導致``/proc/stat``
中存在相當古怪的信息::
/* gcc -o hog smallhog.c */
#include <time.h>
#include <limits.h>
#include <signal.h>
#include <sys/time.h>
#define HIST 10
static volatile sig_atomic_t stop;
static void sighandler (int signr)
{
(void) signr;
stop = 1;
}
static unsigned long hog (unsigned long niters)
{
stop = 0;
while (!stop && --niters);
return niters;
}
int main (void)
{
int i;
struct itimerval it = { .it_interval = { .tv_sec = 0, .tv_usec = 1 },
.it_value = { .tv_sec = 0, .tv_usec = 1 } };
sigset_t set;
unsigned long v[HIST];
double tmp = 0.0;
unsigned long n;
signal (SIGALRM, &sighandler);
setitimer (ITIMER_REAL, &it, NULL);
hog (ULONG_MAX);
for (i = 0; i < HIST; ++i) v[i] = ULONG_MAX - hog (ULONG_MAX);
for (i = 0; i < HIST; ++i) tmp += v[i];
tmp /= HIST;
n = tmp - (tmp / 3.0);
sigemptyset (&set);
sigaddset (&set, SIGALRM);
for (;;) {
hog (n);
sigwait (&set, &i);
}
return 0;
}
參考
---
- https://lore.kernel.org/r/loom.20070212T063225-663@post.gmane.org
- Documentation/filesystems/proc.rst (1.8)
謝謝
---
Con Kolivas, Pavel Machek
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Original: :doc:`../../../admin-guide/index`
:Translator: 胡皓文 Hu Haowen <src.res@email.cn>
Linux 內核用戶和管理員指南
==========================
下面是一組隨時間添加到內核中的面向用戶的文檔的集合。到目前爲止,還沒有一個
整體的順序或組織 - 這些材料不是一個單一的,連貫的文件!幸運的話,情況會隨著
時間的推移而迅速改善。
這個初始部分包含總體信息,包括描述內核的README, 關於內核參數的文檔等。
.. toctree::
:maxdepth: 1
README
Todolist:
kernel-parameters
devices
sysctl/index
本節介紹CPU漏洞及其緩解措施。
Todolist:
hw-vuln/index
下面的一組文檔,針對的是試圖跟蹤問題和bug的用戶。
.. toctree::
:maxdepth: 1
reporting-issues
security-bugs
bug-hunting
bug-bisect
tainted-kernels
init
Todolist:
reporting-bugs
ramoops
dynamic-debug-howto
kdump/index
perf/index
這是應用程式開發人員感興趣的章節的開始。可以在這裡找到涵蓋內核ABI各個
方面的文檔。
Todolist:
sysfs-rules
本手冊的其餘部分包括各種指南,介紹如何根據您的喜好配置內核的特定行爲。
.. toctree::
:maxdepth: 1
clearing-warn-once
cpu-load
unicode
Todolist:
acpi/index
aoe/index
auxdisplay/index
bcache
binderfs
binfmt-misc
blockdev/index
bootconfig
braille-console
btmrvl
cgroup-v1/index
cgroup-v2
cifs/index
cputopology
dell_rbu
device-mapper/index
edid
efi-stub
ext4
nfs/index
gpio/index
highuid
hw_random
initrd
iostats
java
jfs
kernel-per-CPU-kthreads
laptops/index
lcd-panel-cgram
ldm
lockup-watchdogs
LSM/index
md
media/index
mm/index
module-signing
mono
namespaces/index
numastat
parport
perf-security
pm/index
pnp
rapidio
ras
rtc
serial-console
svga
sysrq
thunderbolt
ufs
vga-softcursor
video-output
xfs
.. only:: subproject and html
Indices
=======
* :ref:`genindex`
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Original: :doc:`../../../admin-guide/init`
:譯者:
吳想成 Wu XiangCheng <bobwxc@email.cn>
胡皓文 Hu Haowen <src.res@email.cn>
解釋「No working init found.」啓動掛起消息
==========================================
:作者:
Andreas Mohr <andi at lisas period de>
Cristian Souza <cristianmsbr at gmail period com>
本文檔提供了加載初始化二進位(init binary)失敗的一些高層級原因(大致按執行
順序列出)。
1) **無法掛載根文件系統Unable to mount root FS** :請設置「debug」內核參數(在
引導加載程序bootloader配置文件或CONFIG_CMDLINE)以獲取更詳細的內核消息。
2) **初始化二進位不存在於根文件系統上init binary doesn't exist on rootfs** :
確保您的根文件系統類型正確(並且 ``root=`` 內核參數指向正確的分區);擁有
所需的驅動程序,例如SCSI或USB等存儲硬體;文件系統(ext3、jffs2等)是內建的
(或者作爲模塊由initrd預加載)。
3) **控制台設備損壞Broken console device** : ``console= setup`` 中可能存在
衝突 --> 初始控制台不可用(initial console unavailable)。例如,由於串行
IRQ問題(如缺少基於中斷的配置)導致的某些串行控制台不可靠。嘗試使用不同的
``console= device`` 或像 ``netconsole=`` 。
4) **二進位存在但依賴項不可用Binary exists but dependencies not available** :
例如初始化二進位的必需庫依賴項,像 ``/lib/ld-linux.so.2`` 丟失或損壞。使用
``readelf -d <INIT>|grep NEEDED`` 找出需要哪些庫。
5) **無法加載二進位Binary cannot be loaded** :請確保二進位的體系結構與您的
硬體匹配。例如i386不匹配x86_64,或者嘗試在ARM硬體上加載x86。如果您嘗試在
此處加載非二進位文件(shell腳本?),您應該確保腳本在其工作頭(shebang
header)行 ``#!/...`` 中指定能正常工作的解釋器(包括其庫依賴項)。在處理
腳本之前,最好先測試一個簡單的非腳本二進位文件,比如 ``/bin/sh`` ,並確認
它能成功執行。要了解更多信息,請將代碼添加到 ``init/main.c`` 以顯示
kernel_execve()的返回值。
當您發現新的失敗原因時,請擴展本解釋(畢竟加載初始化二進位是一個 **關鍵** 且
艱難的過渡步驟,需要儘可能無痛地進行),然後向LKML提交一個補丁。
待辦事項:
- 通過一個可以存儲 ``kernel_execve()`` 結果值的結構體數組實現各種
``run_init_process()`` 調用,並在失敗時通過疊代 **所有** 結果來記錄一切
(非常重要的可用性修復)。
- 試著使實現本身在一般情況下更有幫助,例如在受影響的地方提供額外的錯誤消息。
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Original: :doc:`../../../admin-guide/security-bugs`
:譯者:
吳想成 Wu XiangCheng <bobwxc@email.cn>
胡皓文 Hu Haowen <src.res@email.cn>
安全缺陷
=========
Linux內核開發人員非常重視安全性。因此我們想知道何時發現了安全漏洞,以便儘快
修復和披露。請向Linux內核安全團隊報告安全漏洞。
聯絡
-----
可以通過電子郵件<security@kernel.org>聯繫Linux內核安全團隊。這是一個安全人員
的私有列表,他們將幫助驗證錯誤報告並開發和發布修復程序。如果您已經有了一個
修復,請將其包含在您的報告中,這樣可以大大加快進程。安全團隊可能會從區域維護
人員那裡獲得額外的幫助,以理解和修復安全漏洞。
與任何缺陷一樣,提供的信息越多,診斷和修復就越容易。如果您不清楚哪些信息有用,
請查看「Documentation/translations/zh_TW/admin-guide/reporting-issues.rst」中
概述的步驟。任何利用漏洞的攻擊代碼都非常有用,未經報告者同意不會對外發布,除
非已經公開。
請儘可能發送無附件的純文本電子郵件。如果所有的細節都藏在附件里,那麼就很難對
一個複雜的問題進行上下文引用的討論。把它想像成一個
:doc:`常規的補丁提交 <../process/submitting-patches>` (即使你還沒有補丁):
描述問題和影響,列出復現步驟,然後給出一個建議的解決方案,所有這些都是純文本的。
披露和限制信息
---------------
安全列表不是公開渠道。爲此,請參見下面的協作。
一旦開發出了健壯的補丁,發布過程就開始了。對公開的缺陷的修復會立即發布。
儘管我們傾向於在未公開缺陷的修復可用時即發布補丁,但應報告者或受影響方的請求,
這可能會被推遲到發布過程開始後的7日內,如果根據缺陷的嚴重性需要更多的時間,
則可額外延長到14天。推遲發布修復的唯一有效原因是爲了適應QA的邏輯和需要發布
協調的大規模部署。
雖然可能與受信任的個人共享受限信息以開發修復,但未經報告者許可,此類信息不會
與修復程序一起發布或發布在任何其他披露渠道上。這包括但不限於原始錯誤報告和
後續討論(如有)、漏洞、CVE信息或報告者的身份。
換句話說,我們唯一感興趣的是修復缺陷。提交給安全列表的所有其他資料以及對報告
的任何後續討論,即使在解除限制之後,也將永久保密。
協調
------
對敏感缺陷(例如那些可能導致權限提升的缺陷)的修復可能需要與私有郵件列表
<linux-distros@vs.openwall.org>進行協調,以便分發供應商做好準備,在公開披露
上游補丁時發布一個已修復的內核。發行版將需要一些時間來測試建議的補丁,通常
會要求至少幾天的限制,而供應商更新發布更傾向於周二至周四。若合適,安全團隊
可以協助這種協調,或者報告者可以從一開始就包括linux發行版。在這種情況下,請
記住在電子郵件主題行前面加上「[vs]」,如linux發行版wiki中所述:
<http://oss-security.openwall.org/wiki/mailing-lists/distros#how-to-use-the-lists>。
CVE分配
--------
安全團隊通常不分配CVE,我們也不需要它們來進行報告或修復,因爲這會使過程不必
要的複雜化,並可能耽誤缺陷處理。如果報告者希望在公開披露之前分配一個CVE編號,
他們需要聯繫上述的私有linux-distros列表。當在提供補丁之前已有這樣的CVE編號時,
如報告者願意,最好在提交消息中提及它。
保密協議
---------
Linux內核安全團隊不是一個正式的機構實體,因此無法簽訂任何保密協議。
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Original: :doc:`../../../admin-guide/tainted-kernels`
:譯者:
吳想成 Wu XiangCheng <bobwxc@email.cn>
胡皓文 Hu Haowen <src.res@email.cn>
受汙染的內核
-------------
當發生一些在稍後調查問題時可能相關的事件時,內核會將自己標記爲「受汙染
(tainted)」的。不用太過擔心,大多數情況下運行受汙染的內核沒有問題;這些信息
主要在有人想調查某個問題時才有意義的,因爲問題的真正原因可能是導致內核受汙染
的事件。這就是爲什麼來自受汙染內核的缺陷報告常常被開發人員忽略,因此請嘗試用
未受汙染的內核重現問題。
請注意,即使在您消除導致汙染的原因(亦即卸載專有內核模塊)之後,內核仍將保持
汙染狀態,以表示內核仍然不可信。這也是爲什麼內核在注意到內部問題(「kernel
bug」)、可恢復錯誤(「kernel oops」)或不可恢復錯誤(「kernel panic」)時會列印
受汙染狀態,並將有關此的調試信息寫入日誌 ``dmesg`` 輸出。也可以通過
``/proc/`` 中的文件在運行時檢查受汙染的狀態。
BUG、Oops或Panics消息中的汙染標誌
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在頂部以「CPU:」開頭的一行中可以找到受汙染的狀態;內核是否受到汙染和原因會顯示
在進程ID(「PID:」)和觸發事件命令的縮寫名稱(「Comm:」)之後::
BUG: unable to handle kernel NULL pointer dereference at 0000000000000000
Oops: 0002 [#1] SMP PTI
CPU: 0 PID: 4424 Comm: insmod Tainted: P W O 4.20.0-0.rc6.fc30 #1
Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011
RIP: 0010:my_oops_init+0x13/0x1000 [kpanic]
[...]
如果內核在事件發生時沒有被汙染,您將在那裡看到「Not-tainted:」;如果被汙染,那
麼它將是「Tainted:」以及字母或空格。在上面的例子中,它看起來是這樣的::
Tainted: P W O
下表解釋了這些字符的含義。在本例中,由於加載了專有模塊( ``P`` ),出現了
警告( ``W`` ),並且加載了外部構建的模塊( ``O`` ),所以內核早些時候受到
了汙染。要解碼其他字符,請使用下表。
解碼運行時的汙染狀態
~~~~~~~~~~~~~~~~~~~~~
在運行時,您可以通過讀取 ``cat /proc/sys/kernel/tainted`` 來查詢受汙染狀態。
如果返回 ``0`` ,則內核沒有受到汙染;任何其他數字都表示受到汙染的原因。解碼
這個數字的最簡單方法是使用腳本 ``tools/debugging/kernel-chktaint`` ,您的
發行版可能會將其作爲名爲 ``linux-tools`` 或 ``kernel-tools`` 的包的一部分提
供;如果沒有,您可以從
`git.kernel.org <https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/tools/debugging/kernel-chktaint>`_
網站下載此腳本並用 ``sh kernel-chktaint`` 執行,它會在上面引用的日誌中有類似
語句的機器上列印這樣的內容::
Kernel is Tainted for following reasons:
* Proprietary module was loaded (#0)
* Kernel issued warning (#9)
* Externally-built ('out-of-tree') module was loaded (#12)
See Documentation/admin-guide/tainted-kernels.rst in the Linux kernel or
https://www.kernel.org/doc/html/latest/admin-guide/tainted-kernels.html for
a more details explanation of the various taint flags.
Raw taint value as int/string: 4609/'P W O '
你也可以試著自己解碼這個數字。如果內核被汙染的原因只有一個,那麼這很簡單,
在本例中您可以通過下表找到數字。如果你需要解碼有多個原因的數字,因爲它是一
個位域(bitfield),其中每個位表示一個特定類型的汙染的存在或不存在,最好讓
前面提到的腳本來處理。但是如果您需要快速看一下,可以使用這個shell命令來檢查
設置了哪些位::
$ for i in $(seq 18); do echo $(($i-1)) $(($(cat /proc/sys/kernel/tainted)>>($i-1)&1));done
汙染狀態代碼表
~~~~~~~~~~~~~~~
=== ===== ====== ========================================================
位 日誌 數字 內核被汙染的原因
=== ===== ====== ========================================================
0 G/P 1 已加載專用模塊
1 _/F 2 模塊被強制加載
2 _/S 4 內核運行在不合規範的系統上
3 _/R 8 模塊被強制卸載
4 _/M 16 處理器報告了機器檢測異常(MCE)
5 _/B 32 引用了錯誤的頁或某些意外的頁標誌
6 _/U 64 用戶空間應用程式請求的汙染
7 _/D 128 內核最近死機了,即曾出現OOPS或BUG
8 _/A 256 ACPI表被用戶覆蓋
9 _/W 512 內核發出警告
10 _/C 1024 已加載staging驅動程序
11 _/I 2048 已應用平台固件缺陷的解決方案
12 _/O 4096 已加載外部構建(「樹外」)模塊
13 _/E 8192 已加載未簽名的模塊
14 _/L 16384 發生軟鎖定
15 _/K 32768 內核已實時打補丁
16 _/X 65536 備用汙染,爲發行版定義並使用
17 _/T 131072 內核是用結構隨機化插件構建的
=== ===== ====== ========================================================
註:字符 ``_`` 表示空白,以便於閱讀表。
汙染的更詳細解釋
~~~~~~~~~~~~~~~~~
0) ``G`` 加載的所有模塊都有GPL或兼容許可證, ``P`` 加載了任何專有模塊。
沒有MODULE_LICENSE(模塊許可證)或MODULE_LICENSE未被insmod認可爲GPL
兼容的模塊被認爲是專有的。
1) ``F`` 任何模塊被 ``insmod -f`` 強制加載, ``' '`` 所有模塊正常加載。
2) ``S`` 內核運行在不合規範的處理器或系統上:硬體已運行在不受支持的配置中,
因此無法保證正確執行。內核將被汙染,例如:
- 在x86上:PAE是通過intel CPU(如Pentium M)上的forcepae強制執行的,這些
CPU不報告PAE,但可能有功能實現,SMP內核在非官方支持的SMP Athlon CPU上
運行,MSR被暴露到用戶空間中。
- 在arm上:在某些CPU(如Keystone 2)上運行的內核,沒有啓用某些內核特性。
- 在arm64上:CPU之間存在不匹配的硬體特性,引導加載程序以不同的模式引導CPU。
- 某些驅動程序正在被用在不受支持的體系結構上(例如x86_64以外的其他系統
上的scsi/snic,非x86/x86_64/itanium上的scsi/ips,已經損壞了arm64上
irqchip/irq-gic的固件設置…)。
3) ``R`` 模塊被 ``rmmod -f`` 強制卸載, ``' '`` 所有模塊都正常卸載。
4) ``M`` 任何處理器報告了機器檢測異常, ``' '`` 未發生機器檢測異常。
5) ``B`` 頁面釋放函數發現錯誤的頁面引用或某些意外的頁面標誌。這表示硬體問題
或內核錯誤;日誌中應該有其他信息指示發生此汙染的原因。
6) ``U`` 用戶或用戶應用程式特意請求設置受汙染標誌,否則應爲 ``' '`` 。
7) ``D`` 內核最近死機了,即出現了OOPS或BUG。
8) ``A`` ACPI表被重寫。
9) ``W`` 內核之前已發出過警告(儘管有些警告可能會設置更具體的汙染標誌)。
10) ``C`` 已加載staging驅動程序。
11) ``I`` 內核正在處理平台固件(BIOS或類似軟體)中的嚴重錯誤。
12) ``O`` 已加載外部構建(「樹外」)模塊。
13) ``E`` 在支持模塊簽名的內核中加載了未簽名的模塊。
14) ``L`` 系統上先前發生過軟鎖定。
15) ``K`` 內核已經實時打了補丁。
16) ``X`` 備用汙染,由Linux發行版定義和使用。
17) ``T`` 內核構建時使用了randstruct插件,它可以有意生成非常不尋常的內核結構
布局(甚至是性能病態的布局),這在調試時非常有用。於構建時設置。
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Original: Documentation/admin-guide/unicode.rst
:譯者:
吳想成 Wu XiangCheng <bobwxc@email.cn>
胡皓文 Hu Haowen <src.res@email.cn>
Unicode(統一碼)支持
======================
(英文版)上次更新:2005-01-17,版本號 1.4
此文檔由H. Peter Anvin <unicode@lanana.org>管理,是Linux註冊名稱與編號管理局
(Linux Assigned Names And Numbers Authority,LANANA)項目的一部分。
現行版本請見:
http://www.lanana.org/docs/unicode/admin-guide/unicode.rst
簡介
-----
Linux內核代碼已被重寫以使用Unicode來將字符映射到字體。下載一個Unicode到字體
(Unicode-to-font)表,八位字符集與UTF-8模式都將改用此字體來顯示。
這微妙地改變了八位字符表的語義。現在的四個字符表是:
=============== =============================== ================
映射代號 映射名稱 Escape代碼 (G0)
=============== =============================== ================
LAT1_MAP Latin-1 (ISO 8859-1) ESC ( B
GRAF_MAP DEC VT100 pseudographics ESC ( 0
IBMPC_MAP IBM code page 437 ESC ( U
USER_MAP User defined ESC ( K
=============== =============================== ================
特別是 ESC ( U 不再是「直通字體」,因爲字體可能與IBM字符集完全不同。
例如,即使加載了一個Latin-1字體,也允許使用塊圖形(block graphics)。
請注意,儘管這些代碼與ISO 2022類似,但這些代碼及其用途都與ISO 2022不匹配;
Linux有兩個八位代碼(G0和G1),而ISO 2022有四個七位代碼(G0-G3)。
根據Unicode標準/ISO 10646,U+F000到U+F8FF被保留用於作業系統範圍內的分配
(Unicode標準將其稱爲「團體區域(Corporate Zone)」,因爲這對於Linux是不準確
的,所以我們稱之爲「Linux區域」)。選擇U+F000作爲起點,因爲它允許直接映射
區域以2的大倍數開始(以防需要1024或2048個字符的字體)。這就留下U+E000到
U+EFFF作爲最終用戶區。
[v1.2]:Unicodes範圍從U+F000到U+F7FF已經被硬編碼爲直接映射到加載的字體,
繞過了翻譯表。用戶定義的映射現在默認爲U+F000到U+F0FF,模擬前述行爲。實際上,
此範圍可能較短;例如,vgacon只能處理256字符(U+F000..U+F0FF)或512字符
(U+F000..U+F1FF)字體。
Linux 區域中定義的實際字符
---------------------------
此外,還定義了Unicode 1.1.4中不存在的以下字符;這些字符由DEC VT圖形映射使用。
[v1.2]此用法已過時,不應再使用;請參見下文。
====== ======================================
U+F800 DEC VT GRAPHICS HORIZONTAL LINE SCAN 1
U+F801 DEC VT GRAPHICS HORIZONTAL LINE SCAN 3
U+F803 DEC VT GRAPHICS HORIZONTAL LINE SCAN 7
U+F804 DEC VT GRAPHICS HORIZONTAL LINE SCAN 9
====== ======================================
DEC VT220使用6x10字符矩陣,這些字符在DEC VT圖形字符集中形成一個平滑的過渡。
我省略了掃描5行,因爲它也被用作塊圖形字符,因此被編碼爲U+2500 FORMS LIGHT
HORIZONTAL。
[v1.3]:這些字符已正式添加到Unicode 3.2.0中;它們在U+23BA、U+23BB、U+23BC、
U+23BD處添加。Linux現在使用新值。
[v1.2]:添加了以下字符來表示常見的鍵盤符號,這些符號不太可能被添加到Unicode
中,因爲它們非常討厭地取決於特定供應商。當然,這是糟糕設計的一個好例子。
====== ======================================
U+F810 KEYBOARD SYMBOL FLYING FLAG
U+F811 KEYBOARD SYMBOL PULLDOWN MENU
U+F812 KEYBOARD SYMBOL OPEN APPLE
U+F813 KEYBOARD SYMBOL SOLID APPLE
====== ======================================
克林貢(Klingon)語支持
------------------------
1996年,Linux是世界上第一個添加對人工語言克林貢支持的作業系統,克林貢是由
Marc Okrand爲《星際迷航》電視連續劇創造的。這種編碼後來被徵募Unicode註冊表
(ConScript Unicode Registry,CSUR)採用,並建議(但最終被拒絕)納入Unicode
平面一。不過,它仍然是Linux區域中的Linux/CSUR私有分配。
這種編碼已經得到克林貢語言研究所(Klingon Language Institute)的認可。
有關更多信息,請聯繫他們:
http://www.kli.org/
由於Linux CZ開頭部分的字符大多是dingbats/symbols/forms類型,而且這是一種
語言,因此根據標準Unicode慣例,我將它放置在16單元的邊界上。
.. note::
這個範圍現在由徵募Unicode註冊表正式管理。規範性引用文件爲:
https://www.evertype.com/standards/csur/klingon.html
克林貢語有一個26個字符的字母表,一個10位數的位置數字書寫系統,從左到右
,從上到下書寫。
克林貢字母的幾種字形已經被提出。但是由於這組符號看起來始終是一致的,只有實際
的形狀不同,因此按照標準Unicode慣例,這些差異被認爲是字體變體。
====== =======================================================
U+F8D0 KLINGON LETTER A
U+F8D1 KLINGON LETTER B
U+F8D2 KLINGON LETTER CH
U+F8D3 KLINGON LETTER D
U+F8D4 KLINGON LETTER E
U+F8D5 KLINGON LETTER GH
U+F8D6 KLINGON LETTER H
U+F8D7 KLINGON LETTER I
U+F8D8 KLINGON LETTER J
U+F8D9 KLINGON LETTER L
U+F8DA KLINGON LETTER M
U+F8DB KLINGON LETTER N
U+F8DC KLINGON LETTER NG
U+F8DD KLINGON LETTER O
U+F8DE KLINGON LETTER P
U+F8DF KLINGON LETTER Q
- Written <q> in standard Okrand Latin transliteration
U+F8E0 KLINGON LETTER QH
- Written <Q> in standard Okrand Latin transliteration
U+F8E1 KLINGON LETTER R
U+F8E2 KLINGON LETTER S
U+F8E3 KLINGON LETTER T
U+F8E4 KLINGON LETTER TLH
U+F8E5 KLINGON LETTER U
U+F8E6 KLINGON LETTER V
U+F8E7 KLINGON LETTER W
U+F8E8 KLINGON LETTER Y
U+F8E9 KLINGON LETTER GLOTTAL STOP
U+F8F0 KLINGON DIGIT ZERO
U+F8F1 KLINGON DIGIT ONE
U+F8F2 KLINGON DIGIT TWO
U+F8F3 KLINGON DIGIT THREE
U+F8F4 KLINGON DIGIT FOUR
U+F8F5 KLINGON DIGIT FIVE
U+F8F6 KLINGON DIGIT SIX
U+F8F7 KLINGON DIGIT SEVEN
U+F8F8 KLINGON DIGIT EIGHT
U+F8F9 KLINGON DIGIT NINE
U+F8FD KLINGON COMMA
U+F8FE KLINGON FULL STOP
U+F8FF KLINGON SYMBOL FOR EMPIRE
====== =======================================================
其他虛構和人工字母
-------------------
自從分配了克林貢Linux Unicode塊之後,John Cowan <jcowan@reutershealth.com>
和 Michael Everson <everson@evertype.com> 建立了一個虛構和人工字母的註冊表。
徵募Unicode註冊表請訪問:
https://www.evertype.com/standards/csur/
所使用的範圍位於最終用戶區域的低端,因此無法進行規範化分配,但建議希望對虛構
字母進行編碼的人員使用這些代碼,以實現互操作性。對於克林貢語,CSUR採用了Linux
編碼。CSUR的人正在推動將Tengwar和Cirth添加到Unicode平面一;將克林貢添加到
Unicode平面一被拒絕,因此上述編碼仍然是官方的。
:orphan:
.. warning::
此文件的目的是爲讓中文讀者更容易閱讀和理解,而不是作爲一個分支。因此,
如果您對此文件有任何意見或改動,請先嘗試更新原始英文文件。如果要更改或
修正某處翻譯文件,請將意見或補丁發送給維護者(聯繫方式見下)。
.. note::
如果您發現本文檔與原始文件有任何不同或者有翻譯問題,請聯繫該文件的譯者,
或者發送電子郵件給胡皓文以獲取幫助:<src.res@email.cn>。
This diff is collapsed.
.. SPDX-License-Identifier: GPL-2.0
.. raw:: latex
\renewcommand\thesection*
\renewcommand\thesubsection*
\kerneldocCJKon
.. _linux_doc_zh_tw:
繁體中文翻譯
============
.. note::
內核文檔繁體中文版的翻譯工作正在進行中。如果您願意並且有時間參與這項工
作,歡迎提交補丁給胡皓文 <src.res@email.cn>。
許可證文檔
----------
下面的文檔介紹了Linux內核原始碼的許可證(GPLv2)、如何在原始碼樹中正確標記
單個文件的許可證、以及指向完整許可證文本的連結。
TODOList:
* Documentation/translations/zh_TW/process/license-rules.rst
用戶文檔
--------
下面的手冊是爲內核用戶編寫的——即那些試圖讓它在給定系統上以最佳方式工作的
用戶。
.. toctree::
:maxdepth: 2
admin-guide/index
TODOList:
* kbuild/index
固件相關文檔
------------
下列文檔描述了內核需要的平台固件相關信息。
TODOList:
* firmware-guide/index
* devicetree/index
應用程式開發人員文檔
--------------------
用戶空間API手冊涵蓋了描述應用程式開發人員可見內核接口方面的文檔。
TODOlist:
* userspace-api/index
內核開發簡介
------------
這些手冊包含有關如何開發內核的整體信息。內核社區非常龐大,一年下來有數千名
開發人員做出貢獻。與任何大型社區一樣,知道如何完成任務將使得更改合併的過程
變得更加容易。
TODOList:
* process/index
* dev-tools/index
* doc-guide/index
* kernel-hacking/index
* trace/index
* maintainer/index
* fault-injection/index
* livepatch/index
* rust/index
內核API文檔
-----------
以下手冊從內核開發人員的角度詳細介紹了特定的內核子系統是如何工作的。這裡的
大部分信息都是直接從內核原始碼獲取的,並根據需要添加補充材料(或者至少是在
我們設法添加的時候——可能不是所有的都是有需要的)。
TODOList:
* driver-api/index
* core-api/index
* locking/index
* accounting/index
* block/index
* cdrom/index
* cpu-freq/index
* ide/index
* fb/index
* fpga/index
* hid/index
* i2c/index
* iio/index
* isdn/index
* infiniband/index
* leds/index
* netlabel/index
* networking/index
* pcmcia/index
* power/index
* target/index
* timers/index
* spi/index
* w1/index
* watchdog/index
* virt/index
* input/index
* hwmon/index
* gpu/index
* security/index
* sound/index
* crypto/index
* filesystems/index
* vm/index
* bpf/index
* usb/index
* PCI/index
* scsi/index
* misc-devices/index
* scheduler/index
* mhi/index
體系結構無關文檔
----------------
TODOList:
* asm-annotations
特定體系結構文檔
----------------
TODOList:
* arch
其他文檔
--------
有幾份未排序的文檔似乎不適合放在文檔的其他部分,或者可能需要進行一些調整和/或
轉換爲reStructureText格式,也有可能太舊。
TODOList:
* staging/index
* watch_queue
目錄和表格
----------
* :ref:`genindex`
Chinese translated version of Documentation/driver-api/io_ordering.rst
If you have any comment or update to the content, please contact the
original document maintainer directly. However, if you have a problem
communicating in English you can also ask the Chinese maintainer for
help. Contact the Chinese maintainer if this translation is outdated
or if there is a problem with the translation.
Traditional Chinese maintainer: Hu Haowen <src.res@email.cn>
---------------------------------------------------------------------
Documentation/driver-api/io_ordering.rst 的繁體中文翻譯
如果想評論或更新本文的內容,請直接聯繫原文檔的維護者。如果你使用英文
交流有困難的話,也可以向繁體中文版維護者求助。如果本翻譯更新不及時或
者翻譯存在問題,請聯繫繁體中文版維護者。
繁體中文版維護者: 胡皓文 Hu Haowen <src.res@email.cn>
繁體中文版翻譯者: 胡皓文 Hu Haowen <src.res@email.cn>
繁體中文版校譯者: 胡皓文 Hu Haowen <src.res@email.cn>
以下爲正文
---------------------------------------------------------------------
在某些平台上,所謂的內存映射I/O是弱順序。在這些平台上,驅動開發者有責任
保證I/O內存映射地址的寫操作按程序圖意的順序達到設備。通常讀取一個「安全」
設備寄存器或橋寄存器,觸發IO晶片清刷未處理的寫操作到達設備後才處理讀操作,
而達到保證目的。驅動程序通常在spinlock保護的臨界區退出之前使用這種技術。
這也可以保證後面的寫操作只在前面的寫操作之後到達設備(這非常類似於內存
屏障操作,mb(),不過僅適用於I/O)。
假設一個設備驅動程的具體例子:
...
CPU A: spin_lock_irqsave(&dev_lock, flags)
CPU A: val = readl(my_status);
CPU A: ...
CPU A: writel(newval, ring_ptr);
CPU A: spin_unlock_irqrestore(&dev_lock, flags)
...
CPU B: spin_lock_irqsave(&dev_lock, flags)
CPU B: val = readl(my_status);
CPU B: ...
CPU B: writel(newval2, ring_ptr);
CPU B: spin_unlock_irqrestore(&dev_lock, flags)
...
上述例子中,設備可能會先接收到newval2的值,然後接收到newval的值,問題就
發生了。不過很容易通過下面方法來修復:
...
CPU A: spin_lock_irqsave(&dev_lock, flags)
CPU A: val = readl(my_status);
CPU A: ...
CPU A: writel(newval, ring_ptr);
CPU A: (void)readl(safe_register); /* 配置寄存器?*/
CPU A: spin_unlock_irqrestore(&dev_lock, flags)
...
CPU B: spin_lock_irqsave(&dev_lock, flags)
CPU B: val = readl(my_status);
CPU B: ...
CPU B: writel(newval2, ring_ptr);
CPU B: (void)readl(safe_register); /* 配置寄存器?*/
CPU B: spin_unlock_irqrestore(&dev_lock, flags)
在解決方案中,讀取safe_register寄存器,觸發IO晶片清刷未處理的寫操作,
再處理後面的讀操作,防止引發數據不一致問題。
This diff is collapsed.
Chinese translated version of Documentation/dev-tools/sparse.rst
If you have any comment or update to the content, please contact the
original document maintainer directly. However, if you have a problem
communicating in English you can also ask the Chinese maintainer for
help. Contact the Chinese maintainer if this translation is outdated
or if there is a problem with the translation.
Traditional Chinese maintainer: Hu Haowen <src.res@email.cn>
---------------------------------------------------------------------
Documentation/dev-tools/sparse.rst 的繁體中文翻譯
如果想評論或更新本文的內容,請直接聯繫原文檔的維護者。如果你使用英文
交流有困難的話,也可以向繁體中文版維護者求助。如果本翻譯更新不及時或
者翻譯存在問題,請聯繫繁體中文版維護者。
繁體中文版維護者: 胡皓文 Hu Haowen <src.res@email.cn>
繁體中文版翻譯者: 胡皓文 Hu Haowen <src.res@email.cn>
以下爲正文
---------------------------------------------------------------------
Copyright 2004 Linus Torvalds
Copyright 2004 Pavel Machek <pavel@ucw.cz>
Copyright 2006 Bob Copeland <me@bobcopeland.com>
使用 sparse 工具做類型檢查
~~~~~~~~~~~~~~~~~~~~~~~~~~
"__bitwise" 是一種類型屬性,所以你應該這樣使用它:
typedef int __bitwise pm_request_t;
enum pm_request {
PM_SUSPEND = (__force pm_request_t) 1,
PM_RESUME = (__force pm_request_t) 2
};
這樣會使 PM_SUSPEND 和 PM_RESUME 成爲位方式(bitwise)整數(使用"__force"
是因爲 sparse 會抱怨改變位方式的類型轉換,但是這裡我們確實需要強制進行轉
換)。而且因爲所有枚舉值都使用了相同的類型,這裡的"enum pm_request"也將
會使用那個類型做爲底層實現。
而且使用 gcc 編譯的時候,所有的 __bitwise/__force 都會消失,最後在 gcc
看來它們只不過是普通的整數。
坦白來說,你並不需要使用枚舉類型。上面那些實際都可以濃縮成一個特殊的"int
__bitwise"類型。
所以更簡單的辦法只要這樣做:
typedef int __bitwise pm_request_t;
#define PM_SUSPEND ((__force pm_request_t) 1)
#define PM_RESUME ((__force pm_request_t) 2)
現在你就有了嚴格的類型檢查所需要的所有基礎架構。
一個小提醒:常數整數"0"是特殊的。你可以直接把常數零當作位方式整數使用而
不用擔心 sparse 會抱怨。這是因爲"bitwise"(恰如其名)是用來確保不同位方
式類型不會被弄混(小尾模式,大尾模式,cpu尾模式,或者其他),對他們來說
常數"0"確實是特殊的。
獲取 sparse 工具
~~~~~~~~~~~~~~~~
你可以從 Sparse 的主頁獲取最新的發布版本:
http://www.kernel.org/pub/linux/kernel/people/josh/sparse/
或者,你也可以使用 git 克隆最新的 sparse 開發版本:
git://git.kernel.org/pub/scm/linux/kernel/git/josh/sparse.git
一旦你下載了源碼,只要以普通用戶身份運行:
make
make install
它將會被自動安裝到你的 ~/bin 目錄下。
使用 sparse 工具
~~~~~~~~~~~~~~~~
用"make C=1"命令來編譯內核,會對所有重新編譯的 C 文件使用 sparse 工具。
或者使用"make C=2"命令,無論文件是否被重新編譯都會對其使用 sparse 工具。
如果你已經編譯了內核,用後一種方式可以很快地檢查整個源碼樹。
make 的可選變量 CHECKFLAGS 可以用來向 sparse 工具傳遞參數。編譯系統會自
動向 sparse 工具傳遞 -Wbitwise 參數。
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment