Commit 0f4b9289 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'docs-5.15-2' of git://git.lwn.net/linux

Pull more documentation updates from Jonathan Corbet:
 "Another collection of documentation patches, mostly fixes but also
  includes another set of traditional Chinese translations"

* tag 'docs-5.15-2' of git://git.lwn.net/linux:
  docs: pdfdocs: Fix typo in CJK-language specific font settings
  docs: kernel-hacking: Remove inappropriate text
  docs/zh_TW: add translations for zh_TW/filesystems
  docs/zh_TW: add translations for zh_TW/cpu-freq
  docs/zh_TW: add translations for zh_TW/arm64
  docs/zh_CN: Modify the translator tag and fix the wrong word
  Documentation/features/vm: correct huge-vmap APIs
  Documentation: block: blk-mq: Fix small typo in multi-queue docs
  Documentation: in_irq() cleanup
  Documentation: arm: marvell: Add 88F6825 model into list
  Documentation/process/maintainer-pgp-guide: Replace broken link to PGP path finder
  Documentation: locking: fix references
  Documentation: Update details of The Linux Kernel Module Programming Guide
  docs: x86: Remove obsolete information about x86_64 vmalloc() faulting
  Documentation/process/applying-patches: Activate linux-next man hyperlink
parents 6dcaf9fb 7c5c18bd
......@@ -140,6 +140,7 @@ EBU Armada family
- 88F6821 Armada 382
- 88F6W21 Armada 383
- 88F6820 Armada 385
- 88F6825
- 88F6828 Armada 388
- Product infos: https://web.archive.org/web/20181006144616/http://www.marvell.com/embedded-processors/armada-38x/
......
......@@ -54,7 +54,7 @@ layer or if we want to try to merge requests. In both cases, requests will be
sent to the software queue.
Then, after the requests are processed by software queues, they will be placed
at the hardware queue, a second stage queue were the hardware has direct access
at the hardware queue, a second stage queue where the hardware has direct access
to process those requests. However, if the hardware does not have enough
resources to accept more requests, blk-mq will places requests on a temporary
queue, to be sent in the future, when the hardware is able.
......
......@@ -463,8 +463,8 @@ latex_elements['preamble'] += '''
\\newcommand{\\kerneldocEndTC}{}
\\newcommand{\\kerneldocBeginKR}{}
\\newcommand{\\kerneldocEndKR}{}
\\newcommand{\\kerneldocBeginSC}{}
\\newcommand{\\kerneldocEndKR}{}
\\newcommand{\\kerneldocBeginJP}{}
\\newcommand{\\kerneldocEndJP}{}
}
'''
......
#
# Feature name: huge-vmap
# Kconfig: HAVE_ARCH_HUGE_VMAP
# description: arch supports the ioremap_pud_enabled() and ioremap_pmd_enabled() VM APIs
# description: arch supports the arch_vmap_pud_supported() and arch_vmap_pmd_supported() VM APIs
#
-----------------------
| arch |status|
......
......@@ -76,8 +76,8 @@ handler is never re-entered: if the same interrupt arrives, it is queued
fast: frequently it simply acknowledges the interrupt, marks a 'software
interrupt' for execution and exits.
You can tell you are in a hardware interrupt, because
:c:func:`in_irq()` returns true.
You can tell you are in a hardware interrupt, because in_hardirq() returns
true.
.. warning::
......
......@@ -94,16 +94,10 @@ primitives, but I'll pretend they don't exist.
Locking in the Linux Kernel
===========================
If I could give you one piece of advice: never sleep with anyone crazier
than yourself. But if I had to give you advice on locking: **keep it
simple**.
If I could give you one piece of advice on locking: **keep it simple**.
Be reluctant to introduce new locks.
Strangely enough, this last one is the exact reverse of my advice when
you **have** slept with someone crazier than yourself. And you should
think about getting a big dog.
Two Main Types of Kernel Locks: Spinlocks and Mutexes
-----------------------------------------------------
......@@ -1406,7 +1400,7 @@ bh
half will be running at any time.
Hardware Interrupt / Hardware IRQ
Hardware interrupt request. in_irq() returns true in a
Hardware interrupt request. in_hardirq() returns true in a
hardware interrupt handler.
Interrupt Context
......@@ -1418,7 +1412,7 @@ SMP
(``CONFIG_SMP=y``).
Software Interrupt / softirq
Software interrupt handler. in_irq() returns false;
Software interrupt handler. in_hardirq() returns false;
in_softirq() returns true. Tasklets and softirqs both
fall into the category of 'software interrupts'.
......
......@@ -5,7 +5,7 @@ Futex Requeue PI
Requeueing of tasks from a non-PI futex to a PI futex requires
special handling in order to ensure the underlying rt_mutex is never
left without an owner if it has waiters; doing so would break the PI
boosting logic [see rt-mutex-desgin.txt] For the purposes of
boosting logic [see rt-mutex-design.rst] For the purposes of
brevity, this action will be referred to as "requeue_pi" throughout
this document. Priority inheritance is abbreviated throughout as
"PI".
......
......@@ -2,7 +2,7 @@
Wound/Wait Deadlock-Proof Mutex Design
======================================
Please read mutex-design.txt first, as it applies to wait/wound mutexes too.
Please read mutex-design.rst first, as it applies to wait/wound mutexes too.
Motivation for WW-Mutexes
-------------------------
......
......@@ -389,7 +389,7 @@ The -mm patches are experimental patches released by Andrew Morton.
In the past, -mm tree were used to also test subsystem patches, but this
function is now done via the
`linux-next <https://www.kernel.org/doc/man-pages/linux-next.html>`
`linux-next` (https://www.kernel.org/doc/man-pages/linux-next.html)
tree. The Subsystem maintainers push their patches first to linux-next,
and, during the merge window, sends them directly to Linus.
......
......@@ -126,15 +126,17 @@ On-line docs
describes how to write user-mode utilities for communicating with
Card Services.
* Title: **Linux Kernel Module Programming Guide**
* Title: **The Linux Kernel Module Programming Guide**
:Author: Ori Pomerantz.
:URL: https://tldp.org/LDP/lkmpg/2.6/html/index.html
:Date: 2001
:Author: Peter Jay Salzman, Michael Burian, Ori Pomerantz, Bob Mottram,
Jim Huang.
:URL: https://sysprog21.github.io/lkmpg/
:Date: 2021
:Keywords: modules, GPL book, /proc, ioctls, system calls,
interrupt handlers .
:Description: Very nice 92 pages GPL book on the topic of modules
programming. Lots of examples.
:Description: A very nice GPL book on the topic of modules
programming. Lots of examples. Currently the new version is being
actively maintained at https://github.com/sysprog21/lkmpg.
* Title: **Global spinlock list and usage**
......
......@@ -944,12 +944,11 @@ have on your keyring::
uid [ unknown] Linus Torvalds <torvalds@kernel.org>
sub rsa2048 2011-09-20 [E]
Next, open the `PGP pathfinder`_. In the "From" field, paste the key
fingerprint of Linus Torvalds from the output above. In the "To" field,
paste the key-id you found via ``gpg --search`` of the unknown key, and
check the results:
- `Finding paths to Linus`_
Next, find a trust path from Linus Torvalds to the key-id you found via ``gpg
--search`` of the unknown key. For this, you can use several tools including
https://github.com/mricon/wotmate,
https://git.kernel.org/pub/scm/docs/kernel/pgpkeys.git/tree/graphs, and
https://the.earth.li/~noodles/pathfind.html.
If you get a few decent trust paths, then it's a pretty good indication
that it is a valid key. You can add it to your keyring from the
......@@ -962,6 +961,3 @@ administrators of the PGP Pathfinder service to not be malicious (in
fact, this goes against :ref:`devs_not_infra`). However, if you
do not carefully maintain your own web of trust, then it is a marked
improvement over blindly trusting keyservers.
.. _`PGP pathfinder`: https://pgp.cs.uu.nl/
.. _`Finding paths to Linus`: https://pgp.cs.uu.nl/paths/79BE3E4300411886/to/C94035C21B4F2AEB.html
......@@ -90,7 +90,7 @@ i gestori d'interruzioni devono essere veloci: spesso si limitano
esclusivamente a notificare la presa in carico dell'interruzione,
programmare una 'interruzione software' per l'esecuzione e quindi terminare.
Potete dire d'essere in una interruzione hardware perché :c:func:`in_irq()`
Potete dire d'essere in una interruzione hardware perché in_hardirq()
ritorna vero.
.. warning::
......
......@@ -1459,11 +1459,11 @@ contesto utente
che hardware.
interruzione hardware
Richiesta di interruzione hardware. in_irq() ritorna vero in un
Richiesta di interruzione hardware. in_hardirq() ritorna vero in un
gestore d'interruzioni hardware.
interruzione software / softirq
Gestore di interruzioni software: in_irq() ritorna falso;
Gestore di interruzioni software: in_hardirq() ritorna falso;
in_softirq() ritorna vero. I tasklet e le softirq sono entrambi
considerati 'interruzioni software'.
......
......@@ -80,7 +80,7 @@ cpu上对这个地址空间进行刷新。
5) ``void update_mmu_cache(struct vm_area_struct *vma,
unsigned long address, pte_t *ptep)``
在每个页面故障结束时,这个程序被调用,以告诉体系结构特定的代码,在
在每个缺页异常结束时,这个程序被调用,以告诉体系结构特定的代码,在
软件页表中,在地址空间“vma->vm_mm”的虚拟地址“地址”处,现在存在
一个翻译。
......
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../core-api/irq/index`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/core-api/index.rst
.. _cn_core-api_index.rst:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_core-api_index.rst:
===========
核心API文档
......
.. include:: ../../disclaimer-zh_CN.rst
:Original: :doc:`../../../../core-api/irq/concepts`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/core-api/irq/concepts.rst
.. _cn_concepts.rst:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_concepts.rst:
===========
什么是IRQ?
......
.. include:: ../../disclaimer-zh_CN.rst
:Original: :doc:`../../../../core-api/irq/index`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/core-api/irq/index.rst
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_irq_index.rst:
......
.. include:: ../../disclaimer-zh_CN.rst
:Original: :doc:`../../../../core-api/irq/irq-affinity`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/core-api/irq/irq-affinity
.. _cn_irq-affinity.rst:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_irq-affinity.rst:
==============
SMP IRQ 亲和性
......
.. include:: ../../disclaimer-zh_CN.rst
:Original: :doc:`../../../../core-api/irq/irq-domain`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/core-api/irq/irq-domain.rst
.. _cn_irq-domain.rst:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_irq-domain.rst:
=======================
irq_domain 中断号映射库
......
.. include:: ../../disclaimer-zh_CN.rst
:Original: :doc:`../../../../core-api/irq/irqflags-tracing`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/core-api/irq/irqflags-tracing.rst
.. _cn_irqflags-tracing.rst:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_irqflags-tracing.rst:
=================
IRQ-flags状态追踪
......
.. include:: ../disclaimer-zh_CN.rst
:Original: Documentation/core-api/kernel-api.rst
:Translator: Yanteng Si <siyanteng@loongson.cn>
.. _cn_kernel-api.rst:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_kernel-api.rst:
============
Linux内核API
......
.. include:: ../disclaimer-zh_CN.rst
:Original: Documentation/core-api/kobject.rst
:Translator: Yanteng Si <siyanteng@loongson.cn>
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_core_api_kobject.rst:
......
.. include:: ../disclaimer-zh_CN.rst
:Original: Documentation/core-api/local_ops.rst
:Translator: Yanteng Si <siyanteng@loongson.cn>
.. _cn_local_ops:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_local_ops:
========================
本地原子操作的语义和行为
......
......@@ -3,7 +3,10 @@
.. include:: ../disclaimer-zh_CN.rst
:Original: Documentation/core-api/padata.rst
:Translator: Yanteng Si <siyanteng@loongson.cn>
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_core_api_padata.rst:
......
......@@ -2,10 +2,12 @@
.. include:: ../disclaimer-zh_CN.rst
:Original: Documentation/core-api/printk-basics.rst
:Translator: Yanteng Si <siyanteng@loongson.cn>
.. _cn_printk-basics.rst:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_printk-basics.rst:
==================
使用printk记录消息
......
.. include:: ../disclaimer-zh_CN.rst
:Original: Documentation/core-api/printk-formats.rst
:Translator: Yanteng Si <siyanteng@loongson.cn>
.. _cn_printk-formats.rst:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_printk-formats.rst:
==============================
如何获得正确的printk格式占位符
......
.. include:: ../disclaimer-zh_CN.rst
:Original: Documentation/core-api/refcount-vs-atomic.rst
:Translator: Yanteng Si <siyanteng@loongson.cn>
.. _cn_refcount-vs-atomic:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_refcount-vs-atomic:
=======================================
与atomic_t相比,refcount_t的API是这样的
......
.. include:: ../disclaimer-zh_CN.rst
:Original: Documentation/core-api/symbol-namespaces.rst
:Translator: Yanteng Si <siyanteng@loongson.cn>
.. _cn_symbol-namespaces.rst:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_symbol-namespaces.rst:
=================================
符号命名空间(Symbol Namespaces)
......
......@@ -2,10 +2,12 @@
.. include:: ../disclaimer-zh_CN.rst
:Original: Documentation/core-api/workqueue.rst
:Translator: Yanteng Si <siyanteng@loongson.cn>
.. _cn_workqueue.rst:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_workqueue.rst:
=========================
并发管理的工作队列 (cmwq)
......
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../cpu-freq/core`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/cpu-freq/core.rst
.. _cn_core.rst:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_core.rst:
====================================
CPUFreq核心和CPUFreq通知器的通用说明
......
......@@ -2,11 +2,13 @@
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../cpu-freq/cpu-drivers`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/cpu-freq/cpu-drivers.rst
.. _cn_cpu-drivers.rst:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_cpu-drivers.rst:
=======================================
如何实现一个新的CPUFreq处理器驱动程序?
......
......@@ -2,11 +2,13 @@
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../cpu-freq/cpufreq-stats`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/cpu-freq/cpufreq-stats.rst
.. _cn_cpufreq-stats.rst:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_cpufreq-stats.rst:
==========================================
sysfs CPUFreq Stats的一般说明
......
......@@ -2,11 +2,13 @@
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../cpu-freq/index`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/cpu-freq/index.rst
.. _cn_index.rst:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_index.rst:
=======================================================
Linux CPUFreq - Linux(TM)内核中的CPU频率和电压升降代码
......
......@@ -2,7 +2,7 @@
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../filesystems/debugfs`
:Original: Documentation/filesystems/debugfs.rst
=======
Debugfs
......
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../iio/ep93xx_adc`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/iio/ep93xx_adc.rst
.. _cn_iio_ep93xx_adc:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_iio_ep93xx_adc:
==================================
思睿逻辑 EP93xx 模拟数字转换器驱动
......
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../iio/iio_configfs`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/iio/iio_configfs.rst
.. _cn_iio_configfs:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_iio_configfs:
=====================
工业 IIO configfs支持
......
......@@ -2,11 +2,13 @@
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../iio/index`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/iio/index.rst
.. _cn_iio_index:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_iio_index:
========
工业 I/O
......
......@@ -68,7 +68,7 @@
它将被排队(或丢弃)。因为它会关闭中断,所以处理程序必须很快:通常它只是
确认中断,标记一个“软件中断”以执行并退出。
您可以通过 :c:func:`in_irq()` 返回真来判断您处于硬件中断状态。
您可以通过 in_hardirq() 返回真来判断您处于硬件中断状态。
.. warning::
......
......@@ -2,8 +2,11 @@
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../mips/booting`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/mips/booting.rst
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_booting:
......
......@@ -2,8 +2,11 @@
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../mips/features`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/mips/features.rst
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_features:
......
......@@ -2,8 +2,11 @@
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../mips/index`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/mips/index.rst
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
===========================
MIPS特性文档
......
......@@ -2,8 +2,11 @@
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../mips/ingenic-tcu`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/mips/ingenic-tcu.rst
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_ingenic-tcu:
......
......@@ -2,11 +2,13 @@
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../openrisc/index`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/openrisc/index.rst
.. _cn_openrisc_index:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_openrisc_index:
=================
OpenRISC 体系架构
......
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../openrisc/openrisc_port`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/openrisc/openrisc_port.rst
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_openrisc_port:
......
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../openrisc/todo`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/openrisc/todo.rst
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_openrisc_todo.rst:
......
.. include:: ../disclaimer-zh_CN.rst
:Original: Documentation/parisc/debugging.rst
:Translator: Yanteng Si <siyanteng@loongson.cn>
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_parisc_debugging:
......
......@@ -2,7 +2,10 @@
.. include:: ../disclaimer-zh_CN.rst
:Original: Documentation/parisc/index.rst
:Translator: Yanteng Si <siyanteng@loongson.cn>
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_parisc_index:
......
.. include:: ../disclaimer-zh_CN.rst
:Original: Documentation/parisc/registers.rst
:Translator: Yanteng Si <siyanteng@loongson.cn>
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_parisc_registers:
......
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../riscv/boot-image-header`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/riscv/boot-image-header.rst
.. _cn_boot-image-header.rst:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_boot-image-header.rst:
==========================
RISC-V Linux启动镜像文件头
......
......@@ -2,11 +2,13 @@
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../riscv/index`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/riscv/index.rst
.. _cn_riscv_index:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_riscv_index:
===============
RISC-V 体系结构
......
......@@ -2,11 +2,13 @@
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../riscv/patch-acceptance`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/riscv/patch-acceptance.rst
.. _cn_riscv_patch-acceptance:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_riscv_patch-acceptance:
arch/riscv 开发者维护指南
=========================
......
.. include:: ../disclaimer-zh_CN.rst
:Original: :doc:`../../../riscv/pmu`
:Translator: Yanteng Si <siyanteng@loongson.cn>
:Original: Documentation/riscv/pmu.rst
.. _cn_riscv_pmu:
:翻译:
司延腾 Yanteng Si <siyanteng@loongson.cn>
.. _cn_riscv_pmu:
========================
RISC-V平台上对PMUs的支持
......
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Original: :ref:`Documentation/arm64/amu.rst <amu_index>`
Translator: Bailu Lin <bailu.lin@vivo.com>
Hu Haowen <src.res@email.cn>
==================================
AArch64 Linux 中擴展的活動監控單元
==================================
作者: Ionela Voinescu <ionela.voinescu@arm.com>
日期: 2019-09-10
本文檔簡要描述了 AArch64 Linux 支持的活動監控單元的規範。
架構總述
--------
活動監控是 ARMv8.4 CPU 架構引入的一個可選擴展特性。
活動監控單元(在每個 CPU 中實現)爲系統管理提供了性能計數器。既可以通
過系統寄存器的方式訪問計數器,同時也支持外部內存映射的方式訪問計數器。
AMUv1 架構實現了一個由4個固定的64位事件計數器組成的計數器組。
- CPU 周期計數器:同 CPU 的頻率增長
- 常量計數器:同固定的系統時鐘頻率增長
- 淘汰指令計數器: 同每次架構指令執行增長
- 內存停頓周期計數器:計算由在時鐘域內的最後一級緩存中未命中而引起
的指令調度停頓周期數
當處於 WFI 或者 WFE 狀態時,計數器不會增長。
AMU 架構提供了一個高達16位的事件計數器空間,未來新的 AMU 版本中可能
用它來實現新增的事件計數器。
另外,AMUv1 實現了一個多達16個64位輔助事件計數器的計數器組。
冷復位時所有的計數器會清零。
基本支持
--------
內核可以安全地運行在支持 AMU 和不支持 AMU 的 CPU 組合中。
因此,當配置 CONFIG_ARM64_AMU_EXTN 後我們無條件使能後續
(secondary or hotplugged) CPU 檢測和使用這個特性。
當在 CPU 上檢測到該特性時,我們會標記爲特性可用但是不能保證計數器的功能,
僅表明有擴展屬性。
固件(代碼運行在高異常級別,例如 arm-tf )需支持以下功能:
- 提供低異常級別(EL2 和 EL1)訪問 AMU 寄存器的能力。
- 使能計數器。如果未使能,它的值應爲 0。
- 在從電源關閉狀態啓動 CPU 前或後保存或者恢復計數器。
當使用使能了該特性的內核啓動但固件損壞時,訪問計數器寄存器可能會遭遇
panic 或者死鎖。即使未發現這些症狀,計數器寄存器返回的數據結果並不一
定能反映真實情況。通常,計數器會返回 0,表明他們未被使能。
如果固件沒有提供適當的支持最好關閉 CONFIG_ARM64_AMU_EXTN。
值得注意的是,出於安全原因,不要繞過 AMUSERRENR_EL0 設置而捕獲從
EL0(用戶空間) 訪問 EL1(內核空間)。 因此,固件應該確保訪問 AMU寄存器
不會困在 EL2或EL3。
AMUv1 的固定計數器可以通過如下系統寄存器訪問:
- SYS_AMEVCNTR0_CORE_EL0
- SYS_AMEVCNTR0_CONST_EL0
- SYS_AMEVCNTR0_INST_RET_EL0
- SYS_AMEVCNTR0_MEM_STALL_EL0
特定輔助計數器可以通過 SYS_AMEVCNTR1_EL0(n) 訪問,其中n介於0到15。
詳細信息定義在目錄:arch/arm64/include/asm/sysreg.h。
用戶空間訪問
------------
由於以下原因,當前禁止從用戶空間訪問 AMU 的寄存器:
- 安全因數:可能會暴露處於安全模式執行的代碼信息。
- 意願:AMU 是用於系統管理的。
同樣,該功能對用戶空間不可見。
虛擬化
------
由於以下原因,當前禁止從 KVM 客戶端的用戶空間(EL0)和內核空間(EL1)
訪問 AMU 的寄存器:
- 安全因數:可能會暴露給其他客戶端或主機端執行的代碼信息。
任何試圖訪問 AMU 寄存器的行爲都會觸發一個註冊在客戶端的未定義異常。
This diff is collapsed.
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Original: :ref:`Documentation/arm64/elf_hwcaps.rst <elf_hwcaps_index>`
Translator: Bailu Lin <bailu.lin@vivo.com>
Hu Haowen <src.res@email.cn>
================
ARM64 ELF hwcaps
================
這篇文檔描述了 arm64 ELF hwcaps 的用法和語義。
1. 簡介
-------
有些硬體或軟體功能僅在某些 CPU 實現上和/或在具體某個內核配置上可用,但
對於處於 EL0 的用戶空間代碼沒有可用的架構發現機制。內核通過在輔助向量表
公開一組稱爲 hwcaps 的標誌而把這些功能暴露給用戶空間。
用戶空間軟體可以通過獲取輔助向量的 AT_HWCAP 或 AT_HWCAP2 條目來測試功能,
並測試是否設置了相關標誌,例如::
bool floating_point_is_present(void)
{
unsigned long hwcaps = getauxval(AT_HWCAP);
if (hwcaps & HWCAP_FP)
return true;
return false;
}
如果軟體依賴於 hwcap 描述的功能,在嘗試使用該功能前則應檢查相關的 hwcap
標誌以驗證該功能是否存在。
不能通過其他方式探查這些功能。當一個功能不可用時,嘗試使用它可能導致不可
預測的行爲,並且無法保證能確切的知道該功能不可用,例如 SIGILL。
2. Hwcaps 的說明
----------------
大多數 hwcaps 旨在說明通過架構 ID 寄存器(處於 EL0 的用戶空間代碼無法訪問)
描述的功能的存在。這些 hwcap 通過 ID 寄存器欄位定義,並且應根據 ARM 體系
結構參考手冊(ARM ARM)中定義的欄位來解釋說明。
這些 hwcaps 以下面的形式描述::
idreg.field == val 表示有某個功能。
當 idreg.field 中有 val 時,hwcaps 表示 ARM ARM 定義的功能是有效的,但是
並不是說要完全和 val 相等,也不是說 idreg.field 描述的其他功能就是缺失的。
其他 hwcaps 可能表明無法僅由 ID 寄存器描述的功能的存在。這些 hwcaps 可能
沒有被 ID 寄存器描述,需要參考其他文檔。
3. AT_HWCAP 中揭示的 hwcaps
---------------------------
HWCAP_FP
ID_AA64PFR0_EL1.FP == 0b0000 表示有此功能。
HWCAP_ASIMD
ID_AA64PFR0_EL1.AdvSIMD == 0b0000 表示有此功能。
HWCAP_EVTSTRM
通用計時器頻率配置爲大約100KHz以生成事件。
HWCAP_AES
ID_AA64ISAR0_EL1.AES == 0b0001 表示有此功能。
HWCAP_PMULL
ID_AA64ISAR0_EL1.AES == 0b0010 表示有此功能。
HWCAP_SHA1
ID_AA64ISAR0_EL1.SHA1 == 0b0001 表示有此功能。
HWCAP_SHA2
ID_AA64ISAR0_EL1.SHA2 == 0b0001 表示有此功能。
HWCAP_CRC32
ID_AA64ISAR0_EL1.CRC32 == 0b0001 表示有此功能。
HWCAP_ATOMICS
ID_AA64ISAR0_EL1.Atomic == 0b0010 表示有此功能。
HWCAP_FPHP
ID_AA64PFR0_EL1.FP == 0b0001 表示有此功能。
HWCAP_ASIMDHP
ID_AA64PFR0_EL1.AdvSIMD == 0b0001 表示有此功能。
HWCAP_CPUID
根據 Documentation/arm64/cpu-feature-registers.rst 描述,EL0 可以訪問
某些 ID 寄存器。
這些 ID 寄存器可能表示功能的可用性。
HWCAP_ASIMDRDM
ID_AA64ISAR0_EL1.RDM == 0b0001 表示有此功能。
HWCAP_JSCVT
ID_AA64ISAR1_EL1.JSCVT == 0b0001 表示有此功能。
HWCAP_FCMA
ID_AA64ISAR1_EL1.FCMA == 0b0001 表示有此功能。
HWCAP_LRCPC
ID_AA64ISAR1_EL1.LRCPC == 0b0001 表示有此功能。
HWCAP_DCPOP
ID_AA64ISAR1_EL1.DPB == 0b0001 表示有此功能。
HWCAP_SHA3
ID_AA64ISAR0_EL1.SHA3 == 0b0001 表示有此功能。
HWCAP_SM3
ID_AA64ISAR0_EL1.SM3 == 0b0001 表示有此功能。
HWCAP_SM4
ID_AA64ISAR0_EL1.SM4 == 0b0001 表示有此功能。
HWCAP_ASIMDDP
ID_AA64ISAR0_EL1.DP == 0b0001 表示有此功能。
HWCAP_SHA512
ID_AA64ISAR0_EL1.SHA2 == 0b0010 表示有此功能。
HWCAP_SVE
ID_AA64PFR0_EL1.SVE == 0b0001 表示有此功能。
HWCAP_ASIMDFHM
ID_AA64ISAR0_EL1.FHM == 0b0001 表示有此功能。
HWCAP_DIT
ID_AA64PFR0_EL1.DIT == 0b0001 表示有此功能。
HWCAP_USCAT
ID_AA64MMFR2_EL1.AT == 0b0001 表示有此功能。
HWCAP_ILRCPC
ID_AA64ISAR1_EL1.LRCPC == 0b0010 表示有此功能。
HWCAP_FLAGM
ID_AA64ISAR0_EL1.TS == 0b0001 表示有此功能。
HWCAP_SSBS
ID_AA64PFR1_EL1.SSBS == 0b0010 表示有此功能。
HWCAP_SB
ID_AA64ISAR1_EL1.SB == 0b0001 表示有此功能。
HWCAP_PACA
如 Documentation/arm64/pointer-authentication.rst 所描述,
ID_AA64ISAR1_EL1.APA == 0b0001 或 ID_AA64ISAR1_EL1.API == 0b0001
表示有此功能。
HWCAP_PACG
如 Documentation/arm64/pointer-authentication.rst 所描述,
ID_AA64ISAR1_EL1.GPA == 0b0001 或 ID_AA64ISAR1_EL1.GPI == 0b0001
表示有此功能。
HWCAP2_DCPODP
ID_AA64ISAR1_EL1.DPB == 0b0010 表示有此功能。
HWCAP2_SVE2
ID_AA64ZFR0_EL1.SVEVer == 0b0001 表示有此功能。
HWCAP2_SVEAES
ID_AA64ZFR0_EL1.AES == 0b0001 表示有此功能。
HWCAP2_SVEPMULL
ID_AA64ZFR0_EL1.AES == 0b0010 表示有此功能。
HWCAP2_SVEBITPERM
ID_AA64ZFR0_EL1.BitPerm == 0b0001 表示有此功能。
HWCAP2_SVESHA3
ID_AA64ZFR0_EL1.SHA3 == 0b0001 表示有此功能。
HWCAP2_SVESM4
ID_AA64ZFR0_EL1.SM4 == 0b0001 表示有此功能。
HWCAP2_FLAGM2
ID_AA64ISAR0_EL1.TS == 0b0010 表示有此功能。
HWCAP2_FRINT
ID_AA64ISAR1_EL1.FRINTTS == 0b0001 表示有此功能。
HWCAP2_SVEI8MM
ID_AA64ZFR0_EL1.I8MM == 0b0001 表示有此功能。
HWCAP2_SVEF32MM
ID_AA64ZFR0_EL1.F32MM == 0b0001 表示有此功能。
HWCAP2_SVEF64MM
ID_AA64ZFR0_EL1.F64MM == 0b0001 表示有此功能。
HWCAP2_SVEBF16
ID_AA64ZFR0_EL1.BF16 == 0b0001 表示有此功能。
HWCAP2_I8MM
ID_AA64ISAR1_EL1.I8MM == 0b0001 表示有此功能。
HWCAP2_BF16
ID_AA64ISAR1_EL1.BF16 == 0b0001 表示有此功能。
HWCAP2_DGH
ID_AA64ISAR1_EL1.DGH == 0b0001 表示有此功能。
HWCAP2_RNG
ID_AA64ISAR0_EL1.RNDR == 0b0001 表示有此功能。
HWCAP2_BTI
ID_AA64PFR0_EL1.BT == 0b0001 表示有此功能。
4. 未使用的 AT_HWCAP 位
-----------------------
爲了與用戶空間交互,內核保證 AT_HWCAP 的第62、63位將始終返回0。
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Original: :ref:`Documentation/arm64/hugetlbpage.rst <hugetlbpage_index>`
Translator: Bailu Lin <bailu.lin@vivo.com>
Hu Haowen <src.res@email.cn>
=====================
ARM64中的 HugeTLBpage
=====================
大頁依靠有效利用 TLBs 來提高地址翻譯的性能。這取決於以下
兩點 -
- 大頁的大小
- TLBs 支持的條目大小
ARM64 接口支持2種大頁方式。
1) pud/pmd 級別的塊映射
-----------------------
這是常規大頁,他們的 pmd 或 pud 頁面表條目指向一個內存塊。
不管 TLB 中支持的條目大小如何,塊映射可以減少翻譯大頁地址
所需遍歷的頁表深度。
2) 使用連續位
-------------
架構中轉換頁表條目(D4.5.3, ARM DDI 0487C.a)中提供一個連續
位告訴 MMU 這個條目是一個連續條目集的一員,它可以被緩存在單
個 TLB 條目中。
在 Linux 中連續位用來增加 pmd 和 pte(最後一級)級別映射的大
小。受支持的連續頁表條目數量因頁面大小和頁表級別而異。
支持以下大頁尺寸配置 -
====== ======== ==== ======== ===
- CONT PTE PMD CONT PMD PUD
====== ======== ==== ======== ===
4K: 64K 2M 32M 1G
16K: 2M 32M 1G
64K: 2M 512M 16G
====== ======== ==== ======== ===
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Original: :ref:`Documentation/arm64/index.rst <arm64_index>`
:Translator: Bailu Lin <bailu.lin@vivo.com>
Hu Haowen <src.res@email.cn>
.. _tw_arm64_index:
==========
ARM64 架構
==========
.. toctree::
:maxdepth: 2
amu
hugetlbpage
perf
elf_hwcaps
SPDX-License-Identifier: GPL-2.0
Chinese translated version of Documentation/arm64/legacy_instructions.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: Punit Agrawal <punit.agrawal@arm.com>
Suzuki K. Poulose <suzuki.poulose@arm.com>
Chinese maintainer: Fu Wei <wefu@redhat.com>
Traditional Chinese maintainer: Hu Haowen <src.res@email.cn>
---------------------------------------------------------------------
Documentation/arm64/legacy_instructions.rst 的中文翻譯
如果想評論或更新本文的內容,請直接聯繫原文檔的維護者。如果你使用英文
交流有困難的話,也可以向中文版維護者求助。如果本翻譯更新不及時或者翻
譯存在問題,請聯繫中文版維護者。
本文翻譯提交時的 Git 檢出點爲: bc465aa9d045feb0e13b4a8f32cc33c1943f62d6
英文版維護者: Punit Agrawal <punit.agrawal@arm.com>
Suzuki K. Poulose <suzuki.poulose@arm.com>
中文版維護者: 傅煒 Fu Wei <wefu@redhat.com>
中文版翻譯者: 傅煒 Fu Wei <wefu@redhat.com>
中文版校譯者: 傅煒 Fu Wei <wefu@redhat.com>
繁體中文版校譯者:胡皓文 Hu Haowen <src.res@email.cn>
以下爲正文
---------------------------------------------------------------------
Linux 內核在 arm64 上的移植提供了一個基礎框架,以支持構架中正在被淘汰或已廢棄指令的模擬執行。
這個基礎框架的代碼使用未定義指令鉤子(hooks)來支持模擬。如果指令存在,它也允許在硬體中啓用該指令。
模擬模式可通過寫 sysctl 節點(/proc/sys/abi)來控制。
不同的執行方式及 sysctl 節點的相應值,解釋如下:
* Undef(未定義)
值: 0
產生未定義指令終止異常。它是那些構架中已廢棄的指令,如 SWP,的默認處理方式。
* Emulate(模擬)
值: 1
使用軟體模擬方式。爲解決軟體遷移問題,這種模擬指令模式的使用是被跟蹤的,並會發出速率限制警告。
它是那些構架中正在被淘汰的指令,如 CP15 barriers(隔離指令),的默認處理方式。
* Hardware Execution(硬體執行)
值: 2
雖然標記爲正在被淘汰,但一些實現可能提供硬體執行這些指令的使能/禁用操作。
使用硬體執行一般會有更好的性能,但將無法收集運行時對正被淘汰指令的使用統計數據。
默認執行模式依賴於指令在構架中狀態。正在被淘汰的指令應該以模擬(Emulate)作爲默認模式,
而已廢棄的指令必須默認使用未定義(Undef)模式
注意:指令模擬可能無法應對所有情況。更多詳情請參考單獨的指令注釋。
受支持的遺留指令
-------------
* SWP{B}
節點: /proc/sys/abi/swp
狀態: 已廢棄
默認執行方式: Undef (0)
* CP15 Barriers
節點: /proc/sys/abi/cp15_barrier
狀態: 正被淘汰,不推薦使用
默認執行方式: Emulate (1)
* SETEND
節點: /proc/sys/abi/setend
狀態: 正被淘汰,不推薦使用
默認執行方式: Emulate (1)*
註:爲了使能這個特性,系統中的所有 CPU 必須在 EL0 支持混合字節序。
如果一個新的 CPU (不支持混合字節序) 在使能這個特性後被熱插入系統,
在應用中可能會出現不可預期的結果。
SPDX-License-Identifier: GPL-2.0
Chinese translated version of Documentation/arm64/memory.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: Catalin Marinas <catalin.marinas@arm.com>
Chinese maintainer: Fu Wei <wefu@redhat.com>
Traditional Chinese maintainer: Hu Haowen <src.res@email.cn>
---------------------------------------------------------------------
Documentation/arm64/memory.rst 的中文翻譯
如果想評論或更新本文的內容,請直接聯繫原文檔的維護者。如果你使用英文
交流有困難的話,也可以向中文版維護者求助。如果本翻譯更新不及時或者翻
譯存在問題,請聯繫中文版維護者。
本文翻譯提交時的 Git 檢出點爲: bc465aa9d045feb0e13b4a8f32cc33c1943f62d6
英文版維護者: Catalin Marinas <catalin.marinas@arm.com>
中文版維護者: 傅煒 Fu Wei <wefu@redhat.com>
中文版翻譯者: 傅煒 Fu Wei <wefu@redhat.com>
中文版校譯者: 傅煒 Fu Wei <wefu@redhat.com>
繁體中文版校譯者: 胡皓文 Hu Haowen <src.res@email.cn>
以下爲正文
---------------------------------------------------------------------
Linux 在 AArch64 中的內存布局
===========================
作者: Catalin Marinas <catalin.marinas@arm.com>
本文檔描述 AArch64 Linux 內核所使用的虛擬內存布局。此構架可以實現
頁大小爲 4KB 的 4 級轉換表和頁大小爲 64KB 的 3 級轉換表。
AArch64 Linux 使用 3 級或 4 級轉換表,其頁大小配置爲 4KB,對於用戶和內核
分別都有 39-bit (512GB) 或 48-bit (256TB) 的虛擬地址空間。
對於頁大小爲 64KB的配置,僅使用 2 級轉換表,有 42-bit (4TB) 的虛擬地址空間,但內存布局相同。
用戶地址空間的 63:48 位爲 0,而內核地址空間的相應位爲 1。TTBRx 的
選擇由虛擬地址的 63 位給出。swapper_pg_dir 僅包含內核(全局)映射,
而用戶 pgd 僅包含用戶(非全局)映射。swapper_pg_dir 地址被寫入
TTBR1 中,且從不寫入 TTBR0。
AArch64 Linux 在頁大小爲 4KB,並使用 3 級轉換表時的內存布局:
起始地址 結束地址 大小 用途
-----------------------------------------------------------------------
0000000000000000 0000007fffffffff 512GB 用戶空間
ffffff8000000000 ffffffffffffffff 512GB 內核空間
AArch64 Linux 在頁大小爲 4KB,並使用 4 級轉換表時的內存布局:
起始地址 結束地址 大小 用途
-----------------------------------------------------------------------
0000000000000000 0000ffffffffffff 256TB 用戶空間
ffff000000000000 ffffffffffffffff 256TB 內核空間
AArch64 Linux 在頁大小爲 64KB,並使用 2 級轉換表時的內存布局:
起始地址 結束地址 大小 用途
-----------------------------------------------------------------------
0000000000000000 000003ffffffffff 4TB 用戶空間
fffffc0000000000 ffffffffffffffff 4TB 內核空間
AArch64 Linux 在頁大小爲 64KB,並使用 3 級轉換表時的內存布局:
起始地址 結束地址 大小 用途
-----------------------------------------------------------------------
0000000000000000 0000ffffffffffff 256TB 用戶空間
ffff000000000000 ffffffffffffffff 256TB 內核空間
更詳細的內核虛擬內存布局,請參閱內核啓動信息。
4KB 頁大小的轉換表查找:
+--------+--------+--------+--------+--------+--------+--------+--------+
|63 56|55 48|47 40|39 32|31 24|23 16|15 8|7 0|
+--------+--------+--------+--------+--------+--------+--------+--------+
| | | | | |
| | | | | v
| | | | | [11:0] 頁內偏移
| | | | +-> [20:12] L3 索引
| | | +-----------> [29:21] L2 索引
| | +---------------------> [38:30] L1 索引
| +-------------------------------> [47:39] L0 索引
+-------------------------------------------------> [63] TTBR0/1
64KB 頁大小的轉換表查找:
+--------+--------+--------+--------+--------+--------+--------+--------+
|63 56|55 48|47 40|39 32|31 24|23 16|15 8|7 0|
+--------+--------+--------+--------+--------+--------+--------+--------+
| | | | |
| | | | v
| | | | [15:0] 頁內偏移
| | | +----------> [28:16] L3 索引
| | +--------------------------> [41:29] L2 索引
| +-------------------------------> [47:42] L1 索引
+-------------------------------------------------> [63] TTBR0/1
當使用 KVM 時, 管理程序(hypervisor)在 EL2 中通過相對內核虛擬地址的
一個固定偏移來映射內核頁(內核虛擬地址的高 24 位設爲零):
起始地址 結束地址 大小 用途
-----------------------------------------------------------------------
0000004000000000 0000007fffffffff 256GB 在 HYP 中映射的內核對象
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Original: :ref:`Documentation/arm64/perf.rst <perf_index>`
Translator: Bailu Lin <bailu.lin@vivo.com>
Hu Haowen <src.res@email.cn>
=============
Perf 事件屬性
=============
:作者: Andrew Murray <andrew.murray@arm.com>
:日期: 2019-03-06
exclude_user
------------
該屬性排除用戶空間。
用戶空間始終運行在 EL0,因此該屬性將排除 EL0。
exclude_kernel
--------------
該屬性排除內核空間。
打開 VHE 時內核運行在 EL2,不打開 VHE 時內核運行在 EL1。客戶機
內核總是運行在 EL1。
對於宿主機,該屬性排除 EL1 和 VHE 上的 EL2。
對於客戶機,該屬性排除 EL1。請注意客戶機從來不會運行在 EL2。
exclude_hv
----------
該屬性排除虛擬機監控器。
對於 VHE 宿主機該屬性將被忽略,此時我們認爲宿主機內核是虛擬機監
控器。
對於 non-VHE 宿主機該屬性將排除 EL2,因爲虛擬機監控器運行在 EL2
的任何代碼主要用於客戶機和宿主機的切換。
對於客戶機該屬性無效。請注意客戶機從來不會運行在 EL2。
exclude_host / exclude_guest
----------------------------
這些屬性分別排除了 KVM 宿主機和客戶機。
KVM 宿主機可能運行在 EL0(用戶空間),EL1(non-VHE 內核)和
EL2(VHE 內核 或 non-VHE 虛擬機監控器)。
KVM 客戶機可能運行在 EL0(用戶空間)和 EL1(內核)。
由於宿主機和客戶機之間重疊的異常級別,我們不能僅僅依靠 PMU 的硬體異
常過濾機制-因此我們必須啓用/禁用對於客戶機進入和退出的計數。而這在
VHE 和 non-VHE 系統上表現不同。
對於 non-VHE 系統的 exclude_host 屬性排除 EL2 - 在進入和退出客戶
機時,我們會根據 exclude_host 和 exclude_guest 屬性在適當的情況下
禁用/啓用該事件。
對於 VHE 系統的 exclude_guest 屬性排除 EL1,而對其中的 exclude_host
屬性同時排除 EL0,EL2。在進入和退出客戶機時,我們會適當地根據
exclude_host 和 exclude_guest 屬性包括/排除 EL0。
以上聲明也適用於在 not-VHE 客戶機使用這些屬性時,但是請注意客戶機從
來不會運行在 EL2。
準確性
------
在 non-VHE 宿主機上,我們在 EL2 進入/退出宿主機/客戶機的切換時啓用/
關閉計數器 -但是在啓用/禁用計數器和進入/退出客戶機之間存在一段延時。
對於 exclude_host, 我們可以通過過濾 EL2 消除在客戶機進入/退出邊界
上用於計數客戶機事件的宿主機事件計數器。但是當使用 !exclude_hv 時,
在客戶機進入/退出有一個小的停電窗口無法捕獲到宿主機的事件。
在 VHE 系統沒有停電窗口。
SPDX-License-Identifier: GPL-2.0
Chinese translated version of Documentation/arm64/silicon-errata.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.
M: Will Deacon <will.deacon@arm.com>
zh_CN: Fu Wei <wefu@redhat.com>
zh_TW: Hu Haowen <src.res@email.cn>
C: 1926e54f115725a9248d0c4c65c22acaf94de4c4
---------------------------------------------------------------------
Documentation/arm64/silicon-errata.rst 的中文翻譯
如果想評論或更新本文的內容,請直接聯繫原文檔的維護者。如果你使用英文
交流有困難的話,也可以向中文版維護者求助。如果本翻譯更新不及時或者翻
譯存在問題,請聯繫中文版維護者。
英文版維護者: Will Deacon <will.deacon@arm.com>
中文版維護者: 傅煒 Fu Wei <wefu@redhat.com>
中文版翻譯者: 傅煒 Fu Wei <wefu@redhat.com>
中文版校譯者: 傅煒 Fu Wei <wefu@redhat.com>
繁體中文版校譯者: 胡皓文 Hu Haowen <src.res@email.cn>
本文翻譯提交時的 Git 檢出點爲: 1926e54f115725a9248d0c4c65c22acaf94de4c4
以下爲正文
---------------------------------------------------------------------
晶片勘誤和軟體補救措施
==================
作者: Will Deacon <will.deacon@arm.com>
日期: 2015年11月27日
一個不幸的現實:硬體經常帶有一些所謂的「瑕疵(errata)」,導致其在
某些特定情況下會違背構架定義的行爲。就基於 ARM 的硬體而言,這些瑕疵
大體可分爲以下幾類:
A 類:無可行補救措施的嚴重缺陷。
B 類:有可接受的補救措施的重大或嚴重缺陷。
C 類:在正常操作中不會顯現的小瑕疵。
更多資訊,請在 infocenter.arm.com (需註冊)中查閱「軟體開發者勘誤
筆記」(「Software Developers Errata Notice」)文檔。
對於 Linux 而言,B 類缺陷可能需要作業系統的某些特別處理。例如,避免
一個特殊的代碼序列,或是以一種特定的方式配置處理器。在某種不太常見的
情況下,爲將 A 類缺陷當作 C 類處理,可能需要用類似的手段。這些手段被
統稱爲「軟體補救措施」,且僅在少數情況需要(例如,那些需要一個運行在
非安全異常級的補救措施 *並且* 能被 Linux 觸發的情況)。
對於尚在討論中的可能對未受瑕疵影響的系統產生干擾的軟體補救措施,有一個
相應的內核配置(Kconfig)選項被加在 「內核特性(Kernel Features)」->
「基於可選方法框架的 ARM 瑕疵補救措施(ARM errata workarounds via
the alternatives framework)"。這些選項被默認開啓,若探測到受影響的CPU,
補丁將在運行時被使用。至於對系統運行影響較小的補救措施,內核配置選項
並不存在,且代碼以某種規避瑕疵的方式被構造(帶注釋爲宜)。
這種做法對於在任意內核原始碼樹中準確地判斷出哪個瑕疵已被軟體方法所補救
稍微有點麻煩,所以在 Linux 內核中此文件作爲軟體補救措施的註冊表,
並將在新的軟體補救措施被提交和向後移植(backported)到穩定內核時被更新。
| 實現者 | 受影響的組件 | 勘誤編號 | 內核配置 |
+----------------+-----------------+-----------------+-------------------------+
| ARM | Cortex-A53 | #826319 | ARM64_ERRATUM_826319 |
| ARM | Cortex-A53 | #827319 | ARM64_ERRATUM_827319 |
| ARM | Cortex-A53 | #824069 | ARM64_ERRATUM_824069 |
| ARM | Cortex-A53 | #819472 | ARM64_ERRATUM_819472 |
| ARM | Cortex-A53 | #845719 | ARM64_ERRATUM_845719 |
| ARM | Cortex-A53 | #843419 | ARM64_ERRATUM_843419 |
| ARM | Cortex-A57 | #832075 | ARM64_ERRATUM_832075 |
| ARM | Cortex-A57 | #852523 | N/A |
| ARM | Cortex-A57 | #834220 | ARM64_ERRATUM_834220 |
| | | | |
| Cavium | ThunderX ITS | #22375, #24313 | CAVIUM_ERRATUM_22375 |
| Cavium | ThunderX GICv3 | #23154 | CAVIUM_ERRATUM_23154 |
SPDX-License-Identifier: GPL-2.0
Chinese translated version of Documentation/arm64/tagged-pointers.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: Will Deacon <will.deacon@arm.com>
Chinese maintainer: Fu Wei <wefu@redhat.com>
Traditional Chinese maintainer: Hu Haowen <src.res@email.cn>
---------------------------------------------------------------------
Documentation/arm64/tagged-pointers.rst 的中文翻譯
如果想評論或更新本文的內容,請直接聯繫原文檔的維護者。如果你使用英文
交流有困難的話,也可以向中文版維護者求助。如果本翻譯更新不及時或者翻
譯存在問題,請聯繫中文版維護者。
英文版維護者: Will Deacon <will.deacon@arm.com>
中文版維護者: 傅煒 Fu Wei <wefu@redhat.com>
中文版翻譯者: 傅煒 Fu Wei <wefu@redhat.com>
中文版校譯者: 傅煒 Fu Wei <wefu@redhat.com>
繁體中文版校譯者: 胡皓文 Hu Haowen <src.res@email.cn>
以下爲正文
---------------------------------------------------------------------
Linux 在 AArch64 中帶標記的虛擬地址
=================================
作者: Will Deacon <will.deacon@arm.com>
日期: 2013 年 06 月 12 日
本文檔簡述了在 AArch64 地址轉換系統中提供的帶標記的虛擬地址及其在
AArch64 Linux 中的潛在用途。
內核提供的地址轉換表配置使通過 TTBR0 完成的虛擬地址轉換(即用戶空間
映射),其虛擬地址的最高 8 位(63:56)會被轉換硬體所忽略。這種機制
讓這些位可供應用程式自由使用,其注意事項如下:
(1) 內核要求所有傳遞到 EL1 的用戶空間地址帶有 0x00 標記。
這意味著任何攜帶用戶空間虛擬地址的系統調用(syscall)
參數 *必須* 在陷入內核前使它們的最高字節被清零。
(2) 非零標記在傳遞信號時不被保存。這意味著在應用程式中利用了
標記的信號處理函數無法依賴 siginfo_t 的用戶空間虛擬
地址所攜帶的包含其內部域信息的標記。此規則的一個例外是
當信號是在調試觀察點的異常處理程序中產生的,此時標記的
信息將被保存。
(3) 當使用帶標記的指針時需特別留心,因爲僅對兩個虛擬地址
的高字節,C 編譯器很可能無法判斷它們是不同的。
此構架會阻止對帶標記的 PC 指針的利用,因此在異常返回時,其高字節
將被設置成一個爲 「55」 的擴展符。
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Original: :doc:`../../../cpu-freq/core`
:Translator: Yanteng Si <siyanteng@loongson.cn>
Hu Haowen <src.res@email.cn>
.. _tw_core.rst:
====================================
CPUFreq核心和CPUFreq通知器的通用說明
====================================
作者:
- Dominik Brodowski <linux@brodo.de>
- David Kimdon <dwhedon@debian.org>
- Rafael J. Wysocki <rafael.j.wysocki@intel.com>
- Viresh Kumar <viresh.kumar@linaro.org>
.. 目錄:
1. CPUFreq核心和接口
2. CPUFreq通知器
3. 含有Operating Performance Point (OPP)的CPUFreq表的生成
1. CPUFreq核心和接口
======================
cpufreq核心代碼位於drivers/cpufreq/cpufreq.c中。這些cpufreq代碼爲CPUFreq架構的驅
動程序(那些操作硬體切換頻率的代碼)以及 "通知器 "提供了一個標準化的接口。
這些是設備驅動程序或需要了解策略變化的其它內核部分(如 ACPI 熱量管理)或所有頻率更改(除
計時代碼外),甚至需要強制確定速度限制的通知器(如 ARM 架構上的 LCD 驅動程序)。
此外, 內核 "常數" loops_per_jiffy會根據頻率變化而更新。
cpufreq策略的引用計數由 cpufreq_cpu_get 和 cpufreq_cpu_put 來完成,以確保 cpufreq 驅
動程序被正確地註冊到核心中,並且驅動程序在 cpufreq_put_cpu 被調用之前不會被卸載。這也保證
了每個CPU核的cpufreq 策略在使用期間不會被釋放。
2. CPUFreq 通知器
====================
CPUFreq通知器符合標準的內核通知器接口。
關於通知器的細節請參閱 linux/include/linux/notifier.h。
這裡有兩個不同的CPUfreq通知器 - 策略通知器和轉換通知器。
2.1 CPUFreq策略通知器
----------------------------
當創建或移除策略時,這些都會被通知。
階段是在通知器的第二個參數中指定的。當第一次創建策略時,階段是CPUFREQ_CREATE_POLICY,當
策略被移除時,階段是CPUFREQ_REMOVE_POLICY。
第三個參數 ``void *pointer`` 指向一個結構體cpufreq_policy,其包括min,max(新策略的下限和
上限(單位爲kHz))這幾個值。
2.2 CPUFreq轉換通知器
--------------------------------
當CPUfreq驅動切換CPU核心頻率時,策略中的每個在線CPU都會收到兩次通知,這些變化沒有任何外部干
預。
第二個參數指定階段 - CPUFREQ_PRECHANGE or CPUFREQ_POSTCHANGE.
第三個參數是一個包含如下值的結構體cpufreq_freqs:
===== ====================
cpu 受影響cpu的編號
old 舊頻率
new 新頻率
flags cpufreq驅動的標誌
===== ====================
3. 含有Operating Performance Point (OPP)的CPUFreq表的生成
==================================================================
關於OPP的細節請參閱 Documentation/power/opp.rst
dev_pm_opp_init_cpufreq_table -
這個功能提供了一個隨時可用的轉換程序,用來將OPP層關於可用頻率的內部信息翻譯成一種容易提供給
cpufreq的格式。
.. Warning::
不要在中斷上下文中使用此函數。
例如::
soc_pm_init()
{
/* Do things */
r = dev_pm_opp_init_cpufreq_table(dev, &freq_table);
if (!r)
policy->freq_table = freq_table;
/* Do other things */
}
.. note::
該函數只有在CONFIG_PM_OPP之外還啓用了CONFIG_CPU_FREQ時才可用。
dev_pm_opp_free_cpufreq_table
釋放dev_pm_opp_init_cpufreq_table分配的表。
This diff is collapsed.
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Original: :doc:`../../../cpu-freq/cpufreq-stats`
:Translator: Yanteng Si <siyanteng@loongson.cn>
Hu Haowen <src.res@email.cn>
.. _tw_cpufreq-stats.rst:
==========================================
sysfs CPUFreq Stats的一般說明
==========================================
用戶信息
作者: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
.. Contents
1. 簡介
2. 提供的統計數據(舉例說明)
3. 配置cpufreq-stats
1. 簡介
===============
cpufreq-stats是一個爲每個CPU提供CPU頻率統計的驅動。
這些統計數據在/sysfs中以一堆只讀接口的形式提供。這個接口(在配置好後)將出現在
/sysfs(<sysfs root>/devices/system/cpu/cpuX/cpufreq/stats/)中cpufreq下的一個單
獨的目錄中,提供給每個CPU。
各種統計數據將在此目錄下形成只讀文件。
此驅動是獨立於任何可能運行在你所用CPU上的特定cpufreq_driver而設計的。因此,它將與所有
cpufreq_driver一起工作。
2. 提供的統計數據(舉例說明)
=====================================
cpufreq stats提供了以下統計數據(在下面詳細解釋)。
- time_in_state
- total_trans
- trans_table
所有的統計數據將從統計驅動被載入的時間(或統計被重置的時間)開始,到某一統計數據被讀取的時間爲止。
顯然,統計驅動不會有任何關於統計驅動載入之前的頻率轉換信息。
::
<mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # ls -l
total 0
drwxr-xr-x 2 root root 0 May 14 16:06 .
drwxr-xr-x 3 root root 0 May 14 15:58 ..
--w------- 1 root root 4096 May 14 16:06 reset
-r--r--r-- 1 root root 4096 May 14 16:06 time_in_state
-r--r--r-- 1 root root 4096 May 14 16:06 total_trans
-r--r--r-- 1 root root 4096 May 14 16:06 trans_table
- **reset**
只寫屬性,可用於重置統計計數器。這對於評估不同調節器下的系統行爲非常有用,且無需重啓。
- **time_in_state**
此項給出了這個CPU所支持的每個頻率所花費的時間。cat輸出的每一行都會有"<frequency>
<time>"對,表示這個CPU在<frequency>上花費了<time>個usertime單位的時間。這裡的
usertime單位是10mS(類似於/proc中輸出的其他時間)。
::
<mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # cat time_in_state
3600000 2089
3400000 136
3200000 34
3000000 67
2800000 172488
- **total_trans**
給出了這個CPU上頻率轉換的總次數。cat的輸出將有一個單一的計數,這就是頻率轉換的總數。
::
<mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # cat total_trans
20
- **trans_table**
這將提供所有CPU頻率轉換的細粒度信息。這裡的cat輸出是一個二維矩陣,其中一個條目<i, j>(第
i行,第j列)代表從Freq_i到Freq_j的轉換次數。Freq_i行和Freq_j列遵循驅動最初提供給cpufreq
核的頻率表的排序順序,因此可以排序(升序或降序)或不排序。 這裡的輸出也包含了每行每列的實際
頻率值,以便更好地閱讀。
如果轉換表大於PAGE_SIZE,讀取時將返回一個-EFBIG錯誤。
::
<mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # cat trans_table
From : To
: 3600000 3400000 3200000 3000000 2800000
3600000: 0 5 0 0 0
3400000: 4 0 2 0 0
3200000: 0 1 0 2 0
3000000: 0 0 1 0 3
2800000: 0 0 0 2 0
3. 配置cpufreq-stats
============================
要在你的內核中配置cpufreq-stats::
Config Main Menu
Power management options (ACPI, APM) --->
CPU Frequency scaling --->
[*] CPU Frequency scaling
[*] CPU frequency translation statistics
"CPU Frequency scaling" (CONFIG_CPU_FREQ) 應該被啓用以配置cpufreq-stats。
"CPU frequency translation statistics" (CONFIG_CPU_FREQ_STAT)提供了包括
time_in_state、total_trans和trans_table的統計數據。
一旦啓用了這個選項,並且你的CPU支持cpufrequency,你就可以在/sysfs中看到CPU頻率統計。
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Original: :doc:`../../../cpu-freq/index`
:Translator: Yanteng Si <siyanteng@loongson.cn>
Hu Haowen <src.res@email.cn>
.. _tw_index.rst:
=======================================================
Linux CPUFreq - Linux(TM)內核中的CPU頻率和電壓升降代碼
=======================================================
Author: Dominik Brodowski <linux@brodo.de>
時鐘升降允許你在運行中改變CPU的時鐘速度。這是一個很好的節省電池電量的方法,因爲時
鐘速度越低,CPU消耗的電量越少。
.. toctree::
:maxdepth: 1
core
cpu-drivers
cpufreq-stats
郵件列表
------------
這裡有一個 CPU 頻率變化的 CVS 提交和通用列表,您可以在這裡報告bug、問題或提交補丁。要發
布消息,請發送電子郵件到 linux-pm@vger.kernel.org。
連結
-----
FTP檔案:
* ftp://ftp.linux.org.uk/pub/linux/cpufreq/
如何訪問CVS倉庫:
* http://cvs.arm.linux.org.uk/
CPUFreq郵件列表:
* http://vger.kernel.org/vger-lists.html#linux-pm
SA-1100的時鐘和電壓標度:
* http://www.lartmaker.nl/projects/scaling
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Original: :doc:`../../../filesystems/debugfs`
=======
Debugfs
=======
譯者
::
中文版維護者:羅楚成 Chucheng Luo <luochucheng@vivo.com>
中文版翻譯者:羅楚成 Chucheng Luo <luochucheng@vivo.com>
中文版校譯者: 羅楚成 Chucheng Luo <luochucheng@vivo.com>
繁體中文版校譯者: 胡皓文 Hu Haowen <src.res@email.cn>
版權所有2020 羅楚成 <luochucheng@vivo.com>
版權所有2021 胡皓文 Hu Haowen <src.res@email.cn>
Debugfs是內核開發人員在用戶空間獲取信息的簡單方法。與/proc不同,proc只提供進程
信息。也不像sysfs,具有嚴格的「每個文件一個值「的規則。debugfs根本沒有規則,開發
人員可以在這裡放置他們想要的任何信息。debugfs文件系統也不能用作穩定的ABI接口。
從理論上講,debugfs導出文件的時候沒有任何約束。但是[1]實際情況並不總是那麼
簡單。即使是debugfs接口,也最好根據需要進行設計,並儘量保持接口不變。
Debugfs通常使用以下命令安裝::
mount -t debugfs none /sys/kernel/debug
(或等效的/etc/fstab行)。
debugfs根目錄默認僅可由root用戶訪問。要更改對文件樹的訪問,請使用「 uid」,「 gid」
和「 mode」掛載選項。請注意,debugfs API僅按照GPL協議導出到模塊。
使用debugfs的代碼應包含<linux/debugfs.h>。然後,首先是創建至少一個目錄來保存
一組debugfs文件::
struct dentry *debugfs_create_dir(const char *name, struct dentry *parent);
如果成功,此調用將在指定的父目錄下創建一個名爲name的目錄。如果parent參數爲空,
則會在debugfs根目錄中創建。創建目錄成功時,返回值是一個指向dentry結構體的指針。
該dentry結構體的指針可用於在目錄中創建文件(以及最後將其清理乾淨)。ERR_PTR
(-ERROR)返回值表明出錯。如果返回ERR_PTR(-ENODEV),則表明內核是在沒有debugfs
支持的情況下構建的,並且下述函數都不會起作用。
在debugfs目錄中創建文件的最通用方法是::
struct dentry *debugfs_create_file(const char *name, umode_t mode,
struct dentry *parent, void *data,
const struct file_operations *fops);
在這裡,name是要創建的文件的名稱,mode描述了訪問文件應具有的權限,parent指向
應該保存文件的目錄,data將存儲在產生的inode結構體的i_private欄位中,而fops是
一組文件操作函數,這些函數中實現文件操作的具體行爲。至少,read()和/或
write()操作應提供;其他可以根據需要包括在內。同樣的,返回值將是指向創建文件
的dentry指針,錯誤時返回ERR_PTR(-ERROR),系統不支持debugfs時返回值爲ERR_PTR
(-ENODEV)。創建一個初始大小的文件,可以使用以下函數代替::
struct dentry *debugfs_create_file_size(const char *name, umode_t mode,
struct dentry *parent, void *data,
const struct file_operations *fops,
loff_t file_size);
file_size是初始文件大小。其他參數跟函數debugfs_create_file的相同。
在許多情況下,沒必要自己去創建一組文件操作;對於一些簡單的情況,debugfs代碼提供
了許多幫助函數。包含單個整數值的文件可以使用以下任何一項創建::
void debugfs_create_u8(const char *name, umode_t mode,
struct dentry *parent, u8 *value);
void debugfs_create_u16(const char *name, umode_t mode,
struct dentry *parent, u16 *value);
struct dentry *debugfs_create_u32(const char *name, umode_t mode,
struct dentry *parent, u32 *value);
void debugfs_create_u64(const char *name, umode_t mode,
struct dentry *parent, u64 *value);
這些文件支持讀取和寫入給定值。如果某個文件不支持寫入,只需根據需要設置mode
參數位。這些文件中的值以十進位表示;如果需要使用十六進位,可以使用以下函數
替代::
void debugfs_create_x8(const char *name, umode_t mode,
struct dentry *parent, u8 *value);
void debugfs_create_x16(const char *name, umode_t mode,
struct dentry *parent, u16 *value);
void debugfs_create_x32(const char *name, umode_t mode,
struct dentry *parent, u32 *value);
void debugfs_create_x64(const char *name, umode_t mode,
struct dentry *parent, u64 *value);
這些功能只有在開發人員知道導出值的大小的時候才有用。某些數據類型在不同的架構上
有不同的寬度,這樣會使情況變得有些複雜。在這種特殊情況下可以使用以下函數::
void debugfs_create_size_t(const char *name, umode_t mode,
struct dentry *parent, size_t *value);
不出所料,此函數將創建一個debugfs文件來表示類型爲size_t的變量。
同樣地,也有導出無符號長整型變量的函數,分別以十進位和十六進位表示如下::
struct dentry *debugfs_create_ulong(const char *name, umode_t mode,
struct dentry *parent,
unsigned long *value);
void debugfs_create_xul(const char *name, umode_t mode,
struct dentry *parent, unsigned long *value);
布爾值可以通過以下方式放置在debugfs中::
struct dentry *debugfs_create_bool(const char *name, umode_t mode,
struct dentry *parent, bool *value);
讀取結果文件將產生Y(對於非零值)或N,後跟換行符寫入的時候,它只接受大寫或小寫
值或1或0。任何其他輸入將被忽略。
同樣,atomic_t類型的值也可以放置在debugfs中::
void debugfs_create_atomic_t(const char *name, umode_t mode,
struct dentry *parent, atomic_t *value)
讀取此文件將獲得atomic_t值,寫入此文件將設置atomic_t值。
另一個選擇是通過以下結構體和函數導出一個任意二進位數據塊::
struct debugfs_blob_wrapper {
void *data;
unsigned long size;
};
struct dentry *debugfs_create_blob(const char *name, umode_t mode,
struct dentry *parent,
struct debugfs_blob_wrapper *blob);
讀取此文件將返回由指針指向debugfs_blob_wrapper結構體的數據。一些驅動使用「blobs」
作爲一種返回幾行(靜態)格式化文本的簡單方法。這個函數可用於導出二進位信息,但
似乎在主線中沒有任何代碼這樣做。請注意,使用debugfs_create_blob()命令創建的
所有文件是只讀的。
如果您要轉儲一個寄存器塊(在開發過程中經常會這麼做,但是這樣的調試代碼很少上傳
到主線中。Debugfs提供兩個函數:一個用於創建僅寄存器文件,另一個把一個寄存器塊
插入一個順序文件中::
struct debugfs_reg32 {
char *name;
unsigned long offset;
};
struct debugfs_regset32 {
struct debugfs_reg32 *regs;
int nregs;
void __iomem *base;
};
struct dentry *debugfs_create_regset32(const char *name, umode_t mode,
struct dentry *parent,
struct debugfs_regset32 *regset);
void debugfs_print_regs32(struct seq_file *s, struct debugfs_reg32 *regs,
int nregs, void __iomem *base, char *prefix);
「base」參數可能爲0,但您可能需要使用__stringify構建reg32數組,實際上有許多寄存器
名稱(宏)是寄存器塊在基址上的字節偏移量。
如果要在debugfs中轉儲u32數組,可以使用以下函數創建文件::
void debugfs_create_u32_array(const char *name, umode_t mode,
struct dentry *parent,
u32 *array, u32 elements);
「array」參數提供數據,而「elements」參數爲數組中元素的數量。注意:數組創建後,數組
大小無法更改。
有一個函數來創建與設備相關的seq_file::
struct dentry *debugfs_create_devm_seqfile(struct device *dev,
const char *name,
struct dentry *parent,
int (*read_fn)(struct seq_file *s,
void *data));
「dev」參數是與此debugfs文件相關的設備,並且「read_fn」是一個函數指針,這個函數在
列印seq_file內容的時候被回調。
還有一些其他的面向目錄的函數::
struct dentry *debugfs_rename(struct dentry *old_dir,
struct dentry *old_dentry,
struct dentry *new_dir,
const char *new_name);
struct dentry *debugfs_create_symlink(const char *name,
struct dentry *parent,
const char *target);
調用debugfs_rename()將爲現有的debugfs文件重命名,可能同時切換目錄。 new_name
函數調用之前不能存在;返回值爲old_dentry,其中包含更新的信息。可以使用
debugfs_create_symlink()創建符號連結。
所有debugfs用戶必須考慮的一件事是:
debugfs不會自動清除在其中創建的任何目錄。如果一個模塊在不顯式刪除debugfs目錄的
情況下卸載模塊,結果將會遺留很多野指針,從而導致系統不穩定。因此,所有debugfs
用戶-至少是那些可以作爲模塊構建的用戶-必須做模塊卸載的時候準備刪除在此創建的
所有文件和目錄。一份文件可以通過以下方式刪除::
void debugfs_remove(struct dentry *dentry);
dentry值可以爲NULL或錯誤值,在這種情況下,不會有任何文件被刪除。
很久以前,內核開發者使用debugfs時需要記錄他們創建的每個dentry指針,以便最後所有
文件都可以被清理掉。但是,現在debugfs用戶能調用以下函數遞歸清除之前創建的文件::
void debugfs_remove_recursive(struct dentry *dentry);
如果將對應頂層目錄的dentry傳遞給以上函數,則該目錄下的整個層次結構將會被刪除。
注釋:
[1] http://lwn.net/Articles/309298/
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Original: :ref:`Documentation/filesystems/index.rst <filesystems_index>`
:Translator: Wang Wenhu <wenhu.wang@vivo.com>
Hu Haowen <src.res@email.cn>
.. _tw_filesystems_index:
========================
Linux Kernel中的文件系統
========================
這份正在開發的手冊或許在未來某個輝煌的日子裡以易懂的形式將Linux虛擬\
文件系統(VFS)層以及基於其上的各種文件系統如何工作呈現給大家。當前\
可以看到下面的內容。
文件系統
========
文件系統實現文檔。
.. toctree::
:maxdepth: 2
virtiofs
debugfs
tmpfs
This diff is collapsed.
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Original: Documentation/filesystems/tmpfs.rst
Translated by Wang Qing <wangqing@vivo.com>
and Hu Haowen <src.res@email.cn>
=====
Tmpfs
=====
Tmpfs是一個將所有文件都保存在虛擬內存中的文件系統。
tmpfs中的所有內容都是臨時的,也就是說沒有任何文件會在硬碟上創建。
如果卸載tmpfs實例,所有保存在其中的文件都會丟失。
tmpfs將所有文件保存在內核緩存中,隨著文件內容增長或縮小可以將不需要的
頁面swap出去。它具有最大限制,可以通過「mount -o remount ...」調整。
和ramfs(創建tmpfs的模板)相比,tmpfs包含交換和限制檢查。和tmpfs相似的另
一個東西是RAM磁碟(/dev/ram*),可以在物理RAM中模擬固定大小的硬碟,並在
此之上創建一個普通的文件系統。Ramdisks無法swap,因此無法調整它們的大小。
由於tmpfs完全保存於頁面緩存和swap中,因此所有tmpfs頁面將在/proc/meminfo
中顯示爲「Shmem」,而在free(1)中顯示爲「Shared」。請注意,這些計數還包括
共享內存(shmem,請參閱ipcs(1))。獲得計數的最可靠方法是使用df(1)和du(1)。
tmpfs具有以下用途:
1) 內核總有一個無法看到的內部掛載,用於共享匿名映射和SYSV共享內存。
掛載不依賴於CONFIG_TMPFS。如果CONFIG_TMPFS未設置,tmpfs對用戶不可見。
但是內部機制始終存在。
2) glibc 2.2及更高版本期望將tmpfs掛載在/dev/shm上以用於POSIX共享內存
(shm_open,shm_unlink)。添加內容到/etc/fstab應注意如下:
tmpfs /dev/shm tmpfs defaults 0 0
使用時需要記住創建掛載tmpfs的目錄。
SYSV共享內存無需掛載,內部已默認支持。(在2.3內核版本中,必須掛載
tmpfs的前身(shm fs)才能使用SYSV共享內存)
3) 很多人(包括我)都覺的在/tmp和/var/tmp上掛載非常方便,並具有較大的
swap分區。目前循環掛載tmpfs可以正常工作,所以大多數發布都應當可以
使用mkinitrd通過/tmp訪問/tmp。
4) 也許還有更多我不知道的地方:-)
tmpfs有三個用於調整大小的掛載選項:
========= ===========================================================
size tmpfs實例分配的字節數限制。默認值是不swap時物理RAM的一半。
如果tmpfs實例過大,機器將死鎖,因爲OOM處理將無法釋放該內存。
nr_blocks 與size相同,但以PAGE_SIZE爲單位。
nr_inodes tmpfs實例的最大inode個數。默認值是物理內存頁數的一半,或者
(有高端內存的機器)低端內存RAM的頁數,二者以較低者為準。
========= ===========================================================
這些參數接受後綴k,m或g表示千,兆和千兆字節,可以在remount時更改。
size參數也接受後綴%用來限制tmpfs實例占用物理RAM的百分比:
未指定size或nr_blocks時,默認值爲size=50%
如果nr_blocks=0(或size=0),block個數將不受限制;如果nr_inodes=0,
inode個數將不受限制。這樣掛載通常是不明智的,因爲它允許任何具有寫權限的
用戶通過訪問tmpfs耗盡機器上的所有內存;但同時這樣做也會增強在多個CPU的
場景下的訪問。
tmpfs具有爲所有文件設置NUMA內存分配策略掛載選項(如果啓用了CONFIG_NUMA),
可以通過「mount -o remount ...」調整
======================== =========================
mpol=default 採用進程分配策略
(請參閱 set_mempolicy(2))
mpol=prefer:Node 傾向從給定的節點分配
mpol=bind:NodeList 只允許從指定的鍊表分配
mpol=interleave 傾向於依次從每個節點分配
mpol=interleave:NodeList 依次從每個節點分配
mpol=local 優先本地節點分配內存
======================== =========================
NodeList格式是以逗號分隔的十進位數字表示大小和範圍,最大和最小範圍是用-
分隔符的十進位數來表示。例如,mpol=bind0-3,5,7,9-15
帶有有效NodeList的內存策略將按指定格式保存,在創建文件時使用。當任務在該
文件系統上創建文件時,會使用到掛載時的內存策略NodeList選項,如果設置的話,
由調用任務的cpuset[請參見Documentation/admin-guide/cgroup-v1/cpusets.rst]
以及下面列出的可選標誌約束。如果NodeLists爲設置爲空集,則文件的內存策略將
恢復爲「默認」策略。
NUMA內存分配策略有可選標誌,可以用於模式結合。在掛載tmpfs時指定這些可選
標誌可以在NodeList之前生效。
Documentation/admin-guide/mm/numa_memory_policy.rst列出所有可用的內存
分配策略模式標誌及其對內存策略。
::
=static 相當於 MPOL_F_STATIC_NODES
=relative 相當於 MPOL_F_RELATIVE_NODES
例如,mpol=bind=staticNodeList相當於MPOL_BIND|MPOL_F_STATIC_NODES的分配策略
請注意,如果內核不支持NUMA,那麼使用mpol選項掛載tmpfs將會失敗;nodelist指定不
在線的節點也會失敗。如果您的系統依賴於此,但內核會運行不帶NUMA功能(也許是安全
revocery內核),或者具有較少的節點在線,建議從自動模式中省略mpol選項掛載選項。
可以在以後通過「mount -o remount,mpol=Policy:NodeList MountPoint」添加到掛載點。
要指定初始根目錄,可以使用如下掛載選項:
==== ====================
模式 權限用八進位數字表示
uid 用戶ID
gid 組ID
==== ====================
這些選項對remount沒有任何影響。您可以通過chmod(1),chown(1)和chgrp(1)的更改
已經掛載的參數。
tmpfs具有選擇32位還是64位inode的掛載選項:
======= =============
inode64 使用64位inode
inode32 使用32位inode
======= =============
在32位內核上,默認是inode32,掛載時指定inode64會被拒絕。
在64位內核上,默認配置是CONFIG_TMPFS_INODE64。inode64避免了單個設備上可能有多個
具有相同inode編號的文件;比如32位應用程式使用glibc如果長期訪問tmpfs,一旦達到33
位inode編號,就有EOVERFLOW失敗的危險,無法打開大於2GiB的文件,並返回EINVAL。
所以'mount -t tmpfs -o size=10G,nr_inodes=10k,mode=700 tmpfs /mytmpfs'將在
/mytmpfs上掛載tmpfs實例,分配只能由root用戶訪問的10GB RAM/SWAP,可以有10240個
inode的實例。
:作者:
Christoph Rohland <cr@sap.com>, 1.12.01
:更新:
Hugh Dickins, 4 June 2007
:更新:
KOSAKI Motohiro, 16 Mar 2010
:更新:
Chris Down, 13 July 2020
.. SPDX-License-Identifier: GPL-2.0
.. include:: ../disclaimer-zh_TW.rst
:Original: :ref:`Documentation/filesystems/virtiofs.rst <virtiofs_index>`
譯者
::
中文版維護者: 王文虎 Wang Wenhu <wenhu.wang@vivo.com>
中文版翻譯者: 王文虎 Wang Wenhu <wenhu.wang@vivo.com>
中文版校譯者: 王文虎 Wang Wenhu <wenhu.wang@vivo.com>
中文版校譯者: 王文虎 Wang Wenhu <wenhu.wang@vivo.com>
繁體中文版校譯者:胡皓文 Hu Haowen <src.res@email.cn>
===========================================
virtiofs: virtio-fs 主機<->客機共享文件系統
===========================================
- Copyright (C) 2020 Vivo Communication Technology Co. Ltd.
介紹
====
Linux的virtiofs文件系統實現了一個半虛擬化VIRTIO類型「virtio-fs」設備的驅動,通過該\
類型設備實現客機<->主機文件系統共享。它允許客機掛載一個已經導出到主機的目錄。
客機通常需要訪問主機或者遠程系統上的文件。使用場景包括:在新客機安裝時讓文件對其\
可見;從主機上的根文件系統啓動;對無狀態或臨時客機提供持久存儲和在客機之間共享目錄。
儘管在某些任務可能通過使用已有的網絡文件系統完成,但是卻需要非常難以自動化的配置\
步驟,且將存儲網絡暴露給客機。而virtio-fs設備通過提供不經過網絡的文件系統訪問文件\
的設計方式解決了這些問題。
另外,virto-fs設備發揮了主客機共存的優點提高了性能,並且提供了網絡文件系統所不具備
的一些語義功能。
用法
====
以``myfs``標籤將文件系統掛載到``/mnt``:
.. code-block:: sh
guest# mount -t virtiofs myfs /mnt
請查閱 https://virtio-fs.gitlab.io/ 了解配置QEMU和virtiofsd守護程序的詳細信息。
內幕
====
由於virtio-fs設備將FUSE協議用於文件系統請求,因此Linux的virtiofs文件系統與FUSE文\
件系統客戶端緊密集成在一起。客機充當FUSE客戶端而主機充當FUSE伺服器,內核與用戶空\
間之間的/dev/fuse接口由virtio-fs設備接口代替。
FUSE請求被置於虛擬隊列中由主機處理。主機填充緩衝區中的響應部分,而客機處理請求的完成部分。
將/dev/fuse映射到虛擬隊列需要解決/dev/fuse和虛擬隊列之間語義上的差異。每次讀取\
/dev/fuse設備時,FUSE客戶端都可以選擇要傳輸的請求,從而可以使某些請求優先於其他\
請求。虛擬隊列有其隊列語義,無法更改已入隊請求的順序。在虛擬隊列已滿的情況下尤
其關鍵,因爲此時不可能加入高優先級的請求。爲了解決此差異,virtio-fs設備採用「hiprio」\
(高優先級)虛擬隊列,專門用於有別於普通請求的高優先級請求。
......@@ -89,6 +89,12 @@ TODOList:
大部分信息都是直接從內核原始碼獲取的,並根據需要添加補充材料(或者至少是在
我們設法添加的時候——可能不是所有的都是有需要的)。
.. toctree::
:maxdepth: 2
cpu-freq/index
filesystems/index
TODOList:
* driver-api/index
......@@ -97,7 +103,6 @@ TODOList:
* accounting/index
* block/index
* cdrom/index
* cpu-freq/index
* ide/index
* fb/index
* fpga/index
......@@ -123,7 +128,6 @@ TODOList:
* security/index
* sound/index
* crypto/index
* filesystems/index
* vm/index
* bpf/index
* usb/index
......@@ -136,6 +140,11 @@ TODOList:
體系結構無關文檔
----------------
.. toctree::
:maxdepth: 2
arm64/index
TODOList:
* asm-annotations
......
......@@ -140,10 +140,6 @@ The direct mapping covers all memory in the system up to the highest
memory address (this means in some cases it can also include PCI memory
holes).
vmalloc space is lazily synchronized into the different PML4/PML5 pages of
the processes using the page fault handler, with init_top_pgt as
reference.
We map EFI runtime services in the 'efi_pgd' PGD in a 64Gb large virtual
memory window (this size is arbitrary, it can be raised later if needed).
The mappings are not part of any other kernel PGD and are only available
......
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