sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget!/core-api/unaligned-memory-accessmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget4/translations/zh_TW/core-api/unaligned-memory-accessmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget4/translations/it_IT/core-api/unaligned-memory-accessmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget4/translations/ja_JP/core-api/unaligned-memory-accessmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget4/translations/ko_KR/core-api/unaligned-memory-accessmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget4/translations/sp_SP/core-api/unaligned-memory-accessmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhha/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/core-api/unaligned-memory-access.rsthKubh field_body)}(h3Documentation/core-api/unaligned-memory-access.rst h]h)}(h2Documentation/core-api/unaligned-memory-access.rsth]h2Documentation/core-api/unaligned-memory-access.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh)}(h-司延腾 Yanteng Si h]h)}(h,司延腾 Yanteng Si h](h司延腾 Yanteng Si <}(hjhhhNhNubh reference)}(hsiyanteng@loongson.cnh]hsiyanteng@loongson.cn}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:siyanteng@loongson.cnuh1jhjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h校译h]h校译}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj>hhhKubh)}(h时奎亮 h]h)}(h时奎亮 h](h 时奎亮 <}(hjShhhNhNubj)}(halexs@kernel.orgh]halexs@kernel.org}(hj[hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:alexs@kernel.orguh1jhjSubh>}(hjShhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hjOubah}(h]h ]h"]h$]h&]uh1hhj>ubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhtarget)}(h(.. _cn_core-api_unaligned-memory-access:h]h}(h]h ]h"]h$]h&]refid#cn-core-api-unaligned-memory-accessuh1jhKhhhhhhubhsection)}(hhh](htitle)}(h非对齐内存访问h]h非对齐内存访问}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubh)}(hhh](h)}(hhh](h)}(h作者h]h作者}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhKubh)}(hDaniel Drake ,h]h)}(hjh](hDaniel Drake <}(hjhhhNhNubj)}(hdsd@gentoo.orgh]hdsd@gentoo.org}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:dsd@gentoo.orguh1jhjubh>,}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hhh](h)}(h作者h]h作者}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhKubh)}(h*Johannes Berg h]h)}(h)Johannes Berg h](hJohannes Berg <}(hjhhhNhNubj)}(hjohannes@sipsolutions.neth]hjohannes@sipsolutions.net}(hj hhhNhNubah}(h]h ]h"]h$]h&]refuri mailto:johannes@sipsolutions.netuh1jhjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hhh](h)}(h感谢他们的帮助h]h感谢他们的帮助}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hhhKubh)}(hAlan Cox, Avuton Olrich, Heikki Orsila, Jan Engelhardt, Kyle McMartin, Kyle Moffett, Randy Dunlap, Robert Hancock, Uli Kunitz, Vadim Lobanov h]h)}(hAlan Cox, Avuton Olrich, Heikki Orsila, Jan Engelhardt, Kyle McMartin, Kyle Moffett, Randy Dunlap, Robert Hancock, Uli Kunitz, Vadim Lobanovh]hAlan Cox, Avuton Olrich, Heikki Orsila, Jan Engelhardt, Kyle McMartin, Kyle Moffett, Randy Dunlap, Robert Hancock, Uli Kunitz, Vadim Lobanov}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjCubah}(h]h ]h"]h$]h&]uh1hhj2ubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hLinux运行在各种各样的架构上,这些架构在内存访问方面有不同的表现。本文介绍了一些 关于不对齐访问的细节,为什么你需要编写不引起不对齐访问的代码,以及如何编写这样的 代码h]hLinux运行在各种各样的架构上,这些架构在内存访问方面有不同的表现。本文介绍了一些 关于不对齐访问的细节,为什么你需要编写不引起不对齐访问的代码,以及如何编写这样的 代码}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hhh](j)}(h非对齐访问的定义h]h非对齐访问的定义}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuhhhhhK!ubh)}(hX#当你试图从一个不被N偶数整除的地址(即addr % N != 0)开始读取N字节的数据时,就 会发生无对齐内存访问。例如,从地址0x10004读取4个字节的数据是可以的,但从地址 0x10005读取4个字节的数据将是一个不对齐的内存访问。h]hX#当你试图从一个不被N偶数整除的地址(即addr % N != 0)开始读取N字节的数据时,就 会发生无对齐内存访问。例如,从地址0x10004读取4个字节的数据是可以的,但从地址 0x10005读取4个字节的数据将是一个不对齐的内存访问。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK#hjuhhubh)}(hX上述内容可能看起来有点模糊,因为内存访问可以以不同的方式发生。这里的背景是在机器 码层面上:某些指令在内存中读取或写入一些字节(例如x86汇编中的movb、movw、movl)。 正如将变得清晰的那样,相对容易发现那些将编译为多字节内存访问指令的C语句,即在处理 u16、u32和u64等类型时。h]hX上述内容可能看起来有点模糊,因为内存访问可以以不同的方式发生。这里的背景是在机器 码层面上:某些指令在内存中读取或写入一些字节(例如x86汇编中的movb、movw、movl)。 正如将变得清晰的那样,相对容易发现那些将编译为多字节内存访问指令的C语句,即在处理 u16、u32和u64等类型时。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK'hjuhhubeh}(h]id2ah ]h"]非对齐访问的定义ah$]h&]uh1jhjhhhhhK!ubj)}(hhh](j)}(h 自然对齐h]h 自然对齐}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhK.ubh)}(h上面提到的规则构成了我们所说的自然对齐。当访问N个字节的内存时,基础内存地址必须被 N平均分割,即addr % N == 0。h]h上面提到的规则构成了我们所说的自然对齐。当访问N个字节的内存时,基础内存地址必须被 N平均分割,即addr % N == 0。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjhhubh)}(hB在编写代码时,假设目标架构有自然对齐的要求。h]hB在编写代码时,假设目标架构有自然对齐的要求。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK3hjhhubh)}(h在现实中,只有少数架构在所有大小的内存访问上都要求自然对齐。然而,我们必须考虑所 有支持的架构;编写满足自然对齐要求的代码是实现完全可移植性的最简单方法。h]h在现实中,只有少数架构在所有大小的内存访问上都要求自然对齐。然而,我们必须考虑所 有支持的架构;编写满足自然对齐要求的代码是实现完全可移植性的最简单方法。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK5hjhhubeh}(h]id3ah ]h"] 自然对齐ah$]h&]uh1jhjhhhhhK.ubj)}(hhh](j)}(h!为什么非对齐访问时坏事h]h!为什么非对齐访问时坏事}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhK:ubh)}(h执行非对齐内存访问的效果因架构不同而不同。在这里写一整篇关于这些差异的文档是很容 易的;下面是对常见情况的总结:h]h执行非对齐内存访问的效果因架构不同而不同。在这里写一整篇关于这些差异的文档是很容 易的;下面是对常见情况的总结:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK头文件提供的get_unaligned()和 put_unaligned()宏。h]h}避免非对齐访问的最简单方法是使用头文件提供的get_unaligned()和 put_unaligned()宏。}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjAhhubh)}(hA回到前面的一个可能导致非对齐访问的代码例子::h]h@回到前面的一个可能导致非对齐访问的代码例子:}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjAhhubj)}(hnvoid myfunc(u8 *data, u32 value) { [...] *((u32 *) data) = cpu_to_le32(value); [...] }h]hnvoid myfunc(u8 *data, u32 value) { [...] *((u32 *) data) = cpu_to_le32(value); [...] }}hjnsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjAhhubh)}(hD为了避免非对齐的内存访问,你可以将其改写如下::h]hC为了避免非对齐的内存访问,你可以将其改写如下:}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjAhhubj)}(hvoid myfunc(u8 *data, u32 value) { [...] value = cpu_to_le32(value); put_unaligned(value, (u32 *) data); [...] }h]hvoid myfunc(u8 *data, u32 value) { [...] value = cpu_to_le32(value); put_unaligned(value, (u32 *) data); [...] }}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjAhhubh)}(hget_unaligned()宏的工作原理与此类似。假设'data'是一个指向内存的指针,并且你希望避免 非对齐访问,其用法如下::h]hget_unaligned()宏的工作原理与此类似。假设’data’是一个指向内存的指针,并且你希望避免 非对齐访问,其用法如下:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjAhhubj)}(h(u32 value = get_unaligned((u32 *) data);h]h(u32 value = get_unaligned((u32 *) data);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjAhhubh)}(h这些宏适用于任何长度的内存访问(不仅仅是上面例子中的32位)。请注意,与标准的对齐内存 访问相比,使用这些宏来访问非对齐内存可能会在性能上付出代价。h]h这些宏适用于任何长度的内存访问(不仅仅是上面例子中的32位)。请注意,与标准的对齐内存 访问相比,使用这些宏来访问非对齐内存可能会在性能上付出代价。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjAhhubh)}(h如果使用这些宏不方便,另一个选择是使用memcpy(),其中源或目标(或两者)的类型为u8*或 非对齐char*。由于这种操作的字节性质,避免了非对齐访问。h]h如果使用这些宏不方便,另一个选择是使用memcpy(),其中源或目标(或两者)的类型为u8*或 非对齐char*。由于这种操作的字节性质,避免了非对齐访问。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjAhhubeh}(h]id7ah ]h"]避免非对齐访问ah$]h&]uh1jhjhhhhhKubj)}(hhh](j)}(h对齐 vs. 网络h]h对齐 vs. 网络}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhhhKubh)}(hX在需要对齐负载的架构上,网络要求IP头在四字节边界上对齐,以优化IP栈。对于普通的以太网 硬件,常数NET_IP_ALIGN被使用。在大多数架构上,这个常数的值是2,因为正常的以太网头是 14个字节,所以为了获得适当的对齐,需要DMA到一个可以表示为4*n+2的地址。一个值得注意的 例外是powerpc,它将NET_IP_ALIGN定义为0,因为DMA到未对齐的地址可能非常昂贵,与未对齐 的负载的成本相比相形见绌。h]hX在需要对齐负载的架构上,网络要求IP头在四字节边界上对齐,以优化IP栈。对于普通的以太网 硬件,常数NET_IP_ALIGN被使用。在大多数架构上,这个常数的值是2,因为正常的以太网头是 14个字节,所以为了获得适当的对齐,需要DMA到一个可以表示为4*n+2的地址。一个值得注意的 例外是powerpc,它将NET_IP_ALIGN定义为0,因为DMA到未对齐的地址可能非常昂贵,与未对齐 的负载的成本相比相形见绌。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXO对于一些不能DMA到未对齐地址的以太网硬件,如4*n+2或非以太网硬件,这可能是一个问题,这 时需要将传入的帧复制到一个对齐的缓冲区。因为这在可以进行非对齐访问的架构上是不必要的, 所以可以使代码依赖于CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS,像这样::h]hXN对于一些不能DMA到未对齐地址的以太网硬件,如4*n+2或非以太网硬件,这可能是一个问题,这 时需要将传入的帧复制到一个对齐的缓冲区。因为这在可以进行非对齐访问的架构上是不必要的, 所以可以使代码依赖于CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS,像这样:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hl#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS skb = original skb #else skb = copy skb #endifh]hl#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS skb = original skb #else skb = copy skb #endif}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubeh}(h]vsah ]h"]对齐 vs. 网络ah$]h&]uh1jhjhhhhhKubeh}(h](jid1eh ]h"](非对齐内存访问#cn_core-api_unaligned-memory-accesseh$]h&]uh1jhhhhhhhKexpect_referenced_by_name}j!jsexpect_referenced_by_id}jjsubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(jN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjKerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh، _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}j]jasnameids}(j!jj jjjjjjjj^j[j>j;jjjju nametypes}(j!j jjjj^j>jjuh}(jjjjjjujjjjj[jj;jajjAjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jYKsRparse_messages]transform_messages]hsystem_message)}(hhh]h)}(hhh]hIHyperlink target "cn-core-api-unaligned-memory-access" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypeINFOsourceh،lineKuh1juba transformerN include_log]EDocumentation/translations/zh_CN/core-api/unaligned-memory-access.rst(NNNNta decorationNhhub.