Chinese translated version of Documentation/arch/arm/kernel_user_helpers.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: Nicolas Pitre <nicolas.pitre@linaro.org>
		Dave Martin <dave.martin@linaro.org>
Chinese maintainer: Fu Wei <tekkamanninja@gmail.com>
---------------------------------------------------------------------
Documentation/arch/arm/kernel_user_helpers.rst 的中文翻译

如果想评论或更新本文的内容，请直接联系原文档的维护者。如果你使用英文
交流有困难的话，也可以向中文版维护者求助。如果本翻译更新不及时或者翻
译存在问题，请联系中文版维护者。
英文版维护者： Nicolas Pitre <nicolas.pitre@linaro.org>
		Dave Martin <dave.martin@linaro.org>
中文版维护者： 傅炜 Fu Wei <tekkamanninja@gmail.com>
中文版翻译者： 傅炜 Fu Wei <tekkamanninja@gmail.com>
中文版校译者： 宋冬生 Dongsheng Song <dongshneg.song@gmail.com>
		傅炜 Fu Wei <tekkamanninja@gmail.com>


以下为正文
---------------------------------------------------------------------
内核提供的用户空间辅助代码
=========================

在内核内存空间的固定地址处，有一个由内核提供并可从用户空间访问的代码
段。它用于向用户空间提供因在许多 ARM CPU 中未实现的特性和/或指令而需
内核提供帮助的某些操作。这些代码直接在用户模式下执行的想法是为了获得
最佳效率，但那些与内核计数器联系过于紧密的部分，则被留给了用户库实现。
事实上，此代码甚至可能因不同的 CPU 而异，这取决于其可用的指令集或它
是否为 SMP 系统。换句话说，内核保留在不作出警告的情况下根据需要更改
这些代码的权利。只有本文档描述的入口及其结果是保证稳定的。

这与完全成熟的 VDSO 实现不同（但两者并不冲突），尽管如此，VDSO 可阻止
某些通过常量高效跳转到那些代码段的汇编技巧。且由于那些代码段在返回用户
代码前仅使用少量的代码周期，则一个 VDSO 间接远程调用将会在这些简单的
操作上增加一个可测量的开销。

在对那些拥有原生支持的新型处理器进行代码优化时，仅在已为其他操作使用
了类似的新增指令，而导致二进制结果已与早期 ARM 处理器不兼容的情况下，
用户空间才应绕过这些辅助代码，并在内联函数中实现这些操作（无论是通过
编译器在代码中直接放置，还是作为库函数调用实现的一部分）。也就是说，
如果你编译的代码不会为了其他目的使用新指令，则不要仅为了避免使用这些
内核辅助代码，导致二进制程序无法在早期处理器上运行。

新的辅助代码可能随着时间的推移而增加，所以新内核中的某些辅助代码在旧
内核中可能不存在。因此，程序必须在对任何辅助代码调用假设是安全之前，
检测 __kuser_helper_version 的值（见下文）。理想情况下，这种检测应该
只在进程启动时执行一次；如果内核版本不支持所需辅助代码，则该进程可尽早
中止执行。

kuser_helper_version
--------------------

位置:	0xffff0ffc

参考声明:

  extern int32_t __kuser_helper_version;

定义:

  这个区域包含了当前运行内核实现的辅助代码版本号。用户空间可以通过读
  取此版本号以确定特定的辅助代码是否存在。

使用范例:

#define __kuser_helper_version (*(int32_t *)0xffff0ffc)

void check_kuser_version(void)
{
	if (__kuser_helper_version < 2) {
		fprintf(stderr, "can't do atomic operations, kernel too old\n");
		abort();
	}
}

注意:

  用户空间可以假设这个域的值不会在任何单个进程的生存期内改变。也就
  是说，这个域可以仅在库的初始化阶段或进程启动阶段读取一次。

kuser_get_tls
-------------

位置:	0xffff0fe0

参考原型:

  void * __kuser_get_tls(void);

输入:

  lr = 返回地址

输出:

  r0 = TLS 值

被篡改的寄存器:

  无

定义:

  获取之前通过 __ARM_NR_set_tls 系统调用设置的 TLS 值。

使用范例:

typedef void * (__kuser_get_tls_t)(void);
#define __kuser_get_tls (*(__kuser_get_tls_t *)0xffff0fe0)

void foo()
{
	void *tls = __kuser_get_tls();
	printf("TLS = %p\n", tls);
}

注意:

  - 仅在 __kuser_helper_version >= 1 时，此辅助代码存在
    （从内核版本 2.6.12 开始）。

kuser_cmpxchg
-------------

位置:	0xffff0fc0

参考原型:

  int __kuser_cmpxchg(int32_t oldval, int32_t newval, volatile int32_t *ptr);

输入:

  r0 = oldval
  r1 = newval
  r2 = ptr
  lr = 返回地址

输出:

  r0 = 成功代码 (零或非零)
  C flag = 如果 r0 == 0 则置 1，如果 r0 != 0 则清零。

被篡改的寄存器:

  r3, ip, flags

定义:

  仅在 *ptr 为 oldval 时原子保存 newval 于 *ptr 中。
  如果 *ptr 被改变，则返回值为零，否则为非零值。
  如果 *ptr 被改变，则 C flag 也会被置 1，以实现调用代码中的汇编
  优化。

使用范例:

typedef int (__kuser_cmpxchg_t)(int oldval, int newval, volatile int *ptr);
#define __kuser_cmpxchg (*(__kuser_cmpxchg_t *)0xffff0fc0)

int atomic_add(volatile int *ptr, int val)
{
	int old, new;

	do {
		old = *ptr;
		new = old + val;
	} while(__kuser_cmpxchg(old, new, ptr));

	return new;
}

注意:

  - 这个例程已根据需要包含了内存屏障。

  - 仅在 __kuser_helper_version >= 2 时，此辅助代码存在
    （从内核版本 2.6.12 开始）。

kuser_memory_barrier
--------------------

位置:	0xffff0fa0

参考原型:

  void __kuser_memory_barrier(void);

输入:

  lr = 返回地址

输出:

  无

被篡改的寄存器:

  无

定义:

  应用于任何需要内存屏障以防止手动数据修改带来的一致性问题，以及
  __kuser_cmpxchg 中。

使用范例:

typedef void (__kuser_dmb_t)(void);
#define __kuser_dmb (*(__kuser_dmb_t *)0xffff0fa0)

注意:

  - 仅在 __kuser_helper_version >= 3 时，此辅助代码存在
    （从内核版本 2.6.15 开始）。

kuser_cmpxchg64
---------------

位置:	0xffff0f60

参考原型:

  int __kuser_cmpxchg64(const int64_t *oldval,
                        const int64_t *newval,
                        volatile int64_t *ptr);

输入:

  r0 = 指向 oldval
  r1 = 指向 newval
  r2 = 指向目标值
  lr = 返回地址

输出:

  r0 = 成功代码 (零或非零)
  C flag = 如果 r0 == 0 则置 1，如果 r0 != 0 则清零。

被篡改的寄存器:

  r3, lr, flags

定义:

  仅在 *ptr 等于 *oldval 指向的 64 位值时，原子保存 *newval
  指向的 64 位值于 *ptr 中。如果 *ptr 被改变，则返回值为零，
  否则为非零值。

  如果 *ptr 被改变，则 C flag 也会被置 1，以实现调用代码中的汇编
  优化。

使用范例:

typedef int (__kuser_cmpxchg64_t)(const int64_t *oldval,
                                  const int64_t *newval,
                                  volatile int64_t *ptr);
#define __kuser_cmpxchg64 (*(__kuser_cmpxchg64_t *)0xffff0f60)

int64_t atomic_add64(volatile int64_t *ptr, int64_t val)
{
	int64_t old, new;

	do {
		old = *ptr;
		new = old + val;
	} while(__kuser_cmpxchg64(&old, &new, ptr));

	return new;
}

注意:

  - 这个例程已根据需要包含了内存屏障。

  - 由于这个过程的代码长度（此辅助代码跨越 2 个常规的 kuser “槽”），
    因此 0xffff0f80 不被作为有效的入口点。

  - 仅在 __kuser_helper_version >= 5 时，此辅助代码存在
    （从内核版本 3.1 开始）。
