diff --git a/.mailmap b/.mailmap index b44be834bcb6bfd43dab38fdd0509b7fd1277c7b..3e2bff9137e918255231b3729a81c63251d5c62a 100644 --- a/.mailmap +++ b/.mailmap @@ -25,8 +25,9 @@ Alexandre Belloni <alexandre.belloni@bootlin.com> <alexandre.belloni@free-electr Alexei Starovoitov <ast@kernel.org> <alexei.starovoitov@gmail.com> Alexei Starovoitov <ast@kernel.org> <ast@fb.com> Alexei Starovoitov <ast@kernel.org> <ast@plumgrid.com> -Alex Shi <alex.shi@linux.alibaba.com> <alex.shi@intel.com> -Alex Shi <alex.shi@linux.alibaba.com> <alex.shi@linaro.org> +Alex Shi <alexs@kernel.org> <alex.shi@intel.com> +Alex Shi <alexs@kernel.org> <alex.shi@linaro.org> +Alex Shi <alexs@kernel.org> <alex.shi@linux.alibaba.com> Al Viro <viro@ftp.linux.org.uk> Al Viro <viro@zenIV.linux.org.uk> Andi Kleen <ak@linux.intel.com> <ak@suse.de> diff --git a/CREDITS b/CREDITS index 91ea9b780bd9dec253dfe11a745eba99b3bfbbb1..b8f964198ddab91f32d907b8fd58f39f7f5c5e58 100644 --- a/CREDITS +++ b/CREDITS @@ -550,7 +550,7 @@ D: gadget layers, SPI subsystem, GPIO subsystem, and more than a few D: device drivers. His encouragement also helped many engineers get D: started working on the Linux kernel. David passed away in early D: 2011, and will be greatly missed. -W: https://lkml.org/lkml/2011/4/5/36 +W: https://lore.kernel.org/lkml/20110405034819.GA7872@kroah.com N: Gary Brubaker E: xavyer@ix.netcom.com diff --git a/Documentation/admin-guide/LSM/LoadPin.rst b/Documentation/admin-guide/LSM/LoadPin.rst index 716ad9b23c9aa73115c21ee86538cf99cd7ec173..dd3ca68b5df188315710c8115761f8cb4da93141 100644 --- a/Documentation/admin-guide/LSM/LoadPin.rst +++ b/Documentation/admin-guide/LSM/LoadPin.rst @@ -11,8 +11,8 @@ restrictions without needing to sign the files individually. The LSM is selectable at build-time with ``CONFIG_SECURITY_LOADPIN``, and can be controlled at boot-time with the kernel command line option -"``loadpin.enabled``". By default, it is enabled, but can be disabled at -boot ("``loadpin.enabled=0``"). +"``loadpin.enforce``". By default, it is enabled, but can be disabled at +boot ("``loadpin.enforce=0``"). LoadPin starts pinning when it sees the first file loaded. If the block device backing the filesystem is not read-only, a sysctl is @@ -28,4 +28,4 @@ different mechanisms such as ``CONFIG_MODULE_SIG`` and ``CONFIG_KEXEC_VERIFY_SIG`` to verify kernel module and kernel image while still use LoadPin to protect the integrity of other files kernel loads. The full list of valid file types can be found in ``kernel_read_file_str`` -defined in ``include/linux/fs.h``. +defined in ``include/linux/kernel_read_file.h``. diff --git a/Documentation/admin-guide/cgroup-v1/memory.rst b/Documentation/admin-guide/cgroup-v1/memory.rst index 0936412e044eed0b1a1af5231441f5841cac61b5..41191b5fb69d9cc0663d20789aad230d3a82b24d 100644 --- a/Documentation/admin-guide/cgroup-v1/memory.rst +++ b/Documentation/admin-guide/cgroup-v1/memory.rst @@ -360,8 +360,8 @@ U != 0, K = unlimited: U != 0, K < U: Kernel memory is a subset of the user memory. This setup is useful in - deployments where the total amount of memory per-cgroup is overcommited. - Overcommiting kernel memory limits is definitely not recommended, since the + deployments where the total amount of memory per-cgroup is overcommitted. + Overcommitting kernel memory limits is definitely not recommended, since the box can still run out of non-reclaimable memory. In this case, the admin could set up K so that the sum of all groups is never greater than the total memory, and freely set U at the cost of his @@ -851,6 +851,9 @@ At reading, current status of OOM is shown. (if 1, oom-killer is disabled) - under_oom 0 or 1 (if 1, the memory cgroup is under OOM, tasks may be stopped.) + - oom_kill integer counter + The number of processes belonging to this cgroup killed by any + kind of OOM killer. 11. Memory Pressure =================== diff --git a/Documentation/admin-guide/dynamic-debug-howto.rst b/Documentation/admin-guide/dynamic-debug-howto.rst index 6c04aea8f4cd83652fc8de70cb104f2348a1d456..b119b8277b3ead734aff49130e26c3b30ee729c5 100644 --- a/Documentation/admin-guide/dynamic-debug-howto.rst +++ b/Documentation/admin-guide/dynamic-debug-howto.rst @@ -347,7 +347,7 @@ Examples <debugfs>/dynamic_debug/control // enable messages in files of which the paths include string "usb" - nullarbor:~ # echo -n '*usb* +p' > <debugfs>/dynamic_debug/control + nullarbor:~ # echo -n 'file *usb* +p' > <debugfs>/dynamic_debug/control // enable all messages nullarbor:~ # echo -n '+p' > <debugfs>/dynamic_debug/control diff --git a/Documentation/admin-guide/index.rst b/Documentation/admin-guide/index.rst index 423116c4e7875bfdf825ad7703227592eb8ff010..dc00afcabb95f90da2a7562d9f443c0b4ba6eae6 100644 --- a/Documentation/admin-guide/index.rst +++ b/Documentation/admin-guide/index.rst @@ -35,7 +35,6 @@ problems and bugs in particular. :maxdepth: 1 reporting-issues - Reporting bugs (obsolete) <reporting-bugs> security-bugs bug-hunting bug-bisect diff --git a/Documentation/admin-guide/kernel-parameters.rst b/Documentation/admin-guide/kernel-parameters.rst index 1132796a8d96e7636fc28f0804519849dec3987f..24302cad174a3e34ed532566c97f414ff9cac89c 100644 --- a/Documentation/admin-guide/kernel-parameters.rst +++ b/Documentation/admin-guide/kernel-parameters.rst @@ -140,6 +140,7 @@ parameter is applicable:: PPT Parallel port support is enabled. PS2 Appropriate PS/2 support is enabled. RAM RAM disk support is enabled. + RISCV RISCV architecture is enabled. RDT Intel Resource Director Technology. S390 S390 architecture is enabled. SCSI Appropriate SCSI support is enabled. diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index 9b3c086d4266b0075f7eea763a70921ad2e4d8aa..550cf2b2b7e8aeec5330f30dbf19668d3425aa0a 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -3471,7 +3471,8 @@ nr_uarts= [SERIAL] maximum number of UARTs to be registered. - numa_balancing= [KNL,X86] Enable or disable automatic NUMA balancing. + numa_balancing= [KNL,ARM64,PPC,RISCV,S390,X86] Enable or disable automatic + NUMA balancing. Allowed values are enable and disable numa_zonelist_order= [KNL, BOOT] Select zonelist order for NUMA. diff --git a/Documentation/admin-guide/kernel-per-CPU-kthreads.rst b/Documentation/admin-guide/kernel-per-CPU-kthreads.rst index 531f689311f24745531a6d835a4bee920014bbfe..5e51ee5b03589fc9b538daaeb2289fd85f5ce609 100644 --- a/Documentation/admin-guide/kernel-per-CPU-kthreads.rst +++ b/Documentation/admin-guide/kernel-per-CPU-kthreads.rst @@ -332,23 +332,3 @@ To reduce its OS jitter, do at least one of the following: kthreads from being created in the first place. However, please note that this will not eliminate OS jitter, but will instead shift it to RCU_SOFTIRQ. - -Name: - watchdog/%u - -Purpose: - Detect software lockups on each CPU. - -To reduce its OS jitter, do at least one of the following: - -1. Build with CONFIG_LOCKUP_DETECTOR=n, which will prevent these - kthreads from being created in the first place. -2. Boot with "nosoftlockup=0", which will also prevent these kthreads - from being created. Other related watchdog and softlockup boot - parameters may be found in Documentation/admin-guide/kernel-parameters.rst - and Documentation/watchdog/watchdog-parameters.rst. -3. Echo a zero to /proc/sys/kernel/watchdog to disable the - watchdog timer. -4. Echo a large number of /proc/sys/kernel/watchdog_thresh in - order to reduce the frequency of OS jitter due to the watchdog - timer down to a level that is acceptable for your workload. diff --git a/Documentation/admin-guide/mm/numaperf.rst b/Documentation/admin-guide/mm/numaperf.rst index c2f826409bf076bb42608f3c69837c2935f7e38c..1666973259479b0b945c18a3eec901c78db2d61d 100644 --- a/Documentation/admin-guide/mm/numaperf.rst +++ b/Documentation/admin-guide/mm/numaperf.rst @@ -151,7 +151,7 @@ Each cache level's directory provides its attributes. For example, the following shows a single cache level and the attributes available for software to query:: - # tree sys/devices/system/node/node0/memory_side_cache/ + # tree /sys/devices/system/node/node0/memory_side_cache/ /sys/devices/system/node/node0/memory_side_cache/ |-- index1 | |-- indexing diff --git a/Documentation/admin-guide/reporting-bugs.rst b/Documentation/admin-guide/reporting-bugs.rst deleted file mode 100644 index 409fa91d7495e3e3db32ac96447ede34069d6540..0000000000000000000000000000000000000000 --- a/Documentation/admin-guide/reporting-bugs.rst +++ /dev/null @@ -1,187 +0,0 @@ -.. _reportingbugs: - -.. note:: - - This document is obsolete, and will be replaced by - 'Documentation/admin-guide/reporting-issues.rst' in the near future. - -Reporting bugs -++++++++++++++ - -Background -========== - -The upstream Linux kernel maintainers only fix bugs for specific kernel -versions. Those versions include the current "release candidate" (or -rc) -kernel, any "stable" kernel versions, and any "long term" kernels. - -Please see https://www.kernel.org/ for a list of supported kernels. Any -kernel marked with [EOL] is "end of life" and will not have any fixes -backported to it. - -If you've found a bug on a kernel version that isn't listed on kernel.org, -contact your Linux distribution or embedded vendor for support. -Alternatively, you can attempt to run one of the supported stable or -rc -kernels, and see if you can reproduce the bug on that. It's preferable -to reproduce the bug on the latest -rc kernel. - - -How to report Linux kernel bugs -=============================== - - -Identify the problematic subsystem ----------------------------------- - -Identifying which part of the Linux kernel might be causing your issue -increases your chances of getting your bug fixed. Simply posting to the -generic linux-kernel mailing list (LKML) may cause your bug report to be -lost in the noise of a mailing list that gets 1000+ emails a day. - -Instead, try to figure out which kernel subsystem is causing the issue, -and email that subsystem's maintainer and mailing list. If the subsystem -maintainer doesn't answer, then expand your scope to mailing lists like -LKML. - - -Identify who to notify ----------------------- - -Once you know the subsystem that is causing the issue, you should send a -bug report. Some maintainers prefer bugs to be reported via bugzilla -(https://bugzilla.kernel.org), while others prefer that bugs be reported -via the subsystem mailing list. - -To find out where to send an emailed bug report, find your subsystem or -device driver in the MAINTAINERS file. Search in the file for relevant -entries, and send your bug report to the person(s) listed in the "M:" -lines, making sure to Cc the mailing list(s) in the "L:" lines. When the -maintainer replies to you, make sure to 'Reply-all' in order to keep the -public mailing list(s) in the email thread. - -If you know which driver is causing issues, you can pass one of the driver -files to the get_maintainer.pl script:: - - perl scripts/get_maintainer.pl -f <filename> - -If it is a security bug, please copy the Security Contact listed in the -MAINTAINERS file. They can help coordinate bugfix and disclosure. See -:ref:`Documentation/admin-guide/security-bugs.rst <securitybugs>` for more information. - -If you can't figure out which subsystem caused the issue, you should file -a bug in kernel.org bugzilla and send email to -linux-kernel@vger.kernel.org, referencing the bugzilla URL. (For more -information on the linux-kernel mailing list see -http://vger.kernel.org/lkml/). - - -Tips for reporting bugs ------------------------ - -If you haven't reported a bug before, please read: - - https://www.chiark.greenend.org.uk/~sgtatham/bugs.html - - http://www.catb.org/esr/faqs/smart-questions.html - -It's REALLY important to report bugs that seem unrelated as separate email -threads or separate bugzilla entries. If you report several unrelated -bugs at once, it's difficult for maintainers to tease apart the relevant -data. - - -Gather information ------------------- - -The most important information in a bug report is how to reproduce the -bug. This includes system information, and (most importantly) -step-by-step instructions for how a user can trigger the bug. - -If the failure includes an "OOPS:", take a picture of the screen, capture -a netconsole trace, or type the message from your screen into the bug -report. Please read "Documentation/admin-guide/bug-hunting.rst" before posting your -bug report. This explains what you should do with the "Oops" information -to make it useful to the recipient. - -This is a suggested format for a bug report sent via email or bugzilla. -Having a standardized bug report form makes it easier for you not to -overlook things, and easier for the developers to find the pieces of -information they're really interested in. If some information is not -relevant to your bug, feel free to exclude it. - -First run the ver_linux script included as scripts/ver_linux, which -reports the version of some important subsystems. Run this script with -the command ``awk -f scripts/ver_linux``. - -Use that information to fill in all fields of the bug report form, and -post it to the mailing list with a subject of "PROBLEM: <one line -summary from [1.]>" for easy identification by the developers:: - - [1.] One line summary of the problem: - [2.] Full description of the problem/report: - [3.] Keywords (i.e., modules, networking, kernel): - [4.] Kernel information - [4.1.] Kernel version (from /proc/version): - [4.2.] Kernel .config file: - [5.] Most recent kernel version which did not have the bug: - [6.] Output of Oops.. message (if applicable) with symbolic information - resolved (see Documentation/admin-guide/bug-hunting.rst) - [7.] A small shell script or example program which triggers the - problem (if possible) - [8.] Environment - [8.1.] Software (add the output of the ver_linux script here) - [8.2.] Processor information (from /proc/cpuinfo): - [8.3.] Module information (from /proc/modules): - [8.4.] Loaded driver and hardware information (/proc/ioports, /proc/iomem) - [8.5.] PCI information ('lspci -vvv' as root) - [8.6.] SCSI information (from /proc/scsi/scsi) - [8.7.] Other information that might be relevant to the problem - (please look in /proc and include all information that you - think to be relevant): - [X.] Other notes, patches, fixes, workarounds: - - -Follow up -========= - -Expectations for bug reporters ------------------------------- - -Linux kernel maintainers expect bug reporters to be able to follow up on -bug reports. That may include running new tests, applying patches, -recompiling your kernel, and/or re-triggering your bug. The most -frustrating thing for maintainers is for someone to report a bug, and then -never follow up on a request to try out a fix. - -That said, it's still useful for a kernel maintainer to know a bug exists -on a supported kernel, even if you can't follow up with retests. Follow -up reports, such as replying to the email thread with "I tried the latest -kernel and I can't reproduce my bug anymore" are also helpful, because -maintainers have to assume silence means things are still broken. - -Expectations for kernel maintainers ------------------------------------ - -Linux kernel maintainers are busy, overworked human beings. Some times -they may not be able to address your bug in a day, a week, or two weeks. -If they don't answer your email, they may be on vacation, or at a Linux -conference. Check the conference schedule at https://LWN.net for more info: - - https://lwn.net/Calendar/ - -In general, kernel maintainers take 1 to 5 business days to respond to -bugs. The majority of kernel maintainers are employed to work on the -kernel, and they may not work on the weekends. Maintainers are scattered -around the world, and they may not work in your time zone. Unless you -have a high priority bug, please wait at least a week after the first bug -report before sending the maintainer a reminder email. - -The exceptions to this rule are regressions, kernel crashes, security holes, -or userspace breakage caused by new kernel behavior. Those bugs should be -addressed by the maintainers ASAP. If you suspect a maintainer is not -responding to these types of bugs in a timely manner (especially during a -merge window), escalate the bug to LKML and Linus Torvalds. - -Thank you! - -[Some of this is taken from Frohwalt Egerer's original linux-kernel FAQ] diff --git a/Documentation/admin-guide/reporting-issues.rst b/Documentation/admin-guide/reporting-issues.rst index 07879d01fe6854f953adfb3abfcb0ad29e009cf8..48b4d0ef2b09cd5d9770d2d323b37f3cbd8a4854 100644 --- a/Documentation/admin-guide/reporting-issues.rst +++ b/Documentation/admin-guide/reporting-issues.rst @@ -9,25 +9,6 @@ (for example by the kernel's build system) might contain content taken from files which use a more restrictive license. -.. important:: - - This document is being prepared to replace - 'Documentation/admin-guide/reporting-bugs.rst'. The main work is done and - you are already free to follow its instructions when reporting issues to the - Linux kernel developers. But keep in mind, below text still needs a few - finishing touches and review. It was merged to the Linux kernel sources at - this stage to make this process easier and increase the text's visibility. - - Any improvements for the text or other feedback is thus very much welcome. - Please send it to 'Thorsten Leemhuis <linux@leemhuis.info>' and 'Jonathan - Corbet <corbet@lwn.net>', ideally with 'Linux kernel mailing list (LKML) - <linux-kernel@vger.kernel.org>' and the 'Linux Kernel Documentation List - <linux-doc@vger.kernel.org>' in CC. - - Areas in the text that still need work or discussion contain a hint like this - which point out the remaining issues; all of them start with the word "FIXME" - to make them easy to find. - Reporting issues ++++++++++++++++ @@ -36,46 +17,43 @@ Reporting issues The short guide (aka TL;DR) =========================== -If you're facing multiple issues with the Linux kernel at once, report each -separately to its developers. Try your best guess which kernel part might be -causing the issue. Check the :ref:`MAINTAINERS <maintainers>` file for how its -developers expect to be told about issues. Note, it's rarely -`bugzilla.kernel.org <https://bugzilla.kernel.org/>`_, as in almost all cases -the report needs to be sent by email! - -Check the destination thoroughly for existing reports; also search the LKML -archives and the web. Join existing discussion if you find matches. If you -don't find any, install `the latest Linux mainline kernel -<https://kernel.org/>`_. Make sure it's vanilla, thus is not patched or using -add-on kernel modules. Also ensure the kernel is running in a healthy -environment and is not already tainted before the issue occurs. - -If you can reproduce your issue with the mainline kernel, send a report to the -destination you determined earlier. Make sure it includes all relevant -information, which in case of a regression should mention the change that's -causing it which can often can be found with a bisection. Also ensure the -report reaches all people that need to know about it, for example the security -team, the stable maintainers or the developers of the patch that causes a -regression. Once the report is out, answer any questions that might be raised -and help where you can. That includes keeping the ball rolling: every time a -new rc1 mainline kernel is released, check if the issue is still happening -there and attach a status update to your initial report. - -If you can not reproduce the issue with the mainline kernel, consider sticking -with it; if you'd like to use an older version line and want to see it fixed -there, first make sure it's still supported. Install its latest release as -vanilla kernel. If you cannot reproduce the issue there, try to find the commit -that fixed it in mainline or any discussion preceding it: those will often -mention if backporting is planed or considered too complex. If backporting was -not discussed, ask if it's in the cards. In case you don't find any commits or -a preceding discussion, see the Linux-stable mailing list archives for existing -reports, as it might be a regression specific to the version line. If it is, -report it like you would report a problem in mainline (including the -bisection). - -If you reached this point without a solution, ask for advice one the -subsystem's mailing list. - +Are you facing a regression with vanilla kernels from the same stable or +longterm series? One still supported? Then search the `LKML +<https://lore.kernel.org/lkml/>`_ and the `Linux stable mailing list +<https://lore.kernel.org/stable/>`_ archives for matching reports to join. If +you don't find any, install `the latest release from that series +<https://kernel.org/>`_. If it still shows the issue, report it to the stable +mailing list (stable@vger.kernel.org) and CC the regressions list +(regressions@lists.linux.dev). + +In all other cases try your best guess which kernel part might be causing the +issue. Check the :ref:`MAINTAINERS <maintainers>` file for how its developers +expect to be told about problems, which most of the time will be by email with a +mailing list in CC. Check the destination's archives for matching reports; +search the `LKML <https://lore.kernel.org/lkml/>`_ and the web, too. If you +don't find any to join, install `the latest mainline kernel +<https://kernel.org/>`_. If the issue is present there, send a report. + +The issue was fixed there, but you would like to see it resolved in a still +supported stable or longterm series as well? Then install its latest release. +If it shows the problem, search for the change that fixed it in mainline and +check if backporting is in the works or was discarded; if it's neither, ask +those who handled the change for it. + +**General remarks**: When installing and testing a kernel as outlined above, +ensure it's vanilla (IOW: not patched and not using add-on modules). Also make +sure it's built and running in a healthy environment and not already tainted +before the issue occurs. + +If you are facing multiple issues with the Linux kernel at once, report each +separately. While writing your report, include all information relevant to the +issue, like the kernel and the distro used. In case of a regression, CC the +regressions mailing list (regressions@lists.linux.dev) to your report; also try +to include the commit-id of the change causing it, which a bisection can find. + +Once the report is out, answer any questions that come up and help where you +can. That includes keeping the ball rolling by occasionally retesting with newer +releases and sending a status update afterwards. Step-by-step guide how to report issues to the kernel maintainers ================================================================= @@ -94,28 +72,23 @@ early if an issue that looks like a Linux kernel problem is actually caused by something else. These steps thus help to ensure the time you invest in this process won't feel wasted in the end: - * Stop reading this document and report the problem to your vendor instead, - unless you are running the latest mainline kernel already or are willing to - install it. This kernel must not be modified or enhanced in any way, and - thus be considered 'vanilla'. + * Are you facing an issue with a Linux kernel a hardware or software vendor + provided? Then in almost all cases you are better off to stop reading this + document and reporting the issue to your vendor instead, unless you are + willing to install the latest Linux version yourself. Be aware the latter + will often be needed anyway to hunt down and fix issues. + + * Perform a rough search for existing reports with your favorite internet + search engine; additionally, check the archives of the `Linux Kernel Mailing + List (LKML) <https://lore.kernel.org/lkml/>`_. If you find matching reports, + join the discussion instead of sending a new one. * See if the issue you are dealing with qualifies as regression, security issue, or a really severe problem: those are 'issues of high priority' that need special handling in some steps that are about to follow. - * Check if your kernel was 'tainted' when the issue occurred, as the event - that made the kernel set this flag might be causing the issue you face. - - * Locate the driver or kernel subsystem that seems to be causing the issue. - Find out how and where its developers expect reports. Note: most of the - time this won't be bugzilla.kernel.org, as issues typically need to be sent - by mail to a maintainer and a public mailing list. - - * Search the archives of the bug tracker or mailing list in question - thoroughly for reports that might match your issue. Also check if you find - something with your favorite internet search engine or in the Linux Kernel - Mailing List (LKML) archives. If you find anything, join the discussion - instead of sending a new report. + * Make sure it's not the kernel's surroundings that are causing the issue + you face. * Create a fresh backup and put system repair and restore tools at hand. @@ -123,8 +96,8 @@ process won't feel wasted in the end: kernel modules on-the-fly, which solutions like DKMS might be doing locally without your knowledge. - * Make sure it's not the kernel's surroundings that are causing the issue - you face. + * Check if your kernel was 'tainted' when the issue occurred, as the event + that made the kernel set this flag might be causing the issue you face. * Write down coarsely how to reproduce the issue. If you deal with multiple issues at once, create separate notes for each of them and make sure they @@ -132,20 +105,35 @@ process won't feel wasted in the end: needs to get reported to the kernel developers separately, unless they are strongly entangled. + * If you are facing a regression within a stable or longterm version line + (say something broke when updating from 5.10.4 to 5.10.5), scroll down to + 'Dealing with regressions within a stable and longterm kernel line'. + + * Locate the driver or kernel subsystem that seems to be causing the issue. + Find out how and where its developers expect reports. Note: most of the + time this won't be bugzilla.kernel.org, as issues typically need to be sent + by mail to a maintainer and a public mailing list. + + * Search the archives of the bug tracker or mailing list in question + thoroughly for reports that might match your issue. If you find anything, + join the discussion instead of sending a new report. + After these preparations you'll now enter the main part: - * Install the latest Linux mainline kernel: that's where all issues get - fixed first, because it's the version line the kernel developers mainly - care about. Testing and reporting with the latest Linux stable kernel can - be an acceptable alternative in some situations, for example during the - merge window; but during that period you might want to suspend your efforts - till its end anyway. + * Unless you are already running the latest 'mainline' Linux kernel, better + go and install it for the reporting process. Testing and reporting with + the latest 'stable' Linux can be an acceptable alternative in some + situations; during the merge window that actually might be even the best + approach, but in that development phase it can be an even better idea to + suspend your efforts for a few days anyway. Whatever version you choose, + ideally use a 'vanilla' build. Ignoring these advices will dramatically + increase the risk your report will be rejected or ignored. * Ensure the kernel you just installed does not 'taint' itself when running. * Reproduce the issue with the kernel you just installed. If it doesn't show - up there, head over to the instructions for issues only happening with + up there, scroll down to the instructions for issues only happening with stable and longterm kernels. * Optimize your notes: try to find and write the most straightforward way to @@ -154,8 +142,8 @@ After these preparations you'll now enter the main part: that hear about it for the first time. And if you learned something in this process, consider searching again for existing reports about the issue. - * If the failure includes a stack dump, like an Oops does, consider decoding - it to find the offending line of code. + * If your failure involves a 'panic', 'Oops', 'warning', or 'BUG', consider + decoding the kernel log to find the line of code that triggered the error. * If your problem is a regression, try to narrow down when the issue was introduced as much as possible. @@ -184,28 +172,54 @@ After these preparations you'll now enter the main part: help yourself, if you don't get any help or if it's unsatisfying. +Reporting regressions within a stable and longterm kernel line +-------------------------------------------------------------- + +This subsection is for you, if you followed above process and got sent here at +the point about regression within a stable or longterm kernel version line. You +face one of those if something breaks when updating from 5.10.4 to 5.10.5 (a +switch from 5.9.15 to 5.10.5 does not qualify). The developers want to fix such +regressions as quickly as possible, hence there is a streamlined process to +report them: + + * Check if the kernel developers still maintain the Linux kernel version + line you care about: go to the `front page of kernel.org + <https://kernel.org/>`_ and make sure it mentions + the latest release of the particular version line without an '[EOL]' tag. + + * Check the archives of the `Linux stable mailing list + <https://lore.kernel.org/stable/>`_ for existing reports. + + * Install the latest release from the particular version line as a vanilla + kernel. Ensure this kernel is not tainted and still shows the problem, as + the issue might have already been fixed there. If you first noticed the + problem with a vendor kernel, check a vanilla build of the last version + known to work performs fine as well. + + * Send a short problem report to the Linux stable mailing list + (stable@vger.kernel.org) and CC the Linux regressions mailing list + (regressions@lists.linux.dev). Roughly describe the issue and ideally + explain how to reproduce it. Mention the first version that shows the + problem and the last version that's working fine. Then wait for further + instructions. + +The reference section below explains each of these steps in more detail. + + Reporting issues only occurring in older kernel version lines ------------------------------------------------------------- -This section is for you, if you tried the latest mainline kernel as outlined +This subsection is for you, if you tried the latest mainline kernel as outlined above, but failed to reproduce your issue there; at the same time you want to -see the issue fixed in older version lines or a vendor kernel that's regularly -rebased on new stable or longterm releases. If that case follow these steps: +see the issue fixed in a still supported stable or longterm series or vendor +kernels regularly rebased on those. If that the case, follow these steps: * Prepare yourself for the possibility that going through the next few steps might not get the issue solved in older releases: the fix might be too big or risky to get backported there. - * Check if the kernel developers still maintain the Linux kernel version - line you care about: go to the front page of kernel.org and make sure it - mentions the latest release of the particular version line without an - '[EOL]' tag. - - * Check the archives of the Linux stable mailing list for existing reports. - - * Install the latest release from the particular version line as a vanilla - kernel. Ensure this kernel is not tainted and still shows the problem, as - the issue might have already been fixed there. + * Perform the first three steps in the section "Dealing with regressions + within a stable and longterm kernel line" above. * Search the Linux kernel version control system for the change that fixed the issue in mainline, as its commit message might tell you if the fix is @@ -215,22 +229,13 @@ rebased on new stable or longterm releases. If that case follow these steps: deemed unsuitable for backporting. If backporting was not considered at all, join the newest discussion, asking if it's in the cards. - * Check if you're dealing with a regression that was never present in - mainline by installing the first release of the version line you care - about. If the issue doesn't show up with it, you basically need to report - the issue with this version like you would report a problem with mainline - (see above). This ideally includes a bisection followed by a search for - existing reports on the net; with the help of the subject and the two - relevant commit-ids. If that doesn't turn up anything, write the report; CC - or forward the report to the stable maintainers, the stable mailing list, - and those who authored the change. Include the shortened commit-id if you - found the change that causes it. - * One of the former steps should lead to a solution. If that doesn't work out, ask the maintainers for the subsystem that seems to be causing the issue for advice; CC the mailing list for the particular subsystem as well as the stable mailing list. +The reference section below explains each of these steps in more detail. + Reference section: Reporting issues to the kernel maintainers ============================================================= @@ -276,54 +281,103 @@ issues to the Linux kernel developers. Make sure you're using the upstream Linux kernel ------------------------------------------------ - *Stop reading this document and report the problem to your vendor instead, - unless you are running the latest mainline kernel already or are willing to - install it. This kernel must not be modified or enhanced in any way, and - thus be considered 'vanilla'.* + *Are you facing an issue with a Linux kernel a hardware or software vendor + provided? Then in almost all cases you are better off to stop reading this + document and reporting the issue to your vendor instead, unless you are + willing to install the latest Linux version yourself. Be aware the latter + will often be needed anyway to hunt down and fix issues.* Like most programmers, Linux kernel developers don't like to spend time dealing -with reports for issues that don't even happen with the source code they -maintain: it's just a waste everybody's time, yours included. That's why you -later will have to test your issue with the latest 'vanilla' kernel: a kernel -that was build using the Linux sources taken straight from `kernel.org -<https://kernel.org/>`_ and not modified or enhanced in any way. - -Almost all kernels used in devices (Computers, Laptops, Smartphones, Routers, -…) and most kernels shipped by Linux distributors are ancient from the point of -kernel development and heavily modified. They thus do not qualify for reporting -an issue to the Linux kernel developers: the issue you face with such a kernel -might be fixed already or caused by the changes or additions, even if they look -small or totally unrelated. That's why issues with such kernels need to be -reported to the vendor that distributed it. Its developers should look into the +with reports for issues that don't even happen with their current code. It's +just a waste everybody's time, especially yours. Unfortunately such situations +easily happen when it comes to the kernel and often leads to frustration on both +sides. That's because almost all Linux-based kernels pre-installed on devices +(Computers, Laptops, Smartphones, Routers, …) and most shipped by Linux +distributors are quite distant from the official Linux kernel as distributed by +kernel.org: these kernels from these vendors are often ancient from the point of +Linux development or heavily modified, often both. + +Most of these vendor kernels are quite unsuitable for reporting issues to the +Linux kernel developers: an issue you face with one of them might have been +fixed by the Linux kernel developers months or years ago already; additionally, +the modifications and enhancements by the vendor might be causing the issue you +face, even if they look small or totally unrelated. That's why you should report +issues with these kernels to the vendor. Its developers should look into the report and, in case it turns out to be an upstream issue, fix it directly -upstream or report it there. In practice that sometimes does not work out. If -that the case, you might want to circumvent the vendor by installing the latest -mainline kernel yourself and reporting the issue as outlined in this document; -just make sure to use really fresh kernel (see below). - - -.. note:: - - FIXME: Should we accept reports for issues with kernel images that are pretty - close to vanilla? But when are they close enough and how to put that line in - words? Maybe something like this? +upstream or forward the report there. In practice that often does not work out +or might not what you want. You thus might want to consider circumventing the +vendor by installing the very latest Linux kernel core yourself. If that's an +option for you move ahead in this process, as a later step in this guide will +explain how to do that once it rules out other potential causes for your issue. + +Note, the previous paragraph is starting with the word 'most', as sometimes +developers in fact are willing to handle reports about issues occurring with +vendor kernels. If they do in the end highly depends on the developers and the +issue in question. Your chances are quite good if the distributor applied only +small modifications to a kernel based on a recent Linux version; that for +example often holds true for the mainline kernels shipped by Debian GNU/Linux +Sid or Fedora Rawhide. Some developers will also accept reports about issues +with kernels from distributions shipping the latest stable kernel, as long as +its only slightly modified; that for example is often the case for Arch Linux, +regular Fedora releases, and openSUSE Tumbleweed. But keep in mind, you better +want to use a mainline Linux and avoid using a stable kernel for this +process, as outlined in the section 'Install a fresh kernel for testing' in more +detail. + +Obviously you are free to ignore all this advice and report problems with an old +or heavily modified vendor kernel to the upstream Linux developers. But note, +those often get rejected or ignored, so consider yourself warned. But it's still +better than not reporting the issue at all: sometimes such reports directly or +indirectly will help to get the issue fixed over time. + + +Search for existing reports, first run +-------------------------------------- + + *Perform a rough search for existing reports with your favorite internet + search engine; additionally, check the archives of the Linux Kernel Mailing + List (LKML). If you find matching reports, join the discussion instead of + sending a new one.* + +Reporting an issue that someone else already brought forward is often a waste of +time for everyone involved, especially you as the reporter. So it's in your own +interest to thoroughly check if somebody reported the issue already. At this +step of the process it's okay to just perform a rough search: a later step will +tell you to perform a more detailed search once you know where your issue needs +to be reported to. Nevertheless, do not hurry with this step of the reporting +process, it can save you time and trouble. + +Simply search the internet with your favorite search engine first. Afterwards, +search the `Linux Kernel Mailing List (LKML) archives +<https://lore.kernel.org/lkml/>`_. - *Note: Some Linux kernel developers accept reports from vendor kernels that - are known to be close to upstream. That for example is often the case for - the kernels that Debian GNU/Linux Sid or Fedora Rawhide ship, which are - normally following mainline closely and carry only a few patches. So a - report with one of these might be accepted by the developers that need to - handle it. But if they do, depends heavily on the individual developers and - the issue at hand. That's why installing a mainline vanilla kernel is the - safe bet.* +If you get flooded with results consider telling your search engine to limit +search timeframe to the past month or year. And wherever you search, make sure +to use good search terms; vary them a few times, too. While doing so try to +look at the issue from the perspective of someone else: that will help you to +come up with other words to use as search terms. Also make sure not to use too +many search terms at once. Remember to search with and without information like +the name of the kernel driver or the name of the affected hardware component. +But its exact brand name (say 'ASUS Red Devil Radeon RX 5700 XT Gaming OC') +often is not much helpful, as it is too specific. Instead try search terms like +the model line (Radeon 5700 or Radeon 5000) and the code name of the main chip +('Navi' or 'Navi10') with and without its manufacturer ('AMD'). - *Arch Linux, other Fedora releases, and openSUSE Tumbleweed often use quite - recent stable kernels that are pretty close to upstream, too. Some - developers accept bugs from them as well. But note that you normally should - avoid stable kernels for reporting issues and use a mainline kernel instead - (see below).* +In case you find an existing report about your issue, join the discussion, as +you might be able to provide valuable additional information. That can be +important even when a fix is prepared or in its final stages already, as +developers might look for people that can provide additional information or +test a proposed fix. Jump to the section 'Duties after the report went out' for +details on how to get properly involved. - Are there any other major Linux distributions that should be mentioned here? +Note, searching `bugzilla.kernel.org <https://bugzilla.kernel.org/>`_ might also +be a good idea, as that might provide valuable insights or turn up matching +reports. If you find the latter, just keep in mind: most subsystems expect +reports in different places, as described below in the section "Check where you +need to report your issue". The developers that should take care of the issue +thus might not even be aware of the bugzilla ticket. Hence, check the ticket if +the issue already got reported as outlined in this document and if not consider +doing so. Issue of high priority? @@ -365,6 +419,75 @@ fatal error where the kernel stop itself) with a 'Oops' (a recoverable error), as the kernel remains running after the latter. +Ensure a healthy environment +---------------------------- + + *Make sure it's not the kernel's surroundings that are causing the issue + you face.* + +Problems that look a lot like a kernel issue are sometimes caused by build or +runtime environment. It's hard to rule out that problem completely, but you +should minimize it: + + * Use proven tools when building your kernel, as bugs in the compiler or the + binutils can cause the resulting kernel to misbehave. + + * Ensure your computer components run within their design specifications; + that's especially important for the main processor, the main memory, and the + motherboard. Therefore, stop undervolting or overclocking when facing a + potential kernel issue. + + * Try to make sure it's not faulty hardware that is causing your issue. Bad + main memory for example can result in a multitude of issues that will + manifest itself in problems looking like kernel issues. + + * If you're dealing with a filesystem issue, you might want to check the file + system in question with ``fsck``, as it might be damaged in a way that leads + to unexpected kernel behavior. + + * When dealing with a regression, make sure it's not something else that + changed in parallel to updating the kernel. The problem for example might be + caused by other software that was updated at the same time. It can also + happen that a hardware component coincidentally just broke when you rebooted + into a new kernel for the first time. Updating the systems BIOS or changing + something in the BIOS Setup can also lead to problems that on look a lot + like a kernel regression. + + +Prepare for emergencies +----------------------- + + *Create a fresh backup and put system repair and restore tools at hand.* + +Reminder, you are dealing with computers, which sometimes do unexpected things, +especially if you fiddle with crucial parts like the kernel of its operating +system. That's what you are about to do in this process. Thus, make sure to +create a fresh backup; also ensure you have all tools at hand to repair or +reinstall the operating system as well as everything you need to restore the +backup. + + +Make sure your kernel doesn't get enhanced +------------------------------------------ + + *Ensure your system does not enhance its kernels by building additional + kernel modules on-the-fly, which solutions like DKMS might be doing locally + without your knowledge.* + +The risk your issue report gets ignored or rejected dramatically increases if +your kernel gets enhanced in any way. That's why you should remove or disable +mechanisms like akmods and DKMS: those build add-on kernel modules +automatically, for example when you install a new Linux kernel or boot it for +the first time. Also remove any modules they might have installed. Then reboot +before proceeding. + +Note, you might not be aware that your system is using one of these solutions: +they often get set up silently when you install Nvidia's proprietary graphics +driver, VirtualBox, or other software that requires a some support from a +module not part of the Linux kernel. That why your might need to uninstall the +packages with such software to get rid of any 3rd party kernel module. + + Check 'taint' flag ------------------ @@ -433,9 +556,52 @@ three things: the name of the module in question). -Locate kernel area that causes the issue +Document how to reproduce issue +------------------------------- + + *Write down coarsely how to reproduce the issue. If you deal with multiple + issues at once, create separate notes for each of them and make sure they + work independently on a freshly booted system. That's needed, as each issue + needs to get reported to the kernel developers separately, unless they are + strongly entangled.* + +If you deal with multiple issues at once, you'll have to report each of them +separately, as they might be handled by different developers. Describing +various issues in one report also makes it quite difficult for others to tear +it apart. Hence, only combine issues in one report if they are very strongly +entangled. + +Additionally, during the reporting process you will have to test if the issue +happens with other kernel versions. Therefore, it will make your work easier if +you know exactly how to reproduce an issue quickly on a freshly booted system. + +Note: it's often fruitless to report issues that only happened once, as they +might be caused by a bit flip due to cosmic radiation. That's why you should +try to rule that out by reproducing the issue before going further. Feel free +to ignore this advice if you are experienced enough to tell a one-time error +due to faulty hardware apart from a kernel issue that rarely happens and thus +is hard to reproduce. + + +Regression in stable or longterm kernel? ---------------------------------------- + *If you are facing a regression within a stable or longterm version line + (say something broke when updating from 5.10.4 to 5.10.5), scroll down to + 'Dealing with regressions within a stable and longterm kernel line'.* + +Regression within a stable and longterm kernel version line are something the +Linux developers want to fix badly, as such issues are even more unwanted than +regression in the main development branch, as they can quickly affect a lot of +people. The developers thus want to learn about such issues as quickly as +possible, hence there is a streamlined process to report them. Note, +regressions with newer kernel version line (say something broke when switching +from 5.9.15 to 5.10.5) do not qualify. + + +Check where you need to report your issue +----------------------------------------- + *Locate the driver or kernel subsystem that seems to be causing the issue. Find out how and where its developers expect reports. Note: most of the time this won't be bugzilla.kernel.org, as issues typically need to be sent @@ -526,26 +692,6 @@ example above does not have such a line. That is the case for most sections, as Linux kernel development is completely driven by mail. Very few subsystems use a bug tracker, and only some of those rely on bugzilla.kernel.org. - -.. note:: - - FIXME: The old text took a totally different approach to bugzilla.kernel.org, - as it mentions it as the place to file issue for people that don't known how - to contact the appropriate people. The new one mentions it rarely; and when - it does like here, it warns users that it's often the wrong place to go. - - This approach was chosen as the main author of this document noticed quite a - few users (or even a lot?) get no reply to the bugs they file in bugzilla. - That's kind of expected, as quite a few (many? most?) of the maintainers - don't even get notified when reports for their subsystem get filed there. And - not getting a single reply to report is something that is just annoying for - users and might make them angry. Improving bugzilla.k.o would be an option, - but on the kernel and maintainers summit 2017 it was agreed on to first go - this route (sorry it took so long): it's easier to achieve and less - controversial, as putting additional burden on already overworked maintainers - is unlikely to get well received. - - In this and many other cases you thus have to look for lines starting with 'Mail:' instead. Those mention the name and the email addresses for the maintainers of the particular code. Also look for a line starting with 'Mailing @@ -558,21 +704,6 @@ and might leave some work for other developers on the subsystem specific list; and LKML is important to have one place where all issue reports can be found. -.. note:: - - FIXME: Above section tells users to always CC LKML. These days it's a kind of - "catch-all" list anyway, which nearly nobody seems to follow closely. So it - seems appropriate to go "all in" and make people send their reports here, - too, as everything (reports, fixes, ...) then can be found in one place (at - least for all reports sent by mail and all subsystems that CC LKML). - - Related: Should we create mailing list like 'linux-issues@vger.kernel.org' - and tell users above to always CC it when reporting issues? Then there would - be one central place reporters could search for existing reports (at least - for issues reported by mail) without getting regular LKML traffic mixed into - the results. - - Finding the maintainers with the help of a script ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -611,205 +742,87 @@ modified during tree-wide cleanups by developers that do not care about the particular driver at all. -Search for existing reports ---------------------------- +Search for existing reports, second run +--------------------------------------- *Search the archives of the bug tracker or mailing list in question - thoroughly for reports that might match your issue. Also check if you find - something with your favorite internet search engine or in the Linux Kernel - Mailing List (LKML) archives. If you find anything, join the discussion - instead of sending a new report.* - -Reporting an issue that someone else already brought forward is often a waste -of time for everyone involved, especially you as the reporter. So it's in your -own interest to thoroughly check if somebody reported the issue already. Thus -do not hurry with this step of the reporting process. Spending 30 to 60 minutes -or even more time can save you and others quite a lot of time and trouble. - -The best place to search is the bug tracker or the mailing list where your -report needs to be filed. You'll find quite a few of those lists on -`lore.kernel.org <https://lore.kernel.org/>`_, but some are hosted in -different places. That for example is the case for the ath10k WiFi driver used -as example in the previous step. But you'll often find the archives for these -lists easily on the net. Searching for 'archive ath10k@lists.infradead.org' for -example will quickly lead you to the `Info page for the ath10k mailing list -<https://lists.infradead.org/mailman/listinfo/ath10k>`_, which at the top links -to its `list archives <https://lists.infradead.org/pipermail/ath10k/>`_. - -Sadly this and quite a few other lists miss a way to search the archives. In -those cases use a regular internet search engine and add something like + thoroughly for reports that might match your issue. If you find anything, + join the discussion instead of sending a new report.* + +As mentioned earlier already: reporting an issue that someone else already +brought forward is often a waste of time for everyone involved, especially you +as the reporter. That's why you should search for existing report again, now +that you know where they need to be reported to. If it's mailing list, you will +often find its archives on `lore.kernel.org <https://lore.kernel.org/>`_. + +But some list are hosted in different places. That for example is the case for +the ath10k WiFi driver used as example in the previous step. But you'll often +find the archives for these lists easily on the net. Searching for 'archive +ath10k@lists.infradead.org' for example will lead you to the `Info page for the +ath10k mailing list <https://lists.infradead.org/mailman/listinfo/ath10k>`_, +which at the top links to its +`list archives <https://lists.infradead.org/pipermail/ath10k/>`_. Sadly this and +quite a few other lists miss a way to search the archives. In those cases use a +regular internet search engine and add something like 'site:lists.infradead.org/pipermail/ath10k/' to your search terms, which limits the results to the archives at that URL. -Additionally, search the internet and the `Linux Kernel Mailing List (LKML) -archives <https://lore.kernel.org/lkml/>`_, as maybe the real culprit might be -in some other subsystem. Searching in `bugzilla.kernel.org -<https://bugzilla.kernel.org/>`_ might also be a good idea, but if you find -anything there keep in mind: most subsystems expect reports in different -places, hence those you find there might have not even reached the people -responsible for the subsystem in question. Nevertheless, the data there might -provide valuable insights. - -If you get flooded with results consider telling your search engine to limit -search timeframe to the past month or year. And wherever you search, make sure -to use good search terms; vary them a few times, too. While doing so try to -look at the issue from the perspective of someone else: that will help you to -come up with other words to use as search terms. Also make sure not to use too -many search terms at once. Remember to search with and without information like -the name of the kernel driver or the name of the affected hardware component. -But its exact brand name (say 'ASUS Red Devil Radeon RX 5700 XT Gaming OC') -often is not much helpful, as it is too specific. Instead try search terms like -the model line (Radeon 5700 or Radeon 5000) and the code name of the main chip -('Navi' or 'Navi10') with and without its manufacturer ('AMD'). - -In case you find an existing report about your issue, join the discussion, as -you might be able to provide valuable additional information. That can be -important even when a fix is prepared or in its final stages already, as -developers might look for people that can provide additional information or -test a proposed fix. Jump to the section 'Duties after the report went out' for -details on how to get properly involved. - - -Prepare for emergencies ------------------------ - - *Create a fresh backup and put system repair and restore tools at hand.* - -Reminder, you are dealing with computers, which sometimes do unexpected things, -especially if you fiddle with crucial parts like the kernel of its operating -system. That's what you are about to do in this process. Thus, make sure to -create a fresh backup; also ensure you have all tools at hand to repair or -reinstall the operating system as well as everything you need to restore the -backup. - - -Make sure your kernel doesn't get enhanced ------------------------------------------- - - *Ensure your system does not enhance its kernels by building additional - kernel modules on-the-fly, which solutions like DKMS might be doing locally - without your knowledge.* - -Your kernel must be 'vanilla' when reporting an issue, but stops being pure as -soon as it loads a kernel module not built from the sources used to compile the -kernel image itself. That's why you need to ensure your Linux kernel stays -vanilla by removing or disabling mechanisms like akmods and DKMS: those might -build additional kernel modules automatically, for example when your boot into -a newly installed Linux kernel the first time. Reboot after removing them and -any modules they installed. - -Note, you might not be aware that your system is using one of these solutions: -they often get set up silently when you install Nvidia's proprietary graphics -driver, VirtualBox, or other software that requires a some support from a -module not part of the Linux kernel. That why your might need to uninstall the -packages with such software to get rid of any 3rd party kernel module. - - -Ensure a healthy environment ----------------------------- - - *Make sure it's not the kernel's surroundings that are causing the issue - you face.* - -Problems that look a lot like a kernel issue are sometimes caused by build or -runtime environment. It's hard to rule out that problem completely, but you -should minimize it: - - * Use proven tools when building your kernel, as bugs in the compiler or the - binutils can cause the resulting kernel to misbehave. - - * Ensure your computer components run within their design specifications; - that's especially important for the main processor, the main memory, and the - motherboard. Therefore, stop undervolting or overclocking when facing a - potential kernel issue. - - * Try to make sure it's not faulty hardware that is causing your issue. Bad - main memory for example can result in a multitude of issues that will - manifest itself in problems looking like kernel issues. - - * If you're dealing with a filesystem issue, you might want to check the file - system in question with ``fsck``, as it might be damaged in a way that leads - to unexpected kernel behavior. - - * When dealing with a regression, make sure it's not something else that - changed in parallel to updating the kernel. The problem for example might be - caused by other software that was updated at the same time. It can also - happen that a hardware component coincidentally just broke when you rebooted - into a new kernel for the first time. Updating the systems BIOS or changing - something in the BIOS Setup can also lead to problems that on look a lot - like a kernel regression. - +It's also wise to check the internet, LKML and maybe bugzilla.kernel.org again +at this point. -Document how to reproduce issue -------------------------------- +For details how to search and what to do if you find matching reports see +"Search for existing reports, first run" above. - *Write down coarsely how to reproduce the issue. If you deal with multiple - issues at once, create separate notes for each of them and make sure they - work independently on a freshly booted system. That's needed, as each issue - needs to get reported to the kernel developers separately, unless they are - strongly entangled.* - -If you deal with multiple issues at once, you'll have to report each of them -separately, as they might be handled by different developers. Describing -various issues in one report also makes it quite difficult for others to tear -it apart. Hence, only combine issues in one report if they are very strongly -entangled. - -Additionally, during the reporting process you will have to test if the issue -happens with other kernel versions. Therefore, it will make your work easier if -you know exactly how to reproduce an issue quickly on a freshly booted system. - -Note: it's often fruitless to report issues that only happened once, as they -might be caused by a bit flip due to cosmic radiation. That's why you should -try to rule that out by reproducing the issue before going further. Feel free -to ignore this advice if you are experienced enough to tell a one-time error -due to faulty hardware apart from a kernel issue that rarely happens and thus -is hard to reproduce. +Do not hurry with this step of the reporting process: spending 30 to 60 minutes +or even more time can save you and others quite a lot of time and trouble. Install a fresh kernel for testing ---------------------------------- - *Install the latest Linux mainline kernel: that's where all issues get - fixed first, because it's the version line the kernel developers mainly - care about. Testing and reporting with the latest Linux stable kernel can - be an acceptable alternative in some situations, for example during the - merge window; but during that period you might want to suspend your efforts - till its end anyway.* - -Reporting an issue to the Linux kernel developers they fixed weeks or months -ago is annoying for them and wasting their and your time. That's why it's in -everybody's interest to check if the issue occurs with the latest codebase -before reporting it. - -In the scope of the Linux kernel the term 'latest' means: a kernel version -recently created from the main line of development, as this 'mainline' tree is -where developers first apply fixes; only after that are they are allowed to get -backported to older, still supported version lines called 'stable' and -'longterm' kernels. That's why you should check a recent mainline kernel, even -if you deal with an issue you only want to see fixed in an older version line. -Another reason: some fixes are only applied to mainline or recent version -lines, as it's too hard or risky to backport them to older versions. If that -the case, reporting the issue again is unlikely to change anything. - -Longterm kernels (sometimes called "LTS kernels") are therefore unsuitable for -testing; they simply are too distant from current development. Even the latest -Linux 'stable' kernel is a significant bit behind and thus better avoided. At -least most of the time, as sometimes a stable kernel can the best choice; but -in those situations you might want to wait a few days anyway: - -Choosing between mainline, stable and waiting -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Head over to `kernel.org <https://kernel.org/>`_ to decide which version to -use. Ignore the big yellow button that says 'Latest release' and look a little -lower for a table. At its top you'll see a line starting with 'mainline', which -most of the time will point to a pre-release with a version number like -'5.8-rc2'. If that's the case, you'll want to use this mainline kernel for -testing. Do not let that 'rc' scare you, these 'development kernels' are pretty -reliable — and you made a backup, as you were instructed above, didn't you? - -In about two out of every nine to ten weeks, 'mainline' might point you to a + *Unless you are already running the latest 'mainline' Linux kernel, better + go and install it for the reporting process. Testing and reporting with + the latest 'stable' Linux can be an acceptable alternative in some + situations; during the merge window that actually might be even the best + approach, but in that development phase it can be an even better idea to + suspend your efforts for a few days anyway. Whatever version you choose, + ideally use a 'vanilla' built. Ignoring these advices will dramatically + increase the risk your report will be rejected or ignored.* + +As mentioned in the detailed explanation for the first step already: Like most +programmers, Linux kernel developers don't like to spend time dealing with +reports for issues that don't even happen with the current code. It's just a +waste everybody's time, especially yours. That's why it's in everybody's +interest that you confirm the issue still exists with the latest upstream code +before reporting it. You are free to ignore this advice, but as outlined +earlier: doing so dramatically increases the risk that your issue report might +get rejected or simply ignored. + +In the scope of the kernel "latest upstream" normally means: + + * Install a mainline kernel; the latest stable kernel can be an option, but + most of the time is better avoided. Longterm kernels (sometimes called 'LTS + kernels') are unsuitable at this point of the process. The next subsection + explains all of this in more detail. + + * The over next subsection describes way to obtain and install such a kernel. + It also outlines that using a pre-compiled kernel are fine, but better are + vanilla, which means: it was built using Linux sources taken straight `from + kernel.org <https://kernel.org/>`_ and not modified or enhanced in any way. + +Choosing the right version for testing +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Head over to `kernel.org <https://kernel.org/>`_ to find out which version you +want to use for testing. Ignore the big yellow button that says 'Latest release' +and look a little lower at the table. At its top you'll see a line starting with +mainline, which most of the time will point to a pre-release with a version +number like '5.8-rc2'. If that's the case, you'll want to use this mainline +kernel for testing, as that where all fixes have to be applied first. Do not let +that 'rc' scare you, these 'development kernels' are pretty reliable — and you +made a backup, as you were instructed above, didn't you? + +In about two out of every nine to ten weeks, mainline might point you to a proper release with a version number like '5.7'. If that happens, consider suspending the reporting process until the first pre-release of the next version (5.8-rc1) shows up on kernel.org. That's because the Linux development @@ -830,45 +843,79 @@ case mainline for some reason does currently not work for you. An in general: using it for reproducing the issue is also better than not reporting it issue at all. +Better avoid using the latest stable kernel outside merge windows, as all fixes +must be applied to mainline first. That's why checking the latest mainline +kernel is so important: any issue you want to see fixed in older version lines +needs to be fixed in mainline first before it can get backported, which can +take a few days or weeks. Another reason: the fix you hope for might be too +hard or risky for backporting; reporting the issue again hence is unlikely to +change anything. + +These aspects are also why longterm kernels (sometimes called "LTS kernels") +are unsuitable for this part of the reporting process: they are to distant from +the current code. Hence go and test mainline first and follow the process +further: if the issue doesn't occur with mainline it will guide you how to get +it fixed in older version lines, if that's in the cards for the fix in question. + How to obtain a fresh Linux kernel ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -You can use pre-built or self-compiled kernel for testing; if you choose the -latter approach, you can either obtain the source code using git or download it -as tar archive. - -Using a pre-compiled kernel for testing is often the quickest, easiest, and -safest way – especially is you are unfamiliar with the Linux kernel. But it -needs to be a vanilla kernel, which can be hard to come buy. You are in luck if -you are using a popular Linux distribution: for quite a few of them you'll find -repositories on the net that contain packages with the latest mainline or -stable kernels in vanilla fashion. It's totally okay to use these, just make -sure from the repository's documentation they are really vanilla. And ensure -the packages contain the latest versions as offered on kernel.org; they are -likely unsuitable if the package is older than a week, as new mainline and -stable kernels typically get released at least once a week. And be aware that -you might need to get build your own kernel later anyway when it comes to -helping test fixes, as described later in this document. - -Developers and experienced Linux users familiar with git are often best served -by obtaining the latest Linux kernel sources straight from the `official -development repository on kernel.org +**Using a pre-compiled kernel**: This is often the quickest, easiest, and safest +way for testing — especially is you are unfamiliar with the Linux kernel. The +problem: most of those shipped by distributors or add-on repositories are build +from modified Linux sources. They are thus not vanilla and therefore often +unsuitable for testing and issue reporting: the changes might cause the issue +you face or influence it somehow. + +But you are in luck if you are using a popular Linux distribution: for quite a +few of them you'll find repositories on the net that contain packages with the +latest mainline or stable Linux built as vanilla kernel. It's totally okay to +use these, just make sure from the repository's description they are vanilla or +at least close to it. Additionally ensure the packages contain the latest +versions as offered on kernel.org. The packages are likely unsuitable if they +are older than a week, as new mainline and stable kernels typically get released +at least once a week. + +Please note that you might need to build your own kernel manually later: that's +sometimes needed for debugging or testing fixes, as described later in this +document. Also be aware that pre-compiled kernels might lack debug symbols that +are needed to decode messages the kernel prints when a panic, Oops, warning, or +BUG occurs; if you plan to decode those, you might be better off compiling a +kernel yourself (see the end of this subsection and the section titled 'Decode +failure messages' for details). + +**Using git**: Developers and experienced Linux users familiar with git are +often best served by obtaining the latest Linux kernel sources straight from the +`official development repository on kernel.org <https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/>`_. Those are likely a bit ahead of the latest mainline pre-release. Don't worry about it: they are as reliable as a proper pre-release, unless the kernel's development cycle is currently in the middle of a merge window. But even then they are quite reliable. -People unfamiliar with git are often best served by downloading the sources as -tarball from `kernel.org <https://kernel.org/>`_. +**Conventional**: People unfamiliar with git are often best served by +downloading the sources as tarball from `kernel.org <https://kernel.org/>`_. -How to actually build a kernel isnot described here, as many websites explain +How to actually build a kernel is not described here, as many websites explain the necessary steps already. If you are new to it, consider following one of those how-to's that suggest to use ``make localmodconfig``, as that tries to pick up the configuration of your current kernel and then tries to adjust it somewhat for your system. That does not make the resulting kernel any better, but quicker to compile. +Note: If you are dealing with a panic, Oops, warning, or BUG from the kernel, +please try to enable CONFIG_KALLSYMS when configuring your kernel. +Additionally, enable CONFIG_DEBUG_KERNEL and CONFIG_DEBUG_INFO, too; the +latter is the relevant one of those two, but can only be reached if you enable +the former. Be aware CONFIG_DEBUG_INFO increases the storage space required to +build a kernel by quite a bit. But that's worth it, as these options will allow +you later to pinpoint the exact line of code that triggers your issue. The +section 'Decode failure messages' below explains this in more detail. + +But keep in mind: Always keep a record of the issue encountered in case it is +hard to reproduce. Sending an undecoded report is better than not reporting +the issue at all. + Check 'taint' flag ------------------ @@ -888,7 +935,7 @@ Reproduce issue with the fresh kernel ------------------------------------- *Reproduce the issue with the kernel you just installed. If it doesn't show - up there, head over to the instructions for issues only happening with + up there, scroll down to the instructions for issues only happening with stable and longterm kernels.* Check if the issue occurs with the fresh Linux kernel version you just @@ -923,31 +970,55 @@ instead you can join. Decode failure messages ----------------------- -.. note:: + *If your failure involves a 'panic', 'Oops', 'warning', or 'BUG', consider + decoding the kernel log to find the line of code that triggered the error.* - FIXME: The text in this section is a placeholder for now and quite similar to - the old text found in 'Documentation/admin-guide/reporting-bugs.rst' - currently. It and the document it references are known to be outdated and - thus need to be revisited. Thus consider this note a request for help: if you - are familiar with this topic, please write a few lines that would fit here. - Alternatively, simply outline the current situation roughly to the main - authors of this document (see intro), as they might be able to write - something then. +When the kernel detects an internal problem, it will log some information about +the executed code. This makes it possible to pinpoint the exact line in the +source code that triggered the issue and shows how it was called. But that only +works if you enabled CONFIG_DEBUG_INFO and CONFIG_KALLSYMS when configuring +your kernel. If you did so, consider to decode the information from the +kernel's log. That will make it a lot easier to understand what lead to the +'panic', 'Oops', 'warning', or 'BUG', which increases the chances that someone +can provide a fix. - This section in the end should answer questions like "when is this actually - needed", "what .config options to ideally set earlier to make this step easy - or unnecessary?" (likely CONFIG_UNWINDER_ORC when it's available, otherwise - CONFIG_UNWINDER_FRAME_POINTER; but is there anything else needed?). +Decoding can be done with a script you find in the Linux source tree. If you +are running a kernel you compiled yourself earlier, call it like this:: -.. + [user@something ~]$ sudo dmesg | ./linux-5.10.5/scripts/decode_stacktrace.sh ./linux-5.10.5/vmlinux + +If you are running a packaged vanilla kernel, you will likely have to install +the corresponding packages with debug symbols. Then call the script (which you +might need to get from the Linux sources if your distro does not package it) +like this:: + + [user@something ~]$ sudo dmesg | ./linux-5.10.5/scripts/decode_stacktrace.sh \ + /usr/lib/debug/lib/modules/5.10.10-4.1.x86_64/vmlinux /usr/src/kernels/5.10.10-4.1.x86_64/ + +The script will work on log lines like the following, which show the address of +the code the kernel was executing when the error occurred:: + + [ 68.387301] RIP: 0010:test_module_init+0x5/0xffa [test_module] + +Once decoded, these lines will look like this:: - *If the failure includes a stack dump, like an Oops does, consider decoding - it to find the offending line of code.* + [ 68.387301] RIP: 0010:test_module_init (/home/username/linux-5.10.5/test-module/test-module.c:16) test_module -When the kernel detects an error, it will print a stack dump that allows to -identify the exact line of code where the issue happens. But that information -sometimes needs to get decoded to be readable, which is explained in -admin-guide/bug-hunting.rst. +In this case the executed code was built from the file +'~/linux-5.10.5/test-module/test-module.c' and the error occurred by the +instructions found in line '16'. + +The script will similarly decode the addresses mentioned in the section +starting with 'Call trace', which show the path to the function where the +problem occurred. Additionally, the script will show the assembler output for +the code section the kernel was executing. + +Note, if you can't get this to work, simply skip this step and mention the +reason for it in the report. If you're lucky, it might not be needed. And if it +is, someone might help you to get things going. Also be aware this is just one +of several ways to decode kernel stack traces. Sometimes different steps will +be required to retrieve the relevant details. Don't worry about that, if that's +needed in your case, developers will tell you what to do. Special care for regressions @@ -1000,8 +1071,7 @@ In the whole process keep in mind: an issue only qualifies as regression if the older and the newer kernel got built with a similar configuration. The best way to archive this: copy the configuration file (``.config``) from the old working kernel freshly to each newer kernel version you try. Afterwards run ``make -oldnoconfig`` to adjust it for the needs of the new version without enabling -any new feature, as those are allowed to cause regressions. +olddefconfig`` to adjust it for the needs of the new version. Write and send the report @@ -1166,17 +1236,26 @@ Special handling for high priority issues Reports for high priority issues need special handling. -**Severe bugs**: make sure the subject or ticket title as well as the first +**Severe issues**: make sure the subject or ticket title as well as the first paragraph makes the severeness obvious. -**Regressions**: If the issue is a regression add [REGRESSION] to the mail's -subject or the title in the bug-tracker. If you did not perform a bisection -mention at least the latest mainline version you tested that worked fine (say -5.7) and the oldest where the issue occurs (say 5.8). If you did a successful -bisection mention the commit id and subject of the change that causes the -regression. Also make sure to add the author of that change to your report; if -you need to file your bug in a bug-tracker forward the report to him in a -private mail and mention where your filed it. +**Regressions**: make the report's subject start with '[REGRESSION]'. + +In case you performed a successful bisection, use the title of the change that +introduced the regression as the second part of your subject. Make the report +also mention the commit id of the culprit. In case of an unsuccessful bisection, +make your report mention the latest tested version that's working fine (say 5.7) +and the oldest where the issue occurs (say 5.8-rc1). + +When sending the report by mail, CC the Linux regressions mailing list +(regressions@lists.linux.dev). In case the report needs to be filed to some web +tracker, proceed to do so; once filed, forward the report by mail to the +regressions list. Make sure to inline the forwarded report, hence do not attach +it. Also add a short note at the top where you mention the URL to the ticket. + +When mailing or forwarding the report, in case of a successful bisection add the +author of the culprit to the recipients; also CC everyone in the signed-off-by +chain, which you find at the end of its commit message. **Security issues**: for these issues your will have to evaluate if a short-term risk to other users would arise if details were publicly disclosed. @@ -1255,7 +1334,7 @@ you never have heard of yet; or you might be asked to apply a patch to the Linux kernel sources to test if it helps. In some cases it will be fine sending a reply asking for instructions how to do that. But before going that route try to find the answer own your own by searching the internet; alternatively -consider asking in other places for advice. For example ask a fried or post +consider asking in other places for advice. For example ask a friend or post about it to a chatroom or forum you normally hang out. **Be patient**: If you are really lucky you might get a reply to your report @@ -1390,32 +1469,11 @@ easier. And with a bit of luck there might be someone in the team that knows a bit about programming and might be able to write a fix. -Details about reporting issues only occurring in older kernel version lines ---------------------------------------------------------------------------- +Reference for "Reporting regressions within a stable and longterm kernel line" +------------------------------------------------------------------------------ -This subsection provides details for steps you need to take if you could not -reproduce your issue with a mainline kernel, but want to see it fixed in older -version lines (aka stable and longterm kernels). - -Some fixes are too complex -~~~~~~~~~~~~~~~~~~~~~~~~~~ - - *Prepare yourself for the possibility that going through the next few steps - might not get the issue solved in older releases: the fix might be too big - or risky to get backported there.* - -Even small and seemingly obvious code-changes sometimes introduce new and -totally unexpected problems. The maintainers of the stable and longterm kernels -are very aware of that and thus only apply changes to these kernels that are -within rules outlined in 'Documentation/process/stable-kernel-rules.rst'. - -Complex or risky changes for example do not qualify and thus only get applied -to mainline. Other fixes are easy to get backported to the newest stable and -longterm kernels, but too risky to integrate into older ones. So be aware the -fix you are hoping for might be one of those that won't be backported to the -version line your care about. In that case you'll have no other choice then to -live with the issue or switch to a newer Linux version, unless you want to -patch the fix into your kernels yourself. +This subsection provides details for the steps you need to perform if you face +a regression within a stable and longterm kernel line. Make sure the particular version line still gets support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1431,7 +1489,7 @@ chosen and gets supported for at least two years (often six). That's why you need to check if the kernel developers still support the version line you care for. -Note, if kernel.org lists two 'stable' version lines on the front page, you +Note, if kernel.org lists two stable version lines on the front page, you should consider switching to the newer one and forget about the older one: support for it is likely to be abandoned soon. Then it will get a "end-of-life" (EOL) stamp. Version lines that reached that point still get mentioned on the @@ -1454,12 +1512,103 @@ Reproduce issue with the newest release *Install the latest release from the particular version line as a vanilla kernel. Ensure this kernel is not tainted and still shows the problem, as - the issue might have already been fixed there.* + the issue might have already been fixed there. If you first noticed the + problem with a vendor kernel, check a vanilla build of the last version + known to work performs fine as well.* Before investing any more time in this process you want to check if the issue was already fixed in the latest release of version line you're interested in. This kernel needs to be vanilla and shouldn't be tainted before the issue -happens, as detailed outlined already above in the process of testing mainline. +happens, as detailed outlined already above in the section "Install a fresh +kernel for testing". + +Did you first notice the regression with a vendor kernel? Then changes the +vendor applied might be interfering. You need to rule that out by performing +a recheck. Say something broke when you updated from 5.10.4-vendor.42 to +5.10.5-vendor.43. Then after testing the latest 5.10 release as outlined in +the previous paragraph check if a vanilla build of Linux 5.10.4 works fine as +well. If things are broken there, the issue does not qualify as upstream +regression and you need switch back to the main step-by-step guide to report +the issue. + +Report the regression +~~~~~~~~~~~~~~~~~~~~~ + + *Send a short problem report to the Linux stable mailing list + (stable@vger.kernel.org) and CC the Linux regressions mailing list + (regressions@lists.linux.dev). Roughly describe the issue and ideally + explain how to reproduce it. Mention the first version that shows the + problem and the last version that's working fine. Then wait for further + instructions.* + +When reporting a regression that happens within a stable or longterm kernel +line (say when updating from 5.10.4 to 5.10.5) a brief report is enough for +the start to get the issue reported quickly. Hence a rough description is all +it takes. + +But note, it helps developers a great deal if you can specify the exact version +that introduced the problem. Hence if possible within a reasonable time frame, +try to find that version using vanilla kernels. Lets assume something broke when +your distributor released a update from Linux kernel 5.10.5 to 5.10.8. Then as +instructed above go and check the latest kernel from that version line, say +5.10.9. If it shows the problem, try a vanilla 5.10.5 to ensure that no patches +the distributor applied interfere. If the issue doesn't manifest itself there, +try 5.10.7 and then (depending on the outcome) 5.10.8 or 5.10.6 to find the +first version where things broke. Mention it in the report and state that 5.10.9 +is still broken. + +What the previous paragraph outlines is basically a rough manual 'bisection'. +Once your report is out your might get asked to do a proper one, as it allows to +pinpoint the exact change that causes the issue (which then can easily get +reverted to fix the issue quickly). Hence consider to do a proper bisection +right away if time permits. See the section 'Special care for regressions' and +the document 'Documentation/admin-guide/bug-bisect.rst' for details how to +perform one. + + +Reference for "Reporting issues only occurring in older kernel version lines" +----------------------------------------------------------------------------- + +This section provides details for the steps you need to take if you could not +reproduce your issue with a mainline kernel, but want to see it fixed in older +version lines (aka stable and longterm kernels). + +Some fixes are too complex +~~~~~~~~~~~~~~~~~~~~~~~~~~ + + *Prepare yourself for the possibility that going through the next few steps + might not get the issue solved in older releases: the fix might be too big + or risky to get backported there.* + +Even small and seemingly obvious code-changes sometimes introduce new and +totally unexpected problems. The maintainers of the stable and longterm kernels +are very aware of that and thus only apply changes to these kernels that are +within rules outlined in 'Documentation/process/stable-kernel-rules.rst'. + +Complex or risky changes for example do not qualify and thus only get applied +to mainline. Other fixes are easy to get backported to the newest stable and +longterm kernels, but too risky to integrate into older ones. So be aware the +fix you are hoping for might be one of those that won't be backported to the +version line your care about. In that case you'll have no other choice then to +live with the issue or switch to a newer Linux version, unless you want to +patch the fix into your kernels yourself. + +Common preparations +~~~~~~~~~~~~~~~~~~~ + + *Perform the first three steps in the section "Reporting issues only + occurring in older kernel version lines" above.* + +You need to carry out a few steps already described in another section of this +guide. Those steps will let you: + + * Check if the kernel developers still maintain the Linux kernel version line + you care about. + + * Search the Linux stable mailing list for exiting reports. + + * Check with the latest release. + Check code history and search for existing discussions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1513,41 +1662,6 @@ discussions abound it. join the discussion: mention the version where you face the issue and that you would like to see it fixed, if suitable. -Check if it's a regression specific to stable or longterm kernels -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - *Check if you're dealing with a regression that was never present in - mainline by installing the first release of the version line you care - about. If the issue doesn't show up with it, you basically need to report - the issue with this version like you would report a problem with mainline - (see above). This ideally includes a bisection followed by a search for - existing reports on the net; with the help of the subject and the two - relevant commit-ids. If that doesn't turn up anything, write the report; CC - or forward the report to the stable maintainers, the stable mailing list, - and those who authored the change. Include the shortened commit-id if you - found the change that causes it.* - -Sometimes you won't find anything in the previous step: the issue you face -might have never occurred in mainline, as it is caused by some change that is -incomplete or not correctly applied. To check this, install the first release -from version line you care about, e.g., if you care about 5.4.x, install 5.4. - -If the issue doesn't show itself there, it's a regression specific to the -particular version line. In that case you need to report it like an issue -happening in mainline, like the last few steps in the main section in the above -outline. - -One of them suggests doing a bisection, which you are strongly advised to do in -this case. After finding the culprit, search the net for existing reports -again: not only search for the exact subject and the commit-id (proper and -shortened to twelve characters) of the change, but also for the commit-id -(proper and shortened) mentioned as 'Upstream commit' in the commit message. - -Write the report; just keep a few specialties in mind: CC or forward the report -to the stable maintainers, the stable mailing list, which the :ref:`MAINTAINERS -<maintainers>` file mentions in the section "STABLE BRANCH". If you performed a -successful bisection, CC the author of the change and include its subject and -the shortened commit-id. Ask for advice ~~~~~~~~~~~~~~ @@ -1560,8 +1674,7 @@ Ask for advice If the previous three steps didn't get you closer to a solution there is only one option left: ask for advice. Do that in a mail you sent to the maintainers for the subsystem where the issue seems to have its roots; CC the mailing list -for the subsystem as well as the stable mailing list the :ref:`MAINTAINERS -<maintainers>` file mention in the section "STABLE BRANCH". +for the subsystem as well as the stable mailing list (stable@vger.kernel.org). Why some issues won't get any reaction or remain unfixed after being reported @@ -1629,3 +1742,13 @@ issues to the Linux kernel developers: the length and complexity of this document and the implications between the lines illustrate that. But that's how it is for now. The main author of this text hopes documenting the state of the art will lay some groundwork to improve the situation over time. + + +.. + This text is maintained by Thorsten Leemhuis <linux@leemhuis.info>. If you + spot a typo or small mistake, feel free to let him know directly and he'll + fix it. You are free to do the same in a mostly informal way if you want + to contribute changes to the text, but for copyright reasons please CC + linux-doc@vger.kernel.org and "sign-off" your contribution as + Documentation/process/submitting-patches.rst outlines in the section "Sign + your work - the Developer's Certificate of Origin". diff --git a/Documentation/admin-guide/sysrq.rst b/Documentation/admin-guide/sysrq.rst index 67dfa4c290935bb3f15df294770704cf91c3b1a9..60ce5f5ebab6948de2856bcbd8b246f9c0ad2fcf 100644 --- a/Documentation/admin-guide/sysrq.rst +++ b/Documentation/admin-guide/sysrq.rst @@ -90,8 +90,8 @@ Command Function ``b`` Will immediately reboot the system without syncing or unmounting your disks. -``c`` Will perform a system crash by a NULL pointer dereference. - A crashdump will be taken if configured. +``c`` Will perform a system crash and a crashdump will be taken + if configured. ``d`` Shows all locks that are held. diff --git a/Documentation/arch.rst b/Documentation/arch.rst new file mode 100644 index 0000000000000000000000000000000000000000..f10bd32a5972e244ccaa354a0c24788043d71d3f --- /dev/null +++ b/Documentation/arch.rst @@ -0,0 +1,26 @@ +.. SPDX-License-Identifier: GPL-2.0 + +CPU Architectures +================= + +These books provide programming details about architecture-specific +implementation. + +.. toctree:: + :maxdepth: 2 + + arm/index + arm64/index + ia64/index + m68k/index + mips/index + nios2/index + openrisc/index + parisc/index + powerpc/index + riscv/index + s390/index + sh/index + sparc/index + x86/index + xtensa/index diff --git a/Documentation/arm/marvell.rst b/Documentation/arm/marvell.rst index 94cd7338359428b515616ec55052b03ccfda8477..c50be711ec728d270ac68dfdb25d53456b42b05e 100644 --- a/Documentation/arm/marvell.rst +++ b/Documentation/arm/marvell.rst @@ -18,12 +18,12 @@ Orion family - 88F5181L - 88F5182 - - Datasheet: http://www.embeddedarm.com/documentation/third-party/MV88F5182-datasheet.pdf - - Programmer's User Guide: http://www.embeddedarm.com/documentation/third-party/MV88F5182-opensource-manual.pdf - - User Manual: http://www.embeddedarm.com/documentation/third-party/MV88F5182-usermanual.pdf + - Datasheet: https://web.archive.org/web/20210124231420/http://csclub.uwaterloo.ca/~board/ts7800/MV88F5182-datasheet.pdf + - Programmer's User Guide: https://web.archive.org/web/20210124231536/http://csclub.uwaterloo.ca/~board/ts7800/MV88F5182-opensource-manual.pdf + - User Manual: https://web.archive.org/web/20210124231631/http://csclub.uwaterloo.ca/~board/ts7800/MV88F5182-usermanual.pdf - 88F5281 - - Datasheet: http://www.ocmodshop.com/images/reviews/networking/qnap_ts409u/marvel_88f5281_data_sheet.pdf + - Datasheet: https://web.archive.org/web/20131028144728/http://www.ocmodshop.com/images/reviews/networking/qnap_ts409u/marvel_88f5281_data_sheet.pdf - 88F6183 Core: Feroceon 88fr331 (88f51xx) or 88fr531-vd (88f52xx) ARMv5 compatible @@ -38,33 +38,33 @@ Kirkwood family Flavors: - 88F6282 a.k.a Armada 300 - - Product Brief : http://www.marvell.com/embedded-processors/armada-300/assets/armada_310.pdf + - Product Brief : https://web.archive.org/web/20111027032509/http://www.marvell.com/embedded-processors/armada-300/assets/armada_310.pdf - 88F6283 a.k.a Armada 310 - - Product Brief : http://www.marvell.com/embedded-processors/armada-300/assets/armada_310.pdf + - Product Brief : https://web.archive.org/web/20111027032509/http://www.marvell.com/embedded-processors/armada-300/assets/armada_310.pdf - 88F6190 - - Product Brief : http://www.marvell.com/embedded-processors/kirkwood/assets/88F6190-003_WEB.pdf - - Hardware Spec : http://www.marvell.com/embedded-processors/kirkwood/assets/HW_88F619x_OpenSource.pdf - - Functional Spec: http://www.marvell.com/embedded-processors/kirkwood/assets/FS_88F6180_9x_6281_OpenSource.pdf + - Product Brief : https://web.archive.org/web/20130730072715/http://www.marvell.com/embedded-processors/kirkwood/assets/88F6190-003_WEB.pdf + - Hardware Spec : https://web.archive.org/web/20121021182835/http://www.marvell.com/embedded-processors/kirkwood/assets/HW_88F619x_OpenSource.pdf + - Functional Spec: https://web.archive.org/web/20130730091033/http://www.marvell.com/embedded-processors/kirkwood/assets/FS_88F6180_9x_6281_OpenSource.pdf - 88F6192 - - Product Brief : http://www.marvell.com/embedded-processors/kirkwood/assets/88F6192-003_ver1.pdf - - Hardware Spec : http://www.marvell.com/embedded-processors/kirkwood/assets/HW_88F619x_OpenSource.pdf - - Functional Spec: http://www.marvell.com/embedded-processors/kirkwood/assets/FS_88F6180_9x_6281_OpenSource.pdf + - Product Brief : https://web.archive.org/web/20131113121446/http://www.marvell.com/embedded-processors/kirkwood/assets/88F6192-003_ver1.pdf + - Hardware Spec : https://web.archive.org/web/20121021182835/http://www.marvell.com/embedded-processors/kirkwood/assets/HW_88F619x_OpenSource.pdf + - Functional Spec: https://web.archive.org/web/20130730091033/http://www.marvell.com/embedded-processors/kirkwood/assets/FS_88F6180_9x_6281_OpenSource.pdf - 88F6182 - 88F6180 - - Product Brief : http://www.marvell.com/embedded-processors/kirkwood/assets/88F6180-003_ver1.pdf - - Hardware Spec : http://www.marvell.com/embedded-processors/kirkwood/assets/HW_88F6180_OpenSource.pdf - - Functional Spec: http://www.marvell.com/embedded-processors/kirkwood/assets/FS_88F6180_9x_6281_OpenSource.pdf + - Product Brief : https://web.archive.org/web/20120616201621/http://www.marvell.com/embedded-processors/kirkwood/assets/88F6180-003_ver1.pdf + - Hardware Spec : https://web.archive.org/web/20130730091654/http://www.marvell.com/embedded-processors/kirkwood/assets/HW_88F6180_OpenSource.pdf + - Functional Spec: https://web.archive.org/web/20130730091033/http://www.marvell.com/embedded-processors/kirkwood/assets/FS_88F6180_9x_6281_OpenSource.pdf - 88F6281 - - Product Brief : http://www.marvell.com/embedded-processors/kirkwood/assets/88F6281-004_ver1.pdf - - Hardware Spec : http://www.marvell.com/embedded-processors/kirkwood/assets/HW_88F6281_OpenSource.pdf - - Functional Spec: http://www.marvell.com/embedded-processors/kirkwood/assets/FS_88F6180_9x_6281_OpenSource.pdf + - Product Brief : https://web.archive.org/web/20120131133709/http://www.marvell.com/embedded-processors/kirkwood/assets/88F6281-004_ver1.pdf + - Hardware Spec : https://web.archive.org/web/20120620073511/http://www.marvell.com/embedded-processors/kirkwood/assets/HW_88F6281_OpenSource.pdf + - Functional Spec: https://web.archive.org/web/20130730091033/http://www.marvell.com/embedded-processors/kirkwood/assets/FS_88F6180_9x_6281_OpenSource.pdf Homepage: - http://www.marvell.com/embedded-processors/kirkwood/ + https://web.archive.org/web/20160513194943/http://www.marvell.com/embedded-processors/kirkwood/ Core: Feroceon 88fr131 ARMv5 compatible Linux kernel mach directory: @@ -78,14 +78,15 @@ Discovery family Flavors: - MV78100 - - Product Brief : http://www.marvell.com/embedded-processors/discovery-innovation/assets/MV78100-003_WEB.pdf - - Hardware Spec : http://www.marvell.com/embedded-processors/discovery-innovation/assets/HW_MV78100_OpenSource.pdf - - Functional Spec: http://www.marvell.com/embedded-processors/discovery-innovation/assets/FS_MV76100_78100_78200_OpenSource.pdf + - Product Brief : https://web.archive.org/web/20120616194711/http://www.marvell.com/embedded-processors/discovery-innovation/assets/MV78100-003_WEB.pdf + - Hardware Spec : https://web.archive.org/web/20141005120451/http://www.marvell.com/embedded-processors/discovery-innovation/assets/HW_MV78100_OpenSource.pdf + - Functional Spec: https://web.archive.org/web/20111110081125/http://www.marvell.com/embedded-processors/discovery-innovation/assets/FS_MV76100_78100_78200_OpenSource.pdf - MV78200 - - Product Brief : http://www.marvell.com/embedded-processors/discovery-innovation/assets/MV78200-002_WEB.pdf - - Hardware Spec : http://www.marvell.com/embedded-processors/discovery-innovation/assets/HW_MV78200_OpenSource.pdf - - Functional Spec: http://www.marvell.com/embedded-processors/discovery-innovation/assets/FS_MV76100_78100_78200_OpenSource.pdf + - Product Brief : https://web.archive.org/web/20140801121623/http://www.marvell.com/embedded-processors/discovery-innovation/assets/MV78200-002_WEB.pdf + - Hardware Spec : https://web.archive.org/web/20141005120458/http://www.marvell.com/embedded-processors/discovery-innovation/assets/HW_MV78200_OpenSource.pdf + - Functional Spec: https://web.archive.org/web/20111110081125/http://www.marvell.com/embedded-processors/discovery-innovation/assets/FS_MV76100_78100_78200_OpenSource.pdf + - MV76100 Not supported by the Linux kernel. @@ -106,9 +107,9 @@ EBU Armada family - 88F6707 - 88F6W11 - - Product Brief: http://www.marvell.com/embedded-processors/armada-300/assets/Marvell_ARMADA_370_SoC.pdf - - Hardware Spec: http://www.marvell.com/embedded-processors/armada-300/assets/ARMADA370-datasheet.pdf - - Functional Spec: http://www.marvell.com/embedded-processors/armada-300/assets/ARMADA370-FunctionalSpec-datasheet.pdf + - Product Brief: https://web.archive.org/web/20121115063038/http://www.marvell.com/embedded-processors/armada-300/assets/Marvell_ARMADA_370_SoC.pdf + - Hardware Spec: https://web.archive.org/web/20140617183747/http://www.marvell.com/embedded-processors/armada-300/assets/ARMADA370-datasheet.pdf + - Functional Spec: https://web.archive.org/web/20140617183701/http://www.marvell.com/embedded-processors/armada-300/assets/ARMADA370-FunctionalSpec-datasheet.pdf Core: Sheeva ARMv7 compatible PJ4B @@ -116,7 +117,7 @@ EBU Armada family Armada 375 Flavors: - 88F6720 - - Product Brief: http://www.marvell.com/embedded-processors/armada-300/assets/ARMADA_375_SoC-01_product_brief.pdf + - Product Brief: https://web.archive.org/web/20131216023516/http://www.marvell.com/embedded-processors/armada-300/assets/ARMADA_375_SoC-01_product_brief.pdf Core: ARM Cortex-A9 @@ -126,8 +127,8 @@ EBU Armada family - 88F6820 Armada 385 - 88F6828 Armada 388 - - Product infos: http://www.marvell.com/embedded-processors/armada-38x/ - - Functional Spec: http://www.marvell.com/content/dam/marvell/en/public-collateral/embedded-processors/marvell-embedded-processors-armada-38x-functional-specifications-2015-11.pdf + - Product infos: https://web.archive.org/web/20181006144616/http://www.marvell.com/embedded-processors/armada-38x/ + - Functional Spec: https://web.archive.org/web/20200420191927/https://www.marvell.com/content/dam/marvell/en/public-collateral/embedded-processors/marvell-embedded-processors-armada-38x-functional-specifications-2015-11.pdf Core: ARM Cortex-A9 @@ -136,7 +137,7 @@ EBU Armada family - 88F6920 Armada 390 - 88F6928 Armada 398 - - Product infos: http://www.marvell.com/embedded-processors/armada-39x/ + - Product infos: https://web.archive.org/web/20181020222559/http://www.marvell.com/embedded-processors/armada-39x/ Core: ARM Cortex-A9 @@ -150,16 +151,16 @@ EBU Armada family not to be confused with the non-SMP 78xx0 SoCs Product Brief: - http://www.marvell.com/embedded-processors/armada-xp/assets/Marvell-ArmadaXP-SoC-product%20brief.pdf + https://web.archive.org/web/20121021173528/http://www.marvell.com/embedded-processors/armada-xp/assets/Marvell-ArmadaXP-SoC-product%20brief.pdf Functional Spec: - http://www.marvell.com/embedded-processors/armada-xp/assets/ARMADA-XP-Functional-SpecDatasheet.pdf + https://web.archive.org/web/20180829171131/http://www.marvell.com/embedded-processors/armada-xp/assets/ARMADA-XP-Functional-SpecDatasheet.pdf - Hardware Specs: - - http://www.marvell.com/embedded-processors/armada-xp/assets/HW_MV78230_OS.PDF - - http://www.marvell.com/embedded-processors/armada-xp/assets/HW_MV78260_OS.PDF - - http://www.marvell.com/embedded-processors/armada-xp/assets/HW_MV78460_OS.PDF + - https://web.archive.org/web/20141127013651/http://www.marvell.com/embedded-processors/armada-xp/assets/HW_MV78230_OS.PDF + - https://web.archive.org/web/20141222000224/http://www.marvell.com/embedded-processors/armada-xp/assets/HW_MV78260_OS.PDF + - https://web.archive.org/web/20141222000230/http://www.marvell.com/embedded-processors/armada-xp/assets/HW_MV78460_OS.PDF Core: Sheeva ARMv7 compatible Dual-core or Quad-core PJ4B-MP @@ -180,13 +181,13 @@ EBU Armada family ARMv8 ARM Cortex A53 (ARMv8) Homepage: - http://www.marvell.com/embedded-processors/armada-3700/ + https://web.archive.org/web/20181103003602/http://www.marvell.com/embedded-processors/armada-3700/ Product Brief: - http://www.marvell.com/content/dam/marvell/en/public-collateral/embedded-processors/marvell-embedded-processors-armada-37xx-product-brief-2016-01.pdf + https://web.archive.org/web/20210121194810/https://www.marvell.com/content/dam/marvell/en/public-collateral/embedded-processors/marvell-embedded-processors-armada-37xx-product-brief-2016-01.pdf Hardware Spec: - http://www.marvell.com/content/dam/marvell/en/public-collateral/embedded-processors/marvell-embedded-processors-armada-37xx-hardware-specifications-2019-09.pdf + https://web.archive.org/web/20210202162011/http://www.marvell.com/content/dam/marvell/en/public-collateral/embedded-processors/marvell-embedded-processors-armada-37xx-hardware-specifications-2019-09.pdf Device tree files: arch/arm64/boot/dts/marvell/armada-37* @@ -198,11 +199,11 @@ EBU Armada family ARMv8 Core: ARM Cortex A72 Homepage: - http://www.marvell.com/embedded-processors/armada-70xx/ + https://web.archive.org/web/20181020222606/http://www.marvell.com/embedded-processors/armada-70xx/ Product Brief: - - http://www.marvell.com/embedded-processors/assets/Armada7020PB-Jan2016.pdf - - http://www.marvell.com/embedded-processors/assets/Armada7040PB-Jan2016.pdf + - https://web.archive.org/web/20161010105541/http://www.marvell.com/embedded-processors/assets/Armada7020PB-Jan2016.pdf + - https://web.archive.org/web/20160928154533/http://www.marvell.com/embedded-processors/assets/Armada7040PB-Jan2016.pdf Device tree files: arch/arm64/boot/dts/marvell/armada-70* @@ -214,11 +215,11 @@ EBU Armada family ARMv8 ARM Cortex A72 Homepage: - http://www.marvell.com/embedded-processors/armada-80xx/ + https://web.archive.org/web/20181022004830/http://www.marvell.com/embedded-processors/armada-80xx/ Product Brief: - - http://www.marvell.com/embedded-processors/assets/Armada8020PB-Jan2016.pdf - - http://www.marvell.com/embedded-processors/assets/Armada8040PB-Jan2016.pdf + - https://web.archive.org/web/20210124233728/https://www.marvell.com/content/dam/marvell/en/public-collateral/embedded-processors/marvell-embedded-processors-armada-8020-product-brief-2017-12.pdf + - https://web.archive.org/web/20161010105532/http://www.marvell.com/embedded-processors/assets/Armada8040PB-Jan2016.pdf Device tree files: arch/arm64/boot/dts/marvell/armada-80* @@ -233,10 +234,10 @@ Avanta family - 88F6560 Homepage: - http://www.marvell.com/broadband/ + https://web.archive.org/web/20181005145041/http://www.marvell.com/broadband/ Product Brief: - http://www.marvell.com/broadband/assets/Marvell_Avanta_88F6510_305_060-001_product_brief.pdf + https://web.archive.org/web/20180829171057/http://www.marvell.com/broadband/assets/Marvell_Avanta_88F6510_305_060-001_product_brief.pdf No public datasheet available. @@ -255,7 +256,7 @@ Storage family - 88RC1580 Product infos: - http://www.marvell.com/storage/armada-sp/ + https://web.archive.org/web/20191129073953/http://www.marvell.com/storage/armada-sp/ Core: Sheeva ARMv7 comatible Quad-core PJ4C @@ -269,16 +270,16 @@ Dove family (application processor) - 88AP510 a.k.a Armada 510 Product Brief: - http://www.marvell.com/application-processors/armada-500/assets/Marvell_Armada510_SoC.pdf + https://web.archive.org/web/20111102020643/http://www.marvell.com/application-processors/armada-500/assets/Marvell_Armada510_SoC.pdf Hardware Spec: - http://www.marvell.com/application-processors/armada-500/assets/Armada-510-Hardware-Spec.pdf + https://web.archive.org/web/20160428160231/http://www.marvell.com/application-processors/armada-500/assets/Armada-510-Hardware-Spec.pdf Functional Spec: - http://www.marvell.com/application-processors/armada-500/assets/Armada-510-Functional-Spec.pdf + https://web.archive.org/web/20120130172443/http://www.marvell.com/application-processors/armada-500/assets/Armada-510-Functional-Spec.pdf Homepage: - http://www.marvell.com/application-processors/armada-500/ + https://web.archive.org/web/20160822232651/http://www.marvell.com/application-processors/armada-500/ Core: ARMv7 compatible @@ -295,22 +296,22 @@ PXA 2xx/3xx/93x/95x family - Application processor only - Core: ARMv5 XScale1 core - PXA270, PXA271, PXA272 - - Product Brief : http://www.marvell.com/application-processors/pxa-family/assets/pxa_27x_pb.pdf - - Design guide : http://www.marvell.com/application-processors/pxa-family/assets/pxa_27x_design_guide.pdf - - Developers manual : http://www.marvell.com/application-processors/pxa-family/assets/pxa_27x_dev_man.pdf - - Specification : http://www.marvell.com/application-processors/pxa-family/assets/pxa_27x_emts.pdf - - Specification update : http://www.marvell.com/application-processors/pxa-family/assets/pxa_27x_spec_update.pdf + - Product Brief : https://web.archive.org/web/20150927135510/http://www.marvell.com/application-processors/pxa-family/assets/pxa_27x_pb.pdf + - Design guide : https://web.archive.org/web/20120111181937/http://www.marvell.com/application-processors/pxa-family/assets/pxa_27x_design_guide.pdf + - Developers manual : https://web.archive.org/web/20150927164805/http://www.marvell.com/application-processors/pxa-family/assets/pxa_27x_dev_man.pdf + - Specification : https://web.archive.org/web/20140211221535/http://www.marvell.com/application-processors/pxa-family/assets/pxa_27x_emts.pdf + - Specification update : https://web.archive.org/web/20120111104906/http://www.marvell.com/application-processors/pxa-family/assets/pxa_27x_spec_update.pdf - Application processor only - Core: ARMv5 XScale2 core - PXA300, PXA310, PXA320 - - PXA 300 Product Brief : http://www.marvell.com/application-processors/pxa-family/assets/PXA300_PB_R4.pdf - - PXA 310 Product Brief : http://www.marvell.com/application-processors/pxa-family/assets/PXA310_PB_R4.pdf - - PXA 320 Product Brief : http://www.marvell.com/application-processors/pxa-family/assets/PXA320_PB_R4.pdf - - Design guide : http://www.marvell.com/application-processors/pxa-family/assets/PXA3xx_Design_Guide.pdf - - Developers manual : http://www.marvell.com/application-processors/pxa-family/assets/PXA3xx_Developers_Manual.zip - - Specifications : http://www.marvell.com/application-processors/pxa-family/assets/PXA3xx_EMTS.pdf - - Specification Update : http://www.marvell.com/application-processors/pxa-family/assets/PXA3xx_Spec_Update.zip - - Reference Manual : http://www.marvell.com/application-processors/pxa-family/assets/PXA3xx_TavorP_BootROM_Ref_Manual.pdf + - PXA 300 Product Brief : https://web.archive.org/web/20120111121203/http://www.marvell.com/application-processors/pxa-family/assets/PXA300_PB_R4.pdf + - PXA 310 Product Brief : https://web.archive.org/web/20120111104515/http://www.marvell.com/application-processors/pxa-family/assets/PXA310_PB_R4.pdf + - PXA 320 Product Brief : https://web.archive.org/web/20121021182826/http://www.marvell.com/application-processors/pxa-family/assets/PXA320_PB_R4.pdf + - Design guide : https://web.archive.org/web/20130727144625/http://www.marvell.com/application-processors/pxa-family/assets/PXA3xx_Design_Guide.pdf + - Developers manual : https://web.archive.org/web/20130727144605/http://www.marvell.com/application-processors/pxa-family/assets/PXA3xx_Developers_Manual.zip + - Specifications : https://web.archive.org/web/20130727144559/http://www.marvell.com/application-processors/pxa-family/assets/PXA3xx_EMTS.pdf + - Specification Update : https://web.archive.org/web/20150927183411/http://www.marvell.com/application-processors/pxa-family/assets/PXA3xx_Spec_Update.zip + - Reference Manual : https://web.archive.org/web/20120111103844/http://www.marvell.com/application-processors/pxa-family/assets/PXA3xx_TavorP_BootROM_Ref_Manual.pdf - Application processor only - Core: ARMv5 XScale3 core - PXA930, PXA935 @@ -341,26 +342,26 @@ MMP/MMP2/MMP3 family (communication processor) Flavors: - PXA168, a.k.a Armada 168 - - Homepage : http://www.marvell.com/application-processors/armada-100/armada-168.jsp - - Product brief : http://www.marvell.com/application-processors/armada-100/assets/pxa_168_pb.pdf - - Hardware manual : http://www.marvell.com/application-processors/armada-100/assets/armada_16x_datasheet.pdf - - Software manual : http://www.marvell.com/application-processors/armada-100/assets/armada_16x_software_manual.pdf - - Specification update : http://www.marvell.com/application-processors/armada-100/assets/ARMADA16x_Spec_update.pdf - - Boot ROM manual : http://www.marvell.com/application-processors/armada-100/assets/armada_16x_ref_manual.pdf - - App node package : http://www.marvell.com/application-processors/armada-100/assets/armada_16x_app_note_package.pdf + - Homepage : https://web.archive.org/web/20110926014256/http://www.marvell.com/application-processors/armada-100/armada-168.jsp + - Product brief : https://web.archive.org/web/20111102030100/http://www.marvell.com/application-processors/armada-100/assets/pxa_168_pb.pdf + - Hardware manual : https://web.archive.org/web/20160428165359/http://www.marvell.com/application-processors/armada-100/assets/armada_16x_datasheet.pdf + - Software manual : https://web.archive.org/web/20160428154454/http://www.marvell.com/application-processors/armada-100/assets/armada_16x_software_manual.pdf + - Specification update : https://web.archive.org/web/20150927160338/http://www.marvell.com/application-processors/armada-100/assets/ARMADA16x_Spec_update.pdf + - Boot ROM manual : https://web.archive.org/web/20130727205559/http://www.marvell.com/application-processors/armada-100/assets/armada_16x_ref_manual.pdf + - App node package : https://web.archive.org/web/20141005090706/http://www.marvell.com/application-processors/armada-100/assets/armada_16x_app_note_package.pdf - Application processor only - Core: ARMv5 compatible Marvell PJ1 88sv331 (Mohawk) - PXA910/PXA920 - - Homepage : http://www.marvell.com/communication-processors/pxa910/ - - Product Brief : http://www.marvell.com/communication-processors/pxa910/assets/Marvell_PXA910_Platform-001_PB_final.pdf + - Homepage : https://web.archive.org/web/20150928121236/http://www.marvell.com/communication-processors/pxa910/ + - Product Brief : https://archive.org/download/marvell-pxa910-pb/Marvell_PXA910_Platform-001_PB.pdf - Application processor with Communication processor - Core: ARMv5 compatible Marvell PJ1 88sv331 (Mohawk) - - PXA688, a.k.a. MMP2, a.k.a Armada 610 - - Product Brief : http://www.marvell.com/application-processors/armada-600/assets/armada610_pb.pdf + - PXA688, a.k.a. MMP2, a.k.a Armada 610 (OLPC XO-1.75) + - Product Brief : https://web.archive.org/web/20111102023255/http://www.marvell.com/application-processors/armada-600/assets/armada610_pb.pdf - Application processor only - Core: ARMv7 compatible Sheeva PJ4 88sv581x core - - PXA2128, a.k.a. MMP3 (OLPC XO4, Linux support not upstream) - - Product Brief : http://www.marvell.com/application-processors/armada/pxa2128/assets/Marvell-ARMADA-PXA2128-SoC-PB.pdf + - PXA2128, a.k.a. MMP3, a.k.a Armada 620 (OLPC XO-4) + - Product Brief : https://web.archive.org/web/20120824055155/http://www.marvell.com/application-processors/armada/pxa2128/assets/Marvell-ARMADA-PXA2128-SoC-PB.pdf - Application processor only - Core: Dual-core ARMv7 compatible Sheeva PJ4C core - PXA960/PXA968/PXA978 (Linux support not upstream) diff --git a/Documentation/arm/uefi.rst b/Documentation/arm/uefi.rst index f732f957421ff93da91815ab409b71dad4cd7a73..9b0b5e458a1e609ea2083c76137d850e31fe5f8d 100644 --- a/Documentation/arm/uefi.rst +++ b/Documentation/arm/uefi.rst @@ -64,4 +64,11 @@ linux,uefi-mmap-desc-size 32-bit Size in bytes of each entry in the UEFI memory map. linux,uefi-mmap-desc-ver 32-bit Version of the mmap descriptor format. + +linux,initrd-start 64-bit Physical start address of an initrd + +linux,initrd-end 64-bit Physical end address of an initrd + +kaslr-seed 64-bit Entropy used to randomize the kernel image + base address location. ========================== ====== =========================================== diff --git a/Documentation/conf.py b/Documentation/conf.py index fd65168c10f84f67d62848f3d420dfa4ca5e6ee1..879e86dbea6679498cf738f28fd0b4f474b18a1e 100644 --- a/Documentation/conf.py +++ b/Documentation/conf.py @@ -331,27 +331,34 @@ htmlhelp_basename = 'TheLinuxKerneldoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -'papersize': 'a4paper', + # The paper size ('letterpaper' or 'a4paper'). + 'papersize': 'a4paper', -# The font size ('10pt', '11pt' or '12pt'). -'pointsize': '11pt', + # The font size ('10pt', '11pt' or '12pt'). + 'pointsize': '11pt', -# Latex figure (float) alignment -#'figure_align': 'htbp', + # Latex figure (float) alignment + #'figure_align': 'htbp', -# Don't mangle with UTF-8 chars -'inputenc': '', -'utf8extra': '', + # Don't mangle with UTF-8 chars + 'inputenc': '', + 'utf8extra': '', -# Additional stuff for the LaTeX preamble. + # Set document margins + 'sphinxsetup': ''' + hmargin=0.5in, vmargin=1in, + parsedliteralwraps=true, + verbatimhintsturnover=false, + ''', + + # Additional stuff for the LaTeX preamble. 'preamble': ''' - % Use some font with UTF-8 support with XeLaTeX + % Use some font with UTF-8 support with XeLaTeX \\usepackage{fontspec} \\setsansfont{DejaVu Sans} \\setromanfont{DejaVu Serif} \\setmonofont{DejaVu Sans Mono} - ''' + ''', } # At least one book (translations) may have Asian characters diff --git a/Documentation/core-api/rbtree.rst b/Documentation/core-api/rbtree.rst index 6b88837fbf824d0cf327cfc971ca462fc3b94581..ed1a9fbc779e1b9de88e878035abc8e6c9a02078 100644 --- a/Documentation/core-api/rbtree.rst +++ b/Documentation/core-api/rbtree.rst @@ -201,7 +201,7 @@ search trees, such as for traversals or users relying on a the particular order for their own logic. To this end, users can use 'struct rb_root_cached' to optimize O(logN) rb_first() calls to a simple pointer fetch avoiding potentially expensive tree iterations. This is done at negligible runtime -overhead for maintanence; albeit larger memory footprint. +overhead for maintenance; albeit larger memory footprint. Similar to the rb_root structure, cached rbtrees are initialized to be empty via:: diff --git a/Documentation/dev-tools/checkpatch.rst b/Documentation/dev-tools/checkpatch.rst new file mode 100644 index 0000000000000000000000000000000000000000..51fed1bd72ec46f3d3ef9501fe4e128f90de627a --- /dev/null +++ b/Documentation/dev-tools/checkpatch.rst @@ -0,0 +1,755 @@ +.. SPDX-License-Identifier: GPL-2.0-only + +========== +Checkpatch +========== + +Checkpatch (scripts/checkpatch.pl) is a perl script which checks for trivial +style violations in patches and optionally corrects them. Checkpatch can +also be run on file contexts and without the kernel tree. + +Checkpatch is not always right. Your judgement takes precedence over checkpatch +messages. If your code looks better with the violations, then its probably +best left alone. + + +Options +======= + +This section will describe the options checkpatch can be run with. + +Usage:: + + ./scripts/checkpatch.pl [OPTION]... [FILE]... + +Available options: + + - -q, --quiet + + Enable quiet mode. + + - -v, --verbose + Enable verbose mode. Additional verbose test descriptions are output + so as to provide information on why that particular message is shown. + + - --no-tree + + Run checkpatch without the kernel tree. + + - --no-signoff + + Disable the 'Signed-off-by' line check. The sign-off is a simple line at + the end of the explanation for the patch, which certifies that you wrote it + or otherwise have the right to pass it on as an open-source patch. + + Example:: + + Signed-off-by: Random J Developer <random@developer.example.org> + + Setting this flag effectively stops a message for a missing signed-off-by + line in a patch context. + + - --patch + + Treat FILE as a patch. This is the default option and need not be + explicitly specified. + + - --emacs + + Set output to emacs compile window format. This allows emacs users to jump + from the error in the compile window directly to the offending line in the + patch. + + - --terse + + Output only one line per report. + + - --showfile + + Show the diffed file position instead of the input file position. + + - -g, --git + + Treat FILE as a single commit or a git revision range. + + Single commit with: + + - <rev> + - <rev>^ + - <rev>~n + + Multiple commits with: + + - <rev1>..<rev2> + - <rev1>...<rev2> + - <rev>-<count> + + - -f, --file + + Treat FILE as a regular source file. This option must be used when running + checkpatch on source files in the kernel. + + - --subjective, --strict + + Enable stricter tests in checkpatch. By default the tests emitted as CHECK + do not activate by default. Use this flag to activate the CHECK tests. + + - --list-types + + Every message emitted by checkpatch has an associated TYPE. Add this flag + to display all the types in checkpatch. + + Note that when this flag is active, checkpatch does not read the input FILE, + and no message is emitted. Only a list of types in checkpatch is output. + + - --types TYPE(,TYPE2...) + + Only display messages with the given types. + + Example:: + + ./scripts/checkpatch.pl mypatch.patch --types EMAIL_SUBJECT,BRACES + + - --ignore TYPE(,TYPE2...) + + Checkpatch will not emit messages for the specified types. + + Example:: + + ./scripts/checkpatch.pl mypatch.patch --ignore EMAIL_SUBJECT,BRACES + + - --show-types + + By default checkpatch doesn't display the type associated with the messages. + Set this flag to show the message type in the output. + + - --max-line-length=n + + Set the max line length (default 100). If a line exceeds the specified + length, a LONG_LINE message is emitted. + + + The message level is different for patch and file contexts. For patches, + a WARNING is emitted. While a milder CHECK is emitted for files. So for + file contexts, the --strict flag must also be enabled. + + - --min-conf-desc-length=n + + Set the Kconfig entry minimum description length, if shorter, warn. + + - --tab-size=n + + Set the number of spaces for tab (default 8). + + - --root=PATH + + PATH to the kernel tree root. + + This option must be specified when invoking checkpatch from outside + the kernel root. + + - --no-summary + + Suppress the per file summary. + + - --mailback + + Only produce a report in case of Warnings or Errors. Milder Checks are + excluded from this. + + - --summary-file + + Include the filename in summary. + + - --debug KEY=[0|1] + + Turn on/off debugging of KEY, where KEY is one of 'values', 'possible', + 'type', and 'attr' (default is all off). + + - --fix + + This is an EXPERIMENTAL feature. If correctable errors exists, a file + <inputfile>.EXPERIMENTAL-checkpatch-fixes is created which has the + automatically fixable errors corrected. + + - --fix-inplace + + EXPERIMENTAL - Similar to --fix but input file is overwritten with fixes. + + DO NOT USE this flag unless you are absolutely sure and you have a backup + in place. + + - --ignore-perl-version + + Override checking of perl version. Runtime errors maybe encountered after + enabling this flag if the perl version does not meet the minimum specified. + + - --codespell + + Use the codespell dictionary for checking spelling errors. + + - --codespellfile + + Use the specified codespell file. + Default is '/usr/share/codespell/dictionary.txt'. + + - --typedefsfile + + Read additional types from this file. + + - --color[=WHEN] + + Use colors 'always', 'never', or only when output is a terminal ('auto'). + Default is 'auto'. + + - --kconfig-prefix=WORD + + Use WORD as a prefix for Kconfig symbols (default is `CONFIG_`). + + - -h, --help, --version + + Display the help text. + +Message Levels +============== + +Messages in checkpatch are divided into three levels. The levels of messages +in checkpatch denote the severity of the error. They are: + + - ERROR + + This is the most strict level. Messages of type ERROR must be taken + seriously as they denote things that are very likely to be wrong. + + - WARNING + + This is the next stricter level. Messages of type WARNING requires a + more careful review. But it is milder than an ERROR. + + - CHECK + + This is the mildest level. These are things which may require some thought. + +Type Descriptions +================= + +This section contains a description of all the message types in checkpatch. + +.. Types in this section are also parsed by checkpatch. +.. The types are grouped into subsections based on use. + + +Allocation style +---------------- + + **ALLOC_ARRAY_ARGS** + The first argument for kcalloc or kmalloc_array should be the + number of elements. sizeof() as the first argument is generally + wrong. + See: https://www.kernel.org/doc/html/latest/core-api/memory-allocation.html + + **ALLOC_SIZEOF_STRUCT** + The allocation style is bad. In general for family of + allocation functions using sizeof() to get memory size, + constructs like:: + + p = alloc(sizeof(struct foo), ...) + + should be:: + + p = alloc(sizeof(*p), ...) + + See: https://www.kernel.org/doc/html/latest/process/coding-style.html#allocating-memory + + **ALLOC_WITH_MULTIPLY** + Prefer kmalloc_array/kcalloc over kmalloc/kzalloc with a + sizeof multiply. + See: https://www.kernel.org/doc/html/latest/core-api/memory-allocation.html + + +API usage +--------- + + **ARCH_DEFINES** + Architecture specific defines should be avoided wherever + possible. + + **ARCH_INCLUDE_LINUX** + Whenever asm/file.h is included and linux/file.h exists, a + conversion can be made when linux/file.h includes asm/file.h. + However this is not always the case (See signal.h). + This message type is emitted only for includes from arch/. + + **AVOID_BUG** + BUG() or BUG_ON() should be avoided totally. + Use WARN() and WARN_ON() instead, and handle the "impossible" + error condition as gracefully as possible. + See: https://www.kernel.org/doc/html/latest/process/deprecated.html#bug-and-bug-on + + **CONSIDER_KSTRTO** + The simple_strtol(), simple_strtoll(), simple_strtoul(), and + simple_strtoull() functions explicitly ignore overflows, which + may lead to unexpected results in callers. The respective kstrtol(), + kstrtoll(), kstrtoul(), and kstrtoull() functions tend to be the + correct replacements. + See: https://www.kernel.org/doc/html/latest/process/deprecated.html#simple-strtol-simple-strtoll-simple-strtoul-simple-strtoull + + **LOCKDEP** + The lockdep_no_validate class was added as a temporary measure to + prevent warnings on conversion of device->sem to device->mutex. + It should not be used for any other purpose. + See: https://lore.kernel.org/lkml/1268959062.9440.467.camel@laptop/ + + **MALFORMED_INCLUDE** + The #include statement has a malformed path. This has happened + because the author has included a double slash "//" in the pathname + accidentally. + + **USE_LOCKDEP** + lockdep_assert_held() annotations should be preferred over + assertions based on spin_is_locked() + See: https://www.kernel.org/doc/html/latest/locking/lockdep-design.html#annotations + + **UAPI_INCLUDE** + No #include statements in include/uapi should use a uapi/ path. + + +Comment style +------------- + + **BLOCK_COMMENT_STYLE** + The comment style is incorrect. The preferred style for multi- + line comments is:: + + /* + * This is the preferred style + * for multi line comments. + */ + + The networking comment style is a bit different, with the first line + not empty like the former:: + + /* This is the preferred comment style + * for files in net/ and drivers/net/ + */ + + See: https://www.kernel.org/doc/html/latest/process/coding-style.html#commenting + + **C99_COMMENTS** + C99 style single line comments (//) should not be used. + Prefer the block comment style instead. + See: https://www.kernel.org/doc/html/latest/process/coding-style.html#commenting + + +Commit message +-------------- + + **BAD_SIGN_OFF** + The signed-off-by line does not fall in line with the standards + specified by the community. + See: https://www.kernel.org/doc/html/latest/process/submitting-patches.html#developer-s-certificate-of-origin-1-1 + + **BAD_STABLE_ADDRESS_STYLE** + The email format for stable is incorrect. + Some valid options for stable address are:: + + 1. stable@vger.kernel.org + 2. stable@kernel.org + + For adding version info, the following comment style should be used:: + + stable@vger.kernel.org # version info + + **COMMIT_COMMENT_SYMBOL** + Commit log lines starting with a '#' are ignored by git as + comments. To solve this problem addition of a single space + infront of the log line is enough. + + **COMMIT_MESSAGE** + The patch is missing a commit description. A brief + description of the changes made by the patch should be added. + See: https://www.kernel.org/doc/html/latest/process/submitting-patches.html#describe-your-changes + + **MISSING_SIGN_OFF** + The patch is missing a Signed-off-by line. A signed-off-by + line should be added according to Developer's certificate of + Origin. + See: https://www.kernel.org/doc/html/latest/process/submitting-patches.html#sign-your-work-the-developer-s-certificate-of-origin + + **NO_AUTHOR_SIGN_OFF** + The author of the patch has not signed off the patch. It is + required that a simple sign off line should be present at the + end of explanation of the patch to denote that the author has + written it or otherwise has the rights to pass it on as an open + source patch. + See: https://www.kernel.org/doc/html/latest/process/submitting-patches.html#sign-your-work-the-developer-s-certificate-of-origin + + **DIFF_IN_COMMIT_MSG** + Avoid having diff content in commit message. + This causes problems when one tries to apply a file containing both + the changelog and the diff because patch(1) tries to apply the diff + which it found in the changelog. + See: https://lore.kernel.org/lkml/20150611134006.9df79a893e3636019ad2759e@linux-foundation.org/ + + **GERRIT_CHANGE_ID** + To be picked up by gerrit, the footer of the commit message might + have a Change-Id like:: + + Change-Id: Ic8aaa0728a43936cd4c6e1ed590e01ba8f0fbf5b + Signed-off-by: A. U. Thor <author@example.com> + + The Change-Id line must be removed before submitting. + + **GIT_COMMIT_ID** + The proper way to reference a commit id is: + commit <12+ chars of sha1> ("<title line>") + + An example may be:: + + Commit e21d2170f36602ae2708 ("video: remove unnecessary + platform_set_drvdata()") removed the unnecessary + platform_set_drvdata(), but left the variable "dev" unused, + delete it. + + See: https://www.kernel.org/doc/html/latest/process/submitting-patches.html#describe-your-changes + + +Comparison style +---------------- + + **ASSIGN_IN_IF** + Do not use assignments in if condition. + Example:: + + if ((foo = bar(...)) < BAZ) { + + should be written as:: + + foo = bar(...); + if (foo < BAZ) { + + **BOOL_COMPARISON** + Comparisons of A to true and false are better written + as A and !A. + See: https://lore.kernel.org/lkml/1365563834.27174.12.camel@joe-AO722/ + + **COMPARISON_TO_NULL** + Comparisons to NULL in the form (foo == NULL) or (foo != NULL) + are better written as (!foo) and (foo). + + **CONSTANT_COMPARISON** + Comparisons with a constant or upper case identifier on the left + side of the test should be avoided. + + +Macros, Attributes and Symbols +------------------------------ + + **ARRAY_SIZE** + The ARRAY_SIZE(foo) macro should be preferred over + sizeof(foo)/sizeof(foo[0]) for finding number of elements in an + array. + + The macro is defined in include/linux/kernel.h:: + + #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + + **AVOID_EXTERNS** + Function prototypes don't need to be declared extern in .h + files. It's assumed by the compiler and is unnecessary. + + **AVOID_L_PREFIX** + Local symbol names that are prefixed with `.L` should be avoided, + as this has special meaning for the assembler; a symbol entry will + not be emitted into the symbol table. This can prevent `objtool` + from generating correct unwind info. + + Symbols with STB_LOCAL binding may still be used, and `.L` prefixed + local symbol names are still generally usable within a function, + but `.L` prefixed local symbol names should not be used to denote + the beginning or end of code regions via + `SYM_CODE_START_LOCAL`/`SYM_CODE_END` + + **BIT_MACRO** + Defines like: 1 << <digit> could be BIT(digit). + The BIT() macro is defined in include/linux/bitops.h:: + + #define BIT(nr) (1UL << (nr)) + + **CONST_READ_MOSTLY** + When a variable is tagged with the __read_mostly annotation, it is a + signal to the compiler that accesses to the variable will be mostly + reads and rarely(but NOT never) a write. + + const __read_mostly does not make any sense as const data is already + read-only. The __read_mostly annotation thus should be removed. + + **DATE_TIME** + It is generally desirable that building the same source code with + the same set of tools is reproducible, i.e. the output is always + exactly the same. + + The kernel does *not* use the ``__DATE__`` and ``__TIME__`` macros, + and enables warnings if they are used as they can lead to + non-deterministic builds. + See: https://www.kernel.org/doc/html/latest/kbuild/reproducible-builds.html#timestamps + + **DEFINE_ARCH_HAS** + The ARCH_HAS_xyz and ARCH_HAVE_xyz patterns are wrong. + + For big conceptual features use Kconfig symbols instead. And for + smaller things where we have compatibility fallback functions but + want architectures able to override them with optimized ones, we + should either use weak functions (appropriate for some cases), or + the symbol that protects them should be the same symbol we use. + See: https://lore.kernel.org/lkml/CA+55aFycQ9XJvEOsiM3txHL5bjUc8CeKWJNR_H+MiicaddB42Q@mail.gmail.com/ + + **INIT_ATTRIBUTE** + Const init definitions should use __initconst instead of + __initdata. + + Similarly init definitions without const require a separate + use of const. + + **INLINE_LOCATION** + The inline keyword should sit between storage class and type. + + For example, the following segment:: + + inline static int example_function(void) + { + ... + } + + should be:: + + static inline int example_function(void) + { + ... + } + + **MULTISTATEMENT_MACRO_USE_DO_WHILE** + Macros with multiple statements should be enclosed in a + do - while block. Same should also be the case for macros + starting with `if` to avoid logic defects:: + + #define macrofun(a, b, c) \ + do { \ + if (a == 5) \ + do_this(b, c); \ + } while (0) + + See: https://www.kernel.org/doc/html/latest/process/coding-style.html#macros-enums-and-rtl + + **WEAK_DECLARATION** + Using weak declarations like __attribute__((weak)) or __weak + can have unintended link defects. Avoid using them. + + +Functions and Variables +----------------------- + + **CAMELCASE** + Avoid CamelCase Identifiers. + See: https://www.kernel.org/doc/html/latest/process/coding-style.html#naming + + **FUNCTION_WITHOUT_ARGS** + Function declarations without arguments like:: + + int foo() + + should be:: + + int foo(void) + + **GLOBAL_INITIALISERS** + Global variables should not be initialized explicitly to + 0 (or NULL, false, etc.). Your compiler (or rather your + loader, which is responsible for zeroing out the relevant + sections) automatically does it for you. + + **INITIALISED_STATIC** + Static variables should not be initialized explicitly to zero. + Your compiler (or rather your loader) automatically does + it for you. + + **RETURN_PARENTHESES** + return is not a function and as such doesn't need parentheses:: + + return (bar); + + can simply be:: + + return bar; + + +Spacing and Brackets +-------------------- + + **ASSIGNMENT_CONTINUATIONS** + Assignment operators should not be written at the start of a + line but should follow the operand at the previous line. + + **BRACES** + The placement of braces is stylistically incorrect. + The preferred way is to put the opening brace last on the line, + and put the closing brace first:: + + if (x is true) { + we do y + } + + This applies for all non-functional blocks. + However, there is one special case, namely functions: they have the + opening brace at the beginning of the next line, thus:: + + int function(int x) + { + body of function + } + + See: https://www.kernel.org/doc/html/latest/process/coding-style.html#placing-braces-and-spaces + + **BRACKET_SPACE** + Whitespace before opening bracket '[' is prohibited. + There are some exceptions: + + 1. With a type on the left:: + + ;int [] a; + + 2. At the beginning of a line for slice initialisers:: + + [0...10] = 5, + + 3. Inside a curly brace:: + + = { [0...10] = 5 } + + **CODE_INDENT** + Code indent should use tabs instead of spaces. + Outside of comments, documentation and Kconfig, + spaces are never used for indentation. + See: https://www.kernel.org/doc/html/latest/process/coding-style.html#indentation + + **CONCATENATED_STRING** + Concatenated elements should have a space in between. + Example:: + + printk(KERN_INFO"bar"); + + should be:: + + printk(KERN_INFO "bar"); + + **ELSE_AFTER_BRACE** + `else {` should follow the closing block `}` on the same line. + See: https://www.kernel.org/doc/html/latest/process/coding-style.html#placing-braces-and-spaces + + **LINE_SPACING** + Vertical space is wasted given the limited number of lines an + editor window can display when multiple blank lines are used. + See: https://www.kernel.org/doc/html/latest/process/coding-style.html#spaces + + **OPEN_BRACE** + The opening brace should be following the function definitions on the + next line. For any non-functional block it should be on the same line + as the last construct. + See: https://www.kernel.org/doc/html/latest/process/coding-style.html#placing-braces-and-spaces + + **POINTER_LOCATION** + When using pointer data or a function that returns a pointer type, + the preferred use of * is adjacent to the data name or function name + and not adjacent to the type name. + Examples:: + + char *linux_banner; + unsigned long long memparse(char *ptr, char **retptr); + char *match_strdup(substring_t *s); + + See: https://www.kernel.org/doc/html/latest/process/coding-style.html#spaces + + **SPACING** + Whitespace style used in the kernel sources is described in kernel docs. + See: https://www.kernel.org/doc/html/latest/process/coding-style.html#spaces + + **SWITCH_CASE_INDENT_LEVEL** + switch should be at the same indent as case. + Example:: + + switch (suffix) { + case 'G': + case 'g': + mem <<= 30; + break; + case 'M': + case 'm': + mem <<= 20; + break; + case 'K': + case 'k': + mem <<= 10; + /* fall through */ + default: + break; + } + + See: https://www.kernel.org/doc/html/latest/process/coding-style.html#indentation + + **TRAILING_WHITESPACE** + Trailing whitespace should always be removed. + Some editors highlight the trailing whitespace and cause visual + distractions when editing files. + See: https://www.kernel.org/doc/html/latest/process/coding-style.html#spaces + + **WHILE_AFTER_BRACE** + while should follow the closing bracket on the same line:: + + do { + ... + } while(something); + + See: https://www.kernel.org/doc/html/latest/process/coding-style.html#placing-braces-and-spaces + + +Others +------ + + **CONFIG_DESCRIPTION** + Kconfig symbols should have a help text which fully describes + it. + + **CORRUPTED_PATCH** + The patch seems to be corrupted or lines are wrapped. + Please regenerate the patch file before sending it to the maintainer. + + **DOS_LINE_ENDINGS** + For DOS-formatted patches, there are extra ^M symbols at the end of + the line. These should be removed. + + **EXECUTE_PERMISSIONS** + There is no reason for source files to be executable. The executable + bit can be removed safely. + + **NON_OCTAL_PERMISSIONS** + Permission bits should use 4 digit octal permissions (like 0700 or 0444). + Avoid using any other base like decimal. + + **NOT_UNIFIED_DIFF** + The patch file does not appear to be in unified-diff format. Please + regenerate the patch file before sending it to the maintainer. + + **PRINTF_0XDECIMAL** + Prefixing 0x with decimal output is defective and should be corrected. + + **TRAILING_STATEMENTS** + Trailing statements (for example after any conditional) should be + on the next line. + Like:: + + if (x == y) break; + + should be:: + + if (x == y) + break; diff --git a/Documentation/dev-tools/gcov.rst b/Documentation/dev-tools/gcov.rst index 9e989baae1547ad51a09796fe28c6ad35e77b372..5fce2b06f22954c3ac6e7d7118064f015624c4a9 100644 --- a/Documentation/dev-tools/gcov.rst +++ b/Documentation/dev-tools/gcov.rst @@ -124,6 +124,8 @@ box for setups where kernels are built and run on the same machine. In cases where the kernel runs on a separate machine, special preparations must be made, depending on where the gcov tool is used: +.. _gcov-test: + a) gcov is run on the TEST machine The gcov tool version on the test machine must be compatible with the @@ -143,6 +145,8 @@ a) gcov is run on the TEST machine machine. If any of the path components is symbolic link, the actual directory needs to be used instead (due to make's CURDIR handling). +.. _gcov-build: + b) gcov is run on the BUILD machine The following files need to be copied after each test case from test @@ -211,7 +215,7 @@ Appendix A: gather_on_build.sh ------------------------------ Sample script to gather coverage meta files on the build machine -(see 6a): +(see :ref:`Separated build and test machines a. <gcov-test>`): .. code-block:: sh @@ -244,7 +248,7 @@ Appendix B: gather_on_test.sh ----------------------------- Sample script to gather coverage data files on the test machine -(see 6b): +(see :ref:`Separated build and test machines b. <gcov-build>`): .. code-block:: sh diff --git a/Documentation/dev-tools/index.rst b/Documentation/dev-tools/index.rst index 1b1cf4f5c9d9038efca1243a78fe47035864f1b1..010a2af1e7d9ebffa59f39481ff620bff6552746 100644 --- a/Documentation/dev-tools/index.rst +++ b/Documentation/dev-tools/index.rst @@ -7,6 +7,9 @@ be used to work on the kernel. For now, the documents have been pulled together without any significant effort to integrate them into a coherent whole; patches welcome! +A brief overview of testing-specific tools can be found in +Documentation/dev-tools/testing-overview.rst + .. class:: toc-title Table of contents @@ -14,6 +17,8 @@ whole; patches welcome! .. toctree:: :maxdepth: 2 + testing-overview + checkpatch coccinelle sparse kcov diff --git a/Documentation/dev-tools/testing-overview.rst b/Documentation/dev-tools/testing-overview.rst new file mode 100644 index 0000000000000000000000000000000000000000..b5b46709969ce97611c905a98c96c7c724725a50 --- /dev/null +++ b/Documentation/dev-tools/testing-overview.rst @@ -0,0 +1,117 @@ +.. SPDX-License-Identifier: GPL-2.0 + +==================== +Kernel Testing Guide +==================== + + +There are a number of different tools for testing the Linux kernel, so knowing +when to use each of them can be a challenge. This document provides a rough +overview of their differences, and how they fit together. + + +Writing and Running Tests +========================= + +The bulk of kernel tests are written using either the kselftest or KUnit +frameworks. These both provide infrastructure to help make running tests and +groups of tests easier, as well as providing helpers to aid in writing new +tests. + +If you're looking to verify the behaviour of the Kernel — particularly specific +parts of the kernel — then you'll want to use KUnit or kselftest. + + +The Difference Between KUnit and kselftest +------------------------------------------ + +KUnit (Documentation/dev-tools/kunit/index.rst) is an entirely in-kernel system +for "white box" testing: because test code is part of the kernel, it can access +internal structures and functions which aren't exposed to userspace. + +KUnit tests therefore are best written against small, self-contained parts +of the kernel, which can be tested in isolation. This aligns well with the +concept of 'unit' testing. + +For example, a KUnit test might test an individual kernel function (or even a +single codepath through a function, such as an error handling case), rather +than a feature as a whole. + +This also makes KUnit tests very fast to build and run, allowing them to be +run frequently as part of the development process. + +There is a KUnit test style guide which may give further pointers in +Documentation/dev-tools/kunit/style.rst + + +kselftest (Documentation/dev-tools/kselftest.rst), on the other hand, is +largely implemented in userspace, and tests are normal userspace scripts or +programs. + +This makes it easier to write more complicated tests, or tests which need to +manipulate the overall system state more (e.g., spawning processes, etc.). +However, it's not possible to call kernel functions directly from kselftest. +This means that only kernel functionality which is exposed to userspace somehow +(e.g. by a syscall, device, filesystem, etc.) can be tested with kselftest. To +work around this, some tests include a companion kernel module which exposes +more information or functionality. If a test runs mostly or entirely within the +kernel, however, KUnit may be the more appropriate tool. + +kselftest is therefore suited well to tests of whole features, as these will +expose an interface to userspace, which can be tested, but not implementation +details. This aligns well with 'system' or 'end-to-end' testing. + +For example, all new system calls should be accompanied by kselftest tests. + +Code Coverage Tools +=================== + +The Linux Kernel supports two different code coverage measurement tools. These +can be used to verify that a test is executing particular functions or lines +of code. This is useful for determining how much of the kernel is being tested, +and for finding corner-cases which are not covered by the appropriate test. + +:doc:`gcov` is GCC's coverage testing tool, which can be used with the kernel +to get global or per-module coverage. Unlike KCOV, it does not record per-task +coverage. Coverage data can be read from debugfs, and interpreted using the +usual gcov tooling. + +:doc:`kcov` is a feature which can be built in to the kernel to allow +capturing coverage on a per-task level. It's therefore useful for fuzzing and +other situations where information about code executed during, for example, a +single syscall is useful. + + +Dynamic Analysis Tools +====================== + +The kernel also supports a number of dynamic analysis tools, which attempt to +detect classes of issues when they occur in a running kernel. These typically +each look for a different class of bugs, such as invalid memory accesses, +concurrency issues such as data races, or other undefined behaviour like +integer overflows. + +Some of these tools are listed below: + +* kmemleak detects possible memory leaks. See + Documentation/dev-tools/kmemleak.rst +* KASAN detects invalid memory accesses such as out-of-bounds and + use-after-free errors. See Documentation/dev-tools/kasan.rst +* UBSAN detects behaviour that is undefined by the C standard, like integer + overflows. See Documentation/dev-tools/ubsan.rst +* KCSAN detects data races. See Documentation/dev-tools/kcsan.rst +* KFENCE is a low-overhead detector of memory issues, which is much faster than + KASAN and can be used in production. See Documentation/dev-tools/kfence.rst +* lockdep is a locking correctness validator. See + Documentation/locking/lockdep-design.rst +* There are several other pieces of debug instrumentation in the kernel, many + of which can be found in lib/Kconfig.debug + +These tools tend to test the kernel as a whole, and do not "pass" like +kselftest or KUnit tests. They can be combined with KUnit or kselftest by +running tests on a kernel with these tools enabled: you can then be sure +that none of these errors are occurring during the test. + +Some of these tools integrate with KUnit or kselftest and will +automatically fail tests if an issue is detected. + diff --git a/Documentation/devicetree/bindings/submitting-patches.rst b/Documentation/devicetree/bindings/submitting-patches.rst index 68129ff09967d5d76010494bb094506ca5420f3d..1d11c25249ff546513864f32bb2dfef769923b96 100644 --- a/Documentation/devicetree/bindings/submitting-patches.rst +++ b/Documentation/devicetree/bindings/submitting-patches.rst @@ -75,8 +75,8 @@ II. For kernel maintainers binding, and it hasn't received an Acked-by from the devicetree maintainers after a few weeks, go ahead and take it. - Subsystem bindings (anything affecting more than a single device) - then getting a devicetree maintainer to review it is required. + For subsystem bindings (anything affecting more than a single device), + getting a devicetree maintainer to review it is required. 3) For a series going though multiple trees, the binding patch should be kept with the driver using the binding. diff --git a/Documentation/driver-api/driver-model/class.rst b/Documentation/driver-api/driver-model/class.rst deleted file mode 100644 index fff55b80e86a54a452ea8e191f55de29c7731903..0000000000000000000000000000000000000000 --- a/Documentation/driver-api/driver-model/class.rst +++ /dev/null @@ -1,149 +0,0 @@ -============== -Device Classes -============== - -Introduction -~~~~~~~~~~~~ -A device class describes a type of device, like an audio or network -device. The following device classes have been identified: - -<Insert List of Device Classes Here> - - -Each device class defines a set of semantics and a programming interface -that devices of that class adhere to. Device drivers are the -implementation of that programming interface for a particular device on -a particular bus. - -Device classes are agnostic with respect to what bus a device resides -on. - - -Programming Interface -~~~~~~~~~~~~~~~~~~~~~ -The device class structure looks like:: - - - typedef int (*devclass_add)(struct device *); - typedef void (*devclass_remove)(struct device *); - -See the kerneldoc for the struct class. - -A typical device class definition would look like:: - - struct device_class input_devclass = { - .name = "input", - .add_device = input_add_device, - .remove_device = input_remove_device, - }; - -Each device class structure should be exported in a header file so it -can be used by drivers, extensions and interfaces. - -Device classes are registered and unregistered with the core using:: - - int devclass_register(struct device_class * cls); - void devclass_unregister(struct device_class * cls); - - -Devices -~~~~~~~ -As devices are bound to drivers, they are added to the device class -that the driver belongs to. Before the driver model core, this would -typically happen during the driver's probe() callback, once the device -has been initialized. It now happens after the probe() callback -finishes from the core. - -The device is enumerated in the class. Each time a device is added to -the class, the class's devnum field is incremented and assigned to the -device. The field is never decremented, so if the device is removed -from the class and re-added, it will receive a different enumerated -value. - -The class is allowed to create a class-specific structure for the -device and store it in the device's class_data pointer. - -There is no list of devices in the device class. Each driver has a -list of devices that it supports. The device class has a list of -drivers of that particular class. To access all of the devices in the -class, iterate over the device lists of each driver in the class. - - -Device Drivers -~~~~~~~~~~~~~~ -Device drivers are added to device classes when they are registered -with the core. A driver specifies the class it belongs to by setting -the struct device_driver::devclass field. - - -sysfs directory structure -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -There is a top-level sysfs directory named 'class'. - -Each class gets a directory in the class directory, along with two -default subdirectories:: - - class/ - `-- input - |-- devices - `-- drivers - - -Drivers registered with the class get a symlink in the drivers/ directory -that points to the driver's directory (under its bus directory):: - - class/ - `-- input - |-- devices - `-- drivers - `-- usb:usb_mouse -> ../../../bus/drivers/usb_mouse/ - - -Each device gets a symlink in the devices/ directory that points to the -device's directory in the physical hierarchy:: - - class/ - `-- input - |-- devices - | `-- 1 -> ../../../root/pci0/00:1f.0/usb_bus/00:1f.2-1:0/ - `-- drivers - - -Exporting Attributes -~~~~~~~~~~~~~~~~~~~~ - -:: - - struct devclass_attribute { - struct attribute attr; - ssize_t (*show)(struct device_class *, char * buf, size_t count, loff_t off); - ssize_t (*store)(struct device_class *, const char * buf, size_t count, loff_t off); - }; - -Class drivers can export attributes using the DEVCLASS_ATTR macro that works -similarly to the DEVICE_ATTR macro for devices. For example, a definition -like this:: - - static DEVCLASS_ATTR(debug,0644,show_debug,store_debug); - -is equivalent to declaring:: - - static devclass_attribute devclass_attr_debug; - -The bus driver can add and remove the attribute from the class's -sysfs directory using:: - - int devclass_create_file(struct device_class *, struct devclass_attribute *); - void devclass_remove_file(struct device_class *, struct devclass_attribute *); - -In the example above, the file will be named 'debug' in placed in the -class's directory in sysfs. - - -Interfaces -~~~~~~~~~~ -There may exist multiple mechanisms for accessing the same device of a -particular class type. Device interfaces describe these mechanisms. - -When a device is added to a device class, the core attempts to add it -to every interface that is registered with the device class. diff --git a/Documentation/driver-api/driver-model/device.rst b/Documentation/driver-api/driver-model/device.rst index b9b022371e856e831a4c080cbea63e104b97cb01..0833be568b06cacefbeb39e200103946d6f68b2b 100644 --- a/Documentation/driver-api/driver-model/device.rst +++ b/Documentation/driver-api/driver-model/device.rst @@ -63,8 +63,14 @@ Attributes are declared using a macro called DEVICE_ATTR:: Example::: - static DEVICE_ATTR(type, 0444, show_type, NULL); - static DEVICE_ATTR(power, 0644, show_power, store_power); + static DEVICE_ATTR(type, 0444, type_show, NULL); + static DEVICE_ATTR(power, 0644, power_show, power_store); + +Helper macros are available for common values of mode, so the above examples +can be simplified to::: + + static DEVICE_ATTR_RO(type); + static DEVICE_ATTR_RW(power); This declares two structures of type struct device_attribute with respective names 'dev_attr_type' and 'dev_attr_power'. These two attributes can be @@ -76,19 +82,24 @@ organized as follows into a group:: NULL, }; - static struct attribute_group dev_attr_group = { + static struct attribute_group dev_group = { .attrs = dev_attrs, }; - static const struct attribute_group *dev_attr_groups[] = { - &dev_attr_group, + static const struct attribute_group *dev_groups[] = { + &dev_group, NULL, }; +A helper macro is available for the common case of a single group, so the +above two structures can be declared using::: + + ATTRIBUTE_GROUPS(dev); + This array of groups can then be associated with a device by setting the group pointer in struct device before device_register() is invoked:: - dev->groups = dev_attr_groups; + dev->groups = dev_groups; device_register(dev); The device_register() function will use the 'groups' pointer to create the diff --git a/Documentation/driver-api/driver-model/index.rst b/Documentation/driver-api/driver-model/index.rst index 755016422269fb6e01ec3896d622b6f2949c6ffc..4831bdd92e5cd42affef81e5d13af14b10e2f39b 100644 --- a/Documentation/driver-api/driver-model/index.rst +++ b/Documentation/driver-api/driver-model/index.rst @@ -7,7 +7,6 @@ Driver Model binding bus - class design-patterns device devres diff --git a/Documentation/driver-api/gpio/intro.rst b/Documentation/driver-api/gpio/intro.rst index 94dd7185e76eb5df0051f0cd04bf52586f9e2b33..2e924fb5b3d536d5543ac4a92e01e2b5dd11e808 100644 --- a/Documentation/driver-api/gpio/intro.rst +++ b/Documentation/driver-api/gpio/intro.rst @@ -27,7 +27,7 @@ What is a GPIO? =============== A "General Purpose Input/Output" (GPIO) is a flexible software-controlled -digital signal. They are provided from many kinds of chip, and are familiar +digital signal. They are provided from many kinds of chips, and are familiar to Linux developers working with embedded and custom hardware. Each GPIO represents a bit connected to a particular pin, or "ball" on Ball Grid Array (BGA) packages. Board schematics show which external hardware connects to diff --git a/Documentation/fb/fbcon.rst b/Documentation/fb/fbcon.rst index 57f66de2f7e167666267d23ac6a327f3ed91c2d4..212f7003cfbab2683174ea4181416532e85be0c7 100644 --- a/Documentation/fb/fbcon.rst +++ b/Documentation/fb/fbcon.rst @@ -207,9 +207,9 @@ Documentation/driver-api/console.rst. To summarize: Echo a value to the bind file that represents the framebuffer console driver. So assuming vtcon1 represents fbcon, then:: - echo 1 > sys/class/vtconsole/vtcon1/bind - attach framebuffer console to + echo 1 > /sys/class/vtconsole/vtcon1/bind - attach framebuffer console to console layer - echo 0 > sys/class/vtconsole/vtcon1/bind - detach framebuffer console from + echo 0 > /sys/class/vtconsole/vtcon1/bind - detach framebuffer console from console layer If fbcon is detached from the console layer, your boot console driver (which is diff --git a/Documentation/features/arch-support.txt b/Documentation/features/arch-support.txt index d22a1095e661c0578c76fd94131e5fe50855a691..118ae031840b7e5a9a42d920cbe1dcaae0defb29 100644 --- a/Documentation/features/arch-support.txt +++ b/Documentation/features/arch-support.txt @@ -8,4 +8,5 @@ The meaning of entries in the tables is: | ok | # feature supported by the architecture |TODO| # feature not yet supported by the architecture | .. | # feature cannot be supported by the hardware + | N/A| # feature doesn't apply to the architecture diff --git a/Documentation/features/vm/TLB/arch-support.txt b/Documentation/features/vm/TLB/arch-support.txt index 48a5ca54839935e4f7721824de4358491cf738e2..e1c3a4c4d107a8afa4c2318d7a3be02ffbad826f 100644 --- a/Documentation/features/vm/TLB/arch-support.txt +++ b/Documentation/features/vm/TLB/arch-support.txt @@ -9,7 +9,7 @@ | alpha: | TODO | | arc: | TODO | | arm: | TODO | - | arm64: | TODO | + | arm64: | N/A | | csky: | TODO | | h8300: | .. | | hexagon: | TODO | diff --git a/Documentation/filesystems/api-summary.rst b/Documentation/filesystems/api-summary.rst index a94f17d9b8365fddc44eb32df1fc50507e908577..7e5c04c9861984dd022edda99e2ef142e60c2cdc 100644 --- a/Documentation/filesystems/api-summary.rst +++ b/Documentation/filesystems/api-summary.rst @@ -101,6 +101,9 @@ Other Functions .. kernel-doc:: fs/xattr.c :export: +.. kernel-doc:: fs/namespace.c + :export: + The proc filesystem =================== @@ -122,6 +125,12 @@ Events based on file descriptors .. kernel-doc:: fs/eventfd.c :export: +eventpoll (epoll) interfaces +============================ + +.. kernel-doc:: fs/eventpoll.c + :internal: + The Filesystem for Exporting Kernel Objects =========================================== diff --git a/Documentation/filesystems/proc.rst b/Documentation/filesystems/proc.rst index 48fbfc336ebfd420ac37d27064e2eaa787b48371..81bfe3c800ccffb2859dc93b2f899b7e75a3270c 100644 --- a/Documentation/filesystems/proc.rst +++ b/Documentation/filesystems/proc.rst @@ -540,7 +540,9 @@ encoded manner. The codes are the following: ac area is accountable nr swap space is not reserved for the area ht area uses huge tlb pages + sf synchronous page fault ar architecture specific flag + wf wipe on fork dd do not include area into core dump sd soft dirty flag mm mixed map area @@ -549,6 +551,8 @@ encoded manner. The codes are the following: mg mergable advise flag bt arm64 BTI guarded page mt arm64 MTE allocation tags are enabled + um userfaultfd missing tracking + uw userfaultfd wr-protect tracking == ======================================= Note that there is no guarantee that every flag and associated mnemonic will diff --git a/Documentation/filesystems/vfat.rst b/Documentation/filesystems/vfat.rst index e85d74e912956f25a9fe7ddc55f3b165311c4574..760a4d83fdf9273fe3702d4ff1c181bd8cf1137a 100644 --- a/Documentation/filesystems/vfat.rst +++ b/Documentation/filesystems/vfat.rst @@ -189,7 +189,7 @@ VFAT MOUNT OPTIONS **discard** If set, issues discard/TRIM commands to the block device when blocks are freed. This is useful for SSD devices - and sparse/thinly-provisoned LUNs. + and sparse/thinly-provisioned LUNs. **nfs=stale_rw|nostale_ro** Enable this only if you want to export the FAT filesystem diff --git a/Documentation/hid/intel-ish-hid.rst b/Documentation/hid/intel-ish-hid.rst index f6ce44ff611df775f0ae0ac33f78a7b0159201b7..7a851252267ae75f252c166fe2c27ab7dfb565fb 100644 --- a/Documentation/hid/intel-ish-hid.rst +++ b/Documentation/hid/intel-ish-hid.rst @@ -345,7 +345,7 @@ Documentation/ABI/testing/sysfs-bus-iio for IIO ABIs to user space. To debug ISH, event tracing mechanism is used. To enable debug logs:: echo 1 > /sys/kernel/debug/tracing/events/intel_ish/enable - cat sys/kernel/debug/tracing/trace + cat /sys/kernel/debug/tracing/trace 3.8 ISH IIO sysfs Example on Lenovo thinkpad Yoga 260 ----------------------------------------------------- diff --git a/Documentation/index.rst b/Documentation/index.rst index 31f2adc8542dcef0a76995a3fad2ddf473919b71..54ce34fd6fbdaf863ad87588d1fb86c3d0a8ce19 100644 --- a/Documentation/index.rst +++ b/Documentation/index.rst @@ -149,27 +149,11 @@ Architecture-agnostic documentation Architecture-specific documentation ----------------------------------- -These books provide programming details about architecture-specific -implementation. - .. toctree:: :maxdepth: 2 - arm/index - arm64/index - ia64/index - m68k/index - mips/index - nios2/index - openrisc/index - parisc/index - powerpc/index - riscv/index - s390/index - sh/index - sparc/index - x86/index - xtensa/index + arch + Other documentation ------------------- diff --git a/Documentation/input/event-codes.rst b/Documentation/input/event-codes.rst index 3118fc1c1e26bc50640ec478d65f3ca1c9e39868..b24ae7d292cc191f8da0103c9de6fa56fcea4ce2 100644 --- a/Documentation/input/event-codes.rst +++ b/Documentation/input/event-codes.rst @@ -246,9 +246,9 @@ A few EV_ABS codes have special meanings: A device should set the resolution of the axis to indicate whether the pressure is in measurable units. If the resolution is zero, the - pressure data is in arbitrary units. If the resolution is nonzero, the + pressure data is in arbitrary units. If the resolution is non-zero, the pressure data is in units/gram. For example, a value of 10 with a - resolution of 1 represents 10 gram, a value of 10 with a resolution on + resolution of 1 represents 10 gram, a value of 10 with a resolution of 1000 represents 10 microgram. EV_SW @@ -344,7 +344,7 @@ INPUT_PROP_BUTTONPAD For touchpads where the button is placed beneath the surface, such that pressing down on the pad causes a button click, this property should be -set. Common in clickpad notebooks and macbooks from 2009 and onwards. +set. Common in Clickpad notebooks and Macbooks from 2009 and onwards. Originally, the buttonpad property was coded into the bcm5974 driver version field under the name integrated button. For backwards @@ -356,7 +356,7 @@ INPUT_PROP_SEMI_MT Some touchpads, most common between 2008 and 2011, can detect the presence of multiple contacts without resolving the individual positions; only the number of contacts and a rectangular shape is known. For such -touchpads, the semi-mt property should be set. +touchpads, the SEMI_MT property should be set. Depending on the device, the rectangle may enclose all touches, like a bounding box, or just some of them, for instance the two most recent @@ -394,7 +394,7 @@ Guidelines ========== The guidelines below ensure proper single-touch and multi-finger functionality. -For multi-touch functionality, see the multi-touch-protocol.txt document for +For multi-touch functionality, see the multi-touch-protocol.rst document for more information. Mice diff --git a/Documentation/input/ff.rst b/Documentation/input/ff.rst index 0c02e87ee86d517a8bcba9d196cbf2e877e47fcb..5a1da42c33b3106e0f1a37e83b1d8e9274d4e87d 100644 --- a/Documentation/input/ff.rst +++ b/Documentation/input/ff.rst @@ -16,8 +16,8 @@ goal is not to support these devices as if they were simple input-only devices (as it is already the case), but to really enable the rendering of force effects. This document only describes the force feedback part of the Linux input -interface. Please read joystick.txt and input.txt before reading further this -document. +interface. Please read joydev/joystick.rst and input.rst before reading further +this document. Instructions to the user ~~~~~~~~~~~~~~~~~~~~~~~~ @@ -36,7 +36,7 @@ should keep a hand on your device, in order to avoid it to break down if something goes wrong. If you have a serial iforce device, you need to start inputattach. See -joystick.txt for details. +joydev/joystick.rst for details. Does it work ? -------------- diff --git a/Documentation/input/gameport-programming.rst b/Documentation/input/gameport-programming.rst index c96911df1c54afbdc97780becb7be50f4c752c1b..7d7063ad0f9fd69beb94a195998d8187798a8ab7 100644 --- a/Documentation/input/gameport-programming.rst +++ b/Documentation/input/gameport-programming.rst @@ -21,7 +21,7 @@ choose which one to program the hardware to, starting from the more exotic addresses is preferred, because the likelihood of clashing with the standard 0x201 address is smaller. -Eg. if your driver supports addresses 0x200, 0x208, 0x210 and 0x218, then +E.g. if your driver supports addresses 0x200, 0x208, 0x210 and 0x218, then 0x218 would be the address of first choice. If your hardware supports a gameport address that is not mapped to ISA io @@ -78,7 +78,7 @@ the gameport. To register a cooked gameport:: for (i = 0; i < 4; i++) axes[i] = my_mmio[i]; - buttons[i] = my_mmio[4]; + buttons[0] = my_mmio[4]; } int my_open(struct gameport *gameport, int mode) @@ -117,25 +117,28 @@ Simple:: The gameport structure ~~~~~~~~~~~~~~~~~~~~~~ -.. note:: - - This section is outdated. There are several fields here that don't - match what's there at include/linux/gameport.h. - :: struct gameport { - void *private; + void *port_data; A private pointer for free use in the gameport driver. (Not the joystick driver!) :: - int number; + char name[32]; + +Driver's name as set by driver calling gameport_set_name(). Informational +purpose only. + +:: + + char phys[32]; -Number assigned to the gameport when registered. Informational purpose only. +gameport's physical name/description as set by driver calling gameport_set_phys(). +Informational purpose only. :: @@ -210,8 +213,16 @@ gameport. :: - struct gameport_dev *dev; - struct gameport *next; + struct timer_list poll_timer; + unsigned int poll_interval; /* in msecs */ + spinlock_t timer_lock; + unsigned int poll_cnt; + void (*poll_handler)(struct gameport *); + struct gameport *parent, *child; + struct gameport_driver *drv; + struct mutex drv_mutex; /* protects serio->drv so attributes can pin driver */ + struct device dev; + struct list_head node; For internal use by the gameport layer. diff --git a/Documentation/input/input-programming.rst b/Documentation/input/input-programming.rst index 5938145b0e35d7707b7cfc6ceaf30d0ff5c302cf..2638dce69764cff9495204f3d0b536bfc46b71eb 100644 --- a/Documentation/input/input-programming.rst +++ b/Documentation/input/input-programming.rst @@ -120,7 +120,7 @@ Then there is the:: call to tell those who receive the events that we've sent a complete report. This doesn't seem important in the one button case, but is quite important -for for example mouse movement, where you don't want the X and Y values +for example for mouse movement, where you don't want the X and Y values to be interpreted separately, because that'd result in a different movement. dev->open() and dev->close() @@ -128,7 +128,7 @@ dev->open() and dev->close() In case the driver has to repeatedly poll the device, because it doesn't have an interrupt coming from it and the polling is too expensive to be done -all the time, or if the device uses a valuable resource (eg. interrupt), it +all the time, or if the device uses a valuable resource (e.g. interrupt), it can use the open and close callback to know when it can stop polling or release the interrupt and when it must resume polling or grab the interrupt again. To do that, we would add this to our example driver:: @@ -161,7 +161,7 @@ makes sure that dev->open() is called only when the first user connects to the device and that dev->close() is called when the very last user disconnects. Calls to both callbacks are serialized. -The open() callback should return a 0 in case of success or any nonzero value +The open() callback should return a 0 in case of success or any non-zero value in case of failure. The close() callback (which is void) must always succeed. Inhibiting input devices @@ -182,8 +182,8 @@ providing events to the input core. Calling the device's close() method on inhibit (if there are users) allows the driver to save power. Either by directly powering down the device or by -releasing the runtime-pm reference it got in open() when the driver is using -runtime-pm. +releasing the runtime-PM reference it got in open() when the driver is using +runtime-PM. Inhibiting and uninhibiting are orthogonal to opening and closing the device by input handlers. Userspace might want to inhibit a device in anticipation before @@ -219,8 +219,8 @@ It's reported to the input system via:: input_report_key(struct input_dev *dev, int code, int value) See uapi/linux/input-event-codes.h for the allowable values of code (from 0 to -KEY_MAX). Value is interpreted as a truth value, ie any nonzero value means key -pressed, zero value means key released. The input code generates events only +KEY_MAX). Value is interpreted as a truth value, i.e. any non-zero value means +key pressed, zero value means key released. The input code generates events only in case the value is different from before. In addition to EV_KEY, there are two more basic event types: EV_REL and @@ -231,12 +231,12 @@ because it doesn't have any absolute coordinate system to work in. Absolute events are namely for joysticks and digitizers - devices that do work in an absolute coordinate systems. -Having the device report EV_REL buttons is as simple as with EV_KEY, simply +Having the device report EV_REL buttons is as simple as with EV_KEY; simply set the corresponding bits and call the:: input_report_rel(struct input_dev *dev, int code, int value) -function. Events are generated only for nonzero value. +function. Events are generated only for non-zero values. However EV_ABS requires a little special care. Before calling input_register_device, you have to fill additional fields in the input_dev @@ -280,7 +280,7 @@ device driver. It's a string like 'Generic button device' containing a user friendly name of the device. The id* fields contain the bus ID (PCI, USB, ...), vendor ID and device ID -of the device. The bus IDs are defined in input.h. The vendor and device ids +of the device. The bus IDs are defined in input.h. The vendor and device IDs are defined in pci_ids.h, usb_ids.h and similar include files. These fields should be set by the input device driver before registering it. diff --git a/Documentation/input/input.rst b/Documentation/input/input.rst index 0eb61e67a7b784b0ccb31f17f464363dbaed4f82..2c67fa904adcf902cebf8e7137c0a1609d879a50 100644 --- a/Documentation/input/input.rst +++ b/Documentation/input/input.rst @@ -9,7 +9,7 @@ Introduction Architecture ============ -Input subsystem a collection of drivers that is designed to support +Input subsystem is a collection of drivers that is designed to support all input devices under Linux. Most of the drivers reside in drivers/input, although quite a few live in drivers/hid and drivers/platform. @@ -50,7 +50,7 @@ will be available as a character device on major 13, minor 63:: crw-r--r-- 1 root root 13, 63 Mar 28 22:45 mice -This device usually created automatically by the system. The commands +This device is usually created automatically by the system. The commands to create it by hand are:: cd /dev @@ -180,7 +180,7 @@ whole suite. It handles all HID devices, and because there is a very wide variety of them, and because the USB HID specification isn't simple, it needs to be this big. -Currently, it handles USB mice, joysticks, gamepads, steering wheels +Currently, it handles USB mice, joysticks, gamepads, steering wheels, keyboards, trackballs and digitizers. However, USB uses HID also for monitor controls, speaker controls, UPSs, @@ -268,7 +268,7 @@ events on a read. Their layout is:: }; ``time`` is the timestamp, it returns the time at which the event happened. -Type is for example EV_REL for relative moment, EV_KEY for a keypress or +Type is for example EV_REL for relative movement, EV_KEY for a keypress or release. More types are defined in include/uapi/linux/input-event-codes.h. ``code`` is event code, for example REL_X or KEY_BACKSPACE, again a complete diff --git a/Documentation/input/multi-touch-protocol.rst b/Documentation/input/multi-touch-protocol.rst index 21c1e6a228886136e4f126e88dedc844420c3a90..1085cbee4ee720bf465b804b0ccdafc177b8ff43 100644 --- a/Documentation/input/multi-touch-protocol.rst +++ b/Documentation/input/multi-touch-protocol.rst @@ -261,7 +261,7 @@ ABS_MT_PRESSURE signal intensity distribution. If the resolution is zero, the pressure data is in arbitrary units. - If the resolution is nonzero, the pressure data is in units/gram. See + If the resolution is non-zero, the pressure data is in units/gram. See :ref:`input-event-codes` for details. ABS_MT_DISTANCE @@ -279,14 +279,14 @@ ABS_MT_ORIENTATION max should be returned; when aligned with the X axis in the negative direction, the range -max should be returned. - Touch ellipsis are symmetrical by default. For devices capable of true 360 + Touch ellipses are symmetrical by default. For devices capable of true 360 degree orientation, the reported orientation must exceed the range max to indicate more than a quarter of a revolution. For an upside-down finger, range max * 2 should be returned. Orientation can be omitted if the touch area is circular, or if the information is not available in the kernel driver. Partial orientation - support is possible if the device can distinguish between the two axis, but + support is possible if the device can distinguish between the two axes, but not (uniquely) any values in between. In such cases, the range of ABS_MT_ORIENTATION should be [0, 1] [#f4]_. @@ -356,7 +356,7 @@ The range of ABS_MT_ORIENTATION should be set to [0, 1], to indicate that the device can distinguish between a finger along the Y axis (0) and a finger along the X axis (1). -For win8 devices with both T and C coordinates, the position mapping is:: +For Win8 devices with both T and C coordinates, the position mapping is:: ABS_MT_POSITION_X := T_X ABS_MT_POSITION_Y := T_Y diff --git a/Documentation/input/notifier.rst b/Documentation/input/notifier.rst index 161350cb865ebc78eaf1a94b898c962b047da6d8..824379399e611e46cd5d5ca93922efa974c0094b 100644 --- a/Documentation/input/notifier.rst +++ b/Documentation/input/notifier.rst @@ -4,11 +4,12 @@ Keyboard notifier One can use register_keyboard_notifier to get called back on keyboard events (see kbd_keycode() function for details). The passed structure is -keyboard_notifier_param: +keyboard_notifier_param (see <linux/keyboard.h>): - 'vc' always provide the VC for which the keyboard event applies; - 'down' is 1 for a key press event, 0 for a key release; - 'shift' is the current modifier state, mask bit indexes are KG_*; +- 'ledstate' is the current LED state; - 'value' depends on the type of event. - KBD_KEYCODE events are always sent before other events, value is the keycode. diff --git a/Documentation/input/uinput.rst b/Documentation/input/uinput.rst index 10c62e62a0a62d984c4a7abe554e8d5c1afe3a5e..30fe80e325a5d1ef00932d624306a08180250107 100644 --- a/Documentation/input/uinput.rst +++ b/Documentation/input/uinput.rst @@ -179,7 +179,7 @@ uinput old interface -------------------- Before uinput version 5, there wasn't a dedicated ioctl to set up a virtual -device. Programs supportinf older versions of uinput interface need to fill +device. Programs supporting older versions of uinput interface need to fill a uinput_user_dev structure and write it to the uinput file descriptor to configure the new uinput device. New code should not use the old interface but interact with uinput via ioctl calls, or use libevdev. diff --git a/Documentation/leds/leds-lm3556.rst b/Documentation/leds/leds-lm3556.rst index 1ef17d7d800e0da8c0094c03f4851b6106b99cd3..32e3983473ba472388cf086a5e9a4ff36f7dc138 100644 --- a/Documentation/leds/leds-lm3556.rst +++ b/Documentation/leds/leds-lm3556.rst @@ -23,7 +23,7 @@ from 93.75 mA to 1500 mA.The Flash currents are adjusted via the CURRENT CONTROL REGISTER(0x09).Flash mode is activated by the ENABLE REGISTER(0x0A), or by pulling the STROBE pin HIGH. -LM3556 Flash can be controlled through sys/class/leds/flash/brightness file +LM3556 Flash can be controlled through /sys/class/leds/flash/brightness file * if STROBE pin is enabled, below example control brightness only, and ON / OFF will be controlled by STROBE pin. @@ -32,17 +32,17 @@ Flash Example: OFF:: - #echo 0 > sys/class/leds/flash/brightness + #echo 0 > /sys/class/leds/flash/brightness 93.75 mA:: - #echo 1 > sys/class/leds/flash/brightness + #echo 1 > /sys/class/leds/flash/brightness ... 1500 mA:: - #echo 16 > sys/class/leds/flash/brightness + #echo 16 > /sys/class/leds/flash/brightness Torch Mode ^^^^^^^^^^ @@ -51,7 +51,7 @@ In Torch Mode, the current source(LED) is programmed via the CURRENT CONTROL REGISTER(0x09).Torch Mode is activated by the ENABLE REGISTER(0x0A) or by the hardware TORCH input. -LM3556 torch can be controlled through sys/class/leds/torch/brightness file. +LM3556 torch can be controlled through /sys/class/leds/torch/brightness file. * if TORCH pin is enabled, below example control brightness only, and ON / OFF will be controlled by TORCH pin. @@ -59,22 +59,22 @@ Torch Example: OFF:: - #echo 0 > sys/class/leds/torch/brightness + #echo 0 > /sys/class/leds/torch/brightness 46.88 mA:: - #echo 1 > sys/class/leds/torch/brightness + #echo 1 > /sys/class/leds/torch/brightness ... 375 mA:: - #echo 8 > sys/class/leds/torch/brightness + #echo 8 > /sys/class/leds/torch/brightness Indicator Mode ^^^^^^^^^^^^^^ -Indicator pattern can be set through sys/class/leds/indicator/pattern file, +Indicator pattern can be set through /sys/class/leds/indicator/pattern file, and 4 patterns are pre-defined in indicator_pattern array. According to N-lank, Pulse time and N Period values, different pattern wiill @@ -87,13 +87,13 @@ Indicator pattern example: pattern 0:: - #echo 0 > sys/class/leds/indicator/pattern + #echo 0 > /sys/class/leds/indicator/pattern ... pattern 3:: - #echo 3 > sys/class/leds/indicator/pattern + #echo 3 > /sys/class/leds/indicator/pattern Indicator brightness can be controlled through sys/class/leds/indicator/brightness file. @@ -102,17 +102,17 @@ Example: OFF:: - #echo 0 > sys/class/leds/indicator/brightness + #echo 0 > /sys/class/leds/indicator/brightness 5.86 mA:: - #echo 1 > sys/class/leds/indicator/brightness + #echo 1 > /sys/class/leds/indicator/brightness ... 46.875mA:: - #echo 8 > sys/class/leds/indicator/brightness + #echo 8 > /sys/class/leds/indicator/brightness Notes ----- diff --git a/Documentation/livepatch/shadow-vars.rst b/Documentation/livepatch/shadow-vars.rst index c05715aeafa4e9c844917a8d8a1f2439d34a9c8b..6a7d43a8787d88025ad9fbf759da0505ba4121fa 100644 --- a/Documentation/livepatch/shadow-vars.rst +++ b/Documentation/livepatch/shadow-vars.rst @@ -165,8 +165,8 @@ In-flight parent objects Sometimes it may not be convenient or possible to allocate shadow variables alongside their parent objects. Or a livepatch fix may -require shadow varibles to only a subset of parent object instances. In -these cases, the klp_shadow_get_or_alloc() call can be used to attach +require shadow variables for only a subset of parent object instances. +In these cases, the klp_shadow_get_or_alloc() call can be used to attach shadow variables to parents already in-flight. For commit 1d147bfa6429, a good spot to allocate a shadow spinlock is diff --git a/Documentation/powerpc/booting.rst b/Documentation/powerpc/booting.rst index 2d0ec2ff2b579e1fd743b9ed98912c8863c197d7..11aa440f98cc9cf91f44ef540b94eb8b5f062fb7 100644 --- a/Documentation/powerpc/booting.rst +++ b/Documentation/powerpc/booting.rst @@ -94,7 +94,7 @@ should: a) add your platform support as a _boolean_ option in arch/powerpc/Kconfig, following the example of PPC_PSERIES, - PPC_PMAC and PPC_MAPLE. The later is probably a good + PPC_PMAC and PPC_MAPLE. The latter is probably a good example of a board support to start from. b) create your main platform file as diff --git a/Documentation/powerpc/dawr-power9.rst b/Documentation/powerpc/dawr-power9.rst index c96ab6befd9c1123dbb6b946e433d2f488587019..e55ac6a24b97f944119fc54b7667152392e212c6 100644 --- a/Documentation/powerpc/dawr-power9.rst +++ b/Documentation/powerpc/dawr-power9.rst @@ -4,7 +4,7 @@ DAWR issues on POWER9 On POWER9 the Data Address Watchpoint Register (DAWR) can cause a checkstop if it points to cache inhibited (CI) memory. Currently Linux has no way to -disinguish CI memory when configuring the DAWR, so (for now) the DAWR is +distinguish CI memory when configuring the DAWR, so (for now) the DAWR is disabled by this commit:: commit 9654153158d3e0684a1bdb76dbababdb7111d5a0 diff --git a/Documentation/powerpc/eeh-pci-error-recovery.rst b/Documentation/powerpc/eeh-pci-error-recovery.rst index 438a87ebc09521ea393ba499bba2e1ae8d8990dc..d6643a91bdf8717b4cc5cb175512c515ed5a2ab3 100644 --- a/Documentation/powerpc/eeh-pci-error-recovery.rst +++ b/Documentation/powerpc/eeh-pci-error-recovery.rst @@ -73,7 +73,7 @@ return all-ff's (0xff, 0xffff, 0xffffffff for 8/16/32-bit reads). This value was chosen because it is the same value you would get if the device was physically unplugged from the slot. This includes access to PCI memory, I/O space, and PCI config -space. Interrupts; however, will continued to be delivered. +space. Interrupts; however, will continue to be delivered. Detection and recovery are performed with the aid of ppc64 firmware. The programming interfaces in the Linux kernel diff --git a/Documentation/powerpc/elfnote.rst b/Documentation/powerpc/elfnote.rst index 06602248621cb180467ec9309080e300b913d38f..3ec8d61e9a33fb0cfcf3ba8cb746f4c9ae29fb69 100644 --- a/Documentation/powerpc/elfnote.rst +++ b/Documentation/powerpc/elfnote.rst @@ -8,7 +8,7 @@ capabilities and information which can be used by a bootloader or userland. Types and Descriptors --------------------- -The types to be used with the "PowerPC" namesapce are defined in [#f1]_. +The types to be used with the "PowerPC" namespace are defined in [#f1]_. 1) PPC_ELFNOTE_CAPABILITIES diff --git a/Documentation/powerpc/firmware-assisted-dump.rst b/Documentation/powerpc/firmware-assisted-dump.rst index 20ea8cdee0aa168175bc26e4c9d3dae83eb391e6..e363fc48529a0a7f71dccdc25efa03de29ae438f 100644 --- a/Documentation/powerpc/firmware-assisted-dump.rst +++ b/Documentation/powerpc/firmware-assisted-dump.rst @@ -171,7 +171,7 @@ that were present in CMA region:: (meta area) | | | - Metadata: This area holds a metadata struture whose + Metadata: This area holds a metadata structure whose address is registered with f/w and retrieved in the second kernel after crash, on platforms that support tags (OPAL). Having such structure with info needed @@ -207,7 +207,7 @@ Currently the dump will be copied from /proc/vmcore to a new file upon user intervention. The dump data available through /proc/vmcore will be in ELF format. Hence the existing kdump infrastructure (kdump scripts) to save the dump works fine with minor modifications. KDump scripts on -major Distro releases have already been modified to work seemlessly (no +major Distro releases have already been modified to work seamlessly (no user intervention in saving the dump) when FADump is used, instead of KDump, as dump mechanism. diff --git a/Documentation/powerpc/kaslr-booke32.rst b/Documentation/powerpc/kaslr-booke32.rst index 8b259fdfdf03bbfe6e530249e1ad7c93bd4ebe93..5681c1d1b65b5de80ecc3b9b12e0d6cd8c78e448 100644 --- a/Documentation/powerpc/kaslr-booke32.rst +++ b/Documentation/powerpc/kaslr-booke32.rst @@ -38,5 +38,5 @@ bit of the entropy to decide the index of the 64M zone. Then we chose a kernstart_virt_addr -To enable KASLR, set CONFIG_RANDOMIZE_BASE = y. If KASLR is enable and you +To enable KASLR, set CONFIG_RANDOMIZE_BASE = y. If KASLR is enabled and you want to disable it at runtime, add "nokaslr" to the kernel cmdline. diff --git a/Documentation/powerpc/mpc52xx.rst b/Documentation/powerpc/mpc52xx.rst index 30260707c3fe85db252fcbda7356d21aab4321f7..5243b1763fad0b377508368679a1c8082ffd386d 100644 --- a/Documentation/powerpc/mpc52xx.rst +++ b/Documentation/powerpc/mpc52xx.rst @@ -34,7 +34,7 @@ To compile/use : Some remarks: - The port is named mpc52xxx, and config options are PPC_MPC52xx. The MGT5100 - is not supported, and I'm not sure anyone is interesting in working on it + is not supported, and I'm not sure anyone is interested in working on it so. I didn't took 5xxx because there's apparently a lot of 5xxx that have nothing to do with the MPC5200. I also included the 'MPC' for the same reason. diff --git a/Documentation/powerpc/papr_hcalls.rst b/Documentation/powerpc/papr_hcalls.rst index 48fcf1255a338a2a3a09d18bbe9204bf0ac13292..3d553e8a29374aa79f176356c7200efa40996187 100644 --- a/Documentation/powerpc/papr_hcalls.rst +++ b/Documentation/powerpc/papr_hcalls.rst @@ -40,7 +40,7 @@ and any in-arguments for the hcall are provided in registers *r4-r12*. If values have to be passed through a memory buffer, the data stored in that buffer should be in Big-endian byte order. -Once control is returns back to the guest after hypervisor has serviced the +Once control returns back to the guest after hypervisor has serviced the 'HVCS' instruction the return value of the hcall is available in *r3* and any out values are returned in registers *r4-r12*. Again like in case of in-arguments, any out values stored in a memory buffer will be in Big-endian byte order. @@ -147,7 +147,7 @@ corresponding opcode values please look into the arch specific header [4]_: | Out: *numBytesRead* | Return Value: *H_Success, H_Parameter, H_P2, H_P3, H_Hardware* -Given a DRC Index of an NVDIMM, read N-bytes from the the metadata area +Given a DRC Index of an NVDIMM, read N-bytes from the metadata area associated with it, at a specified offset and copy it to provided buffer. The metadata area stores configuration information such as label information, bad-blocks etc. The metadata area is located out-of-band of NVDIMM storage diff --git a/Documentation/powerpc/transactional_memory.rst b/Documentation/powerpc/transactional_memory.rst index b5b09bf00966f189b9e26c304370d166d984ab3e..040a20675fd14d56f24b92797f85b8a014e5dee0 100644 --- a/Documentation/powerpc/transactional_memory.rst +++ b/Documentation/powerpc/transactional_memory.rst @@ -189,7 +189,7 @@ kernel aborted a transaction: ====================== ================================ These can be checked by the user program's abort handler as TEXASR[0:7]. If -bit 7 is set, it indicates that the error is consider persistent. For example +bit 7 is set, it indicates that the error is considered persistent. For example a TM_CAUSE_ALIGNMENT will be persistent while a TM_CAUSE_RESCHED will not. GDB @@ -271,4 +271,4 @@ with these lines: hrfid and mtmsrd have the same quirk. -The Linux kernel uses this quirk in it's early exception handling. +The Linux kernel uses this quirk in its early exception handling. diff --git a/Documentation/process/submitting-patches.rst b/Documentation/process/submitting-patches.rst index 91de63b201c126ed19551cb2a35c9c29f9d55fe4..c66a19201deb5080ede9af90403acd1f7d239a29 100644 --- a/Documentation/process/submitting-patches.rst +++ b/Documentation/process/submitting-patches.rst @@ -341,6 +341,16 @@ that you have sent your patches to the right place. Wait for a minimum of one week before resubmitting or pinging reviewers - possibly longer during busy times like merge windows. +It's also ok to resend the patch or the patch series after a couple of +weeks with the word "RESEND" added to the subject line:: + + [PATCH Vx RESEND] sub/sys: Condensed patch summary + +Don't add "RESEND" when you are submitting a modified version of your +patch or patch series - "RESEND" only applies to resubmission of a +patch or patch series which have not been modified in any way from the +previous submission. + Include PATCH in the subject ----------------------------- @@ -625,16 +635,19 @@ not considered part of the summary phrase, but describe how the patch should be treated. Common tags might include a version descriptor if the multiple versions of the patch have been sent out in response to comments (i.e., "v1, v2, v3"), or "RFC" to indicate a request for -comments. If there are four patches in a patch series the individual -patches may be numbered like this: 1/4, 2/4, 3/4, 4/4. This assures -that developers understand the order in which the patches should be -applied and that they have reviewed or applied all of the patches in -the patch series. +comments. -A couple of example Subjects:: +If there are four patches in a patch series the individual patches may +be numbered like this: 1/4, 2/4, 3/4, 4/4. This assures that developers +understand the order in which the patches should be applied and that +they have reviewed or applied all of the patches in the patch series. + +Here are some good example Subjects:: Subject: [PATCH 2/5] ext2: improve scalability of bitmap searching Subject: [PATCH v2 01/27] x86: fix eflags tracking + Subject: [PATCH v2] sub/sys: Condensed patch summary + Subject: [PATCH v2 M/N] sub/sys: Condensed patch summary The ``from`` line must be the very first line in the message body, and has the form: @@ -647,34 +660,54 @@ then the ``From:`` line from the email header will be used to determine the patch author in the changelog. The explanation body will be committed to the permanent source -changelog, so should make sense to a competent reader who has long -since forgotten the immediate details of the discussion that might -have led to this patch. Including symptoms of the failure which the -patch addresses (kernel log messages, oops messages, etc.) is -especially useful for people who might be searching the commit logs -looking for the applicable patch. If a patch fixes a compile failure, -it may not be necessary to include _all_ of the compile failures; just -enough that it is likely that someone searching for the patch can find -it. As in the ``summary phrase``, it is important to be both succinct as -well as descriptive. - -The ``---`` marker line serves the essential purpose of marking for patch -handling tools where the changelog message ends. - -One good use for the additional comments after the ``---`` marker is for -a ``diffstat``, to show what files have changed, and the number of -inserted and deleted lines per file. A ``diffstat`` is especially useful -on bigger patches. Other comments relevant only to the moment or the -maintainer, not suitable for the permanent changelog, should also go -here. A good example of such comments might be ``patch changelogs`` -which describe what has changed between the v1 and v2 version of the -patch. - -If you are going to include a ``diffstat`` after the ``---`` marker, please -use ``diffstat`` options ``-p 1 -w 70`` so that filenames are listed from -the top of the kernel source tree and don't use too much horizontal -space (easily fit in 80 columns, maybe with some indentation). (``git`` -generates appropriate diffstats by default.) +changelog, so should make sense to a competent reader who has long since +forgotten the immediate details of the discussion that might have led to +this patch. Including symptoms of the failure which the patch addresses +(kernel log messages, oops messages, etc.) are especially useful for +people who might be searching the commit logs looking for the applicable +patch. The text should be written in such detail so that when read +weeks, months or even years later, it can give the reader the needed +details to grasp the reasoning for **why** the patch was created. + +If a patch fixes a compile failure, it may not be necessary to include +_all_ of the compile failures; just enough that it is likely that +someone searching for the patch can find it. As in the ``summary +phrase``, it is important to be both succinct as well as descriptive. + +The ``---`` marker line serves the essential purpose of marking for +patch handling tools where the changelog message ends. + +One good use for the additional comments after the ``---`` marker is +for a ``diffstat``, to show what files have changed, and the number of +inserted and deleted lines per file. A ``diffstat`` is especially useful +on bigger patches. If you are going to include a ``diffstat`` after the +``---`` marker, please use ``diffstat`` options ``-p 1 -w 70`` so that +filenames are listed from the top of the kernel source tree and don't +use too much horizontal space (easily fit in 80 columns, maybe with some +indentation). (``git`` generates appropriate diffstats by default.) + +Other comments relevant only to the moment or the maintainer, not +suitable for the permanent changelog, should also go here. A good +example of such comments might be ``patch changelogs`` which describe +what has changed between the v1 and v2 version of the patch. + +Please put this information **after** the ``---`` line which separates +the changelog from the rest of the patch. The version information is +not part of the changelog which gets committed to the git tree. It is +additional information for the reviewers. If it's placed above the +commit tags, it needs manual interaction to remove it. If it is below +the separator line, it gets automatically stripped off when applying the +patch:: + + <commit message> + ... + Signed-off-by: Author <author@mail> + --- + V2 -> V3: Removed redundant helper function + V1 -> V2: Cleaned up coding style and addressed review comments + + path/to/file | 5+++-- + ... See more details on the proper patch format in the following references. diff --git a/Documentation/scsi/ChangeLog.megaraid b/Documentation/scsi/ChangeLog.megaraid index d2052fdbedd236d0325f86c2f6df57721fd1322e..cbb329956897cb7470139fc9f05506c2b0516dcb 100644 --- a/Documentation/scsi/ChangeLog.megaraid +++ b/Documentation/scsi/ChangeLog.megaraid @@ -220,7 +220,7 @@ Older Version : 2.20.4.5 (scsi module), 2.20.2.5 (cmm module) 4. Use the pre defined DMA mask constants from dma-mapping.h Use the DMA_{64,32}BIT_MASK constants from dma-mapping.h when calling - pci_set_dma_mask() or pci_set_consistend_dma_mask(). See + pci_set_dma_mask() or pci_set_consistent_dma_mask(). See http://marc.theaimsgroup.com/?t=108001993000001&r=1&w=2 for more details. Signed-off-by: Tobias Klauser <tklauser@nuerscht.ch> diff --git a/Documentation/sphinx/rstFlatTable.py b/Documentation/sphinx/rstFlatTable.py index a3eea0bbe6ba6dc8ead548a6ad20c4a14f25cc43..16bea0632555fcf69c605c8ac07fdc5b048761d5 100755 --- a/Documentation/sphinx/rstFlatTable.py +++ b/Documentation/sphinx/rstFlatTable.py @@ -22,7 +22,7 @@ u""" * *auto span* rightmost cell of a table row over the missing cells on the right side of that table-row. With Option ``:fill-cells:`` this behavior - can changed from *auto span* to *auto fill*, which automaticly inserts + can be changed from *auto span* to *auto fill*, which automatically inserts (empty) cells instead of spanning the last cell. Options: @@ -161,7 +161,7 @@ class ListTableBuilder(object): for colwidth in colwidths: colspec = nodes.colspec(colwidth=colwidth) # FIXME: It seems, that the stub method only works well in the - # absence of rowspan (observed by the html buidler, the docutils-xml + # absence of rowspan (observed by the html builder, the docutils-xml # build seems OK). This is not extraordinary, because there exists # no table directive (except *this* flat-table) which allows to # define coexistent of rowspan and stubs (there was no use-case diff --git a/Documentation/spi/butterfly.rst b/Documentation/spi/butterfly.rst index e614a589547cf7ed7731c294ad6528e2186eb9d5..56088fb090c7302bd88999c6aacee18aadd8978d 100644 --- a/Documentation/spi/butterfly.rst +++ b/Documentation/spi/butterfly.rst @@ -11,7 +11,7 @@ develop firmware for this, and flash it using this adapter cable. You can make this adapter from an old printer cable and solder things directly to the Butterfly. Or (if you have the parts and skills) you -can come up with something fancier, providing ciruit protection to the +can come up with something fancier, providing circuit protection to the Butterfly and the printer port, or with a better power supply than two signal pins from the printer port. Or for that matter, you can use similar cables to talk to many AVR boards, even a breadboard. diff --git a/Documentation/translations/it_IT/doc-guide/sphinx.rst b/Documentation/translations/it_IT/doc-guide/sphinx.rst index 090d2949d345c74f904391f1e3dcb3aac96aab63..0046d75d9a706de49ee54f131d0565c05087bef9 100644 --- a/Documentation/translations/it_IT/doc-guide/sphinx.rst +++ b/Documentation/translations/it_IT/doc-guide/sphinx.rst @@ -330,17 +330,17 @@ la lista di celle che compongono la *riga* stessa. Fanno eccezione i *commenti* - head col 3 - head col 4 - * - column 1 + * - row 1 - field 1.1 - field 1.2 with autospan - * - column 2 + * - row 2 - field 2.1 - :rspan:`1` :cspan:`1` field 2.2 - 3.3 * .. _`it last row`: - - column 3 + - row 3 Che verrà rappresentata nel seguente modo: @@ -352,37 +352,46 @@ Che verrà rappresentata nel seguente modo: - head col 3 - head col 4 - * - column 1 + * - row 1 - field 1.1 - field 1.2 with autospan - * - column 2 + * - row 2 - field 2.1 - :rspan:`1` :cspan:`1` field 2.2 - 3.3 * .. _`it last row`: - - column 3 + - row 3 Riferimenti incrociati ---------------------- -Per fare dei riferimenti incrociati da una pagina ad un'altra -specificando il percorso a partire dalla cartella *Documentation*. -Per esempio, se volete aggiungere un riferimento a questa pagina -(l'estensione .rst è opzionale):: +Aggiungere un riferimento incrociato da una pagina della +documentazione ad un'altra può essere fatto scrivendo il percorso al +file corrispondende, non serve alcuna sintassi speciale. Si possono +usare sia percorsi assoluti che relativi. Quelli assoluti iniziano con +"documentation/". Per esempio, potete fare riferimento a questo +documento in uno dei seguenti modi (da notare che l'estensione +``.rst`` è necessaria):: - See Documentation/translations/it_IT/doc-guide/sphinx.rst. + Vedere Documentation/doc-guide/sphinx.rst. Questo funziona sempre + Guardate pshinx.rst, che si trova nella stessa cartella. + Leggete ../sphinx.rst, che si trova nella cartella precedente. -Se preferite usare un percorso relative allora vi serve la direttiva -Sphinx ``doc``. Per esempio, se volete aggiungere un riferimento a -questa pagina dalla stessa cartella:: +Se volete che il collegamento abbia un testo diverso rispetto al +titolo del documento, allora dovrete usare la direttiva Sphinx +``doc``. Per esempio:: - See :doc:`sphinx`. + Vedere :doc:`il mio testo per il collegamento <sphinx>`. -Per maggiori informazioni su come aggiungere riferimenti incrociati a -commenti kernel-doc di funzioni o tipi, leggete -Documentation/translations/it_IT/doc-guide/sphinx.rst. +Nella maggioranza dei casi si consiglia il primo metodo perché è più +pulito ed adatto a chi legge dai sorgenti. Se incontrare un ``:doc:`` +che non da alcun valore, sentitevi liberi di convertirlo in un +percorso al documento. + +Per informazioni riguardo ai riferimenti incrociati ai commenti +kernel-doc per funzioni o tipi, consultate .. _it_sphinx_kfigure: @@ -391,7 +400,7 @@ Figure ed immagini Se volete aggiungere un'immagine, utilizzate le direttive ``kernel-figure`` e ``kernel-image``. Per esempio, per inserire una figura di un'immagine in -formato SVG:: +formato SVG (:ref:`it_svg_image_example`):: .. kernel-figure:: ../../../doc-guide/svg_image.svg :alt: una semplice immagine SVG diff --git a/Documentation/translations/it_IT/kernel-hacking/hacking.rst b/Documentation/translations/it_IT/kernel-hacking/hacking.rst index 3d30b69f1ec10d1af1f420a8cd6c4b710b445a3a..f6beb385b4acfccd66ff6744a1a988ec51534481 100644 --- a/Documentation/translations/it_IT/kernel-hacking/hacking.rst +++ b/Documentation/translations/it_IT/kernel-hacking/hacking.rst @@ -369,7 +369,7 @@ all'inizio dell'avvio del sistema è attraverso la procedura Prima di inventare la vostra cache per gli oggetti più usati, considerate l'uso di una cache slab disponibile in ``include/linux/slab.h``. -:c:func:`current()` +:c:macro:`current` ------------------- Definita in ``include/asm/current.h`` diff --git a/Documentation/translations/it_IT/kernel-hacking/locking.rst b/Documentation/translations/it_IT/kernel-hacking/locking.rst index bf1acd6204efab7fdde5e265803094180ec29b1a..1e7c84def369239782866f328fa33e89582da6e1 100644 --- a/Documentation/translations/it_IT/kernel-hacking/locking.rst +++ b/Documentation/translations/it_IT/kernel-hacking/locking.rst @@ -127,11 +127,11 @@ il vostro processo si auto-sospenderà ; verrà riattivato quando il mutex verrà rilasciato. Questo significa che il processore potrà occuparsi d'altro mentre il vostro processo è in attesa. Esistono molti casi in cui non potete permettervi di sospendere un processo (vedere -:ref:`Quali funzioni possono essere chiamate in modo sicuro dalle interruzioni? <it_sleeping-things>`) +`Quali funzioni possono essere chiamate in modo sicuro dalle interruzioni?`_) e quindi dovrete utilizzare gli spinlock. Nessuno di questi *lock* è ricorsivo: vedere -:ref:`Stallo: semplice ed avanzato <it_deadlock>` +`Stallo: semplice ed avanzato`_ I *lock* e i kernel per sistemi monoprocessore ---------------------------------------------- @@ -190,7 +190,7 @@ perfetto questa funzione si chiamerebbe 'spin_lock_softirq()'). Da notare che in questo caso potete utilizzare anche spin_lock_irq() o spin_lock_irqsave(), queste fermano anche le interruzioni hardware: -vedere :ref:`Contesto di interruzione hardware <it_hardirq-context>`. +vedere `Contesto di interruzione hardware`_. Questo funziona alla perfezione anche sui sistemi monoprocessore: gli spinlock svaniscono e questa macro diventa semplicemente local_bh_disable() @@ -241,7 +241,7 @@ Lo stesso softirq Lo stesso softirq può essere eseguito su un diverso processore: allo scopo di migliorare le prestazioni potete utilizzare dati riservati ad ogni -processore (vedere :ref:`Dati per processore <it_per-cpu>`). Se siete arrivati +processore (vedere `Dati per processore`_). Se siete arrivati fino a questo punto nell'uso dei softirq, probabilmente tenete alla scalabilità delle prestazioni abbastanza da giustificarne la complessità aggiuntiva. @@ -896,8 +896,6 @@ leggendo solamente il codice. E come dice Alan Cox: “Lock data, not codeâ€. Problemi comuni =============== -.. _`it_deadlock`: - Stallo: semplice ed avanzato ---------------------------- @@ -1282,7 +1280,6 @@ Il beneficio qui sta nel fatto che il contatore di riferimenti no viene scritto: l'oggetto non viene alterato in alcun modo e quindi diventa molto più veloce su sistemi molti-processore grazie alla loro memoria cache. -.. _`it_per-cpu`: Dati per processore ------------------- @@ -1333,7 +1330,6 @@ Naturalmente, questo è più lento della semplice chiamata spin_lock_irq(), quindi ha senso solo se questo genere di accesso è estremamente raro. -.. _`it_sleeping-things`: Quali funzioni possono essere chiamate in modo sicuro dalle interruzioni? ========================================================================= diff --git a/Documentation/translations/it_IT/process/4.Coding.rst b/Documentation/translations/it_IT/process/4.Coding.rst index 8012fe9497aea50b94978a8d9a7678f7684d608f..54fd255b77d02c61a26350b681607823bf0dfc4a 100644 --- a/Documentation/translations/it_IT/process/4.Coding.rst +++ b/Documentation/translations/it_IT/process/4.Coding.rst @@ -264,11 +264,10 @@ La maggior parte di queste opzioni possono essere attivate per qualsiasi kernel utilizzato per lo sviluppo o a scopo di test. In particolare dovreste attivare: - - ENABLE_MUST_CHECK e FRAME_WARN per ottenere degli - avvertimenti dedicati a problemi come l'uso di interfacce deprecate o - l'ignorare un importante valore di ritorno di una funzione. Il risultato - generato da questi avvertimenti può risultare verboso, ma non bisogna - preoccuparsi per gli avvertimenti provenienti da altre parti del kernel. + - FRAME_WARN per ottenere degli avvertimenti su stack frame più + grandi di un dato valore. Il risultato generato da questi + avvertimenti può risultare verboso, ma non bisogna preoccuparsi per + gli avvertimenti provenienti da altre parti del kernel. - DEBUG_OBJECTS aggiungerà un codice per tracciare il ciclo di vita di diversi oggetti creati dal kernel e avvisa quando qualcosa viene eseguito diff --git a/Documentation/translations/it_IT/process/adding-syscalls.rst b/Documentation/translations/it_IT/process/adding-syscalls.rst index c478b6e8c292228cec1e13d9cbcf137391c682af..df8c652d004b1a1a418483ff4c0cee6da028189d 100644 --- a/Documentation/translations/it_IT/process/adding-syscalls.rst +++ b/Documentation/translations/it_IT/process/adding-syscalls.rst @@ -562,7 +562,7 @@ kernel. Se la nuova funzionalità è utile all'interno del kernel, per esempio dev'essere condivisa fra una vecchia e una nuova chiamata di sistema o dev'essere utilizzata da una chiamata di sistema e la sua variante compatibile, allora dev'essere implementata come una funzione di supporto -(*helper function*) (per esempio ``kern_xyzzy()``). Questa funzione potrà +(*helper function*) (per esempio ``ksys_xyzzy()``). Questa funzione potrà essere chiamata dallo *stub* (``sys_xyzzy()``), dalla variante compatibile (``compat_sys_xyzzy()``), e/o da altri parti del kernel. diff --git a/Documentation/translations/it_IT/process/coding-style.rst b/Documentation/translations/it_IT/process/coding-style.rst index c86c4543f2491a439232287a7bde9c0f4ad18618..95f2e7c985e2d29839e3bd159c621187ef26ac3d 100644 --- a/Documentation/translations/it_IT/process/coding-style.rst +++ b/Documentation/translations/it_IT/process/coding-style.rst @@ -75,9 +75,26 @@ stessa riga: if (condition) do_this; do_something_everytime; -né mettete più assegnamenti sulla stessa riga. Lo stile del kernel +Non usate le virgole per evitare le parentesi: + +.. code-block:: c + + if (condition) + do_this(), do_that(); + +Invece, usate sempre le parentesi per racchiudere più istruzioni. + +.. code-block:: c + + if (condition) { + do_this(); + do_that(); + } + +Non mettete nemmeno più assegnamenti sulla stessa riga. Lo stile del kernel è ultrasemplice. Evitate espressioni intricate. + Al di fuori dei commenti, della documentazione ed escludendo i Kconfig, gli spazi non vengono mai usati per l'indentazione, e l'esempio qui sopra è volutamente errato. @@ -320,8 +337,7 @@ qualcosa di simile, **non** dovreste chiamarla ``cntusr()``. Codificare il tipo di funzione nel suo nome (quella cosa chiamata notazione ungherese) è stupido - il compilatore conosce comunque il tipo e -può verificarli, e inoltre confonde i programmatori. Non c'è da -sorprendersi che MicroSoft faccia programmi bacati. +può verificarli, e inoltre confonde i programmatori. Le variabili LOCALI dovrebbero avere nomi corti, e significativi. Se avete un qualsiasi contatore di ciclo, probabilmente sarà chiamato ``i``. diff --git a/Documentation/translations/it_IT/process/howto.rst b/Documentation/translations/it_IT/process/howto.rst index 1db5a1082389752b2e20163b4f25c9d1810f3892..9554368a2ae26671beb4048d56aa2e2d2e6da210 100644 --- a/Documentation/translations/it_IT/process/howto.rst +++ b/Documentation/translations/it_IT/process/howto.rst @@ -357,17 +357,10 @@ benvenuti. Riportare Bug ------------- -https://bugzilla.kernel.org è dove gli sviluppatori del kernel Linux tracciano -i bachi del kernel. Gli utenti sono incoraggiati nel riportare tutti i bachi -che trovano utilizzando questo strumento. -Per maggiori dettagli su come usare il bugzilla del kernel, guardare: - - https://bugzilla.kernel.org/page.cgi?id=faq.html - -Il file admin-guide/reporting-bugs.rst nella cartella principale del kernel -fornisce un buon modello sul come segnalare un baco nel kernel, e spiega quali -informazioni sono necessarie agli sviluppatori per poter aiutare il -rintracciamento del problema. +Il file 'Documentation/admin-guide/reporting-issues.rst' nella +cartella principale del kernel spiega come segnalare un baco nel +kernel, e fornisce dettagli su quali informazioni sono necessarie agli +sviluppatori del kernel per poter studiare il problema. Gestire i rapporti sui bug -------------------------- @@ -380,8 +373,14 @@ al corrente della vostra presenza. Riparare bachi è una delle migliori vie per acquisire meriti tra gli altri sviluppatori, perchè non a molte persone piace perdere tempo a sistemare i bachi di altri. -Per lavorare sui rapporti di bachi già riportati, andate su -https://bugzilla.kernel.org. +Per lavorare sui bachi già segnalati, per prima cosa cercate il +sottosistema che vi interessa. Poi, verificate nel file MAINTAINERS +dove vengono collezionati solitamente i bachi per quel sottosistema; +spesso sarà una lista di discussione, raramente un bugtracker. Cercate +bachi nell'archivio e aiutate dove credete di poterlo fare. Potete +anche consultare https://bugzilla.kernel.org; però, solo una manciata di +sottosistemi lo usano attivamente, ciò nonostante i bachi che +coinvolgono l'intero kernel sono sempre riportati lì. Liste di discussione -------------------- diff --git a/Documentation/translations/it_IT/process/magic-number.rst b/Documentation/translations/it_IT/process/magic-number.rst index e8c782d155a32de7a8b5f17c53d63d6f364cb723..f452fafb1e84cce85fe65664dab168c9f9090872 100644 --- a/Documentation/translations/it_IT/process/magic-number.rst +++ b/Documentation/translations/it_IT/process/magic-number.rst @@ -101,7 +101,6 @@ RFCOMM_TTY_MAGIC 0x6d02 ``net/bluetooth/ USB_SERIAL_PORT_MAGIC 0x7301 usb_serial_port ``drivers/usb/serial/usb-serial.h`` CG_MAGIC 0x00090255 ufs_cylinder_group ``include/linux/ufs_fs.h`` LSEMAGIC 0x05091998 lse ``drivers/fc4/fc.c`` -GDTIOCTL_MAGIC 0x06030f07 gdth_iowr_str ``drivers/scsi/gdth_ioctl.h`` RIEBL_MAGIC 0x09051990 ``drivers/net/atarilance.c`` NBD_REQUEST_MAGIC 0x12560953 nbd_request ``include/linux/nbd.h`` RED_MAGIC2 0x170fc2a5 (any) ``mm/slab.c`` @@ -144,7 +143,6 @@ PWC_MAGIC 0x89DC10AB pwc_device ``drivers/usb/me NBD_REPLY_MAGIC 0x96744668 nbd_reply ``include/linux/nbd.h`` ENI155_MAGIC 0xa54b872d midway_eprom ``drivers/atm/eni.h`` CODA_MAGIC 0xC0DAC0DA coda_file_info ``fs/coda/coda_fs_i.h`` -DPMEM_MAGIC 0xc0ffee11 gdt_pci_sram ``drivers/scsi/gdth.h`` YAM_MAGIC 0xF10A7654 yam_port ``drivers/net/hamradio/yam.c`` CCB_MAGIC 0xf2691ad2 ccb ``drivers/scsi/ncr53c8xx.c`` QUEUE_MAGIC_FREE 0xf7e1c9a3 queue_entry ``drivers/scsi/arm/queue.c`` diff --git a/Documentation/translations/it_IT/process/submit-checklist.rst b/Documentation/translations/it_IT/process/submit-checklist.rst index 614fc17d90869a87aa3443841fc9937eea66a6ec..2fc09cc1f0be51afa916b561b0b2fada33a7eb57 100644 --- a/Documentation/translations/it_IT/process/submit-checklist.rst +++ b/Documentation/translations/it_IT/process/submit-checklist.rst @@ -28,6 +28,10 @@ sottomissione delle patch, in particolare c) quando si usa ``O=builddir`` + d) Qualsiasi modifica in Documentation/ deve compilare con successo senza + avvisi o errori. Usare ``make htmldocs`` o ``make pdfdocs`` per verificare + e correggere i problemi + 3) Compilare per diverse architetture di processore usando strumenti per la cross-compilazione o altri. @@ -54,8 +58,7 @@ sottomissione delle patch, in particolare 9) Verificare con sparse. -10) Usare ``make checkstack`` e ``make namespacecheck`` e correggere tutti i - problemi rilevati. +10) Usare ``make checkstack`` e correggere tutti i problemi rilevati. .. note:: @@ -95,31 +98,29 @@ sottomissione delle patch, in particolare informazioni. Le patch che modificano le interfacce utente dovrebbero essere inviate in copia anche a linux-api@vger.kernel.org. -20) Verifica che il kernel passi con successo ``make headers_check`` - -21) La patch è stata verificata con l'iniezione di fallimenti in slab e +20) La patch è stata verificata con l'iniezione di fallimenti in slab e nell'allocazione di pagine. Vedere ``Documentation/fault-injection/``. Se il nuovo codice è corposo, potrebbe essere opportuno aggiungere l'iniezione di fallimenti specifici per il sottosistema. -22) Il nuovo codice è stato compilato con ``gcc -W`` (usate +21) Il nuovo codice è stato compilato con ``gcc -W`` (usate ``make KCFLAGS=-W``). Questo genererà molti avvisi, ma è ottimo per scovare bachi come "warning: comparison between signed and unsigned". -23) La patch è stata verificata dopo essere stata inclusa nella serie di patch +22) La patch è stata verificata dopo essere stata inclusa nella serie di patch -mm; questo al fine di assicurarsi che continui a funzionare assieme a tutte le altre patch in coda e i vari cambiamenti nei sottosistemi VM, VFS e altri. -24) Tutte le barriere di sincronizzazione {per esempio, ``barrier()``, +23) Tutte le barriere di sincronizzazione {per esempio, ``barrier()``, ``rmb()``, ``wmb()``} devono essere accompagnate da un commento nei sorgenti che ne spieghi la logica: cosa fanno e perché. -25) Se la patch aggiunge nuove chiamate ioctl, allora aggiornate +24) Se la patch aggiunge nuove chiamate ioctl, allora aggiornate ``Documentation/userspace-api/ioctl/ioctl-number.rst``. -26) Se il codice che avete modificato dipende o usa una qualsiasi interfaccia o +25) Se il codice che avete modificato dipende o usa una qualsiasi interfaccia o funzionalità del kernel che è associata a uno dei seguenti simboli ``Kconfig``, allora verificate che il kernel compili con diverse configurazioni dove i simboli sono disabilitati e/o ``=m`` (se c'è la diff --git a/Documentation/translations/it_IT/process/submitting-patches.rst b/Documentation/translations/it_IT/process/submitting-patches.rst index ae00352346edd76dcb2117308528895e89a45e06..ded95048b9a85e718e74b1f59a159501fa1360f1 100644 --- a/Documentation/translations/it_IT/process/submitting-patches.rst +++ b/Documentation/translations/it_IT/process/submitting-patches.rst @@ -433,6 +433,14 @@ Alcune persone aggiungono delle etichette alla fine. Per ora queste verranno ignorate, ma potete farlo per meglio identificare procedure aziendali interne o per aggiungere dettagli circa la firma. +In seguito al SoB (Signed-off-by:) dell'autore ve ne sono altri da +parte di tutte quelle persone che si sono occupate della gestione e +del trasporto della patch. Queste però non sono state coinvolte nello +sviluppo, ma la loro sequenza d'apparizione ci racconta il percorso +**reale** che una patch a intrapreso dallo sviluppatore, fino al +manutentore, per poi giungere a Linus. + + Quando utilizzare Acked-by:, Cc:, e Co-developed-by: ---------------------------------------------------- @@ -574,6 +582,10 @@ kernel stabili al fine di capire quale kernel deve ricevere la correzione. Questo è il modo suggerito per indicare che un baco è stato corretto nella patch. Per maggiori dettagli leggete :ref:`it_describe_changes` +Da notare che aggiungere un tag "Fixes:" non esime dalle regole +previste per i kernel stabili, e nemmeno dalla necessità di aggiungere +in copia conoscenza stable@vger.kernel.org su tutte le patch per +suddetti kernel. Il formato canonico delle patch ------------------------------- @@ -642,16 +654,20 @@ Le etichette non verranno considerate come parte della frase riassuntiva, ma indicano come la patch dovrebbe essere trattata. Fra le etichette più comuni ci sono quelle di versione che vengono usate quando una patch è stata inviata più volte (per esempio, "v1, v2, v3"); oppure "RFC" per indicare che si -attendono dei commenti (*Request For Comments*). Se ci sono quattro patch -nella serie, queste dovrebbero essere enumerate così: 1/4, 2/4, 3/4, 4/4. -Questo assicura che gli sviluppatori capiranno l'ordine in cui le patch -dovrebbero essere applicate, e per tracciare quelle che hanno revisionate o -che hanno applicato. +attendono dei commenti (*Request For Comments*). + +Se ci sono quattro patch nella serie, queste dovrebbero essere +enumerate così: 1/4, 2/4, 3/4, 4/4. Questo assicura che gli +sviluppatori capiranno l'ordine in cui le patch dovrebbero essere +applicate, e per tracciare quelle che hanno revisionate o che hanno +applicato. Un paio di esempi di oggetti:: Subject: [PATCH 2/5] ext2: improve scalability of bitmap searching Subject: [PATCH v2 01/27] x86: fix eflags tracking + Subject: [PATCH v2] sub/sys: Condensed patch summary + Subject: [PATCH v2 M/N] sub/sys: Condensed patch summary La riga ``from`` dev'essere la prima nel corpo del messaggio ed è nel formato: @@ -668,30 +684,76 @@ deve aver senso per un lettore esperto che è ha dimenticato i dettagli della discussione che hanno portato alla patch. L'inclusione di informazioni sui problemi oggetto dalla patch (messaggi del kernel, messaggi di oops, eccetera) è particolarmente utile per le persone che potrebbero cercare fra -i messaggi di log per la patch che li tratta. Se la patch corregge un errore -di compilazione, non sarà necessario includere proprio _tutto_ quello che -è uscito dal compilatore; aggiungete solo quello che è necessario per far si -che la vostra patch venga trovata. Come nella ``summary phrase``, è importante -essere sia brevi che descrittivi. +i messaggi di log per la patch che li tratta. Il testo dovrebbe essere scritto +con abbastanza dettagli da far capire al lettore **perché** quella +patch fu creata, e questo a distanza di settimane, mesi, o addirittura +anni. + +Se la patch corregge un errore di compilazione, non sarà necessario +includere proprio _tutto_ quello che è uscito dal compilatore; +aggiungete solo quello che è necessario per far si che la vostra patch +venga trovata. Come nella ``summary phrase``, è importante essere sia +brevi che descrittivi. La linea di demarcazione ``---`` serve essenzialmente a segnare dove finisce il messaggio di changelog. Aggiungere il ``diffstat`` dopo ``---`` è un buon uso di questo spazio, per mostrare i file che sono cambiati, e il numero di file aggiunto o rimossi. -Un ``diffstat`` è particolarmente utile per le patch grandi. Altri commenti -che sono importanti solo per i manutentori, quindi inadatti al changelog -permanente, dovrebbero essere messi qui. Un buon esempio per questo tipo -di commenti potrebbe essere quello di descrivere le differenze fra le versioni +Un ``diffstat`` è particolarmente utile per le patch grandi. Se +includete un ``diffstat`` dopo ``---``, usate le opzioni ``-p 1 -w70`` +cosicché i nomi dei file elencati non occupino troppo spazio +(facilmente rientreranno negli 80 caratteri, magari con qualche +indentazione). (``git`` genera di base dei diffstat adatti). + +I commenti che sono importanti solo per i manutentori, quindi +inadatti al changelog permanente, dovrebbero essere messi qui. Un +buon esempio per questo tipo di commenti potrebbe essere il cosiddetto +``patch changelogs`` che descrivere le differenze fra le versioni della patch. -Se includete un ``diffstat`` dopo ``---``, usate le opzioni ``-p 1 -w70`` -cosicché i nomi dei file elencati non occupino troppo spazio (facilmente -rientreranno negli 80 caratteri, magari con qualche indentazione). -(``git`` genera di base dei diffstat adatti). +Queste informazioni devono andare **dopo** la linea ``---`` che separa +il *changelog* dal resto della patch. Le informazioni riguardanti la +versione di una patch non sono parte del *chagelog* che viene incluso +in git. Queste sono informazioni utili solo ai revisori. Se venissero +messe sopra la riga, qualcuno dovrà fare del lavoro manuale per +rimuoverle; cosa che invece viene fatta automaticamente quando vengono +messe correttamente oltre la riga.:: + + <commit message> + ... + Signed-off-by: Author <author@mail> + --- + V2 -> V3: Removed redundant helper function + V1 -> V2: Cleaned up coding style and addressed review comments + + path/to/file | 5+++-- + ... Maggiori dettagli sul formato delle patch nei riferimenti qui di seguito. +Aggiungere i *backtrace* nei messaggi di commit +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +I *backtrace* aiutano a documentare la sequenza di chiamate a funzione +che portano ad un problema. Tuttavia, non tutti i *backtrace* sono +davvero utili. Per esempio, le sequenze iniziali di avvio sono uniche +e ovvie. Copiare integralmente l'output di ``dmesg`` aggiunge tante +informazioni che distraggono dal vero problema (per esempio, i +marcatori temporali, la lista dei moduli, la lista dei registri, lo +stato dello stack). + +Quindi, per rendere utile un *backtrace* dovreste eliminare le +informazioni inutili, cosicché ci si possa focalizzare sul +problema. Ecco un esempio di un *backtrace* essenziale:: + + unchecked MSR access error: WRMSR to 0xd51 (tried to write 0x0000000000000064) + at rIP: 0xffffffffae059994 (native_write_msr+0x4/0x20) + Call Trace: + mba_wrmsr + update_domains + rdtgroup_mkdir + .. _it_explicit_in_reply_to: Usare esplicitamente In-Reply-To nell'intestazione diff --git a/Documentation/translations/ja_JP/SubmitChecklist b/Documentation/translations/ja_JP/SubmitChecklist index b42220d3d46c89b3d89b26fee53119dd26e2c1ab..4429447b096558f3d3519990d9804482dc1c4610 100644 --- a/Documentation/translations/ja_JP/SubmitChecklist +++ b/Documentation/translations/ja_JP/SubmitChecklist @@ -88,20 +88,18 @@ Linux カーãƒãƒ«ãƒ‘ãƒƒãƒæŠ•ç¨¿è€…å‘ã‘ãƒã‚§ãƒƒã‚¯ãƒªã‚¹ãƒˆ 18: æ–°ã—ã„userspaceインタフェースを作æˆã—ãŸå ´åˆã«ã¯ã€Documentation/ABI/ ã« Documentation/ABI/README ã‚’å‚考ã«ã—ã¦å¿…ãšãƒ‰ã‚ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’è¿½åŠ ã—ã¦ãã ã•ã„。 -19: 'make headers_check'を実行ã—ã¦å…¨ãå•題ãŒãªã„ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 - -20: å°‘ãªãã¨ã‚‚slabã‚¢ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã¨pageã‚¢ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«å¤±æ•—ã—ãŸå ´åˆã® +19: å°‘ãªãã¨ã‚‚slabã‚¢ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã¨pageã‚¢ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«å¤±æ•—ã—ãŸå ´åˆã® 挙動ã«ã¤ã„ã¦ã€fault-injectionを利用ã—ã¦ç¢ºèªã—ã¦ãã ã•ã„。 Documentation/fault-injection/ ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 è¿½åŠ ã—ãŸã‚³ãƒ¼ãƒ‰ãŒã‹ãªã‚Šã®é‡ã§ã‚ã£ãŸãªã‚‰ã°ã€ã‚µãƒ–システム特有㮠fault-injectionã‚’è¿½åŠ ã—ãŸã»ã†ãŒè‰¯ã„ã‹ã‚‚ã—れã¾ã›ã‚“。 -21: æ–°ãŸã«è¿½åŠ ã—ãŸã‚³ãƒ¼ãƒ‰ã¯ã€`gcc -W'ã§ã‚³ãƒ³ãƒ‘イルã—ã¦ãã ã•ã„。 +20: æ–°ãŸã«è¿½åŠ ã—ãŸã‚³ãƒ¼ãƒ‰ã¯ã€`gcc -W'ã§ã‚³ãƒ³ãƒ‘イルã—ã¦ãã ã•ã„。 ã“ã®ã‚ªãƒ—ションã¯å¤§é‡ã®ä¸è¦ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’出力ã—ã¾ã™ãŒã€ "warning: comparison between signed and unsigned" ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ ãƒã‚°ã‚’見ã¤ã‘ã‚‹ã®ã«å½¹ã«ç«‹ã¡ã¾ã™ã€‚ -22: 投稿ã—ãŸãƒ‘ッãƒãŒ -mm パッãƒã‚»ãƒƒãƒˆã«ãƒžãƒ¼ã‚¸ã•れãŸå¾Œã€å…¨ã¦ã®æ—¢å˜ã®ãƒ‘ッãƒã‚„ +21: 投稿ã—ãŸãƒ‘ッãƒãŒ -mm パッãƒã‚»ãƒƒãƒˆã«ãƒžãƒ¼ã‚¸ã•れãŸå¾Œã€å…¨ã¦ã®æ—¢å˜ã®ãƒ‘ッãƒã‚„ VM, VFS ãŠã‚ˆã³ãã®ä»–ã®ã‚µãƒ–システムã«é–¢ã™ã‚‹æ§˜ã€…ãªå¤‰æ›´ã¨ã€ç¾æ™‚点ã§ã‚‚å…±å˜ ã§ãã‚‹ã“ã¨ã‚’確èªã™ã‚‹ãƒ†ã‚¹ãƒˆã‚’行ã£ã¦ãã ã•ã„。 diff --git a/Documentation/translations/ko_KR/howto.rst b/Documentation/translations/ko_KR/howto.rst index 787f1e85f8a079eaab1c2d803b3624bb2d37e4a9..a2bdd564c907a090a251addb862592691c3002f0 100644 --- a/Documentation/translations/ko_KR/howto.rst +++ b/Documentation/translations/ko_KR/howto.rst @@ -339,14 +339,8 @@ Andrew Mortonì˜ ê¸€ì´ ìžˆë‹¤. 버그 ë³´ê³ --------- -https://bugzilla.kernel.org 는 리눅스 ì»¤ë„ ê°œë°œìžë“¤ì´ 커ë„ì˜ ë²„ê·¸ë¥¼ ì¶”ì 하는 -ê³³ì´ë‹¤. 사용ìžë“¤ì€ 발견한 ëª¨ë“ ë²„ê·¸ë“¤ì„ ë³´ê³ í•˜ê¸° 위하여 ì´ íˆ´ì„ ì‚¬ìš©í• ê²ƒì„ -권장한다. kernel bugzilla를 사용하는 ìžì„¸í•œ ë°©ë²•ì€ ë‹¤ìŒì„ 참조하ë¼. - - https://bugzilla.kernel.org/page.cgi?id=faq.html - ë©”ì¸ ì»¤ë„ ì†ŒìŠ¤ ë””ë ‰í† ë¦¬ì— ìžˆëŠ” 'Documentation/admin-guide/reporting-issues.rst' -파ì¼ì€ ì»¤ë„ ë²„ê·¸ë¼ê³ ìƒê°ë˜ëŠ” ê²ƒì„ ë³´ê³ í•˜ëŠ” ë°©ë²•ì— ê´€í•œ ì¢‹ì€ í…œí”Œë¦¿ì´ë©° ë¬¸ì œë¥¼ +파ì¼ì€ ì»¤ë„ ë²„ê·¸ë¼ê³ ìƒê°ë˜ëŠ” ê²ƒì„ ì–´ë–»ê²Œ ë³´ê³ í•˜ë©´ ë˜ëŠ”ì§€, ê·¸ë¦¬ê³ ë¬¸ì œë¥¼ ì¶”ì 하기 위해서 ì»¤ë„ ê°œë°œìžë“¤ì´ 필요로 하는 ì •ë³´ê°€ 무엇들ì¸ì§€ë¥¼ ìƒì„¸ížˆ ì„¤ëª…í•˜ê³ ìžˆë‹¤. @@ -362,8 +356,14 @@ https://bugzilla.kernel.org 는 리눅스 ì»¤ë„ ê°œë°œìžë“¤ì´ 커ë„ì˜ ë²„ ì 수를 ì–»ì„ ìˆ˜ 있는 가장 ì¢‹ì€ ë°©ë²•ì¤‘ì˜ í•˜ë‚˜ì´ë‹¤. 왜ëƒí•˜ë©´ ë§Žì€ ì‚¬ëžŒë“¤ì€ ë‹¤ë¥¸ ì‚¬ëžŒë“¤ì˜ ë²„ê·¸ë“¤ì„ ìˆ˜ì •í•˜ê¸° 위하여 ì‹œê°„ì„ ë‚비하지 않기 때문ì´ë‹¤. -ì´ë¯¸ ë³´ê³ ëœ ë²„ê·¸ 리í¬íŠ¸ë“¤ì„ ê°€ì§€ê³ ìž‘ì—…í•˜ê¸° 위해서 https://bugzilla.kernel.org -를 참조하ë¼. +ì´ë¯¸ ë³´ê³ ëœ ë²„ê·¸ 리í¬íŠ¸ë“¤ì„ ê°€ì§€ê³ ìž‘ì—…í•˜ê¸° 위해서는 ì—¬ëŸ¬ë¶„ì´ ê´€ì‹¬ìžˆëŠ” +ì„œë¸Œì‹œìŠ¤í…œì„ ì°¾ì•„ë¼. 해당 ì„œë¸Œì‹œìŠ¤í…œì˜ ë²„ê·¸ë“¤ì´ ì–´ë””ë¡œ 리í¬íЏ ë˜ëŠ”ì§€ +MAINTAINERS 파ì¼ì„ ì²´í¬í•˜ë¼; 그건 대부분 ë©”ì¼ë§ 리스트ì´ê³ , ê°€ë”ì€ ë²„ê·¸ ì¶”ì +시스템ì´ë‹¤. ê·¸ ìž¥ì†Œì— ìžˆëŠ” 최근 버그 리í¬íЏ 기ë¡ë“¤ì„ ê²€ìƒ‰í•˜ê³ ì—¬ëŸ¬ë¶„ì´ ë³´ê¸°ì— +ì 합하다 ì‹¶ì€ ê²ƒì„ ë„와ë¼. ì—¬ëŸ¬ë¶„ì€ ë²„ê·¸ 리í¬íŠ¸ë¥¼ 위해 +https://bugzilla.kernel.org 를 ì²´í¬í•˜ê³ ìž í• ìˆ˜ë„ ìžˆë‹¤; ì†Œìˆ˜ì˜ ì»¤ë„ +ì„œë¸Œì‹œìŠ¤í…œë“¤ë§Œì´ ë²„ê·¸ ì‹ ê³ ì™€ ì¶”ì ì„ ìœ„í•´ 해당 ì‹œìŠ¤í…œì„ ì‹¤ì œë¡œ ì‚¬ìš©í•˜ê³ ìžˆì§€ë§Œ, +ì „ì²´ 커ë„ì˜ ë²„ê·¸ë“¤ì´ ê·¸ê³³ì— ì •ë¦¬ëœë‹¤. ë©”ì¼ë§ 리스트들 diff --git a/Documentation/translations/zh_CN/admin-guide/README.rst b/Documentation/translations/zh_CN/admin-guide/README.rst new file mode 100644 index 0000000000000000000000000000000000000000..669a022f68175e93a462ccb256e12bbae7d182a5 --- /dev/null +++ b/Documentation/translations/zh_CN/admin-guide/README.rst @@ -0,0 +1,347 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/admin-guide/README.rst + +:译者: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> + +Linuxå†…æ ¸5.x版本 <http://kernel.org/> +========================================= + +以下是Linux版本5çš„å‘行注记。仔细阅读它们, +å®ƒä»¬ä¼šå‘Šè¯‰ä½ è¿™äº›éƒ½æ˜¯ä»€ä¹ˆï¼Œè§£é‡Šå¦‚ä½•å®‰è£…å†…æ ¸ï¼Œä»¥åŠé‡åˆ°é—®é¢˜æ—¶è¯¥å¦‚何åšã€‚ + +什么是Linux? +--------------- + + Linux是Unixæ“作系统的克隆版本,由Linus Torvaldsåœ¨ä¸€ä¸ªæ¾æ•£çš„网络黑客 + (Hackerï¼Œæ— è´¬ä¹‰ï¼‰å›¢é˜Ÿçš„å¸®åŠ©ä¸‹ä»Žå¤´å¼€å§‹ç¼–å†™ã€‚å®ƒæ—¨åœ¨å®žçŽ°å…¼å®¹POSIXå’Œ + å•一UNIX规范。 + + 它具有在现代æˆç†Ÿçš„Unixä¸åº”当具有的所有功能,包括真æ£çš„多任务处ç†ã€è™šæ‹Ÿå†…å˜ã€ + å…±äº«åº“ã€æŒ‰éœ€åŠ è½½ã€å…±äº«çš„写时拷è´ï¼ˆCOWï¼‰å¯æ‰§è¡Œæ–‡ä»¶ã€æ°å½“的内å˜ç®¡ç†ä»¥åŠåŒ…括 + IPv4å’ŒIPv6在内的å¤åˆç½‘ç»œæ ˆã€‚ + + Linux在GNU通用公共许å¯è¯ï¼Œç‰ˆæœ¬2(GNU GPLv2)下分å‘,详è§éšé™„çš„COPYING文件。 + +å®ƒèƒ½åœ¨ä»€ä¹ˆæ ·çš„ç¡¬ä»¶ä¸Šè¿è¡Œï¼Ÿ +----------------------------- + + 虽然Linuxæœ€åˆæ˜¯ä¸º32ä½çš„x86 PC机(386或更高版本)开å‘的,但今天它也能è¿è¡Œåœ¨ + (至少)Compaq Alpha AXPã€Sun SPARC与UltraSPARCã€Motorola 68000ã€PowerPC〠+ PowerPC64ã€ARMã€Hitachi SuperHã€Cellã€IBM S/390ã€MIPSã€HP PA-RISCã€Intel + IA-64ã€DEC VAXã€AMD x86-64 Xtensaå’ŒARC架构上。 + + Linux很容易移æ¤åˆ°å¤§å¤šæ•°é€šç”¨çš„32使ˆ–64ä½ä½“系架构,åªè¦å®ƒä»¬æœ‰ä¸€ä¸ªåˆ†é¡µå†…å˜ç®¡ç† + å•元(PMMU)和一个移æ¤çš„GNU C编译器(gccï¼›GNU Compiler Collection,GCC的一 + 部分)。Linux也被移æ¤åˆ°è®¸å¤šæ²¡æœ‰PMMU的体系架构ä¸ï¼Œå°½ç®¡åŠŸèƒ½æ˜¾ç„¶å—到了一定的 + é™åˆ¶ã€‚ + Linux也被移æ¤åˆ°äº†å…¶è‡ªå·±ä¸Šã€‚现在å¯ä»¥å°†å†…æ ¸ä½œä¸ºç”¨æˆ·ç©ºé—´åº”ç”¨ç¨‹åºè¿è¡Œâ€”—这被 + 称为用户模å¼Linux(UML)。 + +文档 +----- +å› ç‰¹ç½‘ä¸Šå’Œä¹¦ç±ä¸Šéƒ½æœ‰å¤§é‡çš„ç”µåæ–‡æ¡£ï¼Œæ—¢æœ‰Linux专属文档,也有与一般UNIX问题相关 +的文档。我建议在任何Linux FTP站点上查找LDP(Linux文档项目)书ç±çš„æ–‡æ¡£å目录。 +æœ¬è‡ªè¿°æ–‡ä»¶å¹¶ä¸æ˜¯å…³äºŽç³»ç»Ÿçš„æ–‡æ¡£ï¼šæœ‰æ›´å¥½çš„å¯ç”¨èµ„æºã€‚ + + - å› ç‰¹ç½‘ä¸Šå’Œä¹¦ç±ä¸Šéƒ½æœ‰å¤§é‡çš„(电å)文档,既有Linux专属文档,也有与普通 + UNIX问题相关的文档。我建议在任何有LDP(Linux文档项目)书ç±çš„Linux FTP + 站点上查找文档åç›®å½•ã€‚æœ¬è‡ªè¿°æ–‡ä»¶å¹¶ä¸æ˜¯å…³äºŽç³»ç»Ÿçš„æ–‡æ¡£ï¼šæœ‰æ›´å¥½çš„å¯ç”¨èµ„æºã€‚ + + - 文档/åç›®å½•ä¸æœ‰å„ç§è‡ªè¿°æ–‡ä»¶ï¼šä¾‹å¦‚,这些文件通常包å«ä¸€äº›ç‰¹å®šé©±åŠ¨ç¨‹åºçš„ + å†…æ ¸å®‰è£…è¯´æ˜Žã€‚è¯·é˜…è¯» + :ref:`Documentation/process/changes.rst <changes>` 文件,它包å«äº†å‡çº§å†…æ ¸ + å¯èƒ½ä¼šå¯¼è‡´çš„问题的相关信æ¯ã€‚ + +å®‰è£…å†…æ ¸æºä»£ç +--------------- + + - 如果您è¦å®‰è£…完整的æºä»£ç ï¼Œè¯·æŠŠå†…æ ¸tar档案包放在您有æƒé™çš„目录ä¸ï¼ˆä¾‹å¦‚您 + 的主目录)并将其解包:: + + xz -cd linux-5.x.tar.xz | tar xvf - + + 将“Xâ€æ›¿æ¢æˆæœ€æ–°å†…æ ¸çš„ç‰ˆæœ¬å·ã€‚ + + ã€ä¸è¦ã€‘使用 /usr/src/linux 目录ï¼è¿™é‡Œæœ‰ä¸€ç»„åº“å¤´æ–‡ä»¶ä½¿ç”¨çš„å†…æ ¸å¤´æ–‡ä»¶ + (通常是ä¸å®Œæ•´çš„)。它们应该与库匹é…ï¼Œè€Œä¸æ˜¯è¢«å†…æ ¸çš„å˜åŒ–æžå¾—一团糟。 + + - 您还å¯ä»¥é€šè¿‡æ‰“è¡¥ä¸åœ¨5.x版本之间å‡çº§ã€‚è¡¥ä¸ä»¥xzæ ¼å¼åˆ†å‘。è¦é€šè¿‡æ‰“è¡¥ä¸è¿›è¡Œ + å®‰è£…ï¼Œè¯·èŽ·å–æ‰€æœ‰è¾ƒæ–°çš„è¡¥ä¸æ–‡ä»¶ï¼Œè¿›å…¥å†…æ ¸æºä»£ç (linux-5.x)的目录并 + 执行:: + + xz -cd ../patch-5.x.xz | patch -p1 + + è¯·ã€æŒ‰é¡ºåºã€‘æ›¿æ¢æ‰€æœ‰å¤§äºŽå½“剿ºä»£ç æ ‘ç‰ˆæœ¬çš„â€œxâ€ï¼Œè¿™æ ·å°±å¯ä»¥äº†ã€‚您å¯èƒ½æƒ³è¦ + åˆ é™¤å¤‡ä»½æ–‡ä»¶ï¼ˆæ–‡ä»¶å类似xxx~ 或 xxx.orig)ï¼Œå¹¶ç¡®ä¿æ²¡æœ‰å¤±è´¥çš„è¡¥ä¸ï¼ˆæ–‡ä»¶å + 类似xxx# 或 xxx.rejï¼‰ã€‚å¦‚æžœæœ‰ï¼Œä¸æ˜¯ä½ 就是我犯了错误。 + + 与5.xå†…æ ¸çš„è¡¥ä¸ä¸åŒï¼Œ5.x.yå†…æ ¸ï¼ˆä¹Ÿç§°ä¸ºç¨³å®šç‰ˆå†…æ ¸ï¼‰çš„è¡¥ä¸ä¸æ˜¯å¢žé‡çš„,而是 + 直接应用于基本的5.xå†…æ ¸ã€‚ä¾‹å¦‚ï¼Œå¦‚æžœæ‚¨çš„åŸºæœ¬å†…æ ¸æ˜¯5.0,并且希望应用5.0.3 + è¡¥ä¸ï¼Œåˆ™ä¸åº”先应用5.0.1å’Œ5.0.2的补ä¸ã€‚类似地,如果您è¿è¡Œçš„æ˜¯5.0.2å†…æ ¸ï¼Œ + 并且希望跳转到5.0.3,那么在应用5.0.3è¡¥ä¸ä¹‹å‰ï¼Œå¿…须首先撤销5.0.2è¡¥ä¸ + (å³patch -R)。更多关于这方é¢çš„内容,请阅读 + :ref:`Documentation/process/applying-patches.rst <applying_patches>` 。 + + 或者,脚本 patch-kernel å¯ä»¥ç”¨æ¥è‡ªåŠ¨åŒ–è¿™ä¸ªè¿‡ç¨‹ã€‚å®ƒèƒ½ç¡®å®šå½“å‰å†…æ ¸ç‰ˆæœ¬å¹¶ + 应用找到的所有补ä¸:: + + linux/scripts/patch-kernel linux + + 上é¢å‘½ä»¤ä¸çš„ç¬¬ä¸€ä¸ªå‚æ•°æ˜¯å†…æ ¸æºä»£ç çš„ä½ç½®ã€‚è¡¥ä¸æ˜¯åœ¨å½“å‰ç›®å½•应用的,但是 + å¯ä»¥å°†å¦ä¸€ä¸ªç›®å½•æŒ‡å®šä¸ºç¬¬äºŒä¸ªå‚æ•°ã€‚ + + - ç¡®ä¿æ²¡æœ‰è¿‡æ—¶çš„ .o 文件和ä¾èµ–项:: + + cd linux + make mrproper + + çŽ°åœ¨æ‚¨åº”è¯¥å·²ç»æ£ç¡®å®‰è£…了æºä»£ç 。 + +è½¯ä»¶è¦æ±‚ +--------- + + 编译和è¿è¡Œ5.xå†…æ ¸éœ€è¦å„ç§è½¯ä»¶åŒ…的最新版本。请å‚考 + :ref:`Documentation/process/changes.rst <changes>` + æ¥äº†è§£æœ€ä½Žç‰ˆæœ¬è¦æ±‚以åŠå¦‚何å‡çº§è½¯ä»¶åŒ…。请注æ„,使用过旧版本的这些包å¯èƒ½ä¼š + å¯¼è‡´å¾ˆéš¾è¿½è¸ªçš„é—´æŽ¥é”™è¯¯ï¼Œå› æ¤ä¸è¦ä»¥ä¸ºåœ¨ç”Ÿæˆæˆ–æ“作过程ä¸å‡ºçŽ°æ˜Žæ˜¾é—®é¢˜æ—¶å¯ä»¥ + åªæ›´æ–°åŒ…。 + +ä¸ºå†…æ ¸å»ºç«‹ç›®å½• +--------------- + + ç¼–è¯‘å†…æ ¸æ—¶ï¼Œé»˜è®¤æƒ…å†µä¸‹æ‰€æœ‰è¾“å‡ºæ–‡ä»¶éƒ½å°†ä¸Žå†…æ ¸æºä»£ç 放在一起。使用 + ``make O=output/dir`` 选项å¯ä»¥ä¸ºè¾“出文件(包括 .config)指定备用ä½ç½®ã€‚ + 例如:: + + kernel source code: /usr/src/linux-5.x + build directory: /home/name/build/kernel + + è¦é…ç½®å’Œæž„å»ºå†…æ ¸ï¼Œè¯·ä½¿ç”¨:: + + cd /usr/src/linux-5.x + make O=/home/name/build/kernel menuconfig + make O=/home/name/build/kernel + sudo make O=/home/name/build/kernel modules_install install + + 请注æ„:如果使用了 ``O=output/dir`` 选项,那么它必须用于make的所有调用。 + +é…ç½®å†…æ ¸ +--------- + + å³ä½¿åªå‡çº§ä¸€ä¸ªå°ç‰ˆæœ¬ï¼Œä¹Ÿä¸è¦è·³è¿‡æ¤æ¥éª¤ã€‚æ¯ä¸ªç‰ˆæœ¬ä¸éƒ½ä¼šæ·»åŠ æ–°çš„é…置选项, + 如果é…ç½®æ–‡ä»¶æ²¡æœ‰æŒ‰é¢„å®šè®¾ç½®ï¼Œå°±ä¼šå‡ºçŽ°å¥‡æ€ªçš„é—®é¢˜ã€‚å¦‚æžœæ‚¨æƒ³ä»¥æœ€å°‘çš„å·¥ä½œé‡ + 将现有é…ç½®å‡çº§åˆ°æ–°ç‰ˆæœ¬ï¼Œè¯·ä½¿ç”¨ ``makeoldconfig`` ,它åªä¼šè¯¢é—®æ‚¨æ–°é…ç½® + é€‰é¡¹çš„ç”æ¡ˆã€‚ + + - å…¶ä»–é…置命令包括:: + + "make config" 纯文本界é¢ã€‚ + + "make menuconfig" 基于文本的彩色èœå•ã€é€‰é¡¹åˆ—è¡¨å’Œå¯¹è¯æ¡†ã€‚ + + "make nconfig" 增强的基于文本的彩色èœå•。 + + "make xconfig" 基于Qtçš„é…置工具。 + + "make gconfig" 基于GTK+çš„é…置工具。 + + "make oldconfig" 基于现有的 ./.config 文件选择所有选项,并询问 + æ–°é…置选项。 + + "make olddefconfig" + 类似上一个,但ä¸è¯¢é—®ç›´æŽ¥å°†æ–°é€‰é¡¹è®¾ç½®ä¸ºé»˜è®¤å€¼ã€‚ + + "make defconfig" æ ¹æ®ä½“系架构,使用arch/$arch/defconfig或 + arch/$arch/configs/${PLATFORM}_defconfigä¸çš„ + 默认选项值创建./.config文件。 + + "make ${PLATFORM}_defconfig" + 使用arch/$arch/configs/${PLATFORM}_defconfigä¸ + 的默认选项值创建一个./.config文件。 + 用“makehelpâ€æ¥èŽ·å–æ‚¨ä½“ç³»æž¶æž„ä¸æ‰€æœ‰å¯ç”¨å¹³å°çš„列表。 + + "make allyesconfig" + 通过尽å¯èƒ½å°†é€‰é¡¹å€¼è®¾ç½®ä¸ºâ€œyâ€ï¼Œåˆ›å»ºä¸€ä¸ª + ./.config文件。 + + "make allmodconfig" + 通过尽å¯èƒ½å°†é€‰é¡¹å€¼è®¾ç½®ä¸ºâ€œmâ€ï¼Œåˆ›å»ºä¸€ä¸ª + ./.config文件。 + + "make allnoconfig" 通过尽å¯èƒ½å°†é€‰é¡¹å€¼è®¾ç½®ä¸ºâ€œnâ€ï¼Œåˆ›å»ºä¸€ä¸ª + ./.config文件。 + + "make randconfig" é€šè¿‡éšæœºè®¾ç½®é€‰é¡¹å€¼æ¥åˆ›å»º./.config文件。 + + "make localmodconfig" 基于当å‰é…ç½®å’ŒåŠ è½½çš„æ¨¡å—(lsmod)创建é…置。ç¦ç”¨ + å·²åŠ è½½çš„æ¨¡å—ä¸éœ€è¦çš„任何模å—选项。 + + è¦ä¸ºå¦ä¸€å°è®¡ç®—机创建localmodconfig,请将该计算机 + çš„lsmodå˜å‚¨åˆ°ä¸€ä¸ªæ–‡ä»¶ä¸ï¼Œå¹¶å°†å…¶ä½œä¸ºlsmod傿•°ä¼ 入。 + + æ¤å¤–ï¼Œé€šè¿‡åœ¨å‚æ•°LMC_KEEP䏿Œ‡å®šæ¨¡å—的路径,å¯ä»¥å°† + 模å—ä¿ç•™åœ¨æŸäº›æ–‡ä»¶å¤¹æˆ–kconfig文件ä¸ã€‚ + + target$ lsmod > /tmp/mylsmod + target$ scp /tmp/mylsmod host:/tmp + + host$ make LSMOD=/tmp/mylsmod \ + LMC_KEEP="drivers/usb:drivers/gpu:fs" \ + localmodconfig + + 上述方法在交å‰ç¼–译时也适用。 + + "make localyesconfig" 与localmodconfigç±»ä¼¼ï¼Œåªæ˜¯å®ƒä¼šå°†æ‰€æœ‰æ¨¡å—é€‰é¡¹è½¬æ¢ + 为内置(=yï¼‰ã€‚ä½ å¯ä»¥åŒæ—¶é€šè¿‡LMC_KEEPä¿ç•™æ¨¡å—。 + + "make kvmconfig" 为kvmå®¢ä½“å†…æ ¸æ”¯æŒå¯ç”¨å…¶ä»–选项。 + + "make xenconfig" 为xen dom0å®¢ä½“å†…æ ¸æ”¯æŒå¯ç”¨å…¶ä»–选项。 + + "make tinyconfig" é…置尽å¯èƒ½å°çš„å†…æ ¸ã€‚ + + 更多关于使用Linuxå†…æ ¸é…置工具的信æ¯ï¼Œè§æ–‡æ¡£ + Documentation/kbuild/kconfig.rst。 + + - ``make config`` 注æ„事项: + + - 包å«ä¸å¿…è¦çš„驱动程åºä¼šä½¿å†…æ ¸å˜å¤§ï¼Œå¹¶ä¸”在æŸäº›æƒ…况下会导致问题: + 探测ä¸å˜åœ¨çš„æŽ§åˆ¶å™¨å¡å¯èƒ½ä¼šæ··æ·†å…¶ä»–控制器。 + + - 如果å˜åœ¨å处ç†å™¨ï¼Œåˆ™ç¼–译了数å¦ä»¿çœŸçš„å†…æ ¸ä»å°†ä½¿ç”¨å处ç†å™¨ï¼šåœ¨ + è¿™ç§æƒ…况下,数å¦ä»¿çœŸæ°¸è¿œä¸ä¼šè¢«ä½¿ç”¨ã€‚å†…æ ¸ä¼šç¨å¾®å¤§ä¸€ç‚¹ï¼Œä½†ä¸ç®¡ + æ˜¯å¦æœ‰æ•°å¦å处ç†å™¨ï¼Œéƒ½å¯ä»¥åœ¨ä¸åŒçš„æœºå™¨ä¸Šå·¥ä½œã€‚ + + - “kernel hackingâ€é…ç½®ç»†èŠ‚é€šå¸¸ä¼šå¯¼è‡´æ›´å¤§æˆ–æ›´æ…¢çš„å†…æ ¸ï¼ˆæˆ–ä¸¤è€… + 兼而有之),甚至å¯ä»¥é€šè¿‡é…置一些例程æ¥ä¸»åЍå°è¯•ç ´åå代ç 以å‘现 + å†…æ ¸é—®é¢˜ï¼Œä»Žè€Œé™ä½Žå†…æ ¸çš„ç¨³å®šæ€§ï¼ˆkmalloc()ï¼‰ã€‚å› æ¤ï¼Œæ‚¨å¯èƒ½åº”该 + ç”¨äºŽç ”ç©¶â€œå¼€å‘â€ã€â€œå®žéªŒâ€æˆ–“调试â€ç‰¹æ€§ç›¸å…³é—®é¢˜ã€‚ + +ç¼–è¯‘å†…æ ¸ +--------- + + - ç¡®ä¿æ‚¨è‡³å°‘有gcc 4.9å¯ç”¨ã€‚ + 有关更多信æ¯ï¼Œè¯·å‚阅 :ref:`Documentation/process/changes.rst <changes>` 。 + + 请注æ„,您ä»ç„¶å¯ä»¥ä½¿ç”¨æ¤å†…æ ¸è¿è¡Œa.out用户程åºã€‚ + + - 执行 ``make`` æ¥åˆ›å»ºåŽ‹ç¼©å†…æ ¸æ˜ åƒã€‚如果您安装了lilo以适é…å†…æ ¸makefile, + 那么也å¯ä»¥è¿›è¡Œ ``makeinstall`` ,但是您å¯èƒ½éœ€è¦å…ˆæ£€æŸ¥ç‰¹å®šçš„lilo设置。 + + 实际安装必须以root身份执行,但任何æ£å¸¸æž„建都ä¸éœ€è¦ã€‚ + æ— é¡»å¾’ç„¶ä½¿ç”¨root身份。 + + - å¦‚æžœæ‚¨å°†å†…æ ¸çš„ä»»ä½•éƒ¨åˆ†é…置为模å—,那么还必须执行 ``make modules_install`` 。 + + - è¯¦ç»†çš„å†…æ ¸ç¼–è¯‘/生æˆè¾“出: + + é€šå¸¸ï¼Œå†…æ ¸æž„å»ºç³»ç»Ÿåœ¨ç›¸å½“å®‰é™çš„æ¨¡å¼ä¸‹è¿è¡Œï¼ˆä½†ä¸æ˜¯å®Œå…¨å®‰é™ï¼‰ã€‚但是有时您或 + å…¶ä»–å†…æ ¸å¼€å‘人员需è¦çœ‹åˆ°ç¼–译ã€é“¾æŽ¥æˆ–其他命令的执行过程。为æ¤ï¼Œå¯ä½¿ç”¨ + “verboseï¼ˆè¯¦ç»†ï¼‰â€æž„建模å¼ã€‚ + å‘ ``make`` å‘½ä»¤ä¼ é€’ ``V=1`` æ¥å®žçŽ°ï¼Œä¾‹å¦‚:: + + make V=1 all + + å¦‚éœ€æž„å»ºç³»ç»Ÿä¹Ÿç»™å‡ºå†…ä¸ªç›®æ ‡é‡å»ºçš„æ„¿æ„,请使用 ``V=2`` 。默认为 ``V=0`` 。 + + - å‡†å¤‡ä¸€ä¸ªå¤‡ä»½å†…æ ¸ä»¥é˜²å‡ºé”™ã€‚å¯¹äºŽå¼€å‘版本尤其如æ¤ï¼Œå› 为æ¯ä¸ªæ–°ç‰ˆæœ¬éƒ½åŒ…å« + 尚未调试的新代ç 。也è¦ç¡®ä¿ä¿ç•™ä¸Žè¯¥å†…æ ¸å¯¹åº”çš„æ¨¡å—的备份。如果è¦å®‰è£… + ä¸Žå·¥ä½œå†…æ ¸ç‰ˆæœ¬å·ç›¸åŒçš„æ–°å†…æ ¸ï¼Œè¯·åœ¨è¿›è¡Œ ``make modules_install`` 安装 + 之å‰å¤‡ä»½modules目录。 + + 或者,在编译之å‰ï¼Œä½¿ç”¨å†…æ ¸é…置选项“LOCALVERSIONâ€å‘å¸¸è§„å†…æ ¸ç‰ˆæœ¬é™„åŠ + 一个唯一的åŽç¼€ã€‚LOCALVERSIONå¯ä»¥åœ¨â€œGeneral Setupâ€èœå•ä¸è®¾ç½®ã€‚ + + - ä¸ºäº†å¼•å¯¼æ–°å†…æ ¸ï¼Œæ‚¨éœ€è¦å°†å†…æ ¸æ˜ åƒï¼ˆä¾‹å¦‚编译åŽçš„ + .../linux/arch/x86/boot/bzImage)å¤åˆ¶åˆ°å¸¸è§„å¯å¼•å¯¼å†…æ ¸çš„ä½ç½®ã€‚ + + - ä¸å†æ”¯æŒåœ¨æ²¡æœ‰LILOç‰å¯åŠ¨è£…è½½ç¨‹åºå¸®åŠ©çš„æƒ…å†µä¸‹ç›´æŽ¥ä»Žè½¯ç›˜å¼•å¯¼å†…æ ¸ã€‚ + + 如果从硬盘引导Linux,很å¯èƒ½ä½¿ç”¨LILO,它使用/etc/lilo.confæ–‡ä»¶ä¸ + æŒ‡å®šçš„å†…æ ¸æ˜ åƒæ–‡ä»¶ã€‚å†…æ ¸æ˜ åƒæ–‡ä»¶é€šå¸¸æ˜¯/vmlinuzã€/boot/vmlinuz〠+ /bzImage或/boot/bzImageã€‚ä½¿ç”¨æ–°å†…æ ¸å‰ï¼Œè¯·ä¿å˜æ—§æ˜ åƒçš„副本,并å¤åˆ¶ + æ–°æ˜ åƒè¦†ç›–æ—§æ˜ åƒã€‚ç„¶åŽæ‚¨ã€å¿…须釿–°è¿è¡ŒLILOã€‘æ¥æ›´æ–°åŠ è½½æ˜ å°„ï¼å¦åˆ™ï¼Œ + å°†æ— æ³•å¯åŠ¨æ–°çš„å†…æ ¸æ˜ åƒã€‚ + + 釿–°å®‰è£…LILO通常需è¦è¿è¡Œ/sbin/LILO。您å¯èƒ½å¸Œæœ›ç¼–辑/etc/lilo.conf + æ–‡ä»¶ä¸ºæ—§å†…æ ¸æ˜ åƒæŒ‡å®šä¸€ä¸ªæ¡ç›®ï¼ˆä¾‹å¦‚/vmlinux.old)é˜²æ¢æ–°çš„ä¸èƒ½æ£å¸¸ + 工作。有关更多信æ¯ï¼Œè¯·å‚阅LILO文档。 + + 釿–°å®‰è£…LILO之åŽï¼Œæ‚¨åº”该就已ç»å‡†å¤‡å¥½äº†ã€‚å…³é—ç³»ç»Ÿï¼Œé‡æ–°å¯åŠ¨ï¼Œå°½æƒ… + 享å—å§ï¼ + + å¦‚æžœéœ€è¦æ›´æ”¹å†…æ ¸æ˜ åƒä¸çš„é»˜è®¤æ ¹è®¾å¤‡ã€è§†é¢‘模å¼ç‰ï¼Œè¯·åœ¨é€‚当的地方使用 + å¯åŠ¨è£…è½½ç¨‹åºçš„å¼•å¯¼é€‰é¡¹ã€‚æ— éœ€é‡æ–°ç¼–è¯‘å†…æ ¸å³å¯æ›´æ”¹è¿™äº›å‚数。 + + - ä½¿ç”¨æ–°å†…æ ¸é‡æ–°å¯åŠ¨å¹¶äº«å—它å§ã€‚ + +è‹¥é‡åˆ°é—®é¢˜ +----------- + + - 如果您å‘现了一些å¯èƒ½ç”±äºŽå†…æ ¸ç¼ºé™·æ‰€å¯¼è‡´çš„é—®é¢˜ï¼Œè¯·æ£€æŸ¥MAINTAINERS(维护者) + æ–‡ä»¶çœ‹çœ‹æ˜¯å¦æœ‰äººä¸Žä»¤æ‚¨é‡åˆ°éº»çƒ¦çš„å†…æ ¸éƒ¨åˆ†ç›¸å…³ã€‚å¦‚æžœæ— äººåœ¨æ¤åˆ—出,那么第二 + 个最好的方案就是把它们å‘给我(torvalds@linux-foundation.org),也å¯èƒ½å‘é€ + 到任何其他相关的邮件列表或新闻组。 + + - 在所有的缺陷报告ä¸ï¼Œã€è¯·ã€‘å‘Šè¯‰æˆ‘ä»¬æ‚¨åœ¨è¯´ä»€ä¹ˆå†…æ ¸ï¼Œå¦‚ä½•å¤çŽ°é—®é¢˜ï¼Œä»¥åŠæ‚¨çš„ + 设置是什么的(使用您的常识)。如果问题是新的,请告诉我;如果问题是旧的, + 请å°è¯•告诉我您什么时候首次注æ„到它。 + + - 如果缺陷导致如下消æ¯:: + + unable to handle kernel paging request at address C0000010 + Oops: 0002 + EIP: 0010:XXXXXXXX + eax: xxxxxxxx ebx: xxxxxxxx ecx: xxxxxxxx edx: xxxxxxxx + esi: xxxxxxxx edi: xxxxxxxx ebp: xxxxxxxx + ds: xxxx es: xxxx fs: xxxx gs: xxxx + Pid: xx, process nr: xx + xx xx xx xx xx xx xx xx xx xx + + æˆ–è€…ç±»ä¼¼çš„å†…æ ¸è°ƒè¯•ä¿¡æ¯æ˜¾ç¤ºåœ¨å±å¹•上或在系统日志里,请ã€å¦‚实】å¤åˆ¶å®ƒã€‚ + å¯èƒ½å¯¹ä½ æ¥è¯´è½¬å‚¨ï¼ˆdump)看起æ¥ä¸å¯ç†è§£ï¼Œä½†å®ƒç¡®å®žåŒ…å«å¯èƒ½æœ‰åŠ©äºŽè°ƒè¯•é—®é¢˜çš„ + ä¿¡æ¯ã€‚转储上方的文本也很é‡è¦ï¼šå®ƒè¯´æ˜Žäº†å†…æ ¸è½¬å‚¨ä»£ç çš„åŽŸå› ï¼ˆåœ¨ä¸Šé¢çš„示例ä¸ï¼Œ + æ˜¯ç”±äºŽå†…æ ¸æŒ‡é’ˆé”™è¯¯ï¼‰ã€‚æ›´å¤šå…³äºŽå¦‚ä½•ç†è§£è½¬å‚¨çš„ä¿¡æ¯ï¼Œè¯·å‚è§ + Documentation/admin-guide/bug-hunting.rst。 + + - 如果使用 CONFIG_KALLSYMS ç¼–è¯‘å†…æ ¸ï¼Œåˆ™å¯ä»¥æŒ‰åŽŸæ ·å‘é€è½¬å‚¨ï¼Œå¦åˆ™å¿…须使用 + ``ksymoops`` ç¨‹åºæ¥ç†è§£è½¬å‚¨ï¼ˆä½†é€šå¸¸é¦–选使用CONFIG_KALLSYMS编译)。 + æ¤å®žç”¨ç¨‹åºå¯ä»Ž + https://www.kernel.org/pub/linux/utils/kernel/ksymoops/ 下载。 + 或者,您å¯ä»¥æ‰‹åŠ¨æ‰§è¡Œè½¬å‚¨æŸ¥æ‰¾ï¼š + + - 在调试åƒä¸Šé¢è¿™æ ·çš„转储时,如果您å¯ä»¥æŸ¥æ‰¾EIP值的å«ä¹‰ï¼Œè¿™å°†éžå¸¸æœ‰å¸®åŠ©ã€‚ + åå…进制值本身对我或其他任何人都没有太大帮助:它会å–å†³äºŽç‰¹å®šçš„å†…æ ¸è®¾ç½®ã€‚ + 您应该åšçš„æ˜¯ä»ŽEIP行获å–åå…进制值(忽略 ``0010:`` ),然åŽåœ¨å†…æ ¸åå—列表 + 䏿Ÿ¥æ‰¾å®ƒï¼Œä»¥æŸ¥çœ‹å“ªä¸ªå†…æ ¸å‡½æ•°åŒ…å«æœ‰é—®é¢˜çš„地å€ã€‚ + + è¦æ‰¾åˆ°å†…æ ¸å‡½æ•°åï¼Œæ‚¨éœ€è¦æ‰¾åˆ°ä¸Žæ˜¾ç¤ºç—‡çŠ¶çš„å†…æ ¸ç›¸å…³è”的系统二进制文件。就是 + 文件“linux/vmlinuxâ€ã€‚è¦æå–åå—åˆ—è¡¨å¹¶å°†å…¶ä¸Žå†…æ ¸å´©æºƒä¸çš„EIP进行匹é…, + 请执行:: + + nm vmlinux | sort | less + + 这将为您æä¾›ä¸€ä¸ªæŒ‰å‡åºæŽ’åºçš„å†…æ ¸åœ°å€åˆ—表,从ä¸å¾ˆå®¹æ˜“æ‰¾åˆ°åŒ…å«æœ‰é—®é¢˜çš„åœ°å€ + 的函数。请注æ„ï¼Œå†…æ ¸è°ƒè¯•æ¶ˆæ¯æä¾›çš„åœ°å€ä¸ä¸€å®šä¸Žå‡½æ•°åœ°å€å®Œå…¨åŒ¹é…(事实上, + 这是ä¸å¯èƒ½çš„ï¼‰ï¼Œå› æ¤æ‚¨ä¸èƒ½åªâ€œgrepâ€åˆ—表:ä¸è¿‡åˆ—表将为您æä¾›æ¯ä¸ªå†…æ ¸å‡½æ•° + çš„èµ·ç‚¹ï¼Œå› æ¤é€šè¿‡æŸ¥æ‰¾èµ·å§‹åœ°å€ä½ŽäºŽä½ æ£åœ¨æœç´¢çš„地å€ï¼Œä½†åŽä¸€ä¸ªå‡½æ•°çš„高于的 + å‡½æ•°ï¼Œä½ ä¼šæ‰¾åˆ°æ‚¨æƒ³è¦çš„。实际上,在您的问题报告ä¸åŠ å…¥ä¸€äº›â€œä¸Šä¸‹æ–‡â€å¯èƒ½æ˜¯ + 一个好主æ„ï¼Œç»™å‡ºç›¸å…³çš„ä¸Šä¸‹å‡ è¡Œã€‚ + + 如果您由于æŸäº›åŽŸå› æ— æ³•å®Œæˆä¸Šè¿°æ“ä½œï¼ˆå¦‚æ‚¨ä½¿ç”¨é¢„ç¼–è¯‘çš„å†…æ ¸æ˜ åƒæˆ–ç±»ä¼¼çš„æ˜ åƒï¼‰ï¼Œ + 请尽å¯èƒ½å¤šåœ°å‘Šè¯‰æˆ‘您的相关设置信æ¯ï¼Œè¿™ä¼šæœ‰æ‰€å¸®åŠ©ã€‚æœ‰å…³è¯¦ç»†ä¿¡æ¯è¯·é˜…读 + ‘Documentation/admin-guide/reporting-issues.rst’。 + + - 或者,您å¯ä»¥åœ¨æ£åœ¨è¿è¡Œçš„å†…æ ¸ä¸Šä½¿ç”¨gdb(åªè¯»çš„ï¼›å³ä¸èƒ½æ›´æ”¹å€¼æˆ–设置æ–点)。 + 为æ¤ï¼Œè¯·é¦–先使用-gç¼–è¯‘å†…æ ¸ï¼›é€‚å½“åœ°ç¼–è¾‘arch/x86/Makefileï¼Œç„¶åŽæ‰§è¡Œ ``make + clean`` 。您还需è¦å¯ç”¨CONFIG_PROC_FS(通过 ``make config`` )。 + + ä½¿ç”¨æ–°å†…æ ¸é‡æ–°å¯åЍåŽï¼Œæ‰§è¡Œ ``gdb vmlinux /proc/kcore`` 。现在å¯ä»¥ä½¿ç”¨æ‰€æœ‰ + 普通的gdb命令。查找系统崩溃点的命令是 ``l *0xXXXXXXXX`` (将xxx替æ¢ä¸ºEIP + 值)。 + + 用gdbæ— æ³•è°ƒè¯•ä¸€ä¸ªå½“å‰æœªè¿è¡Œçš„å†…æ ¸æ˜¯ç”±äºŽgdbï¼ˆé”™è¯¯åœ°ï¼‰å¿½ç•¥äº†ç¼–è¯‘å†…æ ¸çš„èµ·å§‹ + åç§»é‡ã€‚ diff --git a/Documentation/translations/zh_CN/admin-guide/bug-bisect.rst b/Documentation/translations/zh_CN/admin-guide/bug-bisect.rst new file mode 100644 index 0000000000000000000000000000000000000000..662eb5b46e84ec2190c4ee388936621ef43f644b --- /dev/null +++ b/Documentation/translations/zh_CN/admin-guide/bug-bisect.rst @@ -0,0 +1,81 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: :doc:`../../../admin-guide/bug-bisect` + +:译者: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@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>`_ diff --git a/Documentation/translations/zh_CN/admin-guide/bug-hunting.rst b/Documentation/translations/zh_CN/admin-guide/bug-hunting.rst new file mode 100644 index 0000000000000000000000000000000000000000..decb9b26d2f1ae701d23129f1bb9e87f7e45a4b0 --- /dev/null +++ b/Documentation/translations/zh_CN/admin-guide/bug-hunting.rst @@ -0,0 +1,340 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: :doc:`../../../admin-guide/bug-hunting` + +:译者: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> + +追踪缺陷 +========= + +å†…æ ¸é”™è¯¯æŠ¥å‘Šé€šå¸¸é™„å¸¦å¦‚ä¸‹å †æ ˆè½¬å‚¨:: + + ------------[ cut here ]------------ + WARNING: CPU: 1 PID: 28102 at kernel/module.c:1108 module_put+0x57/0x70 + Modules linked in: dvb_usb_gp8psk(-) dvb_usb dvb_core nvidia_drm(PO) nvidia_modeset(PO) snd_hda_codec_hdmi snd_hda_intel snd_hda_codec snd_hwdep snd_hda_core snd_pcm snd_timer snd soundcore nvidia(PO) [last unloaded: rc_core] + CPU: 1 PID: 28102 Comm: rmmod Tainted: P WC O 4.8.4-build.1 #1 + Hardware name: MSI MS-7309/MS-7309, BIOS V1.12 02/23/2009 + 00000000 c12ba080 00000000 00000000 c103ed6a c1616014 00000001 00006dc6 + c1615862 00000454 c109e8a7 c109e8a7 00000009 ffffffff 00000000 f13f6a10 + f5f5a600 c103ee33 00000009 00000000 00000000 c109e8a7 f80ca4d0 c109f617 + Call Trace: + [<c12ba080>] ? dump_stack+0x44/0x64 + [<c103ed6a>] ? __warn+0xfa/0x120 + [<c109e8a7>] ? module_put+0x57/0x70 + [<c109e8a7>] ? module_put+0x57/0x70 + [<c103ee33>] ? warn_slowpath_null+0x23/0x30 + [<c109e8a7>] ? module_put+0x57/0x70 + [<f80ca4d0>] ? gp8psk_fe_set_frontend+0x460/0x460 [dvb_usb_gp8psk] + [<c109f617>] ? symbol_put_addr+0x27/0x50 + [<f80bc9ca>] ? dvb_usb_adapter_frontend_exit+0x3a/0x70 [dvb_usb] + [<f80bb3bf>] ? dvb_usb_exit+0x2f/0xd0 [dvb_usb] + [<c13d03bc>] ? usb_disable_endpoint+0x7c/0xb0 + [<f80bb48a>] ? dvb_usb_device_exit+0x2a/0x50 [dvb_usb] + [<c13d2882>] ? usb_unbind_interface+0x62/0x250 + [<c136b514>] ? __pm_runtime_idle+0x44/0x70 + [<c13620d8>] ? __device_release_driver+0x78/0x120 + [<c1362907>] ? driver_detach+0x87/0x90 + [<c1361c48>] ? bus_remove_driver+0x38/0x90 + [<c13d1c18>] ? usb_deregister+0x58/0xb0 + [<c109fbb0>] ? SyS_delete_module+0x130/0x1f0 + [<c1055654>] ? task_work_run+0x64/0x80 + [<c1000fa5>] ? exit_to_usermode_loop+0x85/0x90 + [<c10013f0>] ? do_fast_syscall_32+0x80/0x130 + [<c1549f43>] ? sysenter_past_esp+0x40/0x6a + ---[ end trace 6ebc60ef3981792f ]--- + +è¿™æ ·çš„å †æ ˆè·Ÿè¸ªæä¾›äº†è¶³å¤Ÿçš„ä¿¡æ¯æ¥è¯†åˆ«å†…æ ¸æºä»£ç ä¸å‘ç”Ÿé”™è¯¯çš„é‚£ä¸€è¡Œã€‚æ ¹æ®é—®é¢˜çš„ +䏥釿€§ï¼Œå®ƒè¿˜å¯èƒ½åŒ…å« **“Oopsâ€** 一è¯ï¼Œæ¯”如:: + + BUG: unable to handle kernel NULL pointer dereference at (null) + IP: [<c06969d4>] iret_exc+0x7d0/0xa59 + *pdpt = 000000002258a001 *pde = 0000000000000000 + Oops: 0002 [#1] PREEMPT SMP + ... + +尽管有 **Oops** æˆ–å…¶ä»–ç±»åž‹çš„å †æ ˆè·Ÿè¸ªï¼Œä½†é€šå¸¸éœ€è¦æ‰¾åˆ°å‡ºé—®é¢˜çš„行æ¥è¯†åˆ«å’Œå¤„ç†ç¼º +é™·ã€‚åœ¨æœ¬ç« ä¸ï¼Œæˆ‘们将å‚考“Oopsâ€æ¥äº†è§£éœ€è¦åˆ†æžçš„å„ç§å †æ ˆè·Ÿè¸ªã€‚ + +å¦‚æžœå†…æ ¸æ˜¯ç”¨ ``CONFIG_DEBUG_INFO`` 编译的,那么å¯ä»¥ä½¿ç”¨æ–‡ä»¶ï¼š +`scripts/decode_stacktrace.sh` 。 + +é“¾æŽ¥çš„æ¨¡å— +----------- + +å—到污染或æ£åœ¨åŠ è½½/å¸è½½çš„æ¨¡å—ç”¨â€œï¼ˆâ€¦ï¼‰â€æ ‡è®°ï¼Œæ±¡æŸ“æ ‡å¿—åœ¨ +`Documentation/admin-guide/tainted-kernels.rst` 文件ä¸è¿›è¡Œäº†æè¿°ï¼Œâ€œæ£åœ¨è¢«åŠ +è½½â€ç”¨â€œ+â€æ ‡æ³¨ï¼Œâ€œæ£åœ¨è¢«å¸è½½â€ç”¨â€œ-â€æ ‡æ³¨ã€‚ + + +Oops消æ¯åœ¨å“ªï¼Ÿ +--------------- + +通常,Oops文本由klogdä»Žå†…æ ¸ç¼“å†²åŒºè¯»å–,然åŽäº¤ç»™ ``syslogd`` ,åŽè€…将其写入 +syslog文件,通常是 ``/var/log/messages`` (å–决于 ``/etc/syslog.conf`` )。 +在使用systemd的系统上,它也å¯ä»¥ç”± ``journald`` 守护进程å˜å‚¨ï¼Œå¹¶é€šè¿‡è¿è¡Œ +``journalctl`` 命令进行访问。 + +有时 ``klogd`` ä¼šæŒ‚æŽ‰ï¼Œè¿™ç§æƒ…况下您å¯ä»¥è¿è¡Œ ``dmesg > file`` ä»Žå†…æ ¸ç¼“å†²åŒº +è¯»å–æ•°æ®å¹¶ä¿å˜å®ƒã€‚或者您å¯ä»¥ ``cat /proc/kmsg > file`` ,但是您必须适时 +䏿–ä»¥åœæ¢ä¼ è¾“ï¼Œå› ä¸º ``kmsg`` æ˜¯ä¸€ä¸ªâ€œæ°¸æ— æ¢å¢ƒçš„æ–‡ä»¶â€ã€‚ + +如果机器严é‡å´©æºƒï¼Œæ— 法输入命令或ç£ç›˜ä¸å¯ç”¨ï¼Œé‚£è¿˜æœ‰ä¸‰ä¸ªé€‰é¡¹ï¼š + +(1) 手动å¤åˆ¶å±å¹•ä¸Šçš„æ–‡æœ¬ï¼Œå¹¶åœ¨æœºå™¨é‡æ–°å¯åЍåŽè¾“入。很难å—,但这是çªç„¶å´©æºƒä¸‹ + å”¯ä¸€çš„é€‰æ‹©ã€‚æˆ–è€…ä½ å¯ä»¥ç”¨æ•°ç 相机æ‹ä¸‹å±å¹•——虽然ä¸é‚£ä¹ˆå¥½ï¼Œä½†æ€»æ¯”什么都没 + æœ‰å¥½ã€‚å¦‚æžœæ¶ˆæ¯æ»šåŠ¨è¶…å‡ºæŽ§åˆ¶å°é¡¶éƒ¨ï¼Œä½¿ç”¨æ›´é«˜åˆ†è¾¨çŽ‡ï¼ˆä¾‹å¦‚ ``vga=791`` ) + 引导å¯åЍ将å…许您阅读更多文本。(è¦å‘Šï¼šè¿™éœ€è¦ ``vesafb`` ï¼Œå› æ¤å¯¹â€œæ—©æœŸâ€ + çš„Oppses没有帮助) + +(2) 从串å£ç»ˆç«¯å¯åŠ¨ï¼ˆå‚è§ + :ref:`Documentation/admin-guide/serial-console.rst <serial_console>` ), + 在å¦ä¸€å°æœºå™¨ä¸Šè¿è¡Œè°ƒåˆ¶è§£è°ƒå™¨ç„¶åŽç”¨ä½ å–œæ¬¢çš„é€šä¿¡ç¨‹åºæ•获输出。 + Minicomè¿è¡Œè‰¯å¥½ã€‚ + +(3) 使用Kdump(å‚阅 Documentation/admin-guide/kdump/kdump.rst ),使用 + Documentation/admin-guide/kdump/gdbmacros.txt ä¸çš„dmesg gdbmacroä»Žæ—§å†…å˜ + 䏿å–å†…æ ¸çŽ¯å½¢ç¼“å†²åŒºã€‚ + +找到缺陷ä½ç½® +------------- + +å¦‚æžœä½ èƒ½æŒ‡å‡ºç¼ºé™·åœ¨å†…æ ¸æºä»£ç ä¸çš„ä½ç½®ï¼Œåˆ™æŠ¥å‘Šç¼ºé™·çš„æ•ˆæžœä¼šéžå¸¸å¥½ã€‚è¿™æœ‰ä¸¤ç§æ–¹æ³•。 +通常æ¥è¯´ä½¿ç”¨ ``gdb`` 会比较容易,ä¸è¿‡å†…æ ¸éœ€è¦ç”¨è°ƒè¯•ä¿¡æ¯æ¥é¢„编译。 + +gdb +^^^^ + +GNU 调试器(GNU debugger, ``gdb`` )是从 ``vmlinux`` æ–‡ä»¶ä¸æ‰¾å‡ºOOPS的确切 +文件和行å·çš„æœ€ä½³æ–¹æ³•。 + +在使用 ``CONFIG_DEBUG_INFO`` ç¼–è¯‘çš„å†…æ ¸ä¸Šä½¿ç”¨gdb效果最好。å¯é€šè¿‡è¿è¡Œä»¥ä¸‹å‘½ä»¤ +进行设置:: + + $ ./scripts/config -d COMPILE_TEST -e DEBUG_KERNEL -e DEBUG_INFO + +在用 ``CONFIG_DEBUG_INFO`` ç¼–è¯‘çš„å†…æ ¸ä¸Šï¼Œä½ å¯ä»¥ç›´æŽ¥ä»ŽOOPSå¤åˆ¶EIP值:: + + EIP: 0060:[<c021e50e>] Not tainted VLI + +并使用GDBæ¥å°†å…¶ç¿»è¯‘æˆå¯è¯»å½¢å¼:: + + $ gdb vmlinux + (gdb) l *0xc021e50e + +如果没有å¯ç”¨ ``CONFIG_DEBUG_INFO`` ,则使用OOPS的函数åç§»:: + + EIP is at vt_ioctl+0xda8/0x1482 + +并在å¯ç”¨ ``CONFIG_DEBUG_INFO`` çš„æƒ…å†µä¸‹é‡æ–°ç¼–è¯‘å†…æ ¸:: + + $ ./scripts/config -d COMPILE_TEST -e DEBUG_KERNEL -e DEBUG_INFO + $ make vmlinux + $ gdb vmlinux + (gdb) l *vt_ioctl+0xda8 + 0x1888 is in vt_ioctl (drivers/tty/vt/vt_ioctl.c:293). + 288 { + 289 struct vc_data *vc = NULL; + 290 int ret = 0; + 291 + 292 console_lock(); + 293 if (VT_BUSY(vc_num)) + 294 ret = -EBUSY; + 295 else if (vc_num) + 296 vc = vc_deallocate(vc_num); + 297 console_unlock(); + +æˆ–è€…è‹¥æ‚¨æƒ³è¦æ›´è¯¦ç»†çš„æ˜¾ç¤º:: + + (gdb) p vt_ioctl + $1 = {int (struct tty_struct *, unsigned int, unsigned long)} 0xae0 <vt_ioctl> + (gdb) l *0xae0+0xda8 + +您也å¯ä»¥ä½¿ç”¨å¯¹è±¡æ–‡ä»¶ä½œä¸ºæ›¿ä»£:: + + $ make drivers/tty/ + $ gdb drivers/tty/vt/vt_ioctl.o + (gdb) l *vt_ioctl+0xda8 + +å¦‚æžœä½ æœ‰è°ƒç”¨è·Ÿè¸ªï¼Œç±»ä¼¼:: + + Call Trace: + [<ffffffff8802c8e9>] :jbd:log_wait_commit+0xa3/0xf5 + [<ffffffff810482d9>] autoremove_wake_function+0x0/0x2e + [<ffffffff8802770b>] :jbd:journal_stop+0x1be/0x1ee + ... + +这表明问题å¯èƒ½åœ¨ :jbd: 模å—ä¸ã€‚您å¯ä»¥åœ¨gdbä¸åŠ è½½è¯¥æ¨¡å—并列出相关代ç :: + + $ gdb fs/jbd/jbd.ko + (gdb) l *log_wait_commit+0xa3 + +.. note:: + + 您还å¯ä»¥å¯¹å †æ ˆè·Ÿè¸ªå¤„的任何函数调用执行相åŒçš„æ“ä½œï¼Œä¾‹å¦‚:: + + [<f80bc9ca>] ? dvb_usb_adapter_frontend_exit+0x3a/0x70 [dvb_usb] + + 上述调用å‘生的ä½ç½®å¯ä»¥é€šè¿‡ä»¥ä¸‹æ–¹å¼çœ‹åˆ°:: + + $ gdb drivers/media/usb/dvb-usb/dvb-usb.o + (gdb) l *dvb_usb_adapter_frontend_exit+0x3a + +objdump +^^^^^^^^ + +è¦è°ƒè¯•å†…æ ¸ï¼Œè¯·ä½¿ç”¨objdumpå¹¶ä»Žå´©æºƒè¾“å‡ºä¸æŸ¥æ‰¾åå…进制å移,以找到有效的代ç /汇 +编行。如果没有调试符å·ï¼Œæ‚¨å°†çœ‹åˆ°æ‰€ç¤ºä¾‹ç¨‹çš„æ±‡ç¼–程åºä»£ç ï¼Œä½†æ˜¯å¦‚æžœå†…æ ¸æœ‰è°ƒè¯• +符å·ï¼ŒC代ç 也将å¯è§ï¼ˆè°ƒè¯•符å·å¯ä»¥åœ¨å†…æ ¸é…ç½®èœå•çš„hacking项ä¸å¯ç”¨ï¼‰ã€‚例如:: + + $ objdump -r -S -l --disassemble net/dccp/ipv4.o + +.. note:: + + 您需è¦å¤„äºŽå†…æ ¸æ ‘çš„é¡¶å±‚ä»¥ä¾¿æ¤èŽ·å¾—æ‚¨çš„C文件。 + +å¦‚æžœæ‚¨æ— æ³•è®¿é—®æºä»£ç ,ä»ç„¶å¯ä»¥ä½¿ç”¨ä»¥ä¸‹æ–¹æ³•调试一些崩溃转储(如Dave Millerçš„ +示例崩溃转储输出所示):: + + EIP is at +0x14/0x4c0 + ... + Code: 44 24 04 e8 6f 05 00 00 e9 e8 fe ff ff 8d 76 00 8d bc 27 00 00 + 00 00 55 57 56 53 81 ec bc 00 00 00 8b ac 24 d0 00 00 00 8b 5d 08 + <8b> 83 3c 01 00 00 89 44 24 14 8b 45 28 85 c0 89 44 24 18 0f 85 + + Put the bytes into a "foo.s" file like this: + + .text + .globl foo + foo: + .byte .... /* bytes from Code: part of OOPS dump */ + + Compile it with "gcc -c -o foo.o foo.s" then look at the output of + "objdump --disassemble foo.o". + + Output: + + ip_queue_xmit: + push %ebp + push %edi + push %esi + push %ebx + sub $0xbc, %esp + mov 0xd0(%esp), %ebp ! %ebp = arg0 (skb) + mov 0x8(%ebp), %ebx ! %ebx = skb->sk + mov 0x13c(%ebx), %eax ! %eax = inet_sk(sk)->opt + +`scripts/decodecode` 文件å¯ä»¥ç”¨æ¥è‡ªåŠ¨å®Œæˆå¤§éƒ¨åˆ†å·¥ä½œï¼Œè¿™å–决于æ£åœ¨è°ƒè¯•çš„CPU +体系结构。 + +报告缺陷 +--------- + +ä¸€æ—¦ä½ é€šè¿‡å®šä½ç¼ºé™·æ‰¾åˆ°äº†å…¶å‘ç”Ÿçš„åœ°æ–¹ï¼Œä½ å¯ä»¥å°è¯•自己修å¤å®ƒæˆ–者å‘上游报告它。 + +为了å‘上游报告,您应该找出用于开å‘å—å½±å“代ç 的邮件列表。这å¯ä»¥ä½¿ç”¨ ``get_maintainer.pl`` 。 + + +例如,您在gspcaçš„sonixj.c文件ä¸å‘现一个缺陷,则å¯ä»¥é€šè¿‡ä»¥ä¸‹æ–¹æ³•找到它的维护者:: + + $ ./scripts/get_maintainer.pl -f drivers/media/usb/gspca/sonixj.c + Hans Verkuil <hverkuil@xs4all.nl> (odd fixer:GSPCA USB WEBCAM DRIVER,commit_signer:1/1=100%) + Mauro Carvalho Chehab <mchehab@kernel.org> (maintainer:MEDIA INPUT INFRASTRUCTURE (V4L/DVB),commit_signer:1/1=100%) + Tejun Heo <tj@kernel.org> (commit_signer:1/1=100%) + Bhaktipriya Shridhar <bhaktipriya96@gmail.com> (commit_signer:1/1=100%,authored:1/1=100%,added_lines:4/4=100%,removed_lines:9/9=100%) + linux-media@vger.kernel.org (open list:GSPCA USB WEBCAM DRIVER) + linux-kernel@vger.kernel.org (open list) + +请注æ„它将指出: + +- æœ€åŽæŽ¥è§¦æºä»£ç 的开å‘人员(如果这是在gitæ ‘ä¸å®Œæˆçš„)。在上é¢çš„例å䏿˜¯Tejun + å’ŒBhaktipriya(在这个特定的案例ä¸ï¼Œæ²¡æœ‰äººçœŸæ£å‚与这个文件的开å‘); +- 驱动维护人员(Hans Verkuil); +- å系统维护人员(Mauro Carvalho Chehab); +- 驱动程åºå’Œ/或å系统邮件列表(linux-media@vger.kernel.org); +- Linuxå†…æ ¸é‚®ä»¶åˆ—è¡¨ï¼ˆlinux-kernel@vger.kernel.org)。 + +通常,修å¤ç¼ºé™·çš„æœ€å¿«æ–¹æ³•是将它报告给用于开å‘相关代ç 的邮件列表(linux-media +ML),抄é€é©±åŠ¨ç¨‹åºç»´æŠ¤è€…(Hans)。 + +å¦‚æžœä½ å®Œå…¨ä¸çŸ¥é“该把报告寄给è°ï¼Œä¸” ``get_maintainer.pl`` 也没有æä¾›ä»»ä½•有用 +的信æ¯ï¼Œè¯·å‘é€åˆ°linux-kernel@vger.kernel.org。 + +感谢您的帮助,这使Linuxå°½å¯èƒ½ç¨³å®š:-) + +ä¿®å¤ç¼ºé™· +--------- + +å¦‚æžœä½ æ‡‚å¾—ç¼–ç¨‹ï¼Œä½ ä¸ä»…å¯ä»¥é€šè¿‡æŠ¥å‘Šé”™è¯¯æ¥å¸®åŠ©æˆ‘ä»¬ï¼Œè¿˜å¯ä»¥æä¾›ä¸€ä¸ªè§£å†³æ–¹æ¡ˆã€‚ +毕竟,开æºå°±æ˜¯åˆ†äº«ä½ çš„å·¥ä½œï¼Œä½ ä¸æƒ³å› ä¸ºä½ çš„å¤©æ‰è€Œè¢«è®¤å¯å—? + +å¦‚æžœä½ å†³å®šè¿™æ ·åšï¼Œè¯·åœ¨åˆ¶å®šè§£å†³æ–¹æ¡ˆåŽå°†å…¶æäº¤åˆ°ä¸Šæ¸¸ã€‚ + +请务必阅读 +:ref:`Documentation/process/submitting-patches.rst <submittingpatches>` , +以帮助您的代ç 被接å—。 + + +--------------------------------------------------------------------------- + +用 ``klogd`` 进行Oops跟踪的注æ„事项 +------------------------------------ + +为了帮助Linuså’Œå…¶ä»–å†…æ ¸å¼€å‘人员, ``klogd`` å¯¹ä¿æŠ¤æ•…éšœçš„å¤„ç†æä¾›äº†å¤§é‡æ”¯æŒã€‚ +为了完整支æŒåœ°å€è§£æžï¼Œè‡³å°‘应该使用 ``sysklogd`` 包的1.3-pl3版本。 + +当å‘ç”Ÿä¿æŠ¤æ•…éšœæ—¶ï¼Œ ``klogd`` å®ˆæŠ¤è¿›ç¨‹ä¼šè‡ªåŠ¨å°†å†…æ ¸æ—¥å¿—æ¶ˆæ¯ä¸çš„é‡è¦åœ°å€è½¬æ¢ä¸º +å®ƒä»¬çš„ç‰æ•ˆç¬¦å·ã€‚ç„¶åŽé€šè¿‡ ``klogd`` 使用的任何报告机制æ¥è½¬å‘è¿™ä¸ªå·²ç¿»è¯‘çš„å†…æ ¸ +消æ¯ã€‚ä¿æŠ¤é”™è¯¯æ¶ˆæ¯å¯ä»¥ç›´æŽ¥ä»Žæ¶ˆæ¯æ–‡ä»¶ä¸å‰ªåˆ‡å‡ºæ¥å¹¶è½¬å‘ç»™å†…æ ¸å¼€å‘人员。 + +``klogd`` 执行两ç§ç±»åž‹çš„地å€è§£æžï¼Œé™æ€ç¿»è¯‘和动æ€ç¿»è¯‘ã€‚é™æ€ç¿»è¯‘使用System.map +æ–‡ä»¶ã€‚ä¸ºäº†è¿›è¡Œé™æ€è½¬æ¢ï¼Œ ``klogd`` 守护进程必须能够在守护进程åˆå§‹åŒ–时找到系 +ç»Ÿæ˜ å°„æ–‡ä»¶ã€‚æœ‰å…³ ``klogd`` 如何æœç´¢æ˜ 射文件的信æ¯ï¼Œè¯·å‚è§klogd手册页。 + +å½“ä½¿ç”¨å†…æ ¸å¯åŠ è½½æ¨¡å—æ—¶ï¼ŒåЍæ€åœ°å€è½¬æ¢éžå¸¸é‡è¦ã€‚ç”±äºŽå†…æ ¸æ¨¡å—çš„å†…å˜æ˜¯ä»Žå†…æ ¸çš„ +动æ€å†…å˜æ± ä¸åˆ†é…çš„ï¼Œå› æ¤æ— 论是模å—的开头还是模å—ä¸çš„函数和符å·éƒ½æ²¡æœ‰å›ºå®šçš„ +ä½ç½®ã€‚ + +å†…æ ¸æ”¯æŒç³»ç»Ÿè°ƒç”¨ï¼Œå…许程åºç¡®å®šåŠ è½½å“ªäº›æ¨¡å—åŠå…¶åœ¨å†…å˜ä¸çš„ä½ç½®ã€‚klogd守护进程 +使用这些系统调用构建了一个符å·è¡¨ï¼Œå¯ç”¨äºŽè°ƒè¯•å¯åŠ è½½å†…æ ¸æ¨¡å—ä¸å‘ç”Ÿçš„ä¿æŠ¤é”™è¯¯ã€‚ + +klogd至少会æä¾›äº§ç”Ÿä¿æŠ¤æ•…障的模å—çš„å称。如果å¯åŠ è½½æ¨¡å—的开å‘äººå‘˜é€‰æ‹©ä»Žæ¨¡å— +导出符å·ä¿¡æ¯ï¼Œåˆ™å¯èƒ½ä¼šæœ‰å…¶ä»–å¯ç”¨çš„符å·ä¿¡æ¯ã€‚ + +ç”±äºŽå†…æ ¸æ¨¡å—环境å¯ä»¥æ˜¯åЍæ€çš„ï¼Œå› æ¤å½“模å—环境å‘生å˜åŒ–时,必须有一ç§é€šçŸ¥ +``klogd`` 守护进程的机制。有一些å¯ç”¨çš„命令行选项å…许klogdå‘当剿£åœ¨æ‰§è¡Œçš„守 +护进程å‘出信å·ç¤ºæ„应该刷新符å·ä¿¡æ¯ã€‚有关更多信æ¯ï¼Œè¯·å‚阅 ``klogd`` 手册页。 + +sysklogdå‘行版附带了一个补ä¸ï¼Œå®ƒä¿®æ”¹äº† ``modules-2.0.0`` åŒ…ï¼Œä»¥ä¾¿åœ¨åŠ è½½æˆ– +å¸è½½æ¨¡å—时自动å‘klogdå‘é€ä¿¡å·ã€‚应用æ¤è¡¥ä¸åŸºæœ¬ä¸Šå¯æ— ç¼æ”¯æŒè°ƒè¯•å†…æ ¸å¯åŠ è½½æ¨¡å— +å‘ç”Ÿçš„ä¿æŠ¤æ•…éšœã€‚ + +以下是 ``klogd`` 处ç†çš„å¯åŠ è½½æ¨¡å—ä¸çš„ä¿æŠ¤æ•…éšœç¤ºä¾‹:: + + Aug 29 09:51:01 blizard kernel: Unable to handle kernel paging request at virtual address f15e97cc + Aug 29 09:51:01 blizard kernel: current->tss.cr3 = 0062d000, %cr3 = 0062d000 + Aug 29 09:51:01 blizard kernel: *pde = 00000000 + Aug 29 09:51:01 blizard kernel: Oops: 0002 + Aug 29 09:51:01 blizard kernel: CPU: 0 + Aug 29 09:51:01 blizard kernel: EIP: 0010:[oops:_oops+16/3868] + Aug 29 09:51:01 blizard kernel: EFLAGS: 00010212 + Aug 29 09:51:01 blizard kernel: eax: 315e97cc ebx: 003a6f80 ecx: 001be77b edx: 00237c0c + Aug 29 09:51:01 blizard kernel: esi: 00000000 edi: bffffdb3 ebp: 00589f90 esp: 00589f8c + Aug 29 09:51:01 blizard kernel: ds: 0018 es: 0018 fs: 002b gs: 002b ss: 0018 + Aug 29 09:51:01 blizard kernel: Process oops_test (pid: 3374, process nr: 21, stackpage=00589000) + Aug 29 09:51:01 blizard kernel: Stack: 315e97cc 00589f98 0100b0b4 bffffed4 0012e38e 00240c64 003a6f80 00000001 + Aug 29 09:51:01 blizard kernel: 00000000 00237810 bfffff00 0010a7fa 00000003 00000001 00000000 bfffff00 + Aug 29 09:51:01 blizard kernel: bffffdb3 bffffed4 ffffffda 0000002b 0007002b 0000002b 0000002b 00000036 + Aug 29 09:51:01 blizard kernel: Call Trace: [oops:_oops_ioctl+48/80] [_sys_ioctl+254/272] [_system_call+82/128] + Aug 29 09:51:01 blizard kernel: Code: c7 00 05 00 00 00 eb 08 90 90 90 90 90 90 90 90 89 ec 5d c3 + +--------------------------------------------------------------------------- + +:: + + Dr. G.W. Wettstein Oncology Research Div. Computing Facility + Roger Maris Cancer Center INTERNET: greg@wind.rmcc.com + 820 4th St. N. + Fargo, ND 58122 + Phone: 701-234-7556 diff --git a/Documentation/translations/zh_CN/admin-guide/index.rst b/Documentation/translations/zh_CN/admin-guide/index.rst index 48bbd3ebad484fa15d68283ac796f1370f1de926..be835ec8e632a4115cc2f77ef2bab809625a5e0d 100644 --- a/Documentation/translations/zh_CN/admin-guide/index.rst +++ b/Documentation/translations/zh_CN/admin-guide/index.rst @@ -13,9 +13,13 @@ Linux å†…æ ¸ç”¨æˆ·å’Œç®¡ç†å‘˜æŒ‡å— 这个åˆå§‹éƒ¨åˆ†åŒ…嫿€»ä½“ä¿¡æ¯ï¼ŒåŒ…括æè¿°å†…æ ¸çš„README, å…³äºŽå†…æ ¸å‚æ•°çš„æ–‡æ¡£ç‰ã€‚ -Todolist: +.. toctree:: + :maxdepth: 1 README + +Todolist: + kernel-parameters devices sysctl/index @@ -28,16 +32,21 @@ Todolist: 下é¢çš„一组文档,针对的是试图跟踪问题和bug的用户。 -Todolist: +.. toctree:: + :maxdepth: 1 - reporting-bugs + reporting-issues security-bugs bug-hunting bug-bisect tainted-kernels + init + +Todolist: + + reporting-bugs ramoops dynamic-debug-howto - init kdump/index perf/index @@ -56,6 +65,7 @@ Todolist: clearing-warn-once cpu-load + unicode Todolist: @@ -111,7 +121,6 @@ Todolist: sysrq thunderbolt ufs - unicode vga-softcursor video-output xfs diff --git a/Documentation/translations/zh_CN/admin-guide/init.rst b/Documentation/translations/zh_CN/admin-guide/init.rst new file mode 100644 index 0000000000000000000000000000000000000000..fbaf6d97f86c9931950657ede64c7b0b75b21931 --- /dev/null +++ b/Documentation/translations/zh_CN/admin-guide/init.rst @@ -0,0 +1,54 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: :doc:`../../../admin-guide/init` + +:译者: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@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()`` 调用,并在失败时通过è¿ä»£ **所有** 结果æ¥è®°å½•一切 + (éžå¸¸é‡è¦çš„å¯ç”¨æ€§ä¿®å¤ï¼‰ã€‚ +- 试ç€ä½¿å®žçŽ°æœ¬èº«åœ¨ä¸€èˆ¬æƒ…å†µä¸‹æ›´æœ‰å¸®åŠ©ï¼Œä¾‹å¦‚åœ¨å—å½±å“的地方æä¾›é¢å¤–的错误消æ¯ã€‚ diff --git a/Documentation/translations/zh_CN/admin-guide/reporting-issues.rst b/Documentation/translations/zh_CN/admin-guide/reporting-issues.rst new file mode 100644 index 0000000000000000000000000000000000000000..6b4988da2c5a8cc50a81d88956dbb340e2fc7a97 --- /dev/null +++ b/Documentation/translations/zh_CN/admin-guide/reporting-issues.rst @@ -0,0 +1,1335 @@ +.. SPDX-License-Identifier: (GPL-2.0+ OR CC-BY-4.0) +.. + If you want to distribute this text under CC-BY-4.0 only, please use 'The + Linux kernel developers' for author attribution and link this as source: + https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/Documentation/admin-guide/reporting-issues.rst +.. + Note: Only the content of this RST file as found in the Linux kernel sources + is available under CC-BY-4.0, as versions of this text that were processed + (for example by the kernel's build system) might contain content taken from + files which use a more restrictive license. + +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/admin-guide/reporting-issues.rst + +:译者: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> + + +报告问题 ++++++++++ + + +简明指å—ï¼ˆäº¦å³ å¤ªé•¿ä¸çœ‹ï¼‰ +========================== + +您é¢ä¸´çš„æ˜¯å¦ä¸ºåŒç³»åˆ—稳定版或长期支æŒå†…æ ¸çš„æ™®é€šå†…æ ¸çš„å›žå½’ï¼Ÿæ˜¯å¦ä»ç„¶å—支æŒï¼Ÿ +请æœç´¢ `LKMLå†…æ ¸é‚®ä»¶åˆ—è¡¨ <https://lore.kernel.org/lkml/>`_ å’Œ +`Linux稳定版邮件列表 <https://lore.kernel.org/stable/>`_ å˜æ¡£ä¸åŒ¹é…的报告并 +åŠ å…¥è®¨è®ºã€‚å¦‚æžœæ‰¾ä¸åˆ°åŒ¹é…的报告,请安装该系列的最新版本。如果它ä»ç„¶å‡ºçŽ°é—®é¢˜ï¼Œ +报告给稳定版邮件列表(stable@vger.kernel.org)。 + +在所有其他情况下,请尽å¯èƒ½çŒœæµ‹æ˜¯å“ªä¸ªå†…æ ¸éƒ¨åˆ†å¯¼è‡´äº†é—®é¢˜ã€‚æŸ¥çœ‹MAINTAINERS文件, +了解开å‘人员希望如何得知问题,大多数情况下,报告问题都是通过电åé‚®ä»¶å’ŒæŠ„é€ +ç›¸å…³é‚®ä»¶åˆ—è¡¨è¿›è¡Œçš„ã€‚æ£€æŸ¥æŠ¥å‘Šç›®çš„åœ°çš„å˜æ¡£ä¸æ˜¯å¦å·²æœ‰åŒ¹é…的报告;也请æœç´¢ +`LKML <https://lore.kernel.org/lkml/>`_ 和网络。如果找ä¸åˆ°å¯åŠ å…¥çš„è®¨è®ºï¼Œè¯· +安装 `æœ€æ–°çš„ä¸»çº¿å†…æ ¸ <https://kernel.org/>`_ 。如果ä»å˜åœ¨é—®é¢˜ï¼Œè¯·å‘é€æŠ¥å‘Šã€‚ + +问题已ç»è§£å†³äº†ï¼Œä½†æ˜¯æ‚¨å¸Œæœ›çœ‹åˆ°å®ƒåœ¨ä¸€ä¸ªä»ç„¶æ”¯æŒçš„稳定版或长期支æŒç³»åˆ—ä¸å¾—到 +è§£å†³ï¼Ÿè¯·å®‰è£…å…¶æœ€æ–°ç‰ˆæœ¬ã€‚å¦‚æžœå®ƒå‡ºçŽ°äº†é—®é¢˜ï¼Œé‚£ä¹ˆåœ¨ä¸»çº¿ä¸æœç´¢ä¿®å¤å®ƒçš„æ›´æ”¹ï¼Œå¹¶ +æ£€æŸ¥æ˜¯å¦æ£åœ¨å›žä¼ (backporting)或者已放弃;如果两者都没有,那么å¯è¯¢é—®å¤„ç† +更改的人员。 + +**通用æé†’** ï¼šå½“å®‰è£…å’Œæµ‹è¯•ä¸Šè¿°å†…æ ¸æ—¶ï¼Œè¯·ç¡®ä¿å®ƒæ˜¯æ™®é€šçš„(å³ï¼šæ²¡æœ‰è¡¥ä¸ï¼Œä¹Ÿæ²¡ +æœ‰ä½¿ç”¨é™„åŠ æ¨¡å—)。还è¦ç¡®ä¿å®ƒæ˜¯åœ¨ä¸€ä¸ªæ£å¸¸çš„çŽ¯å¢ƒä¸æž„建和è¿è¡Œï¼Œå¹¶ä¸”在问题å‘生 +之剿²¡æœ‰è¢«æ±¡æŸ“(tainted)。 + +åœ¨ç¼–å†™æŠ¥å‘Šæ—¶ï¼Œè¦æ¶µç›–与问题相关的所有信æ¯ï¼Œå¦‚ä½¿ç”¨çš„å†…æ ¸å’Œå‘行版。在碰è§å›žå½’时, +å°è¯•给出引入它的更改的æäº¤ID,二分å¯ä»¥æ‰¾åˆ°å®ƒã€‚å¦‚æžœæ‚¨åŒæ—¶é¢ä¸´Linuxå†…æ ¸çš„å¤šä¸ª +问题,请分别报告æ¯ä¸ªé—®é¢˜ã€‚ + +一旦报告å‘出,请回ç”任何出现的问题,并尽å¯èƒ½åœ°æä¾›å¸®åŠ©ã€‚è¿™åŒ…æ‹¬é€šè¿‡ä¸æ—¶é‡æ–° +测试新版本并å‘é€çŠ¶æ€æ›´æ–°æ¥æŽ¨åŠ¨è¿›å±•ã€‚ + + +如何å‘å†…æ ¸ç»´æŠ¤äººå‘˜æŠ¥å‘Šé—®é¢˜çš„é€æ¥æŒ‡å— +===================================== + +上é¢çš„ç®€æ˜ŽæŒ‡å—æ¦‚述了如何å‘Linuxå†…æ ¸å¼€å‘人员报告问题。对于已ç»ç†Ÿæ‚‰å‘自由和开 +æºè½¯ä»¶ï¼ˆFLOSS)项目报告问题的人æ¥è¯´ï¼Œè¿™å¯èƒ½æ˜¯ä»–们所需è¦çš„全部内容。对于其他 +人,本部分更为详细,并一æ¥ä¸€æ¥åœ°æè¿°ã€‚为了便于阅读,它ä»ç„¶å°½é‡ç®€æ´ï¼Œå¹¶çœç•¥ +äº†è®¸å¤šç»†èŠ‚ï¼›è¿™äº›åœ¨é€æ¥æŒ‡å—åŽçš„å‚è€ƒç« èŠ‚ä¸è¿›è¡Œäº†æè¿°ï¼Œè¯¥ç« èŠ‚æ›´è¯¦ç»†åœ°è§£é‡Šäº†æ¯ +个æ¥éª¤ã€‚ + +注æ„:本节涉åŠçš„æ–¹é¢æ¯”简明指å—多,顺åºä¹Ÿç¨æœ‰ä¸åŒã€‚这符åˆä½ çš„åˆ©ç›Šï¼Œä»¥ç¡®ä¿æ‚¨ +尽早æ„识到看起æ¥åƒLinuxå†…æ ¸æ¯›ç—…çš„é—®é¢˜å¯èƒ½å®žé™…ä¸Šæ˜¯ç”±å…¶ä»–åŽŸå› å¼•èµ·çš„ã€‚è¿™äº›æ¥éª¤ +å¯ä»¥ç¡®ä¿ä½ 最终ä¸ä¼šè§‰å¾—åœ¨è¿™ä¸€è¿‡ç¨‹ä¸æŠ•å…¥çš„æ—¶é—´æ˜¯æµªè´¹ï¼š + + * 您是å¦é¢ä¸´ç¡¬ä»¶æˆ–软件供应商æä¾›çš„Linuxå†…æ ¸çš„é—®é¢˜ï¼Ÿé‚£ä¹ˆåŸºæœ¬ä¸Šæ‚¨æœ€å¥½åœæ¢é˜…读 + æœ¬æ–‡æ¡£ï¼Œè½¬è€Œå‘æ‚¨çš„ä¾›åº”å•†æŠ¥å‘Šé—®é¢˜ï¼Œé™¤éžæ‚¨æ„¿æ„自己安装最新的Linux版本。寻找 + 和解决问题往往需è¦åŽè€…。 + + * 使用您喜爱的网络æœç´¢å¼•擎对现有报告进行粗略æœç´¢ï¼›æ¤å¤–,请检查 + `Linuxå†…æ ¸é‚®ä»¶åˆ—è¡¨ï¼ˆLKML) <https://lore.kernel.org/lkml/>`_ çš„å˜æ¡£ã€‚如果 + 找到匹é…çš„æŠ¥å‘Šï¼Œè¯·åŠ å…¥è®¨è®ºè€Œä¸æ˜¯å‘逿–°æŠ¥å‘Šã€‚ + + * çœ‹çœ‹ä½ æ£åœ¨å¤„ç†çš„问题是å¦ä¸ºå›žå½’问题ã€å®‰å…¨é—®é¢˜æˆ–éžå¸¸ä¸¥é‡çš„问题:这些都是需 + è¦åœ¨æŽ¥ä¸‹æ¥çš„一些æ¥éª¤ä¸ç‰¹åˆ«å¤„ç†çš„“高优先级问题â€ã€‚ + + * ç¡®ä¿ä¸æ˜¯å†…æ ¸çŽ¯å¢ƒå¯¼è‡´äº†æ‚¨é¢ä¸´çš„问题。 + + * 创建一个新的备份,并将系统修å¤å’Œæ¢å¤å·¥å…·æ”¾åœ¨æ‰‹è¾¹ã€‚ + + * ç¡®ä¿æ‚¨çš„系统ä¸ä¼šé€šè¿‡åŠ¨æ€æž„建é¢å¤–çš„å†…æ ¸æ¨¡å—æ¥å¢žå¼ºå…¶å†…æ ¸ï¼ŒåƒDKMSè¿™æ ·çš„è§£å†³ + 方案å¯èƒ½åœ¨æ‚¨ä¸çŸ¥æƒ…çš„æƒ…å†µä¸‹å°±åœ¨æœ¬åœ°è¿›è¡Œäº†è¿™æ ·çš„å·¥ä½œã€‚ + + * 当问题å‘ç”Ÿæ—¶ï¼Œæ£€æŸ¥æ‚¨çš„å†…æ ¸æ˜¯å¦è¢«â€œæ±¡æŸ“â€ï¼Œå› ä¸ºä½¿å†…æ ¸è®¾ç½®è¿™ä¸ªæ ‡å¿—çš„äº‹ä»¶å¯èƒ½ + 会导致您é¢ä¸´çš„问题。 + + * 粗略地写下如何é‡çŽ°è¿™ä¸ªé—®é¢˜ã€‚å¦‚æžœæ‚¨åŒæ—¶å¤„ç†å¤šä¸ªé—®é¢˜ï¼Œè¯·ä¸ºæ¯ä¸ªé—®é¢˜å•独写注 + 释,并确ä¿å®ƒä»¬åœ¨æ–°å¯åŠ¨çš„ç³»ç»Ÿä¸Šç‹¬ç«‹å‡ºçŽ°ã€‚è¿™æ˜¯å¿…è¦çš„ï¼Œå› ä¸ºæ¯ä¸ªé—®é¢˜éƒ½éœ€è¦åˆ† + åˆ«æŠ¥å‘Šç»™å†…æ ¸å¼€å‘人员,除éžå®ƒä»¬ä¸¥é‡çº ç¼ åœ¨ä¸€èµ·ã€‚ + + * 如果您æ£é¢ä¸´ç¨³å®šç‰ˆæˆ–长期支æŒç‰ˆæœ¬çº¿çš„回归(例如从5.10.4更新到5.10.5时出现 + æ•…éšœï¼‰ï¼Œè¯·æŸ¥çœ‹åŽæ–‡â€œæŠ¥å‘Šç¨³å®šç‰ˆå’Œé•¿æœŸæ”¯æŒå†…æ ¸çº¿çš„å›žå½’â€å°èŠ‚ã€‚ + + * 定ä½å¯èƒ½å¼•èµ·é—®é¢˜çš„é©±åŠ¨ç¨‹åºæˆ–å†…æ ¸å系统。找出其开å‘人员期望的报告的方å¼å’Œ + ä½ç½®ã€‚注æ„:大多数情况下ä¸ä¼šæ˜¯ bugzilla.kernel.orgï¼Œå› ä¸ºé—®é¢˜é€šå¸¸éœ€è¦é€š + 过邮件å‘é€ç»™ç»´æŠ¤äººå‘˜å’Œå…¬å…±é‚®ä»¶åˆ—表。 + + * åœ¨ç¼ºé™·è¿½è¸ªå™¨æˆ–é—®é¢˜ç›¸å…³é‚®ä»¶åˆ—è¡¨çš„å˜æ¡£ä¸å½»åº•æœç´¢å¯èƒ½ä¸Žæ‚¨çš„问题匹é…的报告。 + å¦‚æžœä½ å‘çŽ°äº†ä¸€äº›ç›¸å…³è®¨è®ºï¼Œè¯·åŠ å…¥è®¨è®ºè€Œä¸æ˜¯å‘逿–°çš„æŠ¥å‘Šã€‚ + +在完æˆè¿™äº›å‡†å¤‡ä¹‹åŽï¼Œä½ 将进入主è¦éƒ¨åˆ†ï¼š + + * é™¤éžæ‚¨å·²ç»åœ¨è¿è¡Œæœ€æ–°çš„“主线â€Linuxå†…æ ¸ï¼Œå¦åˆ™æœ€å¥½åœ¨æŠ¥å‘Šæµç¨‹å‰å®‰è£…它。在æŸäº› + 情况下,使用最新的“稳定版â€Linux进行测试和报告也是å¯ä»¥æŽ¥å—的替代方案;在 + åˆå¹¶çª—壿œŸé—´ï¼Œè¿™å®žé™…上å¯èƒ½æ˜¯æœ€å¥½çš„æ–¹æ³•,但在开å‘阶段最好还是暂åœå‡ å¤©ã€‚æ— è®º + ä½ é€‰æ‹©ä»€ä¹ˆç‰ˆæœ¬ï¼Œæœ€å¥½ä½¿ç”¨â€œæ™®é€šâ€æž„å»ºã€‚å¿½ç•¥è¿™äº›å»ºè®®ä¼šå¤§å¤§å¢žåŠ æ‚¨çš„æŠ¥å‘Šè¢«æ‹’ç» + 或忽略的风险。 + + * ç¡®ä¿æ‚¨åˆšåˆšå®‰è£…çš„å†…æ ¸åœ¨è¿è¡Œæ—¶ä¸ä¼šâ€œæ±¡æŸ“â€è‡ªå·±ã€‚ + + * åœ¨æ‚¨åˆšåˆšå®‰è£…çš„å†…æ ¸ä¸å¤çŽ°è¿™ä¸ªé—®é¢˜ã€‚å¦‚æžœå®ƒæ²¡æœ‰å‡ºçŽ°ï¼Œè¯·æŸ¥çœ‹ä¸‹æ–¹åªå‘生在 + 稳定版和长期支æŒå†…æ ¸çš„é—®é¢˜çš„è¯´æ˜Žã€‚ + + * ä¼˜åŒ–ä½ çš„ç¬”è®°ï¼šè¯•ç€æ‰¾åˆ°å¹¶å†™å‡ºæœ€ç›´æŽ¥çš„å¤çŽ°é—®é¢˜çš„æ–¹æ³•ã€‚ç¡®ä¿æœ€ç»ˆç»“æžœåŒ…å«æ‰€æœ‰ + é‡è¦çš„ç»†èŠ‚ï¼ŒåŒæ—¶è®©ç¬¬ä¸€æ¬¡å¬è¯´çš„人容易阅读和ç†è§£ã€‚如果您在æ¤è¿‡ç¨‹ä¸å¦åˆ°äº†ä¸€ + äº›ä¸œè¥¿ï¼Œè¯·è€ƒè™‘å†æ¬¡æœç´¢å…³äºŽè¯¥é—®é¢˜çš„现有报告。 + + * 如果失败涉åŠâ€œpanicâ€ã€â€œOopsâ€ã€â€œwarningâ€æˆ–“BUGâ€ï¼Œè¯·è€ƒè™‘è§£ç å†…æ ¸æ—¥å¿—ä»¥æŸ¥æ‰¾è§¦ + å‘错误的代ç 行。 + + * 如果您的问题是回归问题,请尽å¯èƒ½ç¼©å°å¼•入问题时的范围。 + + * 通过详细æè¿°é—®é¢˜æ¥å¼€å§‹ç¼–写报告。记得包括以下æ¡ç›®ï¼šæ‚¨ä¸ºå¤çŽ°è€Œå®‰è£…çš„æœ€æ–°å†… + æ ¸ç‰ˆæœ¬ã€ä½¿ç”¨çš„Linuxå‘行版以åŠå…³äºŽå¦‚何å¤çŽ°è¯¥é—®é¢˜çš„è¯´æ˜Žã€‚å¦‚æžœå¯èƒ½ï¼Œå°†å†…æ ¸ + 构建é…置(.config)和 ``dmesg`` 的输出放在网上的æŸä¸ªåœ°æ–¹ï¼Œå¹¶é“¾æŽ¥åˆ°å®ƒã€‚包 + 嫿ˆ–ä¸Šä¼ æ‰€æœ‰å…¶ä»–å¯èƒ½ç›¸å…³çš„ä¿¡æ¯ï¼Œå¦‚Oops的输出/截图或æ¥è‡ª ``lspci`` 的输出 + ã€‚ä¸€æ—¦ä½ å†™å®Œäº†è¿™ä¸ªä¸»è¦éƒ¨åˆ†ï¼Œè¯·åœ¨ä¸Šæ–¹æ’入一个æ£å¸¸é•¿åº¦çš„æ®µè½å¿«é€Ÿæ¦‚述问题和 + å½±å“。å†åœ¨æ¤ä¹‹ä¸Šæ·»åŠ ä¸€ä¸ªç®€å•æè¿°é—®é¢˜çš„å¥å,以得到人们的阅读。现在给出一 + 个更çŸçš„æè¿°æ€§æ ‡é¢˜æˆ–主题。然åŽå°±å¯ä»¥åƒMAINTAINERSæ–‡ä»¶å‘Šè¯‰ä½ çš„é‚£æ ·å‘逿ˆ– + æäº¤æŠ¥å‘Šäº†ï¼Œé™¤éžä½ 在处ç†ä¸€ä¸ªâ€œé«˜ä¼˜å…ˆçº§é—®é¢˜â€ï¼šå®ƒä»¬éœ€è¦æŒ‰ç…§ä¸‹é¢â€œé«˜ä¼˜å…ˆçº§é—® + 题的特殊处ç†â€æ‰€è¿°ç‰¹åˆ«å…³ç…§ã€‚ + + * ç‰å¾…别人的ååº”ï¼Œç»§ç»æŽ¨è¿›äº‹æƒ…ï¼Œç›´åˆ°ä½ èƒ½å¤ŸæŽ¥å—è¿™æ ·æˆ–é‚£æ ·çš„ç»“æžœã€‚å› æ¤ï¼Œè¯·å…¬ + å¼€å’ŒåŠæ—¶åœ°å›žåº”任何询问。测试æå‡ºçš„ä¿®å¤ã€‚积æžåœ°æµ‹è¯•ï¼šè‡³å°‘é‡æ–°æµ‹è¯•æ¯ä¸ªæ–°ä¸» + 线版本的首个候选版本(RCï¼‰ï¼Œå¹¶æŠ¥å‘Šä½ çš„ç»“æžœã€‚å¦‚æžœå‡ºçŽ°æ‹–å»¶ï¼Œå°±å‹å¥½åœ°æé†’一 + ä¸‹ã€‚å¦‚æžœä½ æ²¡æœ‰å¾—åˆ°ä»»ä½•å¸®åŠ©æˆ–è€…æœªèƒ½æ»¡æ„,请试ç€è‡ªå·±å¸®åŠ©è‡ªå·±ã€‚ + + +报告稳定版和长期支æŒå†…æ ¸çº¿çš„å›žå½’ +---------------------------------- + +如果您å‘现了稳定版或长期支æŒå†…æ ¸ç‰ˆæœ¬çº¿ä¸çš„回归问题并按上述æµç¨‹è·³åˆ°è¿™é‡Œï¼Œé‚£ä¹ˆ +请阅读本å°èŠ‚ã€‚å³ä¾‹å¦‚您在从5.10.4更新到5.10.5时出现了问题(从5.9.15到5.10.5则 +䏿˜¯ï¼‰ã€‚å¼€å‘äººå‘˜å¸Œæœ›å°½å¿«ä¿®å¤æ¤ç±»å›žå½’ï¼Œå› æ¤æœ‰ä¸€ä¸ªç®€åŒ–æµç¨‹æ¥æŠ¥å‘Šå®ƒä»¬ï¼š + + * æ£€æŸ¥å†…æ ¸å¼€å‘人员是å¦ä»ç„¶ç»´æŠ¤ä½ 关心的Linuxå†…æ ¸ç‰ˆæœ¬çº¿ï¼šåŽ» `kernel.org 的首页 + <https://kernel.org/>`_ ï¼Œç¡®ä¿æ¤ç‰¹å®šç‰ˆæœ¬çº¿çš„æœ€æ–°ç‰ˆæ²¡æœ‰â€œ[EOL]â€æ ‡è®°ã€‚ + + * 检查 `Linux稳定版邮件列表 <https://lore.kernel.org/stable/>`_ ä¸çš„现有报告。 + + * ä»Žç‰¹å®šçš„ç‰ˆæœ¬çº¿å®‰è£…æœ€æ–°ç‰ˆæœ¬ä½œä¸ºçº¯å‡€å†…æ ¸ã€‚ç¡®ä¿è¿™ä¸ªå†…æ ¸æ²¡æœ‰è¢«æ±¡æŸ“ï¼Œå¹¶ä¸”ä»ç„¶ + å˜åœ¨é—®é¢˜ï¼Œå› 为问题å¯èƒ½å·²ç»åœ¨é‚£é‡Œè¢«ä¿®å¤äº†ã€‚如果您第一次å‘çŽ°ä¾›åº”å•†å†…æ ¸çš„é—®é¢˜ï¼Œ + 请检查已知最新版本的普通构建是å¦å¯ä»¥æ£å¸¸è¿è¡Œã€‚ + + * å‘Linux稳定版邮件列表å‘é€ä¸€ä¸ªç®€çŸçš„问题报告(stable@vger.kernel.org)。大致 + æè¿°é—®é¢˜ï¼Œå¹¶è§£é‡Šå¦‚何å¤çŽ°ã€‚è®²æ¸…æ¥šé¦–ä¸ªå‡ºçŽ°é—®é¢˜çš„ç‰ˆæœ¬å’Œæœ€åŽä¸€ä¸ªå·¥ä½œæ£å¸¸çš„版本。 + ç„¶åŽç‰å¾…进一æ¥çš„æŒ‡ç¤ºã€‚ + +下é¢çš„å‚è€ƒç« èŠ‚éƒ¨åˆ†è¯¦ç»†è§£é‡Šäº†è¿™äº›æ¥éª¤ä¸çš„æ¯ä¸€æ¥ã€‚ + + +报告åªå‘ç”Ÿåœ¨è¾ƒæ—§å†…æ ¸ç‰ˆæœ¬çº¿çš„é—®é¢˜ +---------------------------------- + +若您å°è¯•äº†ä¸Šè¿°çš„æœ€æ–°ä¸»çº¿å†…æ ¸ï¼Œä½†æœªèƒ½åœ¨é‚£é‡Œå¤çŽ°é—®é¢˜ï¼Œé‚£ä¹ˆæœ¬å°èŠ‚é€‚ç”¨äºŽæ‚¨ï¼›ä»¥ä¸‹ +æµç¨‹æœ‰åŠ©äºŽä½¿é—®é¢˜åœ¨ä»ç„¶æ”¯æŒçš„稳定版或长期支æŒç‰ˆæœ¬çº¿ï¼Œæˆ–者定期基于最新稳定版或 +长期支æŒå†…æ ¸çš„ä¾›åº”å•†å†…æ ¸ä¸å¾—到修å¤ã€‚å¦‚æžœæ˜¯è¿™ç§æƒ…况,请执行以下æ¥éª¤ï¼š + + * 请åšå¥½å‡†å¤‡ï¼ŒæŽ¥ä¸‹æ¥çš„å‡ ä¸ªæ¥éª¤å¯èƒ½æ— 法在旧版本ä¸è§£å†³é—®é¢˜ï¼šä¿®å¤å¯èƒ½å¤ªå¤§æˆ–太 + å†’é™©ï¼Œæ— æ³•ç§»æ¤åˆ°é‚£é‡Œã€‚ + + * 执行å‰èŠ‚â€œæŠ¥å‘Šç¨³å®šç‰ˆå’Œé•¿æœŸæ”¯æŒå†…æ ¸çº¿çš„å›žå½’â€ä¸çš„å‰ä¸‰ä¸ªæ¥éª¤ã€‚ + + * 在Linuxå†…æ ¸ç‰ˆæœ¬æŽ§åˆ¶ç³»ç»Ÿä¸æœç´¢ä¿®å¤ä¸»çº¿é—®é¢˜çš„æ›´æ”¹ï¼Œå› 为它的æäº¤æ¶ˆæ¯å¯èƒ½ä¼š + å‘Šè¯‰ä½ ä¿®å¤æ˜¯å¦å·²ç»è®¡åˆ’好了支æŒã€‚å¦‚æžœä½ æ²¡æœ‰æ‰¾åˆ°ï¼Œæœç´¢é€‚当的邮件列表,寻找 + 讨论æ¤ç±»é—®é¢˜æˆ–åŒè¡Œè¯„è®®å¯èƒ½ä¿®å¤çš„帖åï¼›ç„¶åŽæ£€æŸ¥è®¨è®ºæ˜¯å¦è®¤ä¸ºä¿®å¤ä¸é€‚åˆæ”¯æŒã€‚ + å¦‚æžœæ”¯æŒæ ¹æœ¬ä¸è¢«è€ƒè™‘ï¼ŒåŠ å…¥æœ€æ–°çš„è®¨è®ºï¼Œè¯¢é—®æ˜¯å¦æœ‰å¯èƒ½ã€‚ + + * å‰é¢çš„æ¥éª¤ä¹‹ä¸€åº”è¯¥ä¼šç»™å‡ºä¸€ä¸ªè§£å†³æ–¹æ¡ˆã€‚å¦‚æžœä»æœªèƒ½æˆåŠŸï¼Œè¯·å‘å¯èƒ½å¼•起问题的 + å系统的维护人员询问建议;抄é€ç‰¹å®šå系统的邮件列表以åŠç¨³å®šç‰ˆé‚®ä»¶åˆ—表 + +下é¢çš„å‚è€ƒç« èŠ‚éƒ¨åˆ†è¯¦ç»†è§£é‡Šäº†è¿™äº›æ¥éª¤ä¸çš„æ¯ä¸€æ¥ã€‚ + + +å‚è€ƒç« èŠ‚ï¼šå‘å†…æ ¸ç»´æŠ¤è€…æŠ¥å‘Šé—®é¢˜ +=============================== + +上é¢çš„详细指å—简è¦åœ°åˆ—å‡ºäº†æ‰€æœ‰ä¸»è¦æ¥éª¤ï¼Œè¿™å¯¹å¤§å¤šæ•°äººæ¥è¯´åº”该足够了。但有时, +å³ä½¿æ˜¯æœ‰ç»éªŒçš„用户也å¯èƒ½æƒ³çŸ¥é“如何实际执行这些æ¥éª¤ä¹‹ä¸€ã€‚这就是本节的目的, +å› ä¸ºå®ƒå°†æä¾›å…³äºŽä¸Šè¿°æ¯ä¸ªæ¥éª¤çš„æ›´å¤šç»†èŠ‚ã€‚è¯·å°†æ¤ä½œä¸ºå‚考文档:å¯ä»¥ä»Žå¤´åˆ°å°¾ +é˜…è¯»å®ƒã€‚ä½†å®ƒä¸»è¦æ˜¯ä¸ºäº†æµè§ˆå’ŒæŸ¥æ‰¾å¦‚何实际执行这些æ¥éª¤çš„详细信æ¯ã€‚ + +在深入挖掘细节之å‰ï¼Œæˆ‘æƒ³å…ˆç»™ä½ ä¸€äº›ä¸€èˆ¬æ€§å»ºè®®ï¼š + + * Linuxå†…æ ¸å¼€å‘äººå‘˜å¾ˆæ¸…æ¥šè¿™ä¸ªè¿‡ç¨‹å¾ˆå¤æ‚,比其他的FLOSSé¡¹ç›®è¦æ±‚更多。我们很 + 希望让它更简å•。但这需è¦åœ¨ä¸åŒçš„地方以åŠä¸€äº›åŸºç¡€è®¾æ–½ä¸Šä»˜è¯¸åŠªåŠ›ï¼Œè¿™äº›åŸºç¡€ + è®¾æ–½éœ€è¦æŒç»çš„维护;尚未有人站出æ¥åšè¿™äº›å·¥ä½œï¼Œæ‰€ä»¥ç›®å‰æƒ…å†µå°±æ˜¯è¿™æ ·ã€‚ + + * 与æŸäº›ä¾›åº”商ç¾è®¢çš„ä¿è¯æˆ–支æŒåˆåŒå¹¶ä¸èƒ½ä½¿æ‚¨æœ‰æƒè¦æ±‚上游Linuxå†…æ ¸ç¤¾åŒºçš„å¼€ + å‘人员进行修å¤ï¼šè¿™æ ·çš„åˆåŒå®Œå…¨åœ¨Linuxå†…æ ¸ã€å…¶å¼€å‘社区和本文档的范围之外。 + è¿™å°±æ˜¯ä¸ºä»€ä¹ˆåœ¨è¿™ç§æƒ…å†µä¸‹ï¼Œä½ ä¸èƒ½è¦æ±‚任何契约ä¿è¯ï¼Œå³ä½¿å¼€å‘人员处ç†çš„é—® + é¢˜å¯¹ä¾›åº”å•†æœ‰æ•ˆã€‚å¦‚æžœæ‚¨æƒ³ä¸»å¼ æ‚¨çš„æƒåˆ©ï¼Œä½¿ç”¨ä¾›åº”å•†çš„æ”¯æŒæ¸ é“ä»£æ›¿ã€‚å½“è¿™æ ·åš + çš„æ—¶å€™ï¼Œä½ å¯èƒ½æƒ³æå‡ºä½ 希望看到这个问题在上游Linuxå†…æ ¸ä¸ä¿®å¤ï¼›å¯ä»¥è¿™æ˜¯ç¡® + ä¿æœ€ç»ˆä¿®å¤å°†è¢«çº³å…¥æ‰€æœ‰Linuxå‘行版的唯一方法æ¥é¼“励他们。 + + * 如果您从未å‘FLOSS项目报告过任何问题,那么您应该考虑阅读 `如何有效地报告 + 缺陷 <https://www.chiark.greenend.org.uk/~sgtatham/bugs.html>`_ , `如何 + ä»¥æ˜Žæ™ºçš„æ–¹å¼æé—® <http://www.catb.org/esr/faqs/smart-questions.html>`_ , + å’Œ `如何æå‡ºå¥½é—®é¢˜ <https://jvns.ca/blog/good-questions/>`_ 。 + +解决这些问题之åŽï¼Œå¯ä»¥åœ¨ä¸‹é¢æ‰¾åˆ°å¦‚何æ£ç¡®åœ°å‘Linuxå†…æ ¸æŠ¥å‘Šé—®é¢˜çš„è¯¦ç»†ä¿¡æ¯ã€‚ + + +ç¡®ä¿æ‚¨ä½¿ç”¨çš„æ˜¯ä¸Šæ¸¸Linuxå†…æ ¸ +---------------------------- + + *您是å¦é¢ä¸´ç¡¬ä»¶æˆ–软件供应商æä¾›çš„Linuxå†…æ ¸çš„é—®é¢˜ï¼Ÿé‚£ä¹ˆåŸºæœ¬ä¸Šæ‚¨æœ€å¥½åœæ¢é˜… + è¯»æœ¬æ–‡æ¡£ï¼Œè½¬è€Œå‘æ‚¨çš„ä¾›åº”å•†æŠ¥å‘Šé—®é¢˜ï¼Œé™¤éžæ‚¨æ„¿æ„自己安装最新的Linux版本。 + 寻找和解决问题往往需è¦åŽè€…。* + +与大多数程åºå‘˜ä¸€æ ·ï¼ŒLinuxå†…æ ¸å¼€å‘人员ä¸å–œæ¬¢èŠ±æ—¶é—´å¤„ç†ä»–们维护的æºä»£ç 䏿 ¹æœ¬ +ä¸ä¼šå‘生的问题的报告。这åªä¼šæµªè´¹æ¯ä¸ªäººçš„æ—¶é—´ï¼Œå°¤å…¶æ˜¯ä½ 的时间。ä¸å¹¸çš„æ˜¯ï¼Œå½“ +涉åŠåˆ°å†…æ ¸æ—¶ï¼Œè¿™æ ·çš„æƒ…å†µå¾ˆå®¹æ˜“å‘ç”Ÿï¼Œå¹¶ä¸”å¸¸å¸¸å¯¼è‡´åŒæ–¹æ°”é¦ã€‚è¿™æ˜¯å› ä¸ºå‡ ä¹Žæ‰€æœ‰é¢„ +装在设备(å°å¼æœºã€ç¬”è®°æœ¬ç”µè„‘ã€æ™ºèƒ½æ‰‹æœºã€è·¯ç”±å™¨ç‰ï¼‰ä¸Šçš„Linuxå†…æ ¸ï¼Œä»¥åŠå¤§å¤šæ•° +ç”±Linuxå‘行商æä¾›çš„å†…æ ¸ï¼Œéƒ½ä¸Žç”±kernel.orgå‘行的官方Linuxå†…æ ¸ç›¸è·ç”šè¿œï¼šä»ŽLinux +å¼€å‘的角度æ¥çœ‹ï¼Œè¿™äº›ä¾›åº”商æä¾›çš„å†…æ ¸é€šå¸¸æ˜¯å¤è€çš„æˆ–者ç»è¿‡äº†å¤§é‡ä¿®æ”¹ï¼Œé€šå¸¸ä¸¤ç‚¹ +兼具。 + +å¤§å¤šæ•°ä¾›åº”å•†å†…æ ¸éƒ½ä¸é€‚åˆç”¨æ¥å‘Linuxå†…æ ¸å¼€å‘人员报告问题:您在其ä¸é‡åˆ°çš„问题 +å¯èƒ½å·²ç»ç”±Linuxå†…æ ¸å¼€å‘人员在数月或数年å‰ä¿®å¤ï¼›æ¤å¤–,供应商的修改和增强å¯èƒ½ +会导致您é¢ä¸´çš„问题,å³ä½¿å®ƒä»¬çœ‹èµ·æ¥å¾ˆå°æˆ–者完全ä¸ç›¸å…³ã€‚è¿™å°±æ˜¯ä¸ºä»€ä¹ˆæ‚¨åº”è¯¥å‘ +ä¾›åº”å•†æŠ¥å‘Šè¿™äº›å†…æ ¸çš„é—®é¢˜ã€‚å®ƒçš„å¼€å‘者应该查看报告,如果它是一个上游问题,直接 +äºŽä¸Šæ¸¸ä¿®å¤æˆ–将报告转å‘到那里。在实践ä¸ï¼Œè¿™æœ‰æ—¶è¡Œä¸é€šã€‚å› æ¤ï¼Œæ‚¨å¯èƒ½éœ€è¦è€ƒè™‘ +通过自己安装最新的Linuxå†…æ ¸å†…æ ¸æ¥ç»•è¿‡ä¾›åº”å•†ã€‚å¦‚æžœå¦‚æžœæ‚¨é€‰æ‹©æ¤æ–¹æ³•,那么本指 +å—åŽé¢çš„æ¥éª¤å°†è§£é‡Šå¦‚ä½•åœ¨æŽ’é™¤äº†å…¶ä»–å¯èƒ½å¯¼è‡´æ‚¨çš„é—®é¢˜çš„åŽŸå› åŽæ‰§è¡Œæ¤æ“作。 + +注æ„剿®µä½¿ç”¨çš„è¯è¯æ˜¯â€œå¤§å¤šæ•°â€ï¼Œå› 为有时候开å‘人员实际上愿æ„处ç†ä¾›åº”å•†å†…æ ¸å‡ºçŽ° +的问题报告。他们是å¦è¿™ä¹ˆåšå¾ˆå¤§ç¨‹åº¦ä¸Šå–决于开å‘人员和相关问题。如果å‘è¡Œç‰ˆåª +æ ¹æ®æœ€è¿‘çš„Linuxç‰ˆæœ¬å¯¹å†…æ ¸è¿›è¡Œäº†è¾ƒå°ä¿®æ”¹ï¼Œé‚£ä¹ˆæœºä¼šå°±æ¯”较大;例如对于Debian +GNU/Linux Sid或Fedora Rawhide所æä¾›çš„ä¸»çº¿å†…æ ¸ã€‚ä¸€äº›å¼€å‘人员还将接å—基于最新 +ç¨³å®šå†…æ ¸çš„å‘è¡Œç‰ˆå†…æ ¸é—®é¢˜æŠ¥å‘Šï¼Œåªè¦å®ƒæ”¹åЍä¸å¤§ï¼›ä¾‹å¦‚Arch Linuxã€å¸¸è§„Fedora版本 +å’ŒopenSUSE Turboweed。但是请记ä½ï¼Œæ‚¨æœ€å¥½ä½¿ç”¨ä¸»çº¿Linux,并é¿å…åœ¨æ¤æµç¨‹ä¸ä½¿ç”¨ +ç¨³å®šç‰ˆå†…æ ¸ï¼Œå¦‚â€œå®‰è£…ä¸€ä¸ªæ–°çš„å†…æ ¸è¿›è¡Œæµ‹è¯•â€ä¸€èЂ䏿‰€è¯¦è¿°ã€‚ + +当然,您å¯ä»¥å¿½ç•¥æ‰€æœ‰è¿™äº›å»ºè®®ï¼Œå¹¶å‘上游Linuxå¼€å‘人员报告旧的或ç»è¿‡å¤§é‡ä¿®æ”¹çš„ +ä¾›åº”å•†å†…æ ¸çš„é—®é¢˜ã€‚ä½†æ˜¯æ³¨æ„ï¼Œè¿™æ ·çš„æŠ¥å‘Šç»å¸¸è¢«æ‹’ç»æˆ–忽视,所以自行å°å¿ƒè€ƒè™‘一下。 +ä¸è¿‡è¿™è¿˜æ˜¯æ¯”æ ¹æœ¬ä¸æŠ¥å‘Šé—®é¢˜è¦å¥½ï¼šæœ‰æ—¶å€™è¿™æ ·çš„æŠ¥å‘Šä¼šç›´æŽ¥æˆ–间接地帮助解决之åŽçš„ +问题。 + + +æœç´¢çŽ°æœ‰æŠ¥å‘Šï¼ˆç¬¬ä¸€éƒ¨åˆ†ï¼‰ +------------------------- + + *使用您喜爱的网络æœç´¢å¼•擎对现有报告进行粗略æœç´¢ï¼›æ¤å¤–,请检查Linuxå†…æ ¸ + 邮件列表(LKMLï¼‰çš„å˜æ¡£ã€‚如果找到匹é…çš„æŠ¥å‘Šï¼Œè¯·åŠ å…¥è®¨è®ºè€Œä¸æ˜¯å‘逿–°æŠ¥å‘Šã€‚* + +æŠ¥å‘Šä¸€ä¸ªåˆ«äººå·²ç»æå‡ºçš„é—®é¢˜ï¼Œå¯¹æ¯ä¸ªäººæ¥è¯´éƒ½æ˜¯æµªè´¹æ—¶é—´ï¼Œå°¤å…¶æ˜¯ä½œä¸ºæŠ¥å‘Šäººçš„ä½ ã€‚ +æ‰€ä»¥å½»åº•æ£€æŸ¥æ˜¯å¦æœ‰äººå·²ç»æŠ¥å‘Šäº†è¿™ä¸ªé—®é¢˜ï¼Œè¿™å¯¹ä½ 自己是有利的。在æµç¨‹ä¸çš„这一æ¥ï¼Œ +å¯ä»¥åªæ‰§è¡Œä¸€ä¸ªç²—略的æœç´¢ï¼šä¸€æ—¦æ‚¨çŸ¥é“æ‚¨çš„é—®é¢˜éœ€è¦æŠ¥å‘Šåˆ°å“ªé‡Œï¼Œç¨åŽçš„æ¥éª¤å°†å‘Šè¯‰ +您如何详细æœç´¢ã€‚尽管如æ¤ï¼Œä¸è¦ä»“促完æˆè¿™ä¸€æ¥ï¼Œå®ƒå¯ä»¥èŠ‚çœæ‚¨çš„æ—¶é—´å’Œå‡å°‘麻烦。 + +åªéœ€å…ˆç”¨ä½ 最喜欢的æœç´¢å¼•擎在互è”网上æœç´¢ã€‚ç„¶åŽå†æœç´¢Linuxå†…æ ¸é‚®ä»¶åˆ—è¡¨ï¼ˆLKML) +å˜æ¡£ã€‚ + +如果æœç´¢ç»“果实在太多,å¯ä»¥è€ƒè™‘è®©ä½ çš„æœç´¢å¼•擎将æœç´¢æ—¶é—´èŒƒå›´é™åˆ¶åœ¨è¿‡åŽ»çš„ä¸€ä¸ª +æœˆæˆ–ä¸€å¹´ã€‚è€Œä¸”æ— è®ºä½ åœ¨å“ªé‡Œæœç´¢ï¼Œä¸€å®šè¦ç”¨æ°å½“çš„æœç´¢å…³é”®è¯ï¼›ä¹Ÿè¦å˜åŒ–å‡ æ¬¡å…³é”® +è¯ã€‚åŒæ—¶ï¼Œè¯•ç€ä»Žåˆ«äººçš„è§’åº¦çœ‹é—®é¢˜ï¼šè¿™å°†å¸®åŠ©ä½ æƒ³å‡ºå…¶ä»–çš„å…³é”®è¯ã€‚å¦å¤–ï¼Œä¸€å®šä¸ +è¦åŒæ—¶ä½¿ç”¨è¿‡å¤šçš„关键è¯ã€‚è®°ä½æœç´¢æ—¶è¦åŒæ—¶å°è¯•包å«å’Œä¸åŒ…å«å†…æ ¸é©±åŠ¨ç¨‹åºçš„åç§° +或å—å½±å“的硬件组件的åç§°ç‰ä¿¡æ¯ã€‚但其确切的å“牌å称(比如说“åŽç¡•çº¢é” Radeon +RX 5700 XT Gaming OCâ€ï¼‰å¾€å¾€å¸®åŠ©ä¸å¤§ï¼Œå› 为它太具体了。相å,å°è¯•æœç´¢æœ¯è¯ï¼Œå¦‚ +åž‹å·ï¼ˆRadeon 5700 或 Radeon 5000ï¼‰å’Œæ ¸å¿ƒä»£å·ï¼ˆâ€œNaviâ€æˆ–“Navi10â€ï¼‰ï¼Œä»¥åŠåŒ…å« +å’Œä¸åŒ…å«å…¶åˆ¶é€ 商(“AMDâ€ï¼‰ã€‚ + +å¦‚æžœä½ å‘çŽ°äº†å…³äºŽä½ çš„é—®é¢˜çš„çŽ°æœ‰æŠ¥å‘Šï¼Œè¯·åŠ å…¥è®¨è®ºï¼Œå› ä¸ºä½ å¯èƒ½ä¼šæä¾›æœ‰ä»·å€¼çš„é¢ +外信æ¯ã€‚这一点很é‡è¦ï¼Œå³ä½¿æ˜¯åœ¨ä¿®å¤ç¨‹åºå·²ç»å‡†å¤‡å¥½æˆ–处于最åŽé˜¶æ®µï¼Œå› 为开å‘人 +员å¯èƒ½ä¼šå¯»æ‰¾èƒ½å¤Ÿæä¾›é¢å¤–ä¿¡æ¯æˆ–测试建议修å¤ç¨‹åºçš„人。跳到“å‘布报告åŽçš„责任†+一节,了解有关如何æ£ç¡®å‚与的细节。 + +注æ„,æœç´¢ `bugzilla.kernel.org <https://bugzilla.kernel.org/>`_ 网站å¯èƒ½ +也是一个好主æ„ï¼Œå› ä¸ºè¿™å¯èƒ½ä¼šæä¾›æœ‰ä»·å€¼çš„è§è§£æˆ–找到匹é…的报告。如果您å‘现åŽè€…, +请记ä½ï¼šå¤§å¤šæ•°å系统都希望在ä¸åŒçš„ä½ç½®æŠ¥å‘Šï¼Œå¦‚下é¢â€œä½ 需è¦å°†é—®é¢˜æŠ¥å‘Šåˆ°ä½•处†+ä¸€èŠ‚ä¸æ‰€è¿°ã€‚å› æ¤æœ¬åº”处ç†è¿™ä¸ªé—®é¢˜çš„å¼€å‘人员甚至å¯èƒ½ä¸çŸ¥é“bugzilla的工å•。所以 +请检查工å•ä¸çš„问题是å¦å·²ç»æŒ‰ç…§æœ¬æ–‡æ¡£æ‰€è¿°å¾—åˆ°æŠ¥å‘Šï¼Œå¦‚æžœæ²¡æœ‰ï¼Œè¯·è€ƒè™‘è¿™æ ·åšã€‚ + +高优先级的问题? +----------------- + + *çœ‹çœ‹ä½ æ£åœ¨å¤„ç†çš„é—®é¢˜æ˜¯å¦æ˜¯å›žå½’问题ã€å®‰å…¨é—®é¢˜æˆ–éžå¸¸ä¸¥é‡çš„问题:这些都是 + 需è¦åœ¨æŽ¥ä¸‹æ¥çš„一些æ¥éª¤ä¸ç‰¹åˆ«å¤„ç†çš„“高优先级问题â€ã€‚* + +Linus Torvalds和主è¦çš„Linuxå†…æ ¸å¼€å‘äººå‘˜å¸Œæœ›çœ‹åˆ°ä¸€äº›é—®é¢˜å°½å¿«å¾—åˆ°è§£å†³ï¼Œå› æ¤åœ¨ +æŠ¥å‘Šè¿‡ç¨‹ä¸æœ‰ä¸€äº›â€œé«˜ä¼˜å…ˆçº§é—®é¢˜â€çš„处ç†ç•¥æœ‰ä¸åŒã€‚æœ‰ä¸‰ç§æƒ…å†µç¬¦åˆæ¡ä»¶:回归ã€å®‰å…¨ +问题和éžå¸¸ä¸¥é‡çš„问题。 + +如果在旧版本的Linuxå†…æ ¸ä¸å·¥ä½œçš„东西ä¸èƒ½åœ¨æ–°ç‰ˆæœ¬çš„Linuxå†…æ ¸ä¸å·¥ä½œï¼Œæˆ–者æŸç§ +程度上在新版本的Linuxå†…æ ¸ä¸å·¥ä½œå¾—æ›´å·®ï¼Œé‚£ä¹ˆä½ å°±éœ€è¦å¤„ç†â€œå›žå½’â€ã€‚å› æ¤ï¼Œå½“一个 +在Linux 5.7ä¸è¡¨çŽ°è‰¯å¥½çš„WiFi驱动程åºåœ¨5.8ä¸è¡¨çްä¸ä½³æˆ–æ ¹æœ¬ä¸èƒ½å·¥ä½œæ—¶ï¼Œè¿™æ˜¯ä¸€ +ç§å›žå½’。如果应用程åºåœ¨æ–°çš„å†…æ ¸ä¸å‡ºçްä¸ç¨³å®šçš„现象,这也是一ç§å›žå½’,这å¯èƒ½æ˜¯ +ç”±äºŽå†…æ ¸å’Œç”¨æˆ·ç©ºé—´ä¹‹é—´çš„æŽ¥å£ï¼ˆå¦‚procfså’Œsysfs)å‘生ä¸å…¼å®¹çš„æ›´æ”¹é€ æˆçš„。显著 +的性能é™ä½Žæˆ–åŠŸè€—å¢žåŠ ä¹Ÿå¯ä»¥ç§°ä¸ºå›žå½’。但是请记ä½:æ–°å†…æ ¸éœ€è¦ä½¿ç”¨ä¸Žæ—§å†…æ ¸ç›¸ä¼¼çš„ +é…ç½®æ¥æž„建(å‚è§ä¸‹é¢å¦‚ä½•å®žçŽ°è¿™ä¸€ç‚¹ï¼‰ã€‚è¿™æ˜¯å› ä¸ºå†…æ ¸å¼€å‘人员在实现新特性时有 +æ—¶æ— æ³•é¿å…ä¸å…¼å®¹æ€§ï¼›ä½†æ˜¯ä¸ºäº†é¿å…回归,这些特性必须在构建é…置期间显å¼åœ°å¯ç”¨ã€‚ + +什么是安全问题留给您自己判æ–。在继ç»ä¹‹å‰ï¼Œè¯·è€ƒè™‘阅读 +“Documentation/translations/zh_CN/admin-guide/security-bugs.rstâ€ï¼Œ +å› ä¸ºå®ƒæä¾›äº†å¦‚何最æ°å½“地处ç†å®‰å…¨é—®é¢˜çš„é¢å¤–细节。 + +当å‘ç”Ÿäº†å®Œå…¨æ— æ³•æŽ¥å—的糟糕事情时,æ¤é—®é¢˜å°±æ˜¯ä¸€ä¸ªâ€œéžå¸¸ä¸¥é‡çš„问题â€ã€‚例如, +Linuxå†…æ ¸ç ´å了它处ç†çš„æ•°æ®æˆ–æŸå了它è¿è¡Œçš„ç¡¬ä»¶ã€‚å½“å†…æ ¸çªç„¶æ˜¾ç¤ºé”™è¯¯æ¶ˆæ¯ +(“kernel panicâ€ï¼‰å¹¶åœæ¢å·¥ä½œï¼Œæˆ–è€…æ ¹æœ¬æ²¡æœ‰ä»»ä½•åœæ¢ä¿¡æ¯æ—¶ï¼Œæ‚¨ä¹Ÿåœ¨å¤„ç†ä¸€ä¸ªä¸¥é‡ +的问题。注æ„:ä¸è¦æ··æ·†â€œpanicâ€ï¼ˆå†…æ ¸åœæ¢è‡ªèº«çš„致命错误)和“Oopsâ€ï¼ˆå¯æ¢å¤é”™è¯¯ï¼‰ï¼Œ +å› ä¸ºæ˜¾ç¤ºåŽè€…之åŽå†…æ ¸ä»ç„¶åœ¨è¿è¡Œã€‚ + + +ç¡®ä¿çŽ¯å¢ƒå¥åº· +-------------- + + *ç¡®ä¿ä¸æ˜¯å†…æ ¸æ‰€å¤„çŽ¯å¢ƒå¯¼è‡´äº†ä½ æ‰€é¢ä¸´çš„问题。* + +看起æ¥å¾ˆåƒå†…æ ¸é—®é¢˜çš„é—®é¢˜æœ‰æ—¶æ˜¯ç”±æž„å»ºæˆ–è¿è¡Œæ—¶çŽ¯å¢ƒå¼•èµ·çš„ã€‚å¾ˆéš¾å®Œå…¨æŽ’é™¤è¿™ç§é—® +é¢˜ï¼Œä½†ä½ åº”è¯¥å°½é‡å‡å°‘è¿™ç§é—®é¢˜ï¼š + + * æž„å»ºå†…æ ¸æ—¶ï¼Œè¯·ä½¿ç”¨ç»è¿‡éªŒè¯çš„å·¥å…·ï¼Œå› ä¸ºç¼–è¯‘å™¨æˆ–äºŒè¿›åˆ¶æ–‡ä»¶ä¸çš„错误å¯èƒ½ä¼šå¯¼ + è‡´å†…æ ¸å‡ºçŽ°é”™è¯¯è¡Œä¸ºã€‚ + + * ç¡®ä¿æ‚¨çš„计算机组件在其设计规范内è¿è¡Œï¼›è¿™å¯¹å¤„ç†å™¨ã€å†…å˜å’Œä¸»æ¿å°¤ä¸ºé‡è¦ã€‚å› + æ¤ï¼Œå½“é¢ä¸´æ½œåœ¨çš„å†…æ ¸é—®é¢˜æ—¶ï¼Œåœæ¢ä½Žç”µåŽ‹æˆ–è¶…é¢‘ã€‚ + + * å°½é‡ç¡®ä¿ä¸æ˜¯ç¡¬ä»¶æ•…éšœå¯¼è‡´äº†ä½ çš„é—®é¢˜ã€‚ä¾‹å¦‚ï¼Œå†…å˜æŸå会导致大é‡çš„问题,这些 + 问题会表现为看起æ¥åƒå†…æ ¸é—®é¢˜ã€‚ + + * å¦‚æžœä½ æ£åœ¨å¤„ç†ä¸€ä¸ªæ–‡ä»¶ç³»ç»Ÿé—®é¢˜ï¼Œä½ å¯èƒ½éœ€è¦ç”¨ ``fsck`` 检查一下文件系统, + å› ä¸ºå®ƒå¯èƒ½ä¼šä»¥æŸç§æ–¹å¼è¢«æŸåï¼Œä»Žè€Œå¯¼è‡´æ— æ³•é¢„æœŸçš„å†…æ ¸è¡Œä¸ºã€‚ + + * 在处ç†å›žå½’问题时,è¦ç¡®ä¿æ²¡æœ‰åœ¨æ›´æ–°å†…æ ¸çš„åŒæ—¶å‘生了其他å˜åŒ–。例如,这个问 + 题å¯èƒ½æ˜¯ç”±åŒæ—¶æ›´æ–°çš„其他软件引起的。也有å¯èƒ½æ˜¯åœ¨ä½ 第一次é‡å¯è¿›å…¥æ–°å†…æ ¸æ—¶ï¼Œ + æŸä¸ªç¡¬ä»¶å·§åˆåœ°å了。更新系统 BIOS æˆ–æ”¹å˜ BIOS 设置ä¸çš„æŸäº›å†…å®¹ä¹Ÿä¼šå¯¼è‡´ + 一些看起æ¥å¾ˆåƒå†…æ ¸å›žå½’çš„é—®é¢˜ã€‚ + + +为紧急情况åšå¥½å‡†å¤‡ +------------------- + + *创建一个全新的备份,并将系统修å¤å’Œè¿˜åŽŸå·¥å…·æ”¾åœ¨æ‰‹è¾¹* + +我得æé†’您,您æ£åœ¨å’Œè®¡ç®—机打交é“ï¼Œè®¡ç®—æœºæœ‰æ—¶ä¼šå‡ºçŽ°æ„æƒ³ä¸åˆ°çš„事情,尤其是当 +您折腾其æ“ä½œç³»ç»Ÿçš„å†…æ ¸ç‰å…³é”®éƒ¨ä»¶æ—¶ã€‚è€Œè¿™å°±æ˜¯ä½ åœ¨è¿™ä¸ªè¿‡ç¨‹ä¸è¦åšçš„äº‹æƒ…ã€‚å› æ¤ï¼Œ +一定è¦åˆ›å»ºä¸€ä¸ªå…¨æ–°çš„备份;还è¦ç¡®ä¿ä½ æ‰‹å¤´æœ‰ä¿®å¤æˆ–é‡è£…æ“作系统的所有工具, +ä»¥åŠæ¢å¤å¤‡ä»½æ‰€éœ€çš„一切。 + + +ç¡®ä¿ä½ çš„å†…æ ¸ä¸ä¼šè¢«å¢žå¼º +------------------------ + + *ç¡®ä¿æ‚¨çš„系统ä¸ä¼šé€šè¿‡åŠ¨æ€æž„建é¢å¤–çš„å†…æ ¸æ¨¡å—æ¥å¢žå¼ºå…¶å†…æ ¸ï¼ŒåƒDKMSè¿™æ ·çš„è§£ + 决方案å¯èƒ½åœ¨æ‚¨ä¸çŸ¥æƒ…çš„æƒ…å†µä¸‹å°±åœ¨æœ¬åœ°è¿›è¡Œäº†è¿™æ ·çš„å·¥ä½œã€‚* + +å¦‚æžœå†…æ ¸ä»¥ä»»ä½•æ–¹å¼å¾—到增强,那么问题报告被忽略或拒ç»çš„é£Žé™©å°±ä¼šæ€¥å‰§å¢žåŠ ã€‚è¿™å°± +æ˜¯ä¸ºä»€ä¹ˆæ‚¨åº”è¯¥åˆ é™¤æˆ–ç¦ç”¨åƒakmodså’ŒDKMSè¿™æ ·çš„æœºåˆ¶ï¼šè¿™äº›æœºåˆ¶ä¼šè‡ªåŠ¨æž„å»ºé¢å¤–å†…æ ¸ +模å—,例如当您安装新的Linuxå†…æ ¸æˆ–ç¬¬ä¸€æ¬¡å¼•å¯¼å®ƒæ—¶ã€‚ä¹Ÿè¦è®°å¾—åŒæ—¶åˆ 除他们å¯èƒ½å®‰è£… +的任何模å—。然åŽé‡æ–°å¯åЍå†ç»§ç»ã€‚ + +注æ„ï¼Œä½ å¯èƒ½ä¸çŸ¥é“ä½ çš„ç³»ç»Ÿæ£åœ¨ä½¿ç”¨è¿™äº›è§£å†³æ–¹æ¡ˆä¹‹ä¸€ï¼šå½“ä½ å®‰è£… Nvidia 专有图 +形驱动程åºã€VirtualBox æˆ–å…¶ä»–éœ€è¦ Linux å†…æ ¸ä»¥å¤–çš„æ¨¡å—æ”¯æŒçš„软件时,它们通 +常会é™é»˜è®¾ç½®ã€‚è¿™å°±æ˜¯ä¸ºä»€ä¹ˆä½ å¯èƒ½éœ€è¦å¸è½½è¿™äº›è½¯ä»¶çš„软件包,以摆脱任何第三方 +å†…æ ¸æ¨¡å—。 + + +æ£€æŸ¥â€œæ±¡æŸ“â€æ ‡å¿— +---------------- + + *当问题å‘ç”Ÿæ—¶ï¼Œæ£€æŸ¥æ‚¨çš„å†…æ ¸æ˜¯å¦è¢«â€œæ±¡æŸ“â€ï¼Œå› ä¸ºä½¿å†…æ ¸è®¾ç½®è¿™ä¸ªæ ‡å¿—çš„äº‹ä»¶å¯ + 能会导致您é¢ä¸´çš„问题。* + +当æŸäº›å¯èƒ½ä¼šå¯¼è‡´çœ‹èµ·æ¥å®Œå…¨ä¸ç›¸å…³çš„åŽç»é”™è¯¯çš„事情å‘ç”Ÿæ—¶ï¼Œå†…æ ¸ä¼šç”¨â€œæ±¡æŸ“ +(taintï¼‰â€æ ‡å¿—æ ‡è®°è‡ªå·±ã€‚å¦‚æžœæ‚¨çš„å†…æ ¸å—到污染,那么您é¢ä¸´çš„å¯èƒ½æ˜¯è¿™æ ·çš„错误。 +å› æ¤åœ¨æŠ•入更多时间到这个过程ä¸ä¹‹å‰ï¼Œå°½æ—©æŽ’é™¤æ¤æƒ…况å¯èƒ½å¯¹ä½ 有好处。这是这个 +æ¥éª¤å‡ºçŽ°åœ¨è¿™é‡Œçš„å”¯ä¸€åŽŸå› ï¼Œå› ä¸ºè¿™ä¸ªè¿‡ç¨‹ç¨åŽä¼šå‘Šè¯‰æ‚¨å®‰è£…æœ€æ–°çš„ä¸»çº¿å†…æ ¸ï¼›ç„¶åŽ +您将需è¦å†æ¬¡æ£€æŸ¥æ±¡æŸ“æ ‡å¿—ï¼Œå› ä¸ºå½“å®ƒå‡ºé—®é¢˜çš„æ—¶å€™å†…æ ¸æŠ¥å‘Šä¼šå…³æ³¨å®ƒã€‚ + +在æ£åœ¨è¿è¡Œçš„ç³»ç»Ÿä¸Šæ£€æŸ¥å†…æ ¸æ˜¯å¦æ±¡æŸ“éžå¸¸å®¹æ˜“:如果 ``cat /proc/sys/kernel/tainted`` +返回“0â€ï¼Œé‚£ä¹ˆå†…æ ¸æ²¡æœ‰è¢«æ±¡æŸ“ï¼Œä¸€åˆ‡æ£å¸¸ã€‚在æŸäº›æƒ…å†µä¸‹æ— æ³•æ£€æŸ¥è¯¥æ–‡ä»¶ï¼›è¿™å°±æ˜¯ +ä¸ºä»€ä¹ˆå½“å†…æ ¸æŠ¥å‘Šå†…éƒ¨é—®é¢˜ï¼ˆâ€œkernel bugâ€ï¼‰ã€å¯æ¢å¤é”™è¯¯ï¼ˆâ€œkernel Oopsâ€ï¼‰æˆ–åœæ¢ +æ“作å‰ä¸å¯æ¢å¤çš„错误(“kernel panicâ€ï¼‰æ—¶ï¼Œå®ƒä¹Ÿä¼šæåˆ°æ±¡æŸ“状æ€ã€‚当其ä¸ä¸€ä¸ªé”™ +误å‘生时,查看打å°çš„错误消æ¯çš„顶部,æœç´¢ä»¥â€œCPU:â€å¼€å¤´çš„行。如果å‘现问题时内 +æ ¸æœªè¢«æ±¡æŸ“ï¼Œé‚£ä¹ˆå®ƒåº”è¯¥ä»¥â€œNot infectedâ€ç»“æŸï¼›å¦‚æžœä½ çœ‹åˆ°â€œTainted:â€ä¸”åŽè·Ÿä¸€äº› +ç©ºæ ¼å’Œå—æ¯ï¼Œé‚£å°±è¢«æ±¡æŸ“了。 + +å¦‚æžœä½ çš„å†…æ ¸è¢«æ±¡æŸ“äº†ï¼Œè¯·é˜…è¯»â€œDocumentation/translations/zh_CN/admin-guide/tainted-kernels.rst†+ä»¥æ‰¾å‡ºåŽŸå› ã€‚è®¾æ³•æ¶ˆé™¤æ±¡æŸ“å› ç´ ã€‚é€šå¸¸æ˜¯ç”±ä»¥ä¸‹ä¸‰ç§å› ç´ ä¹‹ä¸€å¼•èµ·çš„ï¼š + + 1. å‘ç”Ÿäº†ä¸€ä¸ªå¯æ¢å¤çš„错误(“kernel Oopsâ€ï¼‰ï¼Œå†…æ ¸æ±¡æŸ“äº†è‡ªå·±ï¼Œå› ä¸ºå†…æ ¸çŸ¥é“在 + æ¤ä¹‹åŽå®ƒå¯èƒ½ä¼šå‡ºçŽ°å¥‡æ€ªçš„è¡Œä¸ºé”™ä¹±ã€‚åœ¨è¿™ç§æƒ…å†µä¸‹ï¼Œæ£€æŸ¥æ‚¨çš„å†…æ ¸æˆ–ç³»ç»Ÿæ—¥å¿—ï¼Œ + 并寻找以下列文å—开头的部分:: + + Oops: 0000 [#1] SMP + + 如方括å·ä¸çš„“#1â€æ‰€ç¤ºï¼Œè¿™æ˜¯è‡ªå¯åЍ以æ¥çš„第一次Oops。æ¯ä¸ªOopså’Œæ¤åŽå‘生的 + 任何其他问题都å¯èƒ½æ˜¯é¦–个Oopsçš„åŽç»é—®é¢˜ï¼Œå³ä½¿è¿™ä¸¤ä¸ªé—®é¢˜çœ‹èµ·æ¥å®Œå…¨ä¸ç›¸å…³ã€‚ + 通过消除首个Oopsçš„åŽŸå› å¹¶åœ¨ä¹‹åŽå¤çŽ°è¯¥é—®é¢˜ï¼Œå¯ä»¥æŽ’é™¤è¿™ç§æƒ…况。有时仅仅 + 釿–°å¯åŠ¨å°±è¶³å¤Ÿäº†ï¼Œæœ‰æ—¶æ›´æ”¹é…ç½®åŽé‡æ–°å¯åЍå¯ä»¥æ¶ˆé™¤Oops。但是在这个æµç¨‹ä¸ + ä¸è¦èŠ±è´¹å¤ªå¤šæ—¶é—´åœ¨è¿™ä¸€ç‚¹ä¸Šï¼Œå› ä¸ºå¼•èµ·Oopsçš„åŽŸå› å¯èƒ½å·²ç»åœ¨æ‚¨ç¨åŽå°†æŒ‰æµç¨‹ + 安装的新Linuxå†…æ ¸ç‰ˆæœ¬ä¸ä¿®å¤äº†ã€‚ + + 2. æ‚¨çš„ç³»ç»Ÿä½¿ç”¨çš„è½¯ä»¶å®‰è£…äº†è‡ªå·±çš„å†…æ ¸æ¨¡å—,例如Nvidiaçš„ä¸“æœ‰å›¾å½¢é©±åŠ¨ç¨‹åºæˆ– + VirtualBoxã€‚å½“å†…æ ¸ä»Žå¤–éƒ¨æºï¼ˆå³ä½¿å®ƒä»¬æ˜¯å¼€æºçš„ï¼‰åŠ è½½æ¤ç±»æ¨¡å—时,它会污染 + 自己:它们有时会在ä¸ç›¸å…³çš„å†…æ ¸åŒºåŸŸå¯¼è‡´é”™è¯¯ï¼Œä»Žè€Œå¯èƒ½å¯¼è‡´æ‚¨é¢ä¸´çš„问题。 + å› æ¤ï¼Œå½“您想è¦å‘Linuxå†…æ ¸å¼€å‘人员报告问题时,您必须阻æ¢è¿™äº›æ¨¡å—åŠ è½½ã€‚ + 大多数情况下最简å•的方法是:临时å¸è½½è¿™äº›è½¯ä»¶ï¼ŒåŒ…括它们å¯èƒ½å·²ç»å®‰è£…的任 + 何模å—。之åŽé‡æ–°å¯åŠ¨ã€‚ + + 3. å½“å†…æ ¸åŠ è½½é©»ç•™åœ¨Linuxå†…æ ¸æºä»£ç stagingæ ‘ä¸çš„æ¨¡å—时,它也会污染自身。这 + 是一个特殊的区域,代ç ï¼ˆä¸»è¦æ˜¯é©±åŠ¨ç¨‹åºï¼‰è¿˜æ²¡æœ‰è¾¾åˆ°æ£å¸¸Linuxå†…æ ¸çš„è´¨é‡ + æ ‡å‡†ã€‚å½“æ‚¨æŠ¥å‘Šæ¤ç§æ¨¡å—çš„é—®é¢˜æ—¶ï¼Œå†…æ ¸å—到污染显然是没有问题的;åªéœ€ç¡®ä¿ + é—®é¢˜æ¨¡å—æ˜¯é€ æˆæ±¡æŸ“çš„å”¯ä¸€åŽŸå› ã€‚å¦‚æžœé—®é¢˜å‘生在一个ä¸ç›¸å…³çš„åŒºåŸŸï¼Œé‡æ–°å¯åЍ + 并通过指定 ``foo.blacklist=1`` ä½œä¸ºå†…æ ¸å‚æ•°ä¸´æ—¶é˜»æ¢è¯¥æ¨¡å—è¢«åŠ è½½ï¼ˆç”¨æœ‰ + 问题的模å—åæ›¿æ¢â€œfooâ€ï¼‰ã€‚ + + +记录如何é‡çŽ°é—®é¢˜ +------------------ + + *粗略地写下如何é‡çŽ°è¿™ä¸ªé—®é¢˜ã€‚å¦‚æžœæ‚¨åŒæ—¶å¤„ç†å¤šä¸ªé—®é¢˜ï¼Œè¯·ä¸ºæ¯ä¸ªé—®é¢˜å•独写 + 注释,并确ä¿å®ƒä»¬åœ¨æ–°å¯åŠ¨çš„ç³»ç»Ÿä¸Šç‹¬ç«‹å‡ºçŽ°ã€‚è¿™æ˜¯å¿…è¦çš„ï¼Œå› ä¸ºæ¯ä¸ªé—®é¢˜éƒ½éœ€ + è¦åˆ†åˆ«æŠ¥å‘Šç»™å†…æ ¸å¼€å‘人员,除éžå®ƒä»¬ä¸¥é‡çº ç¼ åœ¨ä¸€èµ·ã€‚* + +å¦‚æžœä½ åŒæ—¶å¤„ç†å¤šä¸ªé—®é¢˜ï¼Œå¿…须分别报告æ¯ä¸ªé—®é¢˜ï¼Œå› 为它们å¯èƒ½ç”±ä¸åŒçš„å¼€å‘人员 +处ç†ã€‚åœ¨ä¸€ä»½æŠ¥å‘Šä¸æè¿°å¤šç§é—®é¢˜ï¼Œä¹Ÿä¼šè®©å…¶ä»–äººéš¾ä»¥å°†å…¶åˆ†å¼€ã€‚å› æ¤åªæœ‰åœ¨é—®é¢˜ä¸¥ +é‡çº ç¼ çš„æƒ…å†µä¸‹ï¼Œæ‰èƒ½å°†é—®é¢˜åˆå¹¶åœ¨ä¸€ä»½æŠ¥å‘Šä¸ã€‚ + +æ¤å¤–,在报告过程ä¸ï¼Œä½ 必须测试该问题是å¦å‘ç”Ÿåœ¨å…¶ä»–å†…æ ¸ç‰ˆæœ¬ä¸Šã€‚å› æ¤ï¼Œå¦‚果您 +知é“如何在一个新å¯åŠ¨çš„ç³»ç»Ÿä¸Šå¿«é€Ÿé‡çŽ°é—®é¢˜ï¼Œå°†ä½¿æ‚¨çš„å·¥ä½œæ›´åŠ è½»æ¾ã€‚ + +注æ„:报告åªå‘ç”Ÿè¿‡ä¸€æ¬¡çš„é—®é¢˜å¾€å¾€æ˜¯æ²¡æœ‰ç»“æžœçš„ï¼Œå› ä¸ºå®ƒä»¬å¯èƒ½æ˜¯ç”±äºŽå®‡å®™è¾å°„导 +致的ä½ç¿»è½¬ã€‚æ‰€ä»¥ä½ åº”è¯¥å°è¯•通过é‡çŽ°é—®é¢˜æ¥æŽ’é™¤è¿™ç§æƒ…况,然åŽå†ç»§ç»ã€‚å¦‚æžœä½ æœ‰ +足够的ç»éªŒæ¥åŒºåˆ†ç”±äºŽç¡¬ä»¶æ•…障引起的一次性错误和难以é‡çŽ°çš„ç½•è§å†…æ ¸é—®é¢˜ï¼Œå¯ä»¥ +忽略这个建议。 + + +稳定版或长期支æŒå†…æ ¸çš„å›žå½’ï¼Ÿ +----------------------------- + + *如果您æ£é¢ä¸´ç¨³å®šç‰ˆæˆ–长期支æŒç‰ˆæœ¬çº¿çš„回归(例如从5.10.4更新到5.10.5时出现 + æ•…éšœï¼‰ï¼Œè¯·æŸ¥çœ‹åŽæ–‡â€œæŠ¥å‘Šç¨³å®šç‰ˆå’Œé•¿æœŸæ”¯æŒå†…æ ¸çº¿çš„å›žå½’â€å°èŠ‚ã€‚* + +稳定版和长期支æŒå†…æ ¸ç‰ˆæœ¬çº¿ä¸çš„回归是Linuxå¼€å‘人员éžå¸¸å¸Œæœ›è§£å†³çš„é—®é¢˜ï¼Œè¿™æ ·çš„ +问题甚至比主线开å‘分支ä¸çš„回归更ä¸åº”å‡ºçŽ°ï¼Œå› ä¸ºå®ƒä»¬ä¼šå¾ˆå¿«å½±å“到很多人。开å‘人员 +希望尽快了解æ¤ç±»é—®é¢˜ï¼Œå› æ¤æœ‰ä¸€ä¸ªç®€åŒ–æµç¨‹æ¥æŠ¥å‘Šè¿™äº›é—®é¢˜ã€‚注æ„ï¼Œä½¿ç”¨æ›´æ–°å†…æ ¸ç‰ˆ +本线的回归(比如从5.9.15切æ¢åˆ°5.10.5时出现故障)ä¸ç¬¦åˆæ¡ä»¶ã€‚ + + +ä½ éœ€è¦å°†é—®é¢˜æŠ¥å‘Šåˆ°ä½•处 +------------------------ + + *定ä½å¯èƒ½å¼•èµ·é—®é¢˜çš„é©±åŠ¨ç¨‹åºæˆ–å†…æ ¸å系统。找出其开å‘äººå‘˜æœŸæœ›çš„æŠ¥å‘Šçš„æ–¹å¼ + å’Œä½ç½®ã€‚注æ„:大多数情况下ä¸ä¼šæ˜¯bugzilla.kernel.orgï¼Œå› ä¸ºé—®é¢˜é€šå¸¸éœ€è¦é€š + 过邮件å‘é€ç»™ç»´æŠ¤äººå‘˜å’Œå…¬å…±é‚®ä»¶åˆ—表。* + +将报告å‘é€ç»™åˆé€‚的人是至关é‡è¦çš„ï¼Œå› ä¸ºLinuxå†…æ ¸æ˜¯ä¸€ä¸ªå¤§é¡¹ç›®ï¼Œå¤§å¤šæ•°å¼€å‘人员 +åªç†Ÿæ‚‰å…¶ä¸çš„一å°éƒ¨åˆ†ã€‚例如,相当多的程åºå‘˜åªå…³å¿ƒä¸€ä¸ªé©±åŠ¨ç¨‹åºï¼Œæ¯”如一个WiFi +芯片驱动程åºï¼›å®ƒçš„å¼€å‘人员å¯èƒ½å¯¹ç–远的或ä¸ç›¸å…³çš„“å系统â€ï¼ˆå¦‚TCPå †æ ˆã€ +PCIe/PCIå系统ã€å†…å˜ç®¡ç†æˆ–文件系统)的内部知识了解很少或完全ä¸äº†è§£ã€‚ + +问题在于:Linuxå†…æ ¸ç¼ºå°‘ä¸€ä¸ªï¼Œå¯ä»¥ç®€å•地将问题归档并让需è¦äº†è§£å®ƒçš„å¼€å‘人员了 +解它的,ä¸å¿ƒåŒ–ç¼ºé™·è·Ÿè¸ªå™¨ã€‚è¿™å°±æ˜¯ä¸ºä»€ä¹ˆä½ å¿…é¡»æ‰¾åˆ°æ£ç¡®çš„途径æ¥è‡ªå·±æŠ¥å‘Šé—®é¢˜ã€‚ +您å¯ä»¥åœ¨è„šæœ¬çš„å¸®åŠ©ä¸‹åšåˆ°è¿™ä¸€ç‚¹ï¼ˆè§ä¸‹æ–‡ï¼‰ï¼Œä½†å®ƒä¸»è¦é’ˆå¯¹çš„æ˜¯å†…æ ¸å¼€å‘人员和专 +家。对于其他人æ¥è¯´ï¼ŒMAINTAINERS(维护人员)文件是更好的选择。 + +如何阅读MAINTAINERS维护者文件 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +为了说明如何使用 :ref:`MAINTAINERS <maintainers>` 文件,让我们å‡è®¾æ‚¨çš„笔记 +本电脑ä¸çš„WiFiåœ¨æ›´æ–°å†…æ ¸åŽçªç„¶å‡ºçŽ°äº†é”™è¯¯è¡Œä¸ºã€‚è¿™ç§æƒ…况下å¯èƒ½æ˜¯WiFi驱动的问 +题。显然,它也å¯èƒ½ç”±äºŽé©±åŠ¨åŸºäºŽçš„æŸäº›ä»£ç ,但除éžä½ æ€€ç–‘æœ‰è¿™æ ·çš„ä¸œè¥¿ä¼šé™„ç€åœ¨ +驱动程åºä¸Šã€‚如果真的是其他的问题,驱动程åºçš„å¼€å‘人员会让åˆé€‚的人å‚与进æ¥ã€‚ + +é—æ†¾çš„æ˜¯ï¼Œæ²¡æœ‰é€šç”¨ä¸”简å•çš„åŠžæ³•æ¥æ£€æŸ¥å“ªä¸ªä»£ç 驱动了特定硬件组件。 + +在WiFié©±åŠ¨å‡ºçŽ°é—®é¢˜çš„æƒ…å†µä¸‹ï¼Œä½ å¯èƒ½æƒ³æŸ¥çœ‹ ``lspci -k`` çš„è¾“å‡ºï¼Œå› ä¸ºå®ƒåˆ—å‡ºäº† +PCI/PCIeæ€»çº¿ä¸Šçš„è®¾å¤‡å’Œé©±åŠ¨å®ƒçš„å†…æ ¸æ¨¡å—:: + + [user@something ~]$ lspci -k + [...] + 3a:00.0 Network controller: Qualcomm Atheros QCA6174 802.11ac Wireless Network Adapter (rev 32) + Subsystem: Bigfoot Networks, Inc. Device 1535 + Kernel driver in use: ath10k_pci + Kernel modules: ath10k_pci + [...] + +ä½†å¦‚æžœä½ çš„WiFi芯片通过USBæˆ–å…¶ä»–å†…éƒ¨æ€»çº¿è¿žæŽ¥ï¼Œè¿™ç§æ–¹æ³•就行ä¸é€šäº†ã€‚åœ¨è¿™ç§æƒ…况 +下,您å¯èƒ½éœ€è¦æ£€æŸ¥æ‚¨çš„WiFi管ç†å™¨æˆ– ``ip link`` çš„è¾“å‡ºã€‚å¯»æ‰¾æœ‰é—®é¢˜çš„ç½‘ç»œæŽ¥å£ +çš„å称,它å¯èƒ½ç±»ä¼¼äºŽâ€œwlp58s0â€ã€‚æ¤åç§°å¯ä»¥ç”¨æ¥æ‰¾åˆ°é©±åŠ¨å®ƒçš„æ¨¡å—:: + + [user@something ~]$ realpath --relative-to=/sys/module//sys/class/net/wlp58s0/device/driver/module + ath10k_pci + +如果这些技巧ä¸èƒ½è¿›ä¸€æ¥å¸®åŠ©æ‚¨ï¼Œè¯·å°è¯•在网上æœç´¢å¦‚何缩å°ç›¸å…³é©±åŠ¨ç¨‹åºæˆ–å系统 +çš„èŒƒå›´ã€‚å¦‚æžœä½ ä¸ç¡®å®šæ˜¯å“ªä¸€ä¸ªï¼šè¯•ç€çŒœä¸€ä¸‹ï¼Œå³ä½¿ä½ 猜得ä¸å¥½ï¼Œä¹Ÿä¼šæœ‰äººä¼šå¸®åŠ©ä½ +的。 + +一旦您知é“äº†ç›¸åº”çš„é©±åŠ¨ç¨‹åºæˆ–å系统,您就希望在MAINTAINERSæ–‡ä»¶ä¸æœç´¢å®ƒã€‚如果 +是“ath10k_pciâ€ï¼Œæ‚¨ä¸ä¼šæ‰¾åˆ°ä»»ä½•ä¸œè¥¿ï¼Œå› ä¸ºåç§°å¤ªå…·ä½“äº†ã€‚æœ‰æ—¶ä½ éœ€è¦åœ¨ç½‘上寻找 +帮助;但在æ¤ä¹‹å‰ï¼Œè¯·å°è¯•使用一个ç¨çŸæˆ–修改过的åç§°æ¥æœç´¢MAINTAINERSæ–‡ä»¶ï¼Œå› +ä¸ºè¿™æ ·ä½ å¯èƒ½ä¼šå‘çŽ°ç±»ä¼¼è¿™æ ·çš„ä¸œè¥¿:: + + QUALCOMM ATHEROS ATH10K WIRELESS DRIVER + Mail: A. Some Human <shuman@example.com> + Mailing list: ath10k@lists.infradead.org + Status: Supported + Web-page: https://wireless.wiki.kernel.org/en/users/Drivers/ath10k + SCM: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git + Files: drivers/net/wireless/ath/ath10k/ + +注æ„:如果您阅读在Linuxæºä»£ç æ ‘çš„æ ¹ç›®å½•ä¸æ‰¾åˆ°çš„原始维护者文件,则行æè¿°å°†æ˜¯ +缩写。例如,“Mail:(邮件)â€å°†æ˜¯â€œM:â€ï¼Œâ€œMailing list:(邮件列表)â€å°†æ˜¯â€œLâ€ï¼Œ +“Status:(状æ€ï¼‰â€å°†æ˜¯â€œS:â€ã€‚æ¤æ–‡ä»¶é¡¶éƒ¨æœ‰ä¸€æ®µè§£é‡Šäº†è¿™äº›å’Œå…¶ä»–缩写。 + +首先查看“Statusâ€çжæ€è¡Œã€‚ç†æƒ³æƒ…况下,它应该得到“Supported(支æŒï¼‰â€æˆ– +“Maintained(维护)â€ã€‚如果状æ€ä¸ºâ€œObsolete(过时的)â€ï¼Œé‚£ä¹ˆä½ 在使用一些过时的 +方法,需è¦è½¬æ¢åˆ°æ–°çš„è§£å†³æ–¹æ¡ˆä¸Šã€‚æœ‰æ—¶å€™ï¼Œåªæœ‰åœ¨æ„Ÿåˆ°æœ‰åŠ¨åŠ›æ—¶ï¼Œæ‰ä¼šæœ‰äººä¸ºä»£ç +æä¾›â€œOdd Fixesâ€ã€‚如果碰è§â€œOrphanâ€ï¼Œä½ 就完全ä¸èµ°è¿äº†ï¼Œå› 为å†ä¹Ÿæ²¡æœ‰äººå…³å¿ƒä»£ç +了,åªå‰©ä¸‹è¿™äº›é€‰é¡¹:准备好与问题共å˜ï¼Œè‡ªå·±ä¿®å¤å®ƒï¼Œæˆ–者找一个愿æ„ä¿®å¤å®ƒçš„程åºå‘˜ã€‚ + +检查状æ€åŽï¼Œå¯»æ‰¾ä»¥â€œbug:â€å¼€å¤´çš„ä¸€è¡Œï¼šå®ƒå°†å‘Šè¯‰ä½ åœ¨å“ªé‡Œå¯ä»¥æ‰¾åˆ°å系统特定的缺 +é™·è·Ÿè¸ªå™¨æ¥æäº¤ä½ çš„é—®é¢˜ã€‚ä¸Šé¢çš„例忲¡æœ‰æ¤è¡Œã€‚å¤§å¤šæ•°éƒ¨åˆ†éƒ½æ˜¯è¿™æ ·ï¼Œå› ä¸º Linux +å†…æ ¸çš„å¼€å‘完全是由邮件驱动的。很少有å系统使用缺陷跟踪器,且其ä¸åªæœ‰ä¸€éƒ¨åˆ† +ä¾èµ–于 bugzilla.kernel.org。 + +在这ç§ä»¥åŠå…¶ä»–å¾ˆå¤šæƒ…å†µä¸‹ï¼Œä½ å¿…é¡»å¯»æ‰¾ä»¥â€œMail:â€å¼€å¤´çš„行。这些行æåˆ°äº†ç‰¹å®šä»£ç +的维护者的åå—和电å邮件地å€ã€‚也å¯ä»¥æŸ¥æ‰¾ä»¥â€œMailing list:â€å¼€å¤´çš„è¡Œï¼Œå®ƒå‘Šè¯‰ä½ +å¼€å‘代ç çš„å…¬å…±é‚®ä»¶åˆ—è¡¨ã€‚ä½ çš„æŠ¥å‘Šä¹‹åŽéœ€è¦é€šè¿‡é‚®ä»¶å‘到这些地å€ã€‚å¦å¤–,对于所有 +通过电å邮件å‘é€çš„é—®é¢˜æŠ¥å‘Šï¼Œä¸€å®šè¦æŠ„é€ Linux Kernel Mailing List(LKML) +<linux-kernel@vger.kernel.org>。在以åŽé€šè¿‡é‚®ä»¶å‘é€é—®é¢˜æŠ¥å‘Šæ—¶ï¼Œä¸è¦é—æ¼ä»»ä½• +一个邮件列表!维护者都是大忙人,å¯èƒ½ä¼šæŠŠä¸€äº›å·¥ä½œç•™ç»™å系统特定列表上的其他开 +å‘者;而 LKML 很é‡è¦ï¼Œå› 为需è¦ä¸€ä¸ªå¯ä»¥æ‰¾åˆ°æ‰€æœ‰é—®é¢˜æŠ¥å‘Šçš„地方。 + + +借助脚本找到维护者 +~~~~~~~~~~~~~~~~~~~~ + +对于手头有Linuxæºç 的人æ¥è¯´ï¼Œæœ‰ç¬¬äºŒä¸ªå¯ä»¥æ‰¾åˆ°åˆé€‚的报告地点的选择:脚本 +“scripts/get_maintainer.plâ€ï¼Œå®ƒå°è¯•找到所有è¦è”系的人。它会查询MAINTAINERS +文件,并需è¦ç”¨ç›¸å…³æºä»£ç 的路径æ¥è°ƒç”¨ã€‚å¯¹äºŽç¼–è¯‘æˆæ¨¡å—的驱动程åºï¼Œç»å¸¸å¯ä»¥ç”¨ +è¿™æ ·çš„å‘½ä»¤æ‰¾åˆ°:: + + $ modinfo ath10k_pci | grep filename | sed 's!/lib/modules/.*/kernel/!!; s!filename:!!; s!\.ko\(\|\.xz\)!!' + drivers/net/wireless/ath/ath10k/ath10k_pci.ko + +将其ä¸çš„éƒ¨åˆ†å†…å®¹ä¼ é€’ç»™è„šæœ¬:: + + $ ./scripts/get_maintainer.pl -f drivers/net/wireless/ath/ath10k* + Some Human <shuman@example.com> (supporter:QUALCOMM ATHEROS ATH10K WIRELESS DRIVER) + Another S. Human <asomehuman@example.com> (maintainer:NETWORKING DRIVERS) + ath10k@lists.infradead.org (open list:QUALCOMM ATHEROS ATH10K WIRELESS DRIVER) + linux-wireless@vger.kernel.org (open list:NETWORKING DRIVERS (WIRELESS)) + netdev@vger.kernel.org (open list:NETWORKING DRIVERS) + linux-kernel@vger.kernel.org (open list) + +ä¸è¦æŠŠä½ 的报告å‘给所有的人。å‘é€ç»™ç»´æŠ¤è€…,脚本称之为“supporter:â€ï¼›å¦å¤–æŠ„é€ +ä»£ç æœ€ç›¸å…³çš„é‚®ä»¶åˆ—è¡¨ï¼Œä»¥åŠ Linux å†…æ ¸é‚®ä»¶åˆ—è¡¨ï¼ˆLKML)。在æ¤ä¾‹ä¸ï¼Œä½ 需è¦å°†æŠ¥ +告å‘é€ç»™ “Some Human <shuman@example.com>â€ ï¼Œå¹¶æŠ„é€ +“ath10k@lists.infradead.orgâ€å’Œâ€œlinux-kernel@vger.kernel.orgâ€ã€‚ + +注æ„ï¼šå¦‚æžœä½ ç”¨ git 克隆了 Linux æºä»£ç ï¼Œä½ å¯èƒ½éœ€è¦ç”¨--git 冿¬¡è°ƒç”¨ +get_maintainer.pl。脚本会查看æäº¤åކå²ï¼Œä»¥æ‰¾åˆ°æœ€è¿‘哪些人å‚与了相关代ç 的编写, +å› ä¸ºä»–ä»¬å¯èƒ½ä¼šæä¾›å¸®åŠ©ã€‚ä½†è¦å°å¿ƒä½¿ç”¨è¿™äº›ç»“æžœï¼Œå› ä¸ºå®ƒå¾ˆå®¹æ˜“è®©ä½ è¯¯å…¥æ§é€”。 +ä¾‹å¦‚ï¼Œè¿™ç§æƒ…况常常会å‘ç”Ÿåœ¨å¾ˆå°‘è¢«ä¿®æ”¹çš„åœ°æ–¹ï¼ˆæ¯”å¦‚è€æ—§çš„æˆ–未维护的驱动程åºï¼‰ï¼š +æœ‰æ—¶è¿™æ ·çš„ä»£ç ä¼šåœ¨æ ‘çº§æ¸…ç†æœŸé—´è¢«æ ¹æœ¬ä¸å…³å¿ƒæ¤é©±åŠ¨ç¨‹åºçš„å¼€å‘者修改。 + + +æœç´¢çŽ°æœ‰æŠ¥å‘Šï¼ˆç¬¬äºŒéƒ¨åˆ†ï¼‰ +-------------------------- + + *åœ¨ç¼ºé™·è¿½è¸ªå™¨æˆ–é—®é¢˜ç›¸å…³é‚®ä»¶åˆ—è¡¨çš„å˜æ¡£ä¸å½»åº•æœç´¢å¯èƒ½ä¸Žæ‚¨çš„问题匹é…的报告。 + 如果找到匹é…çš„æŠ¥å‘Šï¼Œè¯·åŠ å…¥è®¨è®ºè€Œä¸æ˜¯å‘逿–°æŠ¥å‘Šã€‚* + +如剿‰€è¿°ï¼šæŠ¥å‘Šä¸€ä¸ªåˆ«äººå·²ç»æå‡ºçš„问题,对æ¯ä¸ªäººæ¥è¯´éƒ½æ˜¯æµªè´¹æ—¶é—´ï¼Œå°¤å…¶æ˜¯ä½œä¸ºæŠ¥å‘Š +äººçš„ä½ ã€‚è¿™å°±æ˜¯ä¸ºä»€ä¹ˆä½ åº”è¯¥å†æ¬¡æœç´¢çŽ°æœ‰çš„æŠ¥å‘Šã€‚çŽ°åœ¨ä½ å·²ç»çŸ¥é“é—®é¢˜éœ€è¦æŠ¥å‘Šåˆ°å“ªé‡Œã€‚ +如果是邮件列表,那么一般在 `lore.kernel.org <https://lore.kernel.org/>`_ å¯ä»¥ +æ‰¾åˆ°ç›¸åº”å˜æ¡£ã€‚ + +但有些列表è¿è¡Œåœ¨å…¶ä»–地方。例如å‰é¢æ¥éª¤ä¸å½“例åçš„ath10k WiFi驱动程åºå°±æ˜¯è¿™ç§ +æƒ…å†µã€‚ä½†æ˜¯ä½ é€šå¸¸å¯ä»¥åœ¨ç½‘上很容易地找到这些列表的档案。例如æœç´¢â€œarchive +ath10k@lists.infradead.orgâ€ï¼Œå°†å¼•导您到ath10k邮件列表的信æ¯é¡µï¼Œè¯¥é¡µé¢é¡¶éƒ¨é“¾æŽ¥ +到其 `åˆ—è¡¨å˜æ¡£ <https://lists.infradead.org/pipermail/ath10k/>`_ ã€‚é—æ†¾çš„æ˜¯ï¼Œ +è¿™ä¸ªåˆ—è¡¨å’Œå…¶ä»–ä¸€äº›åˆ—è¡¨ç¼ºä¹æœç´¢å…¶å˜æ¡£çš„åŠŸèƒ½ã€‚åœ¨è¿™ç§æƒ…况下å¯ä»¥ä½¿ç”¨å¸¸è§„的互è”网 +æœç´¢å¼•æ“Žï¼Œå¹¶æ·»åŠ ç±»ä¼¼â€œsite:lists.infadead.org/pipermail/ath10k/â€è¿™ +æ ·çš„æœç´¢æ¡ä»¶ï¼Œè¿™ä¼šæŠŠç»“æžœé™åˆ¶åœ¨è¯¥é“¾æŽ¥ä¸çš„æ¡£æ¡ˆã€‚ + +ä¹Ÿè¯·è¿›ä¸€æ¥æœç´¢ç½‘络ã€LKMLå’Œbugzilla.kernel.org网站。 + +有关如何æœç´¢ä»¥åŠåœ¨æ‰¾åˆ°åŒ¹é…报告时如何æ“作的详细信æ¯ï¼Œè¯·å‚阅上é¢çš„“æœç´¢çŽ°æœ‰æŠ¥å‘Š +(第一部分)â€ã€‚ + +ä¸è¦æ€¥ç€å®ŒæˆæŠ¥å‘Šè¿‡ç¨‹çš„这一æ¥ï¼šèб30到60分钟甚至更多的时间å¯ä»¥ä¸ºä½ å’Œå…¶ä»–äººèŠ‚çœ / +å‡å°‘相当多的时间和麻烦。 + + +å®‰è£…ä¸€ä¸ªæ–°çš„å†…æ ¸è¿›è¡Œæµ‹è¯• +-------------------------- + + *é™¤éžæ‚¨å·²ç»åœ¨è¿è¡Œæœ€æ–°çš„“主线â€Linuxå†…æ ¸ï¼Œå¦åˆ™æœ€å¥½åœ¨æŠ¥å‘Šæµç¨‹å‰å®‰è£…它。在 + æŸäº›æƒ…况下,使用最新的“稳定版â€Linux进行测试和报告也是å¯ä»¥æŽ¥å—的替代方案; + 在åˆå¹¶çª—壿œŸé—´ï¼Œè¿™å®žé™…上å¯èƒ½æ˜¯æœ€å¥½çš„æ–¹æ³•,但在开å‘阶段最好还是暂åœå‡ 天。 + æ— è®ºä½ é€‰æ‹©ä»€ä¹ˆç‰ˆæœ¬ï¼Œæœ€å¥½ä½¿ç”¨â€œæ™®é€šâ€æž„å»ºã€‚å¿½ç•¥è¿™äº›å»ºè®®ä¼šå¤§å¤§å¢žåŠ æ‚¨çš„æŠ¥å‘Š + è¢«æ‹’ç»æˆ–忽略的风险。* + +æ£å¦‚第一æ¥çš„è¯¦ç»†è§£é‡Šä¸æ‰€æåˆ°çš„:与大多数程åºå‘˜ä¸€æ ·ï¼Œä¸Žå¤§å¤šæ•°ç¨‹åºå‘˜ä¸€æ ·ï¼ŒLinux +å†…æ ¸å¼€å‘人员ä¸å–œæ¬¢èŠ±æ—¶é—´å¤„ç†ä»–们维护的æºä»£ç 䏿 ¹æœ¬ä¸ä¼šå‘ç”Ÿçš„é—®é¢˜çš„æŠ¥å‘Šã€‚è¿™åª +会浪费æ¯ä¸ªäººçš„æ—¶é—´ï¼Œå°¤å…¶æ˜¯ä½ 的时间。这就是为什么在报告问题之å‰ï¼Œæ‚¨å¿…须先确认 +问题ä»ç„¶å˜åœ¨äºŽæœ€æ–°çš„上游代ç ä¸ï¼Œè¿™ç¬¦åˆæ¯ä¸ªäººçš„利益。您å¯ä»¥å¿½ç•¥æ¤å»ºè®®ï¼Œä½†å¦‚å‰ +æ‰€è¿°ï¼šè¿™æ ·åšä¼šæžå¤§åœ°å¢žåŠ é—®é¢˜æŠ¥å‘Šè¢«æ‹’ç»æˆ–被忽略的风险。 + +å†…æ ¸â€œæœ€æ–°ä¸Šæ¸¸â€çš„范围通常指: + + * å®‰è£…ä¸€ä¸ªä¸»çº¿å†…æ ¸ï¼›æœ€æ–°çš„ç¨³å®šç‰ˆå†…æ ¸ä¹Ÿå¯ä»¥æ˜¯ä¸€ä¸ªé€‰æ‹©ï¼Œä½†å¤§å¤šæ•°æ—¶å€™éƒ½æœ€å¥½é¿å…。 + 长期支æŒå†…æ ¸ï¼ˆæœ‰æ—¶ç§°ä¸ºâ€œLTSå†…æ ¸â€ï¼‰ä¸é€‚åˆæ¤æµç¨‹ã€‚下一å°èŠ‚å°†æ›´è¯¦ç»†åœ°è§£é‡Šæ‰€æœ‰ + 这些。 + + * 下一å°èŠ‚æè¿°èŽ·å–å’Œå®‰è£…è¿™æ ·ä¸€ä¸ªå†…æ ¸çš„æ–¹æ³•ã€‚å®ƒè¿˜æŒ‡å‡ºäº†ä½¿ç”¨é¢„ç¼–è¯‘å†…æ ¸æ˜¯å¯ä»¥çš„, + ä½†æ™®é€šçš„å†…æ ¸æ›´å¥½ï¼Œè¿™æ„味ç€ï¼šå®ƒæ˜¯ç›´æŽ¥ä½¿ç”¨ä»Ž `kernel.org <https://kernel.org/>`_ + 获得的Linuxæºä»£ç 构建并且没有任何方å¼ä¿®æ”¹æˆ–增强。 + + +é€‰æ‹©é€‚åˆæµ‹è¯•的版本 +~~~~~~~~~~~~~~~~~~~~ + +å‰å¾€ `kernel.org <https://kernel.org/>`_ æ¥å†³å®šä½¿ç”¨å“ªä¸ªç‰ˆæœ¬ã€‚å¿½ç•¥é‚£ä¸ªå†™ç€ +“Latest release最新版本â€çš„å·¨å¤§é»„è‰²æŒ‰é’®ï¼Œå¾€ä¸‹çœ‹æœ‰ä¸€ä¸ªè¡¨æ ¼ã€‚åœ¨è¡¨æ ¼çš„é¡¶éƒ¨ï¼Œä½ ä¼š +看到一行以“mainlineâ€å¼€å¤´çš„å—æ ·ï¼Œå¤§å¤šæ•°æƒ…况下它会指å‘一个版本å·ç±»ä¼¼â€œ5.8-rc2†+的预å‘å¸ƒç‰ˆæœ¬ã€‚å¦‚æžœæ˜¯è¿™æ ·çš„è¯ï¼Œä½ 将需è¦ä½¿ç”¨è¿™ä¸ªä¸»çº¿å†…æ ¸è¿›è¡Œæµ‹è¯•ã€‚ä¸è¦è®©â€œrc†+å“åˆ°ä½ ï¼Œè¿™äº›â€œå¼€å‘ç‰ˆå†…æ ¸â€å®žé™…上éžå¸¸å¯é â€”â€”è€Œä¸”ä½ å·²ç»æŒ‰ç…§ä¸Šé¢çš„æŒ‡ç¤ºåšäº†å¤‡ä»½ï¼Œ +䏿˜¯å—? + +大概æ¯ä¹åˆ°å周,“mainlineâ€å¯èƒ½ä¼šç»™ä½ 指出一个版本å·ç±»ä¼¼â€œ5.7â€çš„æ£å¼ç‰ˆæœ¬ã€‚如果 +碰è§è¿™ç§æƒ…å†µï¼Œè¯·è€ƒè™‘æš‚åœæŠ¥å‘Šè¿‡ç¨‹ï¼Œç›´åˆ°ä¸‹ä¸€ä¸ªç‰ˆæœ¬çš„ç¬¬ä¸€ä¸ªé¢„å‘布(5.8-rc1)出 +现在 `kernel.org <https://kernel.org/>`_ ä¸Šã€‚è¿™æ˜¯å› ä¸º Linux 的开å‘周期æ£åœ¨ +两周的“åˆå¹¶çª—å£â€å†…。大部分的改动和所有干扰性的改动都会在这段时间内被åˆå¹¶åˆ° +下一个版本ä¸ã€‚åœ¨æ¤æœŸé—´ä½¿ç”¨ä¸»çº¿æ˜¯æ¯”较å±é™©çš„ã€‚å†…æ ¸å¼€å‘者通常也很忙,å¯èƒ½æ²¡æœ‰ +多余的时间æ¥å¤„ç†é—®é¢˜æŠ¥å‘Šã€‚这也是很有å¯èƒ½åœ¨åˆå¹¶çª—å£ä¸åº”用了许多修改æ¥ä¿®å¤ä½ +所é¢ä¸´çš„é—®é¢˜ï¼›è¿™å°±æ˜¯ä¸ºä»€ä¹ˆä½ å¾ˆå¿«å°±å¾—ç”¨ä¸€ä¸ªæ–°çš„å†…æ ¸ç‰ˆæœ¬é‡æ–°æµ‹è¯•,就åƒä¸‹é¢â€œå‘ +布报告åŽçš„责任â€ä¸€èЂ䏿‰€è¿°çš„é‚£æ ·ã€‚ + +这就是为什么è¦ç‰åˆ°åˆå¹¶çª—å£ç»“æŸåŽæ‰åŽ»åšã€‚ä½†æ˜¯å¦‚æžœä½ å¤„ç†çš„æ˜¯ä¸€äº›ä¸åº”该ç‰å¾…çš„ +ä¸œè¥¿ï¼Œåˆ™æ— éœ€è¿™æ ·åšã€‚åœ¨è¿™ç§æƒ…况下,å¯ä»¥è€ƒè™‘通过 git èŽ·å–æœ€æ–°çš„ä¸»çº¿å†…æ ¸ï¼ˆè§ä¸‹ +文),或者使用 kernel.org 上æä¾›çš„æœ€æ–°ç¨³å®šç‰ˆæœ¬ã€‚如果 mainline å› ä¸ºæŸäº›åŽŸå› +䏿— 法æ£å¸¸å·¥ä½œï¼Œé‚£ä¹ˆä½¿ç”¨å®ƒä¹Ÿæ˜¯å¯ä»¥æŽ¥å—的。总的æ¥è¯´ï¼šç”¨å®ƒæ¥é‡çŽ°é—®é¢˜ä¹Ÿæ¯”å®Œå…¨ +ä¸æŠ¥å‘Šé—®é¢˜è¦å¥½ã€‚ + +最好é¿å…在åˆå¹¶çª—å£å¤–ä½¿ç”¨æœ€æ–°çš„ç¨³å®šç‰ˆå†…æ ¸ï¼Œå› ä¸ºæ‰€æœ‰ä¿®å¤éƒ½å¿…须首先应用于主线。 +è¿™å°±æ˜¯ä¸ºä»€ä¹ˆæ£€æŸ¥æœ€æ–°çš„ä¸»çº¿å†…æ ¸æ˜¯å¦‚æ¤é‡è¦ï¼šä½ 希望看到在旧版本线修å¤çš„任何问题 +需è¦å…ˆåœ¨ä¸»çº¿ä¿®å¤ï¼Œç„¶åŽæ‰èƒ½å¾—åˆ°å›žä¼ ï¼Œè¿™å¯èƒ½éœ€è¦å‡ å¤©æˆ–å‡ å‘¨ã€‚å¦ä¸€ä¸ªåŽŸå› æ˜¯ï¼šæ‚¨ +希望的修å¤å¯¹äºŽå›žä¼ æ¥è¯´å¯èƒ½å¤ªéš¾æˆ–å¤ªå†’é™©ï¼›å› æ¤å†æ¬¡æŠ¥å‘Šé—®é¢˜ä¸å¤ªå¯èƒ½æ”¹å˜ä»»ä½•事情。 + +这些方é¢ä¹Ÿéƒ¨åˆ†è¡¨æ˜Žäº†ä¸ºä»€ä¹ˆé•¿æœŸæ”¯æŒå†…æ ¸ï¼ˆæœ‰æ—¶ç§°ä¸ºâ€œLTSå†…æ ¸â€ï¼‰ä¸é€‚åˆæŠ¥å‘Šæµç¨‹ï¼š +它们与当å‰ä»£ç çš„è·ç¦»å¤ªè¿œã€‚å› æ¤ï¼Œå…ˆåŽ»æµ‹è¯•ä¸»çº¿ï¼Œç„¶åŽå†æŒ‰æµç¨‹èµ°ï¼šå¦‚果主线没有 +出现问题,æµç¨‹å°†æŒ‡å¯¼æ‚¨å¦‚何在旧版本线ä¸ä¿®å¤å®ƒã€‚ + +如何获得新的 Linux å†…æ ¸ +~~~~~~~~~~~~~~~~~~~~~~~~~ + +ä½ å¯ä»¥ä½¿ç”¨é¢„ç¼–è¯‘æˆ–è‡ªç¼–è¯‘çš„å†…æ ¸è¿›è¡Œæµ‹è¯•ï¼›å¦‚æžœä½ é€‰æ‹©åŽè€…,å¯ä»¥ä½¿ç”¨ git èŽ·å–æº +代ç ,或者下载其 tar å˜æ¡£åŒ…。 + +**ä½¿ç”¨é¢„ç¼–è¯‘çš„å†…æ ¸** ï¼šè¿™å¾€å¾€æ˜¯æœ€å¿«é€Ÿã€æœ€ç®€å•ã€æœ€å®‰å…¨çš„æ–¹æ³•â€”â€”å°¤å…¶æ˜¯åœ¨ä½ ä¸ç†Ÿ +悉 Linux å†…æ ¸çš„æƒ…å†µä¸‹ã€‚é—®é¢˜æ˜¯ï¼šå‘è¡Œå•†æˆ–é™„åŠ å˜å‚¨åº“æä¾›çš„大多数版本都是从修改 +过的Linuxæºä»£ç æž„å»ºçš„ã€‚å› æ¤å®ƒä»¬ä¸æ˜¯æ™®é€šçš„,通常ä¸é€‚åˆäºŽæµ‹è¯•和问题报告:这些 +更改å¯èƒ½ä¼šå¯¼è‡´æ‚¨é¢ä¸´çš„问题或以æŸç§æ–¹å¼å½±å“问题。 + +但是如果您使用的是æµè¡Œçš„Linuxå‘行版,那么您就很幸è¿äº†ï¼šå¯¹äºŽå¤§éƒ¨åˆ†çš„å‘行版, +您å¯ä»¥åœ¨ç½‘ä¸Šæ‰¾åˆ°åŒ…å«æœ€æ–°ä¸»çº¿æˆ–稳定版本Linuxå†…æ ¸åŒ…çš„å˜å‚¨åº“ã€‚ä½¿ç”¨è¿™äº›æ˜¯å®Œå…¨å¯ +以的,åªè¦ä»Žå˜å‚¨åº“çš„æè¿°ä¸ç¡®è®¤å®ƒä»¬æ˜¯æ™®é€šçš„æˆ–者至少接近普通。æ¤å¤–,请确ä¿è½¯ä»¶ +包包å«kernel.org上æä¾›çš„æœ€æ–°ç‰ˆæœ¬å†…æ ¸ã€‚å¦‚æžœè¿™äº›è½¯ä»¶åŒ…çš„æ—¶é—´è¶…è¿‡ä¸€å‘¨ï¼Œé‚£ä¹ˆå®ƒä»¬ +å¯èƒ½å°±ä¸åˆé€‚äº†ï¼Œå› ä¸ºæ–°çš„ä¸»çº¿å’Œç¨³å®šç‰ˆå†…æ ¸é€šå¸¸è‡³å°‘æ¯å‘¨å‘布一次。 + +请注æ„,您以åŽå¯èƒ½éœ€è¦æ‰‹åŠ¨æž„å»ºè‡ªå·±çš„å†…æ ¸ï¼šæœ‰æ—¶è¿™æ˜¯è°ƒè¯•æˆ–æµ‹è¯•ä¿®å¤ç¨‹åºæ‰€å¿…需的, +å¦‚åŽæ–‡æ‰€è¿°ã€‚è¿˜è¦æ³¨æ„ï¼Œé¢„ç¼–è¯‘çš„å†…æ ¸å¯èƒ½ç¼ºå°‘在出现panicã€Oopsã€warning或BUGæ—¶ +è§£ç å†…æ ¸æ‰“å°çš„æ¶ˆæ¯æ‰€éœ€çš„调试符å·ï¼›å¦‚果您计划解ç 这些消æ¯ï¼Œæœ€å¥½è‡ªå·±ç¼–è¯‘å†…æ ¸ +(有关详细信æ¯ï¼Œè¯·å‚阅本å°èŠ‚ç»“å°¾å’Œâ€œè§£ç 失败信æ¯â€å°èŠ‚ï¼‰ã€‚ + +**使用git** :熟悉 git 的开å‘者和有ç»éªŒçš„ Linux 用户通常最好直接从 +`kernel.org 上的官方开å‘仓库 +<https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/>`_ +ä¸èŽ·å–æœ€æ–°çš„ Linux å†…æ ¸æºä»£ç 。这些很å¯èƒ½æ¯”最新的主线预å‘å¸ƒç‰ˆæœ¬æ›´æ–°ä¸€äº›ã€‚ä¸ +用担心:它们和æ£å¼çš„预å‘å¸ƒç‰ˆæœ¬ä¸€æ ·å¯é ,除éžå†…æ ¸çš„å¼€å‘å‘¨æœŸç›®å‰æ£å¤„于åˆå¹¶çª— +å£ä¸ã€‚ä¸è¿‡å³ä¾¿å¦‚æ¤ï¼Œå®ƒä»¬ä¹Ÿæ˜¯ç›¸å½“å¯é 的。 + +**常规方法** :ä¸ç†Ÿæ‚‰ git 的人通常最好从 `kernel.org <https://kernel.org/>`_ +下载æºç çš„tar å˜æ¡£åŒ…。 + +å¦‚ä½•å®žé™…æž„å»ºä¸€ä¸ªå†…æ ¸å¹¶ä¸åœ¨è¿™é‡Œæè¿°ï¼Œå› 为许多网站已ç»è§£é‡Šäº†å¿…è¦çš„æ¥éª¤ã€‚å¦‚æžœ +ä½ æ˜¯æ–°æ‰‹ï¼Œå¯ä»¥è€ƒè™‘按照那些建议使用 ``make localmodconfig`` æ¥åšï¼Œå®ƒå°†å°è¯•获 +å–ä½ å½“å‰å†…æ ¸çš„é…ç½®ï¼Œç„¶åŽæ ¹æ®ä½ çš„ç³»ç»Ÿè¿›è¡Œä¸€äº›è°ƒæ•´ã€‚è¿™æ ·åšå¹¶ä¸èƒ½ä½¿ç¼–译出æ¥çš„ +å†…æ ¸æ›´å¥½ï¼Œä½†å¯ä»¥æ›´å¿«åœ°ç¼–译。 + +注æ„:如果您æ£åœ¨å¤„ç†æ¥è‡ªå†…æ ¸çš„panncã€Oopsã€warning或BUG,请在é…ç½®å†…æ ¸æ—¶å°è¯• +å¯ç”¨ CONFIG_KALLSYMS 选项。æ¤å¤–,还å¯ä»¥å¯ç”¨ CONFIG_DEBUG_KERNEL å’Œ +CONFIG_DEBUG_INFOï¼›åŽè€…æ˜¯ç›¸å…³é€‰é¡¹ï¼Œä½†åªæœ‰å¯ç”¨å‰è€…æ‰èƒ½å¼€å¯ã€‚请注æ„, +CONFIG_DEBUG_INFO ä¼šéœ€è¦æ›´å¤šå‚¨å˜ç©ºé—´æ¥æž„å»ºå†…æ ¸ã€‚ä½†è¿™æ˜¯å€¼å¾—çš„ï¼Œå› ä¸ºè¿™äº›é€‰é¡¹å°† +å…许您ç¨åŽç²¾ç¡®å®šä½è§¦å‘问题的确切代ç 行。下é¢çš„“解ç 失败信æ¯â€ä¸€èЂ坹æ¤è¿›è¡Œäº†æ›´ +详细的解释。 + +但请记ä½ï¼šå§‹ç»ˆè®°å½•é‡åˆ°çš„问题,以防难以é‡çŽ°ã€‚å‘逿œªè§£ç çš„æŠ¥å‘Šæ€»æ¯”ä¸æŠ¥å‘Šè¦å¥½ã€‚ + + +æ£€æŸ¥â€œæ±¡æŸ“â€æ ‡å¿— +---------------- + + *ç¡®ä¿æ‚¨åˆšåˆšå®‰è£…çš„å†…æ ¸åœ¨è¿è¡Œæ—¶ä¸ä¼šâ€œæ±¡æŸ“â€è‡ªå·±ã€‚* + +æ£å¦‚上é¢å·²ç»è¯¦ç»†ä»‹ç»è¿‡çš„:当å‘生一些å¯èƒ½ä¼šå¯¼è‡´ä¸€äº›çœ‹èµ·æ¥å®Œå…¨ä¸ç›¸å…³çš„åŽç»é”™ +è¯¯çš„äº‹æƒ…æ—¶ï¼Œå†…æ ¸ä¼šè®¾ç½®ä¸€ä¸ªâ€œæ±¡æŸ“â€æ ‡å¿—ã€‚è¿™å°±æ˜¯ä¸ºä»€ä¹ˆä½ éœ€è¦æ£€æŸ¥ä½ 刚刚安装的内 +æ ¸æ˜¯å¦æœ‰è®¾ç½®æ¤æ ‡å¿—。如果有的è¯ï¼Œå‡ ä¹Žåœ¨ä»»ä½•æƒ…å†µä¸‹ä½ éƒ½éœ€è¦åœ¨æŠ¥å‘Šé—®é¢˜ä¹‹å‰å…ˆæ¶ˆ +除它。详细的æ“作方法请看上é¢çš„ç« èŠ‚ã€‚ + + +ç”¨æ–°å†…æ ¸é‡çŽ°é—®é¢˜ +------------------ + + *åœ¨æ‚¨åˆšåˆšå®‰è£…çš„å†…æ ¸ä¸å¤çŽ°è¿™ä¸ªé—®é¢˜ã€‚å¦‚æžœå®ƒæ²¡æœ‰å‡ºçŽ°ï¼Œè¯·æŸ¥çœ‹ä¸‹æ–¹åªå‘生在 + 稳定版和长期支æŒå†…æ ¸çš„é—®é¢˜çš„è¯´æ˜Žã€‚* + +检查这个问题是å¦å‘ç”Ÿåœ¨ä½ åˆšåˆšå®‰è£…çš„æ–° Linux å†…æ ¸ç‰ˆæœ¬ä¸Šã€‚å¦‚æžœæ–°å†…æ ¸å·²ç»ä¿®å¤äº†ï¼Œ +å¯ä»¥è€ƒè™‘使用æ¤ç‰ˆæœ¬çº¿ï¼Œæ”¾å¼ƒæŠ¥å‘Šé—®é¢˜ã€‚但是请记ä½ï¼Œåªè¦å®ƒæ²¡æœ‰åœ¨ `kernel.org +<https://kernel.org/>`_ 的稳定版和长期版(以åŠç”±è¿™äº›ç‰ˆæœ¬è¡ç”Ÿå‡ºæ¥çš„åŽ‚å•†å†…æ ¸ï¼‰ +ä¸å¾—到修å¤ï¼Œå…¶ä»–用户å¯èƒ½ä»ç„¶ä¼šå—åˆ°å®ƒçš„å›°æ‰°ã€‚å¦‚æžœä½ å–œæ¬¢ä½¿ç”¨å…¶ä¸çš„一个,或 +è€…åªæ˜¯æƒ³å¸®åŠ©å®ƒä»¬çš„ç”¨æˆ·ï¼Œè¯·å‰å¾€ä¸‹é¢çš„“报告åªå‘ç”Ÿåœ¨è¾ƒæ—§å†…æ ¸ç‰ˆæœ¬çº¿çš„é—®é¢˜â€ä¸€èŠ‚ã€‚ + + +优化å¤çŽ°é—®é¢˜çš„æè¿° +-------------------- + + *ä¼˜åŒ–ä½ çš„ç¬”è®°ï¼šè¯•ç€æ‰¾åˆ°å¹¶å†™å‡ºæœ€ç›´æŽ¥çš„å¤çŽ°é—®é¢˜çš„æ–¹æ³•ã€‚ç¡®ä¿æœ€ç»ˆç»“æžœåŒ…å«æ‰€ + 有é‡è¦çš„ç»†èŠ‚ï¼ŒåŒæ—¶è®©ç¬¬ä¸€æ¬¡å¬è¯´çš„人容易阅读和ç†è§£ã€‚如果您在æ¤è¿‡ç¨‹ä¸å¦åˆ° + äº†ä¸€äº›ä¸œè¥¿ï¼Œè¯·è€ƒè™‘å†æ¬¡æœç´¢å…³äºŽè¯¥é—®é¢˜çš„现有报告。* + +è¿‡äºŽå¤æ‚的报告会让别人很难ç†è§£ã€‚å› æ¤è¯·å°½é‡æ‰¾åˆ°ä¸€ä¸ªå¯ä»¥ç›´æŽ¥æè¿°ã€æ˜“äºŽä»¥ä¹¦é¢ +å½¢å¼ç†è§£çš„å†çŽ°æ–¹æ³•ã€‚åŒ…å«æ‰€æœ‰é‡è¦çš„ç»†èŠ‚ï¼Œä½†åŒæ—¶ä¹Ÿè¦å°½é‡ä¿æŒç®€çŸã€‚ + +在这在å‰é¢çš„æ¥éª¤ä¸ï¼Œä½ 很å¯èƒ½å·²ç»äº†è§£äº†ä¸€äº›å…³äºŽä½ 所é¢ä¸´çš„问题的点。利用这些 +çŸ¥è¯†ï¼Œå†æ¬¡æœç´¢å¯ä»¥è½¬è€ŒåŠ å…¥çš„çŽ°æœ‰æŠ¥å‘Šã€‚ + + +è§£ç å¤±è´¥ä¿¡æ¯ +------------- + + *如果失败涉åŠâ€œpanicâ€ã€â€œOopsâ€ã€â€œwarningâ€æˆ–“BUGâ€ï¼Œè¯·è€ƒè™‘è§£ç å†…æ ¸æ—¥å¿—ä»¥æŸ¥æ‰¾ + 触å‘错误的代ç 行。* + +å½“å†…æ ¸æ£€æµ‹åˆ°å†…éƒ¨é—®é¢˜æ—¶ï¼Œå®ƒä¼šè®°å½•ä¸€äº›æœ‰å…³å·²æ‰§è¡Œä»£ç 的信æ¯ã€‚这使得在æºä»£ç ä¸ç²¾ +确定ä½è§¦å‘问题的行并显示如何调用它æˆä¸ºå¯èƒ½ã€‚ä½†åªæœ‰åœ¨é…ç½®å†…æ ¸æ—¶å¯ç”¨äº† +CONFIG_DEBUG_INFO å’Œ CONFIG_KALLSYMSé€‰é¡¹æ—¶ï¼Œè¿™ç§æ–¹æ³•æ‰èµ·æ•ˆã€‚如果已å¯ç”¨æ¤é€‰é¡¹ï¼Œ +请考虑解ç å†…æ ¸æ—¥å¿—ä¸çš„ä¿¡æ¯ã€‚这将使我们更容易ç†è§£æ˜¯ä»€ä¹ˆå¯¼è‡´äº†â€œpanicâ€ã€â€œOopsâ€ã€ +“warningâ€æˆ–“BUGâ€ï¼Œä»Žè€Œå¢žåŠ äº†æœ‰äººæä¾›ä¿®å¤çš„å‡ çŽ‡ã€‚ + +è§£ç å¯ä»¥é€šè¿‡Linuxæºä»£ç æ ‘ä¸çš„脚本æ¥å®Œæˆã€‚如果您è¿è¡Œçš„å†…æ ¸æ˜¯ä¹‹å‰è‡ªå·±ç¼–译的, +è¿™æ ·è¿™æ ·è°ƒç”¨å®ƒ:: + + [user@something ~]$ sudo dmesg | ./linux-5.10.5/scripts/decode_stacktrace.sh ./linux-5.10.5/vmlinux + /usr/lib/debug/lib/modules/5.10.10-4.1.x86_64/vmlinux /usr/src/kernels/5.10.10-4.1.x86_64/ + +如果您è¿è¡Œçš„æ˜¯æ‰“åŒ…å¥½çš„æ™®é€šå†…æ ¸ï¼Œåˆ™å¯èƒ½éœ€è¦å®‰è£…带有调试符å·çš„ç›¸åº”åŒ…ã€‚ç„¶åŽæŒ‰ä»¥ä¸‹ +æ–¹å¼è°ƒç”¨è„šæœ¬ï¼ˆå¦‚æžœå‘行版未打包,则å¯èƒ½éœ€è¦ä»ŽLinuxæºä»£ç 获å–):: + + [user@something ~]$ sudo dmesg | ./linux-5.10.5/scripts/decode_stacktrace.sh \ + /usr/lib/debug/lib/modules/5.10.10-4.1.x86_64/vmlinux /usr/src/kernels/5.10.10-4.1.x86_64/ + +脚本将解ç å¦‚ä¸‹çš„æ—¥å¿—è¡Œï¼Œè¿™äº›æ—¥å¿—è¡Œæ˜¾ç¤ºå†…æ ¸åœ¨å‘生错误时æ£åœ¨æ‰§è¡Œçš„代ç 的地å€:: + + [ 68.387301] RIP: 0010:test_module_init+0x5/0xffa [test_module] + +è§£ç 之åŽï¼Œè¿™äº›è¡Œå°†å˜æˆè¿™æ ·:: + + [ 68.387301] RIP: 0010:test_module_init (/home/username/linux-5.10.5/test-module/test-module.c:16) test_module + +在本例ä¸ï¼Œæ‰§è¡Œçš„ä»£ç æ˜¯ä»Žæ–‡ä»¶â€œ~/linux-5.10.5/test-module/test-module.câ€æž„建的, +错误出现在第16行的指令ä¸ã€‚ + +该脚本也会如æ¤è§£ç 以“Call traceâ€å¼€å¤´çš„éƒ¨åˆ†ä¸æåˆ°çš„åœ°å€ï¼Œè¯¥éƒ¨åˆ†æ˜¾ç¤ºå‡ºçŽ°é—®é¢˜çš„ +函数的路径。æ¤å¤–ï¼Œè„šæœ¬è¿˜ä¼šæ˜¾ç¤ºå†…æ ¸æ£åœ¨æ‰§è¡Œçš„代ç 部分的汇编输出。 + +注æ„ï¼Œå¦‚æžœä½ æ²¡æ³•åšåˆ°è¿™ä¸€ç‚¹ï¼Œåªéœ€è·³è¿‡è¿™ä¸€æ¥ï¼Œå¹¶åœ¨æŠ¥å‘Šä¸è¯´æ˜ŽåŽŸå› ã€‚å¦‚æžœä½ å¹¸è¿çš„ +è¯ï¼Œå¯èƒ½æ— 需解ç 。如果需è¦çš„è¯ï¼Œä¹Ÿè®¸æœ‰äººä¼šå¸®ä½ åšè¿™ä»¶äº‹æƒ…ã€‚è¿˜è¦æ³¨æ„ï¼Œè¿™åªæ˜¯è§£ +ç å†…æ ¸å †æ ˆè·Ÿè¸ªçš„å‡ ç§æ–¹æ³•之一。有时需è¦é‡‡å–ä¸åŒçš„æ¥éª¤æ¥æ£€ç´¢ç›¸å…³çš„详细信æ¯ã€‚ +别担心,如果您碰到的情况需è¦è¿™æ ·åšï¼Œå¼€å‘人员会告诉您该怎么åšã€‚ + + +对回归的特别关照 +----------------- + + *如果您的问题是回归问题,请尽å¯èƒ½ç¼©å°å¼•入问题时的范围。* + +Linux 首å¸å¼€å‘者 Linus Torvalds 认为 Linux å†…æ ¸æ°¸è¿œä¸åº”æ¶åŒ–,这就是为什么他 +认为回归是ä¸å¯æŽ¥å—的,并希望看到它们被迅速修å¤ã€‚这就是为什么引入了回归的改 +åŠ¨å¯¼è‡´çš„é—®é¢˜è‹¥æ— æ³•é€šè¿‡å…¶ä»–æ–¹å¼å¿«é€Ÿè§£å†³ï¼Œé€šå¸¸ä¼šè¢«è¿…é€Ÿæ’¤é”€ã€‚å› æ¤ï¼ŒæŠ¥å‘Šå›žå½’有 +点åƒâ€œçŽ‹ç‚¸â€ï¼Œä¼šè¿…速得到修å¤ã€‚但è¦åšåˆ°è¿™ä¸€ç‚¹ï¼Œéœ€è¦çŸ¥é“导致回归的å˜åŒ–。通常情 +况下,è¦ç”±æŠ¥å‘Šè€…æ¥è¿½æŸ¥ç½ªéç¥¸é¦–ï¼Œå› ä¸ºç»´æŠ¤è€…å¾€å¾€æ²¡æœ‰æ—¶é—´æˆ–æ‰‹å¤´è®¾ç½®ä¸ä¾¿æ¥è‡ªè¡Œ +é‡çŽ°å®ƒã€‚ + +有一个å«åšâ€œäºŒåˆ†â€çš„过程å¯ä»¥æ¥å¯»æ‰¾å˜åŒ–,这在 +“Documentation/translations/zh_CN/admin-guide/bug-bisect.rstâ€æ–‡æ¡£ä¸è¿›è¡Œäº†è¯¦ç»† +çš„æè¿°ï¼Œè¿™ä¸ªè¿‡ç¨‹é€šå¸¸éœ€è¦ä½ 构建å到二åä¸ªå†…æ ¸é•œåƒï¼Œæ¯æ¬¡éƒ½å°è¯•åœ¨æž„å»ºä¸‹ä¸€ä¸ªé•œåƒ +之å‰é‡çŽ°é—®é¢˜ã€‚æ˜¯çš„ï¼Œè¿™éœ€è¦èŠ±è´¹ä¸€äº›æ—¶é—´ï¼Œä½†ä¸ç”¨æ‹…心,它比大多数人想象的è¦å¿«å¾—多。 +多äºäº†â€œbinary search二进制æœç´¢â€ï¼Œè¿™å°†å¼•å¯¼ä½ åœ¨æºä»£ç 管ç†ç³»ç»Ÿä¸æ‰¾åˆ°å¯¼è‡´å›žå½’çš„æäº¤ã€‚ +ä¸€æ—¦ä½ æ‰¾åˆ°å®ƒï¼Œå°±åœ¨ç½‘ä¸Šæœç´¢å…¶ä¸»é¢˜ã€æäº¤ID和缩çŸçš„æäº¤ID(æäº¤IDçš„å‰12个å—符)。 +如果有的è¯ï¼Œè¿™å°†å¼•导您找到关于它的现有报告。 + +éœ€è¦æ³¨æ„的是,二分法需è¦ä¸€ç‚¹çªé—¨ï¼Œä¸æ˜¯æ¯ä¸ªäººéƒ½æ‡‚得诀çªï¼Œä¹Ÿéœ€è¦ç›¸å½“多的努力, +䏿˜¯æ¯ä¸ªäººéƒ½æ„¿æ„投入。尽管如æ¤ï¼Œè¿˜æ˜¯å¼ºçƒˆå»ºè®®è‡ªå·±è¿›è¡Œä¸€æ¬¡äºŒåˆ†ã€‚å¦‚æžœä½ çœŸçš„ +ä¸èƒ½æˆ–è€…ä¸æƒ³èµ°è¿™æ¡è·¯ï¼Œè‡³å°‘è¦æ‰¾å‡ºæ˜¯å“ªä¸ªä¸»çº¿å†…æ ¸å¼•å…¥çš„å›žå½’ã€‚æ¯”å¦‚è¯´ä»Ž 5.5.15 +切æ¢åˆ° 5.8.4 的时候出现了一些问题,那么至少å¯ä»¥å°è¯•一下相近的所有的主线版本 +(5.6ã€5.7 å’Œ 5.8ï¼‰æ¥æ£€æŸ¥å®ƒæ˜¯ä»€ä¹ˆæ—¶å€™å‡ºçŽ°çš„ã€‚é™¤éžä½ æƒ³åœ¨ä¸€ä¸ªç¨³å®šç‰ˆæˆ–é•¿æœŸæ”¯æŒ +å†…æ ¸ä¸æ‰¾åˆ°ä¸€ä¸ªå›žå½’,å¦åˆ™è¦é¿å…æµ‹è¯•é‚£äº›ç¼–å·æœ‰ä¸‰æ®µçš„版本(5.6.12ã€5.7.8ï¼‰ï¼Œå› +为那会使结果难以解释,å¯èƒ½ä¼šè®©ä½ 的测试å˜å¾—æ— ç”¨ã€‚ä¸€æ—¦ä½ æ‰¾åˆ°äº†å¼•å…¥å›žå½’çš„ä¸»è¦ +版本,就å¯ä»¥æ”¾å¿ƒåœ°ç»§ç»æŠ¥å‘Šäº†ã€‚但请记ä½ï¼šåœ¨ä¸çŸ¥é“罪é祸首的情况下,开å‘人员 +是å¦èƒ½å¤Ÿæä¾›å¸®åŠ©å–决于手头的问题。有时他们å¯èƒ½ä¼šä»ŽæŠ¥å‘Šä¸ç¡®è®¤æ˜¯ä»€ä¹ˆå‡ºçŽ°äº†é—® +题,并能修å¤å®ƒï¼›æœ‰æ—¶ä»–们å¯èƒ½æ— 法æä¾›å¸®åŠ©ï¼Œé™¤éžä½ 进行二分。 + +当处ç†å›žå½’问题时,请确ä¿ä½ 所é¢ä¸´çš„é—®é¢˜çœŸçš„æ˜¯ç”±å†…æ ¸å¼•èµ·çš„ï¼Œè€Œä¸æ˜¯ç”±å…¶ä»–东西 +引起的,如上文所述。 + +在整个过程ä¸ï¼Œè¯·è®°ä½ï¼šåªæœ‰å½“æ—§å†…æ ¸å’Œæ–°å†…æ ¸çš„é…置相似时,问题æ‰ç®—回归。最好 +的方法是:把é…置文件(``.config``ï¼‰ä»Žæ—§çš„å·¥ä½œå†…æ ¸ç›´æŽ¥å¤åˆ¶åˆ°ä½ å°è¯•çš„æ¯ä¸ªæ–°å†… +æ ¸ç‰ˆæœ¬ã€‚ä¹‹åŽè¿è¡Œ ``make oldnoconfig`` æ¥è°ƒæ•´å®ƒä»¥é€‚应新版本的需è¦ï¼Œè€Œä¸å¯ç”¨ +ä»»ä½•æ–°çš„åŠŸèƒ½ï¼Œå› ä¸ºé‚£äº›åŠŸèƒ½ä¹Ÿå¯èƒ½å¯¼è‡´å›žå½’。 + + +撰写并å‘é€æŠ¥å‘Š +--------------- + + *通过详细æè¿°é—®é¢˜æ¥å¼€å§‹ç¼–写报告。记得包括以下æ¡ç›®ï¼šæ‚¨ä¸ºå¤çŽ°è€Œå®‰è£…çš„æœ€æ–° + å†…æ ¸ç‰ˆæœ¬ã€ä½¿ç”¨çš„Linuxå‘行版以åŠå…³äºŽå¦‚何å¤çŽ°è¯¥é—®é¢˜çš„è¯´æ˜Žã€‚å¦‚æžœå¯èƒ½ï¼Œå°†å†… + æ ¸æž„å»ºé…置(.config)和 ``dmesg`` 的输出放在网上的æŸä¸ªåœ°æ–¹ï¼Œå¹¶é“¾æŽ¥åˆ°å®ƒã€‚ + åŒ…å«æˆ–ä¸Šä¼ æ‰€æœ‰å…¶ä»–å¯èƒ½ç›¸å…³çš„ä¿¡æ¯ï¼Œå¦‚Oops的输出/截图或æ¥è‡ª ``lspci`` + çš„è¾“å‡ºã€‚ä¸€æ—¦ä½ å†™å®Œäº†è¿™ä¸ªä¸»è¦éƒ¨åˆ†ï¼Œè¯·åœ¨ä¸Šæ–¹æ’入一个æ£å¸¸é•¿åº¦çš„æ®µè½å¿«é€Ÿæ¦‚ + 述问题和影å“。å†åœ¨æ¤ä¹‹ä¸Šæ·»åŠ ä¸€ä¸ªç®€å•æè¿°é—®é¢˜çš„å¥å,以得到人们的阅读。 + 现在给出一个更çŸçš„æè¿°æ€§æ ‡é¢˜æˆ–主题。然åŽå°±å¯ä»¥åƒMAINTAINERSæ–‡ä»¶å‘Šè¯‰ä½ çš„ + é‚£æ ·å‘逿ˆ–æäº¤æŠ¥å‘Šäº†ï¼Œé™¤éžä½ 在处ç†ä¸€ä¸ªâ€œé«˜ä¼˜å…ˆçº§é—®é¢˜â€ï¼šå®ƒä»¬éœ€è¦æŒ‰ç…§ä¸‹é¢ + “高优先级问题的特殊处ç†â€æ‰€è¿°ç‰¹åˆ«å…³ç…§ã€‚* + +çŽ°åœ¨ä½ å·²ç»å‡†å¤‡å¥½äº†ä¸€åˆ‡ï¼Œæ˜¯æ—¶å€™å†™ä½ 的报告了。上文å‰è¨€ä¸é“¾æŽ¥çš„三篇文档对如何 +写报告åšäº†éƒ¨åˆ†è§£é‡Šã€‚è¿™å°±æ˜¯ä¸ºä»€ä¹ˆæœ¬æ–‡å°†åªæåˆ°ä¸€äº›åŸºæœ¬çš„å†…å®¹ä»¥åŠ Linux å†…æ ¸ç‰¹ +有的东西。 + +有一点是符åˆè¿™ä¸¤ç±»çš„ï¼šä½ çš„æŠ¥å‘Šä¸æœ€å…³é”®çš„éƒ¨åˆ†æ˜¯æ ‡é¢˜/主题ã€ç¬¬ä¸€å¥è¯å’Œç¬¬ä¸€æ®µã€‚ +å¼€å‘者ç»å¸¸ä¼šæ”¶åˆ°è®¸å¤šé‚®ä»¶ã€‚å› æ¤ï¼Œä»–ä»¬å¾€å¾€åªæ˜¯èŠ±å‡ ç§’é’Ÿçš„æ—¶é—´æµè§ˆä¸€ä¸‹é‚®ä»¶ï¼Œç„¶ +åŽå†å†³å®šç»§ç»ä¸‹ä¸€å°æˆ–ä»”ç»†æŸ¥çœ‹ã€‚å› æ¤ï¼Œä½ æŠ¥å‘Šçš„å¼€å¤´è¶Šå¥½ï¼Œæœ‰äººç ”ç©¶å¹¶å¸®åŠ©ä½ çš„æœº +ä¼šå°±è¶Šå¤§ã€‚è¿™å°±æ˜¯ä¸ºä»€ä¹ˆä½ åº”è¯¥æš‚æ—¶å¿½ç•¥ä»–ä»¬ï¼Œå…ˆå†™å‡ºè¯¦ç»†çš„æŠ¥å‘Šã€‚;-) + +æ¯ä»½æŠ¥å‘Šéƒ½åº”æåŠçš„事项 +~~~~~~~~~~~~~~~~~~~~~~~~ + +详细æè¿°ä½ 的问题是如何å‘ç”Ÿåœ¨ä½ å®‰è£…çš„æ–°çº¯å‡€å†…æ ¸ä¸Šçš„ã€‚è¯•ç€åŒ…å«ä½ 之å‰å†™çš„和优 +化过的分æ¥è¯´æ˜Žï¼Œæ¦‚è¿°ä½ å’Œå…¶ä»–äººå¦‚ä½•é‡çŽ°è¿™ä¸ªé—®é¢˜ï¼›åœ¨æžå°‘æ•°æ— æ³•é‡çŽ°çš„æƒ…å†µä¸‹ï¼Œ +å°½é‡æè¿°ä½ åšäº†ä»€ä¹ˆæ¥è§¦å‘它。 + +还应包括其他人为了解该问题åŠå…¶çŽ¯å¢ƒè€Œå¯èƒ½éœ€è¦çš„æ‰€æœ‰ç›¸å…³ä¿¡æ¯ã€‚实际需è¦çš„东西 +在很大程度上å–å†³äºŽå…·ä½“é—®é¢˜ï¼Œä½†æœ‰äº›äº‹é¡¹ä½ æ€»æ˜¯åº”è¯¥åŒ…æ‹¬åœ¨å†…ï¼š + + * ``cat /proc/version`` 的输出,其ä¸åŒ…å« Linux å†…æ ¸ç‰ˆæœ¬å·å’Œæž„建时的编译器。 + + * 机器æ£åœ¨è¿è¡Œçš„ Linux å‘行版( ``hostnamectl | grep “Operating System“`` ) + + * CPU å’Œæ“作系统的架构( ``uname -mi`` ) + + * 如果您æ£åœ¨å¤„ç†å›žå½’,并进行了二分,请æåŠå¯¼è‡´å›žå½’çš„å˜æ›´çš„主题和æäº¤ID。 + +è®¸å¤šæƒ…å†µä¸‹ï¼Œè®©è¯»ä½ æŠ¥å‘Šçš„äººå¤šäº†è§£ä¸¤ä»¶äº‹ä¹Ÿæ˜¯æ˜Žæ™ºä¹‹ä¸¾ï¼š + + * 用于构建 Linux å†…æ ¸çš„é…置(“.configâ€æ–‡ä»¶ï¼‰ + + * å†…æ ¸çš„ä¿¡æ¯ï¼Œä½ 从 ``dmesg`` 得到的信æ¯å†™åˆ°ä¸€ä¸ªæ–‡ä»¶é‡Œã€‚ç¡®ä¿å®ƒä»¥åƒâ€œLinux + version 5.8-1 (foobar@example.com) (gcc (GCC) 10.2.1, GNU ld version + 2.34) #1 SMP Mon Aug 3 14:54:37 UTC 2020â€è¿™æ ·çš„行开始,如果没有,那么第 + 一次å¯åŠ¨é˜¶æ®µçš„é‡è¦ä¿¡æ¯å·²ç»è¢«ä¸¢å¼ƒäº†ã€‚åœ¨è¿™ç§æƒ…况下,å¯ä»¥è€ƒè™‘使用 + ``journalctl -b 0 -k`` ï¼›æˆ–è€…ä½ ä¹Ÿå¯ä»¥é‡å¯ï¼Œé‡çŽ°è¿™ä¸ªé—®é¢˜ï¼Œç„¶åŽè°ƒç”¨ + ``dmesg`` 。 + +è¿™ä¸¤ä¸ªæ–‡ä»¶å¾ˆå¤§ï¼Œæ‰€ä»¥ç›´æŽ¥æŠŠå®ƒä»¬æ”¾åˆ°ä½ çš„æŠ¥å‘Šä¸æ˜¯ä¸ªå主æ„ã€‚å¦‚æžœä½ æ˜¯åœ¨ç¼ºé™·è·Ÿè¸ª +å™¨ä¸æäº¤é—®é¢˜ï¼Œé‚£ä¹ˆå°†å®ƒä»¬é™„åŠ åˆ°å·¥å•ä¸ã€‚å¦‚æžœä½ é€šè¿‡é‚®ä»¶æŠ¥å‘Šé—®é¢˜ï¼Œä¸è¦ç”¨é™„件附 +ä¸Šå®ƒä»¬ï¼Œå› ä¸ºé‚£ä¼šä½¿é‚®ä»¶å˜å¾—太大,å¯ä»¥æŒ‰ä¸‹åˆ—之一åšï¼š + + * å°†æ–‡ä»¶ä¸Šä¼ åˆ°æŸä¸ªå…¬å¼€çš„åœ°æ–¹ï¼ˆä½ çš„ç½‘ç«™ï¼Œå…¬å…±æ–‡ä»¶ç²˜è´´æœåŠ¡ï¼Œåœ¨ + `bugzilla.kernel.org <https://bugzilla.kernel.org/>`_ 上创建的工å•……), + å¹¶åœ¨ä½ çš„æŠ¥å‘Šä¸æ”¾ä¸Šé“¾æŽ¥ã€‚ç†æƒ³æƒ…况下请使用å…许这些文件ä¿å˜å¾ˆå¤šå¹´çš„åœ°æ–¹ï¼Œå› + 为它们å¯èƒ½åœ¨å¾ˆå¤šå¹´åŽå¯¹åˆ«äººæœ‰ç”¨ï¼›ä¾‹å¦‚ 5 年或 10 å¹´åŽï¼Œä¸€ä¸ªå¼€å‘者æ£åœ¨ä¿®æ”¹ + 一些代ç ï¼Œè€Œè¿™äº›ä»£ç æ£æ˜¯ä¸ºäº†ä¿®å¤ä½ 的问题。 + + * 把文件放在一边,然åŽè¯´æ˜Žä½ ä¼šåœ¨ä»–äººå›žå¤æ—¶å†å•独å‘é€ã€‚åªè¦è®°å¾—报告å‘出去åŽï¼Œ + 真æ£åšåˆ°è¿™ä¸€ç‚¹å°±å¯ä»¥äº†ã€‚;-) + +æä¾›è¿™äº›ä¸œè¥¿å¯èƒ½æ˜¯æ˜Žæ™ºçš„ +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +æ ¹æ®é—®é¢˜çš„ä¸åŒï¼Œä½ å¯èƒ½éœ€è¦æä¾›æ›´å¤šçš„背景数æ®ã€‚这里有一些关于æä¾›ä»€ä¹ˆæ¯”较好 +的建议: + + * å¦‚æžœä½ å¤„ç†çš„æ˜¯å†…æ ¸çš„â€œwarningâ€ã€â€œOOPSâ€æˆ–“panicâ€ï¼Œè¯·åŒ…å«å®ƒã€‚å¦‚æžœä½ ä¸èƒ½å¤åˆ¶ + 粘贴它,试ç€ç”¨netconsole网络终端远程跟踪或者至少æ‹ä¸€å¼ å±å¹•的照片。 + + * 如果问题å¯èƒ½ä¸Žä½ çš„ç”µè„‘ç¡¬ä»¶æœ‰å…³ï¼Œè¯·è¯´æ˜Žä½ ä½¿ç”¨çš„æ˜¯ä»€ä¹ˆç³»ç»Ÿã€‚ä¾‹å¦‚ï¼Œå¦‚æžœä½ çš„ + æ˜¾å¡æœ‰é—®é¢˜ï¼Œè¯·æåŠå®ƒçš„åˆ¶é€ å•†ï¼Œæ˜¾å¡çš„åž‹å·ï¼Œä»¥åŠä½¿ç”¨çš„芯片。如果是笔记本电 + 脑,请æåŠå®ƒçš„åž‹å·å称,但尽é‡ç¡®ä¿æ„义明确。例如“戴尔 XPS 13â€å°±ä¸å¾ˆæ˜Žç¡®ï¼Œ + å› ä¸ºå®ƒå¯èƒ½æ˜¯ 2012 年的那款,那款除了看起æ¥å’ŒçŽ°åœ¨é”€å”®çš„æ²¡æœ‰ä»€ä¹ˆä¸åŒä¹‹å¤–, + 两者没有任何共åŒä¹‹å¤„ã€‚å› æ¤ï¼Œåœ¨è¿™ç§æƒ…况下,è¦åŠ ä¸Šå‡†ç¡®çš„åž‹å·ï¼Œä¾‹å¦‚ 2019 + 年内推出的 XPS 13 åž‹å·ä¸ºâ€œ9380â€æˆ–“7390â€ã€‚åƒâ€œè”想 Thinkpad T590â€è¿™æ ·çš„åå— + 也有些å«ç³Šä¸æ¸…:这款笔记本有带独立显å¡å’Œä¸å¸¦çš„ååž‹å·ï¼Œæ‰€ä»¥è¦å°½é‡æ‰¾åˆ°å‡†ç¡® + 的型å·å称或注明主è¦éƒ¨ä»¶ã€‚ + + * 说明æ£åœ¨ä½¿ç”¨çš„ç›¸å…³è½¯ä»¶ã€‚å¦‚æžœä½ åœ¨åŠ è½½æ¨¡å—æ—¶é‡åˆ°äº†é—®é¢˜ï¼Œä½ è¦è¯´æ˜Žæ£åœ¨ä½¿ç”¨çš„ + kmodã€systemd å’Œ udev 的版本。如果其ä¸ä¸€ä¸ª DRM é©±åŠ¨å‡ºçŽ°é—®é¢˜ï¼Œä½ è¦è¯´æ˜Ž + libdrm å’Œ Mesa 的版本;还è¦è¯´æ˜Žä½ çš„ Wayland åˆæˆå™¨æˆ– X-Server åŠå…¶é©±åŠ¨ã€‚ + å¦‚æžœä½ æœ‰æ–‡ä»¶ç³»ç»Ÿé—®é¢˜ï¼Œè¯·æ³¨æ˜Žç›¸åº”çš„æ–‡ä»¶ç³»ç»Ÿå®žç”¨ç¨‹åºçš„版本(e2fsprogs, + btrfs-progs, xfsprogs……)。 + + * ä»Žå†…æ ¸ä¸æ”¶é›†å¯èƒ½æœ‰ç”¨çš„é¢å¤–ä¿¡æ¯ã€‚例如, ``lspci -nn`` 的输出å¯ä»¥å¸®åŠ©åˆ«äºº + è¯†åˆ«ä½ ä½¿ç”¨çš„ç¡¬ä»¶ã€‚å¦‚æžœä½ çš„ç¡¬ä»¶æœ‰é—®é¢˜ï¼Œä½ ç”šè‡³å¯ä»¥ç»™å‡º ``sudo lspci -vvv`` + çš„ç»“æžœï¼Œå› ä¸ºå®ƒæä¾›äº†ç»„件是如何é…置的信æ¯ã€‚对于一些问题,å¯èƒ½æœ€å¥½åŒ…å« + ``/proc/cpuinfo`` , ``/proc/ioports`` , ``/proc/iomem`` , + ``/proc/modules`` 或 ``/proc/scsi/scsi`` ç‰æ–‡ä»¶çš„内容。一些å系统还æ + 供了收集相关信æ¯çš„工具。 ``alsa-info.sh`` `å°±æ˜¯è¿™æ ·ä¸€ä¸ªå·¥å…·ï¼Œå®ƒæ˜¯éŸ³é¢‘/声 + 音å系统开å‘者æä¾›çš„ <https://www.alsa-project.org/wiki/AlsaInfo>`_ 。 + +这些例ååº”è¯¥ä¼šç»™ä½ ä¸€äº›çŸ¥è¯†ç‚¹ï¼Œè®©ä½ çŸ¥é“附上什么数æ®å¯èƒ½æ˜¯æ˜Žæ™ºçš„ï¼Œä½†ä½ è‡ªå·±ä¹Ÿ +è¦æƒ³ä¸€æƒ³ï¼Œå“ªäº›æ•°æ®å¯¹åˆ«äººä¼šæœ‰å¸®åŠ©ã€‚ä¸è¦å¤ªæ‹…å¿ƒå¿˜è®°ä¸€äº›ä¸œè¥¿ï¼Œå› ä¸ºå¼€å‘äººå‘˜ä¼šè¦ +求æä¾›ä»–们需è¦çš„é¢å¤–细节。但从一开始就把所有é‡è¦çš„东西都æä¾›å‡ºæ¥ï¼Œä¼šå¢žåŠ åˆ« +人仔细查看的机会。 + + +é‡è¦éƒ¨åˆ†ï¼šæŠ¥å‘Šçš„开头 +~~~~~~~~~~~~~~~~~~~~~~ + +çŽ°åœ¨ä½ å·²ç»å‡†å¤‡å¥½äº†æŠ¥å‘Šçš„详细部分,让我们进入最é‡è¦çš„éƒ¨åˆ†ï¼šå¼€å¤´å‡ å¥ã€‚现在到 +报告的最å‰é¢ï¼Œåœ¨ä½ 刚æ‰å†™çš„部分之å‰åŠ ä¸Šç±»ä¼¼â€œThe detailed description:â€ï¼ˆè¯¦ç»† +æè¿°ï¼‰è¿™æ ·çš„内容,并在最å‰é¢æ’入两个新行。现在写一个æ£å¸¸é•¿åº¦çš„æ®µè½ï¼Œå¤§è‡´æ¦‚ +述这个问题。去掉所有枯燥的细节,把é‡ç‚¹æ”¾åœ¨è¯»è€…需è¦çŸ¥é“的关键部分,以让人了 +è§£è¿™æ˜¯æ€Žä¹ˆå›žäº‹ï¼›å¦‚æžœä½ è®¤ä¸ºè¿™ä¸ªç¼ºé™·å½±å“了很多用户,就æä¸€ä¸‹è¿™ç‚¹æ¥å¸å¼•大家关 +注。 + +åšå¥½è¿™ä¸€ç‚¹åŽï¼Œåœ¨é¡¶éƒ¨å†æ’入两行,写一å¥è¯çš„æ‘˜è¦ï¼Œå¿«é€Ÿè§£é‡ŠæŠ¥å‘Šçš„内容。之åŽä½ +è¦æ›´åŠ æŠ½è±¡ï¼Œä¸ºæŠ¥å‘Šå†™ä¸€ä¸ªæ›´çŸçš„主题/æ ‡é¢˜ã€‚ + +çŽ°åœ¨ä½ å·²ç»å†™å¥½äº†è¿™éƒ¨åˆ†ï¼Œè¯·èŠ±ç‚¹æ—¶é—´æ¥ä¼˜åŒ–å®ƒï¼Œå› ä¸ºå®ƒæ˜¯ä½ çš„æŠ¥å‘Šä¸æœ€é‡è¦çš„部分: +å¾ˆå¤šäººä¼šå…ˆè¯»è¿™éƒ¨åˆ†ï¼Œç„¶åŽæ‰ä¼šå†³å®šæ˜¯å¦å€¼å¾—花时间阅读其他部分。 + +çŽ°åœ¨å°±åƒ :ref:`MAINTAINERS <maintainers>` ç»´æŠ¤è€…æ–‡ä»¶å‘Šè¯‰ä½ çš„é‚£æ ·å‘逿ˆ–æäº¤ +报告,除éžå®ƒæ˜¯å‰é¢æ¦‚述的那些“高优先级问题â€ä¹‹ä¸€ï¼šåœ¨è¿™ç§æƒ…况下,请先阅读下一 +å°èŠ‚ï¼Œç„¶åŽå†å‘é€æŠ¥å‘Šã€‚ + +é«˜ä¼˜å…ˆçº§é—®é¢˜çš„ç‰¹æ®Šå¤„ç† +~~~~~~~~~~~~~~~~~~~~~~~~ + +高优先级问题的报告需è¦ç‰¹æ®Šå¤„ç†ã€‚ + +**éžå¸¸ä¸¥é‡çš„缺陷** :确ä¿åœ¨ä¸»é¢˜æˆ–工啿 ‡é¢˜ä»¥åŠç¬¬ä¸€æ®µä¸æ˜Žæ˜¾æ ‡å‡º severeness +(éžå¸¸ä¸¥é‡çš„)。 + +**回归** ï¼šå¦‚æžœé—®é¢˜æ˜¯ä¸€ä¸ªå›žå½’ï¼Œè¯·åœ¨é‚®ä»¶çš„ä¸»é¢˜æˆ–ç¼ºé™·è·Ÿè¸ªå™¨çš„æ ‡é¢˜ä¸æ·»åŠ +[REGRESSION]。如果您没有进行二分,请至少注明您测试的最新主线版本(比如 5.7) +和出现问题的最新版本(比如 5.8)。如果您æˆåŠŸåœ°è¿›è¡Œäº†äºŒåˆ†ï¼Œè¯·æ³¨æ˜Žå¯¼è‡´å›žå½’ +çš„æäº¤IDå’Œä¸»é¢˜ã€‚ä¹Ÿè¯·æ·»åŠ è¯¥å˜æ›´çš„ä½œè€…åˆ°ä½ çš„æŠ¥å‘Šä¸ï¼›å¦‚果您需è¦å°†æ‚¨çš„缺陷æäº¤ +到缺陷跟踪器ä¸ï¼Œè¯·å°†æŠ¥å‘Šä»¥ç§äººé‚®ä»¶çš„å½¢å¼è½¬å‘给他,并注明报告æäº¤åœ°ç‚¹ã€‚ + +**安全问题** :对于这ç§é—®é¢˜ï¼Œä½ 将必须评估:如果细节被公开披露,是å¦ä¼šå¯¹å…¶ä»– +ç”¨æˆ·äº§ç”ŸçŸæœŸé£Žé™©ã€‚如果ä¸ä¼šï¼Œåªéœ€æŒ‰ç…§æ‰€è¿°ç»§ç»æŠ¥å‘Šé—®é¢˜ã€‚如果有æ¤é£Žé™©ï¼Œä½ éœ€è¦ +ç¨å¾®è°ƒæ•´ä¸€ä¸‹æŠ¥å‘Šæµç¨‹ã€‚ + + * 如果 MAINTAINERS 文件指示您通过邮件报告问题,请ä¸è¦æŠ„é€ä»»ä½•公共邮件列表。 + + * å¦‚æžœä½ åº”è¯¥åœ¨ç¼ºé™·è·Ÿè¸ªå™¨ä¸æäº¤é—®é¢˜ï¼Œè¯·ç¡®ä¿å°†å·¥å•æ ‡è®°ä¸ºâ€œç§æœ‰â€æˆ–“安全问题â€ã€‚ + 如果缺陷跟踪器没有æä¾›ä¿æŒæŠ¥å‘Šç§å¯†æ€§çš„æ–¹æ³•ï¼Œé‚£å°±åˆ«æƒ³äº†ï¼ŒæŠŠä½ çš„æŠ¥å‘Šä»¥ç§äºº + 邮件的形å¼å‘é€ç»™ç»´æŠ¤è€…å§ã€‚ + +åœ¨è¿™ä¸¤ç§æƒ…况下,都一定è¦å°†æŠ¥å‘Šå‘到 MAINTAINERS 文件ä¸â€œå®‰å…¨è”络â€éƒ¨åˆ†åˆ—出的 +地å€ã€‚ç†æƒ³çš„æƒ…况是在å‘é€æŠ¥å‘Šçš„æ—¶å€™ç›´æŽ¥æŠ„é€ä»–ä»¬ã€‚å¦‚æžœæ‚¨åœ¨ç¼ºé™·è·Ÿè¸ªå™¨ä¸æäº¤äº† +报告,请将报告的文本转å‘到这些地å€ï¼›ä½†è¯·åœ¨æŠ¥å‘Šçš„é¡¶éƒ¨åŠ ä¸Šæ³¨é‡Šï¼Œè¡¨æ˜Žæ‚¨æäº¤äº† +报告,并附上工å•链接。 + +更多信æ¯è¯·å‚è§â€œDocumentation/translations/zh_CN/admin-guide/security-bugs.rstâ€ã€‚ + + +å‘布报告åŽçš„责任 +------------------ + + *ç‰å¾…别人的ååº”ï¼Œç»§ç»æŽ¨è¿›äº‹æƒ…ï¼Œç›´åˆ°ä½ èƒ½å¤ŸæŽ¥å—è¿™æ ·æˆ–é‚£æ ·çš„ç»“æžœã€‚å› æ¤ï¼Œè¯· + å…¬å¼€å’ŒåŠæ—¶åœ°å›žåº”任何询问。测试æå‡ºçš„ä¿®å¤ã€‚积æžåœ°æµ‹è¯•ï¼šè‡³å°‘é‡æ–°æµ‹è¯•æ¯ä¸ª + 新主线版本的首个候选版本(RCï¼‰ï¼Œå¹¶æŠ¥å‘Šä½ çš„ç»“æžœã€‚å¦‚æžœå‡ºçŽ°æ‹–å»¶ï¼Œå°±å‹å¥½åœ° + æé†’ä¸€ä¸‹ã€‚å¦‚æžœä½ æ²¡æœ‰å¾—åˆ°ä»»ä½•å¸®åŠ©æˆ–è€…æœªèƒ½æ»¡æ„,请试ç€è‡ªå·±å¸®åŠ©è‡ªå·±ã€‚* + +å¦‚æžœä½ çš„æŠ¥å‘Šéžå¸¸ä¼˜ç§€ï¼Œè€Œä¸”ä½ çœŸçš„å¾ˆå¹¸è¿ï¼Œé‚£ä¹ˆæŸä¸ªå¼€å‘者å¯èƒ½ä¼šç«‹å³å‘现导致问 +é¢˜çš„åŽŸå› ï¼›ç„¶åŽä»–们å¯èƒ½ä¼šå†™ä¸€ä¸ªè¡¥ä¸æ¥ä¿®å¤ã€æµ‹è¯•它,并直接å‘é€ç»™ä¸»çº¿é›†æˆï¼ŒåŒ +æ—¶æ ‡è®°å®ƒä»¥ä¾¿ä»¥åŽå›žæº¯åˆ°éœ€è¦å®ƒçš„稳定版和长期支æŒå†…æ ¸ã€‚é‚£ä¹ˆä½ éœ€è¦åšçš„å°±æ˜¯å›žå¤ +一å¥â€œThank you very muchâ€ï¼ˆéžå¸¸æ„Ÿè°¢ï¼‰ï¼Œç„¶åŽåœ¨å‘å¸ƒåŽæ¢ä¸Šä¿®å¤å¥½çš„版本。 + +但这ç§ç†æƒ³çŠ¶å†µå¾ˆå°‘å‘ç”Ÿã€‚è¿™å°±æ˜¯ä¸ºä»€ä¹ˆä½ æŠŠæŠ¥å‘Šæ‹¿å‡ºæ¥ä¹‹åŽå·¥ä½œæ‰å¼€å§‹ã€‚ä½ è¦åšçš„ +事情è¦è§†æƒ…况而定,但通常会是下é¢åˆ—å‡ºçš„äº‹æƒ…ã€‚ä½†åœ¨æ·±å…¥ç ”ç©¶ç»†èŠ‚ä¹‹å‰ï¼Œè¿™é‡Œæœ‰å‡ +ä»¶é‡è¦çš„äº‹æƒ…ï¼Œä½ éœ€è¦è®°ä½è¿™éƒ¨åˆ†çš„过程。 + + +关于进一æ¥äº’动的一般建议 +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**总是公开回å¤** ï¼šå½“ä½ åœ¨ç¼ºé™·è·Ÿè¸ªå™¨ä¸æäº¤é—®é¢˜æ—¶ï¼Œä¸€å®šè¦åœ¨é‚£é‡Œå›žå¤ï¼Œä¸è¦ç§ä¸‹ +è”系任何开å‘è€…ã€‚å¯¹äºŽé‚®ä»¶æŠ¥å‘Šï¼Œåœ¨å›žå¤æ‚¨æ”¶åˆ°çš„任何邮件时,总是使用“全部回å¤â€ +åŠŸèƒ½ã€‚è¿™åŒ…æ‹¬å¸¦æœ‰ä»»ä½•ä½ å¯èƒ½æƒ³è¦æ·»åŠ åˆ°ä½ çš„æŠ¥å‘Šä¸çš„é¢å¤–æ•°æ®çš„邮件:进入邮件应 +用程åºâ€œå·²å‘é€â€æ–‡ä»¶å¤¹ï¼Œå¹¶åœ¨é‚®ä»¶ä¸Šä½¿ç”¨â€œå…¨éƒ¨å›žå¤â€æ¥å›žå¤æŠ¥å‘Šã€‚è¿™ç§æ–¹æ³•å¯ä»¥ç¡®ä¿ +公共邮件列表和其他所有å‚ä¸Žè€…éƒ½èƒ½åŠæ—¶äº†è§£æƒ…å†µï¼›å®ƒè¿˜èƒ½ä¿æŒé‚®ä»¶çº¿ç¨‹çš„完整性, +这对于邮件列表将所有相关邮件归为一类是éžå¸¸é‡è¦çš„。 + +åªæœ‰ä¸¤ç§æƒ…况ä¸é€‚åˆåœ¨ç¼ºé™·è·Ÿè¸ªå™¨æˆ–“全部回å¤â€ä¸å‘表评论: + + * æœ‰äººè®©ä½ ç§ä¸‹å‘东西。 + + * ä½ è¢«å‘ŠçŸ¥è¦å‘é€ä¸€äº›ä¸œè¥¿ï¼Œä½†æ³¨æ„到其ä¸åŒ…å«éœ€è¦ä¿å¯†çš„æ•æ„Ÿä¿¡æ¯ã€‚åœ¨è¿™ç§æƒ…况下, + å¯ä»¥ç§ä¸‹å‘é€ç»™è¦æ±‚å‘é€çš„å¼€å‘者。但è¦åœ¨å·¥å•æˆ–é‚®ä»¶ä¸æ³¨æ˜Žä½ 是这么åšçš„,这 + æ ·å…¶ä»–äººå°±çŸ¥é“ä½ å°Šé‡äº†è¿™ä¸ªè¦æ±‚。 + +**在请求解释或帮助之å‰å…ˆç ”究一下** :在这部分过程ä¸ï¼Œæœ‰äººå¯èƒ½ä¼šå‘Šè¯‰ä½ 用尚未 +掌æ¡çš„æŠ€èƒ½åšä¸€äº›äº‹æƒ…ã€‚ä¾‹å¦‚ä½ å¯èƒ½ä¼šè¢«è¦æ±‚ä½¿ç”¨ä¸€äº›ä½ ä»Žæœªå¬è¯´è¿‡çš„æµ‹è¯•工具;或 +è€…ä½ å¯èƒ½ä¼šè¢«è¦æ±‚在 Linux å†…æ ¸æºä»£ç ä¸Šåº”ç”¨ä¸€ä¸ªè¡¥ä¸æ¥æµ‹è¯•å®ƒæ˜¯å¦æœ‰å¸®åŠ©ã€‚åœ¨æŸäº› +情况下,å‘个回å¤è¯¢é—®å¦‚何åšå°±å¯ä»¥äº†ã€‚但在走这æ¡è·¯ä¹‹å‰ï¼Œå°½é‡é€šè¿‡åœ¨äº’è”ç½‘ä¸Šæœ +ç´¢è‡ªè¡Œæ‰¾åˆ°ç”æ¡ˆï¼›æˆ–者考虑在其他地方询问建议。比如询问朋å‹ï¼Œæˆ–è€…åˆ°ä½ å¹³æ—¶å¸¸åŽ» +çš„èŠå¤©å®¤æˆ–论å›å‘帖咨询。 + +**è¦æœ‰è€å¿ƒ** ï¼šå¦‚æžœä½ çœŸçš„å¾ˆå¹¸è¿ï¼Œä½ å¯èƒ½ä¼šåœ¨å‡ ä¸ªå°æ—¶å†…æ”¶åˆ°å¯¹ä½ çš„æŠ¥å‘Šçš„ç”å¤ã€‚ +ä½†å¤§å¤šæ•°æƒ…å†µä¸‹ä¼šèŠ±è´¹æ›´å¤šçš„æ—¶é—´ï¼Œå› ä¸ºç»´æŠ¤è€…åˆ†æ•£åœ¨å…¨çƒå„åœ°ï¼Œå› æ¤å¯èƒ½åœ¨ä¸åŒçš„ +时区——在那里他们已ç»äº«å—ç€è¿œç¦»é”®ç›˜çš„夜晚。 + +一般æ¥è¯´ï¼Œå†…æ ¸å¼€å‘者需è¦ä¸€åˆ°äº”个工作日æ¥å›žå¤æŠ¥å‘Šã€‚æœ‰æ—¶ä¼šèŠ±è´¹æ›´é•¿çš„æ—¶é—´ï¼Œå› +为他们å¯èƒ½æ£å¿™äºŽåˆå¹¶çª—å£ã€å…¶ä»–工作ã€å‚åŠ å¼€å‘è€…ä¼šè®®ï¼Œæˆ–è€…åªæ˜¯åœ¨äº«å—一个漫长 +的暑å‡ã€‚ + +“高优先级的问题â€ï¼ˆè§ä¸Šé¢çš„解释)例外:维护者应该尽快解决这些问题;这就是为 +ä»€ä¹ˆä½ åº”è¯¥æœ€å¤šç‰å¾…一个星期(如果是紧急的事情,则åªéœ€ä¸¤å¤©ï¼‰ï¼Œç„¶åŽå†å‘é€å‹å¥½ +çš„æé†’。 + +有时维护者å¯èƒ½æ²¡æœ‰åŠæ—¶å›žå¤ï¼›æœ‰æ—¶å€™å¯èƒ½ä¼šå‡ºçŽ°åˆ†æ§ï¼Œä¾‹å¦‚一个问题是å¦ç¬¦åˆå›žå½’ +çš„æ¡ä»¶ã€‚åœ¨è¿™ç§æƒ…况下,在邮件列表上æå‡ºä½ 的顾虑,并请求其他人公开或ç§ä¸‹å›žå¤ +å¦‚ä½•ç»§ç»æŽ¨è¿›ã€‚å¦‚æžœå¤±è´¥äº†ï¼Œå¯èƒ½åº”该让更高级别的维护者介入。如果是 WiFi 驱动, +é‚£å°±æ˜¯æ— çº¿ç»´æŠ¤è€…ï¼›å¦‚æžœæ²¡æœ‰æ›´é«˜çº§åˆ«çš„ç»´æŠ¤è€…ï¼Œæˆ–è€…å…¶ä»–ä¸€åˆ‡åŠªåŠ›éƒ½å¤±è´¥äº†ï¼Œé‚£ +è¿™å¯èƒ½æ˜¯ä¸€ç§ç½•è§çš„ã€å¯ä»¥è®© Linus Torvalds å‚与进æ¥çš„æƒ…况。 + +**主动测试** :æ¯å½“ä¸€ä¸ªæ–°çš„ä¸»çº¿å†…æ ¸ç‰ˆæœ¬çš„ç¬¬ä¸€ä¸ªé¢„å‘布版本(rc1)å‘布的时候, +去检查一下这个问题是å¦å¾—åˆ°äº†è§£å†³ï¼Œæˆ–è€…æ˜¯å¦æœ‰ä»€ä¹ˆé‡è¦çš„å˜åŒ–。在工å•䏿ˆ–在 +å›žå¤æŠ¥å‘Šçš„é‚®ä»¶ä¸æåŠç»“æžœï¼ˆç¡®ä¿æ‰€æœ‰å‚与讨论的人都被抄é€ï¼‰ã€‚è¿™å°†è¡¨æ˜Žä½ çš„æ‰¿è¯º +å’Œä½ æ„¿æ„帮忙。如果问题æŒç»å˜åœ¨ï¼Œå®ƒä¹Ÿä¼šæé†’å¼€å‘者确ä¿ä»–们ä¸ä¼šå¿˜è®°å®ƒã€‚其他一 +些ä¸å®šæœŸçš„釿–°æµ‹è¯•(例如用rc3ã€rc5 和最终版本)也是一个好主æ„ï¼Œä½†åªæœ‰åœ¨ç›¸å…³ +的东西å‘生å˜åŒ–æˆ–è€…ä½ æ£åœ¨å†™ä»€ä¹ˆä¸œè¥¿çš„æ—¶å€™æ‰æŠ¥å‘Šä½ 的结果。 + +这些些常规的事情就ä¸è¯´äº†ï¼Œæˆ‘们æ¥è°ˆè°ˆæŠ¥å‘ŠåŽå¦‚何帮助解决问题的细节。 + +查询和测试请求 +~~~~~~~~~~~~~~~ + +å¦‚æžœä½ çš„æŠ¥å‘Šå¾—åˆ°äº†å›žå¤åˆ™éœ€å±¥è¡Œä»¥ä¸‹è´£ä»»ï¼š + +**æ£€æŸ¥ä¸Žä½ æ‰“äº¤é“的人** :大多数情况下,会是维护者或特定代ç 区域的开å‘人员对 +ä½ çš„æŠ¥å‘Šåšå‡ºå›žåº”。但由于问题通常是公开报告的,所以回å¤çš„å¯èƒ½æ˜¯ä»»ä½•人——包括 +那些想è¦å¸®å¿™çš„人,但最åŽå¯èƒ½ä¼šç”¨ä»–ä»¬çš„é—®é¢˜æˆ–è¯·æ±‚å¼•å¯¼ä½ å®Œå…¨å离轨é“。这很少 +å‘ç”Ÿï¼Œä½†è¿™æ˜¯å¿«é€Ÿä¸Šç½‘æœæœçœ‹ä½ æ£åœ¨ä¸Žè°äº’åŠ¨æ˜¯æ˜Žæ™ºä¹‹ä¸¾çš„è®¸å¤šåŽŸå› ä¹‹ä¸€ã€‚é€šè¿‡è¿™æ · +åšï¼Œä½ 也å¯ä»¥çŸ¥é“ä½ çš„æŠ¥å‘Šæ˜¯å¦è¢«æ£ç¡®çš„人å¬åˆ°ï¼Œå› 为如果讨论没有导致满æ„的问题 +解决方案而淡出,之åŽå¯èƒ½éœ€è¦æé†’维护者(è§ä¸‹æ–‡ï¼‰ã€‚ + +**查询数æ®** ï¼šé€šå¸¸ä½ ä¼šè¢«è¦æ±‚测试一些东西或æä¾›æ›´å¤šç»†èŠ‚ã€‚å°½å¿«æä¾›æ‰€è¦æ±‚的信 +æ¯ï¼Œå› ä¸ºä½ å·²ç»å¾—到了å¯èƒ½ä¼šå¸®åŠ©ä½ çš„äººçš„æ³¨æ„ï¼Œä½ ç‰å¾…的时间越长就有越å¯èƒ½å¤±åŽ» +å…³æ³¨ï¼›å¦‚æžœä½ ä¸åœ¨æ•°ä¸ªå·¥ä½œæ—¥å†…æä¾›ä¿¡æ¯ï¼Œç”šè‡³å¯èƒ½å‡ºçŽ°è¿™ç§ç»“果。 + +**测试请求** ï¼šå½“ä½ è¢«è¦æ±‚测试一个诊æ–è¡¥ä¸æˆ–å¯èƒ½çš„ä¿®å¤æ—¶ï¼Œä¹Ÿè¦å°½é‡åŠæ—¶æµ‹è¯•。 +但è¦åšå¾—æ°å½“,一定ä¸è¦æ€¥äºŽæ±‚æˆï¼šæ··æ·†äº‹æƒ…很容易å‘生,这会给所有人带æ¥è®¸å¤šå›° +惑。例如一个常è§çš„错误是以为应用了一个带修å¤çš„建议补ä¸ï¼Œä½†äº‹å®žä¸Šå¹¶æ²¡æœ‰ã€‚å³ +使是有ç»éªŒçš„æµ‹è¯•人员也会å¶å°”å‘ç”Ÿè¿™æ ·çš„äº‹æƒ…ï¼Œä½†å½“æœ‰ä¿®å¤çš„å†…æ ¸å’Œæ²¡æœ‰ä¿®å¤çš„内 +æ ¸è¡¨çŽ°å¾—ä¸€æ ·æ—¶ï¼Œä»–ä»¬å¤§å¤šæ—¶å€™ä¼šæ³¨æ„到。 + +当没有任何实质性进展时该怎么办 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +有些报告ä¸ä¼šå¾—到负有相关责任的 Linux å†…æ ¸å¼€å‘者的任何å应;或者围绕这个问题 +的讨论有所å‘å±•ï¼Œä½†æ¸æ¸æ·¡å‡ºï¼Œæ²¡æœ‰ä»»ä½•实质内容产出。 + +åœ¨è¿™ç§æƒ…况下,è¦ç‰ä¸¤ä¸ªæ˜ŸæœŸï¼ˆæœ€å¥½æ˜¯ä¸‰ä¸ªæ˜ŸæœŸï¼‰åŽå†å‘出å‹å¥½çš„æé†’ï¼šä¹Ÿè®¸å½“ä½ çš„ +报告到达时,维护者刚刚离开键盘一段时间,或者有更é‡è¦çš„事情è¦å¤„ç†ã€‚在写æé†’ +信的时候,è¦å–„æ„地问一下,是å¦è¿˜éœ€è¦ä½ 这边æä¾›ä»€ä¹ˆæ¥è®©äº‹æƒ…推进下去。如果报 +告是通过邮件å‘出æ¥çš„,那就在邮件的第一行回å¤ä½ çš„åˆå§‹é‚®ä»¶ï¼ˆè§ä¸Šæ–‡ï¼‰ï¼Œå…¶ä¸åŒ… +æ‹¬ä¸‹æ–¹çš„åŽŸå§‹æŠ¥å‘Šçš„å®Œæ•´å¼•ç”¨ï¼šè¿™æ˜¯å°‘æ•°å‡ ç§æƒ…å†µä¸‹ï¼Œè¿™æ ·çš„â€œTOFUâ€ï¼ˆText Over, +Fullquote Underæ–‡å—在上,完整引用在下)是æ£ç¡®çš„åšæ³•ï¼Œå› ä¸ºè¿™æ ·æ‰€æœ‰çš„æ”¶ä»¶äººéƒ½ +会以适当的顺åºç«‹å³è®©ç»†èŠ‚åˆ°æ‰‹å¤´ä¸Šæ¥ã€‚ + +在æé†’之åŽï¼Œå†ç‰ä¸‰å‘¨çš„回å¤ã€‚å¦‚æžœä½ ä»ç„¶æ²¡æœ‰å¾—到适当的åé¦ˆï¼Œä½ é¦–å…ˆåº”è¯¥é‡æ–°è€ƒ +è™‘ä½ çš„æ–¹æ³•ã€‚ä½ æ˜¯å¦å¯èƒ½å°è¯•æŽ¥è§¦äº†é”™è¯¯çš„äººï¼Ÿæ˜¯ä¸æ˜¯æŠ¥å‘Šä¹Ÿè®¸ä»¤äººå感或者太混乱, +ä»¥è‡³äºŽäººä»¬å†³å®šå®Œå…¨è¿œç¦»å®ƒï¼ŸæŽ’é™¤è¿™äº›å› ç´ çš„æœ€å¥½æ–¹æ³•æ˜¯ï¼šæŠŠæŠ¥å‘Šç»™ä¸€ä¸¤ä¸ªç†Ÿæ‚‰ +FLOSS 问题报告的人看,询问他们的æ„è§ã€‚åŒæ—¶å¾æ±‚ä»–ä»¬å…³äºŽå¦‚ä½•ç»§ç»æŽ¨è¿›çš„å»ºè®®ã€‚ +è¿™å¯èƒ½æ„味ç€ï¼šå‡†å¤‡ä¸€ä»½æ›´å¥½çš„æŠ¥å‘Šï¼Œè®©è¿™äº›äººåœ¨ä½ å‘出去之å‰å¯¹å®ƒè¿›è¡Œå®¡æŸ¥ã€‚è¿™æ · +的方法完全å¯ä»¥ï¼›åªéœ€è¯´æ˜Žè¿™æ˜¯å…³äºŽè¿™ä¸ªé—®é¢˜çš„第二份改进的报告,并附上第一份报 +告的链接。 + +如果报告是æ°å½“çš„ï¼Œä½ å¯ä»¥å‘é€ç¬¬äºŒå°æé†’信;在其ä¸è¯¢é—®ä¸ºä»€ä¹ˆæŠ¥å‘Šæ²¡æœ‰å¾—到任何 +回å¤ã€‚ç¬¬äºŒå°æé†’é‚®ä»¶çš„å¥½æ—¶æœºæ˜¯åœ¨æ–° Linux å†…æ ¸ç‰ˆæœ¬çš„é¦–ä¸ªé¢„å‘布版本('rc1') +å‘布åŽä¸ä¹…ï¼Œå› ä¸ºæ— è®ºå¦‚ä½•ä½ éƒ½åº”è¯¥åœ¨é‚£ä¸ªæ—¶å€™é‡æ–°æµ‹è¯•å¹¶æä¾›çŠ¶æ€æ›´æ–°ï¼ˆè§ä¸Šæ–‡ï¼‰ã€‚ + +如果第二次æé†’的结果åˆåœ¨ä¸€å‘¨å†…没有任何å应,å¯ä»¥å°è¯•è”系上级维护者询问æ„è§ï¼š +å³ä½¿å†å¿™çš„维护者在这时候也至少应该å‘过æŸç§ç¡®è®¤ã€‚ + +è®°ä½è¦åšå¥½å¤±æœ›çš„å‡†å¤‡ï¼šç†æƒ³çŠ¶å†µä¸‹ç»´æŠ¤è€…æœ€å¥½å¯¹æ¯ä¸€ä¸ªé—®é¢˜æŠ¥å‘Šåšå‡ºå›žåº”,但他们 +åªæœ‰ä¹‰åŠ¡è§£å†³ä¹‹å‰åˆ—出的“高优先级问题â€ã€‚æ‰€ä»¥ï¼Œå¦‚æžœä½ å¾—åˆ°çš„å›žå¤æ˜¯â€œè°¢è°¢ä½ 的报告, +æˆ‘ç›®å‰æœ‰æ›´é‡è¦çš„问题è¦å¤„ç†ï¼Œåœ¨å¯é¢„è§çš„æœªæ¥æ²¡æœ‰æ—¶é—´åŽ»ç ”ç©¶è¿™ä¸ªé—®é¢˜â€ï¼Œé‚£è¯·ä¸ +è¦å¤ªæ²®ä¸§ã€‚ + +也有å¯èƒ½åœ¨ç¼ºé™·è·Ÿè¸ªå™¨æˆ–列表ä¸è¿›è¡Œäº†ä¸€äº›è®¨è®ºä¹‹åŽï¼Œä»€ä¹ˆéƒ½æ²¡æœ‰å‘生,æé†’ä¹Ÿæ— åŠ© +于激励大家进行修å¤ã€‚è¿™ç§æƒ…况å¯èƒ½æ˜¯æ¯ç性的,但在 Linux å†…æ ¸å¼€å‘ä¸ç¡®å®žä¼šå‘生。 +这些和其他得ä¸åˆ°å¸®åŠ©çš„åŽŸå› åœ¨æœ¬æ–‡ç»“å°¾å¤„çš„â€œä¸ºä»€ä¹ˆæœ‰äº›é—®é¢˜åœ¨è¢«æŠ¥å‘ŠåŽæ²¡æœ‰å¾—到 +任何回应或者ä»ç„¶æ²¡æœ‰ä¿®å¤â€ä¸è¿›è¡Œäº†è§£é‡Šã€‚ + +å¦‚æžœä½ æ²¡æœ‰å¾—åˆ°ä»»ä½•å¸®åŠ©æˆ–é—®é¢˜æœ€ç»ˆæ²¡æœ‰å¾—åˆ°è§£å†³ï¼Œä¸è¦æ²®ä¸§ï¼šLinux å†…æ ¸æ˜¯ FLOSS, +å› æ¤ä½ ä»ç„¶å¯ä»¥è‡ªå·±å¸®åŠ©è‡ªå·±ã€‚ä¾‹å¦‚ï¼Œä½ å¯ä»¥è¯•ç€æ‰¾åˆ°å…¶ä»–å—å½±å“的人,和他们一 +èµ·åˆä½œæ¥è§£å†³è¿™ä¸ªé—®é¢˜ã€‚è¿™æ ·çš„å›¢é˜Ÿå¯ä»¥ä¸€èµ·å‡†å¤‡ä¸€ä»½æ–°çš„æŠ¥å‘Šï¼Œæåˆ°å›¢é˜Ÿæœ‰å¤šå°‘人, +ä¸ºä»€ä¹ˆä½ ä»¬è®¤ä¸ºè¿™æ˜¯åº”è¯¥å¾—åˆ°è§£å†³çš„äº‹æƒ…ã€‚ä¹Ÿè®¸ä½ ä»¬è¿˜å¯ä»¥ä¸€èµ·ç¼©å°ç¡®åˆ‡åŽŸå› æˆ–å¼• +入回归的å˜åŒ–ï¼Œè¿™å¾€å¾€ä¼šä½¿ä¿®å¤æ›´å®¹æ˜“ã€‚è€Œä¸”å¦‚æžœè¿æ°”好的è¯ï¼Œå›¢é˜Ÿä¸å¯èƒ½ä¼šæœ‰æ‡‚点 +ç¼–ç¨‹çš„äººï¼Œä¹Ÿè®¸èƒ½å†™å‡ºä¸€ä¸ªä¿®å¤æ–¹æ¡ˆã€‚ + + + +“报告稳定版和长期支æŒå†…æ ¸çº¿çš„å›žå½’â€çš„å‚考 +------------------------------------------ + +本å°èŠ‚æä¾›äº†åœ¨ç¨³å®šç‰ˆå’Œé•¿æœŸæ”¯æŒå†…æ ¸çº¿ä¸é¢å¯¹å›žå½’æ—¶éœ€è¦æ‰§è¡Œçš„æ¥éª¤çš„è¯¦ç»†ä¿¡æ¯ã€‚ + +ç¡®ä¿ç‰¹å®šç‰ˆæœ¬çº¿ä»ç„¶å—æ”¯æŒ +~~~~~~~~~~~~~~~~~~~~~~~~~ + + *æ£€æŸ¥å†…æ ¸å¼€å‘人员是å¦ä»ç„¶ç»´æŠ¤ä½ 关心的Linuxå†…æ ¸ç‰ˆæœ¬çº¿ï¼šåŽ» kernel.org çš„ + é¦–é¡µï¼Œç¡®ä¿æ¤ç‰¹å®šç‰ˆæœ¬çº¿çš„æœ€æ–°ç‰ˆæ²¡æœ‰â€œ[EOL]â€æ ‡è®°ã€‚* + +å¤§å¤šæ•°å†…æ ¸ç‰ˆæœ¬çº¿åªæ”¯æŒä¸‰ä¸ªæœˆå·¦å³ï¼Œå› 为延长维护时间会带æ¥ç›¸å½“å¤šçš„å·¥ä½œã€‚å› æ¤ï¼Œ +æ¯å¹´åªä¼šé€‰æ‹©ä¸€ä¸ªç‰ˆæœ¬æ¥æ”¯æŒè‡³å°‘两年(通常是å…å¹´ï¼‰ã€‚è¿™å°±æ˜¯ä¸ºä»€ä¹ˆä½ éœ€è¦æ£€æŸ¥ +å†…æ ¸å¼€å‘者是å¦è¿˜æ”¯æŒä½ 关心的版本线。 + +注æ„,如果 `kernel.org <https://kernel.org/>`_ 在首页上列出了两个“稳定â€ç‰ˆæœ¬ï¼Œ +ä½ åº”è¯¥è€ƒè™‘åˆ‡æ¢åˆ°è¾ƒæ–°çš„版本,而忘掉较旧的版本:对它的支æŒå¯èƒ½å¾ˆå¿«å°±ä¼šç»“æŸã€‚ +ç„¶åŽï¼Œå®ƒå°†è¢«æ ‡è®°ä¸ºâ€œç”Ÿå‘½å‘¨æœŸç»“æŸâ€ï¼ˆEOL)。达到这个程度的版本线ä»ç„¶ä¼šåœ¨ +`kernel.org <https://kernel.org/>`_ 首页上被显示一两周,但ä¸é€‚åˆç”¨äºŽæµ‹è¯•å’Œ +报告。 + +æœç´¢ç¨³å®šç‰ˆé‚®ä»¶åˆ—表 +~~~~~~~~~~~~~~~~~~~ + + *检查Linux稳定版邮件列表ä¸çš„现有报告。* + +ä¹Ÿè®¸ä½ æ‰€é¢ä¸´çš„问题已ç»è¢«å‘çŽ°ï¼Œå¹¶ä¸”å·²ç»æˆ–å³å°†è¢«ä¿®å¤ã€‚å› æ¤ï¼Œè¯·åœ¨ `Linux 稳定 +版邮件列表的档案 <https://lore.kernel.org/stable/>`_ 䏿œç´¢ç±»ä¼¼é—®é¢˜çš„æŠ¥å‘Šã€‚ +å¦‚æžœä½ æ‰¾åˆ°ä»»ä½•åŒ¹é…的问题,å¯ä»¥è€ƒè™‘åŠ å…¥è®¨è®ºï¼Œé™¤éžä¿®å¤å·¥ä½œå·²ç»å®Œæˆå¹¶è®¡åˆ’很快 +得到应用。 + +用最新版本å¤çŽ°é—®é¢˜ +~~~~~~~~~~~~~~~~~~~ + + *ä»Žç‰¹å®šçš„ç‰ˆæœ¬çº¿å®‰è£…æœ€æ–°ç‰ˆæœ¬ä½œä¸ºçº¯å‡€å†…æ ¸ã€‚ç¡®ä¿è¿™ä¸ªå†…æ ¸æ²¡æœ‰è¢«æ±¡æŸ“ï¼Œå¹¶ä¸”ä» + ç„¶å˜åœ¨é—®é¢˜ï¼Œå› 为问题å¯èƒ½å·²ç»åœ¨é‚£é‡Œè¢«ä¿®å¤äº†ã€‚* + +在投入更多时间到这个过程ä¸ä¹‹å‰ï¼Œä½ è¦æ£€æŸ¥è¿™ä¸ªé—®é¢˜æ˜¯å¦åœ¨ä½ 关注的版本线的最新 +版本ä¸å·²ç»å¾—到了修å¤ã€‚è¿™ä¸ªå†…æ ¸éœ€è¦æ˜¯çº¯å‡€çš„,在问题å‘生之å‰ä¸åº”è¯¥è¢«æ±¡æŸ“ï¼Œæ£ +如上é¢å·²ç»åœ¨æµ‹è¯•主线的过程ä¸è¯¦ç»†ä»‹ç»è¿‡çš„ä¸€æ ·ã€‚ + +æ‚¨æ˜¯å¦æ˜¯ç¬¬ä¸€æ¬¡æ³¨æ„åˆ°ä¾›åº”å•†å†…æ ¸çš„å›žå½’ï¼Ÿä¾›åº”å•†çš„æ›´æ”¹å¯èƒ½ä¼šå‘生å˜åŒ–ã€‚ä½ éœ€è¦é‡æ–° +检查排除æ¥è¿™ä¸ªé—®é¢˜ã€‚当您从5.10.4-vendor.42更新到5.10.5-vendor.43时,记录æŸå +的信æ¯ã€‚ç„¶åŽåœ¨æµ‹è¯•了å‰ä¸€æ®µä¸æ‰€è¿°çš„æœ€æ–°5.10版本之åŽï¼Œæ£€æŸ¥Linux 5.10.4的普通版本 +是å¦ä¹Ÿå¯ä»¥æ£å¸¸å·¥ä½œã€‚如果问题在那里出现,那就ä¸ç¬¦åˆä¸Šæ¸¸å›žå½’çš„æ¡ä»¶ï¼Œæ‚¨éœ€è¦åˆ‡æ¢ +å›žä¸»é€æ¥æŒ‡å—æ¥æŠ¥å‘Šé—®é¢˜ã€‚ + +报告回归 +~~~~~~~~~~ + + *å‘Linux稳定版邮件列表å‘é€ä¸€ä¸ªç®€çŸçš„问题报告(stable@vger.kernel.org)。 + 大致æè¿°é—®é¢˜ï¼Œå¹¶è§£é‡Šå¦‚何å¤çŽ°ã€‚è®²æ¸…æ¥šé¦–ä¸ªå‡ºçŽ°é—®é¢˜çš„ç‰ˆæœ¬å’Œæœ€åŽä¸€ä¸ªå·¥ä½œæ£å¸¸ + 的版本。然åŽç‰å¾…进一æ¥çš„æŒ‡ç¤ºã€‚* + +当报告在稳定版或长期支æŒå†…æ ¸çº¿å†…å‘生的回归(例如在从5.10.4更新到5.10.5时), +一份简çŸçš„æŠ¥å‘Šè¶³ä»¥å¿«é€ŸæŠ¥å‘Šé—®é¢˜ã€‚å› æ¤åªéœ€è¦ç²—略的æè¿°ã€‚ + +但是请注æ„,如果您能够指明引入问题的确切版本,这将对开å‘äººå‘˜æœ‰å¾ˆå¤§å¸®åŠ©ã€‚å› æ¤ +如果有时间的è¯ï¼Œè¯·å°è¯•ä½¿ç”¨æ™®é€šå†…æ ¸æ‰¾åˆ°è¯¥ç‰ˆæœ¬ã€‚è®©æˆ‘ä»¬å‡è®¾å‘行版å‘布Linuxå†…æ ¸ +5.10.5到5.10.8的更新时å‘生了故障。那么按照上é¢çš„æŒ‡ç¤ºï¼ŒåŽ»æ£€æŸ¥è¯¥ç‰ˆæœ¬çº¿ä¸çš„æœ€æ–° +å†…æ ¸ï¼Œæ¯”å¦‚5.10.9。如果问题出现,请å°è¯•普通5.10.5,以确ä¿ä¾›åº”商应用的补ä¸ä¸ä¼š +干扰。如果问题没有出现,那么å°è¯•5.10.7,然åŽç›´åˆ°5.10.8或5.10.6(å–决于结果) +找到第一个引入问题的版本。在报告ä¸å†™æ˜Žè¿™ä¸€ç‚¹ï¼Œå¹¶æŒ‡å‡º5.10.9ä»ç„¶å˜åœ¨æ•…障。 + +å‰ä¸€æ®µåŸºæœ¬ç²—ç•¥åœ°æ¦‚è¿°äº†â€œäºŒåˆ†â€æ–¹æ³•。一旦报告出æ¥ï¼Œæ‚¨å¯èƒ½ä¼šè¢«è¦æ±‚åšä¸€ä¸ªæ£ç¡®çš„ +æŠ¥å‘Šï¼Œå› ä¸ºå®ƒå…许精确地定ä½å¯¼è‡´é—®é¢˜çš„确切更改(然åŽå¾ˆå®¹æ˜“被æ¢å¤ä»¥å¿«é€Ÿä¿®å¤é—®é¢˜ï¼‰ã€‚ +å› æ¤å¦‚果时间å…许,考虑立å³è¿›è¡Œé€‚当的二分。有关如何详细信æ¯ï¼Œè¯·å‚阅“对回归的 +特别关照â€éƒ¨åˆ†å’Œæ–‡æ¡£â€œDocumentation/translations/zh_CN/admin-guide/bug-bisect.rstâ€ã€‚ + + +â€œæŠ¥å‘Šä»…åœ¨æ—§å†…æ ¸ç‰ˆæœ¬çº¿ä¸å‘生的问题â€çš„å‚考 +---------------------------------------- + +本节详细介ç»äº†å¦‚æžœæ— æ³•ç”¨ä¸»çº¿å†…æ ¸é‡çŽ°é—®é¢˜ï¼Œä½†å¸Œæœ›åœ¨æ—§ç‰ˆæœ¬çº¿ï¼ˆåˆç§°ç¨³å®šç‰ˆå†…æ ¸å’Œ +长期支æŒå†…æ ¸ï¼‰ä¸ä¿®å¤é—®é¢˜æ—¶éœ€è¦é‡‡å–çš„æ¥éª¤ã€‚ + +有些修å¤å¤ªå¤æ‚ +~~~~~~~~~~~~~~~ + + *请åšå¥½å‡†å¤‡ï¼ŒæŽ¥ä¸‹æ¥çš„å‡ ä¸ªæ¥éª¤å¯èƒ½æ— 法在旧版本ä¸è§£å†³é—®é¢˜ï¼šä¿®å¤å¯èƒ½å¤ªå¤§æˆ– + å¤ªå†’é™©ï¼Œæ— æ³•ç§»æ¤åˆ°é‚£é‡Œã€‚* + +å³ä½¿æ˜¯å¾®å°çš„ã€çœ‹ä¼¼æ˜Žæ˜¾çš„代ç å˜åŒ–ï¼Œæœ‰æ—¶ä¹Ÿä¼šå¸¦æ¥æ–°çš„ã€å®Œå…¨æ„想ä¸åˆ°çš„问题。稳 +定版和长期支æŒå†…æ ¸çš„ç»´æŠ¤è€…éžå¸¸æ¸…æ¥šè¿™ä¸€ç‚¹ï¼Œå› æ¤ä»–们åªå¯¹è¿™äº›å†…æ ¸è¿›è¡Œç¬¦åˆ +“Documentation/translations/zh_CN/process/stable-kernel-rules.rstâ€ä¸æ‰€åˆ—出的 +规则的修改。 + +夿‚或有风险的修改ä¸ç¬¦åˆæ¡ä»¶ï¼Œå› æ¤åªèƒ½åº”用于主线。其他的修å¤å¾ˆå®¹æ˜“被回溯到 +最新的稳定版和长期支æŒå†…æ ¸ï¼Œä½†æ˜¯é£Žé™©å¤ªå¤§ï¼Œæ— æ³•é›†æˆåˆ°æ—§ç‰ˆå†…æ ¸ä¸ã€‚æ‰€ä»¥è¦æ³¨æ„ +ä½ æ‰€å¸Œæœ›çš„ä¿®å¤å¯èƒ½æ˜¯é‚£äº›ä¸ä¼šè¢«å›žæº¯åˆ°ä½ 所关心的版本线的修å¤ä¹‹ä¸€ã€‚åœ¨è¿™ç§æƒ…况 +ä¸‹ï¼Œä½ å°†åˆ«æ— é€‰æ‹©ï¼Œè¦ä¹ˆå¿å—这个问题,è¦ä¹ˆåˆ‡æ¢åˆ°ä¸€ä¸ªè¾ƒæ–°çš„ Linux 版本,除éžä½ +想自己把修å¤è¡¥ä¸åº”ç”¨åˆ°ä½ çš„å†…æ ¸ä¸ã€‚ + +通用准备 +~~~~~~~~~~ + + *执行上é¢â€œæŠ¥å‘Šä»…åœ¨æ—§å†…æ ¸ç‰ˆæœ¬çº¿ä¸å‘生的问题â€ä¸€èŠ‚ä¸çš„å‰ä¸‰ä¸ªæ¥éª¤ã€‚* + +æ‚¨éœ€è¦æ‰§è¡Œæœ¬æŒ‡å—å¦ä¸€èŠ‚ä¸å·²ç»æè¿°çš„å‡ ä¸ªæ¥éª¤ã€‚这些æ¥éª¤å°†è®©æ‚¨ï¼š + + * æ£€æŸ¥å†…æ ¸å¼€å‘人员是å¦ä»ç„¶ç»´æŠ¤æ‚¨å…³å¿ƒçš„Linuxå†…æ ¸ç‰ˆæœ¬è¡Œã€‚ + + * 在Linuxç¨³å®šé‚®ä»¶åˆ—è¡¨ä¸æœç´¢é€€å‡ºçš„æŠ¥å‘Šã€‚ + + * 检查最新版本。 + + +检查代ç 历å²å’Œæœç´¢çŽ°æœ‰çš„è®¨è®º +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + *在Linuxå†…æ ¸ç‰ˆæœ¬æŽ§åˆ¶ç³»ç»Ÿä¸æœç´¢ä¿®å¤ä¸»çº¿é—®é¢˜çš„æ›´æ”¹ï¼Œå› 为它的æäº¤æ¶ˆæ¯å¯èƒ½ + ä¼šå‘Šè¯‰ä½ ä¿®å¤æ˜¯å¦å·²ç»è®¡åˆ’好了支æŒã€‚å¦‚æžœä½ æ²¡æœ‰æ‰¾åˆ°ï¼Œæœç´¢é€‚当的邮件列表, + 寻找讨论æ¤ç±»é—®é¢˜æˆ–åŒè¡Œè¯„è®®å¯èƒ½ä¿®å¤çš„帖åï¼›ç„¶åŽæ£€æŸ¥è®¨è®ºæ˜¯å¦è®¤ä¸ºä¿®å¤ä¸é€‚ + åˆæ”¯æŒã€‚å¦‚æžœæ”¯æŒæ ¹æœ¬ä¸è¢«è€ƒè™‘ï¼ŒåŠ å…¥æœ€æ–°çš„è®¨è®ºï¼Œè¯¢é—®æ˜¯å¦æœ‰å¯èƒ½ã€‚* + +åœ¨è®¸å¤šæƒ…å†µä¸‹ï¼Œä½ æ‰€å¤„ç†çš„问题会å‘生在主线上,但已在主线上得到了解决。修æ£å®ƒ +çš„æäº¤ä¹Ÿéœ€è¦è¢«å›žæº¯æ‰èƒ½è§£å†³è¿™ä¸ªé—®é¢˜ã€‚è¿™å°±æ˜¯ä¸ºä»€ä¹ˆä½ è¦æœç´¢å®ƒæˆ–任何相关讨论。 + + * 首先å°è¯•åœ¨å˜æ”¾ Linux å†…æ ¸æºä»£ç çš„ Git ä»“åº“ä¸æ‰¾åˆ°ä¿®å¤ã€‚ä½ å¯ä»¥é€šè¿‡ + `kernel.org 上的网页 + <https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/>`_ + 或 `GitHub ä¸Šçš„é•œåƒ <https://github.com/torvalds/linux>`_ æ¥å®žçŽ°ï¼›å¦‚æžœä½ + æœ‰ä¸€ä¸ªæœ¬åœ°å…‹éš†ï¼Œä½ ä¹Ÿå¯ä»¥åœ¨å‘½ä»¤è¡Œç”¨ ``git log --grep=<pattern>`` æ¥æœç´¢ã€‚ + + å¦‚æžœä½ æ‰¾åˆ°äº†ä¿®å¤ï¼Œè¯·æŸ¥çœ‹æäº¤æ¶ˆæ¯çš„尾部是å¦åŒ…å«äº†ç±»ä¼¼è¿™æ ·çš„â€œç¨³å®šç‰ˆæ ‡ç¾â€ï¼š + + Cc: <stable@vger.kernel.org> # 5.4+ + + åƒä¸Šé¢è¿™è¡Œï¼Œå¼€å‘è€…æ ‡è®°äº†å®‰å…¨ä¿®å¤å¯ä»¥å›žä¼ 到 5.4 åŠä»¥åŽçš„版本。大多数情况 + ä¸‹ï¼Œå®ƒä¼šåœ¨ä¸¤å‘¨å†…è¢«åº”ç”¨åˆ°é‚£é‡Œï¼Œä½†æœ‰æ—¶éœ€è¦æ›´é•¿çš„æ—¶é—´ã€‚ + + * 如果æäº¤æ²¡æœ‰å‘Šè¯‰ä½ ä»»ä½•ä¸œè¥¿ï¼Œæˆ–è€…ä½ æ‰¾ä¸åˆ°ä¿®å¤ï¼Œè¯·å†æ‰¾æ‰¾å…³äºŽè¿™ä¸ªé—®é¢˜çš„讨论。 + ç”¨ä½ æœ€å–œæ¬¢çš„æœç´¢å¼•擎æœç´¢ç½‘ç»œï¼Œä»¥åŠ `Linux kernel developers mailing + list å†…æ ¸å¼€å‘者邮件列表 <https://lore.kernel.org/lkml/>`_ 的档案。也å¯ä»¥ + 阅读上é¢çš„ `定ä½å¯¼è‡´é—®é¢˜çš„å†…æ ¸åŒºåŸŸ` ä¸€èŠ‚ï¼Œç„¶åŽæŒ‰ç…§è¯´æ˜Žæ‰¾åˆ°å¯¼è‡´é—®é¢˜çš„åç³» + ç»Ÿï¼šå®ƒçš„ç¼ºé™·è·Ÿè¸ªå™¨æˆ–é‚®ä»¶åˆ—è¡¨å˜æ¡£ä¸å¯èƒ½æœ‰ä½ è¦æ‰¾çš„ç”æ¡ˆã€‚ + + * å¦‚æžœä½ çœ‹åˆ°äº†ä¸€ä¸ªè®¡åˆ’çš„ä¿®å¤ï¼Œè¯·æŒ‰ä¸Šæ‰€è¿°åœ¨ç‰ˆæœ¬æŽ§åˆ¶ç³»ç»Ÿä¸æœç´¢å®ƒï¼Œå› 为æäº¤å¯ + èƒ½ä¼šå‘Šè¯‰ä½ æ˜¯å¦å¯ä»¥è¿›è¡Œå›žæº¯ã€‚ + + * æ£€æŸ¥è®¨è®ºä¸æ˜¯å¦æœ‰ä»»ä½•迹象表明,该修å¤ç¨‹åºå¯èƒ½é£Žé™©å¤ªå¤§ï¼Œæ— æ³•å›žæº¯åˆ°ä½ å…³å¿ƒ + çš„ç‰ˆæœ¬çº¿ã€‚å¦‚æžœæ˜¯è¿™æ ·çš„è¯ï¼Œä½ å¿…é¡»å¿å—这个问题,或者切æ¢åˆ°åº”用了修å¤çš„内 + æ ¸ç‰ˆæœ¬çº¿ã€‚ + + * 如果修å¤çš„问题未包å«ç¨³å®šç‰ˆæ ‡ç¾ï¼Œå¹¶ä¸”æ²¡æœ‰è®¨è®ºè¿‡å›žæº¯é—®é¢˜ï¼Œè¯·åŠ å…¥è®¨è®ºï¼šå¦‚ + æžœåˆé€‚çš„è¯ï¼Œè¯·æåŠä½ 所é¢å¯¹çš„问题的版本,以åŠä½ 希望看到它被修å¤ã€‚ + + +请求建议 +~~~~~~~~~ + + *å‰é¢çš„æ¥éª¤ä¹‹ä¸€åº”è¯¥ä¼šç»™å‡ºä¸€ä¸ªè§£å†³æ–¹æ¡ˆã€‚å¦‚æžœä»æœªèƒ½æˆåŠŸï¼Œè¯·å‘å¯èƒ½å¼•起问题 + çš„å系统的维护人员询问建议;抄é€ç‰¹å®šå系统的邮件列表以åŠç¨³å®šç‰ˆé‚®ä»¶åˆ—表。* + +如果å‰é¢çš„三个æ¥éª¤éƒ½æ²¡æœ‰è®©ä½ 更接近解决方案,那么åªå‰©ä¸‹ä¸€ä¸ªé€‰æ‹©ï¼šè¯·æ±‚建议。 +åœ¨ä½ å‘ç»™å¯èƒ½æ˜¯é—®é¢˜æ ¹æºçš„å系统的维护者的邮件ä¸è¿™æ ·åšï¼›æŠ„é€å系统的邮件列表 +以åŠç¨³å®šç‰ˆé‚®ä»¶åˆ—表(stable@vger.kernel.org)。 + + +ä¸ºä»€ä¹ˆæœ‰äº›é—®é¢˜åœ¨æŠ¥å‘ŠåŽæ²¡æœ‰ä»»ä½•å›žåº”æˆ–ä»æœªè§£å†³ï¼Ÿ +=============================================== + +å½“å‘ Linux å¼€å‘è€…æŠ¥å‘Šé—®é¢˜æ—¶ï¼Œè¦æ³¨æ„åªæœ‰â€œé«˜ä¼˜å…ˆçº§çš„问题â€ï¼ˆå›žå½’ã€å®‰å…¨é—®é¢˜ã€ä¸¥ +é‡é—®é¢˜ï¼‰æ‰ä¸€å®šä¼šå¾—到解决。如果维护者或其他人都失败了,Linus Torvalds 他自己 +会确ä¿è¿™ä¸€ç‚¹ã€‚ä»–ä»¬å’Œå…¶ä»–å†…æ ¸å¼€å‘者也会解决很多其他问题。但是è¦çŸ¥é“,有时他 +们也会ä¸èƒ½æˆ–䏿„¿å¸®å¿™ï¼›æœ‰æ—¶ç”šè‡³æ²¡æœ‰äººå‘报告给他们。 + +æœ€å¥½çš„è§£é‡Šå°±æ˜¯é‚£äº›å†…æ ¸å¼€å‘者常常是在业余时间为 Linux å†…æ ¸åšå‡ºè´¡çŒ®ã€‚å†…æ ¸ä¸çš„ +ä¸å°‘驱动程åºéƒ½æ˜¯ç”±è¿™æ ·çš„程åºå‘˜ç¼–å†™çš„ï¼Œå¾€å¾€åªæ˜¯å› 为他们想让自己的硬件å¯ä»¥åœ¨ +自己喜欢的æ“作系统上使用。 + +这些程åºå‘˜å¤§å¤šæ•°æ—¶å€™ä¼šå¾ˆä¹æ„ä¿®å¤åˆ«äººæŠ¥å‘Šçš„问题。但是没有人å¯ä»¥å¼ºè¿«ä»–ä»¬è¿™æ · +åšï¼Œå› 为他们是自愿贡献的。 + +还有一些情况下,这些开å‘者真的很想解决一个问题,但å´ä¸èƒ½è§£å†³ï¼šæœ‰æ—¶ä»–ä»¬ç¼ºä¹ +硬件编程文档æ¥è§£å†³é—®é¢˜ã€‚è¿™ç§æƒ…å†µå¾€å¾€ç”±äºŽå…¬å¼€çš„æ–‡æ¡£å¤ªç®€é™‹ï¼Œæˆ–è€…é©±åŠ¨ç¨‹åºæ˜¯é€š +过逆å‘工程编写的。 + +业余开å‘者迟早也会ä¸å†å…³å¿ƒæŸé©±åŠ¨ã€‚ä¹Ÿè®¸ä»–ä»¬çš„æµ‹è¯•ç¡¬ä»¶å了,被更高级的玩æ„å– +代了,或者是太è€äº†ä»¥è‡³äºŽåªèƒ½åœ¨è®¡ç®—机åšç‰©é¦†é‡Œæ‰¾åˆ°ã€‚有时开å‘è€…æ ¹æœ¬å°±ä¸å…³å¿ƒä»– +们的代ç å’Œ Linux äº†ï¼Œå› ä¸ºåœ¨ä»–ä»¬çš„ç”Ÿæ´»ä¸ä¸€äº›ä¸åŒçš„东西å˜å¾—æ›´é‡è¦äº†ã€‚在æŸäº›æƒ… +å†µä¸‹ï¼Œæ²¡æœ‰äººæ„¿æ„æŽ¥æ‰‹ç»´æŠ¤è€…çš„å·¥ä½œâ€”â€”ä¹Ÿæ²¡æœ‰äººå¯ä»¥è¢«å¼ºè¿«ï¼Œå› 为对 Linux å†…æ ¸çš„è´¡ +献是自愿的。然而被é—弃的驱动程åºä»ç„¶å˜åœ¨äºŽå†…æ ¸ä¸ï¼šå®ƒä»¬å¯¹äººä»¬ä»ç„¶æœ‰ç”¨ï¼Œåˆ 除 +它们å¯èƒ½å¯¼è‡´å›žå½’。 + +对于那些为 Linux å†…æ ¸å·¥ä½œè€ŒèŽ·å¾—æŠ¥é…¬çš„å¼€å‘者æ¥è¯´ï¼Œæƒ…况并没有什么ä¸åŒã€‚这些人 +çŽ°åœ¨è´¡çŒ®äº†å¤§éƒ¨åˆ†çš„å˜æ›´ã€‚ä½†æ˜¯ä»–ä»¬çš„é›‡ä¸»è¿Ÿæ—©ä¹Ÿä¼šåœæ¢å…³æ³¨ä»–ä»¬çš„ä»£ç æˆ–è€…è®©ç¨‹åº +员专注于其他事情。例如,硬件厂商主è¦é€šè¿‡é”€å”®æ–°ç¡¬ä»¶æ¥èµšé’±ï¼›å› æ¤ï¼Œä»–们ä¸çš„ä¸ +少人并没有投入太多时间和精力æ¥ç»´æŠ¤ä»–们多年å‰å°±åœæ¢é”€å”®çš„东西的 Linux å†…æ ¸é©± +动。ä¼ä¸šçº§ Linux å‘行商往往æŒç»ç»´æŠ¤çš„æ—¶é—´æ¯”较长,但在新版本ä¸å¾€å¾€ä¼šæŠŠå¯¹è€æ—§ +å’Œç¨€æœ‰ç¡¬ä»¶çš„æ”¯æŒæ”¾åœ¨ä¸€è¾¹ï¼Œä»¥é™åˆ¶èŒƒå›´ã€‚ä¸€æ—¦å…¬å¸æŠ›å¼ƒäº†ä¸€äº›ä»£ç ,往往由业余贡 +献者接手,但æ£å¦‚ä¸Šé¢æåˆ°çš„ï¼šä»–ä»¬è¿Ÿæ—©ä¹Ÿä¼šæ”¾ä¸‹ä»£ç 。 + +优先级是一些问题没有被修å¤çš„å¦ä¸€ä¸ªåŽŸå› ï¼Œå› ä¸ºç»´æŠ¤è€…ç›¸å½“å¤šçš„æ—¶å€™æ˜¯è¢«è¿«è®¾ç½®è¿™ +äº›ä¼˜å…ˆçº§çš„ï¼Œå› ä¸ºåœ¨ Linux 上工作的时间是有é™çš„。对于业余时间或者雇主给予他们 +的开å‘äººå‘˜ç”¨äºŽä¸Šæ¸¸å†…æ ¸ç»´æŠ¤å·¥ä½œçš„æ—¶é—´ä¹Ÿæ˜¯å¦‚æ¤ã€‚有时维护人员也会被报告淹没, +å³ä½¿ä¸€ä¸ªé©±åŠ¨ç¨‹åºå‡ 乎完美地工作。为了ä¸è¢«å®Œå…¨ç¼ ä½ï¼Œç¨‹åºå‘˜å¯èƒ½åˆ«æ— 选择,åªèƒ½ +对问题报告进行优先级排åºè€Œæ‹’ç»å…¶ä¸çš„一些报告。 + +ä¸è¿‡è¿™äº›éƒ½ä¸ç”¨å¤ªè¿‡æ‹…心,很多驱动都有积æžçš„维护者,他们对尽å¯èƒ½å¤šçš„解决问题 +相当感兴趣。 + + +结æŸè¯ +======= + +与其他å…è´¹/自由&å¼€æºè½¯ä»¶ï¼ˆFree/Libre & Open Source Software,FLOSS)相比, +å‘ Linux å†…æ ¸å¼€å‘è€…æŠ¥å‘Šé—®é¢˜æ˜¯å¾ˆéš¾çš„ï¼šè¿™ä¸ªæ–‡æ¡£çš„é•¿åº¦å’Œå¤æ‚性以åŠå—里行间的内 +涵都说明了这一点。但目å‰å°±æ˜¯è¿™æ ·äº†ã€‚这篇文å—的主è¦ä½œè€…希望通过记录现状æ¥ä¸º +ä»¥åŽæ”¹å–„è¿™ç§çŠ¶å†µæ‰“ä¸‹ä¸€äº›åŸºç¡€ã€‚ diff --git a/Documentation/translations/zh_CN/admin-guide/security-bugs.rst b/Documentation/translations/zh_CN/admin-guide/security-bugs.rst new file mode 100644 index 0000000000000000000000000000000000000000..b8120391755d46a4198181ddf53d02f6d3f3ff76 --- /dev/null +++ b/Documentation/translations/zh_CN/admin-guide/security-bugs.rst @@ -0,0 +1,74 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: :doc:`../../../admin-guide/security-bugs` + +:译者: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> + +安全缺陷 +========= + +Linuxå†…æ ¸å¼€å‘人员éžå¸¸é‡è§†å®‰å…¨æ€§ã€‚å› æ¤æˆ‘们想知é“何时å‘çŽ°äº†å®‰å…¨æ¼æ´žï¼Œä»¥ä¾¿å°½å¿« +ä¿®å¤å’ŒæŠ«éœ²ã€‚请å‘Linuxå†…æ ¸å®‰å…¨å›¢é˜ŸæŠ¥å‘Šå®‰å…¨æ¼æ´žã€‚ + +è”络 +----- + +å¯ä»¥é€šè¿‡ç”µå邮件<security@kernel.org>è”ç³»Linuxå†…æ ¸å®‰å…¨å›¢é˜Ÿã€‚è¿™æ˜¯ä¸€ä¸ªå®‰å…¨äººå‘˜ +çš„ç§æœ‰åˆ—表,他们将帮助验è¯é”™è¯¯æŠ¥å‘Šå¹¶å¼€å‘å’Œå‘布修å¤ç¨‹åºã€‚å¦‚æžœæ‚¨å·²ç»æœ‰äº†ä¸€ä¸ª +ä¿®å¤ï¼Œè¯·å°†å…¶åŒ…å«åœ¨æ‚¨çš„æŠ¥å‘Šä¸ï¼Œè¿™æ ·å¯ä»¥å¤§å¤§åŠ å¿«è¿›ç¨‹ã€‚å®‰å…¨å›¢é˜Ÿå¯èƒ½ä¼šä»ŽåŒºåŸŸç»´æŠ¤ +人员那里获得é¢å¤–的帮助,以ç†è§£å’Œä¿®å¤å®‰å…¨æ¼æ´žã€‚ + +ä¸Žä»»ä½•ç¼ºé™·ä¸€æ ·ï¼Œæä¾›çš„ä¿¡æ¯è¶Šå¤šï¼Œè¯Šæ–和修å¤å°±è¶Šå®¹æ˜“ã€‚å¦‚æžœæ‚¨ä¸æ¸…æ¥šå“ªäº›ä¿¡æ¯æœ‰ç”¨ï¼Œ +请查看“Documentation/translations/zh_CN/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å†…æ ¸å®‰å…¨å›¢é˜Ÿä¸æ˜¯ä¸€ä¸ªæ£å¼çš„æœºæž„å®žä½“ï¼Œå› æ¤æ— 法ç¾è®¢ä»»ä½•ä¿å¯†å议。 diff --git a/Documentation/translations/zh_CN/admin-guide/tainted-kernels.rst b/Documentation/translations/zh_CN/admin-guide/tainted-kernels.rst new file mode 100644 index 0000000000000000000000000000000000000000..bc51d7cff9b09d7294b8679271b4c273afbf81f1 --- /dev/null +++ b/Documentation/translations/zh_CN/admin-guide/tainted-kernels.rst @@ -0,0 +1,157 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: :doc:`../../../admin-guide/tainted-kernels` + +:译者: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@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æ’件,它å¯ä»¥æœ‰æ„生æˆéžå¸¸ä¸å¯»å¸¸çš„å†…æ ¸ç»“æž„ + 布局(甚至是性能病æ€çš„布局),这在调试时éžå¸¸æœ‰ç”¨ã€‚于构建时设置。 diff --git a/Documentation/translations/zh_CN/admin-guide/unicode.rst b/Documentation/translations/zh_CN/admin-guide/unicode.rst new file mode 100644 index 0000000000000000000000000000000000000000..b0b08d2b6eb794be3f28be226b3a6fbb0841b532 --- /dev/null +++ b/Documentation/translations/zh_CN/admin-guide/unicode.rst @@ -0,0 +1,170 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/admin-guide/unicode.rst + +:译者: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@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å¹³é¢ä¸€è¢«æ‹’ç»ï¼Œå› æ¤ä¸Šè¿°ç¼–ç ä»ç„¶æ˜¯å®˜æ–¹çš„。 diff --git a/Documentation/translations/zh_CN/core-api/index.rst b/Documentation/translations/zh_CN/core-api/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..f1fa71e45c7721180984d19b05787f48b06b25dc --- /dev/null +++ b/Documentation/translations/zh_CN/core-api/index.rst @@ -0,0 +1,126 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: :doc:`../../../core-api/irq/index` +:Translator: Yanteng Si <siyanteng@loongson.cn> + +.. _cn_core-api_index.rst: + + +=========== +æ ¸å¿ƒAPI文档 +=========== + +è¿™æ˜¯æ ¸å¿ƒå†…æ ¸API手册的首页。 éžå¸¸æ„Ÿè°¢ä¸ºæœ¬æ‰‹å†Œè½¬æ¢(和编写!)的文档! + +æ ¸å¿ƒå®žç”¨ç¨‹åº +============ + +本节包å«é€šç”¨çš„å’Œâ€œæ ¸å¿ƒä¸çš„æ ¸å¿ƒâ€æ–‡æ¡£ã€‚ 第一部分是 docbook 时期é—留下 +æ¥çš„å¤§é‡ kerneldoc ä¿¡æ¯ï¼›æœ‰æœä¸€æ—¥ï¼Œè‹¥æœ‰äººæœ‰åŠ¨åŠ›çš„è¯ï¼Œåº”当把它们拆分 +出æ¥ã€‚ + +Todolist: + + kernel-api + workqueue + printk-basics + printk-formats + symbol-namespaces + +æ•°æ®ç»“æž„å’Œä½Žçº§å®žç”¨ç¨‹åº +====================== + +åœ¨æ•´ä¸ªå†…æ ¸ä¸ä½¿ç”¨çš„函数库。 + +Todolist: + + kobject + kref + assoc_array + xarray + idr + circular-buffers + rbtree + generic-radix-tree + packing + bus-virt-phys-mapping + this_cpu_ops + timekeeping + errseq + +å¹¶å‘åŽŸè¯ +======== + +Linuxå¦‚ä½•è®©ä¸€åˆ‡åŒæ—¶å‘生。 详情请å‚阅 +:doc:`/locking/index` + +.. toctree:: + :maxdepth: 1 + + irq/index + +Todolist: + + refcount-vs-atomic + local_ops + padata + ../RCU/index + +ä½Žçº§ç¡¬ä»¶ç®¡ç† +============ + +缓å˜ç®¡ç†ï¼ŒCPUçƒæ’拔管ç†ç‰ã€‚ + +Todolist: + + cachetlb + cpu_hotplug + memory-hotplug + genericirq + protection-keys + + +内å˜ç®¡ç† +======== + +å¦‚ä½•åœ¨å†…æ ¸ä¸åˆ†é…和使用内å˜ã€‚请注æ„,在 +:doc:`/vm/index` 䏿œ‰æ›´å¤šçš„内å˜ç®¡ç†æ–‡æ¡£ã€‚ + +Todolist: + + memory-allocation + unaligned-memory-access + dma-api + dma-api-howto + dma-attributes + dma-isa-lpc + mm-api + genalloc + pin_user_pages + boot-time-mm + gfp_mask-from-fs-io + +å†…æ ¸è°ƒè¯•çš„æŽ¥å£ +============== + +Todolist: + + debug-objects + tracepoint + debugging-via-ohci1394 + +其它文档 +======== + +ä¸é€‚åˆæ”¾åœ¨å…¶å®ƒåœ°æ–¹æˆ–尚未归类的文件; + +Todolist: + + librs + +.. only:: subproject and html + + Indices + ======= + + * :ref:`genindex` diff --git a/Documentation/translations/zh_CN/core-api/irq/concepts.rst b/Documentation/translations/zh_CN/core-api/irq/concepts.rst new file mode 100644 index 0000000000000000000000000000000000000000..41455bf0f783c5b80aaeb8df631e824c5f17e90f --- /dev/null +++ b/Documentation/translations/zh_CN/core-api/irq/concepts.rst @@ -0,0 +1,24 @@ +.. include:: ../../disclaimer-zh_CN.rst + +:Original: :doc:`../../../../core-api/irq/concepts` +:Translator: Yanteng Si <siyanteng@loongson.cn> + +.. _cn_concepts.rst: + + +=========== +什么是IRQ? +=========== + +IRQ (Interrupt ReQuest) 指æ¥è‡ªè®¾å¤‡çš„䏿–请求。 +ç›®å‰ï¼Œå®ƒä»¬å¯ä»¥é€šè¿‡ä¸€ä¸ªå¼•脚或通过一个数æ®åŒ…进入。 +多个设备å¯ä»¥è¿žæŽ¥åˆ°åŒä¸€ä¸ªå¼•脚,从而共享一个IRQ。 + +IRQç¼–å·æ˜¯ç”¨æ¥æè¿°ç¡¬ä»¶ä¸æ–æºçš„å†…æ ¸æ ‡è¯†ç¬¦ã€‚é€šå¸¸å®ƒæ˜¯ä¸€ä¸ªåˆ°å…¨å±€irq_desc数组的索引, +但是除了在linux/interrupt.hä¸å®žçŽ°çš„ä¹‹å¤–ï¼Œå…¶å®ƒç»†èŠ‚æ˜¯ä½“ç³»ç»“æž„ç‰¹å¾ç›¸å…³çš„。 + +IRQç¼–å·æ˜¯å¯¹æœºå™¨ä¸Šå¯èƒ½çš„䏿–æºçš„æžšä¸¾ã€‚é€šå¸¸æžšä¸¾çš„æ˜¯ç³»ç»Ÿä¸æ‰€æœ‰ä¸æ–控制器的输入引脚 +ç¼–å·ã€‚在ISAï¼ˆå·¥ä¸šæ ‡å‡†ä½“ç³»ç»“æž„ï¼‰çš„æƒ…å†µä¸‹æ‰€æžšä¸¾çš„æ˜¯ä¸¤ä¸ªi8259䏿–控制器的16个输入引脚。 + +体系结构å¯ä»¥ç»™IRQå·èµ‹äºˆé¢å¤–çš„å«ä¹‰ï¼Œåœ¨æ¶‰åŠåˆ°ç¡¬ä»¶æ‰‹åЍé…ç½®çš„æƒ…å†µä¸‹ï¼Œæˆ‘ä»¬é¼“åŠ±è¿™æ ·åšã€‚ +ISA IRQ是赋予这ç§é¢å¤–å«ä¹‰çš„一个典型例å。 diff --git a/Documentation/translations/zh_CN/core-api/irq/index.rst b/Documentation/translations/zh_CN/core-api/irq/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..910ccabf041f3140e2c9950ab15d00d4519d29ce --- /dev/null +++ b/Documentation/translations/zh_CN/core-api/irq/index.rst @@ -0,0 +1,19 @@ +.. include:: ../../disclaimer-zh_CN.rst + +:Original: :doc:`../../../../core-api/irq/index` +:Translator: Yanteng Si <siyanteng@loongson.cn> + +.. _cn_irq_index.rst: + + +==== +IRQs +==== + +.. toctree:: + :maxdepth: 1 + + concepts + irq-affinity + irq-domain + irqflags-tracing diff --git a/Documentation/translations/zh_CN/core-api/irq/irq-affinity.rst b/Documentation/translations/zh_CN/core-api/irq/irq-affinity.rst new file mode 100644 index 0000000000000000000000000000000000000000..82a4428f22fdf883a27cedc94fa397f808c22535 --- /dev/null +++ b/Documentation/translations/zh_CN/core-api/irq/irq-affinity.rst @@ -0,0 +1,76 @@ +.. include:: ../../disclaimer-zh_CN.rst + +:Original: :doc:`../../../../core-api/irq/irq-affinity` +:Translator: Yanteng Si <siyanteng@loongson.cn> + +.. _cn_irq-affinity.rst: + + +============== +SMP IRQ 亲和性 +============== + +å˜æ›´è®°å½•: + - 作者:最åˆç”±Ingo Molnar <mingo@redhat.com>开始撰写 + - åŽæœŸæ›´æ–°ç»´æŠ¤ï¼š Max Krasnyansky <maxk@qualcomm.com> + + +/proc/irq/IRQ#/smp_affinityå’Œ/proc/irq/IRQ#/smp_affinity_list指定了哪些CPU能 +够关è”到一个给定的IRQæºï¼Œè¿™ä¸¤ä¸ªæ–‡ä»¶åŒ…å«äº†è¿™äº›æŒ‡å®šcpuçš„cpu使ީç (smp_affinity)å’Œcpu列 +表(smp_affinity_list)。它ä¸å…è®¸å…³é—æ‰€æœ‰CPU, åŒæ—¶å¦‚æžœIRQæŽ§åˆ¶å™¨ä¸æ”¯æŒä¸æ–请求亲和 +(IRQ affinity),那么所有cpuçš„é»˜è®¤å€¼å°†ä¿æŒä¸å˜(å³å…³è”到所有CPU). + +/proc/irq/default_smp_affinityæŒ‡æ˜Žäº†é€‚ç”¨äºŽæ‰€æœ‰éžæ¿€æ´»IRQ的默认亲和性掩ç 。一旦IRQ被 +分é…/æ¿€æ´»ï¼Œå®ƒçš„äº²å’Œä½æŽ©ç 将被设置为默认掩ç 。然åŽå¯ä»¥å¦‚上所述改å˜å®ƒã€‚é»˜è®¤æŽ©ç æ˜¯0xffffffff。 + +䏋颿˜¯ä¸€ä¸ªå…ˆå°†IRQ44(eth1)é™åˆ¶åœ¨CPU0-3上,然åŽé™åˆ¶åœ¨CPU4-7上的例å(这是一个8CPUçš„SMP box) + +:: + + [root@moon 44]# cd /proc/irq/44 + [root@moon 44]# cat smp_affinity + ffffffff + + [root@moon 44]# echo 0f > smp_affinity + [root@moon 44]# cat smp_affinity + 0000000f + [root@moon 44]# ping -f h + PING hell (195.4.7.3): 56 data bytes + ... + --- hell ping statistics --- + 6029 packets transmitted, 6027 packets received, 0% packet loss + round-trip min/avg/max = 0.1/0.1/0.4 ms + [root@moon 44]# cat /proc/interrupts | grep 'CPU\|44:' + CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 + 44: 1068 1785 1785 1783 0 0 0 0 IO-APIC-level eth1 + +从上é¢ä¸€è¡Œå¯ä»¥çœ‹å‡ºï¼ŒIRQ44åªä¼ 递给å‰å››ä¸ªå¤„ç†å™¨ï¼ˆ0-3)。 +现在让我们把这个IRQé™åˆ¶åœ¨CPU(4-7)。 + +:: + + [root@moon 44]# echo f0 > smp_affinity + [root@moon 44]# cat smp_affinity + 000000f0 + [root@moon 44]# ping -f h + PING hell (195.4.7.3): 56 data bytes + .. + --- hell ping statistics --- + 2779 packets transmitted, 2777 packets received, 0% packet loss + round-trip min/avg/max = 0.1/0.5/585.4 ms + [root@moon 44]# cat /proc/interrupts | 'CPU\|44:' + CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 + 44: 1068 1785 1785 1783 1784 1069 1070 1069 IO-APIC-level eth1 + +这次IRQ44åªä¼ 递给最åŽå››ä¸ªå¤„ç†å™¨ã€‚ +å³CPU0-3的计数器没有å˜åŒ–。 + +䏋颿˜¯ä¸€ä¸ªå°†ç›¸åŒçš„irq(44)é™åˆ¶åœ¨cpus 1024到1031的例å + +:: + + [root@moon 44]# echo 1024-1031 > smp_affinity_list + [root@moon 44]# cat smp_affinity_list + 1024-1031 + +éœ€è¦æ³¨æ„的是,如果è¦ç”¨ä½æŽ©ç æ¥åšè¿™ä»¶äº‹ï¼Œå°±éœ€è¦32个为0çš„ä½æŽ©ç æ¥è¿½è¸ªå…¶ç›¸å…³çš„一个。 diff --git a/Documentation/translations/zh_CN/core-api/irq/irq-domain.rst b/Documentation/translations/zh_CN/core-api/irq/irq-domain.rst new file mode 100644 index 0000000000000000000000000000000000000000..3c82dd307a46cafa35364c5d161b4305ee960e3f --- /dev/null +++ b/Documentation/translations/zh_CN/core-api/irq/irq-domain.rst @@ -0,0 +1,227 @@ +.. include:: ../../disclaimer-zh_CN.rst + +:Original: :doc:`../../../../core-api/irq/irq-domain` +:Translator: Yanteng Si <siyanteng@loongson.cn> + +.. _cn_irq-domain.rst: + + +======================= +irq_domain 䏿–å·æ˜ 射库 +======================= + +ç›®å‰Linuxå†…æ ¸çš„è®¾è®¡ä½¿ç”¨äº†ä¸€ä¸ªå·¨å¤§çš„æ•°å—空间,æ¯ä¸ªç‹¬ç«‹çš„IRQæºéƒ½è¢«åˆ†é…äº†ä¸€ä¸ªä¸ +åŒçš„æ•°å—。 +å½“åªæœ‰ä¸€ä¸ªä¸æ–控制器时,这很简å•ï¼Œä½†åœ¨æœ‰å¤šä¸ªä¸æ–控制器的系统ä¸ï¼Œå†…æ ¸å¿…é¡»ç¡®ä¿æ¯ +ä¸ªä¸æ–控制器都能得到éžé‡å¤çš„Linux IRQå·ï¼ˆæ•°å—)分é…。 + +注册为唯一的irqchipsçš„ä¸æ–控制器编å·å‘ˆçŽ°å‡ºä¸Šå‡çš„趋势:例如GPIO控制器ç‰ä¸åŒ +ç§ç±»çš„å驱动程åºé€šè¿‡å°†å…¶ä¸æ–处ç†ç¨‹åºå»ºæ¨¡ä¸ºirqchips,å³å®žé™…上是级è”䏿–控制器, +é¿å…äº†é‡æ–°å®žçŽ°ä¸ŽIRQæ ¸å¿ƒç³»ç»Ÿç›¸åŒçš„回调机制。 + +åœ¨è¿™é‡Œï¼Œä¸æ–å·ä¸Žç¡¬ä»¶ä¸æ–å·ç¦»æ•£äº†æ‰€æœ‰ç§ç±»çš„对应关系:而在过去,IRQå·å¯ä»¥é€‰æ‹©ï¼Œ +使它们与硬件IRQçº¿è¿›å…¥æ ¹ä¸æ–控制器(å³å®žé™…å‘CPUå‘射䏿–线的组件)相匹é…,现 +在这个编å·ä»…仅是一个数å—。 + +å‡ºäºŽè¿™ä¸ªåŽŸå› ï¼Œæˆ‘ä»¬éœ€è¦ä¸€ç§æœºåˆ¶å°†æŽ§åˆ¶å™¨æœ¬åœ°ä¸æ–å·ï¼ˆå³ç¡¬ä»¶irqç¼–å·ï¼‰ä¸ŽLinux IRQ +å·åˆ†å¼€ã€‚ + +irq_alloc_desc*() å’Œ irq_free_desc*() API æä¾›äº†å¯¹irqå·çš„分é…ï¼Œä½†å®ƒä»¬ä¸ +æä¾›ä»»ä½•对控制器本地IRQ(hwirq)å·åˆ°Linux IRQå·ç©ºé—´çš„å呿˜ 射的支æŒã€‚ + +irq_domain 库在 irq_alloc_desc*() API çš„åŸºç¡€ä¸Šå¢žåŠ äº† hwirq å’Œ IRQ å·ç +ä¹‹é—´çš„æ˜ å°„ã€‚ ç›¸æ¯”äºŽä¸æ–控制器驱动开放编ç 自己的å呿˜ 射方案,我们更喜欢用 +irq_domainæ¥ç®¡ç†æ˜ 射。 + +irq_domain还实现了从抽象的irq_fwspec结构体到hwirqå·çš„转æ¢ï¼ˆåˆ°ç›®å‰ä¸ºæ¢æ˜¯ +Device Treeå’ŒACPI GSI),并且å¯ä»¥å¾ˆå®¹æ˜“地扩展以支æŒå…¶å®ƒIRQæ‹“æ‰‘æ•°æ®æºã€‚ + +irq_domain的用法 +================ + +䏿–控制器驱动程åºé€šè¿‡ä»¥ä¸‹æ–¹å¼åˆ›å»ºå¹¶æ³¨å†Œä¸€ä¸ªirq_domain。调用 +irq_domain_add_*() 或 irq_domain_create_*()函数之一(æ¯ä¸ªæ˜ å°„æ–¹æ³•éƒ½æœ‰ä¸ +åŒçš„分é…器函数,åŽé¢ä¼šè¯¦ç»†ä»‹ç»ï¼‰ã€‚ 函数æˆåŠŸåŽä¼šè¿”回一个指å‘irq_domain的指针。 +调用者必须å‘分é…器函数æä¾›ä¸€ä¸ªirq_domain_ops结构体。 + +在大多数情况下,irq_domain在开始时是空的,没有任何hwirqå’ŒIRQå·ä¹‹é—´çš„æ˜ 射。 +通过调用irq_create_mapping()å°†æ˜ å°„æ·»åŠ åˆ°irq_domainä¸ï¼Œè¯¥å‡½æ•°æŽ¥å— +irq_domain和一个hwirqå·ä½œä¸ºå‚数。 如果hwirqçš„æ˜ å°„è¿˜ä¸å˜åœ¨ï¼Œé‚£ä¹ˆå®ƒå°†åˆ†é… +一个新的Linux irq_desc,将其与hwirqå…³è”èµ·æ¥ï¼Œå¹¶è°ƒç”¨.map()å›žè°ƒï¼Œè¿™æ ·é©±åŠ¨ +程åºå°±å¯ä»¥æ‰§è¡Œä»»ä½•å¿…è¦çš„硬件设置。 + +å½“æŽ¥æ”¶åˆ°ä¸€ä¸ªä¸æ–时,应该使用irq_find_mapping()函数从hwirqå·ä¸æ‰¾åˆ° +Linux IRQå·ã€‚ + +在调用irq_find_mapping()之å‰ï¼Œè‡³å°‘è¦è°ƒç”¨ä¸€æ¬¡irq_create_mapping()函数, +ä»¥å…æè¿°ç¬¦ä¸èƒ½è¢«åˆ†é…。 + +å¦‚æžœé©±åŠ¨ç¨‹åºæœ‰Linuxçš„IRQå·æˆ–irq_data指针,并且需è¦çŸ¥é“相关的hwirqå·ï¼ˆæ¯” +如在irq_chip回调ä¸ï¼‰ï¼Œé‚£ä¹ˆå¯ä»¥ç›´æŽ¥ä»Žirq_data->hwirqä¸èŽ·å¾—ã€‚ + +irq_domainæ˜ å°„çš„ç±»åž‹ +==================== + +从hwirq到Linux irqçš„å呿˜ å°„æœ‰å‡ ç§æœºåˆ¶ï¼Œæ¯ç§æœºåˆ¶ä½¿ç”¨ä¸åŒçš„分é…函数。应该 +使用哪ç§å呿˜ 射类型å–决于用例。 下é¢ä»‹ç»æ¯ä¸€ç§å呿˜ 射类型: + +çº¿æ€§æ˜ å°„ +-------- + +:: + + irq_domain_add_linear() + irq_domain_create_linear() + +线性å呿˜ 射维护了一个固定大å°çš„表,该表以hwirqå·ä¸ºç´¢å¼•。 当一个hwirqè¢«æ˜ å°„ +时,会给hwirq分é…一个irq_desc,并将irqå·å˜å‚¨åœ¨è¡¨ä¸ã€‚ + +当最大的hwirqå·å›ºå®šä¸”æ•°é‡ç›¸å¯¹è¾ƒå°‘时,线性图是一个很好的选择(~<256)。 è¿™ç§ +æ˜ å°„çš„ä¼˜ç‚¹æ˜¯å›ºå®šæ—¶é—´æŸ¥æ‰¾IRQå·ï¼Œè€Œä¸”irq_descsåªåˆ†é…给在用的IRQ。 缺点是该表 +必须尽å¯èƒ½å¤§çš„hwirqå·ã€‚ + +irq_domain_add_linear()å’Œirq_domain_create_linear()在功能上是ç‰ä»·çš„, +é™¤äº†ç¬¬ä¸€ä¸ªå‚æ•°ä¸åŒ--å‰è€…接å—一个Open Firmware特定的 'struct device_node' 而 +åŽè€…接å—一个更通用的抽象 'struct fwnode_handle' 。 + +å¤§å¤šæ•°é©±åŠ¨åº”è¯¥ä½¿ç”¨çº¿æ€§æ˜ å°„ + +æ ‘çŠ¶æ˜ å°„ +-------- + +:: + + irq_domain_add_tree() + irq_domain_create_tree() + +irq_domain维护ç€ä»Žhwirqå·åˆ°Linux IRQçš„radixçš„æ ‘çŠ¶æ˜ å°„ã€‚ 当一个hwirqè¢«æ˜ å°„æ—¶ï¼Œ +一个irq_desc被分é…,hwirq被用作radixæ ‘çš„æŸ¥æ‰¾é”®ã€‚ + +如果hwirqå·å¯ä»¥éžå¸¸å¤§ï¼Œæ ‘çŠ¶æ˜ å°„æ˜¯ä¸€ä¸ªå¾ˆå¥½çš„é€‰æ‹©ï¼Œå› ä¸ºå®ƒä¸éœ€è¦åˆ†é…一个和最大hwirq +å·ä¸€æ ·å¤§çš„表。 缺点是,hwirq到IRQå·çš„æŸ¥æ‰¾å–å†³äºŽè¡¨ä¸æœ‰å¤šå°‘æ¡ç›®ã€‚ + +irq_domain_add_tree()å’Œirq_domain_create_tree()在功能上是ç‰ä»·çš„,除了第一 +ä¸ªå‚æ•°ä¸åŒâ€”—å‰è€…接å—一个Open Firmware特定的 'struct device_node' ,而åŽè€…æŽ¥å— +一个更通用的抽象 'struct fwnode_handle' 。 + +很少有驱动应该需è¦è¿™ä¸ªæ˜ 射。 + +æ— æ˜ å°„ +------ + +:: + + irq_domain_add_nomap() + +当硬件ä¸çš„hwirqå·æ˜¯å¯ç¼–程的时候,就å¯ä»¥é‡‡ç”¨æ— æ˜ å°„ç±»åž‹ã€‚ åœ¨è¿™ç§æƒ…况下,最好将 +Linux IRQå·ç¼–å…¥ç¡¬ä»¶æœ¬èº«ï¼Œè¿™æ ·å°±ä¸éœ€è¦æ˜ 射了。 调用irq_create_direct_mapping() +会分é…一个Linux IRQå·ï¼Œå¹¶è°ƒç”¨.map()å›žè°ƒï¼Œè¿™æ ·é©±åŠ¨å°±å¯ä»¥å°†Linux IRQå·ç¼–入硬件ä¸ã€‚ + +大多数驱动程åºä¸èƒ½ä½¿ç”¨è¿™ä¸ªæ˜ 射。 + +ä¼ ç»Ÿæ˜ å°„ç±»åž‹ +------------ + +:: + + irq_domain_add_simple() + irq_domain_add_legacy() + irq_domain_add_legacy_isa() + irq_domain_create_simple() + irq_domain_create_legacy() + +ä¼ ç»Ÿæ˜ å°„æ˜¯å·²ç»ä¸º hwirqs 分é…了一系列 irq_descs 的驱动程åºçš„特殊情况。 当驱动程 +åºä¸èƒ½ç«‹å³è½¬æ¢ä¸ºä½¿ç”¨çº¿æ€§æ˜ 射时,就会使用它。 例如,许多嵌入å¼ç³»ç»Ÿæ¿å¡æ”¯æŒæ–‡ä»¶ä½¿ç”¨ +一组用于IRQå·çš„定义(#defineï¼‰ï¼Œè¿™äº›å®šä¹‰è¢«ä¼ é€’ç»™struct设备注册。 åœ¨è¿™ç§æƒ…况下, +ä¸èƒ½åЍæ€åˆ†é…Linux IRQå·ï¼Œåº”è¯¥ä½¿ç”¨ä¼ ç»Ÿæ˜ å°„ã€‚ + +ä¼ ç»Ÿæ˜ å°„å‡è®¾å·²ç»ä¸ºæŽ§åˆ¶å™¨åˆ†é…了一个连ç»çš„IRQå·èŒƒå›´ï¼Œå¹¶ä¸”å¯ä»¥é€šè¿‡å‘hwirqå·æ·»åР䏀 +个固定的åç§»æ¥è®¡ç®—IRQå·ï¼Œå之亦然。 缺点是需è¦ä¸æ–控制器管ç†IRQ分é…,并且需è¦ä¸ºæ¯ +个hwirq分é…一个irq_desc,å³ä½¿å®ƒæ²¡æœ‰è¢«ä½¿ç”¨ã€‚ + +åªæœ‰åœ¨å¿…须支æŒå›ºå®šçš„IRQæ˜ å°„æ—¶ï¼Œæ‰åº”ä½¿ç”¨ä¼ ç»Ÿæ˜ å°„ã€‚ 例如,ISAæŽ§åˆ¶å™¨å°†ä½¿ç”¨ä¼ ç»Ÿæ˜ å°„æ¥ +æ˜ å°„Linux IRQ 0-15ï¼Œè¿™æ ·çŽ°æœ‰çš„ISA驱动程åºå°±èƒ½å¾—到æ£ç¡®çš„IRQå·ã€‚ + +å¤§å¤šæ•°ä½¿ç”¨ä¼ ç»Ÿæ˜ å°„çš„ç”¨æˆ·åº”è¯¥ä½¿ç”¨irq_domain_add_simple()或 +irq_domain_create_simple()ï¼Œåªæœ‰åœ¨ç³»ç»Ÿæä¾›IRQ范围时æ‰ä¼šä½¿ç”¨ä¼ 统域,å¦åˆ™å°†ä½¿ç”¨ +çº¿æ€§åŸŸæ˜ å°„ã€‚è¿™ä¸ªè°ƒç”¨çš„è¯ä¹‰æ˜¯è¿™æ ·çš„:如果指定了一个IRQ范围,那么 æè¿°ç¬¦å°†è¢«å³æ—¶åˆ†é… +给它,如果没有范围被分é…,它将ä¸ä¼šæ‰§è¡Œ irq_domain_add_linear() 或 +irq_domain_create_linear(),这æ„å‘³ç€ *no* irq æè¿°ç¬¦å°†è¢«åˆ†é…。 + +一个简å•域的典型用例是,irqchipä¾›åº”å•†åŒæ—¶æ”¯æŒåЍæ€å’Œé™æ€IRQ分é…。 + +为了é¿å…最终出现使用线性域而没有æè¿°ç¬¦è¢«åˆ†é…的情况,确ä¿ä½¿ç”¨ç®€å•域的驱动程åºåœ¨ä»»ä½• +irq_find_mapping()之å‰è°ƒç”¨irq_create_mapping()是éžå¸¸é‡è¦çš„ï¼Œå› ä¸ºåŽè€…实际上 +å°†ç”¨äºŽé™æ€IRQåˆ†é…æƒ…况。 + +irq_domain_add_simple()å’Œirq_domain_create_simple()ä»¥åŠ +irq_domain_add_legacy()å’Œirq_domain_create_legacy()在功能上是ç‰ä»·çš„ï¼Œåª +æ˜¯ç¬¬ä¸€ä¸ªå‚æ•°ä¸åŒ--å‰è€…接å—Open Firmware特定的 'struct device_node' ,而åŽè€… +接å—一个更通用的抽象 'struct fwnode_handle' 。 + +IRQ域层级结构 +------------- + +在æŸäº›æž¶æž„上,å¯èƒ½æœ‰å¤šä¸ªä¸æ–控制器å‚ä¸Žå°†ä¸€ä¸ªä¸æ–ä»Žè®¾å¤‡ä¼ é€åˆ°ç›®æ ‡CPU。 +让我们æ¥çœ‹çœ‹x86å¹³å°ä¸Šå…¸åž‹çš„䏿–ä¼ é€’è·¯å¾„å§ +:: + + Device --> IOAPIC -> Interrupt remapping Controller -> Local APIC -> CPU + +涉åŠåˆ°çš„䏿–控制器有三个: + +1) IOAPIC 控制器 +2) 䏿–釿˜ 射控制器 +3) Local APIC 控制器 + +为了支æŒè¿™æ ·çš„硬件拓扑结构,使软件架构与硬件架构相匹é…,为æ¯ä¸ªä¸æ–控制器建立一 +个irq_domainæ•°æ®ç»“构,并将这些irq_domain组织æˆå±‚次结构。 + +在建立irq_domain层次结构时,é 近设备的irq_domain为å域,é è¿‘CPUçš„ +irq_domain为父域。所以在上é¢çš„例åä¸ï¼Œå°†å»ºç«‹å¦‚下的层次结构。 +:: + + CPU Vector irq_domain (root irq_domain to manage CPU vectors) + ^ + | + Interrupt Remapping irq_domain (manage irq_remapping entries) + ^ + | + IOAPIC irq_domain (manage IOAPIC delivery entries/pins) + +使用irq_domainå±‚æ¬¡ç»“æž„çš„ä¸»è¦æŽ¥å£æœ‰å››ä¸ª: + +1) irq_domain_alloc_irqs(): 分é…IRQæè¿°ç¬¦å’Œä¸Žä¸æ–æŽ§åˆ¶å™¨ç›¸å…³çš„èµ„æºæ¥ä¼ é€’è¿™äº›ä¸æ–。 +2) irq_domain_free_irqs(): 释放IRQæè¿°ç¬¦å’Œä¸Žè¿™äº›ä¸æ–ç›¸å…³çš„ä¸æ–控制器资æºã€‚ +3) irq_domain_activate_irq(): æ¿€æ´»ä¸æ–æŽ§åˆ¶å™¨ç¡¬ä»¶ä»¥ä¼ é€’ä¸æ–。 +4) irq_domain_deactivate_irq(): åœç”¨ä¸æ–æŽ§åˆ¶å™¨ç¡¬ä»¶ï¼Œåœæ¢ä¼ 递䏿–。 + +为了支æŒirq_domain层次结构,需è¦åšå¦‚下修改: + +1) ä¸€ä¸ªæ–°çš„å—æ®µ 'parent' è¢«æ·»åŠ åˆ°irq_domain结构ä¸ï¼›å®ƒç”¨äºŽç»´æŠ¤irq_domain的层次信æ¯ã€‚ +2) ä¸€ä¸ªæ–°çš„å—æ®µ 'parent_data' è¢«æ·»åŠ åˆ°irq_data结构ä¸ï¼›å®ƒç”¨äºŽå»ºç«‹å±‚次结构irq_data以 + 匹é…irq_domain层次结构。irq_data用于å˜å‚¨irq_domain指针和硬件irqå·ã€‚ +3) æ–°çš„å›žè°ƒè¢«æ·»åŠ åˆ°irq_domain_ops结构ä¸ï¼Œä»¥æ”¯æŒå±‚次结构的irq_domainæ“作。 + +在支æŒåˆ†å±‚irq_domain和分层irq_data准备就绪åŽï¼Œä¸ºæ¯ä¸ªä¸æ–控制器建立一个irq_domain结 +构,并为æ¯ä¸ªä¸ŽIRQ相关è”çš„irq_domain分é…一个irq_data结构。现在我们å¯ä»¥å†è¿›ä¸€æ¥æ”¯æŒå † +æ ˆå¼(层次结构)çš„irq_chip。也就是说,一个irq_chip与层次结构ä¸çš„æ¯ä¸ªirq_data相关è”。 +一个åirq_chipå¯ä»¥è‡ªå·±æˆ–通过与它的父irq_chipåˆä½œæ¥å®žçŽ°ä¸€ä¸ªæ‰€éœ€çš„æ“作。 + +é€šè¿‡å †æ ˆå¼çš„irq_chipï¼Œä¸æ–控制器驱动åªéœ€è¦å¤„ç†è‡ªå·±ç®¡ç†çš„硬件,在需è¦çš„æ—¶å€™å¯ä»¥å‘其父 +irq_chip请求æœåŠ¡ã€‚æ‰€ä»¥æˆ‘ä»¬å¯ä»¥å®žçŽ°æ›´ç®€æ´çš„软件架构。 + +ä¸ºäº†è®©ä¸æ–æŽ§åˆ¶å™¨é©±åŠ¨ç¨‹åºæ”¯æŒirq_domain层次结构,它需è¦åšåˆ°ä»¥ä¸‹å‡ 点: + +1) 实现 irq_domain_ops.alloc å’Œ irq_domain_ops.free +2) å¯é€‰æ‹©åœ°å®žçް irq_domain_ops.activate å’Œ irq_domain_ops.deactivate. +3) å¯é€‰æ‹©åœ°å®žçŽ°ä¸€ä¸ªirq_chipæ¥ç®¡ç†ä¸æ–控制器硬件。 +4) ä¸éœ€è¦å®žçްirq_domain_ops.mapå’Œirq_domain_ops.unmap,它们在层次结构 + irq_domain䏿˜¯ä¸ç”¨çš„。 + +irq_domain层次结构ç»ä¸æ˜¯x86特有的,大é‡ç”¨äºŽæ”¯æŒå…¶ä»–架构,如ARMã€ARM64ç‰ã€‚ + +调试功能 +======== + +打开CONFIG_GENERIC_IRQ_DEBUGFS,å¯è®©IRQå系统的大部分内部结构都在debugfs䏿š´éœ²å‡ºæ¥ã€‚ diff --git a/Documentation/translations/zh_CN/core-api/irq/irqflags-tracing.rst b/Documentation/translations/zh_CN/core-api/irq/irqflags-tracing.rst new file mode 100644 index 0000000000000000000000000000000000000000..c889bd0f65d948d9054c2fc9cbc2f524faaf4582 --- /dev/null +++ b/Documentation/translations/zh_CN/core-api/irq/irqflags-tracing.rst @@ -0,0 +1,45 @@ +.. include:: ../../disclaimer-zh_CN.rst + +:Original: :doc:`../../../../core-api/irq/irqflags-tracing` +:Translator: Yanteng Si <siyanteng@loongson.cn> + +.. _cn_irqflags-tracing.rst: + + +================= +IRQ-flags状æ€è¿½è¸ª +================= + +:Author: 最åˆç”±Ingo Molnar <mingo@redhat.com>开始撰写 + +“irq-flags tracingâ€ï¼ˆä¸æ–æ ‡å¿—è¿½è¸ªï¼‰åŠŸèƒ½å¯ä»¥ “追踪†hardirqå’Œsoftirq的状æ€ï¼Œå®ƒè®© +感兴趣的åç³»ç»Ÿæœ‰æœºä¼šäº†è§£åˆ°åˆ°å†…æ ¸ä¸å‘生的æ¯ä¸€ä¸ª +hardirqs-off/hardirqs-onã€softirqs-off/softirqs-on事件。 + +CONFIG_TRACE_IRQFLAGS_SUPPORT是通用é”è°ƒè¯•ä»£ç æä¾›çš„CONFIG_PROVE_SPIN_LOCKING +å’ŒCONFIG_PROVE_RW_LOCKING所需è¦çš„。å¦åˆ™å°†åªæœ‰CONFIG_PROVE_MUTEX_LOCKINGå’Œ +CONFIG_PROVE_RWSEM_LOCKING在一个架构上被æä¾›--这些都是ä¸åœ¨IRQ上下文ä¸ä½¿ç”¨çš„ +é”API。(rwsems的一个异常是å¯ä»¥è§£å†³çš„) + +架构对这一点的支æŒå½“ç„¶ä¸å±žäºŽâ€œå¾®ä¸è¶³é“â€çš„èŒƒç•´ï¼Œå› ä¸ºå¾ˆå¤šä½Žçº§çš„æ±‡ç¼–ä»£ç 都è¦å¤„ç†irq-flags +的状æ€å˜åŒ–。但是一个架构å¯ä»¥ä»¥ä¸€ç§ç›¸å½“ç›´æŽ¥ä¸”æ— é£Žé™©çš„æ–¹å¼å¯ç”¨irq-flags-tracing。 + +架构如果想支æŒè¿™ä¸ªï¼Œéœ€è¦å…ˆåšä¸€äº›ä»£ç 组织上的改å˜: + +- 在他们的arch级Kconfigæ–‡ä»¶ä¸æ·»åŠ å¹¶å¯ç”¨TRACE_IRQFLAGS_SUPPORT。 + +ç„¶åŽè¿˜éœ€è¦åšä¸€äº›åŠŸèƒ½ä¸Šçš„æ”¹å˜æ¥å®žçް坹irq-flags-tracing的支æŒ: + +- 在低级入å£ä»£ç ä¸å¢žåŠ ï¼ˆæž„å»ºæ¡ä»¶ï¼‰å¯¹trace_hardirqs_off()/trace_hardirqs_on() + 函数的调用。é”验è¯å™¨ä¼šå¯†åˆ‡å…³æ³¨ “realâ€çš„irq-flags是å¦ä¸Ž “virtualâ€çš„irq-flags + 状æ€ç›¸åŒ¹é…,如果两者ä¸åŒ¹é…,则会å‘出è¦å‘Šï¼ˆå¹¶å…³é—自己)。通常维护archä¸ + irq-flags-track的大部分时间都是在这ç§çжæ€ä¸‹åº¦è¿‡çš„:看看lockdepçš„è¦å‘Šï¼Œè¯•ç€ + 找出我们还没有æžå®šçš„æ±‡ç¼–代ç 。修å¤å¹¶é‡å¤ã€‚一旦系统å¯åŠ¨ï¼Œå¹¶ä¸”åœ¨irq-flags跟踪功 + èƒ½ä¸æ²¡æœ‰å‡ºçްlockdepè¦å‘Šçš„æƒ…况下,arch支æŒå°±å®Œæˆäº†ã€‚ + +- 如果该架构有ä¸å¯å±è”½çš„䏿–,那么需è¦é€šè¿‡lockdep_off()/lockdep_on()å°†è¿™äº›ä¸ + æ–从irq跟踪[å’Œé”验è¯]æœºåˆ¶ä¸æŽ’é™¤ã€‚ + + 一般æ¥è¯´ï¼Œåœ¨ä¸€ä¸ªæž¶æž„ä¸ï¼Œä¸å®Œæ•´çš„irq-flags-tracing实现是没有风险的:lockdep + 会检测到这一点,并将自己关é—。å³é”验è¯å™¨ä»ç„¶å¯é 。应该ä¸ä¼šå› 为irq-tracing的错 + 误而崩溃。(除éžé€šè¿‡ä¿®æ”¹ä¸è¯¥ä¿®æ”¹çš„æ¡ä»¶æ¥æ›´æ”¹æ±‡ç¼–或寄å˜å™¨è€Œç ´å其他代ç ) diff --git a/Documentation/translations/zh_CN/cpu-freq/core.rst b/Documentation/translations/zh_CN/cpu-freq/core.rst new file mode 100644 index 0000000000000000000000000000000000000000..19fb9c029cfea60db973046dd704da70a9a098db --- /dev/null +++ b/Documentation/translations/zh_CN/cpu-freq/core.rst @@ -0,0 +1,105 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: :doc:`../../../cpu-freq/core` +:Translator: Yanteng Si <siyanteng@loongson.cn> + +.. _cn_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分é…的表。 diff --git a/Documentation/translations/zh_CN/cpu-freq/cpu-drivers.rst b/Documentation/translations/zh_CN/cpu-freq/cpu-drivers.rst new file mode 100644 index 0000000000000000000000000000000000000000..0ca2cb64666609f534e5c5d932d2c2b3f7b5a0f6 --- /dev/null +++ b/Documentation/translations/zh_CN/cpu-freq/cpu-drivers.rst @@ -0,0 +1,259 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: :doc:`../../../cpu-freq/cpu-drivers` +:Translator: Yanteng Si <siyanteng@loongson.cn> + +.. _cn_cpu-drivers.rst: + + +======================================= +如何实现一个新的CPUFreq处ç†å™¨é©±åŠ¨ç¨‹åºï¼Ÿ +======================================= + +作者: + + + - Dominik Brodowski <linux@brodo.de> + - Rafael J. Wysocki <rafael.j.wysocki@intel.com> + - Viresh Kumar <viresh.kumar@linaro.org> + +.. Contents + + 1. 怎么åšï¼Ÿ + 1.1 åˆå§‹åŒ– + 1.2 Per-CPU åˆå§‹åŒ– + 1.3 éªŒè¯ + 1.4 target/target_index 或 setpolicy? + 1.5 target/target_index + 1.6 setpolicy + 1.7 get_intermediate 与 target_intermediate + 2. 频率表助手 + + + +1. 怎么åšï¼Ÿ +=========== + +如æ¤ï¼Œä½ 刚刚得到了一个全新的CPU/芯片组åŠå…¶æ•°æ®æ‰‹å†Œï¼Œå¹¶å¸Œæœ›ä¸ºè¿™ä¸ªCPU/èŠ¯ç‰‡ç»„æ·»åŠ cpufreq +支æŒï¼Ÿå¾ˆå¥½ï¼Œè¿™é‡Œæœ‰ä¸€äº›è‡³å…³é‡è¦çš„æç¤ºï¼š + + +1.1 åˆå§‹åŒ– +---------- + +首先,在__initcall_level_7 (module_init())或更é åŽçš„å‡½æ•°ä¸æ£€æŸ¥è¿™ä¸ªå†…æ ¸æ˜¯å¦ +è¿è¡Œåœ¨æ£ç¡®çš„CPUå’Œæ£ç¡®çš„芯片组上。如果是,则使用cpufreq_register_driver()å‘ +CPUfreqæ ¸å¿ƒå±‚æ³¨å†Œä¸€ä¸ªcpufreq_driver结构体。 + +结构体cpufreq_driver应该包å«ä»€ä¹ˆæˆå‘˜? + + .name - 驱动的åå—。 + + .init - 一个指å‘per-policyåˆå§‹åŒ–函数的指针。 + + .verify - 一个指å‘"verification"函数的指针。 + + .setpolicy 或 .fast_switch 或 .target 或 .target_index - å·®å¼‚è§ + 下文。 + +并且å¯é€‰æ‹© + + .flags - cpufreqæ ¸çš„æç¤ºã€‚ + + .driver_data - cpufreq驱动程åºçš„特定数æ®ã€‚ + + .resolve_freq - 返回最适åˆç›®æ ‡é¢‘率的频率。ä¸è¿‡å¹¶ä¸èƒ½æ”¹å˜é¢‘率。 + + .get_intermediate å’Œ target_intermediate - 用于在改å˜CPU频率时切æ¢åˆ°ç¨³å®š + 的频率。 + + .get - 返回CPU的当å‰é¢‘率。 + + .bios_limit - 返回HW/BIOS对CPU的最大频率é™åˆ¶å€¼ã€‚ + + .exit - 一个指å‘per-policy清ç†å‡½æ•°çš„æŒ‡é’ˆï¼Œè¯¥å‡½æ•°åœ¨cpuçƒæ’拔过程的CPU_POST_DEAD + 阶段被调用。 + + .stop_cpu - 一个指å‘per-policyåœæ¢å‡½æ•°çš„æŒ‡é’ˆï¼Œè¯¥å‡½æ•°åœ¨cpuçƒæ’拔过程的CPU_DOWN_PREPARE + 阶段被调用。 + + .suspend - 一个指å‘per-policyæš‚åœå‡½æ•°çš„æŒ‡é’ˆï¼Œè¯¥å‡½æ•°åœ¨å…³ä¸æ–且在该ç–ç•¥çš„è°ƒèŠ‚å™¨åœæ¢ + åŽè¢«è°ƒç”¨ã€‚ + + .resume - 一个指å‘per-policyæ¢å¤å‡½æ•°çš„æŒ‡é’ˆï¼Œè¯¥å‡½æ•°åœ¨å…³ä¸æ–且在调节器å†ä¸€æ¬¡å¼€å§‹å‰è¢« + 调用。 + + .ready - 一个指å‘per-policy准备函数的指针,该函数在ç–略完全åˆå§‹åŒ–之åŽè¢«è°ƒç”¨ã€‚ + + .attr - 一个指å‘NULL结尾的"struct freq_attr"列表的指针,该函数å…许导出值到 + sysfs。 + + .boost_enabled - 如果设置,则å¯ç”¨æå‡(boost)频率。 + + .set_boost - 一个指å‘per-policy函数的指针,该函数用æ¥å¼€å¯/关闿å‡(boost)频率功能。 + + +1.2 Per-CPU åˆå§‹åŒ– +------------------ + +æ¯å½“一个新的CPU被注册到设备模型ä¸ï¼Œæˆ–者在cpufreq驱动注册自己之åŽï¼Œå¦‚æžœæ¤CPUçš„cpufreqç– +ç•¥ä¸å˜åœ¨ï¼Œåˆ™ä¼šè°ƒç”¨per-policyçš„åˆå§‹åŒ–函数cpufreq_driver.init。请注æ„,.init()å’Œ.exit()ç¨‹åº +åªå¯¹ç–ç•¥è°ƒç”¨ä¸€æ¬¡ï¼Œè€Œä¸æ˜¯å¯¹ç–略管ç†çš„æ¯ä¸ªCPU调用一次。它需è¦ä¸€ä¸ª ``struct cpufreq_policy +*policy`` ä½œä¸ºå‚æ•°ã€‚现在该怎么åšå‘¢ï¼Ÿ + +如果有必è¦ï¼Œè¯·åœ¨ä½ çš„CPU上激活CPUfreq功能支æŒã€‚ + +ç„¶åŽï¼Œé©±åŠ¨ç¨‹åºå¿…须填写以下数值: + ++-----------------------------------+--------------------------------------+ +|policy->cpuinfo.min_freq å’Œ | | +|policy->cpuinfo.max_freq | 该CPU支æŒçš„æœ€ä½Žå’Œæœ€é«˜é¢‘率(kHz) | +| | | +| | | ++-----------------------------------+--------------------------------------+ +|policy->cpuinfo.transition_latency | | +| | CPUåœ¨ä¸¤ä¸ªé¢‘çŽ‡ä¹‹é—´åˆ‡æ¢æ‰€éœ€çš„æ—¶é—´ï¼Œä»¥ | +| | 纳秒为å•ä½ï¼ˆå¦‚适用,å¦åˆ™æŒ‡å®š | +| | CPUFREQ_ETERNAL) | ++-----------------------------------+--------------------------------------+ +|policy->cur | 该CPU当å‰çš„工作频率(如适用) | +| | | ++-----------------------------------+--------------------------------------+ +|policy->min, | | +|policy->max, | | +|policy->policy and, if necessary, | | +|policy->governor | 必须包å«è¯¥cpuçš„ “默认ç–ç•¥â€ã€‚ç¨åŽ | +| | 会用这些值调用 | +| | cpufreq_driver.verify and either | +| | cpufreq_driver.setpolicy or | +| | cpufreq_driver.target/target_index | +| | | ++-----------------------------------+--------------------------------------+ +|policy->cpus | 用与这个CPU一起åšDVFSçš„(在线+离线) | +| | CPU(å³ä¸Žå®ƒå…±äº«æ—¶é’Ÿ/电压轨)çš„æŽ©ç æ›´æ–° | +| | 这个 | +| | | ++-----------------------------------+--------------------------------------+ + +对于设置其ä¸çš„一些值(cpuinfo.min[max]_freq, policy->min[max]),频率表助手å¯èƒ½ä¼šæœ‰å¸® +助。关于它们的更多信æ¯ï¼Œè¯·å‚è§ç¬¬2节。 + + +1.3 éªŒè¯ +-------- + +当用户决定设置一个新的ç–ç•¥(ç”± “policy,governor,min,max组æˆâ€)时,必须对这个ç–略进行验è¯ï¼Œ +ä»¥ä¾¿çº æ£ä¸å…¼å®¹çš„值。为了验è¯è¿™äº›å€¼ï¼Œcpufreq_verify_within_limits(``struct cpufreq_policy +*policy``, ``unsigned int min_freq``, ``unsigned int max_freq``)函数å¯èƒ½ä¼šæœ‰å¸®åŠ©ã€‚ +关于频率表助手的详细内容请å‚è§ç¬¬2节。 + +您需è¦ç¡®ä¿è‡³å°‘有一个有效频率(或工作范围)在 policy->min å’Œ policy->max 范围内。如果有必 +è¦ï¼Œå…ˆå¢žåŠ policy->maxï¼Œåªæœ‰åœ¨æ²¡æœ‰åŠžæ³•çš„æƒ…å†µä¸‹ï¼Œæ‰å‡å°‘policy->min。 + + +1.4 target 或 target_index 或 setpolicy 或 fast_switch? +------------------------------------------------------- + +大多数cpufreq驱动甚至大多数cpu频率å‡é™ç®—法åªå…许将CPUé¢‘çŽ‡è®¾ç½®ä¸ºé¢„å®šä¹‰çš„å›ºå®šå€¼ã€‚å¯¹äºŽè¿™äº›ï¼Œä½ +å¯ä»¥ä½¿ç”¨->target(),->target_index()或->fast_switch()回调。 + +有些cpufreq功能的处ç†å™¨å¯ä»¥è‡ªå·±åœ¨æŸäº›é™åˆ¶ä¹‹é—´åˆ‡æ¢é¢‘率。这些应使用->setpolicy()回调。 + + +1.5. target/target_index +------------------------ + +target_indexè°ƒç”¨æœ‰ä¸¤ä¸ªå‚æ•°ï¼š``struct cpufreq_policy * policy``å’Œ``unsigned int`` +索引(于列出的频率表)。 + +当调用这里时,CPUfreq驱动必须设置新的频率。实际频率必须由freq_table[index].frequency决定。 + +它应该总是在错误的情况下æ¢å¤åˆ°ä¹‹å‰çš„频率(å³policy->restore_freq),å³ä½¿æˆ‘们之å‰åˆ‡æ¢åˆ°ä¸é—´é¢‘率。 + +已弃用 +---------- +ç›®æ ‡è°ƒç”¨æœ‰ä¸‰ä¸ªå‚æ•°ã€‚``struct cpufreq_policy * policy``, unsigned int target_frequency, +unsigned int relation. + +CPUfreq驱动在调用这里时必须设置新的频率。实际的频率必须使用以下规则æ¥ç¡®å®šã€‚ + +- ç´§è·Ÿ "ç›®æ ‡é¢‘çŽ‡"。 +- policy->min <= new_freq <= policy->max (这必须是有效的!!!) +- 如果 relation==CPUFREQ_REL_L,å°è¯•选择一个高于或ç‰äºŽ target_freq çš„ new_freq。("L代表 + 最低,但ä¸èƒ½ä½ŽäºŽ") +- 如果 relation==CPUFREQ_REL_H,å°è¯•选择一个低于或ç‰äºŽ target_freq çš„ new_freq。("H代表 + 最高,但ä¸èƒ½é«˜äºŽ") + +这里,频率表助手å¯èƒ½ä¼šå¸®åŠ©ä½ --详è§ç¬¬2节。 + +1.6. fast_switch +---------------- + +这个函数用于从调度器的上下文进行频率切æ¢ã€‚å¹¶éžæ‰€æœ‰çš„驱动都è¦å®žçŽ°å®ƒï¼Œå› ä¸ºä¸å…许在这个回调ä¸ç¡çœ 。这 +个回调必须ç»è¿‡é«˜åº¦ä¼˜åŒ–,以尽å¯èƒ½å¿«åœ°è¿›è¡Œåˆ‡æ¢ã€‚ + +è¿™ä¸ªå‡½æ•°æœ‰ä¸¤ä¸ªå‚æ•°ï¼š ``struct cpufreq_policy *policy`` å’Œ ``unsigned int target_frequency``。 + + +1.7 setpolicy +------------- + +setpolicy调用åªéœ€è¦ä¸€ä¸ª``struct cpufreq_policy * policy``ä½œä¸ºå‚æ•°ã€‚需è¦å°†å¤„ç†å™¨å†…或芯片组内动æ€é¢‘ +率切æ¢çš„下é™è®¾ç½®ä¸ºpolicy->min,上é™è®¾ç½®ä¸ºpolicy->max,如果支æŒçš„è¯ï¼Œå½“policy->policy为 +CPUFREQ_POLICY_PERFORMANCE时选择é¢å‘性能的设置,当CPUFREQ_POLICY_POWERSAVE时选择é¢å‘çœç”µçš„设置。 +也å¯ä»¥æŸ¥çœ‹drivers/cpufreq/longrun.cä¸çš„å‚考实现。 + +1.8 get_intermediate å’Œ target_intermediate +-------------------------------------------- + +仅适用于 target_index() å’Œ CPUFREQ_ASYNC_NOTIFICATION 未设置的驱动。 + +get_intermediateåº”è¯¥è¿”å›žä¸€ä¸ªå¹³å°æƒ³è¦åˆ‡æ¢åˆ°çš„稳定的ä¸é—´é¢‘率,target_intermediate()应该将CPU设置为 +该频率,然åŽå†è·³è½¬åˆ°'index'å¯¹åº”çš„é¢‘çŽ‡ã€‚æ ¸å¿ƒä¼šè´Ÿè´£å‘é€é€šçŸ¥ï¼Œé©±åЍä¸å¿…在target_intermediate()或 +target_index()ä¸å¤„ç†ã€‚ + +在驱动程åºä¸æƒ³å› 为æŸä¸ªç›®æ ‡é¢‘率切æ¢åˆ°ä¸é—´é¢‘率的情况下,它们å¯ä»¥ä»Žget_intermediate()ä¸è¿”回'0'ã€‚åœ¨è¿™ç§æƒ…况 +ä¸‹ï¼Œæ ¸å¿ƒå°†ç›´æŽ¥è°ƒç”¨->target_index()。 + +注æ„:->target_index()应该在失败的情况下æ¢å¤åˆ°policy->restore_freqï¼Œå› ä¸ºcore会为æ¤å‘é€é€šçŸ¥ã€‚ + + +2. 频率表助手 +============= + +由于大多数cpufreq处ç†å™¨åªå…è®¸è¢«è®¾ç½®ä¸ºå‡ ä¸ªç‰¹å®šçš„é¢‘çŽ‡ï¼Œå› æ¤ï¼Œä¸€ä¸ªå¸¦æœ‰ä¸€äº›å‡½æ•°çš„ “频率表â€å¯èƒ½ä¼šè¾…助处ç†å™¨é©±åЍ +程åºçš„ä¸€äº›å·¥ä½œã€‚è¿™æ ·çš„ "频率表" 由一个cpufreq_frequency_tableæ¡ç›®æž„æˆçš„æ•°ç»„组æˆï¼Œ"driver_data" ä¸åŒ… +å«äº†é©±åŠ¨ç¨‹åºçš„具体数值,"frequency" ä¸åŒ…å«äº†ç›¸åº”çš„é¢‘çŽ‡ï¼Œå¹¶è®¾ç½®äº†æ ‡å¿—ã€‚åœ¨è¡¨çš„æœ€åŽï¼Œéœ€è¦æ·»åŠ ä¸€ä¸ª +cpufreq_frequency_tableæ¡ç›®ï¼Œé¢‘率设置为CPUFREQ_TABLE_END。而如果想跳过表ä¸çš„一个æ¡ç›®ï¼Œåˆ™å°†é¢‘率设置为 +CPUFREQ_ENTRY_INVALID。这些æ¡ç›®ä¸éœ€è¦æŒ‰ç…§ä»»ä½•ç‰¹å®šçš„é¡ºåºæŽ’åºï¼Œä½†å¦‚果它们是cpufreq æ ¸å¿ƒä¼šå¯¹å®ƒä»¬è¿›è¡Œå¿«é€Ÿçš„DVFS, +å› ä¸ºæœç´¢æœ€ä½³åŒ¹é…会更快。 + +如果ç–略在其policy->freq_tableå—æ®µä¸åŒ…å«ä¸€ä¸ªæœ‰æ•ˆçš„æŒ‡é’ˆï¼Œcpufreqè¡¨å°±ä¼šè¢«æ ¸å¿ƒè‡ªåŠ¨éªŒè¯ã€‚ + +cpufreq_frequency_table_verify()ä¿è¯è‡³å°‘有一个有效的频率在policy->minå’Œpolicy->max范围内,并且所有其他 +æ ‡å‡†éƒ½è¢«æ»¡è¶³ã€‚è¿™å¯¹->verify调用很有帮助。 + +cpufreq_frequency_table_target()是对应于->target阶段的频率表助手。åªè¦æŠŠæ•°å€¼ä¼ 递给这个函数,这个函数就会返 +回包å«CPUè¦è®¾ç½®çš„频率的频率表æ¡ç›®ã€‚ + +以下å®å¯ä»¥ä½œä¸ºcpufreq_frequency_tableçš„è¿ä»£å™¨ã€‚ + +cpufreq_for_each_entry(pos, table) - é历频率表的所有æ¡ç›®ã€‚ + +cpufreq_for_each_valid_entry(pos, table) - 该函数é历所有æ¡ç›®ï¼Œä¸åŒ…括CPUFREQ_ENTRY_INVALID频率。 +ä½¿ç”¨å‚æ•° "pos"-一个``cpufreq_frequency_table * `` 作为循环å˜é‡ï¼Œä½¿ç”¨å‚æ•° "table"-ä½œä¸ºä½ æƒ³è¿ä»£ +çš„``cpufreq_frequency_table * `` 。 + +例如:: + + struct cpufreq_frequency_table *pos, *driver_freq_table; + + cpufreq_for_each_entry(pos, driver_freq_table) { + /* Do something with pos */ + pos->frequency = ... + } + +å¦‚æžœä½ éœ€è¦åœ¨driver_freq_tableä¸å¤„ç†posçš„ä½ç½®ï¼Œä¸è¦å‡åŽ»æŒ‡é’ˆï¼Œå› ä¸ºå®ƒçš„ä»£ä»·ç›¸å½“é«˜ã€‚ç›¸åï¼Œä½¿ç”¨å® +cpufreq_for_each_entry_idx() å’Œ cpufreq_for_each_valid_entry_idx() 。 diff --git a/Documentation/translations/zh_CN/cpu-freq/cpufreq-stats.rst b/Documentation/translations/zh_CN/cpu-freq/cpufreq-stats.rst new file mode 100644 index 0000000000000000000000000000000000000000..c90d1d8353ed23af62424b413bf289b3c561b9ef --- /dev/null +++ b/Documentation/translations/zh_CN/cpu-freq/cpufreq-stats.rst @@ -0,0 +1,130 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: :doc:`../../../cpu-freq/cpufreq-stats` +:Translator: Yanteng Si <siyanteng@loongson.cn> + +.. _cn_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频率统计。 diff --git a/Documentation/translations/zh_CN/cpu-freq/index.rst b/Documentation/translations/zh_CN/cpu-freq/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..65074e2119403c1a44ee881e48cbcfbfdd23e533 --- /dev/null +++ b/Documentation/translations/zh_CN/cpu-freq/index.rst @@ -0,0 +1,45 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: :doc:`../../../cpu-freq/index` +:Translator: Yanteng Si <siyanteng@loongson.cn> + +.. _cn_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 diff --git a/Documentation/translations/zh_CN/dev-tools/gcov.rst b/Documentation/translations/zh_CN/dev-tools/gcov.rst new file mode 100644 index 0000000000000000000000000000000000000000..3158c9da13185a8af67f26f310fece231524418b --- /dev/null +++ b/Documentation/translations/zh_CN/dev-tools/gcov.rst @@ -0,0 +1,264 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/dev-tools/gcov.rst +:Translator: 赵军奎 Bernard Zhao <bernard@vivo.com> + +在Linuxå†…æ ¸é‡Œä½¿ç”¨gcovåšä»£ç 覆盖率检查 +===================================== + +gcovåˆ†æžæ ¸å¿ƒæ”¯æŒåœ¨Linuxå†…æ ¸ä¸å¯ç”¨GCC的覆盖率测试工具 gcov_ ,Linuxå†…æ ¸ +è¿è¡Œæ—¶çš„代ç 覆盖率数æ®ä¼šä»¥gcovå…¼å®¹çš„æ ¼å¼å¯¼å‡ºåˆ°â€œgcovâ€debugfs目录ä¸ï¼Œå¯ +以通过gcovçš„ ``-o`` 选项(如下示例)获得指定文件的代ç è¿è¡Œè¦†ç›–çŽ‡ç»Ÿè®¡æ•°æ® +(需è¦è·³è½¬åˆ°å†…æ ¸ç¼–è¯‘è·¯å¾„ä¸‹å¹¶ä¸”è¦æœ‰rootæƒé™ï¼‰:: + + # cd /tmp/linux-out + # gcov -o /sys/kernel/debug/gcov/tmp/linux-out/kernel spinlock.c + +这将在当å‰ç›®å½•ä¸åˆ›å»ºå¸¦æœ‰æ‰§è¡Œè®¡æ•°æ³¨é‡Šçš„æºä»£ç æ–‡ä»¶ã€‚ +在获得这些统计文件åŽï¼Œå¯ä»¥ä½¿ç”¨å›¾å½¢åŒ–çš„gcovå‰ç«¯å·¥å…·ï¼ˆæ¯”如 lcov_ ),æ¥å®žçް +自动化处ç†Linuxå†…æ ¸çš„è¦†ç›–çŽ‡è¿è¡Œæ•°æ®ï¼ŒåŒæ—¶ç”Ÿæˆæ˜“于阅读的HTMLæ ¼å¼æ–‡ä»¶ã€‚ + +å¯èƒ½çš„用途: + +* 调试(用æ¥åˆ¤æ–æ¯ä¸€è¡Œçš„ä»£ç æ˜¯å¦å·²ç»è¿è¡Œè¿‡ï¼‰ +* 测试改进(如何修改测试代ç ,尽å¯èƒ½åœ°è¦†ç›–到没有è¿è¡Œè¿‡çš„代ç ) +* å†…æ ¸æœ€å°åŒ–é…置(对于æŸä¸€ä¸ªé€‰é¡¹é…置,如果关è”的代ç ä»Žæ¥æ²¡æœ‰è¿è¡Œè¿‡ï¼Œ + 是å¦è¿˜éœ€è¦è¿™ä¸ªé…置) + +.. _gcov: https://gcc.gnu.org/onlinedocs/gcc/Gcov.html +.. _lcov: http://ltp.sourceforge.net/coverage/lcov.php + + +准备 +---- + +å†…æ ¸æ‰“å¼€å¦‚ä¸‹é…ç½®:: + + CONFIG_DEBUG_FS=y + CONFIG_GCOV_KERNEL=y + +èŽ·å–æ•´ä¸ªå†…æ ¸çš„è¦†ç›–çŽ‡æ•°æ®ï¼Œè¿˜éœ€è¦æ‰“å¼€:: + + CONFIG_GCOV_PROFILE_ALL=y + +éœ€è¦æ³¨æ„çš„æ˜¯ï¼Œæ•´ä¸ªå†…æ ¸å¼€å¯è¦†ç›–çŽ‡ç»Ÿè®¡ä¼šé€ æˆå†…æ ¸é•œåƒæ–‡ä»¶å°ºå¯¸çš„增大, +åŒæ—¶å†…æ ¸è¿è¡Œä¹Ÿä¼šå˜æ…¢ä¸€äº›ã€‚ +å¦å¤–ï¼Œå¹¶ä¸æ˜¯æ‰€æœ‰çš„æž¶æž„éƒ½æ”¯æŒæ•´ä¸ªå†…æ ¸å¼€å¯è¦†ç›–率统计。 + +代ç è¿è¡Œè¦†ç›–率数æ®åªåœ¨debugfs挂载完æˆåŽæ‰å¯ä»¥è®¿é—®:: + + mount -t debugfs none /sys/kernel/debug + + +定制化 +------ + +如果è¦å•独针对æŸä¸€ä¸ªè·¯å¾„或者文件进行代ç 覆盖率统计,å¯ä»¥åœ¨å†…æ ¸ç›¸åº”è·¯ +径的Makefileä¸å¢žåŠ å¦‚ä¸‹çš„é…ç½®: + +- å•独统计å•个文件(例如main.o):: + + GCOV_PROFILE_main.o := y + +- å•独统计æŸä¸€ä¸ªè·¯å¾„:: + + GCOV_PROFILE := y + +如果è¦åœ¨æ•´ä¸ªå†…æ ¸çš„è¦†ç›–çŽ‡ç»Ÿè®¡ï¼ˆå¼€å¯CONFIG_GCOV_PROFILE_ALL)ä¸å•独排除 +æŸä¸€ä¸ªæ–‡ä»¶æˆ–者路径,å¯ä»¥ä½¿ç”¨å¦‚下的方法:: + + GCOV_PROFILE_main.o := n + +å’Œ:: + + GCOV_PROFILE := n + +æ¤æœºåˆ¶ä»…支æŒé“¾æŽ¥åˆ°å†…æ ¸é•œåƒæˆ–ç¼–è¯‘ä¸ºå†…æ ¸æ¨¡å—的文件。 + + +相关文件 +-------- + +gcov功能需è¦åœ¨debugfsä¸åˆ›å»ºå¦‚下文件: + +``/sys/kernel/debug/gcov`` + gcovç›¸å…³åŠŸèƒ½çš„æ ¹è·¯å¾„ + +``/sys/kernel/debug/gcov/reset`` + 全局å¤ä½æ–‡ä»¶:å‘该文件写入数æ®åŽä¼šå°†æ‰€æœ‰çš„gcovç»Ÿè®¡æ•°æ®æ¸…0 + +``/sys/kernel/debug/gcov/path/to/compile/dir/file.gcda`` + gcov工具å¯ä»¥è¯†åˆ«çš„è¦†ç›–çŽ‡ç»Ÿè®¡æ•°æ®æ–‡ä»¶ï¼Œå‘该文件写入数æ®åŽ + 会将本文件的gcovç»Ÿè®¡æ•°æ®æ¸…0 + +``/sys/kernel/debug/gcov/path/to/compile/dir/file.gcno`` + gcov工具需è¦çš„软连接文件(指å‘编译时生æˆçš„ä¿¡æ¯ç»Ÿè®¡æ–‡ä»¶ï¼‰ï¼Œè¿™ä¸ªæ–‡ä»¶æ˜¯ + 在gcc编译时如果é…置了选项 ``-ftest-coverage`` 时生æˆçš„。 + + +针对模å—的统计 +-------------- + +å†…æ ¸ä¸çš„æ¨¡å—会动æ€çš„åŠ è½½å’Œå¸è½½ï¼Œæ¨¡å—å¸è½½æ—¶å¯¹åº”的数æ®ä¼šè¢«æ¸…除掉。 +gcovæä¾›äº†ä¸€ç§æœºåˆ¶ï¼Œé€šè¿‡ä¿ç•™ç›¸å…³æ•°æ®çš„å‰¯æœ¬æ¥æ”¶é›†è¿™éƒ¨åˆ†å¸è½½æ¨¡å—的覆盖率数æ®ã€‚ +模å—å¸è½½åŽè¿™äº›å¤‡ä»½æ•°æ®åœ¨debugfsä¸ä¼šç»§ç»å˜åœ¨ã€‚ +一旦这个模å—釿–°åŠ è½½ï¼Œæ¨¡å—å…³è”çš„è¿è¡Œç»Ÿè®¡ä¼šè¢«åˆå§‹åŒ–æˆdebugfsä¸å¤‡ä»½çš„æ•°æ®ã€‚ + +å¯ä»¥é€šè¿‡å¯¹å†…æ ¸å‚æ•°gcov_persist的修改æ¥åœç”¨gcov对模å—的备份机制:: + + gcov_persist = 0 + +在è¿è¡Œæ—¶ï¼Œç”¨æˆ·è¿˜å¯ä»¥é€šè¿‡å†™å…¥æ¨¡å—çš„æ•°æ®æ–‡ä»¶æˆ–者写入gcovå¤ä½æ–‡ä»¶æ¥ä¸¢å¼ƒå·²å¸ +载模å—的数æ®ã€‚ + + +编译机和测试机分离 +------------------ + +gcovçš„å†…æ ¸åˆ†æžæ’桩支æŒå†…æ ¸çš„ç¼–è¯‘å’Œè¿è¡Œæ˜¯åœ¨åŒä¸€å°æœºå™¨ä¸Šï¼Œä¹Ÿå¯ä»¥ç¼–è¯‘å’Œè¿ +行是在ä¸åŒçš„æœºå™¨ä¸Šã€‚ +å¦‚æžœå†…æ ¸ç¼–è¯‘å’Œè¿è¡Œæ˜¯ä¸åŒçš„æœºå™¨ï¼Œé‚£ä¹ˆéœ€è¦é¢å¤–的准备工作,这å–决于gcov工具 +是在哪里使用的: + +.. _gcov-test_zh: + +a) è‹¥gcovè¿è¡Œåœ¨æµ‹è¯•机上 + + 测试机上é¢gcov工具的版本必须è¦è·Ÿå†…æ ¸ç¼–è¯‘æœºå™¨ä½¿ç”¨çš„gcc版本相兼容, + åŒæ—¶ä¸‹é¢çš„æ–‡ä»¶è¦ä»Žç¼–译机拷è´åˆ°æµ‹è¯•机上: + + 从æºä»£ç ä¸: + - 所有的C文件和头文件 + + 从编译目录ä¸: + - 所有的C文件和头文件 + - 所有的.gcda文件和.gcno文件 + - 所有目录的链接 + + ç‰¹åˆ«éœ€è¦æ³¨æ„,测试机器上é¢çš„目录结构跟编译机器上é¢çš„目录机构必须 + 完全一致。 + å¦‚æžœæ–‡ä»¶æ˜¯è½¯é“¾æŽ¥ï¼Œéœ€è¦æ›¿æ¢æˆçœŸæ£çš„目录文件(这是由make的当å‰å·¥ä½œ + 目录å˜é‡CURDIR引起的)。 + +.. _gcov-build_zh: + +b) è‹¥gcovè¿è¡Œåœ¨ç¼–译机上 + + 测试用例è¿è¡Œç»“æŸåŽï¼Œå¦‚下的文件需è¦ä»Žæµ‹è¯•æœºä¸æ‹·è´åˆ°ç¼–译机上: + + 从sysfsä¸çš„gcov目录ä¸: + - 所有的.gcda文件 + - 所有的.gcno文件软链接 + + 这些文件å¯ä»¥æ‹·è´åˆ°ç¼–译机的任æ„目录下,gcov使用-o选项指定拷è´çš„ + 目录。 + + 比如一个是示例的目录结构如下:: + + /tmp/linux: å†…æ ¸æºç 目录 + /tmp/out: å†…æ ¸ç¼–è¯‘æ–‡ä»¶è·¯å¾„ï¼ˆmake O=指定) + /tmp/coverage: ä»Žæµ‹è¯•æœºå™¨ä¸Šé¢æ‹·è´çš„æ•°æ®æ–‡ä»¶è·¯å¾„ + + [user@build] cd /tmp/out + [user@build] gcov -o /tmp/coverage/tmp/out/init main.c + + +关于编译器的注æ„事项 +-------------------- + +GCCå’ŒLLVM gcov工具ä¸ä¸€å®šå…¼å®¹ã€‚ +如果编译器是GCC,使用 gcov_ æ¥å¤„ç†.gcnoå’Œ.gcda文件,如果是Clang编译器, +则使用 llvm-cov_ 。 + +.. _gcov: https://gcc.gnu.org/onlinedocs/gcc/Gcov.html +.. _llvm-cov: https://llvm.org/docs/CommandGuide/llvm-cov.html + +GCCå’ŒClang gcov之间的版本差异由Kconfig处ç†çš„。 +kconfigä¼šæ ¹æ®ç¼–译工具链的检查自动选择åˆé€‚çš„gcovæ ¼å¼ã€‚ + +é—®é¢˜å®šä½ +-------- + +å¯èƒ½å‡ºçŽ°çš„é—®é¢˜1 + ç¼–è¯‘åˆ°é“¾æŽ¥é˜¶æ®µæŠ¥é”™ç»ˆæ¢ + +é—®é¢˜åŽŸå› + åˆ†æžæ ‡å¿—æŒ‡å®šåœ¨äº†æºæ–‡ä»¶ä½†æ˜¯æ²¡æœ‰é“¾æŽ¥åˆ°ä¸»å†…æ ¸ï¼Œæˆ–è€…å®¢åˆ¶åŒ–äº†é“¾æŽ¥ç¨‹åº + +解决方法 + 通过在相应的Makefileä¸ä½¿ç”¨ ``GCOV_PROFILE := n`` + 或者 ``GCOV_PROFILE_basename.o := n`` æ¥å°†é“¾æŽ¥æŠ¥é”™çš„æ–‡ä»¶æŽ’除掉 + +å¯èƒ½å‡ºçŽ°çš„é—®é¢˜2 + 从sysfså¤åˆ¶çš„æ–‡ä»¶æ˜¾ç¤ºä¸ºç©ºæˆ–ä¸å®Œæ•´ + +é—®é¢˜åŽŸå› + 由于seq_file的工作方å¼ï¼ŒæŸäº›å·¥å…·ï¼ˆä¾‹å¦‚cp或tar)å¯èƒ½æ— 法æ£ç¡®åœ°ä»Ž + sysfså¤åˆ¶æ–‡ä»¶ã€‚ + +解决方法 + 使用 ``cat`` è¯»å– ``.gcda`` 文件,使用 ``cp -d`` å¤åˆ¶é“¾æŽ¥ï¼Œæˆ–者使用附录B + 䏿‰€ç¤ºçš„æœºåˆ¶ã€‚ + + +附录A:collect_on_build.sh +-------------------------- + +用于在编译机上收集覆盖率元文件的示例脚本 +ï¼ˆè§ :ref:`编译机和测试机分离 a. <gcov-test_zh>` ) + +.. code-block:: sh + + #!/bin/bash + + KSRC=$1 + KOBJ=$2 + DEST=$3 + + if [ -z "$KSRC" ] || [ -z "$KOBJ" ] || [ -z "$DEST" ]; then + echo "Usage: $0 <ksrc directory> <kobj directory> <output.tar.gz>" >&2 + exit 1 + fi + + KSRC=$(cd $KSRC; printf "all:\n\t@echo \${CURDIR}\n" | make -f -) + KOBJ=$(cd $KOBJ; printf "all:\n\t@echo \${CURDIR}\n" | make -f -) + + find $KSRC $KOBJ \( -name '*.gcno' -o -name '*.[ch]' -o -type l \) -a \ + -perm /u+r,g+r | tar cfz $DEST -P -T - + + if [ $? -eq 0 ] ; then + echo "$DEST successfully created, copy to test system and unpack with:" + echo " tar xfz $DEST -P" + else + echo "Could not create file $DEST" + fi + + +附录B:collect_on_test.sh +------------------------- + +ç”¨äºŽåœ¨æµ‹è¯•æœºä¸Šæ”¶é›†è¦†ç›–çŽ‡æ•°æ®æ–‡ä»¶çš„示例脚本 +ï¼ˆè§ :ref:`编译机和测试机分离 b. <gcov-build_zh>` ) + +.. code-block:: sh + + #!/bin/bash -e + + DEST=$1 + GCDA=/sys/kernel/debug/gcov + + if [ -z "$DEST" ] ; then + echo "Usage: $0 <output.tar.gz>" >&2 + exit 1 + fi + + TEMPDIR=$(mktemp -d) + echo Collecting data.. + find $GCDA -type d -exec mkdir -p $TEMPDIR/\{\} \; + find $GCDA -name '*.gcda' -exec sh -c 'cat < $0 > '$TEMPDIR'/$0' {} \; + find $GCDA -name '*.gcno' -exec sh -c 'cp -d $0 '$TEMPDIR'/$0' {} \; + tar czf $DEST -C $TEMPDIR sys + rm -rf $TEMPDIR + + echo "$DEST successfully created, copy to build system and unpack with:" + echo " tar xfz $DEST" diff --git a/Documentation/translations/zh_CN/dev-tools/index.rst b/Documentation/translations/zh_CN/dev-tools/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..fd73c479917b259a198697baaa7b6fcbead91701 --- /dev/null +++ b/Documentation/translations/zh_CN/dev-tools/index.rst @@ -0,0 +1,35 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/dev-tools/index.rst +:Translator: 赵军奎 Bernard Zhao <bernard@vivo.com> + +============ +å†…æ ¸å¼€å‘工具 +============ + +æœ¬æ–‡æ¡£æ˜¯æœ‰å…³å†…æ ¸å¼€å‘工具文档的åˆé›†ã€‚ +ç›®å‰è¿™äº›æ–‡æ¡£å·²ç»æ•´ç†åœ¨ä¸€èµ·ï¼Œä¸éœ€è¦å†èŠ±è´¹é¢å¤–的精力。 +欢迎任何补ä¸ã€‚ + +.. class:: toc-title + + 目录 + +.. toctree:: + :maxdepth: 2 + + gcov + +Todolist: + + - coccinelle + - sparse + - kcov + - kasan + - ubsan + - kmemleak + - kcsan + - gdb-kernel-debugging + - kgdb + - kselftest + - kunit/index diff --git a/Documentation/translations/zh_CN/disclaimer-zh_CN.rst b/Documentation/translations/zh_CN/disclaimer-zh_CN.rst index dcf803ede85a180511761c8866f9dcc7c43377fa..3c6db094a63ca2f33406066058685dd75e589a20 100644 --- a/Documentation/translations/zh_CN/disclaimer-zh_CN.rst +++ b/Documentation/translations/zh_CN/disclaimer-zh_CN.rst @@ -6,4 +6,4 @@ .. note:: 如果您å‘现本文档与原始文件有任何ä¸åŒæˆ–者有翻译问题,请è”系该文件的译者, - 或者请求时奎亮的帮助:<alex.shi@linux.alibaba.com>。 + 或者请求时奎亮的帮助:<alexs@kernel.org>。 diff --git a/Documentation/translations/zh_CN/doc-guide/contributing.rst b/Documentation/translations/zh_CN/doc-guide/contributing.rst new file mode 100644 index 0000000000000000000000000000000000000000..394a13b438b0f907f0d1a4c6f293f2295bae51a4 --- /dev/null +++ b/Documentation/translations/zh_CN/doc-guide/contributing.rst @@ -0,0 +1,238 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/doc-guide/contributing.rst + +:译者: å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> + +å¦‚ä½•å¸®åŠ©æ”¹è¿›å†…æ ¸æ–‡æ¡£ +==================== + +在任何软件开å‘项目ä¸ï¼Œæ–‡æ¡£éƒ½æ˜¯é‡è¦ç»„æˆéƒ¨åˆ†ã€‚好的文档有助于引入新的开å‘人员, +并帮助已有的开å‘人员更有效地工作。如果缺少高质é‡çš„æ–‡æ¡£ï¼Œå¤§é‡çš„æ—¶é—´å°±ä¼šæµªè´¹åœ¨ +代ç 的逆å‘工程和犯本å¯é¿å…的错误上。 + +ä¸å¹¸çš„æ˜¯ï¼Œå†…æ ¸çš„æ–‡æ¡£ç›®å‰è¿œè¿œä¸èƒ½æ»¡è¶³æ”¯æŒå¦‚æ¤è§„模和é‡è¦æ€§çš„项目的需è¦ã€‚ + +本指å—适用于希望帮助改善这ç§çŠ¶å†µçš„è´¡çŒ®è€…ã€‚å†…æ ¸æ–‡æ¡£çš„æ”¹è¿›å¯ä»¥ç”±å¼€å‘者在ä¸åŒçš„ +技能层级上进行;这也是一æ¡ç›¸å¯¹ç®€å•å¯ä»¥å¸®åŠ©æ‚¨äº†è§£å†…æ ¸è¿‡ç¨‹å¹¶åœ¨ç¤¾åŒºä¸æ‰¾åˆ°ä¸€å¸ä¹‹ +地的路径。下é¢çš„大部分内容是文档维护人员列出的最迫切需è¦å®Œæˆçš„任务。 + +文档待办事项列表 +---------------- + +为了使我们的文档达到应有的水平,需è¦å®Œæˆçš„任务数ä¸èƒœæ•°ã€‚æ¤åˆ—表包å«è®¸å¤šé‡è¦çš„ +项目,但还远远ä¸å¤Ÿè¯¦å°½ï¼›å¦‚æžœæ‚¨çŸ¥é“æ”¹è¿›æ–‡æ¡£çš„其他方法,请ä¸è¦ç¾žäºŽå¯é½¿ã€‚ + +消除è¦å‘Šï¼ˆWARNING) +~~~~~~~~~~~~~~~~~~~ + +文档构建目å‰å‡ºçŽ°äº†æ•°é‡æƒŠäººçš„è¦å‘Šã€‚è™±å多了ä¸ç—’ï¼Œå€ºå¤šäº†ä¸æ„;大伙儿忽略了它们, +他们永远ä¸ä¼šæ³¨æ„åˆ°ä»–ä»¬çš„å·¥ä½œå¢žåŠ äº†æ–°çš„è¦å‘Šã€‚å› æ¤ï¼Œæ¶ˆé™¤è¦å‘Šæ˜¯æ–‡æ¡£å¾…办事项列表 +ä¸ä¼˜å…ˆçº§æœ€é«˜çš„任务之一。这项任务本身相当简å•,但必须以æ£ç¡®çš„æ–¹å¼è¿›è¡Œï¼Œæ‰èƒ½å– +å¾—æˆåŠŸã€‚ + +C代ç 编译器å‘出的è¦å‘Šå¸¸å¸¸ä¼šè¢«è§†ä¸ºè¯¯æŠ¥ï¼Œä»Žè€Œå¯¼è‡´å‡ºçŽ°äº†æ—¨åœ¨è®©ç¼–è¯‘å™¨é—嘴的补ä¸ã€‚ +文档构建ä¸çš„è¦å‘Šå‡ 乎总是指å‘真æ£çš„é—®é¢˜ï¼›è¦æ¶ˆé™¤è¿™äº›è¦å‘Šï¼Œéœ€è¦ç†è§£é—®é¢˜å¹¶ä»Žæºå¤´ä¸Š +è§£å†³é—®é¢˜ã€‚å› æ¤ï¼Œä¿®å¤æ–‡æ¡£è¦å‘Šçš„è¡¥ä¸ä¸åº”åœ¨æ ‡é¢˜ä¸ç›´æŽ¥å†™â€œä¿®å¤è¦å‘Šâ€ï¼›å®ƒä»¬åº”该指明 +真æ£ä¿®å¤çš„问题。 + +å¦ä¸€ä¸ªé‡ç‚¹æ˜¯ï¼Œæ–‡æ¡£è¦å‘Šå¸¸å¸¸ç”±C代ç 里kernel-doc注释ä¸çš„问题引起。虽然文档维护 +人员对收到这些修å¤è¡¥ä¸çš„å‰¯æœ¬è¡¨ç¤ºæ„Ÿè°¢ï¼Œä½†æ˜¯æ–‡æ¡£æ ‘å®žé™…ä¸Šé€šå¸¸å¹¶ä¸é€‚åˆæŽ¥å—这些 +è¡¥ä¸ï¼›å®ƒä»¬åº”该被交给相关å系统的维护人员。 + +例如,在一次文档构建ä¸ï¼Œæˆ‘å‡ ä¹Žæ˜¯éšæ„选å–了一对è¦å‘Š:: + + ./drivers/devfreq/devfreq.c:1818: warning: bad line: + - Resource-managed devfreq_register_notifier() + ./drivers/devfreq/devfreq.c:1854: warning: bad line: + - Resource-managed devfreq_unregister_notifier() + +(作了æ–行以便于阅读) + +简å•看一下上é¢ç»™å‡ºçš„æºæ–‡ä»¶ï¼Œä¼šå‘çŽ°å‡ ä¸ªkernel-doc注释,如下所示:: + + /** + * devm_devfreq_register_notifier() + - Resource-managed devfreq_register_notifier() + * @dev: The devfreq user device. (parent of devfreq) + * @devfreq: The devfreq object. + * @nb: The notifier block to be unregistered. + * @list: DEVFREQ_TRANSITION_NOTIFIER. + */ + +问题在于缺了一个“*â€ï¼Œè¿™ä¸ç¬¦åˆæž„建系统对C注释å—çš„æ ¼å¼è¦æ±‚。æ¤é—®é¢˜è‡ª2016年注释 +è¢«æ·»åŠ ä»¥æ¥ä¸€ç›´å˜åœ¨â€”—整整四年之久。修å¤å®ƒåªéœ€è¦æ·»åŠ ä¸¢å¤±çš„æ˜Ÿå·ã€‚看一眼该文件的 +历å²è®°å½•ä»¥äº†è§£ä¸»é¢˜è¡Œçš„å¸¸è§„æ ¼å¼æ˜¯ä»€ä¹ˆæ ·ï¼Œå†ä½¿ç”¨ ``scripts/get_maintainer.pl`` +æ¥æžæ¸…è°åº”当收到æ¤è¡¥ä¸ã€‚生æˆçš„è¡¥ä¸å¦‚下所示:: + + [PATCH] PM / devfreq: Fix two malformed kerneldoc comments + + Two kerneldoc comments in devfreq.c fail to adhere to the required format, + resulting in these doc-build warnings: + + ./drivers/devfreq/devfreq.c:1818: warning: bad line: + - Resource-managed devfreq_register_notifier() + ./drivers/devfreq/devfreq.c:1854: warning: bad line: + - Resource-managed devfreq_unregister_notifier() + + Add a couple of missing asterisks and make kerneldoc a little happier. + + Signed-off-by: Jonathan Corbet <corbet@lwn.net> + --- + drivers/devfreq/devfreq.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + + diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c + index 57f6944d65a6..00c9b80b3d33 100644 + --- a/drivers/devfreq/devfreq.c + +++ b/drivers/devfreq/devfreq.c + @@ -1814,7 +1814,7 @@ static void devm_devfreq_notifier_release(struct device *dev, void *res) + + /** + * devm_devfreq_register_notifier() + - - Resource-managed devfreq_register_notifier() + + * - Resource-managed devfreq_register_notifier() + * @dev: The devfreq user device. (parent of devfreq) + * @devfreq: The devfreq object. + * @nb: The notifier block to be unregistered. + @@ -1850,7 +1850,7 @@ EXPORT_SYMBOL(devm_devfreq_register_notifier); + + /** + * devm_devfreq_unregister_notifier() + - - Resource-managed devfreq_unregister_notifier() + + * - Resource-managed devfreq_unregister_notifier() + * @dev: The devfreq user device. (parent of devfreq) + * @devfreq: The devfreq object. + * @nb: The notifier block to be unregistered. + -- + 2.24.1 + +整个过程åªèŠ±äº†å‡ åˆ†é’Ÿã€‚å½“ç„¶ï¼Œæˆ‘åŽæ¥å‘现有人在å¦ä¸€ä¸ªæ ‘ä¸ä¿®å¤äº†å®ƒï¼Œè¿™äº®å‡ºäº†å¦ä¸€ +个教è®ï¼šåœ¨æ·±å…¥ç ”究问题之å‰ï¼Œä¸€å®šè¦æ£€æŸ¥linux-nextæ ‘ï¼Œçœ‹çœ‹é—®é¢˜æ˜¯å¦å·²ç»ä¿®å¤ã€‚ + +å…¶ä»–ä¿®å¤å¯èƒ½éœ€è¦æ›´é•¿çš„æ—¶é—´ï¼Œå°¤å…¶æ˜¯é‚£äº›ä¸Žç¼ºå°‘文档的结构体æˆå‘˜æˆ–å‡½æ•°å‚æ•°ç›¸å…³çš„ +ä¿®å¤ã€‚è¿™ç§æƒ…å†µä¸‹ï¼Œéœ€è¦æ‰¾å‡ºè¿™äº›æˆå‘˜æˆ–傿•°çš„作用,并æ£ç¡®æè¿°å®ƒä»¬ã€‚æ€»ä¹‹ï¼Œè¿™ç§ +任务有时会有点ä¹å‘³ï¼Œä½†å®ƒéžå¸¸é‡è¦ã€‚如果我们真的å¯ä»¥ä»Žæ–‡æ¡£æž„å»ºä¸æ¶ˆé™¤è¦å‘Šï¼Œé‚£ä¹ˆ +我们就å¯ä»¥å¼€å§‹æœŸæœ›å¼€å‘人员开始注æ„é¿å…æ·»åŠ æ–°çš„è¦å‘Šäº†ã€‚ + +“迷失的â€kernel-doc注释 +~~~~~~~~~~~~~~~~~~~~~~ + +å¼€å‘者被鼓励去为他们的代ç 写kernel-doc注释,但是许多注释从未被引入文档构建。 +è¿™ä½¿å¾—è¿™äº›ä¿¡æ¯æ›´é𾿉¾åˆ°ï¼Œä¾‹å¦‚使Sphinxæ— æ³•ç”ŸæˆæŒ‡å‘该文档的链接。将 ``kernel-doc`` +æŒ‡ä»¤æ·»åŠ åˆ°æ–‡æ¡£ä¸ä»¥å¼•入这些注释å¯ä»¥å¸®åŠ©ç¤¾åŒºèŽ·å¾—ä¸ºç¼–å†™æ³¨é‡Šæ‰€åšå·¥ä½œçš„全部价值。 + +``scripts/find-unused-docs.sh`` 工具å¯ä»¥ç”¨æ¥æ‰¾åˆ°è¿™äº›è¢«å¿½ç•¥çš„评论。 + +请注æ„,将导出的函数和数æ®ç»“构引入文档是最有价值的。许多å系统还具有供内部 +使用的kernel-doc注释;除éžè¿™äº›æ³¨é‡Šæ”¾åœ¨ä¸“门针对相关å系统开å‘人员的文档ä¸ï¼Œ +å¦åˆ™ä¸åº”将其引入文档构建ä¸ã€‚ + + +ä¿®æ£é”™å— +~~~~~~~~ + + +ä¿®å¤æ–‡æ¡£ä¸çš„æŽ’ç‰ˆæˆ–æ ¼å¼é”™è¯¯æ˜¯ä¸€ç§å¿«é€Ÿå¦ä¹ 如何创建和å‘é€ä¿®è¡¥ç¨‹åºçš„æ–¹æ³•,也是 +一项有用的æœåŠ¡ã€‚æˆ‘æ€»æ˜¯æ„¿æ„æŽ¥å—è¿™æ ·çš„è¡¥ä¸ã€‚这也æ„味ç€ï¼Œä¸€æ—¦ä½ ä¿®å¤äº†ä¸€äº›è¿™ç§ +错误,请考虑转移到更高级的任务,留下一些拼写错误给下一个åˆå¦è€…解决。 + +请注æ„,有些并 **䏿˜¯** 拼写错误,ä¸åº”该被“修å¤â€ï¼š + + - å†…æ ¸æ–‡æ¡£ä¸ç”¨ç¾Žå¼å’Œè‹±å¼è‹±è¯æ‹¼å†™çš†å¯ï¼Œæ²¡æœ‰å¿…è¦äº’相倒æ¢ã€‚ + + - åœ¨å†…æ ¸æ–‡æ¡£ä¸ï¼Œæ²¡å¿…è¦è®¨è®ºå¥ç‚¹åŽé¢åº”è¯¥è·Ÿä¸€ä¸ªè¿˜æ˜¯ä¸¤ä¸ªç©ºæ ¼çš„é—®é¢˜ã€‚å…¶ä»–ä¸€äº›æœ‰ + åˆç†åˆ†æ§çš„地方,比如“牛津逗å·â€ï¼Œåœ¨è¿™ä¹Ÿæ˜¯è·‘题的。 + +与对任何项目的任何补ä¸ä¸€æ ·ï¼Œè¯·è€ƒè™‘您的更改是å¦çœŸçš„让事情å˜å¾—更好。 + +“上å¤â€æ–‡æ¡£ +~~~~~~~~~~ + +ä¸€äº›å†…æ ¸æ–‡æ¡£æ˜¯æœ€æ–°çš„ã€è¢«ç»´æŠ¤çš„,并且éžå¸¸æœ‰ç”¨ï¼Œæœ‰äº›æ–‡ä»¶ç¡®å¹¶éžå¦‚æ¤ã€‚å°˜å°ã€é™ˆæ—§ +å’Œä¸å‡†ç¡®çš„æ–‡æ¡£å¯èƒ½ä¼šè¯¯å¯¼è¯»è€…,并对我们的整个文档产生怀疑。任何解决这些问题的 +事情都是éžå¸¸å—欢迎的。 + +æ— è®ºä½•æ—¶å¤„ç†æ–‡æ¡£ï¼Œè¯·è€ƒè™‘å®ƒæ˜¯å¦æ˜¯æœ€æ–°çš„,是å¦éœ€è¦æ›´æ–°ï¼Œæˆ–者是å¦åº”è¯¥å®Œå…¨åˆ é™¤ã€‚ +您å¯ä»¥æ³¨æ„ä»¥ä¸‹å‡ ä¸ªè¦å‘Šæ ‡å¿—: + + - 对2.xå†…æ ¸çš„å¼•ç”¨ + - 指å‘SourceForgeå˜å‚¨åº“ + - 历å²è®°å½•除了拼写错误啥也没有æŒç»å‡ å¹´ + - 讨论Git之剿—¶ä»£çš„å·¥ä½œæµ + +å½“ç„¶ï¼Œæœ€å¥½çš„åŠžæ³•æ˜¯æ›´æ–°æ–‡æ¡£ï¼Œæ·»åŠ æ‰€éœ€çš„ä»»ä½•ä¿¡æ¯ã€‚è¿™æ ·çš„å·¥ä½œé€šå¸¸éœ€è¦ä¸Žç†Ÿæ‚‰ç›¸å…³ +å系统的开å‘人员åˆä½œã€‚当有人善æ„地询问开å‘人员,并å¬å–他们的回ç”ç„¶åŽé‡‡å– +行动时,开å‘人员通常更愿æ„与这些致力于改进文档的人员åˆä½œã€‚ + +æœ‰äº›æ–‡æ¡£å·²ç»æ²¡å¸Œæœ›äº†ï¼›ä¾‹å¦‚,我们å¶å°”会å‘现引用了很久以å‰ä»Žå†…æ ¸ä¸åˆ 除的代ç çš„ +æ–‡æ¡£ã€‚åˆ é™¤è¿‡æ—¶çš„æ–‡æ¡£ä¼šç¢°è§ä»¤äººæƒŠè®¶çš„é˜»åŠ›ï¼Œä½†æˆ‘ä»¬æ— è®ºå¦‚ä½•éƒ½åº”è¯¥è¿™æ ·åšã€‚æ–‡æ¡£ä¸ +多余的粗æžå¤§å¶å¯¹ä»»ä½•人都没有帮助。 + +如果一个严é‡è¿‡æ—¶çš„æ–‡æ¡£ä¸å¯èƒ½æœ‰ä¸€äº›æœ‰ç”¨çš„ä¿¡æ¯ï¼Œè€Œæ‚¨åˆæ— 法更新它,那么最好在 +å¼€å¤´æ·»åŠ ä¸€ä¸ªè¦å‘Šã€‚建议使用以下文本:: + + .. warning :: + This document is outdated and in need of attention. Please use + this information with caution, and please consider sending patches + to update it. + +è¿™æ ·çš„è¯ï¼Œè‡³å°‘我们长期å—苦的读者会得到文件å¯èƒ½ä¼šæŠŠä»–们引入æ§é€”çš„è¦å‘Šã€‚ + +文档一致性 +~~~~~~~~~~ + +这里的è€å‰è¾ˆä»¬ä¼šè®°å¾—上世纪90年代出现在书架上的Linux书ç±ï¼Œå®ƒä»¬åªæ˜¯ä»Žç½‘上ä¸åŒ +ä½ç½®æœæ¥çš„æ–‡æ¡£æ–‡ä»¶çš„集åˆã€‚在æ¤ä¹‹åŽï¼Œï¼ˆå¤§éƒ¨åˆ†ï¼‰è¿™äº›ä¹¦éƒ½å¾—åˆ°äº†æ”¹è¿›ï¼Œä½†æ˜¯å†…æ ¸çš„ +文档ä»ç„¶ä¸»è¦æ˜¯å»ºç«‹åœ¨è¿™ç§æ¨¡åž‹ä¸Šã€‚它有数åƒä¸ªæ–‡ä»¶ï¼Œå‡ 乎æ¯ä¸ªæ–‡ä»¶éƒ½æ˜¯ä¸Žå…¶ä»–文件相 +ç‹¬ç«‹ç¼–å†™çš„ã€‚æˆ‘ä»¬æ²¡æœ‰ä¸€ä¸ªè¿žè´¯çš„å†…æ ¸æ–‡æ¡£ï¼›åªæœ‰æ•°åƒä¸ªç‹¬ç«‹çš„æ–‡æ¡£ã€‚ + +我们一直试图通过编篡一套“书ç±â€æ¥æ”¹å–„è¿™ç§æƒ…况,以为特定读者æä¾›æˆå¥—文档。这 +包括: + + - Documentation/translations/zh_CN/admin-guide/index.rst + - Documentation/core-api/index.rst + - Documentation/driver-api/index.rst + - Documentation/userspace-api/index.rst + +ä»¥åŠæ–‡æ¡£æœ¬èº«è¿™æœ¬â€œä¹¦â€ã€‚ + +å°†æ–‡æ¡£ç§»åˆ°é€‚å½“çš„ä¹¦ä¸æ˜¯ä¸€é¡¹é‡è¦çš„任务,需è¦ç»§ç»è¿›è¡Œã€‚ä¸è¿‡è¿™é¡¹å·¥ä½œè¿˜æ˜¯æœ‰ä¸€äº› +挑战性。移动文档会给处ç†è¿™äº›æ–‡æ¡£çš„人带æ¥çŸæœŸçš„ç—›è‹¦ï¼›ä»–ä»¬å¯¹è¿™äº›æ›´æ”¹æ— ç”šçƒæƒ… +也是å¯ä»¥ç†è§£çš„。通常情况下,å¯ä»¥å°†ä¸€ä¸ªæ–‡æ¡£ç§»åŠ¨ä¸€ä¸‹ï¼›ä¸è¿‡æˆ‘ä»¬çœŸçš„ä¸æƒ³ä¸€ç›´ç§»åЍ +它们。 + +å³ä½¿æ‰€æœ‰æ–‡ä»¶éƒ½åœ¨æ£ç¡®çš„ä½ç½®ï¼Œæˆ‘ä»¬ä¹Ÿåªæ˜¯æŠŠä¸€å¤§å †æ–‡ä»¶å˜æˆä¸€ç¾¤å°å †æ–‡ä»¶ã€‚试图将 +æ‰€æœ‰è¿™äº›æ–‡ä»¶ç»„åˆæˆä¸€ä¸ªæ•´ä½“çš„å·¥ä½œå°šæœªå¼€å§‹ã€‚å¦‚æžœä½ å¯¹å¦‚ä½•åœ¨è¿™æ–¹é¢å–得进展有好的 +想法,我们将很高兴了解。 + +æ ·å¼è¡¨ï¼ˆStylesheet)改进 +~~~~~~~~~~~~~~~~~~~~~~~~ + +éšç€Sphinxçš„é‡‡ç”¨ï¼Œæˆ‘ä»¬å¾—åˆ°äº†æ¯”ä»¥å‰æ›´å¥½çš„HTML输出。但它ä»ç„¶éœ€è¦å¾ˆå¤§çš„æ”¹è¿›ï¼› +Donald Knuthå’ŒEdward Tufteå¯èƒ½æ˜¯æ˜ åƒå¹³å¹³çš„。这需è¦è°ƒæ•´æˆ‘ä»¬çš„æ ·å¼è¡¨ï¼Œä»¥åˆ›å»º +更具排版效果ã€å¯è®¿é—®æ€§å’Œå¯è¯»æ€§çš„输出。 + +请注æ„ï¼šå¦‚æžœä½ æ‰¿æ‹…è¿™ä¸ªä»»åŠ¡ï¼Œä½ å°†è¿›å…¥ç»å…¸çš„两难领域。å³ä½¿æ˜¯ç›¸å¯¹æ˜Žæ˜¾çš„å˜åŒ–, +也会有很多æ„è§å’Œè®¨è®ºã€‚唉,这就是我们生活的世界的本质。 + +æ— LaTeXçš„PDF构建 +~~~~~~~~~~~~~~~~ + +å¯¹äºŽæ‹¥æœ‰å¤§é‡æ—¶é—´å’ŒPython技能的人æ¥è¯´ï¼Œè¿™ç»å¯¹æ˜¯ä¸€é¡¹ä¸å¹³å‡¡çš„任务。Sphinx工具链 +相对较å°ä¸”包å«è‰¯å¥½ï¼›å¾ˆå®¹æ˜“æ·»åŠ åˆ°å¼€å‘系统ä¸ã€‚但是构建PDF或EPUB输出需è¦å®‰è£… +LaTeX,它ç»å¯¹ç§°ä¸ä¸Šå°æˆ–包å«è‰¯å¥½çš„。消除Latex将是一件很好的事情。 + +æœ€åˆæ˜¯å¸Œæœ›ä½¿ç”¨ `rst2pdf <https://rst2pdf.org/>`_ 工具æ¥ç”ŸæˆPDF,但结果å‘现 +æ— æ³•èƒœä»»è¿™é¡¹ä»»åŠ¡ã€‚ä¸è¿‡rst2pdf的开å‘å·¥ä½œæœ€è¿‘ä¼¼ä¹Žåˆæœ‰äº†èµ·è‰²ï¼Œè¿™æ˜¯ä¸ªå……满希望的 +迹象。如果有开å‘人员愿æ„与该项目åˆä½œï¼Œä½¿rst2pdfå¯ä¸Žå†…æ ¸æ–‡æ¡£æž„å»ºä¸€èµ·å·¥ä½œï¼Œ +大家会éžå¸¸æ„Ÿæ¿€ã€‚ + +编写更多文档 +~~~~~~~~~~~~ + +å½“ç„¶ï¼Œå†…æ ¸ä¸è®¸å¤šéƒ¨åˆ†çš„æ–‡æ¡£ä¸¥é‡ä¸è¶³ã€‚å¦‚æžœæ‚¨æœ‰ç¼–å†™ä¸€ä¸ªç‰¹å®šå†…æ ¸å系统文档的相应 +知识并愿æ„è¿™æ ·åšï¼Œè¯·ä¸è¦çŠ¹è±«ï¼Œç¼–å†™å¹¶å‘å†…æ ¸è´¡çŒ®ç»“æžœå§ï¼æ•°ä¸æ¸…çš„å†…æ ¸å¼€å‘人员和 +ç”¨æˆ·ä¼šæ„Ÿè°¢ä½ ã€‚ diff --git a/Documentation/translations/zh_CN/doc-guide/index.rst b/Documentation/translations/zh_CN/doc-guide/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..5151953c196f888b69b9caf625ad739034352993 --- /dev/null +++ b/Documentation/translations/zh_CN/doc-guide/index.rst @@ -0,0 +1,27 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/doc-guide/index.rst + +:译者: å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> + +.. _doc_guide_zh: + +================ +å¦‚ä½•ç¼–å†™å†…æ ¸æ–‡æ¡£ +================ + +.. toctree:: + :maxdepth: 1 + + sphinx + kernel-doc + parse-headers + contributing + maintainer-profile + +.. only:: å项目与HTML + + 目录 + ==== + + * :ref:`genindex` diff --git a/Documentation/translations/zh_CN/doc-guide/kernel-doc.rst b/Documentation/translations/zh_CN/doc-guide/kernel-doc.rst new file mode 100644 index 0000000000000000000000000000000000000000..82ec84470c0b873f09b43966c396cfd88b2f9059 --- /dev/null +++ b/Documentation/translations/zh_CN/doc-guide/kernel-doc.rst @@ -0,0 +1,499 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/doc-guide/kernel-doc.rst + +:译者: å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> + +编写kernel-doc注释 +================== + +Linuxå†…æ ¸æºæ–‡ä»¶å¯ä»¥åŒ…å«kernel-docæ ¼å¼çš„结构化文档注释,用以æè¿°ä»£ç 的函数〠+ç±»åž‹å’Œè®¾è®¡ã€‚å°†æ–‡æ¡£åµŒå…¥æºæ–‡ä»¶æ›´å®¹æ˜“ä¿æŒæ–‡æ¡£æœ€æ–°ã€‚ + +.. note:: å†…æ ¸æ–‡æ¡£æ ¼å¼ä¸Žjavadocã€gtk-doc或Doxygen看似很相似,但由于历å²åŽŸå› ï¼Œ + å®žé™…æœ‰ç€æ˜Žæ˜¾çš„ä¸åŒã€‚å†…æ ¸æºåŒ…嫿ˆåƒä¸Šä¸‡ä¸ªkernel-docæ³¨é‡Šã€‚è¯·åšæŒéµå¾ª + æ¤å¤„æè¿°çš„é£Žæ ¼ã€‚ + +.. note:: kernel-docæ— æ³•åŒ…å«Rust代ç :请å‚考 Documentation/rust/docs.rst 。 + +ä»Žæ³¨é‡Šä¸æå–kernel-doc结构,并从ä¸ç”Ÿæˆé€‚当的 `Sphinx C 域`_ 函数和带有锚点的 +类型æè¿°ã€‚这些注释将被过滤以生æˆç‰¹æ®Škernel-doc高亮和交å‰å¼•用。详è§ä¸‹æ–‡ã€‚ + +.. _Sphinx C 域: http://www.sphinx-doc.org/en/stable/domains.html + +使用 ``EXPORT_SYMBOL`` 或 ``EXPORT_SYMBOL_GPL`` 导出到å¯åŠ è½½æ¨¡å—çš„æ¯ä¸ªå‡½æ•°éƒ½ +应该有一个kernel-doc注释。模å—使用的头文件ä¸çš„函数和数æ®ç»“构也应该有 +kernel-doc注释。 + +å¯¹äºŽå…¶ä»–å†…æ ¸æ–‡ä»¶ï¼ˆæœªæ ‡è®°ä¸º ``static`` )ä¸å¤–部å¯è§çš„函数,æä¾›kernel-docæ ¼å¼ +çš„æ–‡æ¡£æ˜¯ä¸€ä¸ªå¾ˆå¥½çš„å®žè·µã€‚æˆ‘ä»¬ä¹Ÿå»ºè®®ä¸ºç§æœ‰ï¼ˆæ–‡ä»¶ ``static`` ï¼‰ç¨‹åºæä¾›kernel-doc +æ ¼å¼çš„æ–‡æ¡£ï¼Œä»¥ç¡®ä¿å†…æ ¸æºä»£ç 布局的一致性。æ¤å»ºè®®ä¼˜å…ˆçº§è¾ƒä½Žï¼Œç”±å†…æ ¸æºæ–‡ä»¶çš„ +维护者自行决定。 + +å¦‚ä½•æ ¼å¼åŒ–kernel-doc注释 +------------------------ + +kernel-doc注释用 ``/**`` ä½œä¸ºå¼€å§‹æ ‡è®°ã€‚ ``kernel-doc`` 工具将æå–ä»¥è¿™ç§æ–¹å¼ +æ ‡è®°çš„æ³¨é‡Šã€‚æ³¨é‡Šå…¶ä½™éƒ¨åˆ†çš„æ ¼å¼ç±»ä¼¼äºŽä¸€ä¸ªæ™®é€šçš„多行注释,左侧有一列星å·ï¼Œä»¥ +``*/`` 行结æŸã€‚ + +函数和类型的kernel-doc注释应该放在所æè¿°çš„函数或类型之å‰ï¼Œä»¥ä¾¿æœ€å¤§é™åº¦åœ°æé«˜ +更改代ç çš„äººåŒæ—¶æ›´æ”¹æ–‡æ¡£çš„å¯èƒ½æ€§ã€‚概述kernel-doc注释å¯ä»¥æ”¾åœ¨æœ€é¡¶éƒ¨çš„任何地方。 + +用详细模å¼å’Œä¸ç”Ÿæˆå®žé™…输出æ¥è¿è¡Œ ``kernel-doc`` 工具,å¯ä»¥éªŒè¯æ–‡æ¡£æ³¨é‡Šçš„æ ¼å¼ +æ˜¯å¦æ£ç¡®ã€‚例如:: + + scripts/kernel-doc -v -none drivers/foo/bar.c + +当请求执行é¢å¤–çš„gccæ£€æŸ¥æ—¶ï¼Œå†…æ ¸æž„å»ºå°†éªŒè¯æ–‡æ¡£æ ¼å¼:: + + make W=n + +函数文档 +-------- + +函数和函数å¼å®çš„kernel-docæ³¨é‡Šçš„ä¸€èˆ¬æ ¼å¼æ˜¯:: + + /** + * 函数å() - 函数简è¦è¯´æ˜Ž. + * @傿•°1: æè¿°ç¬¬ä¸€ä¸ªå‚æ•°. + * @傿•°2: æè¿°ç¬¬äºŒä¸ªå‚æ•°. + * å¯ä»¥ä¸ºå‚æ•°æä¾›ä¸€æ®µ + * 多行æè¿°. + * + * 更详细的æè¿°ï¼Œè¿›ä¸€æ¥è®¨è®ºå‡½æ•° 函数å(), è¿™å¯èƒ½å¯¹ä½¿ç”¨æˆ–修改它的人有用. + * 以空注释行开始, 内部å¯ä»¥åŒ…å«ç©ºæ³¨é‡Šè¡Œ. + * + * 详细æè¿°å¯ä»¥æœ‰å¤šä¸ªæ®µè½. + * + * Context: æè¿°å‡½æ•°æ˜¯å¦å¯ä»¥ä¼‘çœ , 它需è¦ã€é‡Šæ”¾æˆ–æœŸæœ›æŒæœ‰ä»€ä¹ˆé”. + * å¯ä»¥å†™å¤šè¡Œ. + * Return: æè¿°å‡½æ•°è¿”回值. + * + * 返回值æè¿°ä¹Ÿå¯ä»¥æœ‰å¤šä¸ªæ®µè½, + * 并且应该放在注释å—的末尾. + */ + +函数ååŽé¢çš„ç®€çŸæè¿°å¯ä»¥è·¨å¤šè¡Œï¼Œå¹¶ä»¥å‚æ•°æè¿°ã€ç©ºæ³¨é‡Šè¡Œæˆ–注释å—结尾结æŸã€‚ + +å‡½æ•°å‚æ•° +~~~~~~~~ + +æ¯ä¸ªå‡½æ•°å‚æ•°éƒ½åº”è¯¥æŒ‰ç…§é¡ºåºæè¿°ï¼Œç´§è·Ÿåœ¨å‡½æ•°ç®€è¦è¯´æ˜Žä¹‹åŽã€‚ä¸è¦åœ¨å‡½æ•°æè¿°å’Œå‚æ•° +之间,也ä¸è¦åœ¨å‚数之间留空。 + +æ¯ä¸ª ``@傿•°:`` æè¿°å¯ä»¥è·¨å¤šè¡Œã€‚ + +.. note:: + + 如果 ``@傿•°`` æè¿°æœ‰å¤šè¡Œï¼Œåˆ™è¯´æ˜Žçš„ç»è¡Œåº”该从上一行的åŒä¸€åˆ—开始:: + + * @傿•°: 较长说明 + * çš„ç»è¡Œ + + 或:: + + * @傿•°: + * 较长说明 + * çš„ç»è¡Œ + +å¦‚æžœå‡½æ•°çš„å‚æ•°æ•°ç›®å¯å˜ï¼Œåˆ™éœ€ç”¨kernel-docæ ¼å¼å¯¹å…¶è¿›è¡Œæè¿°:: + + * @...: æè¿° + +函数上下文 +~~~~~~~~~~ + +å¯è°ƒç”¨å‡½æ•°çš„上下文应该在 ``Context`` èŠ‚ä¸æè¿°ã€‚æ¤èŠ‚åº”è¯¥åŒ…æ‹¬å‡½æ•°æ˜¯ä¼‘çœ çš„è¿˜æ˜¯ +å¯ä»¥ä»Žä¸æ–上下文调用的,以åŠå®ƒéœ€è¦ä»€ä¹ˆé”ã€é‡Šæ”¾ä»€ä¹ˆé”å’ŒæœŸæœ›å®ƒçš„è°ƒç”¨è€…æŒæœ‰ä»€ä¹ˆ +é”。 + +例如:: + + * Context: Any context. + * Context: Any context. Takes and releases the RCU lock. + * Context: Any context. Expects <lock> to be held by caller. + * Context: Process context. May sleep if @gfp flags permit. + * Context: Process context. Takes and releases <mutex>. + * Context: Softirq or process context. Takes and releases <lock>, BH-safe. + * Context: Interrupt context. + +返回值 +~~~~~~ + +如有返回值,应在 ``Return`` èŠ‚ä¸æè¿°ã€‚ + +.. note:: + + #) 您æä¾›çš„多行æè¿°æ–‡æœ¬ *ä¸ä¼š* 识别æ¢è¡Œç¬¦ï¼Œå› æ¤å¦‚果您想将æŸäº›æ–‡æœ¬é¢„æ ¼å¼åŒ–, + 如:: + + * Return: + * 0 - OK + * -EINVAL - invalid argument + * -ENOMEM - out of memory + + 它们在最终文档ä¸å˜æˆä¸€è¡Œ:: + + Return: 0 - OK -EINVAL - invalid argument -ENOMEM - out of memory + + å› æ¤ï¼Œä¸ºäº†åœ¨éœ€è¦çš„地方æ¢è¡Œï¼Œæ‚¨éœ€è¦ä½¿ç”¨ReST列表,例如:: + + * Return: + * * 0 - OK to runtime suspend the device + * * -EBUSY - Device should not be runtime suspended + + #) 如果您æä¾›çš„æè¿°æ€§æ–‡æœ¬ä¸çš„行以æŸä¸ªåŽè·Ÿå†’å·çš„çŸè¯å¼€å¤´ï¼Œåˆ™æ¯ä¸€ä¸ªè¿™ç§çŸè¯ + éƒ½å°†è¢«è§†ä¸ºæ–°çš„èŠ‚æ ‡é¢˜ï¼Œå¯èƒ½ä¼šäº§ç”Ÿæ„æ–™ä¸åˆ°çš„æ•ˆæžœã€‚ + +结构体ã€å…±ç”¨ä½“ã€æžšä¸¾ç±»åž‹æ–‡æ¡£ +---------------------------- + +结构体(struct)ã€å…±ç”¨ä½“(unionï¼‰ã€æžšä¸¾ï¼ˆenum)类型kernel-docæ³¨é‡Šçš„ä¸€èˆ¬æ ¼å¼ä¸º:: + + /** + * struct 结构体å - ç®€è¦æè¿°. + * @æˆå‘˜1: æˆå‘˜1æè¿°. + * @æˆå‘˜2: æˆå‘˜2æè¿°. + * å¯ä»¥ä¸ºæˆå‘˜æä¾› + * 多行æè¿°. + * + * 结构体的æè¿°. + */ + +å¯ä»¥ç”¨ ``union`` 或 ``enum`` 替æ¢ä¸Šé¢ç¤ºä¾‹ä¸çš„ ``struct`` ,以æè¿°å…±ç”¨ä½“或枚举。 +``æˆå‘˜`` 用于表示枚举ä¸çš„å…ƒç´ æˆ–å…±ç”¨ä½“æˆå‘˜ã€‚ + +结构体åç§°åŽé¢çš„简è¦è¯´æ˜Žå¯ä»¥è·¨å¤šè¡Œï¼Œå¹¶ä»¥æˆå‘˜è¯´æ˜Žã€ç©ºç™½æ³¨é‡Šè¡Œæˆ–注释å—结尾结æŸã€‚ + +æˆå‘˜ +~~~~ + +结构体ã€å…±ç”¨ä½“和枚举的æˆå‘˜åº”ä»¥ä¸Žå‡½æ•°å‚æ•°ç›¸åŒçš„æ–¹å¼è®°å½•;它们åŽç´§è·Ÿç®€çŸçš„æè¿°ï¼Œ +并且为多行。 + +在结构体或共用体æè¿°ä¸ï¼Œå¯ä»¥ä½¿ç”¨ ``private:`` å’Œ ``public:`` æ³¨é‡Šæ ‡ç¾ã€‚ +``private:`` åŸŸå†…çš„å—æ®µä¸ä¼šåˆ—在生æˆçš„æ–‡æ¡£ä¸ã€‚ + +``private:`` å’Œ ``public:`` æ ‡ç¾å¿…须紧跟在 ``/*`` æ³¨é‡Šæ ‡è®°ä¹‹åŽã€‚å¯ä»¥é€‰æ‹©æ˜¯å¦ +在 ``:`` å’Œ ``*/`` ç»“æŸæ ‡è®°ä¹‹é—´åŒ…嫿³¨é‡Šã€‚ + +例å:: + + /** + * struct å¼ ä¸‰ - ç®€çŸæè¿° + * @a: 第一个æˆå‘˜ + * @b: 第二个æˆå‘˜ + * @d: 第三个æˆå‘˜ + * + * 详细æè¿° + */ + struct å¼ ä¸‰ { + int a; + int b; + /* private: 仅内部使用 */ + int c; + /* public: 下一个是公有的 */ + int d; + }; + +嵌套的结构体/共用体 +~~~~~~~~~~~~~~~~~~~ + +嵌套的结构体/共用体å¯åƒè¿™æ ·è®°å½•:: + + /** + * struct nested_foobar - a struct with nested unions and structs + * @memb1: first member of anonymous union/anonymous struct + * @memb2: second member of anonymous union/anonymous struct + * @memb3: third member of anonymous union/anonymous struct + * @memb4: fourth member of anonymous union/anonymous struct + * @bar: non-anonymous union + * @bar.st1: struct st1 inside @bar + * @bar.st2: struct st2 inside @bar + * @bar.st1.memb1: first member of struct st1 on union bar + * @bar.st1.memb2: second member of struct st1 on union bar + * @bar.st2.memb1: first member of struct st2 on union bar + * @bar.st2.memb2: second member of struct st2 on union bar + */ + struct nested_foobar { + /* Anonymous union/struct*/ + union { + struct { + int memb1; + int memb2; + }; + struct { + void *memb3; + int memb4; + }; + }; + union { + struct { + int memb1; + int memb2; + } st1; + struct { + void *memb1; + int memb2; + } st2; + } bar; + }; + +.. note:: + + #) 在记录嵌套结构体或共用体时,如果结构体/共用体 ``å¼ ä¸‰`` 已命åï¼Œåˆ™å…¶ä¸ + çš„æˆå‘˜ ``æŽå››`` 应记录为 ``@å¼ ä¸‰.æŽå››:`` + + #) 当嵌套结构体/共用体是匿å的时,其ä¸çš„æˆå‘˜ ``æŽå››`` 应记录为 ``@æŽå››:`` + +行间注释文档 +~~~~~~~~~~~~ + +结构æˆå‘˜ä¹Ÿå¯åœ¨å®šä¹‰æ—¶ä»¥è¡Œé—´æ³¨é‡Šå½¢å¼è®°å½•ã€‚æœ‰ä¸¤ç§æ ·å¼ï¼Œä¸€ç§æ˜¯å•行注释,其ä¸å¼€å§‹ +``/**`` å’Œç»“æŸ ``*/`` ä½äºŽåŒä¸€è¡Œï¼›å¦ä¸€ç§æ˜¯å¤šè¡Œæ³¨é‡Šï¼Œå¼€å¤´ç»“å°¾å„自ä½äºŽä¸€è¡Œï¼Œå°± +åƒæ‰€æœ‰å…¶ä»–æ ¸å¿ƒæ–‡æ¡£æ³¨é‡Šä¸€æ ·:: + + /** + * struct å¼ ä¸‰ - ç®€çŸæè¿°. + * @å¼ ä¸‰: æˆå‘˜å¼ 三. + */ + struct å¼ ä¸‰ { + int å¼ ä¸‰; + /** + * @æŽå››: æˆå‘˜æŽå››. + */ + int æŽå››; + /** + * @王五: æˆå‘˜çŽ‹äº”. + * + * æ¤å¤„,æˆå‘˜æè¿°å¯ä»¥ä¸ºå¥½å‡ 段. + */ + int 王五; + union { + /** @å„¿å: å•行æè¿°. */ + int å„¿å; + }; + /** @èµµå…: æè¿°@å¼ ä¸‰é‡Œé¢çš„结构体@èµµå… */ + struct { + /** + * @èµµå….女儿: æè¿°@å¼ ä¸‰.èµµå…里é¢çš„@女儿 + */ + int 女儿; + } èµµå…; + }; + +Typedef文档 +----------- + +Typedefçš„kernel-docæ–‡æ¡£æ³¨é‡Šçš„ä¸€èˆ¬æ ¼å¼ä¸º:: + + /** + * typedef 类型åç§° - ç®€çŸæè¿°. + * + * 类型æè¿°. + */ + +还å¯ä»¥è®°å½•带有函数原型的typedef:: + + /** + * typedef 类型åç§° - ç®€çŸæè¿°. + * @傿•°1: 傿•°1çš„æè¿° + * @傿•°2: 傿•°2çš„æè¿° + * + * 类型æè¿°. + * + * Context: é”(Locking)上下文. + * Return: 返回值的æ„义. + */ + typedef void (*类型åç§°)(struct v4l2_ctrl *傿•°1, void *傿•°2); + +高亮与交å‰å¼•用 +-------------- + +在kernel-doc注释的æè¿°æ–‡æœ¬ä¸å¯ä»¥è¯†åˆ«ä»¥ä¸‹ç‰¹æ®Šæ¨¡å¼ï¼Œå¹¶å°†å…¶è½¬æ¢ä¸ºæ£ç¡®çš„ +reStructuredTextæ ‡è®°å’Œ `Sphinx C 域`_ 引用。 + +.. attention:: 以下内容 **ä»…** 在kernel-doc注释ä¸è¯†åˆ«ï¼Œ **ä¸ä¼š** 在普通的 + reStructuredText文档ä¸è¯†åˆ«ã€‚ + +``funcname()`` + 函数引用。 + +``@parameter`` + å‡½æ•°å‚æ•°çš„å称(未交å‰å¼•ç”¨ï¼Œä»…æ ¼å¼åŒ–)。 + +``%CONST`` + 常é‡çš„å称(未交å‰å¼•ç”¨ï¼Œä»…æ ¼å¼åŒ–)。 + +````literal```` + é¢„æ ¼å¼åŒ–文本å—。输出将使用ç‰è·å—体。 + + è‹¥ä½ éœ€è¦ä½¿ç”¨åœ¨kernel-doc脚本或reStructuredText䏿œ‰ç‰¹æ®Šå«ä¹‰çš„å—符,则æ¤åŠŸèƒ½ + éžå¸¸æœ‰ç”¨ã€‚ + + è‹¥ä½ éœ€è¦åœ¨å‡½æ•°æè¿°ä¸ä½¿ç”¨ç±»ä¼¼äºŽ ``%ph`` 的东西,这特别有用。 + +``$ENVVAR`` + 环境å˜é‡å称(未交å‰å¼•ç”¨ï¼Œä»…æ ¼å¼åŒ–)。 + +``&struct name`` + 结构体引用。 + +``&enum name`` + 枚举引用。 + +``&typedef name`` + Typedef引用。 + +``&struct_name->member`` or ``&struct_name.member`` + 结构体或共用体æˆå‘˜å¼•用。交å‰å¼•ç”¨å°†é“¾æŽ¥åˆ°ç»“æž„ä½“æˆ–å…±ç”¨ä½“å®šä¹‰ï¼Œè€Œä¸æ˜¯ç›´æŽ¥åˆ°æˆå‘˜ã€‚ + +``&name`` + æ³›ç±»åž‹å¼•ç”¨ã€‚è¯·é¦–é€‰ä¸Šé¢æè¿°çš„å®Œæ•´å¼•ç”¨æ–¹å¼ã€‚æ¤æ³•ä¸»è¦æ˜¯ä¸ºäº†å¯èƒ½æœªæè¿°çš„æ³¨é‡Šã€‚ + +从reStructuredText交å‰å¼•用 +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +æ— éœ€é¢å¤–çš„è¯æ³•æ¥ä»ŽreStructuredText文档交å‰å¼•用kernel-do注释ä¸å®šä¹‰çš„函数和类型。 +åªéœ€ä»¥ ``()`` 结æŸå‡½æ•°å,并在类型之å‰å†™ä¸Š ``struct`` , ``union`` , ``enum`` +或 ``typedef`` 。 +例如:: + + See foo(). + See struct foo. + See union bar. + See enum baz. + See typedef meh. + +è‹¥è¦åœ¨äº¤å‰å¼•用链接ä¸ä½¿ç”¨è‡ªå®šä¹‰æ–‡æœ¬ï¼Œå¯ä»¥é€šè¿‡ä»¥ä¸‹è¯æ³•进行:: + + See :c:func:`my custom link text for function foo <foo>`. + See :c:type:`my custom link text for struct bar <bar>`. + +有关更多详细信æ¯ï¼Œè¯·å‚阅 `Sphinx C 域`_ 文档。 + +总述性文档注释 +-------------- + +为了促进æºä»£ç 和注释紧密è”åˆï¼Œå¯ä»¥å°†kernel-doc文档å—作为自由形å¼çš„æ³¨é‡Šï¼Œè€Œ +䏿˜¯å‡½æ•°ã€ç»“æž„ã€è”åˆã€æžšä¸¾æˆ–typedef的绑定kernel-doc。例如,这å¯ä»¥ç”¨äºŽè§£é‡Š +é©±åŠ¨ç¨‹åºæˆ–库代ç çš„æ“作ç†è®ºã€‚ + +è¿™æ˜¯é€šè¿‡ä½¿ç”¨å¸¦æœ‰èŠ‚æ ‡é¢˜çš„ ``DOC:`` èŠ‚å…³é”®å—æ¥å®žçŽ°çš„ã€‚ + +æ€»è¿°æˆ–é«˜å±‚çº§æ–‡æ¡£æ³¨é‡Šçš„ä¸€èˆ¬æ ¼å¼ä¸º:: + + /** + * DOC: Theory of Operation + * + * The whizbang foobar is a dilly of a gizmo. It can do whatever you + * want it to do, at any time. It reads your mind. Here's how it works. + * + * foo bar splat + * + * The only drawback to this gizmo is that is can sometimes damage + * hardware, software, or its subject(s). + */ + +``DOC:`` åŽé¢çš„æ ‡é¢˜ç”¨ä½œæºæ–‡ä»¶ä¸çš„æ ‡é¢˜ï¼Œä½†ä¹Ÿç”¨ä½œæå–æ–‡æ¡£æ³¨é‡Šçš„æ ‡è¯†ç¬¦ã€‚å› æ¤ï¼Œ +文件ä¸çš„æ ‡é¢˜å¿…须是唯一的。 + +包å«kernel-doc注释 +================== + +文档注释å¯ä»¥è¢«åŒ…å«åœ¨ä»»ä½•使用专用kernel-doc Sphinx指令扩展的reStructuredText +文档ä¸ã€‚ + +kernel-docæŒ‡ä»¤çš„æ ¼å¼å¦‚下:: + + .. kernel-doc:: source + :option: + +*source* æ˜¯ç›¸å¯¹äºŽå†…æ ¸æºä»£ç æ ‘çš„æºæ–‡ä»¶è·¯å¾„。 +支æŒä»¥ä¸‹æŒ‡ä»¤é€‰é¡¹ï¼š + +export: *[source-pattern ...]* + 包括 *source* ä¸ä½¿ç”¨ ``EXPORT_SYMBOL`` 或 ``EXPORT_SYMBOL_GPL`` 导出的所有 + å‡½æ•°çš„æ–‡æ¡£ï¼Œæ— è®ºæ˜¯åœ¨ *source* ä¸è¿˜æ˜¯åœ¨ *source-pattern* 指定的任何文件ä¸ã€‚ + + 当kernel-doc注释被放置在头文件ä¸ï¼Œè€Œ ``EXPORT_SYMBOL`` å’Œ ``EXPORT_SYMBOL_GPL`` + ä½äºŽå‡½æ•°å®šä¹‰æ—边时, *source-pattern* éžå¸¸æœ‰ç”¨ã€‚ + + 例å:: + + .. kernel-doc:: lib/bitmap.c + :export: + + .. kernel-doc:: include/net/mac80211.h + :export: net/mac80211/*.c + +internal: *[source-pattern ...]* + 包括 *source* 䏿‰€æœ‰åœ¨ *source* 或 *source-pattern* 的任何文件ä¸éƒ½æ²¡æœ‰ä½¿ç”¨ + ``EXPORT_SYMBOL`` 或 ``EXPORT_SYMBOL_GPL`` 导出的函数和类型的文档。 + + 例å:: + + .. kernel-doc:: drivers/gpu/drm/i915/intel_audio.c + :internal: + +identifiers: *[ function/type ...]* + 在 *source* ä¸åŒ…嫿¯ä¸ª *function* å’Œ *type* 的文档。如果没有指定 *function* , + 则 *source* 䏿‰€æœ‰å‡½æ•°å’Œç±»åž‹çš„æ–‡æ¡£éƒ½å°†åŒ…å«åœ¨å†…。 + + 例å:: + + .. kernel-doc:: lib/bitmap.c + :identifiers: bitmap_parselist bitmap_parselist_user + + .. kernel-doc:: lib/idr.c + :identifiers: + +no-identifiers: *[ function/type ...]* + 排除 *source* 䏿‰€æœ‰ *function* å’Œ *type* 的文档。 + + 例å:: + + .. kernel-doc:: lib/bitmap.c + :no-identifiers: bitmap_parselist + +functions: *[ function/type ...]* + 这是“identifiersâ€æŒ‡ä»¤çš„别å,已弃用。 + +doc: *title* + åŒ…å« *source* ä¸ç”± *title* æ ‡é¢˜æ ‡è¯†çš„ ``DOC:`` 文档段è½ã€‚ *title* ä¸å…许 + ç©ºæ ¼ï¼›ä¸è¦åœ¨ *title* ä¸ŠåŠ å¼•å·ã€‚ *title* 仅用作段è½çš„æ ‡è¯†ç¬¦ï¼Œä¸åŒ…å«åœ¨è¾“出ä¸ã€‚ + 请确ä¿åœ¨æ‰€é™„çš„reStructuredTextæ–‡æ¡£ä¸æœ‰é€‚å½“çš„æ ‡é¢˜ã€‚ + + 例å:: + + .. kernel-doc:: drivers/gpu/drm/i915/intel_audio.c + :doc: High Definition Audio over HDMI and Display Port + +如果没有选项,kernel-docæŒ‡ä»¤å°†åŒ…å«æºæ–‡ä»¶ä¸çš„æ‰€æœ‰æ–‡æ¡£æ³¨é‡Šã€‚ + +kernel-doc扩展包å«åœ¨å†…æ ¸æºä»£ç æ ‘ä¸ï¼Œä½äºŽ ``Documentation/sphinx/kerneldoc.py`` 。 +在内部,它使用 ``scripts/kernel-doc`` 脚本从æºä»£ç 䏿喿–‡æ¡£æ³¨é‡Šã€‚ + +.. _kernel_doc_zh: + +如何使用kernel-docç”Ÿæˆæ‰‹å†Œï¼ˆman)页 +----------------------------------- + +å¦‚æžœæ‚¨åªæƒ³ä½¿ç”¨kernel-docç”Ÿæˆæ‰‹å†Œé¡µï¼Œå¯ä»¥ä»Žå†…æ ¸gitæ ‘è¿™æ ·åš:: + + $ scripts/kernel-doc -man \ + $(git grep -l '/\*\*' -- :^Documentation :^tools) \ + | scripts/split-man.pl /tmp/man + +一些旧版本的git䏿”¯æŒè·¯å¾„æŽ’é™¤è¯æ³•çš„æŸäº›å˜ä½“。 +以下命令之一å¯èƒ½é€‚用于这些版本:: + + $ scripts/kernel-doc -man \ + $(git grep -l '/\*\*' -- . ':!Documentation' ':!tools') \ + | scripts/split-man.pl /tmp/man + + $ scripts/kernel-doc -man \ + $(git grep -l '/\*\*' -- . ":(exclude)Documentation" ":(exclude)tools") \ + | scripts/split-man.pl /tmp/man + diff --git a/Documentation/translations/zh_CN/doc-guide/maintainer-profile.rst b/Documentation/translations/zh_CN/doc-guide/maintainer-profile.rst new file mode 100644 index 0000000000000000000000000000000000000000..35c88e5b3d830bf82c9b12a0392188c8f4a3b2b1 --- /dev/null +++ b/Documentation/translations/zh_CN/doc-guide/maintainer-profile.rst @@ -0,0 +1,43 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/doc-guide/maintainer-profile.rst + +:译者: å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> + +文档å系统维护人员æ¡ç›®æ¦‚è¿° +========================== + +文档“åç³»ç»Ÿâ€æ˜¯å†…æ ¸æ–‡æ¡£å’Œç›¸å…³åŸºç¡€è®¾æ–½çš„ä¸å¿ƒå调点。它涵盖了 Documentation/ 下 +的文件层级(Documentation/devicetree 除外)ã€scripts/ 下的å„ç§å®žç”¨ç¨‹åºï¼Œå¹¶ä¸” +在æŸäº›æƒ…况下的也包括 LICENSES/ 。 + +ä¸è¿‡å€¼å¾—注æ„的是,这个åç³»ç»Ÿçš„è¾¹ç•Œæ¯”é€šå¸¸æ›´åŠ æ¨¡ç³Šã€‚è®¸å¤šå…¶ä»–åç³»ç»Ÿç»´æŠ¤äººå‘˜éœ€è¦ +ä¿æŒå¯¹ Documentation/ æŸäº›éƒ¨åˆ†çš„æŽ§åˆ¶ï¼Œä»¥ä¾¿äºŽå¯ä»¥æ›´è‡ªç”±åœ°åšæ›´æ”¹ã€‚é™¤æ¤ä¹‹å¤–, +è®¸å¤šå†…æ ¸æ–‡æ¡£éƒ½ä»¥kernel-doc注释的形å¼å‡ºçŽ°åœ¨æºä»£ç ä¸ï¼›è¿™äº›æ³¨é‡Šé€šå¸¸ï¼ˆä½†ä¸æ€»æ˜¯ï¼‰ +由相关的å系统维护人员维护。 + +文档å系统的邮件列表是<linux-doc@vger.kernel.org>。 +è¡¥ä¸åº”å°½é‡é’ˆå¯¹docs-nextæ ‘ã€‚ + +æäº¤æ£€æŸ¥å•è¡¥é— +-------------- + +åœ¨è¿›è¡Œæ–‡æ¡£æ›´æ”¹æ—¶ï¼Œæ‚¨åº”å½“æž„å»ºæ–‡æ¡£ä»¥æµ‹è¯•ï¼Œå¹¶ç¡®ä¿æ²¡æœ‰å¼•入新的错误或è¦å‘Šã€‚ç”Ÿæˆ +HTML文档并查看结果将有助于é¿å…对文档渲染结果的ä¸å¿…è¦äº‰æ‰§ã€‚ + +å¼€å‘周期的关键节点 +------------------ + +è¡¥ä¸å¯ä»¥éšæ—¶å‘é€ï¼Œä½†åœ¨åˆå¹¶çª—壿œŸé—´ï¼Œå“åº”å°†æ¯”é€šå¸¸æ…¢ã€‚æ–‡æ¡£æ ‘å¾€å¾€åœ¨åˆå¹¶çª—壿‰“å¼€ +之å‰å…³é—å¾—æ¯”è¾ƒæ™šï¼Œå› ä¸ºæ–‡æ¡£è¡¥ä¸å¯¼è‡´å›žå½’的风险很å°ã€‚ + +å®¡é˜…èŠ‚å¥ +-------- + +我(译注:指Jonathan Corbet <corbet@lwn.net>)是文档å系统的唯一维护者,我在 +自己的时间里完æˆè¿™é¡¹å·¥ä½œï¼Œæ‰€ä»¥å¯¹è¡¥ä¸çš„å“应有时会很慢。当补ä¸è¢«åˆå¹¶æ—¶ï¼ˆæˆ–当我 +决定拒ç»åˆå¹¶è¡¥ä¸æ—¶ï¼‰ï¼Œæˆ‘都会å‘é€é€šçŸ¥ã€‚如果您在å‘é€è¡¥ä¸åŽä¸€å‘¨å†…没有收到回å¤ï¼Œ +请ä¸è¦çŠ¹è±«ï¼Œå‘é€æé†’å°±å¥½ã€‚ + diff --git a/Documentation/translations/zh_CN/doc-guide/parse-headers.rst b/Documentation/translations/zh_CN/doc-guide/parse-headers.rst new file mode 100644 index 0000000000000000000000000000000000000000..a08819e904ed7871d8eac046653cf53cd6c9df4a --- /dev/null +++ b/Documentation/translations/zh_CN/doc-guide/parse-headers.rst @@ -0,0 +1,187 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/doc-guide/parse-headers.rst + +:译者: å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> + +===================== +包å«ç”¨æˆ·ç©ºé—´API头文件 +===================== + +有时,为了æè¿°ç”¨æˆ·ç©ºé—´API并在代ç 和文档之间生æˆäº¤å‰å¼•用,需è¦åŒ…å«å¤´æ–‡ä»¶å’Œç¤ºä¾‹ +C代ç 。为用户空间APIæ–‡ä»¶æ·»åŠ äº¤å‰å¼•ç”¨è¿˜æœ‰ä¸€ä¸ªå¥½å¤„ï¼šå¦‚æžœåœ¨æ–‡æ¡£ä¸æ‰¾ä¸åˆ°ç›¸åº”符å·ï¼Œ +Sphinx将生æˆè¦å‘Šã€‚è¿™æœ‰åŠ©äºŽä¿æŒç”¨æˆ·ç©ºé—´APIæ–‡æ¡£ä¸Žå†…æ ¸æ›´æ”¹åŒæ¥ã€‚ +:ref:`parse_headers.pl <parse_headers_zh>` æä¾›äº†ç”Ÿæˆæ¤ç±»äº¤å‰å¼•ç”¨çš„ä¸€ç§æ–¹æ³•。 +在构建文档时,必须通过Makefileè°ƒç”¨å®ƒã€‚æœ‰å…³å¦‚ä½•åœ¨å†…æ ¸æ ‘ä¸ä½¿ç”¨å®ƒçš„示例,请å‚阅 +``Documentation/userspace-api/media/Makefile`` 。 + +.. _parse_headers_zh: + +parse_headers.pl +---------------- + +脚本åç§° +~~~~~~~~ + + +parse_headers.pl——解æžä¸€ä¸ªC文件,识别函数ã€ç»“æž„ä½“ã€æžšä¸¾ã€å®šä¹‰å¹¶å¯¹Sphinx文档 +创建交å‰å¼•用。 + + +ç”¨æ³•æ¦‚è¦ +~~~~~~~~ + + +\ **parse_headers.pl**\ [<选项>] <C文件> <输出文件> [<例外文件>] + +<选项> å¯ä»¥æ˜¯ï¼š --debug, --help 或 --usage 。 + + +选项 +~~~~ + + + +\ **--debug**\ + + å¼€å¯è„šæœ¬è¯¦ç»†æ¨¡å¼ï¼Œåœ¨è°ƒè¯•时很有用。 + + +\ **--usage**\ + + 打å°ç®€çŸçš„帮助信æ¯å¹¶é€€å‡ºã€‚ + + + +\ **--help**\ + + æ‰“å°æ›´è¯¦ç»†çš„帮助信æ¯å¹¶é€€å‡ºã€‚ + + +说明 +~~~~ + +通过Cå¤´æ–‡ä»¶æˆ–æºæ–‡ä»¶ï¼ˆ<C文件>)ä¸ä¸ºæè¿°API的文档编写的带交å‰å¼•用的 ..é¢„æ ¼å¼åŒ– +文本 å—å°†æ–‡ä»¶è½¬æ¢æˆé‡æž„文本(RST)。它接å—一个å¯é€‰çš„<例外文件>ï¼Œå…¶ä¸æè¿°äº† +å“ªäº›å…ƒç´ å°†è¢«å¿½ç•¥æˆ–æŒ‡å‘éžé»˜è®¤å¼•用。 + +输出被写入到<输出文件>。 + +它能够识别定义ã€å‡½æ•°ã€ç»“构体ã€typedefã€æžšä¸¾å’Œæžšä¸¾ç¬¦å·ï¼Œå¹¶ä¸ºå®ƒä»¬åˆ›å»ºäº¤å‰å¼•用。 +它还能够区分用于指定Linux ioctlçš„ ``#define`` 。 + +<例外文件> 包å«ä¸¤ç§ç±»åž‹çš„è¯å¥ï¼š \ **ignore**\ 或 \ **replace**\ . + +ignoreæ ‡è®°çš„è¯æ³•为: + + +ignore \ **type**\ \ **name**\ + +The \ **ignore**\ æ„味ç€å®ƒä¸ä¼šä¸ºç±»åž‹ä¸º \ **type**\ çš„ \ **name**\ 符å·ç”Ÿæˆ +交å‰å¼•用。 + + +replaceæ ‡è®°çš„è¯æ³•为: + + +replace \ **type**\ \ **name**\ \ **new_value**\ + +The \ **replace**\ 味ç€å®ƒå°†ä¸º \ **type**\ 类型的 \ **name**\ 符å·ç”Ÿæˆäº¤å‰å¼• +用,但是它将使用 \ **new_value**\ æ¥å–代默认的替æ¢è§„则。 + + +这两ç§è¯å¥ä¸ï¼Œ \ **type**\ å¯ä»¥æ˜¯ä»¥ä¸‹ä»»ä¸€é¡¹ï¼š + + +\ **ioctl**\ + + ignore 或 replace è¯å¥åº”用于ioctl定义,如: + + #define VIDIOC_DBG_S_REGISTER _IOW('V', 79, struct v4l2_dbg_register) + + + +\ **define**\ + + ignore 或 replace è¯å¥åº”用于在<C文件>䏿‰¾åˆ°çš„任何其他 ``#define`` 。 + + + +\ **typedef**\ + + ignore å’Œ replace è¯å¥åº”用于<C文件>ä¸çš„typedefè¯å¥ã€‚ + + + +\ **struct**\ + + ignore å’Œ replace è¯å¥åº”用于<C文件>ä¸çš„结构体åç§°è¯å¥ã€‚ + + + +\ **enum**\ + + ignore å’Œ replace è¯å¥åº”用于<C文件>ä¸çš„æžšä¸¾åç§°è¯å¥ã€‚ + + + +\ **symbol**\ + + ignore å’Œ replace è¯å¥åº”用于<C文件>ä¸çš„æžšä¸¾å€¼åç§°è¯å¥ã€‚ + + replaceè¯å¥ä¸ï¼Œ \ **new_value**\ 会自动使用 \ **typedef**\ , \ **enum**\ + å’Œ \ **struct**\ 类型的 :c:type: å¼•ç”¨ï¼›ä»¥åŠ \ **ioctl**\ , \ **define**\ å’Œ + \ **symbol**\ 类型的 :ref: 。引用的类型也å¯ä»¥åœ¨replaceè¯å¥ä¸æ˜¾å¼å®šä¹‰ã€‚ + + +示例 +~~~~ + + +ignore define _VIDEODEV2_H + + +忽略<C文件>ä¸çš„ #define _VIDEODEV2_H 。 + +ignore symbol PRIVATE + + +如下结构体: + +enum foo { BAR1, BAR2, PRIVATE }; + +ä¸ä¼šä¸º \ **PRIVATE**\ 生æˆäº¤å‰å¼•用。 + +replace symbol BAR1 :c:type:\`foo\` +replace symbol BAR2 :c:type:\`foo\` + + +如下结构体: + +enum foo { BAR1, BAR2, PRIVATE }; + +它会让BAR1å’ŒBAR2枚举符å·äº¤å‰å¼•用C域ä¸çš„foo符å·ã€‚ + + + +缺陷 +~~~~ + + +请å‘Mauro Carvalho Chehab <mchehab@kernel.org>报告有关缺陷。 + +䏿–‡ç¿»è¯‘é—®é¢˜è¯·æ‰¾ä¸æ–‡ç¿»è¯‘维护者。 + + +ç‰ˆæƒ +~~~~ + + +ç‰ˆæƒæ‰€æœ‰ (c) 2016 Mauro Carvalho Chehab <mchehab+samsung@kernel.org> + +许å¯è¯ GPLv2:GNU GPL version 2 <https://gnu.org/licenses/gpl.html> + +è¿™æ˜¯è‡ªç”±è½¯ä»¶ï¼šä½ å¯ä»¥è‡ªç”±åœ°ä¿®æ”¹å’Œé‡æ–°å‘布它。 +在法律å…许的范围内,**䏿供任何ä¿è¯**。 diff --git a/Documentation/translations/zh_CN/doc-guide/sphinx.rst b/Documentation/translations/zh_CN/doc-guide/sphinx.rst new file mode 100644 index 0000000000000000000000000000000000000000..951595c7d599b8b4f63144895bb21e67ec09cba0 --- /dev/null +++ b/Documentation/translations/zh_CN/doc-guide/sphinx.rst @@ -0,0 +1,415 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/doc-guide/sphinx.rst + +:译者: å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> + +.. _sphinxdoc_zh: + +简介 +==== + +Linuxå†…æ ¸ä½¿ç”¨ `Sphinx <http://www.sphinx-doc.org/>`_ æ¥æŠŠ ``Documentation`` +下的 `reStructuredText <http://docutils.sourceforge.net/rst.html>`_ 文件转 +æ¢æˆæ¼‚亮的文档。使用 ``make htmldocs`` 或 ``make pdfdocs`` 命令å³å¯æž„建HTML +或PDFæ ¼å¼çš„æ–‡æ¡£ã€‚生æˆçš„æ–‡æ¡£æ”¾åœ¨ ``Documentation/output`` 文件夹ä¸ã€‚ + +reStructuredText文件å¯èƒ½åŒ…å«åŒ…嫿¥è‡ªæºæ–‡ä»¶çš„结构化文档注释或kernel-doc注释。 +通常它们用于æè¿°ä»£ç 的功能ã€ç±»åž‹å’Œè®¾è®¡ã€‚kernel-doc注释有一些特殊的结构和 +æ ¼å¼ï¼Œä½†é™¤æ¤ä¹‹å¤–,它们还被作为reStructuredText处ç†ã€‚ + +最åŽï¼Œæœ‰æˆåƒä¸Šä¸‡çš„纯文本文档文件散布在 ``Documentation`` 里。éšç€æ—¶é—´æŽ¨ç§»ï¼Œ +å…¶ä¸ä¸€äº›å¯èƒ½ä¼šè½¬æ¢ä¸ºreStructuredText,但其ä¸å¤§éƒ¨åˆ†ä»ä¿æŒçº¯æ–‡æœ¬ã€‚ + +.. _sphinx_install_zh: + +安装Sphinx +========== + +Documentation/ 下的ReST文件现在使用sphinx1.3或更高版本构建。 + +这有一个脚本å¯ä»¥æ£€æŸ¥Sphinxçš„ä¾èµ–项。更多详细信æ¯è§ +:ref:`sphinx-pre-install_zh` 。 + +大多数å‘行版都附带了Sphinx,但是它的工具链比较脆弱,而且在您的机器上å‡çº§å®ƒ +或其他一些PythonåŒ…å¯¼è‡´æ–‡æ¡£æž„å»ºä¸æ–的情况并ä¸å°‘è§ã€‚ + +é¿å…æ¤æƒ…å†µçš„ä¸€ç§æ–¹æ³•是使用与å‘行版附带的ä¸åŒçš„ç‰ˆæœ¬ã€‚å› æ¤ï¼Œå»ºè®®ä½¿ç”¨ +``virtualenv-3`` 或 ``virtualenv`` 在虚拟环境ä¸å®‰è£…Sphinx,具体å–决于å‘行版 +如何打包Python3。 + +.. note:: + + #) 低于1.5版本的Sphinxæ— æ³•ä¸ŽPythonçš„0.13.1或更高版本docutils一起æ£å¸¸å·¥ä½œã€‚ + 如果您想使用这些版本,那么应该è¿è¡Œ ``pip install 'docutils==0.12'`` 。 + + #) html输出建议使用RTDä¸»é¢˜ã€‚æ ¹æ®Sphinx版本的ä¸åŒï¼Œå®ƒåº”该用 + ``pip install sphinx_rtd_theme`` å•独安装。 + + #) 一些ReST页é¢åŒ…嫿•°å¦è¡¨è¾¾å¼ã€‚由于Sphinx的工作方å¼ï¼Œè¿™äº›è¡¨è¾¾å¼æ˜¯ä½¿ç”¨ LaTeX + 编写的。它需è¦å®‰è£…amsfontså’Œamsmathå®åŒ…,以便显示。 + +总之,如您è¦å®‰è£…Sphinx 1.7.9版本,应执行:: + + $ virtualenv sphinx_1.7.9 + $ . sphinx_1.7.9/bin/activate + (sphinx_1.7.9) $ pip install -r Documentation/sphinx/requirements.txt + +在è¿è¡Œ ``. sphinx_1.7.9/bin/activate`` 之åŽï¼Œæç¤ºç¬¦å°†å˜åŒ–,以指示您æ£åœ¨ä½¿ç”¨æ–° +环境。如果您打开了一个新的shell,那么在构建文档之å‰ï¼Œæ‚¨éœ€è¦é‡æ–°è¿è¡Œæ¤å‘½ä»¤ä»¥å† +次进入虚拟环境ä¸ã€‚ + +图片输出 +-------- + +å†…æ ¸æ–‡æ¡£æž„å»ºç³»ç»ŸåŒ…å«ä¸€ä¸ªæ‰©å±•,å¯ä»¥å¤„ç†GraphVizå’ŒSVGæ ¼å¼çš„图åƒï¼ˆå‚è§ +:ref:`sphinx_kfigure_zh` )。 + +为了让它工作,您需è¦åŒæ—¶å®‰è£…GraphVizå’ŒImageMagick包。如果没有安装这些软件包, +构建系统ä»å°†æž„建文档,但ä¸ä¼šåœ¨è¾“出ä¸åŒ…å«ä»»ä½•图åƒã€‚ + +PDFå’ŒLaTeX构建 +-------------- + +ç›®å‰åªæœ‰Sphinx 1.4åŠæ›´é«˜ç‰ˆæœ¬æ‰æ”¯æŒè¿™ç§æž„建。 + +对于PDFå’ŒLaTeXè¾“å‡ºï¼Œè¿˜éœ€è¦ ``XeLaTeX`` 3.14159265版本。(译注:æ¤ç‰ˆæœ¬å·çœŸå®ž +å˜åœ¨ï¼‰ + +æ ¹æ®å‘行版的ä¸åŒï¼Œæ‚¨å¯èƒ½è¿˜éœ€è¦å®‰è£…一系列 ``texlive`` 软件包,这些软件包æä¾›äº† +``XeLaTeX`` 工作所需的最å°åŠŸèƒ½é›†ã€‚ + +.. _sphinx-pre-install_zh: + +检查Sphinxä¾èµ–项 +---------------- + +这有一个脚本å¯ä»¥è‡ªåŠ¨æ£€æŸ¥Sphinxä¾èµ–项。如果它认得您的å‘行版,还会æç¤ºæ‚¨æ‰€ç”¨å‘行 +版的安装命令:: + + $ ./scripts/sphinx-pre-install + Checking if the needed tools for Fedora release 26 (Twenty Six) are available + Warning: better to also install "texlive-luatex85". + You should run: + + sudo dnf install -y texlive-luatex85 + /usr/bin/virtualenv sphinx_1.7.9 + . sphinx_1.7.9/bin/activate + pip install -r Documentation/sphinx/requirements.txt + + Can't build as 1 mandatory dependency is missing at ./scripts/sphinx-pre-install line 468. + +默认情况下,它会检查htmlå’ŒPDF的所有ä¾èµ–项,包括图åƒã€æ•°å¦è¡¨è¾¾å¼å’ŒLaTeX构建的 +需求,并å‡è®¾å°†ä½¿ç”¨è™šæ‹ŸPython环境。html构建所需的ä¾èµ–é¡¹è¢«è®¤ä¸ºæ˜¯å¿…éœ€çš„ï¼Œå…¶ä»–ä¾ +赖项则是å¯é€‰çš„。 + +它支æŒä¸¤ä¸ªå¯é€‰å‚数: + +``--no-pdf`` + + ç¦ç”¨PDF检查; + +``--no-virtualenv`` + + 使用Sphinxçš„ç³»ç»Ÿæ‰“åŒ…ï¼Œè€Œä¸æ˜¯Python虚拟环境。 + +Sphinx构建 +========== + +ç”Ÿæˆæ–‡æ¡£çš„常用方法是è¿è¡Œ ``make htmldocs`` 或 ``make pdfdocs`` 。还有其它å¯ç”¨ +çš„æ ¼å¼ï¼šè¯·å‚阅 ``make help`` 的文档部分。生æˆçš„æ–‡æ¡£æ”¾åœ¨ ``Documentation/output`` +ä¸‹ç›¸åº”æ ¼å¼çš„å目录ä¸ã€‚ + +è¦ç”Ÿæˆæ–‡æ¡£ï¼Œæ˜¾ç„¶å¿…须安装Sphinx( ``sphinx-build`` )。è¦è®©HTML输出更漂亮,å¯ä»¥ +使用Read the Docs Sphinx主题( ``sphinx_rtd_theme`` )。对于PDFè¾“å‡ºï¼Œæ‚¨è¿˜éœ€è¦ +``XeLaTeX`` å’Œæ¥è‡ªImageMagick(https://www.imagemagick.org)的 ``convert(1)`` 。 +所有这些软件在大多å‘行版ä¸éƒ½å¯ç”¨æˆ–已打包。 + +è¦ä¼ 递é¢å¤–的选项给Sphinx,å¯ä»¥ä½¿ç”¨makeå˜é‡ ``SPHINXOPTS`` 。例如,使用 +``make SPHINXOPTS=-v htmldocs`` 获得更详细的输出。 + + +è¦åˆ 除生æˆçš„æ–‡æ¡£ï¼Œè¯·è¿è¡Œ ``make cleandocs`` 。 + +编写文档 +======== + +æ·»åŠ æ–°æ–‡æ¡£å¾ˆå®¹æ˜“ï¼Œåªéœ€ï¼š + +1. 在 ``Documentation`` 下æŸå¤„æ·»åŠ ä¸€ä¸ªæ–°çš„ ``.rst`` 文件。 +2. 从 ``Documentation/index.rst`` ä¸çš„Sphinx `ä¸»ç›®å½•æ ‘`_ 链接到它。 + +.. _ä¸»ç›®å½•æ ‘: http://www.sphinx-doc.org/en/stable/markup/toctree.html + +对于简å•的文档(比如您现在æ£åœ¨é˜…读的文档),这通常已ç»è¶³å¤Ÿå¥½äº†ï¼Œä½†æ˜¯å¯¹äºŽè¾ƒå¤§ +的文档,最好创建一个å目录(或者使用现有的å目录)。例如,图形å系统文档ä½äºŽ +``Documentation/gpu`` 下,拆分为多个 ``.rst`` 文件,并具有从主目录链接æ¥çš„å• +独索引 ``index.rst`` ï¼ˆæœ‰è‡ªå·±çš„ç›®å½•æ ‘ ``toctree`` )。 + +请å‚阅 `Sphinx <http://www.sphinx-doc.org/>`_ å’Œ `reStructuredText +<http://docutils.sourceforge.net/rst.html>`_ 的文档,以了解如何使用它们。 +特别是Sphinx `reStructuredText 基础`_ 这是开始å¦ä¹ 使用reStructuredTextçš„ +好地方。还有一些 `Sphinx ç‰¹æ®Šæ ‡è®°ç»“æž„`_ 。 + +.. _reStructuredText 基础: http://www.sphinx-doc.org/en/stable/rest.html +.. _Sphinx ç‰¹æ®Šæ ‡è®°ç»“æž„: http://www.sphinx-doc.org/en/stable/markup/index.html + +å†…æ ¸æ–‡æ¡£çš„å…·ä½“æŒ‡å— +------------------ + +è¿™æ˜¯ä¸€äº›å†…æ ¸æ–‡æ¡£çš„å…·ä½“æŒ‡å—: + +* 请ä¸è¦è¿‡äºŽç—´è¿·è½¬æ¢æ ¼å¼åˆ°reStructuredTextã€‚ä¿æŒç®€å•。在大多数情况下,文档 + åº”è¯¥æ˜¯çº¯æ–‡æœ¬ï¼Œæ ¼å¼åº”足够一致,以便å¯ä»¥è½¬æ¢ä¸ºå…¶ä»–æ ¼å¼ã€‚ + +* 将现有文档转æ¢ä¸ºreStructuredText时,请尽é‡å‡å°‘æ ¼å¼æ›´æ”¹ã€‚ + +* åœ¨è½¬æ¢æ–‡æ¡£æ—¶ï¼Œè¿˜è¦æ›´æ–°å†…容,而ä¸ä»…ä»…æ˜¯æ ¼å¼ã€‚ + +* 请éµå¾ªæ ‡é¢˜ä¿®é¥°ç¬¦çš„顺åºï¼š + + 1. ``=`` æ–‡æ¡£æ ‡é¢˜ï¼Œè¦æœ‰ä¸Šçº¿:: + + ======== + æ–‡æ¡£æ ‡é¢˜ + ======== + + 2. ``=`` ç« :: + + ç« æ ‡é¢˜ + ====== + + 3. ``-`` 节:: + + èŠ‚æ ‡é¢˜ + ------ + + 4. ``~`` å°èŠ‚:: + + å°èŠ‚æ ‡é¢˜ + ~~~~~~~~ + + 尽管RST没有规定具体的顺åºï¼ˆâ€œæ²¡æœ‰å¼ºåŠ ä¸€ä¸ªå›ºå®šæ•°é‡å’Œé¡ºåºçš„èŠ‚æ ‡é¢˜è£…é¥°é£Žæ ¼ï¼Œæœ€ç»ˆ + 按照的顺åºå°†æ˜¯å®žé™…é‡åˆ°çš„顺åºã€‚â€ï¼‰ï¼Œä½†æ˜¯æ‹¥æœ‰ä¸€ä¸ªé€šç”¨çº§åˆ«çš„æ–‡æ¡£æ›´å®¹æ˜“éµå¾ªã€‚ + +* 对于æ’入固定宽度的文本å—ï¼ˆç”¨äºŽä»£ç æ ·ä¾‹ã€ç”¨ä¾‹ç‰ï¼‰ï¼š ``::`` ç”¨äºŽè¯æ³•高亮æ„ä¹‰ä¸ + 大的内容,尤其是çŸä»£ç 段; ``.. code-block:: <language>`` 用于需è¦è¯æ³•高亮的 + 较长代ç å—。对于嵌入到文本ä¸çš„简çŸä»£ç 片段,请使用 \`\` 。 + + +C域 +--- + +**Sphinx C域(Domain)** (name c)适用于C API文档。例如,函数原型: + +.. code-block:: rst + + .. c:function:: int ioctl( int fd, int request ) + +å†…æ ¸æ–‡æ¡£çš„CåŸŸæœ‰ä¸€äº›é™„åŠ ç‰¹æ€§ã€‚ä¾‹å¦‚ï¼Œæ‚¨å¯ä»¥ä½¿ç”¨è¯¸å¦‚ ``open`` 或 ``ioctl`` è¿™æ ·çš„ +通用åç§°é‡å‘½å函数的引用å称: + +.. code-block:: rst + + .. c:function:: int ioctl( int fd, int request ) + :name: VIDIOC_LOG_STATUS + +函数å称(例如ioctl)ä»ä¿ç•™åœ¨è¾“出ä¸ï¼Œä½†å¼•用å称从 ``ioctl`` å˜ä¸º +``VIDIOC_LOG_STATUS`` 。æ¤å‡½æ•°çš„索引项也å˜ä¸º ``VIDIOC_LOG_STATUS`` 。 + +请注æ„,ä¸éœ€è¦ä½¿ç”¨ ``c:func:`` 生æˆå‡½æ•°æ–‡æ¡£çš„交å‰å¼•用。由于一些Sphinx扩展的 +神奇力é‡ï¼Œå¦‚果给定函数å的索引项å˜åœ¨ï¼Œæ–‡æ¡£æž„建系统会自动将对 ``function()`` +的引用转æ¢ä¸ºäº¤å‰å¼•ç”¨ã€‚å¦‚æžœåœ¨å†…æ ¸æ–‡æ¡£ä¸çœ‹åˆ° ``c:func:`` çš„ç”¨æ³•ï¼Œè¯·åˆ é™¤å®ƒã€‚ + + +列表 +---- + +我们建议使用 *列å¼è¡¨* æ ¼å¼ã€‚ *列å¼è¡¨* æ ¼å¼æ˜¯äºŒçº§åˆ—表。与ASCII艺术相比,它们对 +文本文件的读者æ¥è¯´å¯èƒ½æ²¡æœ‰é‚£ä¹ˆèˆ’适。但其优点是易于创建或修改,而且修改的差异 +(diff)更有æ„ä¹‰ï¼Œå› ä¸ºå·®å¼‚ä»…é™äºŽä¿®æ”¹çš„内容。 + +*平铺表* 也是一个二级列表,类似于 *列å¼è¡¨* ,但具有一些é¢å¤–特性: + +* 列范围:使用 ``cspan`` 修饰,å¯ä»¥é€šè¿‡å…¶ä»–列扩展å•å…ƒæ ¼ + +* 行范围:使用 ``rspan`` 修饰,å¯ä»¥é€šè¿‡å…¶ä»–行扩展å•å…ƒæ ¼ + +* è‡ªåŠ¨å°†è¡¨æ ¼è¡Œæœ€å³è¾¹çš„å•å…ƒæ ¼æ‰©å±•åˆ°è¯¥è¡Œå³ä¾§ç©ºç¼ºçš„å•å…ƒæ ¼ä¸Šã€‚è‹¥ä½¿ç”¨ + ``:fill-cells:`` 选项,æ¤è¡Œä¸ºå¯ä»¥ä»Ž *自动åˆå¹¶* 更改为 *自动æ’å…¥* ,自动 + æ’入(空)å•å…ƒæ ¼ï¼Œè€Œä¸æ˜¯æ‰©å±•åˆå¹¶åˆ°æœ€åŽä¸€ä¸ªå•å…ƒæ ¼ã€‚ + +选项: + +* ``:header-rows:`` [int] æ ‡é¢˜è¡Œè®¡æ•° +* ``:stub-columns:`` [int] æ ‡é¢˜åˆ—è®¡æ•° +* ``:widths:`` [[int] [int] ... ] 列宽 +* ``:fill-cells:`` æ’入缺少的å•å…ƒæ ¼ï¼Œè€Œä¸æ˜¯è‡ªåЍåˆå¹¶ç¼ºå°‘çš„å•å…ƒæ ¼ + +修饰: + +* ``:cspan:`` [int] 扩展列 +* ``:rspan:`` [int] 扩展行 + +下é¢çš„例忼”ç¤ºäº†å¦‚ä½•ä½¿ç”¨è¿™äº›æ ‡è®°ã€‚åˆ†çº§åˆ—è¡¨çš„ç¬¬ä¸€çº§æ˜¯ *è¡¨æ ¼è¡Œ* 。 *è¡¨æ ¼è¡Œ* ä¸ +åªå…è®¸ä¸€ä¸ªæ ‡è®°ï¼Œå³è¯¥ *è¡¨æ ¼è¡Œ* ä¸çš„å•å…ƒæ ¼åˆ—è¡¨ã€‚ *comments* ( ``..`` )和 +*targets* 例外(例如引用 ``:ref:`最åŽä¸€è¡Œ <last row_zh>``` / :ref:`最åŽä¸€è¡Œ +<last row_zh>` )。 + +.. code-block:: rst + + .. flat-table:: è¡¨æ ¼æ ‡é¢˜ + :widths: 2 1 1 3 + + * - 表头 列1 + - 表头 列2 + - 表头 列3 + - 表头 列4 + + * - 行1 + - å—æ®µ1.1 + - å—æ®µ1.2(自动扩展) + + * - 行2 + - å—æ®µ2.1 + - :rspan:`1` :cspan:`1` å—æ®µ2.2~3.3 + + * .. _`last row_zh`: + + - 行3 + +渲染效果: + + .. flat-table:: è¡¨æ ¼æ ‡é¢˜ + :widths: 2 1 1 3 + + * - 表头 列1 + - 表头 列2 + - 表头 列3 + - 表头 列4 + + * - 行1 + - å—æ®µ1.1 + - å—æ®µ1.2(自动扩展) + + * - 行2 + - å—æ®µ2.1 + - :rspan:`1` :cspan:`1` å—æ®µ2.2~3.3 + + * .. _`last row_zh`: + + - 行3 + +交å‰å¼•用 +-------- + +从一页文档到å¦ä¸€é¡µæ–‡æ¡£çš„交å‰å¼•用å¯ä»¥é€šè¿‡ç®€å•地写出文件路径æ¥å®Œæˆï¼Œæ— ç‰¹æ®Šæ ¼å¼ +è¦æ±‚。路径å¯ä»¥æ˜¯ç»å¯¹è·¯å¾„或相对路径。ç»å¯¹è·¯å¾„从“Documentation/â€å¼€å§‹ã€‚ä¾‹å¦‚ï¼Œè¦ +交å‰å¼•用æ¤é¡µï¼Œä»¥ä¸‹å†™æ³•皆å¯ï¼Œå–å†³äºŽå…·ä½“çš„æ–‡æ¡£ç›®å½•ï¼ˆæ³¨æ„ ``.rst`` æ‰©å±•åæ˜¯å¯é€‰ +的):: + + å‚è§ Documentation/doc-guide/sphinx.rst ã€‚æ¤æ³•始终å¯ç”¨ã€‚ + 请查看 sphinx.rst ,仅在åŒçº§ç›®å½•䏿œ‰æ•ˆã€‚ + 请阅读 ../sphinx.rst ,上级目录ä¸çš„æ–‡ä»¶ã€‚ + +如果è¦ä½¿ç”¨ç›¸å¯¹è·¯å¾„,则需è¦ä½¿ç”¨Sphinxçš„ ``doc`` 修饰。例如,从åŒä¸€ç›®å½•引用æ¤é¡µ +çš„æ“作如下:: + + å‚è§ :doc:`sphinx文档的自定义链接文本 <sphinx>`. + +对于大多数用例,å‰è€…æ˜¯é¦–é€‰ï¼Œå› ä¸ºå®ƒæ›´å¹²å‡€ï¼Œæ›´é€‚åˆé˜…è¯»æºæ–‡ä»¶çš„人。如果您é‡åˆ°ä¸€ +个没有任何特殊作用的 ``:doc:`` 用法,请将其转æ¢ä¸ºæ–‡æ¡£è·¯å¾„。 + +有关交å‰å¼•用kernel-doc函数或类型的信æ¯ï¼Œè¯·å‚阅 +Documentation/doc-guide/kernel-doc.rst 。 + +.. _sphinx_kfigure_zh: + +图形图片 +======== + +å¦‚æžœè¦æ·»åŠ å›¾ç‰‡ï¼Œåº”è¯¥ä½¿ç”¨ ``kernel-figure`` å’Œ ``kernel-image`` 指令。例如, +è¦æ’入具有å¯ç¼©æ”¾å›¾åƒæ ¼å¼çš„图形,请使用SVG(:ref:`svg_image_example_zh` ):: + + .. kernel-figure:: ../../../doc-guide/svg_image.svg + :alt: 简易 SVG 图片 + + SVG 图片示例 + +.. _svg_image_example_zh: + +.. kernel-figure:: ../../../doc-guide/svg_image.svg + :alt: 简易 SVG 图片 + + SVG 图片示例 + +å†…æ ¸figure(和imageï¼‰æŒ‡ä»¤æ”¯æŒ DOT æ ¼å¼æ–‡ä»¶ï¼Œè¯·å‚阅 + +* DOT:http://graphviz.org/pdf/dotguide.pdf +* Graphviz:http://www.graphviz.org/content/dot-language + +一个简å•的例å(:ref:`hello_dot_file_zh` ):: + + .. kernel-figure:: ../../../doc-guide/hello.dot + :alt: ä½ å¥½ï¼Œä¸–ç•Œ + + DOT 示例 + +.. _hello_dot_file_zh: + +.. kernel-figure:: ../../../doc-guide/hello.dot + :alt: ä½ å¥½ï¼Œä¸–ç•Œ + + DOT 示例 + +åµŒå…¥çš„æ¸²æŸ“æ ‡è®°ï¼ˆæˆ–è¯è¨€ï¼‰ï¼Œå¦‚Graphvizçš„ **DOT** ç”± ``kernel-render`` 指令æä¾›:: + + .. kernel-render:: DOT + :alt: 有å‘图 + :caption: åµŒå…¥å¼ **DOT** (Graphviz) 代ç + + digraph foo { + "五棵æ¾" -> "国贸"; + } + +如何渲染å–决于安装的工具。如果安装了Graphviz,您将看到一个矢é‡å›¾åƒã€‚å¦åˆ™ï¼ŒåŽŸå§‹ +æ ‡è®°å°†ä½œä¸º *æ–‡å—å—* æ’入(:ref:`hello_dot_render_zh` )。 + +.. _hello_dot_render_zh: + +.. kernel-render:: DOT + :alt: 有å‘图 + :caption: åµŒå…¥å¼ **DOT** (Graphviz) 代ç + + digraph foo { + "五棵æ¾" -> "国贸"; + } + +*render* æŒ‡ä»¤åŒ…å« *figure* 指令ä¸å·²çŸ¥çš„æ‰€æœ‰é€‰é¡¹ï¼Œä»¥åŠé€‰é¡¹ ``caption`` 。如果 +``caption`` 有值,则æ’入一个 *figure* èŠ‚ç‚¹ï¼Œè‹¥æ— ï¼Œåˆ™æ’入一个 *image* 节点。 +如果您想引用它,还需è¦ä¸€ä¸ª ``caption`` (:ref:`hello_svg_render_zh` )。 + +åµŒå…¥å¼ **SVG**:: + + .. kernel-render:: SVG + :caption: åµŒå…¥å¼ **SVG** æ ‡è®° + :alt: å³ä¸Šç®å¤´ + + <?xml version="1.0" encoding="UTF-8"?> + <svg xmlns="http://www.w3.org/2000/svg" version="1.1" ...> + ... + </svg> + +.. _hello_svg_render_zh: + +.. kernel-render:: SVG + :caption: åµŒå…¥å¼ **SVG** æ ‡è®° + :alt: å³ä¸Šç®å¤´ + + <?xml version="1.0" encoding="UTF-8"?> + <svg xmlns="http://www.w3.org/2000/svg" + version="1.1" baseProfile="full" width="70px" height="40px" viewBox="0 0 700 400"> + <line x1="180" y1="370" x2="500" y2="50" stroke="black" stroke-width="15px"/> + <polygon points="585 0 525 25 585 50" transform="rotate(135 525 25)"/> + </svg> + diff --git a/Documentation/translations/zh_CN/index.rst b/Documentation/translations/zh_CN/index.rst index be6f11176200f67050f3225193c3fe02cd5cc177..ee6b20ca90803e0556e2f2bb49c917aeaa9c9897 100644 --- a/Documentation/translations/zh_CN/index.rst +++ b/Documentation/translations/zh_CN/index.rst @@ -18,8 +18,18 @@ admin-guide/index process/index + dev-tools/index + doc-guide/index + kernel-hacking/index filesystems/index arm64/index + sound/index + cpu-freq/index + mips/index + iio/index + riscv/index + core-api/index + openrisc/index ç›®å½•å’Œè¡¨æ ¼ ---------- diff --git a/Documentation/translations/zh_CN/kernel-hacking/hacking.rst b/Documentation/translations/zh_CN/kernel-hacking/hacking.rst new file mode 100644 index 0000000000000000000000000000000000000000..ab974faddecf18f47bd1edf66e9b4e4383664a26 --- /dev/null +++ b/Documentation/translations/zh_CN/kernel-hacking/hacking.rst @@ -0,0 +1,708 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/kernel-hacking/hacking.rst + +:译者: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> + +============== +å†…æ ¸éª‡å®¢æŒ‡åŒ— +============== + +:作者: Rusty Russell + +引言 +===== + +欢迎咱优雅的读者们æ¥é˜…读Rustyçš„éžå¸¸ä¸é 谱的Linuxå†…æ ¸éª‡å®¢ï¼ˆHacking)指å—。本文 +æè¿°äº†å†…æ ¸ä»£ç 的常è§ä¾‹ç¨‹å’Œä¸€èˆ¬è¦æ±‚ï¼šå…¶ç›®æ ‡æ˜¯å¼•å¯¼æœ‰ç»éªŒçš„C程åºå‘˜å…¥é—¨Linuxå†…æ ¸ +å¼€å‘。我回é¿äº†å®žçŽ°ç»†èŠ‚ï¼šè¿™æ˜¯ä»£ç è¦åšçš„,也忽略了很多有用的例程。 + +åœ¨ä½ è¯»è¿™ç¯‡æ–‡ç« ä¹‹å‰ï¼Œè¯·ç†è§£æˆ‘ä»Žæ¥æ²¡æœ‰æƒ³è¿‡è¦å†™è¿™ç¯‡æ–‡ç« ï¼Œå› ä¸ºæˆ‘çš„èµ„åŽ†å¤ªä½Žäº†ï¼› +ä½†æˆ‘ä¸€ç›´æƒ³è¯»è¿™æ ·çš„æ–‡ç« ï¼Œè‡ªå·±å†™æ˜¯å”¯ä¸€çš„æ–¹æ³•ã€‚æˆ‘å¸Œæœ›å®ƒèƒ½æˆé•¿ä¸ºä¸€ä¸ªæœ€ä½³å®žè·µã€ +通用起点和其他信æ¯çš„æ±‡ç¼–。 + +玩家 +======= + +在任何时候,系统ä¸çš„æ¯ä¸ªCPU都å¯ä»¥ï¼š + +- ä¸Žä»»ä½•è¿›ç¨‹æ— å…³ï¼ŒæœåŠ¡äºŽç¡¬ä»¶ä¸æ–ï¼› + +- ä¸Žä»»ä½•è¿›ç¨‹æ— å…³ï¼ŒæœåŠ¡äºŽè½¯ä»¶ä¸æ–(softirq)或å任务(tasklet); + +- è¿è¡ŒäºŽå†…æ ¸ç©ºé—´ä¸ï¼Œä¸Žè¿›ç¨‹ï¼ˆç”¨æˆ·ä¸Šä¸‹æ–‡ï¼‰ç›¸å…³è”ï¼› + +- 在用户空间ä¸è¿è¡Œè¿›ç¨‹ã€‚ + +它们之间有优先级顺åºã€‚最下é¢çš„两个å¯ä»¥äº’相抢å ,但上é¢ä¸ºä¸¥æ ¼çš„层次结构: +æ¯ä¸ªå±‚级åªèƒ½è¢«ä¸Šæ–¹çš„æŠ¢å ã€‚ä¾‹å¦‚ï¼Œå½“ä¸€ä¸ªè½¯ä¸æ–在CPU上è¿è¡Œæ—¶ï¼Œæ²¡æœ‰å…¶ä»–è½¯ä¸æ– +会抢å å®ƒï¼Œä½†æ˜¯ç¡¬ä»¶ä¸æ–å¯ä»¥æŠ¢å 它。ä¸è¿‡ï¼Œç³»ç»Ÿä¸çš„任何其他CPU都是独立执行的。 + +我们将会看到许多方法,用户上下文å¯ä»¥é˜»æ¢ä¸æ–,从而æˆä¸ºçœŸæ£çš„ä¸å¯æŠ¢å 。 + +用户上下文 +------------ + +用户上下文是指当您从系统调用或其他陷阱进入时:就åƒç”¨æˆ·ç©ºé—´ä¸€æ ·ï¼Œæ‚¨å¯ä»¥è¢«æ›´ +é‡è¦çš„ä»»åŠ¡å’Œä¸æ–抢å 。您å¯ä»¥é€šè¿‡è°ƒç”¨ :c:func:`schedule()` 进行ç¡çœ 。 + +.. note:: + + 在模å—åŠ è½½å’Œå¸è½½ä»¥åŠå—设备层上的æ“ä½œæ—¶ï¼Œä½ å§‹ç»ˆå¤„äºŽç”¨æˆ·ä¸Šä¸‹æ–‡ä¸ã€‚ + +在用户上下文ä¸ï¼Œå½“å‰ ``current`` æŒ‡é’ˆï¼ˆæŒ‡ç¤ºæˆ‘ä»¬å½“å‰æ£åœ¨æ‰§è¡Œçš„任务)是有效的, +且 :c:func:`in_interrupt()` ( ``include/linux/preempt.h`` )值为éžï¼ˆfalse)。 + +.. warning:: + + 请注æ„,如果您ç¦ç”¨äº†æŠ¢å æˆ–è½¯ä¸æ–(è§ä¸‹æ–‡ï¼‰ï¼Œ:c:func:`in_interrupt()` 会 + 返回å‡é˜³æ€§ã€‚ + +ç¡¬ä»¶ä¸æ–(Hard IRQs) +---------------------- + +åƒå®šæ—¶å™¨ã€ç½‘å¡å’Œé”®ç›˜ç‰éƒ½æ˜¯å¯èƒ½åœ¨ä»»æ„æ—¶åˆ»äº§ç”Ÿä¸æ–çš„çœŸå®žç¡¬ä»¶ã€‚å†…æ ¸è¿è¡Œä¸æ– +处ç†ç¨‹åºï¼Œä¸ºç¡¬ä»¶æä¾›æœåŠ¡ã€‚å†…æ ¸ç¡®ä¿å¤„ç†ç¨‹åºæ°¸è¿œä¸ä¼šé‡å…¥ï¼šå¦‚果相åŒçš„䏿–到达, +å®ƒå°†è¢«æŽ’é˜Ÿï¼ˆæˆ–ä¸¢å¼ƒï¼‰ã€‚å› ä¸ºå®ƒä¼šå…³é—䏿–,所以处ç†ç¨‹åºå¿…é¡»å¾ˆå¿«ï¼šé€šå¸¸å®ƒåªæ˜¯ +ç¡®è®¤ä¸æ–ï¼Œæ ‡è®°ä¸€ä¸ªâ€œè½¯ä»¶ä¸æ–â€ä»¥æ‰§è¡Œå¹¶é€€å‡ºã€‚ + +您å¯ä»¥é€šè¿‡ :c:func:`in_irq()` 返回真æ¥åˆ¤æ–æ‚¨å¤„äºŽç¡¬ä»¶ä¸æ–状æ€ã€‚ + +.. warning:: + + 请注æ„ï¼Œå¦‚æžœä¸æ–被ç¦ç”¨ï¼Œè¿™å°†è¿”回å‡é˜³æ€§ï¼ˆè§ä¸‹æ–‡ï¼‰ã€‚ + +è½¯ä»¶ä¸æ–ä¸Šä¸‹æ–‡ï¼šè½¯ä¸æ–(Softirqs)与å任务(Tasklets) +------------------------------------------------------- + +当系统调用å³å°†è¿”å›žç”¨æˆ·ç©ºé—´æˆ–ç¡¬ä»¶ä¸æ–处ç†ç¨‹åºé€€å‡ºæ—¶ï¼Œä»»ä½•æ ‡è®°ä¸ºæŒ‚èµ·ï¼ˆé€šå¸¸é€š +è¿‡ç¡¬ä»¶ä¸æ–ï¼‰çš„â€œè½¯ä»¶ä¸æ–â€å°†è¿è¡Œï¼ˆ ``kernel/softirq.c`` )。 + +æ¤å¤„完æˆäº†è®¸å¤šçœŸæ£çš„䏿–处ç†å·¥ä½œã€‚在å‘SMPè¿‡æ¸¡çš„æ—©æœŸï¼Œåªæœ‰â€œbottom halvesä¸‹åŠ +部â€ï¼ˆBHsï¼‰æœºåˆ¶ï¼Œæ— æ³•åˆ©ç”¨å¤šä¸ªCPU的优势。在从那些一团糟的就电脑切æ¢è¿‡æ¥åŽä¸ä¹…, +我们放弃了这个é™åˆ¶ï¼Œè½¬è€Œä½¿ç”¨â€œè½¯ä¸æ–â€ã€‚ + +``include/linux/interrupt.h`` 列出了ä¸åŒçš„è½¯ä¸æ–ã€‚å®šæ—¶å™¨è½¯ä¸æ–是一个éžå¸¸é‡è¦ +çš„è½¯ä¸æ–( ``include/linux/timer.h`` ):您å¯ä»¥æ³¨å†Œå®ƒä»¥åœ¨ç»™å®šæ—¶é—´åŽä¸ºæ‚¨è°ƒç”¨ +函数。 + +è½¯ä¸æ–通常是一个很难处ç†çš„é—®é¢˜ï¼Œå› ä¸ºåŒä¸€ä¸ªè½¯ä¸æ–å°†åŒæ—¶åœ¨å¤šä¸ªCPU上è¿è¡Œã€‚å› æ¤ï¼Œ +å任务( ``include/linux/interrupt.h`` )更常用:它们是动æ€å¯æ³¨å†Œçš„(æ„å‘³ç€ +您å¯ä»¥æ‹¥æœ‰ä»»æ„æ•°é‡ï¼‰ï¼Œå¹¶ä¸”它们还ä¿è¯ä»»ä½•å任务都åªèƒ½åœ¨ä¸€ä¸ªCPU上è¿è¡Œï¼Œä¸åŒçš„ +å任务也å¯ä»¥åŒæ—¶è¿è¡Œã€‚ + +.. warning:: + + “taskletâ€è¿™ä¸ªåå—æ˜¯è¯¯å¯¼æ€§çš„ï¼šå®ƒä»¬ä¸Žâ€œä»»åŠ¡â€æ— 关,å¯èƒ½æ›´å¤šä¸Žå½“æ—¶ + 阿列克谢·库兹涅ä½å¤«äº«ç”¨çš„糟糕ä¼ç‰¹åŠ æœ‰å…³ã€‚ + +ä½ å¯ä»¥ä½¿ç”¨ :c:func:`in_softirq()` å®ï¼ˆ ``include/linux/preempt.h`` )æ¥ç¡®è®¤ +是å¦å¤„äºŽè½¯ä¸æ–(或å任务)ä¸ã€‚ + +.. warning:: + + 注æ„ï¼Œå¦‚æžœæŒæœ‰ :ref:`bottom half lock <local_bh_disable_zh>` é”,这将返回 + å‡é˜³æ€§ã€‚ + +一些基本规则 +================ + +缺少内å˜ä¿æŠ¤ + å¦‚æžœä½ æŸå了内å˜ï¼Œæ— è®ºæ˜¯åœ¨ç”¨æˆ·ä¸Šä¸‹æ–‡è¿˜æ˜¯ä¸æ–上下文ä¸ï¼Œæ•´ä¸ªæœºå™¨éƒ½ä¼šå´©æºƒã€‚ + ä½ ç¡®å®šä½ ä¸èƒ½åœ¨ç”¨æˆ·ç©ºé—´é‡Œåšä½ 想åšçš„事å—? + +缺少浮点或MMX + FPU上下文ä¸ä¼šè¢«ä¿å˜ï¼›å³ä½¿åœ¨ç”¨æˆ·ä¸Šä¸‹æ–‡ä¸ï¼ŒFPU状æ€ä¹Ÿå¯èƒ½ä¸Žå½“å‰è¿›ç¨‹ä¸ä¸€è‡´ï¼š + 您会弄乱æŸäº›ç”¨æˆ·è¿›ç¨‹çš„FPU状æ€ã€‚如果真的è¦è¿™æ ·åšï¼Œå°±å¿…须显å¼åœ°ä¿å˜/æ¢å¤ + 完整的FPU状æ€ï¼ˆå¹¶é¿å…上下文切æ¢ï¼‰ã€‚è¿™é€šå¸¸ä¸æ˜¯ä¸ªå¥½ä¸»æ„;请优先用定点算法。 + +ä¸¥æ ¼çš„å †æ ˆé™åˆ¶ + 对于大多数32ä½ä½“ç³»ç»“æž„ï¼Œæ ¹æ®é…置选项的ä¸åŒå†…æ ¸å †æ ˆå¤§çº¦ä¸º3K到6K;对于大 + 多数64使œºå™¨ï¼Œå†…æ ¸å †æ ˆå¤§çº¦ä¸º14K,并且ç»å¸¸ä¸Žä¸æ–å…±äº«ï¼Œå› æ¤ä½ æ— æ³•ä½¿ç”¨å…¨éƒ¨ã€‚ + 应é¿å…æ·±åº¦é€’å½’å’Œæ ˆä¸Šçš„å·¨åž‹æœ¬åœ°æ•°ç»„ï¼ˆç”¨åŠ¨æ€åˆ†é…它们æ¥ä»£æ›¿ï¼‰ã€‚ + +Linuxå†…æ ¸æ˜¯å¯ç§»æ¤çš„ + å°±è¿™æ ·å§ã€‚您的代ç 应该是纯64ä½çš„,并且ä¸ä¾èµ–于å—节åºï¼ˆendian)。您还应该 + å°½é‡å‡å°‘CPUç‰¹å®šçš„ä¸œè¥¿ï¼Œä¾‹å¦‚å†…è”æ±‡ç¼–(inline assembly)应该被干净地å°è£…å’Œ + 最å°åŒ–以便于移æ¤ã€‚一般æ¥è¯´ï¼Œå®ƒåº”该局é™äºŽå†…æ ¸æ ‘ä¸æœ‰ä½“系结构ä¾èµ–的部分。 + +输入输出控制(ioctls):é¿å…编写新的系统调用 +============================================== + +系统调用(system call)通常看起æ¥åƒè¿™æ ·:: + + asmlinkage long sys_mycall(int arg) + { + return 0; + } + + +é¦–å…ˆï¼Œåœ¨å¤§å¤šæ•°æƒ…å†µä¸‹ï¼Œæ‚¨æ— éœ€åˆ›å»ºæ–°çš„ç³»ç»Ÿè°ƒç”¨ã€‚åˆ›å»ºä¸€ä¸ªå—符设备并为其实现适当 +的输入输出控制(ioctlsï¼‰ã€‚è¿™æ¯”ç³»ç»Ÿè°ƒç”¨çµæ´»å¾—多,ä¸å¿…写进æ¯ä¸ªä½“系结构的 +``include/asm/unistd.h`` å’Œ ``arch/kernel/entry.S`` 文件里,而且更容易被Linus +接å—。 + +å¦‚æžœæ‚¨çš„ç¨‹åºæ‰€åšçš„åªæ˜¯è¯»å–æˆ–å†™å…¥ä¸€äº›å‚æ•°ï¼Œè¯·è€ƒè™‘实现 :c:func:`sysfs()` 接å£ã€‚ + +在输入输出控制ä¸ï¼Œæ‚¨å¤„äºŽè¿›ç¨‹çš„ç”¨æˆ·ä¸Šä¸‹æ–‡ã€‚å‡ºçŽ°é”™è¯¯æ—¶ï¼Œè¿”å›žä¸€ä¸ªè´Ÿçš„é”™è¯¯å‚æ•° +(errno,请å‚阅 ``include/uapi/asm-generic/errno-base.h`` 〠+``include/uapi/asm-generic/errno.h`` å’Œ ``include/linux/errno.h`` ),å¦åˆ™è¿” +回0。 + +在ç¡çœ 之åŽï¼Œæ‚¨åº”该检查是å¦å‡ºçŽ°äº†ä¿¡å·ï¼šUnix/Linux处ç†ä¿¡å·çš„æ–¹æ³•是暂时退出系统 +调用,并返回 ``-ERESTARTSYS`` 错误。系统调用入å£ä»£ç 将切æ¢å›žç”¨æˆ·ä¸Šä¸‹æ–‡ï¼Œå¤„ç† +ä¿¡å·å¤„ç†ç¨‹åºï¼Œç„¶åŽç³»ç»Ÿè°ƒç”¨å°†é‡æ–°å¯åŠ¨ï¼ˆé™¤éžç”¨æˆ·ç¦ç”¨äº†è¯¥åŠŸèƒ½ï¼‰ã€‚å› æ¤ï¼Œæ‚¨åº”该准 +备好处ç†é‡æ–°å¯åŠ¨ï¼Œä¾‹å¦‚è‹¥æ‚¨å¤„ç†æŸäº›æ•°æ®ç»“构到一åŠã€‚ + +:: + + if (signal_pending(current)) + return -ERESTARTSYS; + + +å¦‚æžœä½ è¦åšæ›´é•¿æ—¶é—´çš„è®¡ç®—ï¼šä¼˜å…ˆè€ƒè™‘ç”¨æˆ·ç©ºé—´ã€‚å¦‚æžœä½ çœŸçš„æƒ³åœ¨å†…æ ¸ä¸åšè¿™ä»¶äº‹ï¼Œä½ +åº”è¯¥å®šæœŸæ£€æŸ¥ä½ æ˜¯å¦éœ€è¦è®©å‡ºCPU(请记得æ¯ä¸ªCPU都有å作多任务)。 +ä¹ æƒ¯ç”¨æ³•:: + + cond_resched(); /* Will sleep */ + + +接å£è®¾è®¡çš„å°æ³¨é‡Šï¼šUNIXç³»ç»Ÿè°ƒç”¨çš„æ ¼è¨€æ˜¯â€œæä¾›æœºåˆ¶è€Œä¸æ˜¯ç–ç•¥ +Provide mechanism not policyâ€ã€‚ + +æ»é”çš„â€œé…æ–¹â€ +==================== + +您ä¸èƒ½è°ƒç”¨ä»»ä½•å¯èƒ½ç¡çœ 的程åºï¼Œé™¤éžï¼š + +- 您处于用户上下文ä¸ã€‚ + +- ä½ æœªæ‹¥æœ‰ä»»ä½•è‡ªæ—‹é”。 + +- 您已ç»å¯ç”¨ä¸æ–(实际上,Andi Kleen说调度代ç 将为您å¯ç”¨å®ƒä»¬ï¼Œä½†è¿™å¯èƒ½ä¸æ˜¯ + 您想è¦çš„)。 + +注æ„,有些函数å¯èƒ½éšå¼åœ°ç¡çœ :常è§çš„æ˜¯ç”¨æˆ·ç©ºé—´è®¿é—®å‡½æ•°ï¼ˆ\*_user)和没有 +``GFP_ATOMIC`` 的内å˜åˆ†é…函数。 + +您应该始终打开 ``CONFIG_DEBUG_ATOMIC_SLEEP`` 项æ¥ç¼–è¯‘å†…æ ¸ï¼Œå¦‚æžœæ‚¨è¿å这些 +规则,它将è¦å‘Šæ‚¨ã€‚å¦‚æžœä½ **真的** è¿åäº†è§„åˆ™ï¼Œä½ æœ€ç»ˆä¼šé”ä½ä½ 的电脑。 + +çœŸçš„ä¼šè¿™æ ·ã€‚ + + +常用函数/ç¨‹åº +=============== + +:c:func:`printk()` +------------------ + +定义于 ``include/linux/printk.h`` + +:c:func:`printk()` å°†å†…æ ¸æ¶ˆæ¯æä¾›ç»™æŽ§åˆ¶å°ã€dmesgå’Œsyslog守护进程。它对于调 +试和报告错误很有用,并且å¯ä»¥åœ¨ä¸æ–上下文ä¸ä½¿ç”¨ï¼Œä½†æ˜¯ä½¿ç”¨æ—¶è¦å°å¿ƒï¼šå¦‚果机器 +的控制å°ä¸å……æ–¥ç€printk消æ¯åˆ™ä¼šæ— 法使用。它使用与ANSI C printfåŸºæœ¬å…¼å®¹çš„æ ¼å¼ +å—符串,并通过Cå—符串串è”为其æä¾›ç¬¬ä¸€ä¸ªâ€œä¼˜å…ˆâ€å‚æ•°:: + + printk(KERN_INFO "i = %u\n", i); + + +å‚è§ ``include/linux/kern_levels.h`` ;了解其他 ``KERN_`` 值;syslog将这些值 +解释为级别。特殊用法:打å°IP地å€ä½¿ç”¨:: + + __be32 ipaddress; + printk(KERN_INFO "my ip: %pI4\n", &ipaddress); + + +:c:func:`printk()` 内部使用的1Kç¼“å†²åŒºï¼Œä¸æ•获溢出。请确ä¿è¶³å¤Ÿä½¿ç”¨ã€‚ + +.. note:: + + 当您开始在用户程åºä¸å°†printf打æˆprintk时,就知é“自己是真æ£çš„å†…æ ¸ç¨‹åºå‘˜äº† + :) + +.. note:: + + å¦ä¸€ä¸ªæ³¨é‡Šï¼šæœ€åˆçš„unix第å…版æºä»£ç 在其printf函数的顶部有一个注释:“printf + ä¸åº”该用于å½å½å–³å–³â€ã€‚ä½ ä¹Ÿåº”è¯¥éµå¾ªæ¤å»ºè®®ã€‚ + +:c:func:`copy_to_user()` / :c:func:`copy_from_user()` / :c:func:`get_user()` / :c:func:`put_user()` +--------------------------------------------------------------------------------------------------- + +定义于 ``include/linux/uaccess.h`` / ``asm/uaccess.h`` + +**[ç¡çœ ]** + +:c:func:`put_user()` å’Œ :c:func:`get_user()` 用于从用户空间ä¸èŽ·å–å’Œå‘用户空 +é—´ä¸ä¼ 出å•个值(如intã€char或long)。指å‘用户空间的指针永远ä¸åº”è¯¥ç›´æŽ¥å–æ¶ˆ +引用:应该使用这些程åºå¤åˆ¶æ•°æ®ã€‚两者都返回 ``-EFAULT`` 或 0。 + +:c:func:`copy_to_user()` å’Œ :c:func:`copy_from_user()` 更通用:它们从/å‘用户 +空间å¤åˆ¶ä»»æ„æ•°é‡çš„æ•°æ®ã€‚ + +.. warning:: + + 与 :c:func:`put_user()` å’Œ :c:func:`get_user()` ä¸åŒï¼Œå®ƒä»¬è¿”回未å¤åˆ¶çš„ + æ•°æ®é‡ï¼ˆå³0ä»ç„¶æ„å‘³ç€æˆåŠŸï¼‰ã€‚ + +ã€æ˜¯çš„ï¼Œè¿™ä¸ªæ„šè ¢çš„æŽ¥å£çœŸå¿ƒè®©æˆ‘尴尬。ç«çˆ†çš„壿°´ä»—大概æ¯å¹´éƒ½ä¼šå‘生。 +—— Rusty Russell】 + +这些函数å¯ä»¥éšå¼ç¡çœ 。它ä¸åº”该在用户上下文之外调用(没有æ„义)ã€è°ƒç”¨æ—¶ç¦ç”¨ä¸æ– +或获得自旋é”。 + +:c:func:`kmalloc()`/:c:func:`kfree()` +------------------------------------- + +定义于 ``include/linux/slab.h`` + +**[å¯èƒ½ç¡çœ :è§ä¸‹]** + +这些函数用于动æ€è¯·æ±‚指针对é½çš„内å˜å—,类似用户空间ä¸çš„mallocå’Œfree,但 +:c:func:`kmalloc()` 需è¦é¢å¤–çš„æ ‡å¿—è¯ã€‚é‡è¦çš„值: + +``GFP_KERNEL`` + å¯ä»¥ç¡çœ 和交æ¢ä»¥é‡Šæ”¾å†…å˜ã€‚åªå…许在用户上下文ä¸ä½¿ç”¨ï¼Œä½†è¿™æ˜¯åˆ†é…å†…å˜æœ€å¯é + 的方法。 + +``GFP_ATOMIC`` + ä¸ä¼šç¡çœ 。较 ``GFP_KERNEL`` æ›´ä¸å¯é ,但å¯ä»¥ä»Žä¸æ–ä¸Šä¸‹æ–‡è°ƒç”¨ã€‚ä½ **应该** + 有一个很好的内å˜ä¸è¶³é”™è¯¯å¤„ç†ç–略。 + +``GFP_DMA`` + 分é…低于16MBçš„ISA DMAã€‚å¦‚æžœä½ ä¸çŸ¥é“é‚£æ˜¯ä»€ä¹ˆï¼Œé‚£ä½ å°±ä¸éœ€è¦äº†ã€‚éžå¸¸ä¸å¯é 。 + +å¦‚æžœæ‚¨çœ‹åˆ°ä¸€ä¸ªä»Žæ— æ•ˆä¸Šä¸‹æ–‡è¦å‘Šæ¶ˆæ¯è°ƒç”¨çš„ç¡çœ 的函数,那么您å¯èƒ½åœ¨æ²¡æœ‰ +``GFP_ATOMIC`` çš„æƒ…å†µä¸‹ä»Žä¸æ–上下文调用了一个ç¡çœ 的分é…å‡½æ•°ã€‚ä½ å¿…é¡»ç«‹å³ä¿®å¤ï¼Œ +å¿«ç‚¹ï¼ + +å¦‚æžœä½ è¦åˆ†é…至少 ``PAGE_SIZE`` ( ``asm/page.h`` 或 ``asm/page_types.h`` ) +å—节,请考虑使用 :c:func:`__get_free_pages()` ( ``include/linux/gfp.h`` )。 +它采用顺åºå‚数(0表示页é¢å¤§å°ï¼Œ1表示åŒé¡µï¼Œ2表示四页……)和与上述相åŒçš„å†…å˜ +ä¼˜å…ˆçº§æ ‡å¿—å—。 + +如果分é…çš„å—节数超过一页,å¯ä»¥ä½¿ç”¨ :c:func:`vmalloc()` ã€‚å®ƒå°†åœ¨å†…æ ¸æ˜ å°„ä¸åˆ† +é…虚拟内å˜ã€‚æ¤å—在物ç†å†…å˜ä¸ä¸æ˜¯è¿žç»çš„,但是MMU(内å˜ç®¡ç†å•元)使它看起æ¥åƒ +是为您准备好的连ç»ç©ºé—´ï¼ˆå› æ¤å®ƒåªæ˜¯çœ‹èµ·æ¥å¯¹cpu连ç»ï¼Œå¯¹å¤–部设备驱动程åºåˆ™ä¸ç„¶ï¼‰ã€‚ +如果您真的需è¦ä¸ºä¸€äº›å¥‡æ€ªçš„设备æä¾›å¤§é‡ç‰©ç†ä¸Šè¿žç»çš„内å˜ï¼Œé‚£ä¹ˆæ‚¨å°±ä¼šé‡åˆ°é—®é¢˜ï¼š +Linuxå¯¹æ¤æ”¯æŒå¾ˆå·®ï¼Œå› 为æ£åœ¨è¿è¡Œçš„å†…æ ¸ä¸çš„内å˜ç¢Žç‰‡åŒ–会使它å˜å¾—很困难。最好的 +方法是在引导过程的早期通过 :c:func:`alloc_bootmem()` 函数分é…。 + +在创建自己的常用对象缓å˜ä¹‹å‰ï¼Œè¯·è€ƒè™‘使用 ``include/linux/slab.h`` ä¸çš„slab +缓å˜ã€‚ + +:c:macro:`current` +------------------ + +定义于 ``include/asm/current.h`` + +æ¤å…¨å±€å˜é‡ï¼ˆå…¶å®žæ˜¯å®ï¼‰åŒ…嫿Œ‡å‘当å‰ä»»åŠ¡ç»“æž„ï¼ˆtask structureï¼‰çš„æŒ‡é’ˆï¼Œå› æ¤ä»…在 +ç”¨æˆ·ä¸Šä¸‹æ–‡ä¸æœ‰æ•ˆã€‚例如,当进程进行系统调用时,这将指å‘调用进程的任务结构。 +åœ¨ä¸æ–上下文ä¸ä¸ä¸ºç©ºï¼ˆ**not NULL**)。 + +:c:func:`mdelay()`/:c:func:`udelay()` +------------------------------------- + +定义于 ``include/asm/delay.h`` / ``include/linux/delay.h`` + +:c:func:`udelay()` å’Œ :c:func:`ndelay()` 函数å¯è¢«ç”¨äºŽå°æš‚åœã€‚ä¸è¦å¯¹å®ƒä»¬ä½¿ç”¨ +å¤§çš„å€¼ï¼Œå› ä¸ºè¿™æ ·ä¼šå¯¼è‡´æº¢å‡ºâ€”â€”å¸®åŠ©å‡½æ•° :c:func:`mdelay()` 在这里很有用,或者 +考虑 :c:func:`msleep()`。 + +:c:func:`cpu_to_be32()`/:c:func:`be32_to_cpu()`/:c:func:`cpu_to_le32()`/:c:func:`le32_to_cpu()` +----------------------------------------------------------------------------------------------- + +定义于 ``include/asm/byteorder.h`` + +:c:func:`cpu_to_be32()` 系列函数(其ä¸â€œ32â€å¯ä»¥æ›¿æ¢ä¸º64或16,“beâ€å¯ä»¥æ›¿æ¢ä¸º +“leâ€ï¼‰æ˜¯åœ¨å†…æ ¸ä¸è¿›è¡Œå—节åºè½¬æ¢çš„常用方法:它们返回转æ¢åŽçš„值。所有的å˜ä½“也 +æä¾›åå‘转æ¢å‡½æ•°ï¼š +:c:func:`be32_to_cpu()` ç‰ã€‚ + +这些函数有两个主è¦çš„å˜ä½“:指针å˜ä½“,例如 :c:func:`cpu_to_be32p()` ï¼Œå®ƒèŽ·å– +指å‘给定类型的指针,并返回转æ¢åŽçš„值。å¦ä¸€ä¸ªå˜ä½“是“in-situâ€ç³»åˆ—,例如 +:c:func:`cpu_to_be32s()` ï¼Œå®ƒè½¬æ¢æŒ‡é’ˆå¼•用的值,并返回void。 + +:c:func:`local_irq_save()`/:c:func:`local_irq_restore()` +-------------------------------------------------------- + +定义于 ``include/linux/irqflags.h`` + + +这些程åºç¦ç”¨æœ¬åœ°CPUä¸Šçš„ç¡¬ä¸æ–,并还原它们。它们是å¯é‡å…¥çš„;在其一个 +``unsigned long flags`` 傿•°ä¸ä¿å˜ä»¥å‰çš„状æ€ã€‚如果您知é“䏿–å·²å¯ç”¨ï¼Œé‚£ä¹ˆå¯ +直接使用 :c:func:`local_irq_disable()` å’Œ :c:func:`local_irq_enable()`。 + +.. _local_bh_disable_zh: + +:c:func:`local_bh_disable()`/:c:func:`local_bh_enable()` +-------------------------------------------------------- + +定义于 ``include/linux/bottom_half.h`` + + +这些程åºç¦ç”¨æœ¬åœ°CPUä¸Šçš„è½¯ä¸æ–,并还原它们。它们是å¯é‡å…¥çš„;如果之å‰ç¦ç”¨äº† +è½¯ä¸æ–,那么在调用这对函数之åŽä»ç„¶ä¼šç¦ç”¨å®ƒä»¬ã€‚它们阻æ¢è½¯ä¸æ–å’Œåä»»åŠ¡åœ¨å½“å‰ +CPU上è¿è¡Œã€‚ + +:c:func:`smp_processor_id()` +---------------------------- + +定义于 ``include/linux/smp.h`` + +:c:func:`get_cpu()` ç¦ç”¨æŠ¢å ï¼ˆè¿™æ ·æ‚¨å°±ä¸ä¼šçªç„¶ç§»åŠ¨åˆ°å¦ä¸€ä¸ªcpuï¼‰å¹¶è¿”å›žå½“å‰ +处ç†å™¨å·ï¼Œä»‹äºŽ0å’Œ ``NR_CPUS`` 之间。请注æ„,CPUç¼–å·ä¸ä¸€å®šæ˜¯è¿žç»çš„。完æˆåŽï¼Œ +使用 :c:func:`put_cpu()` 冿¬¡è¿”回。 + +å¦‚æžœæ‚¨çŸ¥é“æ‚¨ä¸èƒ½è¢«å¦ä¸€ä¸ªä»»åŠ¡æŠ¢å ï¼ˆå³æ‚¨å¤„äºŽä¸æ–上下文ä¸ï¼Œæˆ–å·²ç¦ç”¨æŠ¢å ),您 +å¯ä»¥ä½¿ç”¨ :c:func:`smp_processor_id()`。 + +``__init``/``__exit``/``__initdata`` +------------------------------------ + +定义于 ``include/linux/init.h`` + +引导之åŽï¼Œå†…æ ¸é‡Šæ”¾ä¸€ä¸ªç‰¹æ®Šçš„éƒ¨åˆ†ï¼›ç”¨ ``__init`` æ ‡è®°çš„å‡½æ•°å’Œç”¨ ``__initdata`` +æ ‡è®°çš„æ•°æ®ç»“构在引导完æˆåŽè¢«ä¸¢å¼ƒï¼šåŒæ ·åœ°ï¼Œæ¨¡å—在åˆå§‹åŒ–åŽä¸¢å¼ƒæ¤å†…å˜ã€‚ +``__exit`` 用于声明åªåœ¨é€€å‡ºæ—¶éœ€è¦çš„å‡½æ•°ï¼šå¦‚æžœæ¤æ–‡ä»¶æœªç¼–译为模å—,则该函数将 +è¢«åˆ é™¤ã€‚è¯·å‚阅头文件以使用。请注æ„,使用 :c:func:`EXPORT_SYMBOL()` 或 +:c:func:`EXPORT_SYMBOL_GPL()` å°†æ ‡è®°ä¸º ``__init`` çš„å‡½æ•°å¯¼å‡ºåˆ°æ¨¡å—æ˜¯æ²¡æœ‰æ„义 +的——这将出问题。 + + +:c:func:`__initcall()`/:c:func:`module_init()` +---------------------------------------------- + +定义于 ``include/linux/init.h`` / ``include/linux/module.h`` + +å†…æ ¸çš„è®¸å¤šéƒ¨åˆ†éƒ½ä½œä¸ºæ¨¡å—ï¼ˆå†…æ ¸çš„å¯åЍæ€åŠ è½½éƒ¨åˆ†ï¼‰è‰¯å¥½æœåŠ¡ã€‚ä½¿ç”¨ +:c:func:`module_init()` å’Œ :c:func:`module_exit()` å®å¯ä»¥ç®€åŒ–代ç ç¼–å†™ï¼Œæ— éœ€ +``#ifdef`` ,å³å¯ä»¥ä½œä¸ºæ¨¡å—è¿è¡Œæˆ–å†…ç½®åœ¨å†…æ ¸ä¸ã€‚ + +:c:func:`module_init()` å®å®šä¹‰åœ¨æ¨¡å—æ’入时(如果文件编译为模å—)或在引导时 +调用哪个函数:如果文件未编译为模å—,:c:func:`module_init()` å®å°†ç‰æ•ˆäºŽ +:c:func:`__initcall()` ,它通过链接器的é”力确ä¿åœ¨å¼•导时调用该函数。 + +该函数å¯ä»¥è¿”回一个错误值,以导致模å—åŠ è½½å¤±è´¥ï¼ˆä¸å¹¸çš„æ˜¯ï¼Œå¦‚果将模å—ç¼–è¯‘åˆ°å†…æ ¸ +ä¸ï¼Œåˆ™æ¤æ“ä½œæ— æ•ˆï¼‰ã€‚æ¤å‡½æ•°åœ¨å¯ç”¨ä¸æ–的用户上下文ä¸è°ƒç”¨ï¼Œå› æ¤å¯ä»¥ç¡çœ 。 + +:c:func:`module_exit()` +----------------------- + + +定义于 ``include/linux/module.h`` + +这个å®å®šä¹‰äº†åœ¨æ¨¡å—åˆ é™¤æ—¶è¦è°ƒç”¨çš„å‡½æ•°ï¼ˆå¦‚æžœæ˜¯ç¼–è¯‘åˆ°å†…æ ¸ä¸çš„æ–‡ä»¶ï¼Œåˆ™æ— 用æ¦ä¹‹åœ°ï¼‰ã€‚ +åªæœ‰åœ¨æ¨¡å—使用计数到零时æ‰ä¼šè°ƒç”¨å®ƒã€‚这个函数也å¯ä»¥ç¡çœ ,但ä¸èƒ½å¤±è´¥ï¼šå½“它返回 +时,所有的东西都必须清ç†å¹²å‡€ã€‚ + +注æ„ï¼Œè¿™ä¸ªå®æ˜¯å¯é€‰çš„:如果它ä¸å˜åœ¨ï¼Œæ‚¨çš„æ¨¡å—å°†ä¸å¯ç§»é™¤ï¼ˆé™¤éž ``rmmod -f`` )。 + +:c:func:`try_module_get()`/:c:func:`module_put()` +------------------------------------------------- + +定义于 ``include/linux/module.h`` + +这些函数会æ“作模å—使用计数,以防æ¢åˆ 除(如果å¦ä¸€ä¸ªæ¨¡å—使用其导出的符å·ä¹‹ä¸€ï¼Œ +åˆ™æ— æ³•åˆ é™¤æ¨¡å—,å‚è§ä¸‹æ–‡ï¼‰ã€‚在调用模å—代ç 之å‰ï¼Œæ‚¨åº”该在该模å—上调用 +:c:func:`try_module_get()` :若失败,那么该模å—å°†è¢«åˆ é™¤ï¼Œæ‚¨åº”è¯¥å°†å…¶è§†ä¸ºä¸å˜åœ¨ã€‚ +è‹¥æˆåŠŸï¼Œæ‚¨å°±å¯ä»¥å®‰å…¨åœ°è¿›å…¥æ¨¡å—,并在完æˆåŽè°ƒç”¨æ¨¡å— :c:func:`module_put()` 。 + +å¤§å¤šæ•°å¯æ³¨å†Œç»“æž„ä½“éƒ½æœ‰æ‰€æœ‰è€…å—æ®µï¼Œä¾‹å¦‚在 +:c:type:`struct file_operations <file_operations>` 结构体ä¸ï¼Œæ¤å—段应设置为 +å® ``THIS_MODULE`` 。 + +ç‰å¾…队列 ``include/linux/wait.h`` +==================================== + +**[ç¡çœ ]** + +ç‰å¾…队列用于ç‰å¾…æŸç¨‹åºåœ¨æ¡ä»¶ä¸ºçœŸæ—¶å”¤é†’å¦ä¸€ç¨‹åºã€‚å¿…é¡»å°å¿ƒä½¿ç”¨ï¼Œä»¥ç¡®ä¿æ²¡æœ‰ç«žäº‰ +æ¡ä»¶ã€‚先声明一个 :c:type:`wait_queue_head_t` ,然åŽå¯¹å¸Œæœ›ç‰å¾…该æ¡ä»¶çš„进程声明 +一个关于它们自己的 :c:type:`wait_queue_entry_t` ,并将其放入队列ä¸ã€‚ + +声明 +----- + +使用 :c:func:`DECLARE_WAIT_QUEUE_HEAD()` å®å£°æ˜Žä¸€ä¸ª ``wait_queue_head_t`` , +或者在åˆå§‹åŒ–代ç ä¸ä½¿ç”¨ :c:func:`init_waitqueue_head()` 程åºã€‚ + +排队 +----- + +将自己放在ç‰å¾…队列ä¸ç›¸å½“夿‚ï¼Œå› ä¸ºä½ å¿…é¡»åœ¨æ£€æŸ¥æ¡ä»¶ä¹‹å‰å°†è‡ªå·±æ”¾å…¥é˜Ÿåˆ—ä¸ã€‚有一 +个å®å¯ä»¥æ¥æ‰§è¡Œæ¤æ“作: :c:func:`wait_event_interruptible()` +( ``include/linux/wait.h`` ï¼‰ç¬¬ä¸€ä¸ªå‚æ•°æ˜¯ç‰å¾…é˜Ÿåˆ—å¤´ï¼Œç¬¬äºŒä¸ªå‚æ•°æ˜¯è®¡ç®—的表达 +å¼ï¼›å½“该表达å¼ä¸ºtrueæ—¶å®è¿”回0ï¼Œæˆ–è€…åœ¨æŽ¥æ”¶åˆ°ä¿¡å·æ—¶è¿”回 ``-ERESTARTSYS`` 。 +:c:func:`wait_event()` 版本会忽略信å·ã€‚ + +唤醒排队任务 +------------- + +调用 :c:func:`wake_up()` ( ``include/linux/wait.h`` ),它将唤醒队列ä¸çš„æ‰€æœ‰ +进程。例外情况:如果有一个进程设置了 ``TASK_EXCLUSIVE`` ï¼Œé˜Ÿåˆ—çš„å…¶ä½™éƒ¨åˆ†å°†ä¸ +会被唤醒。这个基本函数的其他å˜ä½“也å¯ä»¥åœ¨åŒä¸€ä¸ªå¤´æ–‡ä»¶ä¸ä½¿ç”¨ã€‚ + +åŽŸåæ“ä½œ +========= + +æŸäº›æ“作在所有平å°ä¸Šéƒ½æœ‰ä¿è¯ã€‚第一类为æ“作 :c:type:`atomic_t` +( ``include/asm/atomic.h`` )的函数;它包å«ä¸€ä¸ªæœ‰ç¬¦å·æ•´æ•°ï¼ˆè‡³å°‘32ä½é•¿ï¼‰ï¼Œ +æ‚¨å¿…é¡»ä½¿ç”¨è¿™äº›å‡½æ•°æ¥æ“ä½œæˆ–è¯»å– :c:type:`atomic_t` å˜é‡ã€‚ +:c:func:`atomic_read()` å’Œ :c:func:`atomic_set()` 获å–并设置计数器,还有 +:c:func:`atomic_add()` ,:c:func:`atomic_sub()` ,:c:func:`atomic_inc()` , +:c:func:`atomic_dec()` å’Œ :c:func:`atomic_dec_and_test()` (如果递å‡ä¸ºé›¶ï¼Œ +则返回true)。 + +是的。它在原åå˜é‡ä¸ºé›¶æ—¶è¿”回true(å³!=0)。 + +请注æ„,这些函数比普通的算术è¿ç®—é€Ÿåº¦æ…¢ï¼Œå› æ¤ä¸åº”过度使用。 + +ç¬¬äºŒç±»åŽŸåæ“ä½œæ˜¯åœ¨ ``unsigned long`` ( ``include/linux/bitops.h`` )上的 +原å使“作。这些æ“作通常采用指å‘使¨¡å¼ï¼ˆbit pattern)的指针,第0使˜¯æœ€ä½Žæœ‰æ•ˆ +ä½ã€‚:c:func:`set_bit()`,:c:func:`clear_bit()` å’Œ :c:func:`change_bit()` 设置〠+清除和更改给定ä½ã€‚:c:func:`test_and_set_bit()` ,:c:func:`test_and_clear_bit()` +å’Œ :c:func:`test_and_change_bit()` 执行相åŒçš„æ“ä½œï¼Œä½†å¦‚æžœä¹‹å‰è®¾ç½®äº†ä½ï¼Œåˆ™è¿”回 +true;这些对于原åè®¾ç½®æ ‡å¿—ç‰¹åˆ«æœ‰ç”¨ã€‚ + +å¯ä»¥ä½¿ç”¨å¤§äºŽ ``BITS_PER_LONG`` ä½çš„ä½ç´¢å¼•调用这些æ“作。但结果在大端åºå¹³å°ä¸Š +ä¸å¤ªæ£å¸¸ï¼Œæ‰€ä»¥æœ€å¥½ä¸è¦è¿™æ ·åšã€‚ + +ç¬¦å· +===== + +åœ¨å†…æ ¸å†…éƒ¨ï¼Œæ£å¸¸çš„链接规则ä»ç„¶é€‚用(å³é™¤éžç”¨static关键å—将符å·å£°æ˜Žä¸ºæ–‡ä»¶èŒƒå›´ï¼Œ +å¦åˆ™å®ƒå¯ä»¥åœ¨å†…æ ¸ä¸çš„任何ä½ç½®ä½¿ç”¨ï¼‰ã€‚但是对于模å—,会ä¿ç•™ä¸€ä¸ªç‰¹æ®Šå¯å¯¼å‡ºç¬¦å·è¡¨ï¼Œ +该表将入å£ç‚¹é™åˆ¶ä¸ºå†…æ ¸å†…éƒ¨ã€‚æ¨¡å—也å¯ä»¥å¯¼å‡ºç¬¦å·ã€‚ + +:c:func:`EXPORT_SYMBOL()` +------------------------- + +定义于 ``include/linux/export.h`` + +这是导出符å·çš„ç»å…¸æ–¹æ³•:动æ€åŠ è½½çš„æ¨¡å—将能够æ£å¸¸ä½¿ç”¨ç¬¦å·ã€‚ + +:c:func:`EXPORT_SYMBOL_GPL()` +----------------------------- + +定义于 ``include/linux/export.h`` + + +类似于 :c:func:`EXPORT_SYMBOL()`ï¼Œåªæ˜¯ :c:func:`EXPORT_SYMBOL_GPL()` 导出的 +符å·åªèƒ½ç”±å…·æœ‰ç”± :c:func:`MODULE_LICENSE()` 指定GPL兼容许å¯è¯çš„æ¨¡å—看到。这 +æ„å‘³ç€æ¤å‡½æ•°è¢«è®¤ä¸ºæ˜¯ä¸€ä¸ªå†…éƒ¨å®žçŽ°é—®é¢˜ï¼Œè€Œä¸æ˜¯ä¸€ä¸ªçœŸæ£çš„æŽ¥å£ã€‚一些维护人员和 +å¼€å‘äººå‘˜åœ¨æ·»åŠ ä¸€äº›æ–°çš„API或功能时å¯èƒ½å´éœ€è¦å¯¼å‡º EXPORT_SYMBOL_GPL()。 + +:c:func:`EXPORT_SYMBOL_NS()` +---------------------------- + +定义于 ``include/linux/export.h`` + +这是 ``EXPORT_SYMBOL()`` çš„å˜ä½“,å…许指定符å·å‘½å空间。符å·å称空间记录于 +Documentation/core-api/symbol-namespaces.rst 。 + +:c:func:`EXPORT_SYMBOL_NS_GPL()` +-------------------------------- + +定义于 ``include/linux/export.h`` + +这是 ``EXPORT_SYMBOL_GPL()`` çš„å˜ä½“,å…许指定符å·å‘½å空间。符å·å称空间记录于 +Documentation/core-api/symbol-namespaces.rst 。 + +程åºä¸Žæƒ¯ä¾‹ +=========== + +åŒå‘链表 ``include/linux/list.h`` +----------------------------------- + +å†…æ ¸å¤´æ–‡ä»¶ä¸æ›¾ç»æœ‰ä¸‰ç»„链表程åºï¼Œä½†è¿™ä¸€ç»„æ˜¯èµ¢å®¶ã€‚å¦‚æžœä½ å¯¹ä¸€ä¸ªå•链表没有特别迫切的 +需求,那么这是一个ä¸é”™çš„选择。 + +通常 :c:func:`list_for_each_entry()` 很有用。 + +返回值惯例 +------------ + +对于在用户上下文ä¸è°ƒç”¨çš„代ç ,è¿èƒŒCè¯è¨€æƒ¯ä¾‹æ˜¯å¾ˆå¸¸è§çš„,å³è¿”回0表示æˆåŠŸï¼Œè¿”å›ž +负错误值(例如 ``-EFAULT`` )表示失败。这在一开始å¯èƒ½æ˜¯ä¸ç›´è§‚çš„ï¼Œä½†åœ¨å†…æ ¸ä¸ +相当普é。 + +使用 :c:func:`ERR_PTR()` ( ``include/linux/err.h`` )将负错误值编ç 到指针ä¸ï¼Œ +ç„¶åŽä½¿ç”¨ :c:func:`IS_ERR()` å’Œ :c:func:`PTR_ERR()` 将其å†å–出:é¿å…为错误值 +使用å•ç‹¬çš„æŒ‡é’ˆå‚æ•°ã€‚挺讨厌的,但的确是个好方å¼ã€‚ + +ç ´å编译 +---------- + +Linus和其他开å‘人员有时会更改开å‘å†…æ ¸ä¸çš„函数或结构体åç§°ï¼›è¿™æ ·åšä¸ä»…是为了 +让æ¯ä¸ªäººéƒ½ä¿æŒè¦æƒ•ï¼Œè¿˜åæ˜ 了一个é‡å¤§çš„æ›´æ”¹ï¼ˆä¾‹å¦‚,ä¸èƒ½å†åœ¨æ‰“开䏿–的情况下 +调用,或者执行é¢å¤–çš„æ£€æŸ¥ï¼Œæˆ–è€…ä¸æ‰§è¡Œä»¥å‰æ•获的检查)。通常这会附带一个linux +å†…æ ¸é‚®ä»¶åˆ—è¡¨ä¸ç›¸å½“å…¨é¢çš„æ³¨é‡Šï¼›è¯·æœç´¢å˜æ¡£ä»¥æŸ¥çœ‹ã€‚简å•地对文件进行全局替æ¢é€šå¸¸ +会让事情å˜å¾— **更糟** 。 + +åˆå§‹åŒ–结构体æˆå‘˜ +------------------ + +åˆå§‹åŒ–结构体的首选方法是使用指定的åˆå§‹åŒ–器,如ISO C99所述。 +例如:: + + static struct block_device_operations opt_fops = { + .open = opt_open, + .release = opt_release, + .ioctl = opt_ioctl, + .check_media_change = opt_media_change, + }; + + +这使得很容易查找(grep),并且å¯ä»¥æ¸…æ¥šåœ°çœ‹åˆ°è®¾ç½®äº†å“ªäº›ç»“æž„å—æ®µã€‚ä½ åº”è¯¥è¿™æ ·åšï¼Œ +å› ä¸ºå®ƒçœ‹èµ·æ¥å¾ˆé…·ã€‚ + +GNU 扩展 +---------- + +Linuxå†…æ ¸ä¸æ˜Žç¡®å…许GNU扩展。请注æ„,由于缺ä¹é€šç”¨æ€§ï¼Œä¸€äº›æ›´å¤æ‚的版本并没有 +得到很好的支æŒï¼Œä½†ä»¥ä¸‹å†…å®¹è¢«è®¤ä¸ºæ˜¯æ ‡å‡†çš„ï¼ˆæœ‰å…³æ›´å¤šè¯¦ç»†ä¿¡æ¯ï¼Œè¯·å‚阅GCC info页 +的“C 扩展â€éƒ¨åˆ†â€”—是的,实际上是infoé¡µï¼Œæ‰‹å†Œé¡µåªæ˜¯infoä¸å†…å®¹çš„ç®€çŸæ‘˜è¦ï¼‰ã€‚ + +- 内è”函数 + +- è¯å¥è¡¨è¾¾å¼ï¼ˆStatement expressions)(å³ï¼ˆ{ å’Œ })结构)。 + + +- 声明函数/å˜é‡/类型的属性(__attribute__) + +- typeof + +- 零长度数组 + +- å®å˜é‡ + +- 空指针è¿ç®— + +- éžå¸¸é‡ï¼ˆNon-Constant)åˆå§‹åŒ–ç¨‹åº + +- æ±‡ç¼–ç¨‹åºæŒ‡ä»¤ï¼ˆåœ¨ arch/ å’Œ include/asm/ 之内) + +- å—符串函数å(__func__)。 + +- __builtin_constant_p() + +åœ¨å†…æ ¸ä¸ä½¿ç”¨long longæ—¶è¦å°å¿ƒï¼Œgcc为其生æˆçš„代ç éžå¸¸ç³Ÿç³•:除法和乘法在i386上 +ä¸èƒ½å·¥ä½œï¼Œå› ä¸ºå†…æ ¸çŽ¯å¢ƒä¸ç¼ºå°‘用于它的gccè¿è¡Œæ—¶å‡½æ•°ã€‚ + +C++ +--- + +åœ¨å†…æ ¸ä¸ä½¿ç”¨C++通常是个å主æ„ï¼Œå› ä¸ºå†…æ ¸ä¸æä¾›å¿…è¦çš„è¿è¡Œæ—¶çŽ¯å¢ƒï¼Œå¹¶ä¸”ä¸ä¸ºå…¶ +æµ‹è¯•åŒ…å«æ–‡ä»¶ã€‚ä¸è¿‡è¿™ä»ç„¶æ˜¯å¯èƒ½çš„,但ä¸å»ºè®®ã€‚å¦‚æžœä½ çœŸçš„æƒ³è¿™ä¹ˆåšï¼Œè‡³å°‘别用 +异常处ç†ï¼ˆexceptions)。 + +#if +--- + +通常认为,在头文件(或.c文件顶部)ä¸ä½¿ç”¨å®æ¥æŠ½è±¡å‡½æ•°æ¯”在æºä»£ç ä¸ä½¿ç”¨â€œifâ€é¢„ +处ç†å™¨è¯å¥æ›´å¹²å‡€ã€‚ + +æŠŠä½ çš„ä¸œè¥¿æ”¾è¿›å†…æ ¸é‡Œ +====================== + +ä¸ºäº†è®©ä½ çš„ä¸œè¥¿æ›´æ£å¼ã€è¡¥ä¸æ›´æ•´æ´ï¼Œè¿˜æœ‰ä¸€äº›å·¥ä½œè¦åšï¼š + +- æžæ¸…æ¥šä½ åœ¨è°çš„åœ°ç•Œå„¿ä¸Šå¹²æ´»ã€‚æŸ¥çœ‹æºæ–‡ä»¶çš„顶部〠``MAINTAINERS`` æ–‡ä»¶ä»¥åŠ + ``CREDITS`` 文件的最åŽä¸€éƒ¨åˆ†ã€‚ä½ åº”è¯¥å’Œæ¤äººå调,确ä¿ä½ æ²¡æœ‰é‡æ–°å‘明轮å, + 或者å°è¯•一些已ç»è¢«æ‹’ç»çš„东西。 + + ç¡®ä¿ä½ æŠŠä½ çš„åå—和电åé‚®ä»¶åœ°å€æ”¾åœ¨ä½ åˆ›å»ºæˆ–ä¿®æ”¹çš„ä»»ä½•æ–‡ä»¶çš„é¡¶éƒ¨ã€‚å½“äººä»¬å‘ + 现一个缺陷,或者想è¦åšå‡ºä¿®æ”¹æ—¶ï¼Œè¿™æ˜¯ä»–们首先会看的地方。 + +- é€šå¸¸ä½ éœ€è¦ä¸€ä¸ªé…ç½®é€‰é¡¹æ¥æ”¯æŒä½ çš„å†…æ ¸ç¼–ç¨‹ã€‚åœ¨é€‚å½“çš„ç›®å½•ä¸ç¼–辑 ``Kconfig`` 。 + é…ç½®è¯è¨€å¾ˆå®¹æ˜“通过剪切和粘贴æ¥ä½¿ç”¨ï¼Œåœ¨ + Documentation/kbuild/kconfig-language.rst 䏿œ‰å®Œæ•´çš„æ–‡æ¡£ã€‚ + + 在您对选项的æè¿°ä¸ï¼Œè¯·ç¡®ä¿åŒæ—¶ç…§é¡¾åˆ°äº†ä¸“家用户和对æ¤åŠŸèƒ½ä¸€æ— æ‰€çŸ¥çš„ç”¨æˆ·ã€‚ + 在æ¤è¯´æ˜Žä»»ä½•ä¸å…¼å®¹å’Œé—®é¢˜ã€‚结尾一定è¦å†™ä¸Šâ€œå¦‚有疑问,就选Nâ€ï¼ˆæˆ–者是“Yâ€ï¼‰ï¼› + è¿™æ˜¯é’ˆå¯¹é‚£äº›çœ‹ä¸æ‡‚ä½ åœ¨è¯´ä»€ä¹ˆçš„äººçš„ã€‚ + +- 编辑 ``Makefile`` :é…ç½®å˜é‡åœ¨è¿™é‡Œå¯¼å‡ºï¼Œå› æ¤é€šå¸¸ä½ åªéœ€æ·»åŠ ä¸€è¡Œ + “obj-$(CONFIG_xxx) += xxx.oâ€ã€‚è¯æ³•记录在 + Documentation/kbuild/makefiles.rst 。 + +- å¦‚æžœä½ åšäº†ä¸€äº›æœ‰æ„义的事情,那å¯ä»¥æŠŠè‡ªå·±æ”¾è¿› ``CREDITS`` ï¼Œé€šå¸¸ä¸æ¢ä¸€ä¸ª + æ–‡ä»¶ï¼ˆæ— è®ºå¦‚ä½•ä½ çš„åå—éƒ½åº”è¯¥åœ¨æºæ–‡ä»¶çš„顶部)。维护人员æ„å‘³ç€æ‚¨å¸Œæœ›åœ¨å¯¹ + å系统进行更改时得到询问,并了解缺陷;这æ„味ç€å¯¹æŸéƒ¨åˆ†ä»£ç åšå‡ºæ›´å¤šæ‰¿è¯ºã€‚ + +- 最åŽï¼Œåˆ«å¿˜è®°åŽ»é˜…è¯» Documentation/process/submitting-patches.rst , + 也许还有 Documentation/process/submitting-drivers.rst 。 + +Kernel 仙女棒 +=============== + +æµè§ˆæºä»£ç 时的一些收è—ã€‚è¯·éšæ„æ·»åŠ åˆ°æ¤åˆ—表。 + +``arch/x86/include/asm/delay.h``:: + + #define ndelay(n) (__builtin_constant_p(n) ? \ + ((n) > 20000 ? __bad_ndelay() : __const_udelay((n) * 5ul)) : \ + __ndelay(n)) + + +``include/linux/fs.h``:: + + /* + * Kernel pointers have redundant information, so we can use a + * scheme where we can return either an error code or a dentry + * pointer with the same return value. + * + * This should be a per-architecture thing, to allow different + * error and pointer decisions. + */ + #define ERR_PTR(err) ((void *)((long)(err))) + #define PTR_ERR(ptr) ((long)(ptr)) + #define IS_ERR(ptr) ((unsigned long)(ptr) > (unsigned long)(-1000)) + +``arch/x86/include/asm/uaccess_32.h:``:: + + #define copy_to_user(to,from,n) \ + (__builtin_constant_p(n) ? \ + __constant_copy_to_user((to),(from),(n)) : \ + __generic_copy_to_user((to),(from),(n))) + + +``arch/sparc/kernel/head.S:``:: + + /* + * Sun people can't spell worth damn. "compatibility" indeed. + * At least we *know* we can't spell, and use a spell-checker. + */ + + /* Uh, actually Linus it is I who cannot spell. Too much murky + * Sparc assembly will do this to ya. + */ + C_LABEL(cputypvar): + .asciz "compatibility" + + /* Tested on SS-5, SS-10. Probably someone at Sun applied a spell-checker. */ + .align 4 + C_LABEL(cputypvar_sun4m): + .asciz "compatible" + + +``arch/sparc/lib/checksum.S:``:: + + /* Sun, you just can't beat me, you just can't. Stop trying, + * give up. I'm serious, I am going to kick the living shit + * out of you, game over, lights out. + */ + + +致谢 +===== + +感谢Andi Kleenæå‡ºç‚¹åï¼Œå›žç”æˆ‘çš„é—®é¢˜ï¼Œçº æ£æˆ‘的错误,充实内容ç‰å¸®åŠ©ã€‚ +感谢Philipp Rumpfåšäº†è®¸å¤šæ‹¼å†™å’Œæ¸…晰度修å¤ï¼Œä»¥åŠä¸€äº›ä¼˜ç§€çš„䏿˜Žæ˜¾çš„点。 +感谢Werner Almesberger对 :c:func:`disable_irq()` åšäº†ä¸€ä¸ªå¾ˆå¥½çš„æ€»ç»“, +Jes Sorensenå’ŒAndrea Arcangeli补充了一些注æ„事项。 +感谢Michael Elizabeth Chastain检查并补充了é…置部分。 +感谢Telsa Gwynne教我DocBook。 diff --git a/Documentation/translations/zh_CN/kernel-hacking/index.rst b/Documentation/translations/zh_CN/kernel-hacking/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..df530de2278d519638f70d8f0702d40e00588d1e --- /dev/null +++ b/Documentation/translations/zh_CN/kernel-hacking/index.rst @@ -0,0 +1,22 @@ +.. _kernel_hacking_zh: + +.. include:: ../disclaimer-zh_CN.rst + +:Original: Documentation/kernel-hacking/index.rst + +:译者: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> + +============= +å†…æ ¸éª‡å®¢æŒ‡å— +============= + +.. toctree:: + :maxdepth: 2 + + hacking + +TODO + +- locking diff --git a/Documentation/translations/zh_CN/openrisc/index.rst b/Documentation/translations/zh_CN/openrisc/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..d722642796c80134364a915fbfeebb669aed94bd --- /dev/null +++ b/Documentation/translations/zh_CN/openrisc/index.rst @@ -0,0 +1,30 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: :doc:`../../../openrisc/index` +:Translator: Yanteng Si <siyanteng@loongson.cn> + +.. _cn_openrisc_index: + + +================= +OpenRISC 体系架构 +================= + +.. toctree:: + :maxdepth: 2 + + openrisc_port + todo + +Todolist: + features + + +.. only:: subproject and html + + Indices + ======= + + * :ref:`genindex` diff --git a/Documentation/translations/zh_CN/openrisc/openrisc_port.rst b/Documentation/translations/zh_CN/openrisc/openrisc_port.rst new file mode 100644 index 0000000000000000000000000000000000000000..e87d0eec281d56ec3c554a12b81cd66b4636125c --- /dev/null +++ b/Documentation/translations/zh_CN/openrisc/openrisc_port.rst @@ -0,0 +1,124 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: :doc:`../../../openrisc/openrisc_port` +:Translator: Yanteng Si <siyanteng@loongson.cn> + +.. _cn_openrisc_port: + +============== +OpenRISC Linux +============== + +这是Linux对OpenRISC类微处ç†å™¨çš„ç§»æ¤ï¼›å…·ä½“æ¥è¯´ï¼Œæœ€æ—©ç§»æ¤ç›®æ ‡æ˜¯32ä½ +OpenRISC 1000系列(或1k)。 + +关于OpenRISC处ç†å™¨å’Œæ£åœ¨è¿›è¡Œä¸çš„å¼€å‘的信æ¯: + + ======= ============================= + 网站 https://openrisc.io + 邮箱 openrisc@lists.librecores.org + ======= ============================= + +--------------------------------------------------------------------- + +OpenRISC工具链和Linuxçš„æž„å»ºæŒ‡å— +=============================== + +为了构建和è¿è¡ŒLinux for OpenRISCï¼Œä½ è‡³å°‘éœ€è¦ä¸€ä¸ªåŸºæœ¬çš„工具链,或许 +è¿˜éœ€è¦æž¶æž„模拟器。 这里概述了准备就ä½è¿™äº›éƒ¨åˆ†çš„æ¥éª¤ã€‚ + +1) 工具链 + +工具链二进制文件å¯ä»¥ä»Žopenrisc.io或我们的githubå‘布页é¢èŽ·å¾—ã€‚ä¸åŒ +工具链的构建指å—å¯ä»¥åœ¨openrisc.io或Stafford的工具链构建和å‘布脚本 +䏿‰¾åˆ°ã€‚ + + ====== ================================================= + 二进制 https://github.com/openrisc/or1k-gcc/releases + 工具链 https://openrisc.io/software + 构建 https://github.com/stffrdhrn/or1k-toolchain-build + ====== ================================================= + +2) 构建 + +åƒå¾€å¸¸ä¸€æ ·æž„建Linuxå†…æ ¸:: + + make ARCH=openrisc CROSS_COMPILE="or1k-linux-" defconfig + make ARCH=openrisc CROSS_COMPILE="or1k-linux-" + +3) 在FPGA上è¿è¡Œï¼ˆå¯é€‰) + +OpenRISC社区通常使用FuseSoCæ¥ç®¡ç†æž„建和编程SoC到FPGAä¸ã€‚ 䏋颿˜¯ç”¨ +OpenRISC SoC对De0 Nano开呿¿è¿›è¡Œç¼–程的一个例å。 在构建过程ä¸ï¼Œ +FPGA RTL是从FuseSoC IPæ ¸åº“ä¸ä¸‹è½½çš„代ç ,并使用FPGA供应商工具构建。 +二进制文件用openocdåŠ è½½åˆ°ç”µè·¯æ¿ä¸Šã€‚ + +:: + + git clone https://github.com/olofk/fusesoc + cd fusesoc + sudo pip install -e . + + fusesoc init + fusesoc build de0_nano + fusesoc pgm de0_nano + + openocd -f interface/altera-usb-blaster.cfg \ + -f board/or1k_generic.cfg + + telnet localhost 4444 + > init + > halt; load_image vmlinux ; reset + +4) 在模拟器上è¿è¡Œï¼ˆå¯é€‰ï¼‰ + +QEMU是一个处ç†å™¨ä»¿çœŸå™¨ï¼Œæˆ‘们推èå®ƒæ¥æ¨¡æ‹ŸOpenRISCå¹³å°ã€‚ 请按照QEMU网 +站上的OpenRISC说明,让Linux在QEMU上è¿è¡Œã€‚ ä½ å¯ä»¥è‡ªå·±æž„建QEMUï¼Œä½†ä½ çš„ +Linuxå‘行版å¯èƒ½æä¾›äº†æ”¯æŒOpenRISC的二进制包。 + + ============= ====================================================== + qemu openrisc https://wiki.qemu.org/Documentation/Platforms/OpenRISC + ============= ====================================================== + +--------------------------------------------------------------------- + +术è¯è¡¨ +====== + +代ç ä¸ä½¿ç”¨äº†ä»¥ä¸‹ç¬¦å·çº¦å®šä»¥å°†èŒƒå›´é™åˆ¶åœ¨å‡ 个特定处ç†å™¨å®žçŽ°ä¸Šï¼š + +========= ======================= +openrisc: OpenRISC类型处ç†å™¨ +or1k: OpenRISC 1000系列处ç†å™¨ +or1200: OpenRISC 1200处ç†å™¨ +========= ======================= + +--------------------------------------------------------------------- + +åŽ†å² +==== + +2003-11-18 Matjaz Breskvar (phoenix@bsemi.com) + å°†linuxåˆæ¥ç§»æ¤åˆ°OpenRISC或32架构。 + æ‰€æœ‰çš„æ ¸å¿ƒåŠŸèƒ½éƒ½å®žçŽ°äº†ï¼Œå¹¶ä¸”å¯ä»¥ä½¿ç”¨ã€‚ + +2003-12-08 Matjaz Breskvar (phoenix@bsemi.com) + 彻底改å˜TLB失误处ç†ã€‚ + é‡å†™å¼‚常处ç†ã€‚ + 在默认的initrdä¸å®žçŽ°äº†sash-3.6的所有功能。 + 大幅改进的版本。 + +2004-04-10 Matjaz Breskvar (phoenix@bsemi.com) + 大é‡çš„bugä¿®å¤ã€‚ + 支æŒä»¥å¤ªç½‘,httpå’ŒtelnetæœåŠ¡å™¨åŠŸèƒ½ã€‚ + å¯ä»¥è¿è¡Œè®¸å¤šæ ‡å‡†çš„linux应用程åºã€‚ + +2004-06-26 Matjaz Breskvar (phoenix@bsemi.com) + ç§»æ¤åˆ°2.6.x。 + +2004-11-30 Matjaz Breskvar (phoenix@bsemi.com) + 大é‡çš„bugä¿®å¤å’Œå¢žå¼ºåŠŸèƒ½ã€‚ + å¢žåŠ äº†opencores framebuffer驱动。 + +2010-10-09 Jonas Bonn (jonas@southpole.se) + é‡å¤§é‡å†™ï¼Œä½¿å…¶ä¸Žä¸Šæ¸¸çš„Linux 2.6.36看é½ã€‚ diff --git a/Documentation/translations/zh_CN/openrisc/todo.rst b/Documentation/translations/zh_CN/openrisc/todo.rst new file mode 100644 index 0000000000000000000000000000000000000000..9944ad05473b7bb59e4134ec1a1dc52f8f1f880c --- /dev/null +++ b/Documentation/translations/zh_CN/openrisc/todo.rst @@ -0,0 +1,20 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: :doc:`../../../openrisc/todo` +:Translator: Yanteng Si <siyanteng@loongson.cn> + +.. _cn_openrisc_todo.rst: + +======== +待办事项 +======== + +OpenRISC Linux的移æ¤å·²ç»å®Œå…¨æŠ•入使用,并且从 2.6.35 å¼€å§‹å°±ä¸€ç›´åœ¨ä¸Šæ¸¸åŒæ¥ã€‚ +然而,还有一些剩余的项目需è¦åœ¨æœªæ¥å‡ 个月内完æˆã€‚ 䏋颿˜¯ä¸€ä¸ªå³å°†è¿›è¡Œè°ƒæŸ¥çš„已知 +ä¸å°½å®Œç¾Žçš„é¡¹ç›®åˆ—è¡¨ï¼Œå³æˆ‘们的待办事项列表。 + +- 实现其余的DMA API……dma_map_sgç‰ã€‚ + +- 完æˆé‡å‘½å清ç†å·¥ä½œâ€¦â€¦ä»£ç ä¸æåˆ°äº†or32,这是架构的一个è€åå—。 我们 + å·²ç»ç¡®å®šçš„åå—æ˜¯or1kï¼Œè¿™ä¸ªæ”¹å˜æ£åœ¨ä»¥ç¼“慢积累的方å¼è¿›è¡Œã€‚ ç›®å‰ï¼Œor32相当 + 于or1k。 diff --git a/Documentation/translations/zh_CN/process/1.Intro.rst b/Documentation/translations/zh_CN/process/1.Intro.rst index 10a15f3dc28203cc24fe9e511c31ee3ffe604d53..4f9284cbe33b6de8a0776dc03ad4dd7966494c01 100644 --- a/Documentation/translations/zh_CN/process/1.Intro.rst +++ b/Documentation/translations/zh_CN/process/1.Intro.rst @@ -1,162 +1,170 @@ .. include:: ../disclaimer-zh_CN.rst :Original: :ref:`Documentation/process/1.Intro.rst <development_process_intro>` -:Translator: Alex Shi <alex.shi@linux.alibaba.com> + +:Translator: + + 时奎亮 Alex Shi <alex.shi@linux.alibaba.com> + +:æ ¡è¯‘: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> .. _cn_development_process_intro: -ä»‹ç» +引言 ==== -æ‰§è¡Œæ‘˜è¦ +内容æè¦ -------- -æœ¬èŠ‚çš„å…¶ä½™éƒ¨åˆ†æ¶µç›–äº†å†…æ ¸å¼€å‘过程的范围,以åŠå¼€å‘人员åŠå…¶é›‡ä¸»åœ¨è¿™æ–¹é¢å¯èƒ½é‡ -到的å„ç§æŒ«æŠ˜ã€‚å†…æ ¸ä»£ç 应该åˆå¹¶åˆ°æ£å¼çš„(“主线â€ï¼‰å†…æ ¸ä¸æœ‰å¾ˆå¤šåŽŸå› ï¼ŒåŒ…æ‹¬å¯¹ç”¨ -户的自动å¯ç”¨æ€§ã€å¤šç§å½¢å¼çš„社区支æŒä»¥åŠå½±å“å†…æ ¸å¼€å‘æ–¹å‘的能力。æä¾›ç»™Linux -å†…æ ¸çš„ä»£ç 必须在与GPL兼容的许å¯è¯ä¸‹å¯ç”¨ã€‚ +æœ¬èŠ‚çš„å…¶ä½™éƒ¨åˆ†æ¶µç›–äº†å†…æ ¸å¼€å‘的过程,以åŠå¼€å‘人员åŠå…¶é›‡ä¸»åœ¨è¿™æ–¹é¢å¯èƒ½é‡åˆ°çš„ +å„ç§é—®é¢˜ã€‚æœ‰å¾ˆå¤šåŽŸå› ä½¿å†…æ ¸ä»£ç 应被åˆå¹¶åˆ°æ£å¼çš„(“主线â€ï¼‰å†…æ ¸ä¸ï¼ŒåŒ…括对用户 +的自动å¯ç”¨æ€§ã€å¤šç§å½¢å¼çš„社区支æŒä»¥åŠå½±å“å†…æ ¸å¼€å‘æ–¹å‘的能力。æä¾›ç»™Linuxå†…æ ¸ +的代ç 必须在与GPL兼容的许å¯è¯ä¸‹å¯ç”¨ã€‚ :ref:`cn_development_process` 介ç»äº†å¼€å‘过程ã€å†…æ ¸å‘布周期和åˆå¹¶çª—å£çš„æœºåˆ¶ã€‚ -涵盖了补ä¸å¼€å‘ã€å®¡æŸ¥å’Œåˆå¹¶å‘¨æœŸä¸çš„å„个阶段。有一些关于工具和邮件列表的讨论。 -é¼“åŠ±å¸Œæœ›å¼€å§‹å†…æ ¸å¼€å‘的开å‘人员作为åˆå§‹ç»ƒä¹ 跟踪并修å¤bug。 +涵盖了补ä¸å¼€å‘ã€å®¡æŸ¥å’Œåˆå¹¶å‘¨æœŸä¸çš„å„个阶段。还有一些关于工具和邮件列表的讨论? +é¼“åŠ±å¸Œæœ›å¼€å§‹å†…æ ¸å¼€å‘的开å‘人员跟踪并修å¤ç¼ºé™·ä»¥ä½œä¸ºåˆæ¥ç»ƒä¹ 。 -:ref:`cn_development_early_stage` 包括早期项目规划,é‡ç‚¹æ˜¯å°½å¿«è®©å¼€å‘社区å‚与 +:ref:`cn_development_early_stage` 包括项目的早期规划,é‡ç‚¹æ˜¯å°½å¿«è®©å¼€å‘社区 +å‚与进æ¥ã€‚ -:ref:`cn_development_coding` 是关于编ç 过程的;讨论了其他开å‘人员é‡åˆ°çš„å‡ ä¸ª -陷阱。对补ä¸çš„ä¸€äº›è¦æ±‚å·²ç»æ¶µç›–,并且介ç»äº†ä¸€äº›å·¥å…·ï¼Œè¿™äº›å·¥å…·æœ‰åŠ©äºŽç¡®ä¿å†…æ ¸ +:ref:`cn_development_coding` 是关于编程过程的;介ç»äº†å…¶ä»–å¼€å‘人员é‡åˆ°çš„å‡ ä¸ª +陷阱。也涵盖了对补ä¸çš„ä¸€äº›è¦æ±‚,并且介ç»äº†ä¸€äº›å·¥å…·ï¼Œè¿™äº›å·¥å…·æœ‰åŠ©äºŽç¡®ä¿å†…æ ¸ è¡¥ä¸æ˜¯æ£ç¡®çš„。 -:ref:`cn_development_posting` 讨论å‘布补ä¸ä»¥ä¾›è¯„审的过程。为了让开å‘社区 -认真对待,补ä¸å¿…é¡»æ£ç¡®æ ¼å¼åŒ–å’Œæè¿°ï¼Œå¹¶ä¸”å¿…é¡»å‘é€åˆ°æ£ç¡®çš„地方。éµå¾ªæœ¬èŠ‚ä¸çš„ -建议有助于确ä¿ä¸ºæ‚¨çš„工作æä¾›æœ€å¥½çš„æŽ¥çº³ã€‚ +:ref:`cn_development_posting` æè¿°å‘布补ä¸ä»¥ä¾›è¯„审的过程。为了让开å‘社区能 +认真对待,补ä¸å¿…须被æ£ç¡®æ ¼å¼åŒ–å’Œæè¿°ï¼Œå¹¶ä¸”å¿…é¡»å‘é€åˆ°æ£ç¡®çš„地方。éµå¾ªæœ¬èŠ‚ä¸çš„ +å»ºè®®æœ‰åŠ©äºŽç¡®ä¿æ‚¨çš„工作能被较好地接纳。 -:ref:`cn_development_followthrough` 介ç»äº†å‘布补ä¸ä¹‹åŽå‘生的事情;该工作 -在这一点上还远远没有完æˆã€‚与审阅者一起工作是开å‘过程ä¸çš„一个é‡è¦éƒ¨åˆ†ï¼›æœ¬èŠ‚ -æä¾›äº†ä¸€äº›å…³äºŽå¦‚何在这个é‡è¦é˜¶æ®µé¿å…问题的æç¤ºã€‚当补ä¸è¢«åˆå¹¶åˆ°ä¸»çº¿ä¸æ—¶ï¼Œ -å¼€å‘äººå‘˜è¦æ³¨æ„ä¸è¦å‡å®šä»»åС已ç»å®Œæˆã€‚ +:ref:`cn_development_followthrough` 介ç»äº†å‘布补ä¸ä¹‹åŽå‘生的事情;工作在这时 +还远远没有完æˆã€‚与审阅者一起工作是开å‘过程ä¸çš„一个é‡è¦éƒ¨åˆ†ï¼›æœ¬èŠ‚æä¾›äº†ä¸€äº› +关于如何在这个é‡è¦é˜¶æ®µé¿å…问题的æç¤ºã€‚当补ä¸è¢«åˆå¹¶åˆ°ä¸»çº¿ä¸æ—¶ï¼Œå¼€å‘äººå‘˜è¦æ³¨æ„ +ä¸è¦å‡å®šä»»åС已ç»å®Œæˆã€‚ -:ref:`cn_development_advancedtopics` 介ç»äº†ä¸¤ä¸ªâ€œé«˜çº§â€ä¸»é¢˜ï¼š -使用Git管ç†è¡¥ä¸å’ŒæŸ¥çœ‹å…¶ä»–人å‘布的补ä¸ã€‚ +:ref:`cn_development_advancedtopics` 介ç»äº†ä¸¤ä¸ªâ€œé«˜çº§â€ä¸»é¢˜ï¼šä½¿ç”¨Git管ç†è¡¥ä¸ +和查看其他人å‘布的补ä¸ã€‚ -:ref:`cn_development_conclusion` æ€»ç»“äº†æœ‰å…³å†…æ ¸å¼€å‘的更多信æ¯ï¼Œé™„带有带有 -指å‘资æºçš„链接. +:ref:`cn_development_conclusion` æ€»ç»“äº†æœ‰å…³å†…æ ¸å¼€å‘的更多信æ¯ï¼Œé™„å¸¦æœ‰ç›¸å…³èµ„æº +链接。 -这个文件是关于什么的 +这个文档是关于什么的 -------------------- -Linuxå†…æ ¸æœ‰è¶…è¿‡800万行代ç ,æ¯ä¸ªç‰ˆæœ¬çš„贡献者超过1000äººï¼Œæ˜¯çŽ°å˜æœ€å¤§ã€æœ€æ´»è·ƒ -çš„å…费软件项目之一。从1991å¹´å¼€å§‹ï¼Œè¿™ä¸ªå†…æ ¸å·²ç»å‘展æˆä¸ºä¸€ä¸ªæœ€å¥½çš„æ“ä½œç³»ç»Ÿ -组件,è¿è¡Œåœ¨è¢–çæ•°å—éŸ³ä¹æ’放器ã€å°å¼PCã€çŽ°å˜æœ€å¤§çš„è¶…çº§è®¡ç®—æœºä»¥åŠæ‰€æœ‰ç±»åž‹çš„ -系统上。它是一ç§é€‚ç”¨äºŽå‡ ä¹Žä»»ä½•æƒ…å†µçš„å¥å£®ã€é«˜æ•ˆå’Œå¯æ‰©å±•的解决方案。 +Linuxå†…æ ¸æœ‰è¶…è¿‡800万行代ç ,æ¯ä¸ªç‰ˆæœ¬çš„贡献者超过1000äººï¼Œæ˜¯çŽ°å˜æœ€å¤§ã€æœ€æ´»è·ƒçš„ +å…费软件项目之一。从1991å¹´å¼€å§‹ï¼Œè¿™ä¸ªå†…æ ¸å·²ç»å‘展æˆä¸ºä¸€ä¸ªæœ€å¥½çš„æ“ä½œç³»ç»Ÿç»„ä»¶ï¼Œ +è¿è¡Œåœ¨è¢–çæ•°å—éŸ³ä¹æ’放器ã€å°å¼ç”µè„‘ã€çŽ°å˜æœ€å¤§çš„è¶…çº§è®¡ç®—æœºä»¥åŠæ‰€æœ‰ç±»åž‹çš„系统上。 +它是一ç§é€‚ç”¨äºŽå‡ ä¹Žä»»ä½•æƒ…å†µçš„å¥å£®ã€é«˜æ•ˆå’Œå¯æ‰©å±•的解决方案。 éšç€Linuxçš„å‘展,希望å‚与其开å‘的开å‘人员(和公å¸ï¼‰çš„æ•°é‡ä¹Ÿåœ¨å¢žåŠ ã€‚ç¡¬ä»¶ä¾›åº”å•† 希望确ä¿Linux能够很好地支æŒä»–们的产å“,使这些产å“对Linux用户具有å¸å¼•力。嵌入 å¼ç³»ç»Ÿä¾›åº”商使用Linux作为集æˆäº§å“的组件,希望Linux能够尽å¯èƒ½åœ°èƒœä»»æ‰‹å¤´çš„任务。 -分销商和其他基于Linux的软件供应商对Linuxå†…æ ¸çš„åŠŸèƒ½ã€æ€§èƒ½å’Œå¯é æ€§æœ‰ç€æ˜Žç¡®çš„ -兴趣。最终用户也常常希望修改Linux,使之更好地满足他们的需求。 +分销商和其他基于Linux的软件供应商切实关心Linuxå†…æ ¸çš„åŠŸèƒ½ã€æ€§èƒ½å’Œå¯é 性。最终 +用户也常常希望修改Linux,使之能更好地满足他们的需求。 Linux最引人注目的特性之一是这些开å‘人员å¯ä»¥è®¿é—®å®ƒï¼›ä»»ä½•å…·å¤‡å¿…è¦æŠ€èƒ½çš„äººéƒ½å¯ä»¥ 改进Linuxå¹¶å½±å“其开呿–¹å‘。专有产å“ä¸èƒ½æä¾›è¿™ç§å¼€æ”¾æ€§ï¼Œè¿™æ˜¯è‡ªç”±è½¯ä»¶çš„一个特点。 -但是,如果有什么ä¸åŒçš„è¯ï¼Œå†…æ ¸æ¯”å¤§å¤šæ•°å…¶ä»–è‡ªç”±è½¯ä»¶é¡¹ç›®æ›´å¼€æ”¾ã€‚ä¸€ä¸ªå…¸åž‹çš„ä¸‰ä¸ªæœˆ -å†…æ ¸å¼€å‘周期å¯ä»¥æ¶‰åŠ1000多个开å‘人员,他们为100多个ä¸åŒçš„å…¬å¸ -ï¼ˆæˆ–è€…æ ¹æœ¬æ²¡æœ‰å…¬å¸ï¼‰å·¥ä½œã€‚ +如果有什么ä¸åŒçš„è¯ï¼Œé‚£å°±æ˜¯å†…æ ¸æ¯”å¤§å¤šæ•°å…¶ä»–è‡ªç”±è½¯ä»¶é¡¹ç›®æ›´å¼€æ”¾ã€‚ä¸€ä¸ªå…¸åž‹çš„ä¸‰ä¸ª +æœˆå†…æ ¸å¼€å‘周期å¯ä»¥æ¶‰åŠ1000多个开å‘人员,他们为100多个ä¸åŒçš„å…¬å¸ï¼ˆæˆ–è€…æ ¹æœ¬ä¸ +隶属公å¸ï¼‰å·¥ä½œã€‚ -ä¸Žå†…æ ¸å¼€å‘社区åˆä½œå¹¶ä¸æ˜¯ç‰¹åˆ«å›°éš¾ã€‚但是,尽管如æ¤ï¼Œè®¸å¤šæ½œåœ¨çš„贡献者在å°è¯•åš -å†…æ ¸å·¥ä½œæ—¶é‡åˆ°äº†å›°éš¾ã€‚å†…æ ¸ç¤¾åŒºå·²ç»å‘展了自己独特的æ“作方å¼ï¼Œä½¿å…¶èƒ½å¤Ÿåœ¨æ¯å¤© +ä¸Žå†…æ ¸å¼€å‘社区åˆä½œå¹¶ä¸æ˜¯ç‰¹åˆ«å›°éš¾ã€‚但尽管如æ¤ï¼Œä»æœ‰è®¸å¤šæ½œåœ¨çš„贡献者在å°è¯•åš +å†…æ ¸å·¥ä½œæ—¶é‡åˆ°äº†å›°éš¾ã€‚å†…æ ¸ç¤¾åŒºå·²ç»å‘展出自己独特的æ“作方å¼ï¼Œä½¿å…¶èƒ½å¤Ÿåœ¨æ¯å¤© éƒ½è¦æ›´æ”¹æ•°åƒè¡Œä»£ç 的环境ä¸é¡ºåˆ©è¿è¡Œï¼ˆå¹¶ç”Ÿæˆé«˜è´¨é‡çš„产å“ï¼‰ã€‚å› æ¤ï¼ŒLinuxå†…æ ¸å¼€å‘ -è¿‡ç¨‹ä¸Žä¸“æœ‰çš„å¼€å‘æ–¹æ³•有很大的ä¸åŒä¹Ÿå°±ä¸è¶³ä¸ºå¥‡äº†ã€‚ +è¿‡ç¨‹ä¸Žä¸“æœ‰çš„å¼€å‘æ¨¡å¼æœ‰å¾ˆå¤§çš„ä¸åŒä¹Ÿå°±ä¸è¶³ä¸ºå¥‡äº†ã€‚ -对于新开å‘人员æ¥è¯´ï¼Œå†…æ ¸çš„å¼€å‘过程å¯èƒ½ä¼šè®©äººæ„Ÿåˆ°å¥‡æ€ªå’Œææƒ§ï¼Œä½†è¿™ä¸ªèƒŒåŽæœ‰å……分的 -ç†ç”±å’Œåšå®žçš„ç»éªŒã€‚一个ä¸äº†è§£å†…æ ¸ç¤¾åŒºçš„æ–¹å¼çš„å¼€å‘人员(或者更糟的是,他们试图 -抛弃或规é¿å†…æ ¸ç¤¾åŒºçš„æ–¹å¼ï¼‰ä¼šæœ‰ä¸€ä¸ªä»¤äººæ²®ä¸§çš„体验。开å‘社区, 在帮助那些试图å¦ä¹ -çš„äººçš„åŒæ—¶ï¼Œæ²¡æœ‰æ—¶é—´å¸®åŠ©é‚£äº›ä¸æ„¿æ„倾嬿ˆ–ä¸å…³å¿ƒå¼€å‘过程的人。 +对于新开å‘人员æ¥è¯´ï¼Œå†…æ ¸çš„å¼€å‘过程å¯èƒ½ä¼šè®©äººæ„Ÿåˆ°å¥‡æ€ªå’Œææƒ§ï¼Œä½†è¿™èƒŒåŽæœ‰å……分的 +ç†ç”±å’Œåšå®žçš„ç»éªŒã€‚一个ä¸äº†è§£å†…æ ¸ç¤¾åŒºå·¥ä½œæ–¹å¼çš„å¼€å‘人员(或者更糟的是,他们 +试图抛弃或规é¿ä¹‹ï¼‰ä¼šå¾—到令人沮丧的体验。开å‘社区在帮助那些试图å¦ä¹ çš„äººçš„åŒæ—¶ï¼Œ +æ²¡æœ‰æ—¶é—´å¸®åŠ©é‚£äº›ä¸æ„¿æ„倾嬿ˆ–ä¸å…³å¿ƒå¼€å‘过程的人。 -希望阅读本文的人能够é¿å…è¿™ç§ä»¤äººæ²®ä¸§çš„ç»åŽ†ã€‚è¿™é‡Œæœ‰å¾ˆå¤šææ–™ï¼Œä½†é˜…读时所åšçš„ +希望阅读本文的人能够é¿å…è¿™ç§ä»¤äººæ²®ä¸§çš„ç»åŽ†ã€‚è¿™äº›ææ–™å¾ˆé•¿ï¼Œä½†é˜…读它们时所åšçš„ åŠªåŠ›ä¼šåœ¨çŸæ—¶é—´å†…得到回报。开å‘社区总是需è¦èƒ½è®©å†…æ ¸å˜æ›´å¥½çš„å¼€å‘人员;下é¢çš„ -æ–‡æœ¬åº”è¯¥å¸®åŠ©æ‚¨æˆ–ä¸ºæ‚¨å·¥ä½œçš„äººå‘˜åŠ å…¥æˆ‘ä»¬çš„ç¤¾åŒºã€‚ +æ–‡å—åº”è¯¥å¸®åŠ©æ‚¨æˆ–ä¸ºæ‚¨å·¥ä½œçš„äººå‘˜åŠ å…¥æˆ‘ä»¬çš„ç¤¾åŒºã€‚ 致谢 ---- -本文件由Jonathan Corbet撰写,corbet@lwn.net。以下人员的建议使之更为完善: +本文档由Jonathan Corbet <corbet@lwn.net> 撰写。以下人员的建议使之更为完善: Johannes Berg, James Berry, Alex Chiang, Roland Dreier, Randy Dunlap, Jake Edge, Jiri Kosina, Matt Mackall, Arthur Marsh, Amanda McPherson, -Andrew Morton, Andrew Price, Tsugikazu Shibata, å’Œ Jochen Voß. +Andrew Morton, Andrew Price, Tsugikazu Shibata å’Œ Jochen Voß 。 这项工作得到了Linux基金会的支æŒï¼Œç‰¹åˆ«æ„Ÿè°¢Amanda McPherson,他看到了这项工作 -çš„ä»·å€¼å¹¶æŠŠå®ƒå˜æˆçŽ°å®žã€‚ +çš„ä»·å€¼å¹¶å°†å…¶å˜æˆçŽ°å®žã€‚ 代ç 进入主线的é‡è¦æ€§ -------------------- 有些公å¸å’Œå¼€å‘人员å¶å°”会想,为什么他们è¦è´¹å¿ƒå¦ä¹ å¦‚ä½•ä¸Žå†…æ ¸ç¤¾åŒºåˆä½œï¼Œå¹¶å°†ä»£ç æ”¾å…¥ä¸»çº¿å†…æ ¸ï¼ˆâ€œä¸»çº¿â€æ˜¯ç”±Linus Torvaldsç»´æŠ¤çš„å†…æ ¸ï¼ŒLinuxå‘行商将其用作基础)。 -åœ¨çŸæœŸå†…,贡献代ç 看起æ¥åƒæ˜¯ä¸€ç§å¯ä»¥é¿å…的开销;仅仅将代ç 分开并直接支æŒç”¨æˆ· +åœ¨çŸæœŸå†…,贡献代ç 看起æ¥åƒæ˜¯ä¸€ç§å¯ä»¥é¿å…的开销;维护独立代ç 并直接支æŒç”¨æˆ· ä¼¼ä¹Žæ›´å®¹æ˜“ã€‚äº‹å®žä¸Šï¼Œä¿æŒä»£ç ç‹¬ç«‹ï¼ˆâ€œæ ‘å¤–â€ï¼‰æ˜¯åœ¨ç»æµŽä¸Šæ˜¯é”™è¯¯çš„。 -ä½œä¸ºè¯´æ˜Žæ ‘å¤–ä»£ç æˆæœ¬çš„ä¸€ç§æ–¹æ³•ï¼Œä¸‹é¢æ˜¯å†…æ ¸å¼€å‘过程的一些相关方é¢ï¼›æœ¬æ–‡ç¨åŽå°† -更详细地讨论其ä¸çš„大部分内容。考虑: +ä¸ºäº†è¯´æ˜Žæ ‘å¤–ä»£ç æˆæœ¬ï¼Œä¸‹é¢ç»™å‡ºå†…æ ¸å¼€å‘过程的一些相关方é¢ï¼›æœ¬æ–‡ç¨åŽå°†æ›´è¯¦ç»†åœ° +讨论其ä¸çš„大部分内容。请考虑: - 所有Linux用户都å¯ä»¥ä½¿ç”¨åˆå¹¶åˆ°ä¸»çº¿å†…æ ¸ä¸çš„代ç 。它将自动出现在所有å¯ç”¨å®ƒçš„ - å‘行版上。ä¸éœ€è¦é©±åŠ¨ç¨‹åºç£ç›˜ã€ä¸‹è½½ï¼Œä¹Ÿä¸éœ€è¦ä¸ºå¤šä¸ªå‘行版的多个版本æä¾›æ”¯æŒï¼› - 对于开å‘人员和用户æ¥è¯´ï¼Œè¿™ä¸€åˆ‡éƒ½æ˜¯å¯è¡Œçš„。并入主线解决了大é‡çš„分布和支æŒé—®é¢˜ + å‘è¡Œç‰ˆä¸Šã€‚æ— éœ€é©±åŠ¨ç¨‹åºç£ç›˜ã€é¢å¤–下载,也ä¸éœ€è¦ä¸ºå¤šä¸ªå‘行版的多个版本æä¾› + 支æŒï¼›è¿™ä¸€åˆ‡å°†æ–¹ä¾¿æ‰€æœ‰å¼€å‘人员和用户。并入主线解决了大é‡çš„分å‘和支æŒé—®é¢˜ã€‚ -- å½“å†…æ ¸å¼€å‘äººå‘˜åŠªåŠ›ç»´æŠ¤ä¸€ä¸ªç¨³å®šçš„ç”¨æˆ·ç©ºé—´æŽ¥å£æ—¶ï¼Œå†…éƒ¨å†…æ ¸APIå¤„äºŽä¸æ–å˜åŒ–之ä¸. - 缺ä¹ä¸€ä¸ªç¨³å®šçš„å†…éƒ¨æŽ¥å£æ˜¯ä¸€ä¸ªæ·±æ€ç†Ÿè™‘的设计决ç–;它å…许在任何时候进行基本的改 - 进,并产生更高质é‡çš„代ç 。但该ç–略的一个结果是,如果è¦ä½¿ç”¨æ–°çš„å†…æ ¸ï¼Œä»»ä½•æ ‘å¤– - 代ç éƒ½éœ€è¦æŒç»çš„ç»´æŠ¤ã€‚ç»´æŠ¤æ ‘å¤–ä»£ç 需è¦å¤§é‡çš„工作æ‰èƒ½ä½¿ä»£ç ä¿æŒå·¥ä½œçжæ€ã€‚ +- å½“å†…æ ¸å¼€å‘äººå‘˜åŠªåŠ›ç»´æŠ¤ä¸€ä¸ªç¨³å®šçš„ç”¨æˆ·ç©ºé—´æŽ¥å£æ—¶ï¼Œå†…æ ¸å†…éƒ¨APIå¤„äºŽä¸æ–å˜åŒ–之ä¸ã€‚ + ä¸ç»´æŒç¨³å®šçš„å†…éƒ¨æŽ¥å£æ˜¯ä¸€ä¸ªæ…Žé‡çš„设计决ç–;它å…许在任何时候进行基本的改进, + 并产出更高质é‡çš„代ç 。但该ç–略导致结果是,若è¦ä½¿ç”¨æ–°çš„å†…æ ¸ï¼Œä»»ä½•æ ‘å¤–ä»£ç 都 + éœ€è¦æŒç»çš„ç»´æŠ¤ã€‚ç»´æŠ¤æ ‘å¤–ä»£ç 会需è¦å¤§é‡çš„工作æ‰èƒ½ä½¿ä»£ç ä¿æŒæ£å¸¸è¿è¡Œã€‚ - 相å,ä½äºŽä¸»çº¿ä¸çš„代ç ä¸éœ€è¦è¿™æ ·åšï¼Œå› 为一个简å•çš„è§„åˆ™è¦æ±‚进行API更改的任何 - å¼€å‘人员也必须修å¤ç”±äºŽè¯¥æ›´æ”¹è€Œç ´å的任何代ç ã€‚å› æ¤ï¼Œåˆå¹¶åˆ°ä¸»çº¿ä¸çš„代ç 大大 - é™ä½Žäº†ç»´æŠ¤æˆæœ¬ã€‚ + 相å,ä½äºŽä¸»çº¿ä¸çš„代ç ä¸éœ€è¦è¿™æ ·åšï¼Œå› ä¸ºåŸºæœ¬è§„åˆ™è¦æ±‚进行APIæ›´æ”¹çš„ä»»ä½•å¼€å‘ + 人员也必须修å¤ç”±äºŽè¯¥æ›´æ”¹è€Œç ´å的任何代ç ã€‚å› æ¤ï¼Œåˆå¹¶åˆ°ä¸»çº¿ä¸çš„代ç 大大é™ä½Ž + äº†ç»´æŠ¤æˆæœ¬ã€‚ -- 除æ¤ä¹‹å¤–ï¼Œå†…æ ¸ä¸çš„代ç 通常会被其他开å‘人员改进。令人惊讶的结果å¯èƒ½æ¥è‡ªæŽˆæƒ - 您的用户社区和客户改进您的产å“。 +- 除æ¤ä¹‹å¤–ï¼Œå†…æ ¸ä¸çš„代ç 通常会被其他开å‘人员改进。您授æƒçš„用户社区和客户对您 + 产å“的改进å¯èƒ½ä¼šä»¤äººæƒŠå–œã€‚ -- å†…æ ¸ä»£ç 在åˆå¹¶åˆ°ä¸»çº¿ä¹‹å‰å’Œä¹‹åŽéƒ½è¦ç»è¿‡å®¡æŸ¥ã€‚ä¸ç®¡åŽŸå§‹å¼€å‘人员的技能有多强, +- å†…æ ¸ä»£ç 在åˆå¹¶åˆ°ä¸»çº¿ä¹‹å‰å’Œä¹‹åŽéƒ½è¦ç»è¿‡å®¡æŸ¥ã€‚æ— è®ºåŽŸå§‹å¼€å‘人员的技能有多强, 这个审查过程总是能找到改进代ç 的方法。审查ç»å¸¸å‘现严é‡çš„错误和安全问题。 - 这对于在å°é—环境ä¸å¼€å‘的代ç 尤其如æ¤ï¼›è¿™ç§ä»£ç 从外部开å‘人员的审查ä¸èŽ·ç›Š - åŒªæµ…ã€‚æ ‘å¤–ä»£ç æ˜¯ä½Žè´¨é‡ä»£ç 。 + 对于在å°é—环境ä¸å¼€å‘的代ç 尤其如æ¤ï¼›è¿™ç§ä»£ç 从外部开å‘人员的审查ä¸èŽ·ç›ŠåŒªæµ…ã€‚ + æ ‘å¤–ä»£ç æ˜¯ä½Žè´¨é‡ä»£ç 。 - å‚与开å‘过程是您影å“å†…æ ¸å¼€å‘æ–¹å‘的方å¼ã€‚æ—观者的抱怨会被å¬åˆ°ï¼Œä½†æ˜¯æ´»è·ƒçš„ å¼€å‘äººå‘˜æœ‰æ›´å¼ºçš„å£°éŸ³â€”â€”å¹¶ä¸”èƒ½å¤Ÿå®žçŽ°ä½¿å†…æ ¸æ›´å¥½åœ°æ»¡è¶³å…¶éœ€æ±‚çš„æ›´æ”¹ã€‚ - 当å•ç‹¬ç»´æŠ¤ä»£ç æ—¶ï¼Œæ€»æ˜¯å˜åœ¨ç¬¬ä¸‰æ–¹ä¸ºç±»ä¼¼åŠŸèƒ½æä¾›ä¸åŒå®žçŽ°çš„å¯èƒ½æ€§ã€‚如果å‘生 - è¿™ç§æƒ…况,åˆå¹¶ä»£ç å°†å˜å¾—æ›´åŠ å›°éš¾â€”â€”ç”šè‡³åˆ°äº†ä¸å¯èƒ½çš„地æ¥ã€‚ç„¶åŽï¼Œæ‚¨å°†é¢ä¸´ä»¥ä¸‹ - 令人ä¸å¿«çš„选择:(1ï¼‰æ— é™æœŸåœ°ç»´æŠ¤æ ‘å¤–çš„éžæ ‡å‡†ç‰¹æ€§ï¼Œæˆ–(2)放弃代ç 并将用户 - è¿ç§»åˆ°æ ‘内版本。 + è¿™ç§æƒ…况,åˆå¹¶ä»£ç å°†å˜å¾—æ›´åŠ å›°éš¾â€”â€”ç”šè‡³æˆä¸ºä¸å¯èƒ½ã€‚之åŽï¼Œæ‚¨å°†é¢ä¸´ä»¥ä¸‹ä»¤äºº + ä¸å¿«çš„选择:(1ï¼‰æ— é™æœŸåœ°ç»´æŠ¤æ ‘å¤–çš„éžæ ‡å‡†ç‰¹æ€§ï¼Œæˆ–(2)放弃代ç 并将用户è¿ç§» + åˆ°æ ‘å†…ç‰ˆæœ¬ã€‚ -- 代ç çš„è´¡çŒ®æ˜¯ä½¿æ•´ä¸ªè¿‡ç¨‹å·¥ä½œçš„æ ¹æœ¬ã€‚é€šè¿‡è´¡çŒ®ä»£ç ,您å¯ä»¥å‘å†…æ ¸æ·»åŠ æ–°åŠŸèƒ½ï¼Œå¹¶ - æä¾›å…¶ä»–å†…æ ¸å¼€å‘人员使用的功能和示例。如果您已ç»ä¸ºLinuxå¼€å‘了代ç (或者 - æ£åœ¨è€ƒè™‘è¿™æ ·åšï¼‰ï¼Œé‚£ä¹ˆæ‚¨æ˜¾ç„¶å¯¹è¿™ä¸ªå¹³å°çš„æŒç»æˆåŠŸæ„Ÿå…´è¶£ï¼›è´¡çŒ®ä»£ç æ˜¯ç¡®ä¿æˆåŠŸ - 的最好方法之一。 +- 代ç 的贡献是使整个æµç¨‹å·¥ä½œçš„æ ¹æœ¬ã€‚通过贡献代ç ,您å¯ä»¥å‘å†…æ ¸æ·»åŠ æ–°åŠŸèƒ½ï¼Œå¹¶ + æä¾›å…¶ä»–å†…æ ¸å¼€å‘人员使用的功能和示例。如果您已ç»ä¸ºLinuxå¼€å‘了代ç (或者æ£åœ¨ + è€ƒè™‘è¿™æ ·åšï¼‰ï¼Œé‚£ä¹ˆæ‚¨æ˜¾ç„¶å¯¹è¿™ä¸ªå¹³å°çš„æŒç»æˆåŠŸæ„Ÿå…´è¶£ï¼›è´¡çŒ®ä»£ç æ˜¯ç¡®ä¿æˆåŠŸçš„ + 最好方法之一。 上述所有ç†ç”±éƒ½é€‚ç”¨äºŽä»»ä½•æ ‘å¤–å†…æ ¸ä»£ç ,包括以专有的ã€ä»…二进制形å¼åˆ†å‘的代ç 。 -ç„¶è€Œï¼Œåœ¨è€ƒè™‘ä»»ä½•ç±»åž‹çš„çº¯äºŒè¿›åˆ¶å†…æ ¸ä»£ç 分布之å‰ï¼Œè¿˜éœ€è¦è€ƒè™‘å…¶ä»–å› ç´ ã€‚è¿™äº›åŒ…æ‹¬ï¼š +ç„¶è€Œï¼Œåœ¨è€ƒè™‘ä»»ä½•ç±»åž‹çš„çº¯äºŒè¿›åˆ¶å†…æ ¸ä»£ç 分布之å‰ï¼Œè¿˜éœ€è¦è€ƒè™‘å…¶ä»–å› ç´ ã€‚åŒ…æ‹¬ï¼š -- å›´ç»•ä¸“æœ‰å†…æ ¸æ¨¡å—分å‘çš„æ³•å¾‹é—®é¢˜å……å…¶é‡æ˜¯æ¨¡ç³Šçš„ï¼›ç›¸å½“å¤šçš„å†…æ ¸ç‰ˆæƒæ‰€æœ‰è€…认为, - 大多数仅é™äºŒè¿›åˆ¶çš„æ¨¡å—æ˜¯å†…æ ¸çš„æ´¾ç”Ÿäº§å“ï¼Œå› æ¤ï¼Œå®ƒä»¬çš„分å‘è¿å了GNU通用公共 - 许å¯è¯ï¼ˆä¸‹é¢å°†è¯¦ç»†ä»‹ç»ï¼‰ã€‚æ‚¨çš„ä½œè€…ä¸æ˜¯å¾‹å¸ˆï¼Œæœ¬æ–‡æ¡£ä¸çš„任何内容都ä¸å¯èƒ½è¢« +- å›´ç»•ä¸“æœ‰å†…æ ¸æ¨¡å—分å‘çš„æ³•å¾‹é—®é¢˜å…¶å®žè¾ƒä¸ºæ¨¡ç³Šï¼›ç›¸å½“å¤šçš„å†…æ ¸ç‰ˆæƒæ‰€æœ‰è€…认为, + å¤§å¤šæ•°ä»…äºŒè¿›åˆ¶çš„æ¨¡å—æ˜¯å†…æ ¸çš„æ´¾ç”Ÿäº§å“ï¼Œå› æ¤ï¼Œå®ƒä»¬çš„分å‘è¿å了GNU通用公共 + 许å¯è¯ï¼ˆä¸‹é¢å°†è¯¦ç»†ä»‹ç»ï¼‰ã€‚æœ¬æ–‡ä½œè€…ä¸æ˜¯å¾‹å¸ˆï¼Œæœ¬æ–‡æ¡£ä¸çš„任何内容都ä¸å¯èƒ½è¢« 视为法律建议。å°é—æºä»£ç 模å—的真实法律地ä½åªèƒ½ç”±æ³•院决定。但ä¸ç®¡æ€Žæ ·ï¼Œå›°æ‰° 这些模å—çš„ä¸ç¡®å®šæ€§ä»ç„¶å˜åœ¨ã€‚ - 二进制模å—å¤§å¤§å¢žåŠ äº†è°ƒè¯•å†…æ ¸é—®é¢˜çš„éš¾åº¦ï¼Œä»¥è‡³äºŽå¤§å¤šæ•°å†…æ ¸å¼€å‘人员甚至都ä¸ä¼š å°è¯•ã€‚å› æ¤ï¼Œåªåˆ†å‘二进制模å—将使您的用户更难从社区获得支æŒã€‚ -- å¯¹äºŽåªæ”¯æŒäºŒè¿›åˆ¶çš„æ¨¡å—çš„å‘行者æ¥è¯´ï¼Œæ”¯æŒä¹Ÿæ›´åŠ å›°éš¾ï¼Œä»–ä»¬å¿…é¡»ä¸ºä»–ä»¬å¸Œæœ›æ”¯æŒ - çš„æ¯ä¸ªå‘行版和æ¯ä¸ªå†…æ ¸ç‰ˆæœ¬æä¾›ä¸€ä¸ªç‰ˆæœ¬çš„æ¨¡å—。为了æä¾›ç›¸å½“å…¨é¢çš„覆盖范围, +- 对于仅二进制的模å—çš„å‘行者æ¥è¯´ï¼Œæ”¯æŒä¹Ÿæ›´åŠ å›°éš¾ï¼Œä»–ä»¬å¿…é¡»ä¸ºä»–ä»¬å¸Œæœ›æ”¯æŒçš„ + æ¯ä¸ªå‘行版和æ¯ä¸ªå†…æ ¸ç‰ˆæœ¬æä¾›ä¸åŒç‰ˆæœ¬çš„æ¨¡å—。为了æä¾›è¾ƒä¸ºå…¨é¢çš„覆盖范围, å¯èƒ½éœ€è¦ä¸€ä¸ªæ¨¡å—çš„å‡ åä¸ªæž„å»ºï¼Œå¹¶ä¸”æ¯æ¬¡å‡çº§å†…æ ¸æ—¶ï¼Œæ‚¨çš„ç”¨æˆ·éƒ½å¿…é¡»å•独å‡çº§ - 您的模å—。 + 这些模å—。 -- ä¸Šé¢æåˆ°çš„å…³äºŽä»£ç è¯„å®¡çš„æ‰€æœ‰é—®é¢˜éƒ½æ›´åŠ å˜åœ¨äºŽå°é—æºä»£ç ã€‚ç”±äºŽè¯¥ä»£ç æ ¹æœ¬ä¸å¯ - ç”¨ï¼Œå› æ¤ç¤¾åŒºæ— æ³•å¯¹å…¶è¿›è¡Œå®¡æŸ¥ï¼Œæ¯«æ— ç–‘é—®ï¼Œå®ƒå°†å˜åœ¨ä¸¥é‡é—®é¢˜ã€‚ +- ä¸Šé¢æåˆ°çš„å…³äºŽä»£ç è¯„å®¡çš„æ‰€æœ‰é—®é¢˜éƒ½æ›´åŠ å˜åœ¨äºŽå°é—æºä»£ç ä¸ã€‚ç”±äºŽè¯¥ä»£ç æ ¹æœ¬ + ä¸å¯å¾—ï¼Œå› æ¤ç¤¾åŒºæ— æ³•å¯¹å…¶è¿›è¡Œå®¡æŸ¥ï¼Œæ¯«æ— ç–‘é—®ï¼Œå®ƒå°†å˜åœ¨ä¸¥é‡é—®é¢˜ã€‚ -尤其是嵌入å¼ç³»ç»Ÿçš„åˆ¶é€ å•†ï¼Œå¯èƒ½ä¼šå€¾å‘äºŽå¿½è§†æœ¬èŠ‚ä¸æ‰€è¯´çš„å¤§éƒ¨åˆ†å†…å®¹ï¼Œå› ä¸ºä»–ä»¬ +尤其是嵌入å¼ç³»ç»Ÿçš„åˆ¶é€ å•†ï¼Œå¯èƒ½ä¼šå€¾å‘äºŽå¿½è§†æœ¬èŠ‚ä¸æ‰€è¯´çš„å¤§éƒ¨åˆ†å†…å®¹ï¼›å› ä¸ºä»–ä»¬ 相信自己æ£åœ¨å•†ç”¨ä¸€ç§ä½¿ç”¨å†»ç»“å†…æ ¸ç‰ˆæœ¬çš„ç‹¬ç«‹äº§å“,在å‘布åŽä¸éœ€è¦å†è¿›è¡Œå¼€å‘。 这个论点忽略了广泛的代ç 审查的价值以åŠå…许用户å‘äº§å“æ·»åŠ åŠŸèƒ½çš„ä»·å€¼ã€‚ä½†è¿™äº› -产å“也有有é™çš„商业寿命,之åŽå¿…é¡»å‘布新版本的产å“。在这一点上,代ç 在主线上 -并得到良好维护的供应商将能够更好地å ä½ï¼Œä»¥ä½¿æ–°äº§å“快速上市。 +产å“的商业寿命有é™ï¼Œä¹‹åŽå¿…é¡»å‘布新版本的产å“。在这一点上,代ç 在主线上并得到 +良好维护的供应商将能够更好地å ä½ï¼Œä»¥ä½¿æ–°äº§å“快速上市。 è®¸å¯ ---- @@ -164,23 +172,24 @@ Andrew Morton, Andrew Price, Tsugikazu Shibata, å’Œ Jochen Voß. ä»£ç æ˜¯æ ¹æ®ä¸€äº›è®¸å¯è¯æä¾›ç»™Linuxå†…æ ¸çš„ï¼Œä½†æ˜¯æ‰€æœ‰ä»£ç 都必须与GNUé€šç”¨å…¬å…±è®¸å¯ è¯ï¼ˆGPLV2)的版本2å…¼å®¹ï¼Œè¯¥ç‰ˆæœ¬æ˜¯è¦†ç›–æ•´ä¸ªå†…æ ¸åˆ†å‘的许å¯è¯ã€‚在实践ä¸ï¼Œè¿™æ„味 ç€æ‰€æœ‰ä»£ç 贡献都由GPLv2(å¯é€‰åœ°ï¼Œè¯è¨€å…许在更高版本的GPL下分å‘)或3åå¥BSD -许å¯ï¼ˆNew BSD License, 译者注)覆盖。任何ä¸åŒ…å«åœ¨å…¼å®¹è®¸å¯è¯ä¸çš„贡献都ä¸ä¼š +许å¯ï¼ˆNew BSD License,译者注)覆盖。任何ä¸åŒ…å«åœ¨å…¼å®¹è®¸å¯è¯ä¸çš„贡献都ä¸ä¼š 被接å—åˆ°å†…æ ¸ä¸ã€‚ è´¡çŒ®ç»™å†…æ ¸çš„ä»£ç ä¸éœ€è¦ï¼ˆæˆ–请求)版æƒåˆ†é…。åˆå¹¶åˆ°ä¸»çº¿å†…æ ¸ä¸çš„æ‰€æœ‰ä»£ç 都ä¿ç•™ 其原始所有æƒï¼›å› æ¤ï¼Œå†…æ ¸çŽ°åœ¨æ‹¥æœ‰æ•°åƒä¸ªæ‰€æœ‰è€…。 -è¿™ç§æ‰€æœ‰æƒç»“构的一个暗示是,任何改å˜å†…æ ¸è®¸å¯çš„å°è¯•都注定会失败。很少有实际 -的场景å¯ä»¥èŽ·å¾—æ‰€æœ‰ç‰ˆæƒæ‰€æœ‰è€…çš„åŒæ„ï¼ˆæˆ–è€…ä»Žå†…æ ¸ä¸åˆ 除他们的代ç ï¼‰ã€‚å› æ¤ï¼Œç‰¹ -别是,在å¯é¢„è§çš„å°†æ¥ï¼Œä¸å¯èƒ½è¿ç§»åˆ°GPL的版本3。 +è¿™ç§æ‰€æœ‰æƒç»“构也暗示ç€ï¼Œä»»ä½•改å˜å†…æ ¸è®¸å¯çš„å°è¯•都注定会失败。很少有实际情况 +å¯ä»¥èŽ·å¾—æ‰€æœ‰ç‰ˆæƒæ‰€æœ‰è€…çš„åŒæ„ï¼ˆæˆ–è€…ä»Žå†…æ ¸ä¸åˆ 除他们的代ç ï¼‰ã€‚å› æ¤ï¼Œå°¤å…¶æ˜¯åœ¨ +å¯é¢„è§çš„å°†æ¥ï¼Œè®¸å¯è¯ä¸å¤§å¯èƒ½è¿ç§»åˆ°GPL的版本3。 -æ‰€æœ‰è´¡çŒ®ç»™å†…æ ¸çš„ä»£ç éƒ½å¿…é¡»æ˜¯åˆæ³•çš„å…è´¹è½¯ä»¶ã€‚å› æ¤ï¼Œä¸æŽ¥å—匿å(或匿å)贡献 -者的代ç 。所有贡献者都需è¦åœ¨ä»–们的代ç 上“sign offâ€ï¼Œå£°æ˜Žä»£ç å¯ä»¥åœ¨GPL下与内 -æ ¸ä¸€èµ·åˆ†å‘ã€‚æ— æ³•æä¾›æœªè¢«å…¶æ‰€æœ‰è€…许å¯ä¸ºå…费软件的代ç ,或å¯èƒ½ä¸ºå†…æ ¸é€ æˆç‰ˆæƒ -相关问题的代ç (例如,由缺ä¹é€‚å½“ä¿æŠ¤çš„åå‘工程工作派生的代ç )ä¸èƒ½è¢«æŽ¥å—。 +æ‰€æœ‰è´¡çŒ®ç»™å†…æ ¸çš„ä»£ç éƒ½å¿…é¡»æ˜¯åˆæ³•çš„å…è´¹è½¯ä»¶ã€‚å› æ¤ï¼Œä¸æŽ¥å—匿å(或化å)贡献 +者的代ç 。所有贡献者都需è¦åœ¨ä»–们的代ç 上“sign off(ç¾å‘)â€ï¼Œå£°æ˜Žä»£ç å¯ä»¥ +在GPLä¸‹ä¸Žå†…æ ¸ä¸€èµ·åˆ†å‘ã€‚æ— æ³•æä¾›æœªè¢«å…¶æ‰€æœ‰è€…许å¯ä¸ºå…费软件的代ç ,或å¯èƒ½ä¸º +å†…æ ¸é€ æˆç‰ˆæƒç›¸å…³é—®é¢˜çš„代ç (例如,由缺ä¹é€‚å½“ä¿æŠ¤çš„åå‘工程工作派生的代ç ) +ä¸èƒ½è¢«æŽ¥å—。 -有关版æƒç›¸å…³é—®é¢˜çš„问题在Linuxå¼€å‘邮件列表ä¸å¾ˆå¸¸è§ã€‚è¿™æ ·çš„é—®é¢˜é€šå¸¸ä¼šå¾—åˆ°ä¸å°‘ -ç”æ¡ˆï¼Œä½†è¦è®°ä½ï¼Œå›žç”è¿™äº›é—®é¢˜çš„äººä¸æ˜¯å¾‹å¸ˆï¼Œä¸èƒ½æä¾›æ³•律咨询。如果您有关于 -Linuxæºä»£ç çš„æ³•å¾‹é—®é¢˜ï¼Œé‚£ä¹ˆä¸Žäº†è§£è¯¥é¢†åŸŸçš„å¾‹å¸ˆäº¤æµæ˜¯æ— 法替代的。ä¾é 从技术 -邮件列表ä¸èŽ·å¾—çš„ç”æ¡ˆæ˜¯ä¸€ä»¶å†’险的事情。 +有关版æƒé—®é¢˜çš„æé—®åœ¨Linuxå¼€å‘邮件列表ä¸å¾ˆå¸¸è§ã€‚è¿™æ ·çš„é—®é¢˜é€šå¸¸ä¼šå¾—åˆ°ä¸å°‘ç”æ¡ˆï¼Œ +但请记ä½ï¼Œå›žç”è¿™äº›é—®é¢˜çš„äººä¸æ˜¯å¾‹å¸ˆï¼Œä¸èƒ½æä¾›æ³•律咨询。如果您有关于Linuxæºä»£ç +的法律问题,没有什么å¯ä»¥ä»£æ›¿å’¨è¯¢äº†è§£è¿™ä¸€é¢†åŸŸçš„律师。ä¾èµ–从技术邮件列表ä¸èŽ·å¾— +çš„ç”æ¡ˆæ˜¯ä¸€ä»¶å†’险的事情。 diff --git a/Documentation/translations/zh_CN/process/2.Process.rst b/Documentation/translations/zh_CN/process/2.Process.rst index ebe2e0254b3ebcc85acf94e2768d13ecb46185d9..229629e305ca9b05f67d875a6a6b62296c4386ad 100644 --- a/Documentation/translations/zh_CN/process/2.Process.rst +++ b/Documentation/translations/zh_CN/process/2.Process.rst @@ -1,17 +1,24 @@ .. include:: ../disclaimer-zh_CN.rst :Original: :ref:`Documentation/process/2.Process.rst <development_process>` -:Translator: Alex Shi <alex.shi@linux.alibaba.com> + +:Translator: + + 时奎亮 Alex Shi <alex.shi@linux.alibaba.com> + +:æ ¡è¯‘: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> .. _cn_development_process: -开呿µç¨‹å¦‚何工作 +开呿µç¨‹å¦‚何进行 ================ -90年代早期的Linuxå†…æ ¸å¼€å‘æ˜¯ä¸€ä»¶ç›¸å½“æ¾æ•£çš„事情,涉åŠçš„用户和开å‘人员相对较 -少。由于拥有数以百万计的用户群,并且在一年的时间里有大约2000åå¼€å‘人员å‚与 -è¿›æ¥ï¼Œå†…æ ¸å› æ¤å¿…é¡»å‘展许多æµç¨‹æ¥ä¿æŒå¼€å‘çš„é¡ºåˆ©è¿›è¡Œã€‚è¦æˆä¸ºæµç¨‹çš„æœ‰æ•ˆç»„æˆ -部分,需è¦å¯¹æµç¨‹çš„å·¥ä½œæ–¹å¼æœ‰ä¸€ä¸ªæ‰Žå®žçš„ç†è§£ã€‚ +90年代早期的Linuxå†…æ ¸å¼€å‘æ˜¯ä¸€ä»¶ç›¸å½“æ¾æ•£çš„事情,涉åŠçš„用户和开å‘人员相对较少。 +由于拥有数以百万计的用户群,且æ¯å¹´æœ‰å¤§çº¦2000åå¼€å‘人员å‚与进æ¥ï¼Œå†…æ ¸å› æ¤å¿…é¡» +å‘展出许多既定æµç¨‹æ¥ä¿è¯å¼€å‘的顺利进行。è¦å‚与到æµç¨‹ä¸æ¥ï¼Œéœ€è¦å¯¹æ¤æµç¨‹çš„进行 +æ–¹å¼æœ‰ä¸€ä¸ªæ‰Žå®žçš„ç†è§£ã€‚ 总览 ---- @@ -20,112 +27,113 @@ å†…æ ¸ç‰ˆæœ¬ã€‚æœ€è¿‘çš„å‘布历å²è®°å½•如下: ====== ================= - 4.11 四月 30, 2017 - 4.12 七月 2, 2017 - 4.13 乿œˆ 3, 2017 - 4.14 å一月 12, 2017 - 4.15 一月 28, 2018 - 4.16 四月 1, 2018 + 5.0 2019å¹´3月3æ—¥ + 5.1 2019å¹´5月5æ—¥ + 5.2 2019å¹´7月7æ—¥ + 5.3 2019å¹´9月15æ—¥ + 5.4 2019å¹´11月24æ—¥ + 5.5 2020å¹´1月6æ—¥ ====== ================= -æ¯4.x版本都是一个主è¦çš„å†…æ ¸ç‰ˆæœ¬ï¼Œå…·æœ‰æ–°ç‰¹æ€§ã€å†…部API更改ç‰ç‰ã€‚一个典型的4.x -版本包å«å¤§çº¦13000ä¸ªå˜æ›´é›†ï¼Œå˜æ›´äº†å‡ å万行代ç ã€‚å› æ¤ï¼Œ4.x是Linuxå†…æ ¸å¼€å‘çš„å‰ +æ¯ä¸ª5.x版本都是一个主è¦çš„å†…æ ¸ç‰ˆæœ¬ï¼Œå…·æœ‰æ–°ç‰¹æ€§ã€å†…部API更改ç‰ç‰ã€‚一个典型的5.x +版本包å«å¤§çº¦13000ä¸ªå˜æ›´é›†ï¼Œå˜æ›´äº†å‡ å万行代ç ã€‚å› æ¤ï¼Œ5.x是Linuxå†…æ ¸å¼€å‘çš„å‰ æ²¿ï¼›å†…æ ¸ä½¿ç”¨æ»šåŠ¨å¼€å‘æ¨¡åž‹ï¼Œä¸æ–集æˆé‡å¤§å˜åŒ–。 -对于æ¯ä¸ªç‰ˆæœ¬çš„è¡¥ä¸åˆå¹¶ï¼Œéµå¾ªä¸€ä¸ªç›¸å¯¹ç®€å•的规则。在æ¯ä¸ªå¼€å‘周期的开始,“åˆå¹¶ -窗å£â€è¢«æ‰“开。当时,被认为足够稳定(并且被开å‘社区接å—)的代ç 被åˆå¹¶åˆ°ä¸»çº¿å†… +对于æ¯ä¸ªç‰ˆæœ¬çš„è¡¥ä¸åˆå¹¶ï¼Œéµå¾ªä¸€ä¸ªç›¸å¯¹ç®€å•的规则。在æ¯ä¸ªå¼€å‘周期的开头,“åˆå¹¶ +窗å£â€è¢«æ‰“开。这时,被认为足够稳定(并且被开å‘社区接å—)的代ç 被åˆå¹¶åˆ°ä¸»çº¿å†… æ ¸ä¸ã€‚在这段时间内,新开å‘å‘¨æœŸçš„å¤§éƒ¨åˆ†å˜æ›´ï¼ˆä»¥åŠæ‰€æœ‰ä¸»è¦å˜æ›´ï¼‰å°†ä»¥æŽ¥è¿‘æ¯å¤© 1000æ¬¡å˜æ›´ï¼ˆâ€œè¡¥ä¸â€æˆ–â€œå˜æ›´é›†â€ï¼‰çš„速度åˆå¹¶ã€‚ -(顺便说一å¥ï¼Œå€¼å¾—注æ„的是,åˆå¹¶çª—壿œŸé—´é›†æˆçš„æ›´æ”¹å¹¶ä¸æ˜¯å‡ç©ºäº§ç”Ÿçš„;它们是 -æå‰æ”¶é›†ã€æµ‹è¯•和分级的。ç¨åŽå°†è¯¦ç»†æè¿°è¯¥è¿‡ç¨‹çš„工作方å¼ï¼‰ã€‚ +(顺便说一å¥ï¼Œå€¼å¾—注æ„的是,åˆå¹¶çª—壿œŸé—´é›†æˆçš„æ›´æ”¹å¹¶ä¸æ˜¯å‡ç©ºäº§ç”Ÿçš„ï¼›å®ƒä»¬æ˜¯ç» +æå‰æ”¶é›†ã€æµ‹è¯•和分级的。ç¨åŽå°†è¯¦ç»†æè¿°è¯¥è¿‡ç¨‹çš„工作方å¼ã€‚) åˆå¹¶çª—壿Œç»å¤§çº¦ä¸¤å‘¨ã€‚åœ¨è¿™æ®µæ—¶é—´ç»“æŸæ—¶ï¼ŒLinusTorvalds将声明窗å£å·²å…³é—,并 -释放第一个“rcâ€å†…æ ¸ã€‚ä¾‹å¦‚ï¼Œå¯¹äºŽç›®æ ‡ä¸º4.14çš„å†…æ ¸ï¼Œåœ¨åˆå¹¶çª—å£ç»“æŸæ—¶å‘生的释放 -将被称为4.14-rc1。RC1版本是一个信å·ï¼Œè¡¨ç¤ºåˆå¹¶æ–°ç‰¹æ€§çš„æ—¶é—´å·²ç»è¿‡åŽ»ï¼Œç¨³å®šä¸‹ä¸€ -ä¸ªå†…æ ¸çš„æ—¶é—´å·²ç»å¼€å§‹ã€‚ +释放第一个“rcâ€å†…æ ¸ã€‚ä¾‹å¦‚ï¼Œå¯¹äºŽç›®æ ‡ä¸º5.6çš„å†…æ ¸ï¼Œåœ¨åˆå¹¶çª—å£ç»“æŸæ—¶å‘生的释放 +将被称为5.6-rc1。-rc1 版本是一个信å·ï¼Œè¡¨ç¤ºåˆå¹¶æ–°ç‰¹æ€§çš„æ—¶é—´å·²ç»è¿‡åŽ»ï¼Œç¨³å®šä¸‹ä¸€ +ä¸ªå†…æ ¸çš„æ—¶é—´å·²ç»åˆ°æ¥ã€‚ 在接下æ¥çš„6到10å‘¨å†…ï¼Œåªæœ‰ä¿®å¤é—®é¢˜çš„è¡¥ä¸æ‰åº”该æäº¤ç»™ä¸»çº¿ã€‚有时会å…许更大的 -æ›´æ”¹ï¼Œä½†è¿™ç§æƒ…况很少å‘生;试图在åˆå¹¶çª—å£å¤–åˆå¹¶æ–°åŠŸèƒ½çš„å¼€å‘人员往往会å—åˆ°ä¸ +æ›´æ”¹ï¼Œä½†è¿™ç§æƒ…况很少å‘生;试图在åˆå¹¶çª—å£å¤–åˆå¹¶æ–°åŠŸèƒ½çš„å¼€å‘人员往往å—ä¸åˆ° å‹å¥½çš„æŽ¥å¾…。一般æ¥è¯´ï¼Œå¦‚果您错过了给定特性的åˆå¹¶çª—å£ï¼Œæœ€å¥½çš„åšæ³•是ç‰å¾…下一 -个开å‘周期。(对于以å‰ä¸æ”¯æŒçš„硬件,å¶å°”会对驱动程åºè¿›è¡Œä¾‹å¤–ï¼›å¦‚æžœå®ƒä»¬ä¸ -改å˜å·²æœ‰ä»£ç ,则ä¸ä¼šå¯¼è‡´å›žå½’,并且应该å¯ä»¥éšæ—¶å®‰å…¨åœ°æ·»åŠ ï¼‰ã€‚ +个开å‘周期。(å¶å°”会对未支æŒç¡¬ä»¶çš„驱动程åºè¿›è¡Œä¾‹å¤–ï¼›å¦‚æžœå®ƒä»¬ä¸æ”¹å˜å·²æœ‰ä»£ç , +则ä¸ä¼šå¯¼è‡´å›žå½’,应该å¯ä»¥éšæ—¶è¢«å®‰å…¨åœ°åŠ å…¥ï¼‰ã€‚ éšç€ä¿®å¤ç¨‹åºè¿›å…¥ä¸»çº¿ï¼Œè¡¥ä¸é€Ÿåº¦å°†éšç€æ—¶é—´çš„æŽ¨ç§»è€Œå˜æ…¢ã€‚Linus大约æ¯å‘¨å‘布一次 -æ–°çš„-rcå†…æ ¸ï¼›ä¸€ä¸ªæ£å¸¸çš„系列将在-rc6å’Œ-rc9ä¹‹é—´ï¼Œå†…æ ¸è¢«è®¤ä¸ºè¶³å¤Ÿç¨³å®šå¹¶æœ€ç»ˆå‘布。 +æ–°çš„-rcå†…æ ¸ï¼›åœ¨å†…æ ¸è¢«è®¤ä¸ºè¶³å¤Ÿç¨³å®šå¹¶æœ€ç»ˆå‘布å‰ï¼Œä¸€èˆ¬ä¼šè¾¾åˆ°-rc6到-rc9之间。 ç„¶åŽï¼Œæ•´ä¸ªè¿‡ç¨‹åˆé‡æ–°å¼€å§‹äº†ã€‚ -例如,这里是4.16的开å‘周期进行情况(2018年的所有日期): +例如,这里是5.4的开å‘周期进行情况(2019年): ============== ============================== - 一月 28 4.15 稳定版å‘布 - 二月 11 4.16-rc1, åˆå¹¶çª—å£å…³é— - 二月 18 4.16-rc2 - 二月 25 4.16-rc3 - 三月 4 4.16-rc4 - 三月 11 4.16-rc5 - 三月 18 4.16-rc6 - 三月 25 4.16-rc7 - 四月 1 4.16 稳定版å‘布 + 乿œˆ 15 5.3 稳定版å‘布 + 乿œˆ 30 5.4-rc1 åˆå¹¶çª—å£å…³é— + åæœˆ 6 5.4-rc2 + åæœˆ 13 5.4-rc3 + åæœˆ 20 5.4-rc4 + åæœˆ 27 5.4-rc5 + å一月 3 5.4-rc6 + å一月 10 5.4-rc7 + å一月 17 5.4-rc8 + å一月 24 5.4 稳定版å‘布 ============== ============================== -å¼€å‘人员如何决定何时结æŸå¼€å‘周期并创建稳定的版本?使用的最é‡è¦çš„æŒ‡æ ‡æ˜¯ä»¥å‰ -ç‰ˆæœ¬çš„å›žå½’åˆ—è¡¨ã€‚ä¸æ¬¢è¿Žå‡ºçŽ°ä»»ä½•é”™è¯¯ï¼Œä½†æ˜¯é‚£äº›ç ´å了以å‰èƒ½å·¥ä½œçš„系统的错误被 -认为是特别严é‡çš„ã€‚å› æ¤ï¼Œå¯¼è‡´å›žå½’çš„è¡¥ä¸æ˜¯ä¸å—欢迎的,很å¯èƒ½åœ¨ç¨³å®šæœŸå†…åˆ é™¤ã€‚ +å¼€å‘人员如何决定何时结æŸå¼€å‘周期并创建稳定版本?最é‡è¦çš„æŒ‡æ ‡æ˜¯ä»¥å‰ç‰ˆæœ¬çš„ +å›žå½’åˆ—è¡¨ã€‚ä¸æ¬¢è¿Žå‡ºçŽ°ä»»ä½•é”™è¯¯ï¼Œä½†æ˜¯é‚£äº›ç ´å了以å‰èƒ½å·¥ä½œçš„系统的错误被认为是 +特别严é‡çš„ã€‚å› æ¤ï¼Œå¯¼è‡´å›žå½’çš„è¡¥ä¸æ˜¯ä¸å—欢迎的,很å¯èƒ½åœ¨ç¨³å®šæœŸå†…åˆ é™¤ã€‚ å¼€å‘äººå‘˜çš„ç›®æ ‡æ˜¯åœ¨ç¨³å®šå‘布之å‰ä¿®å¤æ‰€æœ‰å·²çŸ¥çš„回归。在现实世界ä¸ï¼Œè¿™ç§å®Œç¾Žæ˜¯ -很难实现的;在这ç§è§„模的项目ä¸ï¼Œå˜é‡å¤ªå¤šäº†ã€‚有一点,延迟最终版本åªä¼šä½¿é—®é¢˜ -å˜å¾—更糟;ç‰å¾…下一个åˆå¹¶çª—å£çš„ä¸€å †æ›´æ”¹å°†å˜å¤§ï¼Œä»Žè€Œåœ¨ä¸‹æ¬¡åˆ›å»ºæ›´å¤šçš„回归错误。 -å› æ¤ï¼Œå¤§å¤šæ•°4.xå†…æ ¸éƒ½æœ‰ä¸€äº›å·²çŸ¥çš„å›žå½’é”™è¯¯ï¼Œä¸è¿‡ï¼Œå¸Œæœ›æ²¡æœ‰ä¸€ä¸ªæ˜¯ä¸¥é‡çš„。 +很难实现的;在这ç§è§„模的项目ä¸ï¼Œå˜æ•°å¤ªå¤šäº†ã€‚需è¦è¯´æ˜Žçš„æ˜¯ï¼Œå»¶è¿Ÿæœ€ç»ˆç‰ˆæœ¬åªä¼š +使问题å˜å¾—更糟;ç‰å¾…下一个åˆå¹¶çª—å£çš„æ›´æ”¹å°†å˜å¤šï¼Œå¯¼è‡´ä¸‹æ¬¡å‡ºçŽ°æ›´å¤šçš„å›žå½’é”™è¯¯ã€‚ +å› æ¤ï¼Œå¤§å¤šæ•°5.xå†…æ ¸éƒ½æœ‰ä¸€äº›å·²çŸ¥çš„å›žå½’é”™è¯¯ï¼Œä¸è¿‡ï¼Œå¸Œæœ›æ²¡æœ‰ä¸€ä¸ªæ˜¯ä¸¥é‡çš„。 -一旦一个稳定的版本å‘布,它æ£åœ¨è¿›è¡Œçš„维护工作就被移交给“稳定团队â€ï¼Œç›®å‰ç”± -Greg Kroah-Hartman组æˆã€‚稳定团队将使用4.x.yç¼–å·æ–¹æ¡ˆä¸å®šæœŸçš„å‘布稳定版本的更 -新。è¦åŠ å…¥æ›´æ–°ç‰ˆæœ¬ï¼Œè¡¥ä¸ç¨‹åºå¿…须(1)修å¤ä¸€ä¸ªé‡è¦çš„bug,(2)已ç»åˆå¹¶åˆ° -下一个开å‘主线ä¸ã€‚å†…æ ¸é€šå¸¸ä¼šåœ¨è¶…è¿‡å…¶åˆå§‹ç‰ˆæœ¬çš„一个以上的开å‘周期内接收稳定 -的更新。例如,4.13å†…æ ¸çš„åŽ†å²å¦‚下 +一旦一个稳定的版本å‘布,它的æŒç»ç»´æŠ¤å·¥ä½œå°±è¢«ç§»äº¤ç»™â€œç¨³å®šå›¢é˜Ÿâ€ï¼Œç›®å‰ç”± +Greg Kroah-Hartman领导。稳定团队将使用5.x.yç¼–å·æ–¹æ¡ˆä¸å®šæœŸåœ°å‘布稳定版本的 +更新。è¦åˆå…¥æ›´æ–°ç‰ˆæœ¬ï¼Œè¡¥ä¸å¿…须(1)修å¤ä¸€ä¸ªé‡è¦çš„缺陷,且(2)已ç»åˆå¹¶åˆ° +下一个开å‘版本主线ä¸ã€‚å†…æ ¸é€šå¸¸ä¼šåœ¨å…¶åˆå§‹ç‰ˆæœ¬åŽçš„一个以上的开å‘周期内收到 +稳定版更新。例如,5.2å†…æ ¸çš„åŽ†å²å¦‚下(2019年): ============== =============================== - 乿œˆ 3 4.13 稳定版å‘布 - 乿œˆ 13 4.13.1 - 乿œˆ 20 4.13.2 - 乿œˆ 27 4.13.3 - åæœˆ 5 4.13.4 - åæœˆ 12 4.13.5 + 七月 7 5.2 稳定版å‘布 + 七月 13 5.2.1 + 七月 21 5.2.2 + 七月 26 5.2.3 + 七月 28 5.2.4 + 七月 31 5.2.5 ... ... - å一月 24 4.13.16 + åæœˆ 11 5.2.21 ============== =============================== -4.13.16是4.13版本的最终稳定更新。 +5.2.21是5.2版本的最终稳定更新。 æœ‰äº›å†…æ ¸è¢«æŒ‡å®šä¸ºâ€œé•¿æœŸâ€å†…æ ¸ï¼›å®ƒä»¬å°†å¾—åˆ°æ›´é•¿æ—¶é—´çš„æ”¯æŒã€‚在本文ä¸ï¼Œå½“å‰çš„长期 å†…æ ¸åŠå…¶ç»´æŠ¤è€…是: - ====== ====================== ============================== - 3.16 Ben Hutchings (é•¿æœŸç¨³å®šå†…æ ¸) - 4.1 Sasha Levin - 4.4 Greg Kroah-Hartman (é•¿æœŸç¨³å®šå†…æ ¸) - 4.9 Greg Kroah-Hartman - 4.14 Greg Kroah-Hartman - ====== ====================== ============================== + ====== ================================ ================ + 3.16 Ben Hutchings ï¼ˆé•¿æœŸç¨³å®šå†…æ ¸ï¼‰ + 4.4 Greg Kroah-Hartman & Sasha Levin ï¼ˆé•¿æœŸç¨³å®šå†…æ ¸ï¼‰ + 4.9 Greg Kroah-Hartman & Sasha Levin + 4.14 Greg Kroah-Hartman & Sasha Levin + 4.19 Greg Kroah-Hartman & Sasha Levin + 5.4 Greg Kroah-Hartman & Sasha Levin + ====== ================================ ================ -为长期支æŒé€‰æ‹©å†…æ ¸çº¯ç²¹æ˜¯ç»´æŠ¤äººå‘˜æœ‰å¿…è¦å’Œæ—¶é—´æ¥ç»´æŠ¤è¯¥ç‰ˆæœ¬çš„问题。目å‰è¿˜æ²¡æœ‰ -为å³å°†å‘布的任何特定版本æä¾›é•¿æœŸæ”¯æŒçš„已知计划。 +长期支æŒå†…æ ¸çš„é€‰æ‹©çº¯ç²¹æ˜¯ç»´æŠ¤äººå‘˜æ˜¯å¦æœ‰éœ€æ±‚和时间æ¥ç»´æŠ¤è¯¥ç‰ˆæœ¬çš„问题。 +ç›®å‰è¿˜æ²¡æœ‰ä¸ºå³å°†å‘布的任何特定版本æä¾›é•¿æœŸæ”¯æŒçš„已知计划。 è¡¥ä¸çš„生命周期 -------------- è¡¥ä¸ä¸ä¼šç›´æŽ¥ä»Žå¼€å‘äººå‘˜çš„é”®ç›˜è¿›å…¥ä¸»çº¿å†…æ ¸ã€‚ç›¸å,有一个ç¨å¾®å¤æ‚ï¼ˆå¦‚æžœæœ‰äº›éž æ£å¼ï¼‰çš„过程,旨在确ä¿å¯¹æ¯ä¸ªè¡¥ä¸è¿›è¡Œè´¨é‡å®¡æŸ¥ï¼Œå¹¶ç¡®ä¿æ¯ä¸ªè¡¥ä¸å®žçŽ°äº†ä¸€ä¸ªåœ¨ä¸»çº¿ -ä¸éœ€è¦çš„æ›´æ”¹ã€‚对于å°çš„ä¿®å¤ï¼Œè¿™ä¸ªè¿‡ç¨‹å¯èƒ½ä¼šå¾ˆå¿«å‘生,或者,在大的和有争议的 -å˜æ›´çš„æƒ…况下,会æŒç»æ•°å¹´ã€‚许多开å‘人员的挫折æ¥è‡ªäºŽå¯¹è¿™ä¸ªè¿‡ç¨‹ç¼ºä¹ç†è§£æˆ–者 -试图绕过它。 +ä¸éœ€è¦çš„æ›´æ”¹ã€‚对于å°çš„ä¿®å¤ï¼Œè¿™ä¸ªè¿‡ç¨‹å¯èƒ½ä¼šå¾ˆå¿«å®Œæˆï¼Œï¼Œè€Œå¯¹äºŽè¾ƒå¤§æˆ–有争议的 +å˜æ›´ï¼Œå¯èƒ½ä¼šæŒç»æ•°å¹´ã€‚许多开å‘人员的沮丧æ¥è‡ªäºŽå¯¹è¿™ä¸ªè¿‡ç¨‹ç¼ºä¹ç†è§£æˆ–者试图绕过它。 -为了å‡å°‘è¿™ç§æŒ«æŠ˜æ„Ÿï¼Œæœ¬æ–‡å°†æè¿°è¡¥ä¸å¦‚ä½•è¿›å…¥å†…æ ¸ã€‚ä¸‹é¢æ˜¯ä¸€ä¸ªä»‹ç»ï¼Œå®ƒä»¥æŸç§ -ç†æƒ³åŒ–çš„æ–¹å¼æè¿°äº†è¿™ä¸ªè¿‡ç¨‹ã€‚æ›´è¯¦ç»†çš„è¿‡ç¨‹å°†åœ¨åŽé¢çš„ç« èŠ‚ä¸ä»‹ç»ã€‚ +为了å‡å°‘è¿™ç§æŒ«è´¥ï¼Œæœ¬æ–‡å°†æè¿°è¡¥ä¸å¦‚ä½•è¿›å…¥å†…æ ¸ã€‚ä¸‹é¢çš„介ç»ä»¥ä¸€ç§è¾ƒä¸ºç†æƒ³åŒ–çš„ +æ–¹å¼æè¿°äº†è¿™ä¸ªè¿‡ç¨‹ã€‚æ›´è¯¦ç»†çš„è¿‡ç¨‹å°†åœ¨åŽé¢çš„ç« èŠ‚ä¸ä»‹ç»ã€‚ -è¡¥ä¸ç¨‹åºç»åŽ†çš„é˜¶æ®µé€šå¸¸æ˜¯ï¼š +è¡¥ä¸é€šå¸¸è¦ç»åŽ†ä»¥ä¸‹é˜¶æ®µï¼š -- 设计。这就是补ä¸çš„真æ£éœ€æ±‚â€”â€”ä»¥åŠæ»¡è¶³è¿™äº›éœ€æ±‚的方å¼â€”—的所在。设计工作通常 +- 设计。这就是补ä¸çš„真æ£éœ€æ±‚â€”â€”ä»¥åŠæ»¡è¶³è¿™äº›éœ€æ±‚的方å¼â€”—所在。设计工作通常 æ˜¯åœ¨ä¸æ¶‰åŠç¤¾åŒºçš„æƒ…况下完æˆçš„,但是如果å¯èƒ½çš„è¯ï¼Œæœ€å¥½æ˜¯åœ¨å…¬å¼€çš„æƒ…å†µä¸‹å®Œæˆ è¿™é¡¹å·¥ä½œï¼›è¿™æ ·å¯ä»¥èŠ‚çœå¾ˆå¤šç¨åŽå†é‡æ–°è®¾è®¡çš„æ—¶é—´ã€‚ @@ -134,53 +142,51 @@ Greg Kroah-Hartman组æˆã€‚稳定团队将使用4.x.yç¼–å·æ–¹æ¡ˆä¸å®šæœŸçš„å‘ - æ›´å¹¿æ³›çš„è¯„å®¡ã€‚å½“è¡¥ä¸æŽ¥è¿‘å‡†å¤‡å¥½çº³å…¥ä¸»çº¿æ—¶ï¼Œå®ƒåº”è¯¥è¢«ç›¸å…³çš„å系统维护人员 接å—â€”â€”å°½ç®¡è¿™ç§æŽ¥å—å¹¶ä¸èƒ½ä¿è¯è¡¥ä¸ä¼šä¸€ç›´å»¶ä¼¸åˆ°ä¸»çº¿ã€‚è¡¥ä¸å°†å‡ºçŽ°åœ¨ç»´æŠ¤äººå‘˜çš„ - åç³»ç»Ÿæ ‘ä¸ï¼Œå¹¶è¿›å…¥ -next æ ‘ï¼ˆå¦‚ä¸‹æ‰€è¿°ï¼‰ã€‚å½“æµç¨‹å·¥ä½œæ—¶ï¼Œæ¤æ¥éª¤å°†å¯¼è‡´å¯¹è¡¥ä¸ - 进行更广泛的审查,并å‘现由于将æ¤è¡¥ä¸ä¸Žå…¶ä»–人所åšçš„工作集æˆè€Œå¯¼è‡´çš„任何 + åç³»ç»Ÿæ ‘ä¸ï¼Œå¹¶è¿›å…¥ -next æ ‘ï¼ˆå¦‚ä¸‹æ‰€è¿°ï¼‰ã€‚å½“æµç¨‹è¿›è¡Œæ—¶ï¼Œæ¤æ¥éª¤å°†ä¼šå¯¹è¡¥ä¸ + 进行更广泛的审查,并å‘现由于将æ¤è¡¥ä¸ä¸Žå…¶ä»–人所åšçš„工作åˆå¹¶è€Œå¯¼è‡´çš„任何 问题。 -- 请注æ„ï¼Œå¤§å¤šæ•°ç»´æŠ¤äººå‘˜ä¹Ÿæœ‰æ—¥å¸¸å·¥ä½œï¼Œå› æ¤åˆå¹¶è¡¥ä¸å¯èƒ½ä¸æ˜¯ä»–们的最高优先级。 - 如果您的补ä¸ç¨‹åºå¾—到了关于所需更改的å馈,那么您应该进行这些更改,或者为 - ä¸åº”è¯¥è¿›è¡Œè¿™äº›æ›´æ”¹çš„åŽŸå› è¾©æŠ¤ã€‚å¦‚æžœæ‚¨çš„è¡¥ä¸æ²¡æœ‰è¯„审æ„è§ï¼Œä½†æ²¡æœ‰è¢«å…¶ç›¸åº”çš„ - å系统或驱动程åºç»´æŠ¤è€…接å—ï¼Œé‚£ä¹ˆæ‚¨åº”è¯¥åšæŒä¸æ‡ˆåœ°å°†è¡¥ä¸æ›´æ–°åˆ°å½“å‰å†…æ ¸ï¼Œä½¿ - å…¶å¹²å‡€åœ°åº”ç”¨ï¼Œå¹¶ä¸æ–地将其å‘é€ä»¥ä¾›å®¡æŸ¥å’Œåˆå¹¶ã€‚ +- 请注æ„ï¼Œå¤§å¤šæ•°ç»´æŠ¤äººå‘˜ä¹Ÿæœ‰æ—¥å¸¸å·¥ä½œï¼Œå› æ¤åˆå¹¶è¡¥ä¸å¯èƒ½ä¸æ˜¯ä»–们的最优先工作。 + 如果您的补ä¸å¾—åˆ°äº†éœ€è¦æ›´æ”¹çš„å馈,那么您应该进行这些更改,或者解释为何 + ä¸åº”è¯¥è¿›è¡Œè¿™äº›æ›´æ”¹ã€‚å¦‚æžœæ‚¨çš„è¡¥ä¸æ²¡æœ‰è¯„审æ„è§ï¼Œä¹Ÿæ²¡æœ‰è¢«å…¶ç›¸åº”çš„å系统或 + 驱动程åºç»´æŠ¤è€…接å—ï¼Œé‚£ä¹ˆæ‚¨åº”è¯¥åšæŒä¸æ‡ˆåœ°å°†è¡¥ä¸æ›´æ–°åˆ°å½“å‰å†…æ ¸ä½¿å…¶å¯è¢«æ£å¸¸ + åº”ç”¨ï¼Œå¹¶ä¸æ–地å‘é€å®ƒä»¥ä¾›å®¡æŸ¥å’Œåˆå¹¶ã€‚ - åˆå¹¶åˆ°ä¸»çº¿ã€‚最终,一个æˆåŠŸçš„è¡¥ä¸å°†è¢«åˆå¹¶åˆ°ç”±LinusTorvalds管ç†çš„主线å˜å‚¨åº“ - ä¸ã€‚æ¤æ—¶å¯èƒ½ä¼šå‡ºçŽ°æ›´å¤šçš„è¯„è®ºå’Œ/或问题;开å‘人员应对这些问题并解决出现的 - 任何问题很é‡è¦ã€‚ + ä¸ã€‚æ¤æ—¶å¯èƒ½ä¼šå‡ºçŽ°æ›´å¤šçš„è¯„è®ºå’Œ/或问题;对开å‘人员æ¥è¯´åº”对这些问题并解决 + 出现的任何问题ä»å¾ˆé‡è¦ã€‚ -- 稳定版å‘布。å¯èƒ½å—è¡¥ä¸å½±å“的用户数é‡çŽ°åœ¨å¾ˆå¤§ï¼Œå› æ¤å¯èƒ½å†æ¬¡å‡ºçŽ°æ–°çš„é—®é¢˜ã€‚ +- 稳定版å‘布。大é‡ç”¨æˆ·å¯èƒ½å—æ¤è¡¥ä¸å½±å“ï¼Œå› æ¤å¯èƒ½å†æ¬¡å‡ºçŽ°æ–°çš„é—®é¢˜ã€‚ - 长期维护。虽然开å‘人员在åˆå¹¶ä»£ç åŽå¯èƒ½ä¼šå¿˜è®°ä»£ç ,但这ç§è¡Œä¸ºå¾€å¾€ä¼šç»™å¼€å‘ - 社区留下ä¸è‰¯å°è±¡ã€‚åˆå¹¶ä»£ç æ¶ˆé™¤äº†ä¸€äº›ç»´æŠ¤è´Ÿæ‹…ï¼Œå› ä¸ºå…¶ä»–ä»£ç 将修å¤ç”±API - 更改引起的问题。但是,如果代ç è¦é•¿æœŸä¿æŒæœ‰ç”¨ï¼ŒåŽŸå§‹å¼€å‘人员应该继ç»ä¸º - 代ç 负责。 + 社区留下ä¸è‰¯å°è±¡ã€‚åˆå¹¶ä»£ç æ¶ˆé™¤äº†ä¸€äº›ç»´æŠ¤è´Ÿæ‹…ï¼Œå› ä¸ºå…¶ä»–äººå°†ä¿®å¤ç”±API更改 + 引起的问题。但是,如果代ç è¦é•¿æœŸä¿æŒå¯ç”¨ï¼ŒåŽŸå§‹å¼€å‘人员应该继ç»ä¸ºä»£ç 负责。 -å†…æ ¸å¼€å‘人员(或他们的雇主)犯的最大错误之一是试图将æµç¨‹ç®€åŒ–为一个 -“åˆå¹¶åˆ°ä¸»çº¿â€æ¥éª¤ã€‚è¿™ç§æ–¹æ³•总是会让所有相关人员感到沮丧。 +å†…æ ¸å¼€å‘人员(或他们的雇主)犯的最大错误之一是试图将æµç¨‹ç®€åŒ–为一个“åˆå¹¶åˆ° +ä¸»çº¿â€æ¥éª¤ã€‚è¿™ç§æ–¹æ³•总是会让所有相关人员感到沮丧。 è¡¥ä¸å¦‚ä½•è¿›å…¥å†…æ ¸ ---------------- åªæœ‰ä¸€ä¸ªäººå¯ä»¥å°†è¡¥ä¸åˆå¹¶åˆ°ä¸»çº¿å†…æ ¸å˜å‚¨åº“ä¸ï¼šLinusTorvalds。但是,在进入 2.6.38å†…æ ¸çš„9500多个补ä¸ä¸ï¼Œåªæœ‰112个(大约1.3%)是由Linus自己直接选择的。 -å†…æ ¸é¡¹ç›®å·²ç»å‘展到一个规模,没有一个开å‘人员å¯ä»¥åœ¨æ²¡æœ‰æ”¯æŒçš„æƒ…况下检查和 -选择æ¯ä¸ªè¡¥ä¸ã€‚å†…æ ¸å¼€å‘人员处ç†è¿™ç§å¢žé•¿çš„æ–¹å¼æ˜¯é€šè¿‡ä½¿ç”¨å›´ç»•信任链构建的 -助ç†ç³»ç»Ÿã€‚ +å†…æ ¸é¡¹ç›®å·²ç»å‘展到一个没有一个开å‘人员å¯ä»¥åœ¨æ²¡æœ‰æ”¯æŒçš„æƒ…况下检查和选择æ¯ä¸ª +è¡¥ä¸çš„è§„æ¨¡ã€‚å†…æ ¸å¼€å‘人员处ç†è¿™ç§å¢žé•¿çš„æ–¹å¼æ˜¯ä½¿ç”¨å›´ç»•信任链构建的助ç†ç³»ç»Ÿã€‚ -å†…æ ¸ä»£ç 库在逻辑上被分解为一组å系统:网络ã€ç‰¹å®šçš„体系结构支æŒã€å†…å˜ç®¡ç†ã€ -视频设备ç‰ã€‚大多数å系统都有一个指定的维护人员,开å‘人员对该å系统ä¸çš„代ç -负有全部责任。这些åç³»ç»Ÿç»´æŠ¤è€…ï¼ˆæ¾æ•£åœ°ï¼‰æ˜¯ä»–们所管ç†çš„å†…æ ¸éƒ¨åˆ†çš„å®ˆæŠ¤è€…ï¼› -他们(通常)会接å—一个补ä¸ä»¥åŒ…å«åˆ°ä¸»çº¿å†…æ ¸ä¸ã€‚ +å†…æ ¸ä»£ç 库在逻辑上被分解为一组å系统:网络ã€ç‰¹å®šä½“系结构支æŒã€å†…å˜ç®¡ç†ã€è§† +频设备ç‰ã€‚大多数å系统都有一个指定的维护人员,其总体负责该å系统ä¸çš„代ç 。 +这些åç³»ç»Ÿç»´æŠ¤è€…ï¼ˆæ¾æ•£åœ°ï¼‰æ˜¯ä»–们所管ç†çš„å†…æ ¸éƒ¨åˆ†çš„â€œå®ˆé—¨å‘˜â€ï¼›ä»–们(通常) +会接å—一个补ä¸ä»¥åŒ…å«åˆ°ä¸»çº¿å†…æ ¸ä¸ã€‚ -å系统维护人员æ¯ä¸ªäººéƒ½ä½¿ç”¨gitæºä»£ç 管ç†å·¥å…·ç®¡ç†è‡ªå·±ç‰ˆæœ¬çš„å†…æ ¸æºä»£ç æ ‘ã€‚Git -ç‰å·¥å…·ï¼ˆä»¥åŠQuilt或Mercurialç‰ç›¸å…³å·¥å…·ï¼‰å…许维护人员跟踪补ä¸åˆ—表,包括作者 +å系统维护人员æ¯ä¸ªäººéƒ½ç®¡ç†ç€è‡ªå·±ç‰ˆæœ¬çš„å†…æ ¸æºä»£ç æ ‘ï¼Œé€šå¸¸ï¼ˆå¹¶éžæ€»æ˜¯ï¼‰ä½¿ç”¨Git。 +Gitç‰å·¥å…·ï¼ˆä»¥åŠQuilt或Mercurialç‰ç›¸å…³å·¥å…·ï¼‰å…许维护人员跟踪补ä¸åˆ—表,包括作者 ä¿¡æ¯å’Œå…¶ä»–元数æ®ã€‚在任何给定的时间,维护人员都å¯ä»¥ç¡®å®šä»–或她的å˜å‚¨åº“ä¸çš„哪 些补ä¸åœ¨ä¸»çº¿ä¸æ‰¾ä¸åˆ°ã€‚ -当åˆå¹¶çª—壿‰“å¼€æ—¶ï¼Œé¡¶çº§ç»´æŠ¤äººå‘˜å°†è¦æ±‚Linus从其å˜å‚¨åº“ä¸â€œæ‹‰å‡ºâ€ä»–们为åˆå¹¶é€‰æ‹© +当åˆå¹¶çª—壿‰“å¼€æ—¶ï¼Œé¡¶çº§ç»´æŠ¤äººå‘˜å°†è¦æ±‚Linus从å˜å‚¨åº“ä¸â€œæ‹‰å‡ºâ€ä»–们为åˆå¹¶é€‰æ‹© 的补ä¸ã€‚如果LinusåŒæ„ï¼Œè¡¥ä¸æµå°†æµå‘ä»–çš„å˜å‚¨åº“,æˆä¸ºä¸»çº¿å†…æ ¸çš„ä¸€éƒ¨åˆ†ã€‚ -Linus对拉æ“ä½œä¸æŽ¥æ”¶åˆ°çš„ç‰¹å®šè¡¥ä¸çš„关注程度å„ä¸ç›¸åŒã€‚很明显,有时他看起æ¥å¾ˆ -关注。但是,作为一般规则,Linus相信å系统维护人员ä¸ä¼šå‘上游å‘é€åè¡¥ä¸ã€‚ +Linus对拉å–ä¸æŽ¥æ”¶åˆ°çš„ç‰¹å®šè¡¥ä¸çš„关注程度å„ä¸ç›¸åŒã€‚很明显,有时他看起æ¥å¾ˆ +关注。但是一般æ¥è¯´ï¼ŒLinus相信å系统维护人员ä¸ä¼šå‘上游å‘é€åè¡¥ä¸ã€‚ å系统维护人员å过æ¥ä¹Ÿå¯ä»¥ä»Žå…¶ä»–维护人员那里获å–è¡¥ä¸ã€‚ä¾‹å¦‚ï¼Œç½‘ç»œæ ‘æ˜¯ç”±é¦–å…ˆ 在专用于网络设备驱动程åºã€æ— 线网络ç‰çš„æ ‘ä¸ç§¯ç´¯çš„è¡¥ä¸æž„建的。æ¤å˜å‚¨é“¾å¯ä»¥ @@ -195,26 +201,26 @@ Next æ ‘ åç³»ç»Ÿæ ‘é“¾å¼•å¯¼è¡¥ä¸æµåˆ°å†…æ ¸ï¼Œä½†å®ƒä¹Ÿæå‡ºäº†ä¸€ä¸ªæœ‰è¶£çš„问题:如果有人想查看为 下一个åˆå¹¶çª—å£å‡†å¤‡çš„æ‰€æœ‰è¡¥ä¸æ€Žä¹ˆåŠžï¼Ÿå¼€å‘人员将感兴趣的是,还有什么其他的 -更改有待解决,以查看是å¦å˜åœ¨éœ€è¦æ‹…心的冲çªï¼›ä¾‹å¦‚ï¼Œæ›´æ”¹æ ¸å¿ƒå†…æ ¸å‡½æ•°åŽŸåž‹çš„ +更改有待解决,以了解是å¦å˜åœ¨éœ€è¦æ‹…心的冲çªï¼›ä¾‹å¦‚ï¼Œæ›´æ”¹æ ¸å¿ƒå†…æ ¸å‡½æ•°åŽŸåž‹çš„ 修补程åºå°†ä¸Žä½¿ç”¨è¯¥å‡½æ•°æ—§å½¢å¼çš„任何其他修补程åºå†²çªã€‚审查人员和测试人员希望 -åœ¨æ‰€æœ‰è¿™äº›å˜æ›´åˆ°è¾¾ä¸»çº¿å†…æ ¸ä¹‹å‰ï¼Œèƒ½å¤Ÿè®¿é—®å®ƒä»¬çš„集æˆå½¢å¼ä¸çš„å˜æ›´ã€‚您å¯ä»¥ä»Žæ‰€æœ‰ -有趣的åç³»ç»Ÿæ ‘ä¸æå–æ›´æ”¹ï¼Œä½†è¿™å°†æ˜¯ä¸€é¡¹å¤§åž‹ä¸”容易出错的工作。 +åœ¨æ‰€æœ‰è¿™äº›å˜æ›´åˆ°è¾¾ä¸»çº¿å†…æ ¸ä¹‹å‰ï¼Œèƒ½å¤Ÿè®¿é—®å®ƒä»¬çš„集æˆå½¢å¼çš„å˜æ›´ã€‚您å¯ä»¥ä»Žæ‰€æœ‰ +相关的åç³»ç»Ÿæ ‘ä¸æå–æ›´æ”¹ï¼Œä½†è¿™å°†æ˜¯ä¸€é¡¹å¤æ‚且容易出错的工作。 -ç”æ¡ˆä»¥-nextæ ‘çš„å½¢å¼å‡ºçŽ°ï¼Œåœ¨è¿™é‡Œåç³»ç»Ÿæ ‘è¢«æ”¶é›†ä»¥ä¾›æµ‹è¯•å’Œå®¡æŸ¥ã€‚Andrew Morton -ç»´æŠ¤çš„è¿™äº›æ—§æ ‘è¢«ç§°ä¸ºâ€œ-mmâ€ï¼ˆç”¨äºŽå†…å˜ç®¡ç†ï¼Œè¿™å°±æ˜¯å®ƒçš„å¯åЍåå—)。-mm æ ‘é›†æˆäº† -一长串åç³»ç»Ÿæ ‘ä¸çš„è¡¥ä¸ï¼›å®ƒè¿˜åŒ…å«ä¸€äº›æ—¨åœ¨å¸®åŠ©è°ƒè¯•çš„è¡¥ä¸ã€‚ +解决方案以-nextæ ‘çš„å½¢å¼å‡ºçŽ°ï¼Œåœ¨è¿™é‡Œåç³»ç»Ÿæ ‘è¢«æ”¶é›†ä»¥ä¾›æµ‹è¯•å’Œå®¡æŸ¥ã€‚è¿™äº›æ ‘ä¸ +ç”±Andrew Morton维护的较è€çš„一个,被称为“-mmâ€ï¼ˆç”¨äºŽå†…å˜ç®¡ç†ï¼Œåˆ›å»ºæ—¶ä¸ºæ¤ï¼‰ã€‚ +-mm æ ‘é›†æˆäº†ä¸€é•¿ä¸²åç³»ç»Ÿæ ‘ä¸çš„è¡¥ä¸ï¼›å®ƒè¿˜åŒ…å«ä¸€äº›æ—¨åœ¨å¸®åŠ©è°ƒè¯•çš„è¡¥ä¸ã€‚ 除æ¤ä¹‹å¤–,-mm 还包å«å¤§é‡ç”±Andrew直接选择的补ä¸ã€‚这些补ä¸å¯èƒ½å·²ç»å‘布在邮件 -列表上,或者它们å¯èƒ½åº”ç”¨äºŽå†…æ ¸ä¸æ²¡æœ‰æŒ‡å®šåç³»ç»Ÿæ ‘çš„éƒ¨åˆ†ã€‚ç»“æžœï¼Œ-mm ä½œä¸ºä¸€ç§ -æœ€åŽæ‰‹æ®µçš„åç³»ç»Ÿæ ‘è¿è¡Œï¼›å¦‚果没有其他明显的路径å¯ä»¥è®©è¡¥ä¸è¿›å…¥ä¸»çº¿ï¼Œé‚£ä¹ˆå®ƒå¾ˆ -å¯èƒ½ä»¥-mm 结æŸã€‚累积在-mm ä¸çš„å„ç§è¡¥ä¸æœ€ç»ˆå°†è¢«è½¬å‘到适当的åç³»ç»Ÿæ ‘ï¼Œæˆ–è€…ç›´æŽ¥ +列表上,或者它们å¯èƒ½åº”ç”¨äºŽå†…æ ¸ä¸æœªæŒ‡å®šåç³»ç»Ÿæ ‘çš„éƒ¨åˆ†ã€‚åŒæ—¶ï¼Œ-mm ä½œä¸ºæœ€åŽ +手段的åç³»ç»Ÿæ ‘ï¼›å¦‚æžœæ²¡æœ‰å…¶ä»–æ˜Žæ˜¾çš„è·¯å¾„å¯ä»¥è®©è¡¥ä¸è¿›å…¥ä¸»çº¿ï¼Œé‚£ä¹ˆå®ƒå¾ˆå¯èƒ½æœ€ +终选择-mm æ ‘ã€‚ç´¯ç§¯åœ¨-mm ä¸çš„å„ç§è¡¥ä¸æœ€ç»ˆå°†è¢«è½¬å‘到适当的åç³»ç»Ÿæ ‘ï¼Œæˆ–è€…ç›´æŽ¥ å‘é€åˆ°Linus。在典型的开å‘周期ä¸ï¼Œå¤§çº¦5-10%的补ä¸é€šè¿‡-mm 进入主线。 -当å‰-mm è¡¥ä¸å¯åœ¨â€œmmotmâ€ï¼ˆ-mm of the momentï¼‰ç›®å½•ä¸æ‰¾åˆ°ï¼Œåœ°å€ï¼š +当å‰-mm è¡¥ä¸å¯åœ¨â€œmmotmâ€ï¼ˆ-mm of the momentï¼‰ç›®å½•ä¸æ‰¾åˆ°ï¼š https://www.ozlabs.org/~akpm/mmotm/ -然而,使用mmotmæ ‘å¯èƒ½æ˜¯ä¸€ç§ä»¤äººæ²®ä¸§çš„体验;它甚至å¯èƒ½æ— 法编译。 +然而,使用MMOTMæ ‘å¯èƒ½ä¼šå分令人头疼;它甚至å¯èƒ½æ— 法编译。 下一个周期补ä¸åˆå¹¶çš„ä¸»è¦æ ‘是linux-next,由Stephen Rothwell ç»´æŠ¤ã€‚æ ¹æ®è®¾è®¡ linux-next 是下一个åˆå¹¶çª—å£å…³é—åŽä¸»çº¿çš„快照。linux-nextæ ‘åœ¨Linux-kernel å’Œ @@ -228,49 +234,48 @@ Linux-next å·²ç»æˆä¸ºå†…æ ¸å¼€å‘过程ä¸ä¸å¯æˆ–缺的一部分;在一个 Staging æ ‘ ---------- -å†…æ ¸æºä»£ç æ ‘åŒ…å«drivers/staging/directoryï¼Œå…¶ä¸æœ‰è®¸å¤šé©±åŠ¨ç¨‹åºæˆ–文件系统的 -å目录æ£åœ¨è¢«æ·»åŠ åˆ°å†…æ ¸æ ‘ä¸ã€‚å®ƒä»¬ç„¶éœ€è¦æ›´å¤šçš„工作的时候å¯ä»¥ä¿ç•™åœ¨ -driver/staging目录ä¸ï¼›ä¸€æ—¦å®Œæˆï¼Œå°±å¯ä»¥å°†å®ƒä»¬ç§»åˆ°å†…æ ¸ä¸ã€‚这是一ç§è·Ÿè¸ªä¸ç¬¦åˆ -Linuxå†…æ ¸ç¼–ç æˆ–è´¨é‡æ ‡å‡†çš„驱动程åºçš„æ–¹æ³•,但人们å¯èƒ½å¸Œæœ›ä½¿ç”¨å®ƒä»¬å¹¶è·Ÿè¸ªå¼€å‘。 +å†…æ ¸æºä»£ç æ ‘åŒ…å«drivers/staging/ç›®å½•ï¼Œå…¶ä¸æœ‰è®¸å¤šé©±åŠ¨ç¨‹åºæˆ–文件系统的å目录 +æ£åœ¨è¢«æ·»åŠ åˆ°å†…æ ¸æ ‘ä¸ã€‚它们在ä»ç„¶éœ€è¦æ›´å¤šçš„ä¿®æ£çš„æ—¶å€™å¯ä»¥ä¿ç•™åœ¨driver/staging/ +目录ä¸ï¼›ä¸€æ—¦å®Œæˆï¼Œå°±å¯ä»¥å°†å®ƒä»¬ç§»åˆ°å†…æ ¸ä¸ã€‚这是一ç§è·Ÿè¸ªä¸ç¬¦åˆLinuxå†…æ ¸ç¼–ç æˆ– +è´¨é‡æ ‡å‡†çš„驱动程åºçš„æ–¹æ³•,人们å¯èƒ½å¸Œæœ›ä½¿ç”¨å®ƒä»¬å¹¶è·Ÿè¸ªå¼€å‘。 -Greg Kroah Hartman ç›®å‰è´Ÿè´£ç»´æŠ¤staging æ ‘ã€‚ä»éœ€è¦å·¥ä½œçš„驱动程åºå°†å‘é€ç»™ä»–, +Greg Kroah Hartman ç›®å‰è´Ÿè´£ç»´æŠ¤staging æ ‘ã€‚ä»éœ€è¦ä¿®æ£çš„驱动程åºå°†å‘é€ç»™ä»–, æ¯ä¸ªé©±åŠ¨ç¨‹åºåœ¨drivers/staging/ä¸éƒ½æœ‰è‡ªå·±çš„åç›®å½•ã€‚é™¤äº†é©±åŠ¨ç¨‹åºæºæ–‡ä»¶ä¹‹å¤–, -目录ä¸è¿˜åº”该有一个TODO文件。todo文件列出了驱动程åºéœ€è¦æŽ¥å—的挂起的工作, +目录ä¸è¿˜åº”该有一个TODO文件。TODO文件列出了驱动程åºéœ€è¦æŽ¥å—的暂åœçš„工作, 以åŠé©±åŠ¨ç¨‹åºçš„任何补ä¸éƒ½åº”该抄é€çš„人员列表。当å‰çš„è§„åˆ™è¦æ±‚,staging的驱动 程åºå¿…须至少æ£ç¡®ç¼–译。 -Staging 是一ç§ç›¸å¯¹å®¹æ˜“的方法,å¯ä»¥è®©æ–°çš„驱动程åºè¿›å…¥ä¸»çº¿ï¼Œå¹¸è¿çš„æ˜¯ï¼Œä»–们会 -引起其他开å‘人员的注æ„,并迅速改进。然而,进入staging并䏿˜¯æ•…事的结尾; -staging䏿²¡æœ‰çœ‹åˆ°å¸¸è§„è¿›å±•çš„ä»£ç æœ€ç»ˆå°†è¢«åˆ 除。ç»é”€å•†ä¹Ÿå€¾å‘äºŽç›¸å¯¹ä¸æ„¿æ„使用 -staging驱动程åºã€‚å› æ¤ï¼Œåœ¨æˆä¸ºä¸€ååˆé€‚的主线驱动的路上,staging å……å…¶é‡åªæ˜¯ -一个åœç•™ã€‚ +Staging 是一ç§è®©æ–°çš„驱动程åºè¿›å…¥ä¸»çº¿çš„相对容易的方法,它们会幸è¿åœ°å¼•èµ·å…¶ä»– +å¼€å‘人员的注æ„,并迅速改进。然而,进入staging并䏿˜¯æ•…事的结尾;stagingä¸ +æ²¡æœ‰çœ‹åˆ°å¸¸è§„è¿›å±•çš„ä»£ç æœ€ç»ˆå°†è¢«åˆ 除。ç»é”€å•†ä¹Ÿå€¾å‘äºŽç›¸å¯¹ä¸æ„¿æ„使用staging驱动 +程åºã€‚å› æ¤ï¼Œåœ¨æˆä¸ºä¸€ä¸ªåˆé€‚的主线驱动的路上,staging 仅是一个ä¸è½¬ç«™ã€‚ 工具 ---- 从上é¢çš„æ–‡æœ¬å¯ä»¥çœ‹å‡ºï¼Œå†…æ ¸å¼€å‘过程在很大程度上ä¾èµ–于在ä¸åŒæ–¹å‘上èšé›†è¡¥ä¸çš„ èƒ½åŠ›ã€‚å¦‚æžœæ²¡æœ‰é€‚å½“å¼ºå¤§çš„å·¥å…·ï¼Œæ•´ä¸ªç³»ç»Ÿå°†æ— æ³•åœ¨ä»»ä½•åœ°æ–¹æ£å¸¸å·¥ä½œã€‚关于如何使用 -这些工具的教程远远超出了本文档的范围,但是还是有一些指å—的空间。 +这些工具的教程远远超出了本文档的范围,但还是用一点篇幅介ç»ä¸€äº›å…³é”®ç‚¹ã€‚ 到目å‰ä¸ºæ¢ï¼Œå†…æ ¸ç¤¾åŒºä½¿ç”¨çš„ä¸»è¦æºä»£ç 管ç†ç³»ç»Ÿæ˜¯git。Git是在自由软件社区ä¸å¼€å‘ 的许多分布å¼ç‰ˆæœ¬æŽ§åˆ¶ç³»ç»Ÿä¹‹ä¸€ã€‚它éžå¸¸é€‚åˆå†…æ ¸å¼€å‘ï¼Œå› ä¸ºå®ƒåœ¨å¤„ç†å¤§åž‹å˜å‚¨åº“å’Œ -大é‡è¡¥ä¸æ—¶æ€§èƒ½éžå¸¸å¥½ã€‚它还有一个难以å¦ä¹ 和使用的å声,尽管éšç€æ—¶é—´çš„æŽ¨ç§»å®ƒ -å˜å¾—æ›´å¥½äº†ã€‚å¯¹äºŽå†…æ ¸å¼€å‘人员æ¥è¯´ï¼Œå¯¹Gitçš„æŸç§ç†Ÿæ‚‰å‡ 乎是一ç§è¦æ±‚ï¼›å³ä½¿ä»–ä»¬ä¸ -将它用于自己的工作,他们也需è¦Gitæ¥è·Ÿä¸Šå…¶ä»–å¼€å‘人员(以åŠä¸»çº¿ï¼‰æ£åœ¨åšçš„事情。 +大é‡è¡¥ä¸æ—¶æ€§èƒ½éžå¸¸å¥½ã€‚它也以难以å¦ä¹ 和使用而著称,尽管éšç€æ—¶é—´çš„æŽ¨ç§»å®ƒå˜å¾— +æ›´å¥½äº†ã€‚å¯¹äºŽå†…æ ¸å¼€å‘人员æ¥è¯´ï¼Œå¯¹Gitçš„æŸç§ç†Ÿæ‚‰å‡ 乎是一ç§è¦æ±‚ï¼›å³ä½¿ä»–们ä¸å°†å®ƒ +用于自己的工作,他们也需è¦Gitæ¥è·Ÿä¸Šå…¶ä»–å¼€å‘人员(以åŠä¸»çº¿ï¼‰æ£åœ¨åšçš„事情。 -çŽ°åœ¨å‡ ä¹Žæ‰€æœ‰çš„Linuxå‘行版都打包了Git。主页ä½äºŽï¼š +çŽ°åœ¨å‡ ä¹Žæ‰€æœ‰çš„Linuxå‘行版都打包了Git。Git主页ä½äºŽï¼š https://git-scm.com/ -é‚£ä¸ªé¡µé¢æœ‰æŒ‡å‘文档和教程的指针。 +æ¤é¡µé¢åŒ…å«äº†æ–‡æ¡£å’Œæ•™ç¨‹çš„链接。 -在ä¸ä½¿ç”¨gitçš„å†…æ ¸å¼€å‘人员ä¸ï¼Œæœ€æµè¡Œçš„é€‰æ‹©å‡ ä¹Žè‚¯å®šæ˜¯mercurial: +在ä¸ä½¿ç”¨gitçš„å†…æ ¸å¼€å‘人员ä¸ï¼Œæœ€æµè¡Œçš„é€‰æ‹©å‡ ä¹Žè‚¯å®šæ˜¯Mercurial: http://www.seleric.com/mercurial/ Mercurial与Git共享许多特性,但它æä¾›äº†ä¸€ä¸ªç•Œé¢ï¼Œè®¸å¤šäººè§‰å¾—它更易于使用。 -å¦ä¸€ä¸ªå€¼å¾—了解的工具是quilt: +å¦ä¸€ä¸ªå€¼å¾—了解的工具是Quilt: https://savannah.nongnu.org/projects/quilt @@ -282,79 +287,79 @@ Quilt 是一个补ä¸ç®¡ç†ç³»ç»Ÿï¼Œè€Œä¸æ˜¯æºä»£ç 管ç†ç³»ç»Ÿã€‚它ä¸ä¼š 邮件列表 -------- -大é‡çš„Linuxå†…æ ¸å¼€å‘工作是通过邮件列表完æˆçš„。如果ä¸åœ¨æŸä¸ªåœ°æ–¹åŠ å…¥è‡³å°‘ä¸€ä¸ªåˆ—è¡¨ï¼Œ -就很难æˆä¸ºç¤¾åŒºä¸ä¸€ä¸ªåŠŸèƒ½å®Œå¤‡çš„æˆå‘˜ã€‚但是,Linux邮件列表对开å‘人员æ¥è¯´ä¹Ÿæ˜¯ä¸€ä¸ª -潜在的å±é™©ï¼Œä»–们å¯èƒ½ä¼šè¢«ä¸€å †ç”µå邮件淹没,è¿åLinux列表上使用的约定,或者 -两者兼而有之。 +大é‡çš„Linuxå†…æ ¸å¼€å‘工作是通过邮件列表完æˆçš„。如果ä¸åŠ å…¥è‡³å°‘ä¸€ä¸ªæŸä¸ªåˆ—表, +就很难æˆä¸ºç¤¾åŒºä¸çš„ä¸€ä¸ªâ€œå…¨åŠŸèƒ½â€æˆå‘˜ã€‚但是,Linux邮件列表对开å‘人员æ¥è¯´ä¹Ÿæ˜¯ +一个潜在的å±é™©ï¼Œä»–们å¯èƒ½ä¼šè¢«ä¸€å †ç”µå邮件淹没ã€è¿åLinux列表上使用的约定, +或者两者兼而有之。 å¤§å¤šæ•°å†…æ ¸é‚®ä»¶åˆ—è¡¨éƒ½åœ¨vger.kernel.org上è¿è¡Œï¼›ä¸»åˆ—表ä½äºŽï¼š http://vger.kernel.org/vger-lists.html -ä¸è¿‡ï¼Œä¹Ÿæœ‰ä¸€äº›åˆ—表托管在别处;其ä¸ä¸€äº›åˆ—表ä½äºŽlists.redhat.com。 +ä¸è¿‡ï¼Œä¹Ÿæœ‰ä¸€äº›åˆ—表托管在别处;其ä¸ä¸€äº›åˆ—表ä½äºŽ +redhat.com/mailman/listinfo。 -å½“ç„¶ï¼Œå†…æ ¸å¼€å‘çš„æ ¸å¿ƒé‚®ä»¶åˆ—è¡¨æ˜¯linux-kernel。这个å啿˜¯ä¸€ä¸ªä»¤äººç”Ÿç•的地方; -æ¯å¤©çš„ä¿¡æ¯é‡å¯ä»¥è¾¾åˆ°500æ¡ï¼Œå™ªéŸ³å¾ˆé«˜ï¼Œè°ˆè¯æŠ€æœ¯æ€§å¾ˆå¼ºï¼Œå‚ä¸Žè€…å¹¶ä¸æ€»æ˜¯è¡¨çŽ°å‡º +å½“ç„¶ï¼Œå†…æ ¸å¼€å‘çš„æ ¸å¿ƒé‚®ä»¶åˆ—è¡¨æ˜¯linux-kernel。这个列表是一个令人生ç•的地方: +æ¯å¤©çš„ä¿¡æ¯é‡å¯ä»¥è¾¾åˆ°500æ¡ï¼Œå™ªéŸ³å¾ˆé«˜ï¼Œè°ˆè¯æŠ€æœ¯æ€§å¾ˆå¼ºï¼Œä¸”å‚ä¸Žè€…å¹¶ä¸æ€»æ˜¯è¡¨çŽ°å‡º 高度的礼貌。但是,没有其他地方å¯ä»¥è®©å†…æ ¸å¼€å‘社区作为一个整体èšé›†åœ¨ä¸€èµ·ï¼› -é¿å…使用æ¤åˆ—表的开å‘人员将错过é‡è¦ä¿¡æ¯ã€‚ +ä¸ä½¿ç”¨æ¤åˆ—表的开å‘人员将错过é‡è¦ä¿¡æ¯ã€‚ -有一些æç¤ºå¯ä»¥å¸®åŠ©åœ¨linux-kernel生å˜ï¼š +以下一些æç¤ºå¯ä»¥å¸®åŠ©åœ¨linux-kernel生å˜ï¼š -- 将邮件转移到å•ç‹¬çš„æ–‡ä»¶å¤¹ï¼Œè€Œä¸æ˜¯ä¸»é‚®ç®±ã€‚我们必须能够æŒç»åœ°å¿½ç•¥æ´ªæµã€‚ +- 将邮件转移到å•ç‹¬çš„æ–‡ä»¶å¤¹ï¼Œè€Œä¸æ˜¯ä¸»é‚®ç®±æ–‡ä»¶å¤¹ã€‚我们必须能够æŒç»åœ°å¿½ç•¥æ´ªæµã€‚ -- ä¸è¦è¯•图跟踪æ¯ä¸€æ¬¡è°ˆè¯-其他人都ä¸ä¼šã€‚é‡è¦çš„æ˜¯è¦å¯¹æ„Ÿå…´è¶£çš„主题(尽管请 - 注æ„,长时间的对è¯å¯ä»¥åœ¨ä¸æ›´æ”¹ç”µå邮件主题行的情况下å离原始主题)和å‚与 - 的人进行ç›é€‰ã€‚ +- ä¸è¦è¯•图跟上æ¯ä¸€æ¬¡è°ˆè¯â€”â€”æ²¡äººä¼šè¿™æ ·ã€‚é‡è¦çš„æ˜¯è¦ç›é€‰æ„Ÿå…´è¶£çš„ä¸»é¢˜ï¼ˆä½†è¯·æ³¨æ„ + 长时间的对è¯å¯èƒ½ä¼šå离原æ¥çš„主题,尽管未改å˜ç”µå邮件的主题)和å‚与的人。 -- ä¸è¦æŒ‘事。如果有人试图激起愤怒的å应,忽略他们。 +- ä¸è¦å›žå¤æŒ‘事的人。如果有人试图激起愤怒,请忽略他们。 -- 当å“应Linuxå†…æ ¸ç”µå邮件(或其他列表上的电å邮件)时,请为所有相关人员ä¿ç•™ - cc:header。如果没有强有力的ç†ç”±ï¼ˆå¦‚明确的请求),则ä¸åº”åˆ é™¤æ”¶ä»¶äººã€‚ä¸€å®šè¦ - ç¡®ä¿ä½ è¦å›žå¤çš„人在cc:listä¸ã€‚è¿™ä¸ªæƒ¯ä¾‹ä¹Ÿä½¿ä½ ä¸å¿…在回å¤é‚®ä»¶æ—¶æ˜Žç¡®è¦æ±‚被抄é€ã€‚ +- 当回å¤Linuxå†…æ ¸ç”µå邮件(或其他列表上的电å邮件)时,请为所有相关人员ä¿ç•™ + Cc: 抄é€å¤´ã€‚如果没有确实的ç†ç”±ï¼ˆå¦‚明确的请求),则ä¸åº”åˆ é™¤æ”¶ä»¶äººã€‚ä¸€å®šè¦ + ç¡®ä¿ä½ è¦å›žå¤çš„人在抄é€åˆ—表ä¸ã€‚è¿™ä¸ªæƒ¯ä¾‹ä¹Ÿä½¿ä½ ä¸å¿…在回å¤é‚®ä»¶æ—¶æ˜Žç¡®è¦æ±‚被抄é€ã€‚ -- 在æå‡ºé—®é¢˜ä¹‹å‰ï¼Œæœç´¢åˆ—表档案(和整个网络)。有些开å‘人员å¯èƒ½ä¼šå¯¹é‚£äº›æ˜¾ç„¶ +- 在æå‡ºé—®é¢˜ä¹‹å‰ï¼Œæœç´¢åˆ—è¡¨å˜æ¡£ï¼ˆå’Œæ•´ä¸ªç½‘络)。有些开å‘人员å¯èƒ½ä¼šå¯¹é‚£äº›æ˜¾ç„¶ 没有完æˆå®¶åºä½œä¸šçš„人感到ä¸è€çƒ¦ã€‚ -- é¿å…è´´é¡¶å¸–ï¼ˆæŠŠä½ çš„ç”æ¡ˆæ”¾åœ¨ä½ è¦å›žå¤çš„引文上é¢çš„åšæ³•ï¼‰ã€‚è¿™ä¼šè®©ä½ çš„å›žç”æ›´éš¾ +- é¿å…顶部回å¤ï¼ˆæŠŠä½ çš„ç”æ¡ˆæ”¾åœ¨ä½ è¦å›žå¤çš„引文上é¢çš„åšæ³•ï¼‰ã€‚è¿™ä¼šè®©ä½ çš„å›žç”æ›´éš¾ ç†è§£ï¼Œå°è±¡ä¹Ÿå¾ˆå·®ã€‚ -- 询问æ£ç¡®çš„邮件列表。linux-kernel å¯èƒ½æ˜¯é€šç”¨çš„è®¨è®ºç‚¹ï¼Œä½†å®ƒä¸æ˜¯ä»Žæ‰€æœ‰å系统 - ä¸å¯»æ‰¾å¼€å‘人员的最佳场所。 +- 在æ£ç¡®çš„邮件列表å‘问。linux-kernel å¯èƒ½æ˜¯é€šç”¨çš„è®¨è®ºåœºæ‰€ï¼Œä½†å®ƒä¸æ˜¯å¯»æ‰¾æ‰€æœ‰ + å系统开å‘人员的最佳场所。 -最åŽä¸€ç‚¹â€”—找到æ£ç¡®çš„邮件列表——是开å‘人员出错的常è§åœ°æ–¹ã€‚在Linuxå†…æ ¸ä¸Šæå‡ºä¸Ž -ç½‘ç»œç›¸å…³çš„é—®é¢˜çš„äººå‡ ä¹Žè‚¯å®šä¼šæ”¶åˆ°ä¸€ä¸ªç¤¼è²Œçš„å»ºè®®ï¼Œè½¬è€Œåœ¨netdev列表上æå‡ºï¼Œ -å› ä¸ºè¿™æ˜¯å¤§å¤šæ•°ç½‘ç»œå¼€å‘人员ç»å¸¸å‡ºçŽ°çš„åˆ—è¡¨ã€‚è¿˜æœ‰å…¶ä»–åˆ—è¡¨å¯ç”¨äºŽscsi〠-video4linuxã€ideã€filesystemç‰å系统。查找邮件列表的最佳ä½ç½®æ˜¯ä¸Žå†…æ ¸æºä»£ç -一起打包的MAINTAINERS文件。 +最åŽä¸€ç‚¹â€”—找到æ£ç¡®çš„邮件列表——是开å‘人员常出错的地方。在linux-kernel上 +æå‡ºä¸Žç½‘ç»œç›¸å…³çš„é—®é¢˜çš„äººå‡ ä¹Žè‚¯å®šä¼šæ”¶åˆ°ä¸€ä¸ªç¤¼è²Œçš„å»ºè®®ï¼Œè½¬åˆ°netdev列表上æå‡ºï¼Œ +å› ä¸ºè¿™æ˜¯å¤§å¤šæ•°ç½‘ç»œå¼€å‘人员ç»å¸¸å‡ºçŽ°çš„åˆ—è¡¨ã€‚è¿˜æœ‰å…¶ä»–åˆ—è¡¨å¯ç”¨äºŽscsiã€video4linux〠+ideã€filesystemç‰å系统。查找邮件列表的最佳ä½ç½®æ˜¯ä¸Žå†…æ ¸æºä»£ç 一起打包的 +MAINTAINERS文件。 å¼€å§‹å†…æ ¸å¼€å‘ ------------ -å…³äºŽå¦‚ä½•å¼€å§‹å†…æ ¸å¼€å‘过程的问题很常è§â€”—æ¥è‡ªä¸ªäººå’Œå…¬å¸ã€‚åŒæ ·å¸¸è§çš„æ˜¯é”™è¯¯ï¼Œè¿™ -使得关系的开始比必须的更困难。 +å…³äºŽå¦‚ä½•å¼€å§‹å†…æ ¸å¼€å‘过程的问题很常è§â€”—个人和公å¸çš†ç„¶ã€‚åŒæ ·å¸¸è§çš„æ˜¯å¤±è¯¯ï¼Œè¿™ +使得关系的开始比本应的更困难。 å…¬å¸é€šå¸¸å¸Œæœ›è˜è¯·çŸ¥å的开å‘人员æ¥å¯åЍ开å‘å›¢é˜Ÿã€‚å®žé™…ä¸Šï¼Œè¿™æ˜¯ä¸€ç§æœ‰æ•ˆçš„æŠ€æœ¯ã€‚ -但它也往往是昂贵的,而且没有增长ç»éªŒä¸°å¯Œçš„å†…æ ¸å¼€å‘人员储备。考虑到时间的 -投入,å¯ä»¥è®©å†…部开å‘äººå‘˜åŠ å¿«Linuxå†…æ ¸çš„å¼€å‘速度。花这个时间å¯ä»¥è®©é›‡ä¸»æ‹¥æœ‰ -ä¸€æ‰¹äº†è§£å†…æ ¸å’Œå…¬å¸çš„å¼€å‘人员,他们也å¯ä»¥å¸®åŠ©åŸ¹è®å…¶ä»–äººã€‚ä»Žä¸æœŸæ¥çœ‹ï¼Œè¿™å¾€å¾€ -是更有利å¯å›¾çš„æ–¹æ³•。 +ä½†å®ƒä¹Ÿå¾€å¾€æ˜¯æ˜‚è´µçš„ï¼Œè€Œä¸”å¯¹å¢žåŠ æœ‰ç»éªŒçš„å†…æ ¸å¼€å‘äººå‘˜çš„æ•°é‡æ²¡æœ‰å¤šå¤§å¸®åŠ©ã€‚è€ƒ +虑到时间投入,å¯ä»¥è®©å†…部开å‘äººå‘˜åŠ å¿«Linuxå†…æ ¸çš„å¼€å‘速度。利用这段时间å¯ä»¥ +è®©é›‡ä¸»æ‹¥æœ‰ä¸€æ‰¹æ—¢äº†è§£å†…æ ¸åˆäº†è§£å…¬å¸çš„å¼€å‘人员,还å¯ä»¥å¸®åŠ©åŸ¹è®å…¶ä»–äººã€‚ä»Žä¸æœŸ +æ¥çœ‹ï¼Œè¿™é€šå¸¸æ˜¯æ›´æœ‰åˆ©å¯å›¾çš„æ–¹æ³•。 å¯ä»¥ç†è§£çš„æ˜¯ï¼Œå•个开å‘äººå‘˜å¾€å¾€å¯¹èµ·æ¥æ„Ÿåˆ°èŒ«ç„¶ã€‚从一个大型项目开始å¯èƒ½ä¼šå¾ˆ -å“人;人们往往想先用一些较å°çš„ä¸œè¥¿æ¥æµ‹è¯•水域。这是一些开å‘人员开始创建修补 -拼写错误或轻微编ç é£Žæ ¼é—®é¢˜çš„è¡¥ä¸çš„地方。ä¸å¹¸çš„æ˜¯ï¼Œè¿™æ ·çš„è¡¥ä¸ä¼šäº§ç”Ÿä¸€å®šç¨‹åº¦ -的噪音,这会分散整个开å‘社区的注æ„åŠ›ï¼Œå› æ¤ï¼Œè¶Šæ¥è¶Šå¤šçš„人看ä¸èµ·å®ƒä»¬ã€‚å¸Œæœ›å‘ -社区介ç»è‡ªå·±çš„æ–°å¼€å‘äººå‘˜å°†æ— æ³•é€šè¿‡è¿™äº›æ–¹å¼èŽ·å¾—ä»–ä»¬æƒ³è¦çš„é‚£ç§æŽ¥å¾…ã€‚ +å“人;人们往往想先用一些较å°çš„东西æ¥è¯•试水。由æ¤ï¼Œä¸€äº›å¼€å‘人员开始创建修补 +拼写错误或轻微编ç é£Žæ ¼é—®é¢˜çš„è¡¥ä¸ã€‚ä¸å¹¸çš„æ˜¯ï¼Œè¿™æ ·çš„è¡¥ä¸ä¼šäº§ç”Ÿä¸€å®šç¨‹åº¦çš„噪音, +这会分散整个开å‘社区的注æ„åŠ›ï¼Œå› æ¤ï¼Œå®ƒä»¬è¶Šæ¥è¶Šè¢«äººä¸çœ‹é‡ã€‚希望å‘ç¤¾åŒºä»‹ç» +自己的新开å‘äººå‘˜å°†æ— æ³•é€šè¿‡è¿™äº›æ–¹å¼èŽ·å¾—ä»–ä»¬æœŸå¾…çš„åå“。 -Andrew Morton ä¸ºæœ‰æŠ±è´Ÿçš„å†…æ ¸å¼€å‘人员æä¾›äº†è¿™ä¸ªå»ºè®® +Andrew Morton ä¸ºæœ‰æŠ±è´Ÿçš„å†…æ ¸å¼€å‘人员æä¾›äº†å¦‚下建议 :: - æ‰€æœ‰å†…æ ¸åˆå¦è€…çš„No.1项目肯定是“确ä¿å†…æ ¸åœ¨æ‰€æœ‰çš„æœºå™¨ä¸Šï¼Œä½ å¯ä»¥è§¦æ‘¸ - 到的,始终è¿è¡Œè‰¯å¥½" é€šå¸¸è¿™æ ·åšçš„æ–¹æ³•是与其他人一起解决问题(这 - å¯èƒ½éœ€è¦åšæŒï¼ï¼‰ä½†è¿™å¾ˆå¥½â€”â€”è¿™æ˜¯å†…æ ¸å¼€å‘的一部分 + æ‰€æœ‰å†…æ ¸å¼€å‘者的第一个项目肯定应该是“确ä¿å†…æ ¸åœ¨æ‚¨å¯ä»¥æ“作的所有 + 机器上始终完美è¿è¡Œâ€ã€‚通常的方法是和其他人一起解决问题(这å¯èƒ½éœ€ + è¦åšæŒï¼ï¼‰ï¼Œä½†å°±æ˜¯å¦‚æ¤â€”â€”è¿™æ˜¯å†…æ ¸å¼€å‘的一部分。 (http://lwn.net/articles/283982/) -在没有明显问题需è¦è§£å†³çš„æƒ…况下,建议开å‘人员查看当å‰çš„回归和开放å¼é”™è¯¯åˆ—表. -解决需è¦ä¿®å¤çš„问题没有任何缺点;通过解决这些问题,开å‘人员将获得处ç†è¿‡ç¨‹çš„ -ç»éªŒï¼ŒåŒæ—¶ä¸Žå¼€å‘社区的其他人建立尊é‡ã€‚ +在没有明显问题需è¦è§£å†³çš„æƒ…况下,通常建议开å‘人员查看当å‰çš„回归和开放缺陷 +列表。从æ¥éƒ½ä¸ç¼ºå°‘需è¦è§£å†³çš„问题;通过解决这些问题,开å‘人员将从该过程获得 +ç»éªŒï¼ŒåŒæ—¶ä¸Žå¼€å‘社区的其他æˆå‘˜å»ºç«‹ç›¸äº’å°Šé‡ã€‚ diff --git a/Documentation/translations/zh_CN/process/3.Early-stage.rst b/Documentation/translations/zh_CN/process/3.Early-stage.rst index b8676aec60050b4dea792c36130b5cf4a171637d..de53dd12e91183d700b4a3c752af05e73134444a 100644 --- a/Documentation/translations/zh_CN/process/3.Early-stage.rst +++ b/Documentation/translations/zh_CN/process/3.Early-stage.rst @@ -1,7 +1,14 @@ .. include:: ../disclaimer-zh_CN.rst :Original: :ref:`Documentation/process/3.Early-stage.rst <development_early_stage>` -:Translator: Alex Shi <alex.shi@linux.alibaba.com> + +:Translator: + + 时奎亮 Alex Shi <alex.shi@linux.alibaba.com> + +:æ ¡è¯‘: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> .. _cn_development_early_stage: @@ -9,45 +16,45 @@ ======== 当考虑一个Linuxå†…æ ¸å¼€å‘项目时,很å¯èƒ½ä¼šç›´æŽ¥è·³è¿›åŽ»å¼€å§‹ç¼–ç 。然而,与任何é‡è¦ -çš„é¡¹ç›®ä¸€æ ·ï¼ŒæˆåŠŸçš„è®¸å¤šåŸºç¡€æœ€å¥½æ˜¯åœ¨ç¬¬ä¸€è¡Œä»£ç 编写之å‰å°±åšå¥½äº†ã€‚在早期计划和 -沟通ä¸èŠ±è´¹ä¸€äº›æ—¶é—´å¯ä»¥èŠ‚çœæ›´å¤šçš„æ—¶é—´ã€‚ +çš„é¡¹ç›®ä¸€æ ·ï¼Œè®¸å¤šæˆåŠŸçš„åŸºç¡€æœ€å¥½æ˜¯åœ¨ç¬¬ä¸€è¡Œä»£ç 编写之å‰å°±æ‰“下。在早期计划和 +沟通ä¸èŠ±è´¹ä¸€äº›æ—¶é—´å¯ä»¥åœ¨ä¹‹åŽèŠ‚çœæ›´å¤šçš„æ—¶é—´ã€‚ -详述问题 +æžæ¸…问题 -------- -ä¸Žä»»ä½•å·¥ç¨‹é¡¹ç›®ä¸€æ ·ï¼ŒæˆåŠŸçš„å†…æ ¸å¢žå¼ºä»Žè¦è§£å†³çš„问题的清晰æè¿°å¼€å§‹ã€‚在æŸäº›æƒ…况 -下,这个æ¥éª¤å¾ˆå®¹æ˜“:例如,当æŸä¸ªç‰¹å®šç¡¬ä»¶éœ€è¦é©±åŠ¨ç¨‹åºæ—¶ã€‚ä¸è¿‡ï¼Œåœ¨å…¶ä»–æ–¹é¢ï¼Œ -将实际问题与建议的解决方案混淆是很有诱惑力的,这å¯èƒ½ä¼šå¯¼è‡´å›°éš¾ã€‚ +ä¸Žä»»ä½•å·¥ç¨‹é¡¹ç›®ä¸€æ ·ï¼ŒæˆåŠŸçš„å†…æ ¸æ”¹å–„ä»Žæ¸…æ™°æè¿°è¦è§£å†³çš„问题开始。在æŸäº›æƒ…况 +下,这个æ¥éª¤å¾ˆå®¹æ˜“:例如当æŸä¸ªç‰¹å®šç¡¬ä»¶éœ€è¦é©±åŠ¨ç¨‹åºæ—¶ã€‚ä¸è¿‡ï¼Œåœ¨å…¶ä»–情况下, +很容易将实际问题与建议的解决方案混在一起,这å¯èƒ½ä¼šå¯¼è‡´éº»çƒ¦ã€‚ -举个例åï¼šå‡ å¹´å‰ï¼Œä½¿ç”¨Linux音频的开å‘äººå‘˜å¯»æ±‚ä¸€ç§æ–¹æ³•æ¥è¿è¡Œåº”用程åºï¼Œè€Œä¸å› -ç³»ç»Ÿå»¶è¿Ÿè¿‡å¤§è€Œå¯¼è‡´é€€å‡ºæˆ–å…¶ä»–å·¥ä»¶ã€‚ä»–ä»¬å¾—åˆ°çš„è§£å†³æ–¹æ¡ˆæ˜¯ä¸€ä¸ªå†…æ ¸æ¨¡å—,旨在连 -接到Linux安全模å—(LSM)框架ä¸ï¼›è¿™ä¸ªæ¨¡å—å¯ä»¥é…置为å…许特定的应用程åºè®¿é—® -实时调度程åºã€‚这个模å—被实现并å‘é€åˆ°Linuxå†…æ ¸é‚®ä»¶åˆ—è¡¨ï¼Œåœ¨é‚£é‡Œå®ƒç«‹å³é‡åˆ°é—®é¢˜ã€‚ +举个例åï¼šå‡ å¹´å‰ï¼ŒLinux音频的开å‘äººå‘˜å¯»æ±‚ä¸€ç§æ–¹æ³•æ¥è¿è¡Œåº”用程åºï¼Œè€Œä¸ä¼šå› +系统延迟过大而导致退出或其他问题。他们得到的解决方案是一个连接到Linux安全 +模å—(LSM)框架ä¸çš„å†…æ ¸æ¨¡å—;这个模å—å¯ä»¥é…置为å…许特定的应用程åºè®¿é—®å®žæ—¶ +调度程åºã€‚这个模å—被实现并å‘到linux-kernel邮件列表,在那里它立å³é‡åˆ°äº†éº»çƒ¦ã€‚ 对于音频开å‘人员æ¥è¯´ï¼Œè¿™ä¸ªå®‰å…¨æ¨¡å—足以解决他们当å‰çš„问题。但是,对于更广泛的 å†…æ ¸ç¤¾åŒºæ¥è¯´ï¼Œè¿™è¢«è§†ä¸ºå¯¹LSM框架的滥用(LSMæ¡†æž¶å¹¶ä¸æ‰“算授予他们原本ä¸å…·å¤‡çš„ 进程特æƒï¼‰ï¼Œå¹¶å¯¹ç³»ç»Ÿç¨³å®šæ€§é€ æˆé£Žé™©ã€‚ä»–ä»¬é¦–é€‰çš„è§£å†³æ–¹æ¡ˆåŒ…æ‹¬çŸæœŸçš„通过rlimit 机制进行实时调度访问,以åŠé•¿æœŸçš„å‡å°‘延迟的工作。 -然而,音频社区看ä¸åˆ°ä»–ä»¬å®žæ–½çš„ç‰¹å®šè§£å†³æ–¹æ¡ˆçš„è¿‡åŽ»ï¼›ä»–ä»¬ä¸æ„¿æ„æŽ¥å—æ›¿ä»£æ–¹æ¡ˆã€‚ +ç„¶è€Œï¼ŒéŸ³é¢‘ç¤¾åŒºæ— æ³•è¶…è¶Šä»–ä»¬å®žæ–½çš„ç‰¹å®šè§£å†³æ–¹æ¡ˆæ¥çœ‹é—®é¢˜ï¼›ä»–们䏿„¿æ„æŽ¥å—æ›¿ä»£æ–¹æ¡ˆã€‚ ç”±æ¤äº§ç”Ÿçš„分æ§ä½¿è¿™äº›å¼€å‘äººå‘˜å¯¹æ•´ä¸ªå†…æ ¸å¼€å‘过程感到失望;其ä¸ä¸€ä¸ªå¼€å‘人员返回 -到音频列表并å‘布了以下内容: +到audio列表并å‘布了以下内容: - 有很多éžå¸¸å¥½çš„Linuxå†…æ ¸å¼€å‘人员,但他们往往会被一群傲慢的傻瓜所压倒。 - 试图å‘è¿™äº›äººä¼ è¾¾ç”¨æˆ·éœ€æ±‚æ˜¯æµªè´¹æ—¶é—´ã€‚ä»–ä»¬å¤ªâ€œèªæ˜Žâ€äº†ï¼Œæ ¹æœ¬å¬ä¸åˆ°å°‘数人 - çš„è¯ã€‚ + 有很多éžå¸¸å¥½çš„Linuxå†…æ ¸å¼€å‘人员,但他们往往会被一群傲慢的傻瓜所压倒。 + 试图å‘è¿™äº›äººä¼ è¾¾ç”¨æˆ·éœ€æ±‚æ˜¯æµªè´¹æ—¶é—´ã€‚ä»–ä»¬å¤ªâ€œèªæ˜Žâ€äº†ï¼Œæ ¹æœ¬å¬ä¸åˆ°å°‘æ•° + 人的è¯ã€‚ (http://lwn.net/articles/131776/) -实际情况ä¸åŒï¼›ä¸Žç‰¹å®šæ¨¡å—ç›¸æ¯”ï¼Œå†…æ ¸å¼€å‘人员更关心系统稳定性ã€é•¿æœŸç»´æŠ¤ä»¥åŠæ‰¾åˆ° -æ£ç¡®çš„é—®é¢˜è§£å†³æ–¹æ¡ˆã€‚è¿™ä¸ªæ•…äº‹çš„å¯“æ„æ˜¯æŠŠé‡ç‚¹æ”¾åœ¨é—®é¢˜ä¸Šâ€”â€”è€Œä¸æ˜¯å…·ä½“的解决方案 -上——并在投入创建代ç 之å‰ä¸Žå¼€å‘社区讨论这个问题。 +å®žé™…æƒ…å†µå´æ˜¯ä¸åŒçš„;与特定模å—ç›¸æ¯”ï¼Œå†…æ ¸å¼€å‘人员更关心系统稳定性ã€é•¿æœŸç»´æŠ¤ +ä»¥åŠæ‰¾åˆ°é—®é¢˜çš„æ£ç¡®è§£å†³æ–¹æ¡ˆã€‚è¿™ä¸ªæ•…äº‹çš„å¯“æ„æ˜¯æŠŠé‡ç‚¹æ”¾åœ¨é—®é¢˜ä¸Šâ€”â€”è€Œä¸æ˜¯å…·ä½“çš„ +解决方案上——并在开始编写代ç 之å‰ä¸Žå¼€å‘社区讨论这个问题。 å› æ¤ï¼Œåœ¨è€ƒè™‘ä¸€ä¸ªå†…æ ¸å¼€å‘项目时,我们应该得到一组简çŸé—®é¢˜çš„ç”æ¡ˆï¼š - - 究竟需è¦è§£å†³çš„问题是什么? + - 需è¦è§£å†³çš„问题究竟是什么? - - å—æ¤é—®é¢˜å½±å“的用户是è°ï¼Ÿè§£å†³æ–¹æ¡ˆåº”该解决哪些用例? + - å—æ¤é—®é¢˜å½±å“的用户有哪些?解决方案应该解决哪些使用案例? - å†…æ ¸çŽ°åœ¨ä¸ºä½•æ²¡èƒ½è§£å†³è¿™ä¸ªé—®é¢˜ï¼Ÿ @@ -62,100 +69,100 @@ - 很å¯èƒ½é—®é¢˜æ˜¯ç”±å†…æ ¸ä»¥æ‚¨ä¸ç†è§£çš„æ–¹å¼è§£å†³çš„。Linuxå†…æ ¸å¾ˆå¤§ï¼Œå…·æœ‰è®¸å¤šä¸æ˜Žæ˜¾ çš„ç‰¹æ€§å’ŒåŠŸèƒ½ã€‚å¹¶ä¸æ˜¯æ‰€æœ‰çš„å†…æ ¸åŠŸèƒ½éƒ½åƒäººä»¬æ‰€å¸Œæœ›çš„é‚£æ ·æœ‰æ–‡æ¡£è®°å½•ï¼Œè€Œä¸”å¾ˆ - å®¹æ˜“é—æ¼ä¸€äº›ä¸œè¥¿ã€‚ä½ çš„ä½œè€…å‘出了一个完整的驱动程åºï¼Œå¤åˆ¶äº†ä¸€ä¸ªæ–°ä½œè€…ä¸ - 知é“的现有驱动程åºã€‚釿–°è®¾è®¡çŽ°æœ‰è½®å的代ç ä¸ä»…浪费,而且ä¸ä¼šè¢«æŽ¥å—到主线 + å®¹æ˜“é—æ¼ä¸€äº›ä¸œè¥¿ã€‚æŸä½œè€…å‘布了一个完整的驱动程åºï¼Œé‡å¤äº†ä¸€ä¸ªå…¶ä¸ + 知é“的现有驱动程åºã€‚釿–°å‘明现有轮å的代ç ä¸ä»…浪费,而且ä¸ä¼šè¢«æŽ¥å—到主线 å†…æ ¸ä¸ã€‚ - - 建议的解决方案ä¸å¯èƒ½æœ‰ä¸€äº›å…ƒç´ ä¸é€‚用于主线åˆå¹¶ã€‚在编写代ç 之å‰ï¼Œæœ€å¥½å…ˆ - äº†è§£è¿™æ ·çš„é—®é¢˜ã€‚ + - 建议的解决方案ä¸å¯èƒ½æœ‰ä¸€äº›è¦ç´ ä¸é€‚åˆå¹¶å…¥ä¸»çº¿ã€‚在编写代ç 之å‰ï¼Œæœ€å¥½å…ˆäº†è§£ + è¿™æ ·çš„é—®é¢˜ã€‚ - å…¶ä»–å¼€å‘人员完全有å¯èƒ½è€ƒè™‘过这个问题;他们å¯èƒ½æœ‰æ›´å¥½çš„解决方案的想法,并且 å¯èƒ½æ„¿æ„帮助创建这个解决方案。 åœ¨å†…æ ¸å¼€å‘社区的多年ç»éªŒç»™äº†æˆ‘们一个明确的教è®ï¼šé—门设计和开å‘çš„å†…æ ¸ä»£ç æ€»æ˜¯ æœ‰ä¸€äº›é—®é¢˜ï¼Œè¿™äº›é—®é¢˜åªæœ‰åœ¨ä»£ç å‘å¸ƒåˆ°ç¤¾åŒºä¸æ—¶æ‰ä¼šè¢«å‘现。有时这些问题很严é‡ï¼Œ -éœ€è¦æ•°æœˆæˆ–数年的努力æ‰èƒ½ä½¿ä»£ç è¾¾åˆ°å†…æ ¸ç¤¾åŒºçš„æ ‡å‡†ã€‚ä¸€äº›ä¾‹å包括: +éœ€è¦æ•°æœˆæˆ–数年的努力æ‰èƒ½ä½¿ä»£ç è¾¾åˆ°å†…æ ¸ç¤¾åŒºçš„æ ‡å‡†ã€‚ä¾‹å¦‚ï¼š - 设计并实现了å•处ç†å™¨ç³»ç»Ÿçš„DeviceScapeç½‘ç»œæ ˆã€‚åªæœ‰ä½¿å…¶é€‚åˆäºŽå¤šå¤„ç†å™¨ç³»ç»Ÿï¼Œ - æ‰èƒ½å°†å…¶åˆå¹¶åˆ°ä¸»çº¿ä¸ã€‚在代ç 䏿”¹è£…é”ç‰ç‰æ˜¯ä¸€é¡¹å›°éš¾çš„ä»»åŠ¡ï¼›å› æ¤ï¼Œè¿™æ®µä»£ç + æ‰èƒ½å°†å…¶åˆå¹¶åˆ°ä¸»çº¿ä¸ã€‚在代ç ä¸ä¿®æ”¹é”ç‰ç‰æ˜¯ä¸€é¡¹å›°éš¾çš„ä»»åŠ¡ï¼›å› æ¤ï¼Œè¿™æ®µä»£ç (现在称为mac80211)的åˆå¹¶è¢«æŽ¨è¿Ÿäº†ä¸€å¹´å¤šã€‚ - Reiser4文件系统包å«è®¸å¤šåŠŸèƒ½ï¼Œæ ¸å¿ƒå†…æ ¸å¼€å‘人员认为这些功能应该在虚拟文件 系统层ä¸å®žçŽ°ã€‚å®ƒè¿˜åŒ…æ‹¬ä¸€äº›ç‰¹æ€§ï¼Œè¿™äº›ç‰¹æ€§åœ¨ä¸å°†ç³»ç»Ÿæš´éœ²äºŽç”¨æˆ·å¼•èµ·çš„æ»é”çš„ - 情况下是ä¸å®¹æ˜“实现的。这些问题的最新å‘现——以åŠå¯¹å…¶ä¸ä¸€äº›é—®é¢˜çš„æ‹’ç»â€”â€”å·²ç» - 导致Reiser4è¿œç¦»äº†ä¸»çº¿å†…æ ¸ã€‚ + 情况下是ä¸å®¹æ˜“实现的。这些问题过迟å‘çŽ°â€”â€”ä»¥åŠæ‹’ç»å¤„ç†å…¶ä¸ä¸€äº›é—®é¢˜â€”â€”å·²ç» + 导致Reiser4ç½®èº«ä¸»çº¿å†…æ ¸ä¹‹å¤–ã€‚ - Apparmor安全模å—以被认为ä¸å®‰å…¨å’Œä¸å¯é 的方å¼ä½¿ç”¨å†…部虚拟文件系统数æ®ç»“构。 - è¿™ç§æ‹…心(包括其他)使Apparmor多年ä¸åœ¨ä¸»çº¿ä¸Šã€‚ + è¿™ç§æ‹…心(包括其他)使Apparmorå¤šå¹´æ¥æ— 法进入主线。 -在æ¯ä¸€ç§æƒ…å†µä¸‹ï¼Œé€šè¿‡ä¸Žå†…æ ¸å¼€å‘人员的早期讨论,å¯ä»¥é¿å…大é‡çš„痛苦和é¢å¤–的工作。 +åœ¨è¿™äº›æƒ…å†µä¸‹ï¼Œä¸Žå†…æ ¸å¼€å‘人员的早期讨论,å¯ä»¥é¿å…大é‡çš„痛苦和é¢å¤–的工作。 -找è°äº¤æµ --------- +找è°äº¤æµï¼Ÿ +---------- 当开å‘äººå‘˜å†³å®šå…¬å¼€ä»–ä»¬çš„è®¡åˆ’æ—¶ï¼Œä¸‹ä¸€ä¸ªé—®é¢˜æ˜¯ï¼šæˆ‘ä»¬ä»Žå“ªé‡Œå¼€å§‹ï¼Ÿç”æ¡ˆæ˜¯æ‰¾åˆ°æ£ç¡® 的邮件列表和æ£ç¡®çš„维护者。对于邮件列表,最好的方法是在维护者(MAINTAINERS)文件 -䏿Ÿ¥æ‰¾è¦å‘布的相关ä½ç½®ã€‚如果有一个åˆé€‚çš„å系统列表,那么å‘布它通常比在Linux -å†…æ ¸ä¸Šå‘布更å¯å–;您更有å¯èƒ½æŽ¥è§¦åˆ°åœ¨ç›¸å…³å系统ä¸å…·æœ‰ä¸“业知识的开å‘人员,并且 -环境å¯èƒ½å…·æ”¯æŒæ€§ã€‚ +䏿Ÿ¥æ‰¾è¦å‘布的相关ä½ç½®ã€‚如果有一个åˆé€‚çš„å系统列表,那么其上å‘布通常比在 +linux-kernel上å‘布更å¯å–;您更有å¯èƒ½æŽ¥è§¦åˆ°åœ¨ç›¸å…³å系统ä¸å…·æœ‰ä¸“ä¸šçŸ¥è¯†çš„å¼€å‘ +人员,并且环境å¯èƒ½å…·æ”¯æŒæ€§ã€‚ -找到维护人员å¯èƒ½ä¼šæœ‰ç‚¹å›°éš¾ã€‚åŒæ ·ï¼Œç»´æŠ¤è€…æ–‡ä»¶æ˜¯å¼€å§‹çš„åœ°æ–¹ã€‚ä½†æ˜¯ï¼Œè¯¥æ–‡ä»¶å¾€å¾€ä¸æ€» -æ˜¯æœ€æ–°çš„ï¼Œå¹¶ä¸”å¹¶éžæ‰€æœ‰å系统都在那里表示。实际上,维护者文件ä¸åˆ—出的人员å¯èƒ½ +找到维护人员å¯èƒ½ä¼šæœ‰ç‚¹å›°éš¾ã€‚åŒæ ·ï¼Œç»´æŠ¤è€…æ–‡ä»¶æ˜¯å¼€å§‹çš„åœ°æ–¹ã€‚ä½†æ˜¯ï¼Œè¯¥æ–‡ä»¶å¾€å¾€ä¸ +æ˜¯æœ€æ–°çš„ï¼Œå¹¶ä¸”å¹¶éžæ‰€æœ‰å系统都在那里显示。实际上,维护者文件ä¸åˆ—出的人员å¯èƒ½ 䏿˜¯å½“å‰å®žé™…æ‹…ä»»è¯¥è§’è‰²çš„äººå‘˜ã€‚å› æ¤ï¼Œå½“对è”ç³»è°æœ‰ç–‘问时,一个有用的技巧是使用 -git(尤其是“git-logâ€ï¼‰æŸ¥çœ‹æ„Ÿå…´è¶£çš„å系统ä¸å½“剿´»åŠ¨çš„ç”¨æˆ·ã€‚çœ‹çœ‹è°åœ¨å†™è¡¥ä¸ï¼Œ -如果有人的è¯ï¼Œè°ä¼šåœ¨è¿™äº›è¡¥ä¸ä¸ŠåŠ ä¸Šç”¨çº¿ç¾å的。这些人将是帮助新开å‘项目的最佳 -人选。 +git(尤其是“git-logâ€ï¼‰æŸ¥çœ‹æ„Ÿå…´è¶£çš„å系统ä¸å½“剿´»åŠ¨çš„ç”¨æˆ·ã€‚çœ‹çœ‹è°åœ¨å†™è¡¥ä¸ã€ +è°ä¼šåœ¨è¿™äº›è¡¥ä¸ä¸ŠåŠ ä¸ŠSigned-off-by行ç¾å(如有)。这些人将是帮助新开å‘项目的 +最佳人选。 -找到åˆé€‚的维护者的任务有时是éžå¸¸å…·æœ‰æŒ‘æˆ˜æ€§çš„ï¼Œä»¥è‡³äºŽå†…æ ¸å¼€å‘äººå‘˜æ·»åŠ äº†ä¸€ä¸ª -脚本æ¥ç®€åŒ–过程: +找到åˆé€‚的维护者有时是éžå¸¸å…·æœ‰æŒ‘æˆ˜æ€§çš„ï¼Œä»¥è‡³äºŽå†…æ ¸å¼€å‘äººå‘˜æ·»åŠ äº†ä¸€ä¸ªè„šæœ¬æ¥ +简化这个过程: :: .../scripts/get_maintainer.pl -当给定“-fâ€é€‰é¡¹æ—¶ï¼Œæ¤è„šæœ¬å°†è¿”å›žç»™å®šæ–‡ä»¶æˆ–ç›®å½•çš„å½“å‰ç»´æŠ¤è€…ã€‚å¦‚æžœåœ¨å‘½ä»¤è¡Œä¸Šä¼ é€’ -了一个补ä¸ï¼Œå®ƒå°†åˆ—出å¯èƒ½æŽ¥æ”¶è¡¥ä¸å‰¯æœ¬çš„维护人员。有许多选项å¯ä»¥è°ƒèŠ‚ -get_maintainer.plæœç´¢ç»´æŠ¤è€…的难易程度;请å°å¿ƒä½¿ç”¨æ›´å…·æ”»å‡»æ€§çš„é€‰é¡¹ï¼Œå› ä¸ºæœ€ç»ˆ +当给定“-fâ€é€‰é¡¹æ—¶ï¼Œæ¤è„šæœ¬å°†è¿”å›žæŒ‡å®šæ–‡ä»¶æˆ–ç›®å½•çš„å½“å‰ç»´æŠ¤è€…。如果在命令行上 +给出了一个补ä¸ï¼Œå®ƒå°†åˆ—出å¯èƒ½æŽ¥æ”¶è¡¥ä¸å‰¯æœ¬çš„维护人员。有许多选项å¯ä»¥è°ƒèŠ‚ +get_maintainer.plæœç´¢ç»´æŠ¤è€…çš„ä¸¥æ ¼ç¨‹åº¦ï¼›è¯·å°å¿ƒä½¿ç”¨æ›´æ¿€è¿›çš„é€‰é¡¹ï¼Œå› ä¸ºæœ€ç»ˆç»“æžœ å¯èƒ½ä¼šåŒ…括对您æ£åœ¨ä¿®æ”¹çš„ä»£ç æ²¡æœ‰çœŸæ£å…´è¶£çš„å¼€å‘人员。 -如果所有其他方法都失败了,那么与Andrew Morton交谈å¯ä»¥æˆä¸ºä¸€ç§æœ‰æ•ˆçš„æ–¹æ³•æ¥è·Ÿè¸ª -ç‰¹å®šä»£ç æ®µçš„维护人员。 +如果所有其他方法都失败了,那么与Andrew Mortonäº¤æµæ˜¯è·Ÿè¸ªç‰¹å®šä»£ç 段维护人员 +çš„ä¸€ç§æœ‰æ•ˆæ–¹æ³•。 何时邮寄? ---------- -如果å¯èƒ½çš„è¯ï¼Œåœ¨æ—©æœŸé˜¶æ®µå‘å¸ƒä½ çš„è®¡åˆ’åªä¼šæœ‰å¸®åŠ©ã€‚æè¿°æ£åœ¨è§£å†³çš„问题以åŠå·²ç» +如果å¯èƒ½çš„è¯ï¼Œåœ¨æ—©æœŸé˜¶æ®µå‘å¸ƒä½ çš„è®¡åˆ’åªä¼šæ›´æœ‰å¸®åŠ©ã€‚æè¿°æ£åœ¨è§£å†³çš„问题以åŠå·²ç» 制定的关于如何实施的任何计划。您å¯ä»¥æä¾›çš„任何信æ¯éƒ½å¯ä»¥å¸®åЩ开å‘社区为项目 æä¾›æœ‰ç”¨çš„输入。 -在这个阶段å¯èƒ½å‘ç”Ÿçš„ä¸€ä»¶ä»¤äººæ²®ä¸§çš„äº‹æƒ…ä¸æ˜¯æ•Œå¯¹çš„ååº”ï¼Œè€Œæ˜¯å¾ˆå°‘æˆ–æ ¹æœ¬æ²¡æœ‰ -ååº”ã€‚å¯æ‚²çš„事实是:(1ï¼‰å†…æ ¸å¼€å‘人员往往很忙;(2)ä¸ç¼ºå°‘有å®ä¼Ÿè®¡åˆ’和很少 -代ç (甚至代ç 剿™¯ï¼‰æ”¯æŒä»–们的人;(3)没有人有义务审查或评论别人å‘表的 -想法。除æ¤ä¹‹å¤–,高级设计常常éšè—ä¸€äº›é—®é¢˜ï¼Œè¿™äº›é—®é¢˜åªæœ‰åœ¨æœ‰äººçœŸæ£å°è¯•实现 -这些设计时æ‰ä¼šè¢«å‘çŽ°ï¼›å› æ¤ï¼Œå†…æ ¸å¼€å‘äººå‘˜å®æ„¿çœ‹åˆ°ä»£ç 。 +在这个阶段å¯èƒ½å‘ç”Ÿçš„ä¸€ä»¶ä»¤äººæ²®ä¸§çš„äº‹æƒ…ä¸æ˜¯å¾—到å对æ„è§ï¼Œè€Œæ˜¯å¾ˆå°‘æˆ–æ ¹æœ¬æ²¡æœ‰ +å馈。令人伤心的事实是:(1ï¼‰å†…æ ¸å¼€å‘人员往往很忙;(2)ä¸ç¼ºå°‘有å®ä¼Ÿè®¡åˆ’但 +代ç (甚至代ç 设想)很少的人去支æŒä»–们;(3)没有人有义务审查或评论别人å‘表 +的想法。除æ¤ä¹‹å¤–,高层级的设计常常éšè—ç€ä¸€äº›é—®é¢˜ï¼Œè¿™äº›é—®é¢˜åªæœ‰åœ¨æœ‰äººçœŸæ£å°è¯• +实现这些设计时æ‰ä¼šè¢«å‘çŽ°ï¼›å› æ¤ï¼Œå†…æ ¸å¼€å‘äººå‘˜å®æ„¿çœ‹åˆ°ä»£ç 。 -如果å‘表评论的请求在评论的方å¼ä¸Šæ²¡æœ‰ä»€ä¹ˆæ•ˆæžœï¼Œä¸è¦å‡è®¾è¿™æ„味ç€å¯¹é¡¹ç›®æ²¡æœ‰ -兴趣。ä¸å¹¸çš„æ˜¯ï¼Œä½ 也ä¸èƒ½å‡è®¾ä½ çš„æƒ³æ³•æ²¡æœ‰é—®é¢˜ã€‚åœ¨è¿™ç§æƒ…å†µä¸‹ï¼Œæœ€å¥½çš„åšæ³•是 -ç»§ç»è¿›è¡Œï¼ŒæŠŠä½ çš„è¿›å±•éšæ—¶é€šçŸ¥ç¤¾åŒºã€‚ +如果å‘布请求评论(RFC)并没得到什么有用的评论,ä¸è¦ä»¥ä¸ºè¿™æ„å‘³ç€æ— 人对æ¤é¡¹ç›® +æœ‰å…´è¶£ï¼ŒåŒæ—¶ä½ 也ä¸èƒ½å‡è®¾ä½ çš„æƒ³æ³•æ²¡æœ‰é—®é¢˜ã€‚åœ¨è¿™ç§æƒ…å†µä¸‹ï¼Œæœ€å¥½çš„åšæ³•是继ç»è¿› +è¡Œï¼ŒæŠŠä½ çš„è¿›å±•éšæ—¶é€šçŸ¥ç¤¾åŒºã€‚ èŽ·å¾—å®˜æ–¹è®¤å¯ ----------------------- -如果您的工作是在公å¸çŽ¯å¢ƒä¸å®Œæˆçš„,就åƒå¤§å¤šæ•°Linuxå†…æ ¸å·¥ä½œä¸€æ ·ï¼Œæ˜¾ç„¶ï¼Œåœ¨æ‚¨å°† -å…¬å¸çš„计划或代ç å‘布到公共邮件列表之å‰ï¼Œå¿…须获得适当授æƒçš„ç»ç†çš„许å¯ã€‚å‘布 -ä¸ç¡®å®šæ˜¯å¦å…¼å®¹GPL的代ç å¯èƒ½æ˜¯æœ‰ç‰¹åˆ«é—®é¢˜çš„;公å¸çš„管ç†å±‚和法律人员越早能够就 -å‘å¸ƒå†…æ ¸å¼€å‘项目达æˆä¸€è‡´ï¼Œå¯¹å‚与的æ¯ä¸ªäººéƒ½è¶Šå¥½ã€‚ +如果您的工作是在公å¸çŽ¯å¢ƒä¸å®Œæˆçš„,就åƒå¤§å¤šæ•°Linuxå†…æ ¸å·¥ä½œä¸€æ ·ï¼›æ˜¾ç„¶ï¼Œåœ¨æ‚¨å°† +å…¬å¸çš„计划或代ç å‘布到公共邮件列表之å‰ï¼Œå¿…须获得有适当æƒåˆ©ç»ç†çš„许å¯ã€‚å‘布 +ä¸ç¡®å®šæ˜¯å¦å…¼å®¹GPL的代ç 尤其会带æ¥é—®é¢˜ï¼›å…¬å¸çš„管ç†å±‚和法律人员越早能够就å‘布 +å†…æ ¸å¼€å‘项目达æˆä¸€è‡´ï¼Œå¯¹å‚与的æ¯ä¸ªäººéƒ½è¶Šå¥½ã€‚ 一些读者å¯èƒ½ä¼šè®¤ä¸ºä»–ä»¬çš„æ ¸å¿ƒå·¥ä½œæ˜¯ä¸ºäº†æ”¯æŒè¿˜æ²¡æœ‰æ£å¼æ‰¿è®¤å˜åœ¨çš„产å“。将雇主 的计划公布在公共邮件列表上å¯èƒ½ä¸æ˜¯ä¸€ä¸ªå¯è¡Œçš„é€‰æ‹©ã€‚åœ¨è¿™ç§æƒ…况下,有必è¦è€ƒè™‘ ä¿å¯†æ˜¯å¦çœŸçš„æ˜¯å¿…è¦çš„;通常ä¸éœ€è¦æŠŠå¼€å‘计划关在门内。 -也就是说,有些情况下,一家公å¸åœ¨å¼€å‘过程的早期就ä¸èƒ½åˆæ³•地披露其计划。拥有 -ç»éªŒä¸°å¯Œçš„å†…æ ¸å¼€å‘人员的公å¸å¯ä»¥é€‰æ‹©ä»¥å¼€çŽ¯çš„æ–¹å¼è¿›è¡Œï¼Œå‰ææ˜¯ä»–们以åŽèƒ½å¤Ÿé¿å… +的确,有些情况下一家公å¸åœ¨å¼€å‘è¿‡ç¨‹çš„æ—©æœŸæ— æ³•åˆæ³•地披露其计划。拥有ç»éªŒä¸°å¯Œ +çš„å†…æ ¸å¼€å‘人员的公å¸å¯èƒ½é€‰æ‹©ä»¥å¼€çŽ¯çš„æ–¹å¼è¿›è¡Œå¼€å‘ï¼Œå‰ææ˜¯ä»–ä»¬ä»¥åŽèƒ½å¤Ÿé¿å… 严é‡çš„集æˆé—®é¢˜ã€‚对于没有这ç§å†…部专业知识的公å¸ï¼Œæœ€å¥½çš„选择往往是è˜è¯·å¤–部 -å¼€å‘å•†æ ¹æ®ä¿å¯†å议审查计划。Linux基金会è¿è¡Œäº†ä¸€ä¸ªNDA程åºï¼Œæ—¨åœ¨å¸®åŠ©è§£å†³è¿™ç§ -情况; +å¼€å‘è€…æ ¹æ®ä¿å¯†å议审查计划。Linux基金会è¿è¡Œäº†ä¸€ä¸ªNDA程åºï¼Œæ—¨åœ¨å¸®åŠ©è§£å†³è¿™ç§ +情况;更多信æ¯å‚è§ï¼š - http://www.linuxfoundation.org/en/NDA_program + http://www.linuxfoundation.org/nda/ è¿™ç§å®¡æŸ¥é€šå¸¸è¶³ä»¥é¿å…以åŽå‡ºçް䏥é‡é—®é¢˜ï¼Œè€Œæ— 需公开披露项目。 diff --git a/Documentation/translations/zh_CN/process/4.Coding.rst b/Documentation/translations/zh_CN/process/4.Coding.rst index 66cd8ee076062b8d0e94db86ce915ebab6550b56..94f7f866f10397913a5a62f5faf820a5fd5f1fa8 100644 --- a/Documentation/translations/zh_CN/process/4.Coding.rst +++ b/Documentation/translations/zh_CN/process/4.Coding.rst @@ -1,155 +1,160 @@ .. include:: ../disclaimer-zh_CN.rst :Original: :ref:`Documentation/process/4.Coding.rst <development_coding>` -:Translator: Alex Shi <alex.shi@linux.alibaba.com> + +:Translator: + + 时奎亮 Alex Shi <alex.shi@linux.alibaba.com> + +:æ ¡è¯‘: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> .. _cn_development_coding: ä½¿ä»£ç æ£ç¡® ====================== -虽然对于一个åšå®žçš„ã€é¢å‘社区的设计过程有很多è¯è¦è¯´ï¼Œä½†æ˜¯ä»»ä½•å†…æ ¸å¼€å‘项目的 -è¯æ˜Žéƒ½åœ¨ç”Ÿæˆçš„代ç ä¸ã€‚它是将由其他开å‘人员检查并åˆå¹¶ï¼ˆæˆ–ä¸åˆå¹¶ï¼‰åˆ°ä¸»çº¿æ ‘ä¸ +虽然一个åšå®žçš„ã€é¢å‘社区的设计过程有很多值得说é“çš„ï¼Œä½†æ˜¯ä»»ä½•å†…æ ¸å¼€å‘项目工作 +çš„è¯æ˜Žéƒ½åæ˜ åœ¨ä»£ç ä¸ã€‚它是将由其他开å‘人员检查并åˆå¹¶ï¼ˆæˆ–ä¸åˆå¹¶ï¼‰åˆ°ä¸»çº¿æ ‘ä¸ çš„ä»£ç 。所以这段代ç 的质é‡å†³å®šäº†é¡¹ç›®çš„æœ€ç»ˆæˆåŠŸã€‚ -本节将检查编ç è¿‡ç¨‹ã€‚æˆ‘ä»¬å°†ä»Žå†…æ ¸å¼€å‘äººå‘˜å‡ºé”™çš„å‡ ç§æ–¹å¼å¼€å§‹ã€‚ç„¶åŽé‡ç‚¹å°†è½¬ç§» -到æ£ç¡®çš„事情和å¯ä»¥å¸®åŠ©è¿™ä¸ªä»»åŠ¡çš„å·¥å…·ä¸Šã€‚ +本节将检查编ç è¿‡ç¨‹ã€‚æˆ‘ä»¬å°†ä»Žå†…æ ¸å¼€å‘äººå‘˜å¸¸çŠ¯çš„å‡ ç§é”™è¯¯å¼€å§‹ã€‚ç„¶åŽé‡ç‚¹å°†è½¬ç§» +到æ£ç¡®çš„åšæ³•和相关有用的工具上。 陷阱 ---- -ç¼–ç é£Žæ ¼ +代ç é£Žæ ¼ ******** -å†…æ ¸é•¿æœŸä»¥æ¥éƒ½æœ‰ä¸€ç§æ ‡å‡†çš„ç¼–ç é£Žæ ¼ï¼Œå¦‚ +å†…æ ¸é•¿æœŸä»¥æ¥éƒ½æœ‰å…¶æ ‡å‡†çš„代ç é£Žæ ¼ï¼Œå¦‚ :ref:`Documentation/translations/zh_CN/process/coding-style.rst <cn_codingstyle>` -䏿‰€è¿°ã€‚åœ¨å¤§éƒ¨åˆ†æ—¶é—´é‡Œï¼Œè¯¥æ–‡ä»¶ä¸æè¿°çš„æ”¿ç–è¢«è®¤ä¸ºè‡³å¤šæ˜¯å»ºè®®æ€§çš„ã€‚å› æ¤ï¼Œå†…æ ¸ -ä¸å˜åœ¨å¤§é‡ä¸ç¬¦åˆç¼–ç é£Žæ ¼å‡†åˆ™çš„ä»£ç 。代ç çš„å˜åœ¨ä¼šç»™å†…æ ¸å¼€å‘人员带æ¥ä¸¤ä¸ªç‹¬ç«‹ -çš„å±å®³ã€‚ - -首先,è¦ç›¸ä¿¡å†…æ ¸ç¼–ç æ ‡å‡†å¹¶ä¸é‡è¦ï¼Œä¹Ÿä¸å¼ºåˆ¶æ‰§è¡Œã€‚äº‹å®žä¸Šï¼Œå¦‚æžœæ²¡æœ‰æŒ‰ç…§æ ‡å‡†å¯¹ä»£ -ç 进行编ç ,那么å‘å†…æ ¸æ·»åŠ æ–°ä»£ç æ˜¯éžå¸¸å›°éš¾çš„;许多开å‘人员甚至会在审查代ç 之 -å‰è¦æ±‚对代ç è¿›è¡Œé‡æ–°æ ¼å¼åŒ–ã€‚ä¸€ä¸ªä¸Žå†…æ ¸ä¸€æ ·å¤§çš„ä»£ç 库需è¦ä¸€äº›ç»Ÿä¸€çš„代ç ,以使 -å¼€å‘人员能够快速ç†è§£å…¶ä¸çš„ä»»ä½•éƒ¨åˆ†ã€‚æ‰€ä»¥å·²ç»æ²¡æœ‰ç©ºé—´æ¥å˜æ”¾å¥‡æ€ªçš„æ ¼å¼åŒ–代ç 了。 - -å¶å°”ï¼Œå†…æ ¸çš„ç¼–ç é£Žæ ¼ä¼šä¸Žé›‡ä¸»çš„å¼ºåˆ¶é£Žæ ¼å‘生冲çªã€‚åœ¨è¿™ç§æƒ…å†µä¸‹ï¼Œå†…æ ¸çš„é£Žæ ¼å¿…é¡» -在代ç åˆå¹¶ä¹‹å‰èŽ·èƒœã€‚å°†ä»£ç æ”¾å…¥å†…æ ¸æ„味ç€ä»¥å¤šç§æ–¹å¼æ”¾å¼ƒä¸€å®šç¨‹åº¦çš„æŽ§åˆ¶æƒâ€”—包括 -控制代ç çš„æ ¼å¼åŒ–æ–¹å¼ã€‚ - -å¦ä¸€ä¸ªé™·é˜±æ˜¯å‡å®šå·²ç»åœ¨å†…æ ¸ä¸çš„代ç 迫切需è¦ç¼–ç æ ·å¼çš„ä¿®å¤ã€‚å¼€å‘人员å¯èƒ½ä¼šå¼€å§‹ -生æˆé‡æ–°æ ¼å¼åŒ–è¡¥ä¸ï¼Œä½œä¸ºç†Ÿæ‚‰è¿‡ç¨‹çš„ä¸€ç§æ–¹å¼ï¼Œæˆ–者作为将其åç§°å†™å…¥å†…æ ¸å˜æ›´æ—¥å¿— -çš„ä¸€ç§æ–¹å¼ï¼Œæˆ–者两者兼而有之。但是纯编ç é£Žæ ¼çš„ä¿®å¤è¢«å¼€å‘社区视为噪音;它们往 -å¾€å—到冷é‡ã€‚å› æ¤ï¼Œæœ€å¥½é¿å…使用这ç§ç±»åž‹çš„è¡¥ä¸ã€‚ç”±äºŽå…¶ä»–åŽŸå› ï¼Œåœ¨å¤„ç†ä¸€æ®µä»£ç çš„ -åŒæ—¶ä¿®å¤å®ƒçš„æ ·å¼æ˜¯å¾ˆè‡ªç„¶çš„ï¼Œä½†æ˜¯ç¼–ç æ ·å¼çš„æ›´æ”¹ä¸åº”该仅为了更改而进行。 - -ç¼–ç é£Žæ ¼çš„æ–‡æ¡£ä¹Ÿä¸åº”该被视为ç»å¯¹çš„æ³•律,这是永远ä¸ä¼šè¢«è¿å的。如果有一个很好 -çš„ç†ç”±åå¯¹è¿™ç§æ ·å¼ï¼ˆä¾‹å¦‚,如果拆分为适åˆ80列é™åˆ¶çš„行,那么它的å¯è¯»æ€§å°±ä¼šå¤§å¤§ -é™ä½Žï¼‰ï¼Œé‚£ä¹ˆå°±è¿™æ ·åšã€‚ - -请注æ„,您还å¯ä»¥ä½¿ç”¨ ``clang-format`` 工具æ¥å¸®åŠ©æ‚¨å¤„ç†è¿™äº›è§„åˆ™ï¼Œè‡ªåŠ¨é‡æ–°æ ¼å¼ -化部分代ç ,并查看完整的文件,以å‘çŽ°ç¼–ç æ ·å¼é”™è¯¯ã€æ‹¼å†™é”™è¯¯å’Œå¯èƒ½çš„æ”¹è¿›ã€‚它还 -å¯ä»¥æ–¹ä¾¿åœ°è¿›è¡ŒæŽ’åºï¼ŒåŒ…括对é½å˜é‡/å®ã€å›žæµæ–‡æœ¬å’Œå…¶ä»–类似任务。有关详细信æ¯ï¼Œè¯· -å‚阅文件 :ref:`Documentation/process/clang-format.rst <clangformat>` +䏿‰€è¿°ã€‚åœ¨å¤šæ•°æ—¶å€™ï¼Œè¯¥æ–‡æ¡£ä¸æè¿°çš„å‡†åˆ™è‡³å¤šè¢«è®¤ä¸ºæ˜¯å»ºè®®æ€§çš„ã€‚å› æ¤ï¼Œå†…æ ¸ä¸å˜åœ¨ +大é‡ä¸ç¬¦åˆä»£ç é£Žæ ¼å‡†åˆ™çš„ä»£ç 。这ç§ä»£ç çš„å˜åœ¨ä¼šç»™å†…æ ¸å¼€å‘人员带æ¥ä¸¤æ–¹é¢çš„å±å®³ã€‚ + +é¦–å…ˆï¼Œç›¸ä¿¡å†…æ ¸ä»£ç æ ‡å‡†å¹¶ä¸é‡è¦ï¼Œä¹Ÿä¸å¼ºåˆ¶æ‰§è¡Œã€‚ä½†äº‹å®žä¸Šï¼Œå¦‚æžœæ²¡æœ‰æŒ‰ç…§æ ‡å‡† +编写代ç ,那么新代ç å°†å¾ˆéš¾åŠ å…¥åˆ°å†…æ ¸ä¸ï¼›è®¸å¤šå¼€å‘人员甚至会在审查代ç 之å‰è¦æ±‚ +对代ç è¿›è¡Œé‡æ–°æ ¼å¼åŒ–。一个åƒå†…æ ¸è¿™ä¹ˆå¤§çš„ä»£ç 库需è¦ä¸€äº›ç»Ÿä¸€æ ¼å¼çš„代ç ,以使 +å¼€å‘人员能够快速ç†è§£å…¶ä¸çš„任何部分。所以å†ä¹Ÿç»ä¸èµ·å¥‡æ€ªæ ¼å¼çš„代ç 的折腾了。 + +å†…æ ¸çš„ä»£ç é£Žæ ¼å¶å°”ä¼šä¸Žé›‡ä¸»çš„å¼ºåˆ¶é£Žæ ¼å‘生冲çªã€‚åœ¨è¿™ç§æƒ…况下,必须在代ç åˆå¹¶ +之å‰éµä»Žå†…æ ¸ä»£ç é£Žæ ¼ã€‚å°†ä»£ç æ”¾å…¥å†…æ ¸æ„味ç€ä»¥å¤šç§æ–¹å¼æ”¾å¼ƒä¸€å®šç¨‹åº¦çš„æŽ§åˆ¶æƒâ€”— +åŒ…æ‹¬æŽ§åˆ¶ä»£ç æ ·å¼ã€‚ + +å¦ä¸€ä¸ªå±å®³æ˜¯è®¤ä¸ºå·²ç»åœ¨å†…æ ¸ä¸çš„代ç 迫切需è¦ä¿®å¤ä»£ç æ ·å¼ã€‚å¼€å‘者å¯èƒ½ä¼šå¼€å§‹ç¼–写 +釿–°æ ¼å¼åŒ–è¡¥ä¸ï¼Œä½œä¸ºç†Ÿæ‚‰å¼€å‘è¿‡ç¨‹çš„ä¸€ç§æ–¹å¼ï¼Œæˆ–者作为将其åå—å†™å…¥å†…æ ¸å˜æ›´æ—¥å¿— +çš„ä¸€ç§æ–¹å¼ï¼Œæˆ–者两者兼而有之。但是纯代ç é£Žæ ¼çš„ä¿®å¤è¢«å¼€å‘社区视为噪音,它们往 +å¾€å—到冷é‡ã€‚å› æ¤ï¼Œæœ€å¥½é¿å…编写这ç§ç±»åž‹çš„è¡¥ä¸ã€‚åœ¨ç”±äºŽå…¶ä»–åŽŸå› å¤„ç†ä¸€æ®µä»£ç çš„ +åŒæ—¶é¡ºå¸¦ä¿®å¤å…¶æ ·å¼æ˜¯å¾ˆè‡ªç„¶çš„,但是ä¸åº”è¯¥ä»…ä¸ºäº†æ›´æ”¹ä»£ç æ ·å¼è€Œæ›´æ”¹ä¹‹ã€‚ + +代ç é£Žæ ¼æ–‡æ¡£ä¹Ÿä¸åº”该被视为ç»å¯¹ä¸å¯è¿å的规则。如果有一个足够的ç†ç”±åå¯¹è¿™ç§ +æ ·å¼ï¼ˆä¾‹å¦‚为了80列é™åˆ¶æ‹†åˆ†è¡Œä¼šå¯¼è‡´å¯è¯»æ€§å¤§å¤§é™ä½Žï¼‰ï¼Œé‚£ä¹ˆå°±è¿™æ ·åšå§ã€‚ + +æ³¨æ„æ‚¨è¿˜å¯ä»¥ä½¿ç”¨ ``clang-format`` 工具æ¥å¸®åŠ©æ‚¨å¤„ç†è¿™äº›è§„åˆ™ï¼Œå¿«é€Ÿè‡ªåŠ¨é‡æ–°æ ¼å¼ +化部分代ç ,和审阅完整的文件以å‘çŽ°ä»£ç æ ·å¼é”™è¯¯ã€æ‹¼å†™é”™è¯¯å’Œå¯èƒ½çš„æ”¹è¿›ã€‚它还 +å¯ä»¥æ–¹ä¾¿åœ°æŽ’åº ``#includes`` ã€å¯¹é½å˜é‡/å®ã€é‡æŽ’文本和其他类似任务。有关详细 +ä¿¡æ¯ï¼Œè¯·å‚阅文档 :ref:`Documentation/process/clang-format.rst <clangformat>` 抽象层 ****** è®¡ç®—æœºç§‘å¦æ•™æŽˆæ•™å¦ç”Ÿä»¥çµæ´»æ€§å’Œä¿¡æ¯éšè—çš„åä¹‰å¹¿æ³›ä½¿ç”¨æŠ½è±¡å±‚ã€‚å½“ç„¶ï¼Œå†…æ ¸å¹¿æ³› -åœ°ä½¿ç”¨äº†æŠ½è±¡ï¼›ä»»ä½•æ¶‰åŠæ•°ç™¾ä¸‡è¡Œä»£ç 的项目都ä¸èƒ½åšåˆ°è¿™ä¸€ç‚¹å¹¶å˜æ´»ä¸‹æ¥ã€‚但ç»éªŒ -表明,过度或过早的抽象å¯èƒ½å’Œè¿‡æ—©çš„ä¼˜åŒ–ä¸€æ ·æœ‰å®³ã€‚æŠ½è±¡åº”ç”¨äºŽæ‰€éœ€çš„çº§åˆ«ï¼Œ +åœ°ä½¿ç”¨äº†æŠ½è±¡ï¼›ä»»ä½•æ¶‰åŠæ•°ç™¾ä¸‡è¡Œä»£ç 的项目都必须åšåˆ°è¿™ä¸€ç‚¹ä»¥å˜ç»ä¸‹æ¥ã€‚但ç»éªŒ +表明,过度或过早的抽象å¯èƒ½å’Œè¿‡æ—©çš„ä¼˜åŒ–ä¸€æ ·æœ‰å®³ã€‚æŠ½è±¡åº”ç”¨åœ¨é€‚å½“å±‚çº§ï¼Œ ä¸è¦è¿‡åº¦ã€‚ -在一个简å•çš„çº§åˆ«ä¸Šï¼Œè€ƒè™‘ä¸€ä¸ªå‡½æ•°çš„å‚æ•°ï¼Œè¯¥å‚æ•°æ€»æ˜¯ç”±æ‰€æœ‰è°ƒç”¨æ–¹ä½œä¸ºé›¶ä¼ é€’ã€‚ -我们å¯ä»¥ä¿ç•™è¿™ä¸ªè®ºç‚¹: 以防有人最终需è¦ä½¿ç”¨å®ƒæä¾›çš„é¢å¤–çµæ´»æ€§ã€‚ä¸è¿‡ï¼Œåˆ°é‚£æ—¶ï¼Œ -实现这个é¢å¤–傿•°çš„代ç 很有å¯èƒ½ä»¥æŸç§ä»Žæœªè¢«æ³¨æ„到的微妙方å¼è¢«ç ´åâ€”â€”å› ä¸ºå®ƒä»Ž -未被使用过。或者,当需è¦é¢å¤–çš„çµæ´»æ€§æ—¶ï¼Œå®ƒä¸ä¼šä»¥ç¬¦åˆç¨‹åºå‘˜æ—©æœŸæœŸæœ›çš„æ–¹å¼æ¥ -è¿™æ ·åšã€‚å†…æ ¸å¼€å‘人员通常会æäº¤è¡¥ä¸æ¥åˆ é™¤æœªä½¿ç”¨çš„å‚æ•°ï¼›ä¸€èˆ¬æ¥è¯´ï¼Œé¦–å…ˆä¸åº”该 -æ·»åŠ è¿™äº›å‚æ•°ã€‚ +简å•ç‚¹ï¼Œå…ˆè€ƒè™‘ä¸€ä¸ªè°ƒç”¨æ—¶å§‹ç»ˆåªæœ‰ä¸€ä¸ªå‚数且总为零的函数。我们å¯ä»¥ä¿ç•™è¿™ä¸ªå‚数, +以在需è¦ä½¿ç”¨å®ƒæ—¶æä¾›çš„é¢å¤–çµæ´»æ€§ã€‚ä¸è¿‡ï¼Œåœ¨é‚£æ—¶å®žçŽ°äº†è¿™ä¸ªé¢å¤–傿•°çš„代ç 很有 +å¯èƒ½ä»¥æŸç§ä»Žæœªè¢«æ³¨æ„到的微妙方å¼è¢«ç ´åâ€”â€”å› ä¸ºå®ƒä»Žæœªè¢«ä½¿ç”¨è¿‡ã€‚æˆ–è€…å½“éœ€è¦é¢å¤– +çš„çµæ´»æ€§æ—¶ï¼Œå®ƒå¹¶æœªä»¥ç¬¦åˆç¨‹åºå‘˜å½“åˆæœŸæœ›çš„æ–¹å¼æ¥å®žçŽ°ã€‚å†…æ ¸å¼€å‘人员通常会æäº¤ +è¡¥ä¸æ¥åˆ é™¤æœªä½¿ç”¨çš„å‚æ•°ï¼›ä¸€èˆ¬æ¥è¯´ï¼Œä¸€å¼€å§‹å°±ä¸åº”è¯¥æ·»åŠ è¿™äº›å‚æ•°ã€‚ -éšè—硬件访问的抽象层——通常å…许大é‡çš„驱动程åºåœ¨å¤šä¸ªæ“作系统ä¸ä½¿ç”¨â€”—尤其ä¸å— +éšè—硬件访问的抽象层——通常为了å…许大é‡çš„驱动程åºå…¼å®¹å¤šä¸ªæ“作系统——尤其ä¸å— æ¬¢è¿Žã€‚è¿™æ ·çš„å±‚ä½¿ä»£ç å˜å¾—模糊,å¯èƒ½ä¼šé€ æˆæ€§èƒ½æŸå¤±ï¼›å®ƒä»¬ä¸å±žäºŽLinuxå†…æ ¸ã€‚ -å¦ä¸€æ–¹é¢ï¼Œå¦‚果您å‘现自己从å¦ä¸€ä¸ªå†…æ ¸å系统å¤åˆ¶äº†å¤§é‡çš„代ç ,那么现在是时候 -问一下,事实上,将这些代ç ä¸çš„一些æå–到å•独的库ä¸ï¼Œæˆ–者在更高的层次上实现 -è¿™äº›åŠŸèƒ½æ˜¯å¦æœ‰æ„ä¹‰ã€‚åœ¨æ•´ä¸ªå†…æ ¸ä¸å¤åˆ¶ç›¸åŒçš„ä»£ç æ²¡æœ‰ä»·å€¼ã€‚ +å¦ä¸€æ–¹é¢ï¼Œå¦‚果您å‘现自己从å¦ä¸€ä¸ªå†…æ ¸å系统å¤åˆ¶äº†å¤§é‡çš„代ç ,那么是时候 +了解一下:是å¦éœ€è¦å°†è¿™äº›ä»£ç ä¸çš„部分æå–到å•独的库ä¸ï¼Œæˆ–者在更高的层次上 +å®žçŽ°è¿™äº›åŠŸèƒ½ã€‚åœ¨æ•´ä¸ªå†…æ ¸ä¸å¤åˆ¶ç›¸åŒçš„ä»£ç æ²¡æœ‰ä»·å€¼ã€‚ #ifdef å’Œé¢„å¤„ç† *************** -C预处ç†å™¨ä¼¼ä¹Žç»™ä¸€äº›C程åºå‘˜å¸¦æ¥äº†å¼ºå¤§çš„è¯±æƒ‘ï¼Œä»–ä»¬è®¤ä¸ºå®ƒæ˜¯ä¸€ç§æœ‰æ•ˆåœ°å°†å¤§é‡çµ -活性编ç åˆ°æºæ–‡ä»¶ä¸çš„æ–¹æ³•。但是预处ç†å™¨ä¸æ˜¯C,大é‡ä½¿ç”¨å®ƒä¼šå¯¼è‡´ä»£ç å¯¹å…¶ä»–äººæ¥ -说更难读å–,对编译器æ¥è¯´æ›´é𾿣€æŸ¥æ£ç¡®æ€§ã€‚大é‡çš„预处ç†å™¨å‡ 乎总是代ç 需è¦ä¸€äº› +C预处ç†å™¨ä¼¼ä¹Žç»™ä¸€äº›C程åºå‘˜å¸¦æ¥äº†å¼ºå¤§çš„诱惑,他们认为它是一ç§å°†å¤§é‡çµæ´»æ€§åŠ å…¥ +æºä»£ç ä¸çš„æ–¹æ³•。但是预处ç†å™¨ä¸æ˜¯C,大é‡ä½¿ç”¨å®ƒä¼šå¯¼è‡´ä»£ç 对其他人æ¥è¯´æ›´éš¾é˜…读, +对编译器æ¥è¯´æ›´é𾿣€æŸ¥æ£ç¡®æ€§ã€‚使用了大é‡é¢„处ç†å™¨å‡ 乎总是代ç 需è¦ä¸€äº› 清ç†å·¥ä½œçš„æ ‡å¿—。 -使用ifdefçš„æ¡ä»¶ç¼–è¯‘å®žé™…ä¸Šæ˜¯ä¸€ä¸ªå¼ºå¤§çš„åŠŸèƒ½ï¼Œå®ƒåœ¨å†…æ ¸ä¸ä½¿ç”¨ã€‚但是很少有人希望 -看到代ç 被大é‡åœ°æ’’上ifdefå—。作为一般规则,ifdef的使用应尽å¯èƒ½é™åˆ¶åœ¨å¤´æ–‡ä»¶ -ä¸ã€‚有æ¡ä»¶ç¼–译的代ç å¯ä»¥é™åˆ¶å‡½æ•°ï¼Œå¦‚果代ç ä¸å˜åœ¨ï¼Œè¿™äº›å‡½æ•°å°±ä¼šå˜æˆç©ºçš„ã€‚ç„¶åŽ -ç¼–è¯‘å™¨å°†æ‚„æ‚„åœ°ä¼˜åŒ–å¯¹ç©ºå‡½æ•°çš„è°ƒç”¨ã€‚ç»“æžœæ˜¯ä»£ç æ›´åŠ æ¸…æ™°ï¼Œæ›´å®¹æ˜“ç†è§£ã€‚ +使用#ifdefçš„æ¡ä»¶ç¼–è¯‘å®žé™…ä¸Šæ˜¯ä¸€ä¸ªå¼ºå¤§çš„åŠŸèƒ½ï¼Œå®ƒåœ¨å†…æ ¸ä¸ä½¿ç”¨ã€‚但是很少有人希望 +看到代ç 被铺满#ifdefå—。一般规定,ifdef的使用应尽å¯èƒ½é™åˆ¶åœ¨å¤´æ–‡ä»¶ä¸ã€‚æ¡ä»¶ +编译代ç å¯ä»¥é™åˆ¶å‡½æ•°ï¼Œå¦‚果代ç ä¸å˜åœ¨ï¼Œè¿™äº›å‡½æ•°å°±ç›´æŽ¥å˜æˆç©ºçš„。然åŽç¼–译器将 +æ‚„æ‚„åœ°ä¼˜åŒ–å¯¹ç©ºå‡½æ•°çš„è°ƒç”¨ã€‚ä½¿å¾—ä»£ç æ›´åŠ æ¸…æ™°ï¼Œæ›´å®¹æ˜“ç†è§£ã€‚ -C预处ç†å™¨å®å˜åœ¨è®¸å¤šå±é™©ï¼ŒåŒ…括å¯èƒ½å¯¹å…·æœ‰å‰¯ä½œç”¨ä¸”没有类型安全性的表达å¼è¿›è¡Œå¤š -é‡è¯„估。如果您试图定义å®ï¼Œè¯·è€ƒè™‘创建一个内è”函数。结果相åŒçš„代ç ï¼Œä½†æ˜¯å†…è” -函数更容易读å–,ä¸ä¼šå¤šæ¬¡è®¡ç®—其傿•°ï¼Œå¹¶ä¸”å…è®¸ç¼–è¯‘å™¨å¯¹å‚æ•°å’Œè¿”回值执行类型检查。 +C预处ç†å™¨å®å˜åœ¨è®¸å¤šå±é™©æ€§ï¼ŒåŒ…括å¯èƒ½å¯¹å…·æœ‰å‰¯ä½œç”¨ä¸”没有类型安全的表达å¼è¿›è¡Œå¤š +é‡è¯„估。如果您试图定义å®ï¼Œè¯·è€ƒè™‘创建一个内è”函数替代。结果相åŒçš„代ç ï¼Œå†…è” +函数更容易阅读,ä¸ä¼šå¤šæ¬¡è®¡ç®—其傿•°ï¼Œå¹¶ä¸”å…è®¸ç¼–è¯‘å™¨å¯¹å‚æ•°å’Œè¿”回值执行类型检查。 内è”函数 ******** ä¸è¿‡ï¼Œå†…è”函数本身也å˜åœ¨é£Žé™©ã€‚程åºå‘˜å¯ä»¥å€¾å¿ƒäºŽé¿å…函数调用和用内è”å‡½æ•°å¡«å……æº æ–‡ä»¶æ‰€å›ºæœ‰çš„æ•ˆçŽ‡ã€‚ç„¶è€Œï¼Œè¿™äº›åŠŸèƒ½å®žé™…ä¸Šä¼šé™ä½Žæ€§èƒ½ã€‚å› ä¸ºå®ƒä»¬çš„ä»£ç 在æ¯ä¸ªè°ƒç”¨ç«™ -点都被å¤åˆ¶ï¼Œæ‰€ä»¥å®ƒä»¬æœ€ç»ˆä¼šå¢žåŠ ç¼–è¯‘å†…æ ¸çš„å¤§å°ã€‚å过æ¥ï¼Œè¿™ä¼šå¯¹å¤„ç†å™¨çš„内å˜ç¼“å˜ -é€ æˆåŽ‹åŠ›ï¼Œä»Žè€Œå¤§å¤§é™ä½Žæ‰§è¡Œé€Ÿåº¦ã€‚通常,内è”函数应该éžå¸¸å°ï¼Œè€Œä¸”相对较少。毕竟, -å‡½æ•°è°ƒç”¨çš„æˆæœ¬å¹¶ä¸é«˜ï¼›å¤§é‡å†…è”函数的创建是过早优化的典型例å。 +点都被å¤åˆ¶ä¸€éï¼Œæ‰€ä»¥æœ€ç»ˆä¼šå¢žåŠ ç¼–è¯‘å†…æ ¸çš„å¤§å°ã€‚æ¤å¤–,这也对处ç†å™¨çš„内å˜ç¼“å˜ +é€ æˆåŽ‹åŠ›ï¼Œä»Žè€Œå¤§å¤§é™ä½Žæ‰§è¡Œé€Ÿåº¦ã€‚通常内è”函数应该éžå¸¸å°ï¼Œè€Œä¸”相对较少。毕竟 +å‡½æ•°è°ƒç”¨çš„æˆæœ¬å¹¶ä¸é«˜ï¼›å¤§é‡åˆ›å»ºå†…è”函数是过早优化的典型例å。 -一般æ¥è¯´ï¼Œå†…æ ¸ç¨‹åºå‘˜ä¼šå¿½ç•¥ç¼“å˜æ•ˆæžœï¼Œè¿™ä¼šå¸¦æ¥å±é™©ã€‚在开始的数æ®ç»“构课程ä¸ï¼Œç» -典的时间/空间æƒè¡¡é€šå¸¸ä¸é€‚ç”¨äºŽå½“ä»£ç¡¬ä»¶ã€‚ç©ºé—´å°±æ˜¯æ—¶é—´ï¼Œå› ä¸ºä¸€ä¸ªå¤§çš„ç¨‹åºæ¯”一个 +一般æ¥è¯´ï¼Œå†…æ ¸ç¨‹åºå‘˜ä¼šè‡ªå†’é£Žé™©å¿½ç•¥ç¼“å˜æ•ˆæžœã€‚在数æ®ç»“构课程开头ä¸çš„ç»å…¸ +æ—¶é—´/空间æƒè¡¡é€šå¸¸ä¸é€‚用于当代硬件。空间 *就是* æ—¶é—´ï¼Œå› ä¸ºä¸€ä¸ªå¤§çš„ç¨‹åºæ¯”一个 更紧凑的程åºè¿è¡Œå¾—慢。 -最近的编译器在决定一个给定函数是å¦åº”è¯¥è¢«å†…è”æ–¹é¢æ‰®æ¼”ç€è¶Šæ¥è¶Šç§¯æžçš„角色。 -å› æ¤ï¼Œâ€œinlineâ€å…³é”®å—的自由放置å¯èƒ½ä¸ä»…仅是过度的,它也å¯èƒ½æ˜¯æ— 关的。 +较新的编译器越æ¥è¶Šæ¿€è¿›åœ°å†³å®šä¸€ä¸ªç»™å®šå‡½æ•°æ˜¯å¦åº”该内è”ã€‚å› æ¤ï¼Œé𿄿”¾ç½®ä½¿ç”¨ +“inlineâ€å…³é”®å—å¯èƒ½ä¸ä»…仅是过度的,也å¯èƒ½æ˜¯æ— 用的。 é” ** -2006å¹´5月,“deviceescapeâ€ç½‘ç»œå †æ ˆåœ¨GPL下å‘å¸ƒï¼Œå¹¶è¢«çº³å…¥ä¸»çº¿å†…æ ¸ã€‚è¿™æ˜¯ä¸€ä¸ªå— -欢迎的消æ¯ï¼›å¯¹Linux䏿— 线网络的支æŒå……å…¶é‡è¢«è®¤ä¸ºæ˜¯ä¸åˆæ ¼çš„,而deviceescape -å †æ ˆæä¾›äº†ä¿®å¤è¿™ç§æƒ…况的承诺。然而,直到2007å¹´6月(2.6.22ï¼‰ï¼Œè¿™æ®µä»£ç æ‰çœŸ +2006å¹´5月,“deviceescapeâ€ç½‘ç»œå †æ ˆåœ¨å‰å‘¼åŽæ‹¥ä¸‹ä»¥GPLå‘å¸ƒï¼Œå¹¶è¢«çº³å…¥ä¸»çº¿å†…æ ¸ã€‚ +è¿™æ˜¯ä¸€ä¸ªå—æ¬¢è¿Žçš„æ¶ˆæ¯ï¼›Linuxä¸å¯¹æ— 线网络的支æŒå……å…¶é‡è¢«è®¤ä¸ºæ˜¯ä¸åˆæ ¼çš„,而 +Deviceescapeå †æ ˆæ‰¿è¯ºä¿®å¤è¿™ç§æƒ…况。然而直到2007å¹´6月(2.6.22ï¼‰ï¼Œè¿™æ®µä»£ç æ‰çœŸ æ£è¿›å…¥ä¸»çº¿ã€‚å‘生了什么? -è¿™æ®µä»£ç æ˜¾ç¤ºäº†è®¸å¤šé—é—¨é€ è½¦çš„è¿¹è±¡ã€‚ä½†ä¸€ä¸ªç‰¹åˆ«å¤§çš„é—®é¢˜æ˜¯ï¼Œå®ƒå¹¶ä¸æ˜¯è®¾è®¡ç”¨äºŽå¤š -处ç†å™¨ç³»ç»Ÿã€‚在åˆå¹¶è¿™ä¸ªç½‘ç»œå †æ ˆï¼ˆçŽ°åœ¨ç§°ä¸ºmac80211)之å‰ï¼Œéœ€è¦å¯¹å…¶è¿›è¡Œä¸€ä¸ªé” -æ–¹æ¡ˆçš„æ”¹é€ ã€‚ +这段代ç 出现了许多é—é—¨é€ è½¦çš„è¿¹è±¡ã€‚ä½†ä¸€ä¸ªå¤§éº»çƒ¦æ˜¯ï¼Œå®ƒå¹¶ä¸æ˜¯ä¸ºå¤šå¤„ç†å™¨ç³»ç»Ÿè€Œ +设计。在åˆå¹¶è¿™ä¸ªç½‘ç»œå †æ ˆï¼ˆçŽ°åœ¨ç§°ä¸ºmac80211)之å‰ï¼Œéœ€è¦å¯¹å…¶è¿›è¡Œä¸€ä¸ªé”方案的 +æ”¹é€ ã€‚ 曾ç»ï¼ŒLinuxå†…æ ¸ä»£ç å¯ä»¥åœ¨ä¸è€ƒè™‘多处ç†å™¨ç³»ç»Ÿæ‰€å¸¦æ¥çš„并呿€§é—®é¢˜çš„æƒ…况下进行 -å¼€å‘ã€‚ç„¶è€Œï¼ŒçŽ°åœ¨ï¼Œè¿™ä¸ªæ–‡ä»¶æ˜¯å†™åœ¨åŒæ ¸ç¬”记本电脑上的。å³ä½¿åœ¨å•处ç†å™¨ç³»ç»Ÿä¸Šï¼Œ +å¼€å‘ã€‚ç„¶è€ŒçŽ°åœ¨ï¼Œè¿™ä¸ªæ–‡æ¡£å°±æ˜¯åœ¨åŒæ ¸ç¬”记本电脑上写的。å³ä½¿åœ¨å•处ç†å™¨ç³»ç»Ÿä¸Šï¼Œ 为æé«˜å“应能力所åšçš„工作也会æé«˜å†…æ ¸å†…çš„å¹¶å‘æ€§æ°´å¹³ã€‚ç¼–å†™å†…æ ¸ä»£ç 而ä¸è€ƒè™‘é” -的日åå·²ç»è¿‡åŽ»å¾ˆé•¿äº†ã€‚ +çš„æ—¥åæ—©å·²è¿œåŽ»ã€‚ å¯ä»¥ç”±å¤šä¸ªçº¿ç¨‹å¹¶å‘访问的任何资æºï¼ˆæ•°æ®ç»“æž„ã€ç¡¬ä»¶å¯„å˜å™¨ç‰ï¼‰å¿…须由é”ä¿æŠ¤ã€‚æ–° -的代ç 应该记ä½è¿™ä¸€è¦æ±‚ï¼›äº‹åŽæ”¹è£…锿˜¯ä¸€é¡¹ç›¸å½“å›°éš¾çš„ä»»åŠ¡ã€‚å†…æ ¸å¼€å‘人员应该花 -时间充分了解å¯ç”¨çš„é”原è¯ï¼Œä»¥ä¾¿ä¸ºä½œä¸šé€‰æ‹©æ£ç¡®çš„å·¥å…·ã€‚æ˜¾ç¤ºå¯¹å¹¶å‘æ€§ç¼ºä¹å…³æ³¨çš„ -代ç 进入主线将很困难。 +的代ç åº”è¯¥è°¨è®°è¿™ä¸€è¦æ±‚;事åŽä¿®æ”¹é”æ˜¯ä¸€é¡¹ç›¸å½“å›°éš¾çš„ä»»åŠ¡ã€‚å†…æ ¸å¼€å‘人员应该花 +时间充分了解å¯ç”¨çš„é”原è¯ï¼Œä»¥ä¾¿ä¸ºå·¥ä½œé€‰æ‹©æ£ç¡®çš„å·¥å…·ã€‚å¯¹å¹¶å‘æ€§ç¼ºä¹å…³æ³¨çš„代ç +很难进入主线。 回归 **** -最åŽä¸€ä¸ªå€¼å¾—一æçš„å±é™©æ˜¯ï¼šå®ƒå¯èƒ½ä¼šå¼•起改å˜ï¼ˆè¿™å¯èƒ½ä¼šå¸¦æ¥å¾ˆå¤§çš„æ”¹è¿›ï¼‰ï¼Œä»Žè€Œ -导致现有用户的æŸäº›ä¸œè¥¿ä¸æ–。这ç§å˜åŒ–被称为“回归â€ï¼Œå›žå½’å·²ç»æˆä¸ºä¸»çº¿å†…æ ¸æœ€ä¸ -å—æ¬¢è¿Žçš„。除少数例外情况外,如果回归ä¸èƒ½åŠæ—¶ä¿®æ£ï¼Œä¼šå¯¼è‡´å›žå½’çš„å˜åŒ–å°†è¢«å–æ¶ˆã€‚ -最好首先é¿å…回归。 +最åŽä¸€ä¸ªå€¼å¾—一æçš„å±é™©æ˜¯å›žå½’:它å¯èƒ½ä¼šå¼•起导致现有用户的æŸäº›ä¸œè¥¿ä¸æ–çš„æ”¹å˜ +(这也å¯èƒ½ä¼šå¸¦æ¥å¾ˆå¤§çš„æ”¹è¿›ï¼‰ã€‚è¿™ç§å˜åŒ–被称为“回归â€ï¼Œå›žå½’å·²ç»æˆä¸ºä¸»çº¿å†…æ ¸ +最ä¸å—欢迎的问题。除了少数例外情况,如果回归ä¸èƒ½åŠæ—¶ä¿®æ£ï¼Œä¼šå¯¼è‡´å›žå½’的修改 +å°†è¢«å–æ¶ˆã€‚最好首先é¿å…回归å‘生。 -人们常常争论,如果回归让更多人å¯ä»¥å·¥ä½œï¼Œè¿œè¶…过产生问题,那么回归是åˆç†çš„。 -å¦‚æžœå®ƒç ´å的一个系统å´ä¸ºåä¸ªç³»ç»Ÿå¸¦æ¥æ–°çš„功能,为什么ä¸è¿›è¡Œæ›´æ”¹å‘¢ï¼Ÿ2007å¹´7月, +人们常常争论,如果回归带æ¥çš„功能远超过产生的问题,那么回归是å¦ä¸ºå¯æŽ¥å—的。 +å¦‚æžœå®ƒç ´å了一个系统å´ä¸ºåä¸ªç³»ç»Ÿå¸¦æ¥æ–°çš„åŠŸèƒ½ï¼Œä¸ºä½•ä¸æ”¹æ”¹æ€åº¦å‘¢ï¼Ÿ2007å¹´7月, Linuså¯¹è¿™ä¸ªé—®é¢˜ç»™å‡ºäº†æœ€ä½³ç”æ¡ˆ: :: - 所以我们ä¸ä¼šé€šè¿‡å¼•入新问题æ¥ä¿®å¤é”™è¯¯ã€‚é‚£æ ·çš„è°Žè¨€å¾ˆç–¯ç‹‚ï¼Œæ²¡æœ‰äººçŸ¥é“ - ä½ æ˜¯å¦çœŸçš„æœ‰è¿›å±•。是å‰è¿›ä¸¤æ¥ï¼ŒåŽé€€ä¸€æ¥ï¼Œè¿˜æ˜¯å‘å‰ä¸€æ¥ï¼Œå‘åŽä¸¤æ¥ï¼Ÿ + + 所以我们ä¸ä¼šé€šè¿‡å¼•入新问题æ¥ä¿®å¤é”™è¯¯ã€‚è¿™ç§æ–¹å¼æ˜¯é ä¸ä½çš„ï¼Œæ²¡äººçŸ¥é“ + 是å¦çœŸçš„æœ‰è¿›å±•。是å‰è¿›ä¸¤æ¥ã€åŽé€€ä¸€æ¥ï¼Œè¿˜æ˜¯å‰è¿›ä¸€æ¥ã€åŽé€€ä¸¤æ¥ï¼Ÿ (http://lwn.net/articles/243460/) -一ç§ç‰¹åˆ«ä¸å—欢迎的回归类型是用户空间ABI的任何å˜åŒ–。一旦接å£è¢«å¯¼å‡ºåˆ°ç”¨æˆ·ç©ºé—´ï¼Œ +特别ä¸å—欢迎的一ç§å›žå½’类型是用户空间ABI的任何å˜åŒ–。一旦接å£è¢«å¯¼å‡ºåˆ°ç”¨æˆ·ç©ºé—´ï¼Œ å°±å¿…é¡»æ— é™æœŸåœ°æ”¯æŒå®ƒã€‚这一事实使得用户空间接å£çš„åˆ›å»ºç‰¹åˆ«å…·æœ‰æŒ‘æˆ˜æ€§ï¼šå› ä¸ºå®ƒä»¬ -ä¸èƒ½ä»¥ä¸å…¼å®¹çš„æ–¹å¼è¿›è¡Œæ›´æ”¹ï¼Œæ‰€ä»¥å¿…须第一次æ£ç¡®åœ°è¿›è¡Œæ›´æ”¹ã€‚å› æ¤ï¼Œç”¨æˆ·ç©ºé—´ç•Œé¢ -总是需è¦å¤§é‡çš„æ€è€ƒã€æ¸…晰的文档和广泛的审查。 +ä¸èƒ½ä»¥ä¸å…¼å®¹çš„æ–¹å¼è¿›è¡Œæ›´æ”¹ï¼Œæ‰€ä»¥å¿…é¡»ä¸€æ¬¡å°±å¯¹ã€‚å› æ¤ï¼Œç”¨æˆ·ç©ºé—´æŽ¥å£æ€»æ˜¯éœ€è¦å¤§é‡ +çš„æ€è€ƒã€æ¸…晰的文档和广泛的审查。 ä»£ç æ£€æŸ¥å·¥å…· @@ -157,13 +162,13 @@ Linuså¯¹è¿™ä¸ªé—®é¢˜ç»™å‡ºäº†æœ€ä½³ç”æ¡ˆ: 至少目å‰ï¼Œç¼–å†™æ— é”™è¯¯ä»£ç ä»ç„¶æ˜¯æˆ‘们ä¸å¾ˆå°‘äººèƒ½è¾¾åˆ°çš„ç†æƒ³çжæ€ã€‚ä¸è¿‡ï¼Œæˆ‘ä»¬å¸Œæœ›åš çš„æ˜¯ï¼Œåœ¨ä»£ç è¿›å…¥ä¸»çº¿å†…æ ¸ä¹‹å‰ï¼Œå°½å¯èƒ½å¤šåœ°æ•获并修å¤è¿™äº›é”™è¯¯ã€‚为æ¤ï¼Œå†…æ ¸å¼€å‘人 -员已ç»ç»„装了一系列令人å°è±¡æ·±åˆ»çš„工具,å¯ä»¥è‡ªåЍæ•获å„ç§å„æ ·çš„æ¨¡ç³Šé—®é¢˜ã€‚è®¡ç®—æœº +å‘˜å·²ç»æä¾›äº†ä¸€ç³»åˆ—ä»¤äººå°è±¡æ·±åˆ»çš„工具,å¯ä»¥è‡ªåЍæ•获å„ç§å„æ ·çš„éšè—问题。计算机 å‘现的任何问题都是一个以åŽä¸ä¼šå›°æ‰°ç”¨æˆ·çš„é—®é¢˜ï¼Œå› æ¤ï¼Œåªè¦æœ‰å¯èƒ½ï¼Œå°±åº”该使用 自动化工具。 -第一æ¥åªæ˜¯æ³¨æ„编译器产生的è¦å‘Šã€‚当代版本的GCCå¯ä»¥æ£€æµ‹ï¼ˆå¹¶è¦å‘Šï¼‰å¤§é‡æ½œåœ¨é”™è¯¯ã€‚ -通常,这些è¦å‘Šéƒ½æŒ‡å‘真æ£çš„问题。æäº¤ä»¥ä¾›å®¡é˜…的代ç 通常ä¸ä¼šäº§ç”Ÿä»»ä½•编译器è¦å‘Šã€‚ -在消除è¦å‘Šæ—¶ï¼Œæ³¨æ„了解真æ£çš„åŽŸå› ï¼Œå¹¶å°½é‡é¿å…“修å¤â€ï¼Œä½¿è¦å‘Šæ¶ˆå¤±è€Œä¸è§£å†³å…¶åŽŸå› ã€‚ +ç¬¬ä¸€æ¥æ˜¯æ³¨æ„编译器产生的è¦å‘Šã€‚当å‰ç‰ˆæœ¬çš„GCCå¯ä»¥æ£€æµ‹ï¼ˆå¹¶è¦å‘Šï¼‰å¤§é‡æ½œåœ¨é”™è¯¯ã€‚ +通常,这些è¦å‘Šéƒ½æŒ‡å‘真æ£çš„问题。æäº¤ä»¥ä¾›å®¡é˜…的代ç 一般ä¸ä¼šäº§ç”Ÿä»»ä½•编译器è¦å‘Šã€‚ +在消除è¦å‘Šæ—¶ï¼Œæ³¨æ„了解真æ£çš„åŽŸå› ï¼Œå¹¶å°½é‡é¿å…仅“修å¤â€ä½¿è¦å‘Šæ¶ˆå¤±è€Œä¸è§£å†³å…¶åŽŸå› ã€‚ 请注æ„ï¼Œå¹¶éžæ‰€æœ‰ç¼–译器è¦å‘Šéƒ½é»˜è®¤å¯ç”¨ã€‚使用“make KCFLAGS=-Wâ€æž„å»ºå†…æ ¸ä»¥ 获得完整集åˆã€‚ @@ -172,45 +177,43 @@ Linuså¯¹è¿™ä¸ªé—®é¢˜ç»™å‡ºäº†æœ€ä½³ç”æ¡ˆ: åèœå•ä¸ã€‚å¯¹äºŽä»»ä½•ç”¨äºŽå¼€å‘æˆ–æµ‹è¯•ç›®çš„çš„å†…æ ¸ï¼Œéƒ½åº”è¯¥å¯ç”¨å…¶ä¸å‡ 个选项。特别是, 您应该打开: - - å¯ç”¨ ENABLE_MUST_CHECK and FRAME_WARN 以获得一组é¢å¤–çš„è¦å‘Šï¼Œä»¥è§£å†³ä½¿ç”¨ä¸ - 推èä½¿ç”¨çš„æŽ¥å£æˆ–忽略函数的é‡è¦è¿”回值ç‰é—®é¢˜ã€‚这些è¦å‘Šç”Ÿæˆçš„输出å¯èƒ½æ˜¯å†—é•¿ - 的,但您ä¸å¿…担心æ¥è‡ªå†…æ ¸å…¶ä»–éƒ¨åˆ†çš„è¦å‘Šã€‚ + - FRAME_WARN 获å–大于给定数é‡çš„å †æ ˆå¸§çš„è¦å‘Šã€‚ + 这些è¦å‘Šç”Ÿæˆçš„输出å¯èƒ½æ¯”较冗长,但您ä¸å¿…担心æ¥è‡ªå†…æ ¸å…¶ä»–éƒ¨åˆ†çš„è¦å‘Šã€‚ - - DEBUG_OBJECTS å°†æ·»åŠ ä»£ç ï¼Œä»¥è·Ÿè¸ªå†…æ ¸åˆ›å»ºçš„å„ç§å¯¹è±¡çš„ç”Ÿå˜æœŸï¼Œå¹¶åœ¨å‡ºçŽ°é—®é¢˜æ—¶ - å‘出è¦å‘Šã€‚å¦‚æžœè¦æ·»åŠ åˆ›å»ºï¼ˆå’Œå¯¼å‡ºï¼‰è‡ªå·±çš„å¤æ‚对象的åç³»ç»Ÿï¼Œè¯·è€ƒè™‘æ·»åŠ å¯¹å¯¹è±¡ - 调试基础结构的支æŒã€‚ + - DEBUG_OBJECTS å°†æ·»åŠ ä»£ç ä»¥è·Ÿè¸ªå†…æ ¸åˆ›å»ºçš„å„ç§å¯¹è±¡çš„生命周期,并在出现问题 + æ—¶å‘出è¦å‘Šã€‚å¦‚æžœä½ è¦æ·»åŠ åˆ›å»ºï¼ˆå’Œå¯¼å‡ºï¼‰å…³äºŽå…¶è‡ªå·±çš„å¤æ‚对象的å系统,请 + 考虑打开对象调试基础结构的支æŒã€‚ - DEBUG_SLAB å¯ä»¥å‘现å„ç§å†…å˜åˆ†é…和使用错误;它应该用于大多数开å‘å†…æ ¸ã€‚ - - DEBUG_SPINLOCK, DEBUG_ATOMIC_SLEEP and DEBUG_MUTEXES 会å‘现许多常è§çš„ - é”定错误. + - DEBUG_SPINLOCK, DEBUG_ATOMIC_SLEEP å’Œ DEBUG_MUTEXES 会å‘现许多常è§çš„ + é”错误。 -还有很多其他调试选项,其ä¸ä¸€äº›å°†åœ¨ä¸‹é¢è®¨è®ºã€‚å…¶ä¸ä¸€äº›å…·æœ‰æ˜¾è‘—的性能影å“,ä¸åº” -一直使用。但是,在å¦ä¹ å¯ç”¨é€‰é¡¹ä¸ŠèŠ±è´¹çš„ä¸€äº›æ—¶é—´å¯èƒ½ä¼šåœ¨çŸæœŸå†…得到多次回报。 +还有很多其他调试选项,其ä¸ä¸€äº›å°†åœ¨ä¸‹é¢è®¨è®ºã€‚å…¶ä¸ä¸€äº›æœ‰æ˜¾è‘—的性能影å“,ä¸åº” +一直使用。在å¦ä¹ å¯ç”¨é€‰é¡¹ä¸ŠèŠ±è´¹ä¸€äº›æ—¶é—´ï¼Œå¯èƒ½ä¼šåœ¨çŸæœŸå†…得到许多回报。 -å…¶ä¸ä¸€ä¸ªè¾ƒé‡çš„调试工具是é”定检查器或“lockdepâ€ã€‚è¯¥å·¥å…·å°†è·Ÿè¸ªç³»ç»Ÿä¸æ¯ä¸ªé” +å…¶ä¸ä¸€ä¸ªè¾ƒé‡çš„è°ƒè¯•å·¥å…·æ˜¯é”æ£€æŸ¥å™¨æˆ–“lockdepâ€ã€‚è¯¥å·¥å…·å°†è·Ÿè¸ªç³»ç»Ÿä¸æ¯ä¸ªé” (spinlock或mutex)的获å–和释放ã€èŽ·å–é”的相对顺åºã€å½“å‰ä¸æ–环境ç‰ç‰ã€‚ç„¶åŽï¼Œ -它å¯ä»¥ç¡®ä¿æ€»æ˜¯ä»¥ç›¸åŒçš„顺åºèŽ·å–é”,相åŒçš„䏿–å‡è®¾é€‚用于所有情况,ç‰ç‰ã€‚æ¢å¥è¯ -说,lockdepå¯ä»¥æ‰¾åˆ°è®¸å¤šåœºæ™¯ï¼Œåœ¨è¿™äº›åœºæ™¯ä¸ï¼Œç³»ç»Ÿå¾ˆå°‘会æ»é”。在部署的系统ä¸ï¼Œ -è¿™ç§é—®é¢˜å¯èƒ½ä¼šå¾ˆç—›è‹¦ï¼ˆå¯¹äºŽå¼€å‘人员和用户而言);LockDepå…许æå‰ä»¥è‡ªåŠ¨æ–¹å¼ -å‘çŽ°é—®é¢˜ã€‚å…·æœ‰ä»»ä½•ç±»åž‹çš„éžæ™®é€šé”定的代ç 在æäº¤åŒ…å«å‰åº”在å¯ç”¨lockdep的情况 -下è¿è¡Œã€‚ +它å¯ä»¥ç¡®ä¿æ€»æ˜¯ä»¥ç›¸åŒçš„顺åºèŽ·å–é”,相åŒçš„䏿–å‡è®¾é€‚用于所有情况ç‰ç‰ã€‚æ¢å¥è¯ +说,lockdepå¯ä»¥æ‰¾åˆ°è®¸å¤šå¯¼è‡´ç³»ç»Ÿæ»é”的场景。在部署的系统ä¸ï¼Œè¿™ç§é—®é¢˜å¯èƒ½ä¼š +很痛苦(对于开å‘人员和用户而言);LockDepå…许æå‰ä»¥è‡ªåŠ¨æ–¹å¼å‘现问题。具有 +ä»»ä½•ç±»åž‹çš„éžæ™®é€šé”的代ç 在æäº¤åˆå¹¶å‰åº”在å¯ç”¨lockdep的情况下è¿è¡Œæµ‹è¯•。 ä½œä¸ºä¸€ä¸ªå‹¤å¥‹çš„å†…æ ¸ç¨‹åºå‘˜ï¼Œæ¯«æ— 疑问,您将检查任何å¯èƒ½å¤±è´¥çš„æ“ä½œï¼ˆå¦‚å†…å˜åˆ†é…) -的返回状æ€ã€‚然而,事实上,最终的故障æ¢å¤è·¯å¾„å¯èƒ½å®Œå…¨æ²¡æœ‰ç»è¿‡æµ‹è¯•。未测试的 -代ç å¾€å¾€ä¼šè¢«ç ´å;如果所有这些错误处ç†è·¯å¾„éƒ½è¢«æ‰§è¡Œäº†å‡ æ¬¡ï¼Œé‚£ä¹ˆæ‚¨å¯èƒ½å¯¹ä»£ç +的返回状æ€ã€‚然而,事实上,最终的故障å¤çŽ°è·¯å¾„å¯èƒ½å®Œå…¨æ²¡æœ‰ç»è¿‡æµ‹è¯•。未测试的 +代ç 往往会出问题;如果所有这些错误处ç†è·¯å¾„éƒ½è¢«æ‰§è¡Œäº†å‡ æ¬¡ï¼Œé‚£ä¹ˆæ‚¨å¯èƒ½å¯¹ä»£ç 更有信心。 å†…æ ¸æä¾›äº†ä¸€ä¸ªå¯ä»¥åšåˆ°è¿™ä¸€ç‚¹çš„错误注入框架,特别是在涉åŠå†…å˜åˆ†é…的情况下。 -å¯ç”¨æ•…障注入åŽï¼Œå†…å˜åˆ†é…çš„å¯é…置百分比将失败;这些失败å¯ä»¥é™åˆ¶åœ¨ç‰¹å®šçš„代ç +å¯ç”¨æ•…障注入åŽï¼Œå†…å˜åˆ†é…çš„å¯é…置失败的百分比;这些失败å¯ä»¥é™å®šåœ¨ç‰¹å®šçš„代ç 范围内。在å¯ç”¨äº†æ•…障注入的情况下è¿è¡Œï¼Œç¨‹åºå‘˜å¯ä»¥çœ‹åˆ°å½“情况æ¶åŒ–时代ç å¦‚ä½•å“ åº”ã€‚æœ‰å…³å¦‚ä½•ä½¿ç”¨æ¤å·¥å…·çš„详细信æ¯ï¼Œè¯·å‚阅 Documentation/fault-injection/fault-injection.rst。 -使用“sparseâ€é™æ€åˆ†æžå·¥å…·å¯ä»¥å‘现其他类型的错误。对于sparse,å¯ä»¥è¦å‘Šç¨‹åºå‘˜ -ç”¨æˆ·ç©ºé—´å’Œå†…æ ¸ç©ºé—´åœ°å€ä¹‹é—´çš„æ··æ·†ã€big endianå’Œsmall endianæ•°é‡çš„æ··åˆã€åœ¨éœ€ -è¦ä¸€ç»„使 ‡å¿—çš„åœ°æ–¹ä¼ é€’æ•´æ•°å€¼ç‰ç‰ã€‚sparseå¿…é¡»å•独安装(å¦‚æžœæ‚¨çš„åˆ†å‘æœåŠ¡å™¨æ²¡ -有将其打包,å¯ä»¥åœ¨ https://sparse.wiki.kernel.org/index.php/Main_page)找到, +“sparseâ€é™æ€åˆ†æžå·¥å…·å¯ä»¥å‘现其他类型的错误。sparseå¯ä»¥è¦å‘Šç¨‹åºå‘˜ç”¨æˆ·ç©ºé—´ +å’Œå†…æ ¸ç©ºé—´åœ°å€ä¹‹é—´çš„æ··æ·†ã€å¤§ç«¯åºä¸Žå°ç«¯åºçš„æ··æ·†ã€åœ¨éœ€è¦ä¸€ç»„使 ‡å¿—çš„åœ°æ–¹ä¼ é€’ +整数值ç‰ç‰ã€‚sparseå¿…é¡»å•独安装(å¦‚æžœæ‚¨çš„åˆ†å‘æœåŠ¡å™¨æ²¡æœ‰å°†å…¶æ‰“åŒ…ï¼Œ +å¯ä»¥åœ¨ https://sparse.wiki.kernel.org/index.php/Main_page 找到), ç„¶åŽå¯ä»¥é€šè¿‡åœ¨make命令䏿·»åŠ â€œC=1â€åœ¨ä»£ç 上è¿è¡Œå®ƒã€‚ “Coccinelleâ€å·¥å…· :ref:`http://coccinelle.lip6.fr/ <devtools_coccinelle>` @@ -221,8 +224,8 @@ scripts/coccinelleç›®å½•ä¸‹å·²ç»æ‰“åŒ…äº†ç›¸å½“å¤šçš„å†…æ ¸â€œè¯ä¹‰è¡¥ä¸â€ 其他类型的å¯ç§»æ¤æ€§é”™è¯¯æœ€å¥½é€šè¿‡ä¸ºå…¶ä»–ä½“ç³»ç»“æž„ç¼–è¯‘ä»£ç æ¥å‘现。如果没有S/390系统 -或Blackfin开呿¿ï¼Œæ‚¨ä»ç„¶å¯ä»¥æ‰§è¡Œç¼–译æ¥éª¤ã€‚å¯ä»¥åœ¨ä»¥ä¸‹ä½ç½®æ‰¾åˆ°ä¸€ç»„用于x86系统的 -大型交å‰ç¼–译器: +或Blackfin开呿¿ï¼Œæ‚¨ä»ç„¶å¯ä»¥æ‰§è¡Œç¼–译æ¥éª¤ã€‚å¯ä»¥åœ¨ä»¥ä¸‹ä½ç½®æ‰¾åˆ°ä¸€å¤§å †ç”¨äºŽx86系统的 +交å‰ç¼–译器: https://www.kernel.org/pub/tools/crosstool/ @@ -233,22 +236,22 @@ scripts/coccinelleç›®å½•ä¸‹å·²ç»æ‰“åŒ…äº†ç›¸å½“å¤šçš„å†…æ ¸â€œè¯ä¹‰è¡¥ä¸â€ æ–‡æ¡£é€šå¸¸æ¯”å†…æ ¸å¼€å‘规则更为例外。å³ä¾¿å¦‚æ¤ï¼Œè¶³å¤Ÿçš„æ–‡æ¡£å°†æœ‰åŠ©äºŽç®€åŒ–å°†æ–°ä»£ç åˆå¹¶ åˆ°å†…æ ¸ä¸çš„过程,使其他开å‘人员的生活更轻æ¾ï¼Œå¹¶å¯¹æ‚¨çš„用户有所帮助。在许多情况 -ä¸‹ï¼Œæ–‡ä»¶çš„æ·»åŠ å·²åŸºæœ¬ä¸Šæˆä¸ºå¼ºåˆ¶æ€§çš„。 +ä¸‹ï¼Œæ·»åŠ æ–‡æ¡£å·²åŸºæœ¬ä¸Šæ˜¯å¼ºåˆ¶æ€§çš„ã€‚ 任何补ä¸çš„第一个文档是其关è”çš„å˜æ›´æ—¥å¿—。日志æ¡ç›®åº”该æè¿°æ£åœ¨è§£å†³çš„问题ã€è§£å†³ 方案的形å¼ã€å¤„ç†è¡¥ä¸çš„人员ã€å¯¹æ€§èƒ½çš„任何相关影å“,以åŠç†è§£è¡¥ä¸å¯èƒ½éœ€è¦çš„任何 -其他内容。确ä¿changelog说明了为什么补ä¸å€¼å¾—应用;大é‡å¼€å‘人员未能æä¾›è¿™äº›ä¿¡æ¯ã€‚ +其他内容。确ä¿å˜æ›´æ—¥å¿—说明了*为什么*è¡¥ä¸å€¼å¾—应用;大é‡å¼€å‘者未能æä¾›è¿™äº›ä¿¡æ¯ã€‚ -ä»»ä½•æ·»åŠ æ–°ç”¨æˆ·ç©ºé—´ç•Œé¢çš„代ç (包括新的sysfs或/proc文件)都应该包å«è¯¥ç•Œé¢çš„ -文档,该文档使用户空间开å‘人员能够知é“他们在使用什么。请å‚阅 -Documentation/ABI/READMEï¼Œäº†è§£å¦‚ä½•æ ¼å¼åŒ–æ¤æ–‡æ¡£ä»¥åŠéœ€è¦æä¾›å“ªäº›ä¿¡æ¯ã€‚ +ä»»ä½•æ·»åŠ æ–°ç”¨æˆ·ç©ºé—´æŽ¥å£çš„代ç ——包括新的sysfs或/proc文件——都应该包å«è¯¥æŽ¥å£ +的文档,该文档使用户空间开å‘人员能够知é“他们在使用什么。请å‚阅 +Documentation/ABI/READMEï¼Œäº†è§£å¦‚ä½•æ¤æ–‡æ¡£æ ¼å¼ä»¥åŠéœ€è¦æä¾›å“ªäº›ä¿¡æ¯ã€‚ -文件 :ref:`Documentation/admin-guide/kernel-parameters.rst <kernelparameters>` -æè¿°äº†å†…æ ¸çš„æ‰€æœ‰å¼•å¯¼æ—¶é—´å‚æ•°ã€‚ä»»ä½•æ·»åŠ æ–°å‚æ•°çš„è¡¥ä¸éƒ½åº”该å‘è¯¥æ–‡ä»¶æ·»åŠ é€‚å½“çš„ +文档 :ref:`Documentation/admin-guide/kernel-parameters.rst <kernelparameters>` +æè¿°äº†å†…æ ¸çš„æ‰€æœ‰å¼•å¯¼æ—¶é—´å‚æ•°ã€‚ä»»ä½•æ·»åŠ æ–°å‚æ•°çš„è¡¥ä¸éƒ½åº”该å‘è¯¥æ–‡æ¡£æ·»åŠ é€‚å½“çš„ æ¡ç›®ã€‚ -任何新的é…置选项都必须附有帮助文本,帮助文本清楚地解释了这些选项以åŠç”¨æˆ·å¯èƒ½ -希望何时选择它们。 +任何新的é…置选项都必须附有帮助文本,帮助文本需清楚地解释这些选项以åŠç”¨æˆ·å¯èƒ½ +希望何时使用它们。 许多å系统的内部APIä¿¡æ¯é€šè¿‡ä¸“é—¨æ ¼å¼åŒ–的注释进行记录;这些注释å¯ä»¥é€šè¿‡ “kernel-docâ€è„šæœ¬ä»¥å¤šç§æ–¹å¼æå–å’Œæ ¼å¼åŒ–。如果您在具有kerneldoc注释的åç³»ç»Ÿä¸ @@ -257,31 +260,31 @@ Documentation/ABI/READMEï¼Œäº†è§£å¦‚ä½•æ ¼å¼åŒ–æ¤æ–‡æ¡£ä»¥åŠéœ€è¦æä¾›å“ª æ¥è¯´æ˜¯ä¸€ä¸ªæœ‰ç”¨çš„æ´»åŠ¨ã€‚è¿™äº›æ³¨é‡Šçš„æ ¼å¼ä»¥åŠå¦‚何创建kerneldoc模æ¿çš„一些信æ¯å¯ä»¥åœ¨ :ref:`Documentation/doc-guide/ <doc_guide>` 上找到。 -任何阅读大é‡çŽ°æœ‰å†…æ ¸ä»£ç 的人都会注æ„到,注释的缺失往往是最值得注æ„的。å†ä¸€æ¬¡ï¼Œ -对新代ç 的期望比过去更高;åˆå¹¶æœªæ³¨é‡Šçš„代ç å°†æ›´åŠ å›°éš¾ã€‚è¿™å°±æ˜¯è¯´ï¼Œäººä»¬å‡ ä¹Žä¸å¸Œæœ› -用è¯è¨€æ³¨é‡Šä»£ç ã€‚ä»£ç æœ¬èº«åº”该是å¯è¯»çš„,注释解释了更微妙的方é¢ã€‚ +任何阅读大é‡çŽ°æœ‰å†…æ ¸ä»£ç 的人都会注æ„到,注释的缺失往往是最值得注æ„çš„ã€‚åŒæ—¶ï¼Œ +对新代ç çš„è¦æ±‚比过去更高;åˆå¹¶æœªæ³¨é‡Šçš„代ç å°†æ›´åŠ å›°éš¾ã€‚è¿™å°±æ˜¯è¯´ï¼Œäººä»¬å¹¶ä¸æœŸæœ› +详细注释的代ç ã€‚ä»£ç æœ¬èº«åº”该是自解释的,注释é˜é‡Šäº†æ›´å¾®å¦™çš„æ–¹é¢ã€‚ æŸäº›äº‹æƒ…应该总是被注释。使用内å˜å±éšœæ—¶ï¼Œåº”附上一行文å—,解释为什么需è¦è®¾ç½®å†…å˜ -å±éšœã€‚æ•°æ®ç»“构的é”定规则通常需è¦åœ¨æŸä¸ªåœ°æ–¹è§£é‡Šã€‚一般æ¥è¯´ï¼Œä¸»è¦æ•°æ®ç»“构需è¦å…¨é¢ -的文档。应该指出å•独代ç ä½ä¹‹é—´ä¸æ˜Žæ˜¾çš„ä¾èµ–性。任何å¯èƒ½è¯±ä½¿ä»£ç 看门人进行错误的 -“清ç†â€çš„事情都需è¦ä¸€ä¸ªæ³¨é‡Šæ¥è¯´æ˜Žä¸ºä»€ä¹ˆè¦è¿™æ ·åšã€‚ç‰ç‰ã€‚ +å±éšœã€‚æ•°æ®ç»“构的é”规则通常需è¦åœ¨æŸä¸ªåœ°æ–¹è§£é‡Šã€‚一般æ¥è¯´ï¼Œä¸»è¦æ•°æ®ç»“构需è¦å…¨é¢ +的文档。应该指出代ç ä¸åˆ†ç«‹çš„ä½ä¹‹é—´ä¸æ˜Žæ˜¾çš„ä¾èµ–性。任何å¯èƒ½è¯±ä½¿ä»£ç 管ç†äººè¿›è¡Œ +错误的“清ç†â€çš„事情都需è¦ä¸€ä¸ªæ³¨é‡Šæ¥è¯´æ˜Žä¸ºä»€ä¹ˆè¦è¿™æ ·åšã€‚ç‰ç‰ã€‚ 内部API更改 ----------- -å†…æ ¸æä¾›ç»™ç”¨æˆ·ç©ºé—´çš„二进制接å£ä¸èƒ½è¢«ç ´å,除éžåœ¨æœ€ä¸¥é‡çš„æƒ…况下。相åï¼Œå†…æ ¸çš„ -å†…éƒ¨ç¼–ç¨‹æŽ¥å£æ˜¯é«˜åº¦æµåŠ¨çš„ï¼Œå½“éœ€è¦æ—¶å¯ä»¥æ›´æ”¹ã€‚å¦‚æžœä½ å‘现自己ä¸å¾—ä¸å¤„ç†ä¸€ä¸ªå†…æ ¸ -APIï¼Œæˆ–è€…ä»…ä»…å› ä¸ºå®ƒä¸æ»¡è¶³ä½ 的需求而ä¸ä½¿ç”¨ç‰¹å®šçš„功能,这å¯èƒ½æ˜¯APIéœ€è¦æ”¹å˜çš„一 -ä¸ªæ ‡å¿—ã€‚ä½œä¸ºå†…æ ¸å¼€å‘人员,您有æƒè¿›è¡Œæ¤ç±»æ›´æ”¹ã€‚ +å†…æ ¸æä¾›ç»™ç”¨æˆ·ç©ºé—´çš„二进制接å£ä¸èƒ½è¢«ç ´å,除éžé€¼ä¸å¾—å·²ã€‚è€Œå†…æ ¸çš„å†…éƒ¨ç¼–ç¨‹æŽ¥å£ +是高度æµåŠ¨çš„ï¼Œå½“éœ€è¦æ—¶å¯ä»¥æ›´æ”¹ã€‚å¦‚æžœä½ å‘现自己ä¸å¾—ä¸å¤„ç†ä¸€ä¸ªå†…æ ¸API,或者仅 +ä»…å› ä¸ºå®ƒä¸æ»¡è¶³ä½ çš„éœ€æ±‚å¯¼è‡´æ— æ³•ä½¿ç”¨ç‰¹å®šçš„åŠŸèƒ½ï¼Œè¿™å¯èƒ½æ˜¯APIéœ€è¦æ”¹å˜çš„ä¸€ä¸ªæ ‡å¿—ã€‚ +ä½œä¸ºå†…æ ¸å¼€å‘人员,您有æƒè¿›è¡Œæ¤ç±»æ›´æ”¹ã€‚ -当然, å¯ä»¥è¿›è¡ŒAPI更改,但它们必须是åˆç†çš„ã€‚å› æ¤ï¼Œä»»ä½•进行内部API更改的补ä¸éƒ½ -应该附带一个关于更改内容和必è¦åŽŸå› çš„æè¿°ã€‚è¿™ç§å˜åŒ–也应该分解æˆä¸€ä¸ªå•独的补ä¸ï¼Œ -è€Œä¸æ˜¯åŸ‹åœ¨ä¸€ä¸ªæ›´å¤§çš„è¡¥ä¸ä¸ã€‚ +的确å¯ä»¥è¿›è¡ŒAPI更改,但更改必须是åˆç†çš„ã€‚å› æ¤ä»»ä½•进行内部API更改的补ä¸éƒ½åº”该 +附带关于更改内容和必è¦åŽŸå› çš„æè¿°ã€‚è¿™ç§å˜åŒ–也应该拆分æˆä¸€ä¸ªå•独的补ä¸ï¼Œè€Œä¸æ˜¯ +埋在一个更大的补ä¸ä¸ã€‚ å¦ä¸€ä¸ªè¦ç‚¹æ˜¯ï¼Œæ›´æ”¹å†…部API的开å‘人员通常è¦è´Ÿè´£ä¿®å¤å†…æ ¸æ ‘ä¸è¢«æ›´æ”¹ç ´å的任何代ç 。 -对于一个广泛使用的函数,这个èŒè´£å¯ä»¥å¯¼è‡´æˆç™¾ä¸Šåƒçš„å˜åŒ–,其ä¸è®¸å¤šå˜åŒ–å¯èƒ½ä¸Žå…¶ä»– -å¼€å‘人员æ£åœ¨åšçš„工作相冲çªã€‚ä¸ç”¨è¯´ï¼Œè¿™å¯èƒ½æ˜¯ä¸€é¡¹å¤§å·¥ä½œï¼Œæ‰€ä»¥æœ€å¥½ç¡®ä¿ç†ç”±æ˜¯ +对于一个广泛使用的函数,这个责任å¯ä»¥å¯¼è‡´æˆç™¾ä¸Šåƒçš„å˜åŒ–,其ä¸è®¸å¤šå˜åŒ–å¯èƒ½ä¸Žå…¶ä»– +å¼€å‘人员æ£åœ¨åšçš„工作相冲çªã€‚ä¸ç”¨è¯´ï¼Œè¿™å¯èƒ½æ˜¯ä¸€é¡¹å¤§å·¥ç¨‹ï¼Œæ‰€ä»¥æœ€å¥½ç¡®ä¿ç†ç”±æ˜¯ å¯é 的。请注æ„,coccinelle工具å¯ä»¥å¸®åŠ©è¿›è¡Œå¹¿æ³›çš„API更改。 在进行ä¸å…¼å®¹çš„API更改时,应尽å¯èƒ½ç¡®ä¿ç¼–译器æ•获未更新的代ç ã€‚è¿™å°†å¸®åŠ©æ‚¨ç¡®ä¿æ‰¾ diff --git a/Documentation/translations/zh_CN/process/5.Posting.rst b/Documentation/translations/zh_CN/process/5.Posting.rst index 9ff9945f918c7ebfaf19fa6a6ff4490e9ccf02a0..b0c65614844d8fdc98b65d8d4f1ac529463d561b 100644 --- a/Documentation/translations/zh_CN/process/5.Posting.rst +++ b/Documentation/translations/zh_CN/process/5.Posting.rst @@ -1,150 +1,157 @@ .. include:: ../disclaimer-zh_CN.rst :Original: :ref:`Documentation/process/5.Posting.rst <development_posting>` -:Translator: Alex Shi <alex.shi@linux.alibaba.com> + +:Translator: + + 时奎亮 Alex Shi <alex.shi@linux.alibaba.com> + +:æ ¡è¯‘: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> .. _cn_development_posting: å‘å¸ƒè¡¥ä¸ ======== -迟早,当您的工作准备好æäº¤ç»™ç¤¾åŒºè¿›è¡Œå®¡æŸ¥ï¼Œå¹¶æœ€ç»ˆåŒ…å«åˆ°ä¸»çº¿å†…æ ¸ä¸æ—¶ã€‚ä¸å‡ºæ‰€æ–™ï¼Œ +您的工作迟早会准备好æäº¤ç»™ç¤¾åŒºè¿›è¡Œå®¡æŸ¥ï¼Œå¹¶æœ€ç»ˆåŒ…å«åˆ°ä¸»çº¿å†…æ ¸ä¸ã€‚毫ä¸ç¨€å¥‡ï¼Œ å†…æ ¸å¼€å‘社区已ç»å‘展出一套用于å‘布补ä¸çš„约定和过程;éµå¾ªè¿™äº›çº¦å®šå’Œè¿‡ç¨‹å°†ä½¿ -å‚与其ä¸çš„æ¯ä¸ªäººçš„ç”Ÿæ´»æ›´åŠ è½»æ¾ã€‚本文件将试图åˆç†è¯¦ç»†åœ°æ¶µç›–è¿™äº›æœŸæœ›ï¼›æ›´å¤šä¿¡æ¯ -也å¯åœ¨ä»¥ä¸‹æ–‡ä»¶ä¸æ‰¾åˆ° -:ref:`Documentation/translations/zh_CN/process/submitting-patches.rst <cn_submittingpatches>`, -:ref:`Documentation/process/submitting-drivers.rst <submittingdrivers>` -å’Œ :ref:`Documentation/translations/zh_CN/process/submit-checklist.rst <cn_submitchecklist>`. +å‚与其ä¸çš„æ¯ä¸ªäººçš„ç”Ÿæ´»æ›´åŠ è½»æ¾ã€‚本文档试图æè¿°è¿™äº›çº¦å®šçš„éƒ¨åˆ†ç»†èŠ‚ï¼›æ›´å¤šä¿¡æ¯ +也å¯åœ¨ä»¥ä¸‹æ–‡æ¡£ä¸æ‰¾åˆ° +:ref:`Documentation/translations/zh_CN/process/submitting-patches.rst <cn_submittingpatches>`, +:ref:`Documentation/translations/zh_CN/process/submitting-drivers.rst <cn_submittingdrivers>` +å’Œ :ref:`Documentation/translations/zh_CN/process/submit-checklist.rst <cn_submitchecklist>`。 何时邮寄 -------- -在补ä¸å®Œå…¨â€œå‡†å¤‡å¥½â€ä¹‹å‰ï¼Œæœ‰ä¸€ä¸ªä¸æ–的诱惑æ¥é¿å…å‘布补ä¸ã€‚对于简å•的补ä¸ï¼Œ -è¿™ä¸æ˜¯é—®é¢˜ã€‚但是,如果æ£åœ¨å®Œæˆçš„å·¥ä½œå¾ˆå¤æ‚,那么在工作完æˆä¹‹å‰ä»Žç¤¾åŒºèŽ·å¾— -å馈就å¯ä»¥èŽ·å¾—å¾ˆå¤šå¥½å¤„ã€‚å› æ¤ï¼Œæ‚¨åº”该考虑å‘布æ£åœ¨è¿›è¡Œçš„工作,甚至使Gitæ ‘ -å¯ç”¨ï¼Œä»¥ä¾¿æ„Ÿå…´è¶£çš„å¼€å‘人员å¯ä»¥éšæ—¶èµ¶ä¸Šæ‚¨çš„å·¥ä½œã€‚ +在补ä¸å®Œå…¨â€œå‡†å¤‡å¥½â€ä¹‹å‰ï¼Œé¿å…å‘å¸ƒè¡¥ä¸æ˜¯ä¸€ç§æŒç»çš„诱惑。对于简å•的补ä¸ï¼Œè¿™ +䏿˜¯é—®é¢˜ã€‚但是如果æ£åœ¨å®Œæˆçš„å·¥ä½œå¾ˆå¤æ‚,那么在工作完æˆä¹‹å‰ä»Žç¤¾åŒºèŽ·å¾—å馈就 +å¯ä»¥èŽ·å¾—å¾ˆå¤šå¥½å¤„ã€‚å› æ¤ï¼Œæ‚¨åº”该考虑å‘布æ£åœ¨è¿›è¡Œçš„工作,甚至维护一个å¯ç”¨çš„Git +æ ‘ï¼Œä»¥ä¾¿æ„Ÿå…´è¶£çš„å¼€å‘人员å¯ä»¥éšæ—¶èµ¶ä¸Šæ‚¨çš„å·¥ä½œã€‚ -当å‘布还没有准备好包å«çš„ä»£ç æ—¶ï¼Œæœ€å¥½åœ¨å‘布本身ä¸è¿™æ ·è¯´ã€‚还应æåŠä»»ä½•æœ‰å¾…å®Œæˆ -的主è¦å·¥ä½œå’Œä»»ä½•已知问题。很少有人会看到那些被认为是åŠç”Ÿä¸ç†Ÿçš„è¡¥ä¸ï¼Œä½†æ˜¯é‚£äº› -人会想到他们å¯ä»¥å¸®åŠ©ä½ æŠŠå·¥ä½œæŽ¨å‘æ£ç¡®çš„æ–¹å‘。 +当å‘å¸ƒä¸æœ‰å°šæœªå‡†å¤‡å¥½è¢«åŒ…å«çš„代ç ,最好在å‘布ä¸è¯´æ˜Žã€‚还应æåŠä»»ä½•有待完æˆçš„ +主è¦å·¥ä½œå’Œä»»ä½•已知问题。很少有人会愿æ„看那些被认为是åŠç”Ÿä¸ç†Ÿçš„è¡¥ä¸ï¼Œä½†æ˜¯ +那些愿æ„的人会带ç€ä»–ä»¬çš„ç‚¹åæ¥ä¸€èµ·å¸®åŠ©ä½ æŠŠå·¥ä½œæŽ¨å‘æ£ç¡®çš„æ–¹å‘。 创建补ä¸ä¹‹å‰ ------------ -在考虑将补ä¸å‘é€åˆ°å¼€å‘社区之å‰ï¼Œæœ‰è®¸å¤šäº‹æƒ…应该åšã€‚这些包括: +在考虑将补ä¸å‘é€åˆ°å¼€å‘社区之å‰ï¼Œæœ‰è®¸å¤šäº‹æƒ…应该åšã€‚包括: - - å°½å¯èƒ½åœ°æµ‹è¯•代ç ã€‚åˆ©ç”¨å†…æ ¸çš„è°ƒè¯•å·¥å…·ï¼Œç¡®ä¿å†…æ ¸ä½¿ç”¨æ‰€æœ‰åˆç†çš„é…ç½®é€‰é¡¹ç»„åˆ - 进行构建,使用跨编译器为ä¸åŒçš„体系结构进行构建ç‰ã€‚ + - å°½å¯èƒ½åœ°æµ‹è¯•代ç ã€‚åˆ©ç”¨å†…æ ¸çš„è°ƒè¯•å·¥å…·ï¼Œç¡®ä¿å†…æ ¸ä½¿ç”¨äº†æ‰€æœ‰å¯èƒ½çš„é…ç½®é€‰é¡¹ç»„åˆ + 进行构建,使用交å‰ç¼–译器为ä¸åŒçš„体系结构进行构建ç‰ã€‚ - - ç¡®ä¿æ‚¨çš„代ç 符åˆå†…æ ¸ç¼–ç é£Žæ ¼æŒ‡å—。 + - ç¡®ä¿æ‚¨çš„代ç 符åˆå†…æ ¸ä»£ç é£Žæ ¼æŒ‡å—。 - 您的更改是å¦å…·æœ‰æ€§èƒ½å½±å“ï¼Ÿå¦‚æžœæ˜¯è¿™æ ·ï¼Œæ‚¨åº”è¯¥è¿è¡ŒåŸºå‡†æµ‹è¯•æ¥æ˜¾ç¤ºæ‚¨çš„å˜æ›´çš„ å½±å“(或好处);结果的摘è¦åº”该包å«åœ¨è¡¥ä¸ä¸ã€‚ - ç¡®ä¿æ‚¨æœ‰æƒå‘布代ç 。如果这项工作是为雇主完æˆçš„,雇主对这项工作具有所有æƒï¼Œ - å¹¶ä¸”å¿…é¡»åŒæ„æ ¹æ®GPL对其进行放行。 + å¹¶ä¸”å¿…é¡»åŒæ„æ ¹æ®GPL对其进行å‘布。 一般æ¥è¯´ï¼Œåœ¨å‘布代ç 之å‰è¿›è¡Œä¸€äº›é¢å¤–çš„æ€è€ƒï¼Œå‡ ä¹Žæ€»æ˜¯èƒ½åœ¨çŸæ—¶é—´å†…得到回报。 è¡¥ä¸å‡†å¤‡ -------- -准备å‘布补ä¸å¯èƒ½æ˜¯ä¸€ä¸ªæƒŠäººçš„工作é‡ï¼Œä½†å†æ¬¡å°è¯•èŠ‚çœæ—¶é—´åœ¨è¿™é‡Œé€šå¸¸æ˜¯ä¸æ˜Žæ™ºçš„, -å³ä½¿åœ¨çŸæœŸå†…。 +准备补ä¸å‘布的工作é‡å¯èƒ½å¾ˆæƒŠäººï¼Œä½†åœ¨æ¤å°è¯•èŠ‚çœæ—¶é—´é€šå¸¸æ˜¯ä¸æ˜Žæ™ºçš„,å³ä½¿åœ¨çŸæœŸ +内亦然。 -å¿…é¡»é’ˆå¯¹å†…æ ¸çš„ç‰¹å®šç‰ˆæœ¬å‡†å¤‡è¡¥ä¸ã€‚作为一般规则,补ä¸ç¨‹åºåº”该基于Linusçš„Gitæ ‘ä¸ -的当å‰ä¸»çº¿ã€‚当以主线为基础时,从一个众所周知的å‘布点开始——一个稳定的或RCçš„ -å‘å¸ƒâ€”â€”è€Œä¸æ˜¯åœ¨ä¸€ä¸ªä¸»çº¿åˆ†æ”¯ä»»æ„点。 +å¿…é¡»é’ˆå¯¹å†…æ ¸çš„ç‰¹å®šç‰ˆæœ¬å‡†å¤‡è¡¥ä¸ã€‚一般æ¥è¯´ï¼Œè¡¥ä¸åº”该基于Linusçš„Gitæ ‘ä¸çš„å½“å‰ +主线。当以主线为基础时,请从一个众所周知的å‘布点开始——如稳定版本或 -rc +版本å‘å¸ƒç‚¹â€”â€”è€Œä¸æ˜¯åœ¨ä¸€ä¸ªä»»æ„的主线分支点。 -但是,å¯èƒ½éœ€è¦é’ˆå¯¹-mmã€linux-next或åç³»ç»Ÿæ ‘ç”Ÿæˆç‰ˆæœ¬ï¼Œä»¥ä¾¿äºŽæ›´å¹¿æ³›çš„æµ‹è¯•和审查。 -æ ¹æ®è¡¥ä¸çš„区域以åŠå…¶ä»–åœ°æ–¹çš„æƒ…å†µï¼Œé’ˆå¯¹è¿™äº›å…¶ä»–æ ‘å»ºç«‹è¡¥ä¸å¯èƒ½éœ€è¦å¤§é‡çš„å·¥ä½œæ¥ +也å¯èƒ½éœ€è¦é’ˆå¯¹-mmã€linux-next或åç³»ç»Ÿæ ‘ç”Ÿæˆç‰ˆæœ¬ï¼Œä»¥ä¾¿äºŽæ›´å¹¿æ³›çš„æµ‹è¯•和审查。 +æ ¹æ®è¡¥ä¸çš„区域以åŠå…¶ä»–åœ°æ–¹çš„æƒ…å†µï¼Œé’ˆå¯¹å…¶ä»–æ ‘å»ºç«‹çš„è¡¥ä¸å¯èƒ½éœ€è¦å¤§é‡çš„å·¥ä½œæ¥ è§£å†³å†²çªå’Œå¤„ç†API更改。 åªæœ‰æœ€ç®€å•的更改æ‰åº”æ ¼å¼åŒ–为å•个补ä¸ï¼›å…¶ä»–所有更改都应作为一系列逻辑更改进行。 åˆ†å‰²è¡¥ä¸æ˜¯ä¸€é—¨è‰ºæœ¯ï¼›ä¸€äº›å¼€å‘人员花了很长时间æ¥å¼„æ¸…æ¥šå¦‚ä½•æŒ‰ç…§ç¤¾åŒºæœŸæœ›çš„æ–¹å¼æ¥ -åšã€‚然而,有一些ç»éªŒæ³•则å¯ä»¥å¤§å¤§å¸®åŠ©ï¼š +分割。ä¸è¿‡ï¼Œè¿™äº›ç»éªŒæ³•则也许有帮助: - - 您å‘布的补ä¸ç¨‹åºç³»åˆ—å‡ ä¹Žè‚¯å®šä¸ä¼šæ˜¯å·¥ä½œç³»ç»Ÿä¸çš„一系列更改。相å,您所åšçš„ - 更改需è¦åœ¨æœ€ç»ˆå½¢å¼ä¸åŠ ä»¥è€ƒè™‘ï¼Œç„¶åŽä»¥æœ‰æ„义的方å¼è¿›è¡Œæ‹†åˆ†ã€‚å¼€å‘人员对离散的〠- 自包å«çš„æ›´æ”¹æ„Ÿå…´è¶£ï¼Œè€Œä¸æ˜¯æ‚¨èŽ·å–这些更改的路径。 + - 您å‘布的补ä¸ç³»åˆ—å‡ ä¹Žè‚¯å®šä¸ä¼šæ˜¯å¼€å‘过程ä¸ç‰ˆæœ¬æŽ§åˆ¶ç³»ç»Ÿä¸çš„一系列更改。相å, + 需è¦å¯¹æ‚¨æ‰€åšæ›´æ”¹çš„æœ€ç»ˆå½¢å¼åŠ ä»¥è€ƒè™‘ï¼Œç„¶åŽä»¥æœ‰æ„义的方å¼è¿›è¡Œæ‹†åˆ†ã€‚å¼€å‘人员对 + 离散的ã€è‡ªåŒ…å«çš„æ›´æ”¹æ„Ÿå…´è¶£ï¼Œè€Œä¸æ˜¯æ‚¨åˆ›é€ 这些更改的原始路径。 - - æ¯ä¸ªé€»è¾‘ä¸Šç‹¬ç«‹çš„å˜æ›´éƒ½åº”è¯¥æ ¼å¼åŒ–为å•独的补ä¸ã€‚这些更改å¯ä»¥æ˜¯å°çš„ï¼ˆâ€œå‘æ¤ - ç»“æž„æ·»åŠ å—æ®µâ€ï¼‰æˆ–å¤§çš„ï¼ˆä¾‹å¦‚ï¼Œæ·»åŠ ä¸€ä¸ªé‡è¦çš„æ–°é©±åŠ¨ç¨‹åºï¼‰ï¼Œä½†å®ƒä»¬åœ¨æ¦‚念上 - 应该是å°çš„,并且å¯ä»¥æŽ¥å—一行æè¿°ã€‚æ¯ä¸ªè¡¥ä¸éƒ½åº”该åšä¸€ä¸ªç‰¹å®šçš„æ›´æ”¹ï¼Œå¯ä»¥å•独 - 检查并验è¯å®ƒæ‰€åšçš„事情。 + - æ¯ä¸ªé€»è¾‘ä¸Šç‹¬ç«‹çš„å˜æ›´éƒ½åº”è¯¥æ ¼å¼åŒ–为å•独的补ä¸ã€‚这些更改å¯ä»¥æ˜¯å°çš„ï¼ˆå¦‚â€œå‘ + æ¤ç»“æž„ä½“æ·»åŠ å—æ®µâ€ï¼‰æˆ–å¤§çš„ï¼ˆå¦‚æ·»åŠ ä¸€ä¸ªé‡è¦çš„æ–°é©±åŠ¨ç¨‹åºï¼‰ï¼Œä½†å®ƒä»¬åœ¨æ¦‚念上 + 应该是å°çš„,并且å¯ä»¥åœ¨ä¸€è¡Œå†…简述。æ¯ä¸ªè¡¥ä¸éƒ½åº”该åšä¸€ä¸ªç‰¹å®šçš„ã€å¯ä»¥å•独 + 检查并验è¯å®ƒæ‰€åšçš„事情的更改。 - - 作为é‡ç”³ä¸Šè¿°å‡†åˆ™çš„ä¸€ç§æ–¹æ³•:ä¸è¦åœ¨åŒä¸€è¡¥ä¸ä¸æ··åˆä¸åŒç±»åž‹çš„æ›´æ”¹ã€‚如果一个 - è¡¥ä¸ä¿®å¤äº†ä¸€ä¸ªå…³é”®çš„å®‰å…¨æ¼æ´žï¼Œé‡æ–°æŽ’åˆ—äº†ä¸€äº›ç»“æž„ï¼Œå¹¶é‡æ–°æ ¼å¼åŒ–了代ç ,那么 - 很有å¯èƒ½å®ƒä¼šè¢«å¿½ç•¥ï¼Œè€Œé‡è¦çš„ä¿®å¤å°†ä¸¢å¤±ã€‚ + - æ¢ç§æ–¹å¼é‡ç”³ä¸Šè¿°å‡†åˆ™ï¼Œä¹Ÿå°±æ˜¯è¯´ï¼šä¸è¦åœ¨åŒä¸€è¡¥ä¸ä¸æ··åˆä¸åŒç±»åž‹çš„æ›´æ”¹ã€‚如果 + 一个补ä¸ä¿®å¤äº†ä¸€ä¸ªå…³é”®çš„å®‰å…¨æ¼æ´žï¼Œåˆé‡æ–°æŽ’åˆ—äº†ä¸€äº›ç»“æž„ï¼Œè¿˜é‡æ–°æ ¼å¼åŒ–了代 + ç ,那么它很有å¯èƒ½ä¼šè¢«å¿½ç•¥ï¼Œä»Žè€Œå¯¼è‡´é‡è¦çš„ä¿®å¤ä¸¢å¤±ã€‚ - - æ¯ä¸ªè¡¥ä¸éƒ½åº”è¯¥äº§ç”Ÿä¸€ä¸ªå†…æ ¸ï¼Œå®ƒå¯ä»¥æ£ç¡®åœ°æž„建和è¿è¡Œï¼›å¦‚果补ä¸ç³»åˆ—在ä¸é—´è¢« - 䏿–,那么结果应该ä»ç„¶æ˜¯ä¸€ä¸ªå·¥ä½œçš„å†…æ ¸ã€‚è¡¥ä¸ç³»åˆ—的部分应用是使用 - “git bisctâ€å·¥å…·æŸ¥æ‰¾å›žå½’的一个常è§åœºæ™¯ï¼›å¦‚果结果是一个æŸåçš„å†…æ ¸ï¼Œé‚£ä¹ˆå¯¹äºŽ - 那些从事追踪问题的高尚工作的开å‘人员和用户æ¥è¯´ï¼Œå°†ä½¿ä»–ä»¬çš„ç”Ÿæ´»æ›´åŠ è‰°éš¾ã€‚ + - æ¯ä¸ªè¡¥ä¸éƒ½åº”该能创建一个å¯ä»¥æ£ç¡®åœ°æž„建和è¿è¡Œçš„å†…æ ¸ï¼›å¦‚æžœè¡¥ä¸ç³»åˆ—在ä¸é—´è¢« + æ–开,那么结果ä»åº”是一个æ£å¸¸å·¥ä½œçš„å†…æ ¸ã€‚éƒ¨åˆ†åº”ç”¨ä¸€ç³»åˆ—è¡¥ä¸æ˜¯ä½¿ç”¨ + “git bisctâ€å·¥å…·æŸ¥æ‰¾å›žå½’的一个常è§åœºæ™¯ï¼›å¦‚果结果是一个æŸåçš„å†…æ ¸ï¼Œé‚£ä¹ˆå°†ä½¿ + 那些从事追踪问题的高尚工作的开å‘äººå‘˜å’Œç”¨æˆ·çš„ç”Ÿæ´»æ›´åŠ è‰°éš¾ã€‚ - - ä¸è¿‡ï¼Œä¸è¦è¿‡åˆ†ã€‚一ä½å¼€å‘人员曾ç»å°†ä¸€ç»„编辑内容作为500个å•独的补ä¸å‘布到一个 - 文件ä¸ï¼Œè¿™å¹¶æ²¡æœ‰ä½¿ä»–æˆä¸ºå†…æ ¸é‚®ä»¶åˆ—è¡¨ä¸æœ€å—欢迎的人。一个补ä¸å¯ä»¥ç›¸å½“大, - åªè¦å®ƒä»ç„¶åŒ…å«ä¸€ä¸ªå•ä¸€çš„é€»è¾‘å˜æ›´ã€‚ + - ä¸è¦è¿‡åˆ†åˆ†å‰²ã€‚一ä½å¼€å‘人员曾ç»å°†ä¸€ç»„针对å•个文件的编辑分æˆ500个å•ç‹¬çš„è¡¥ä¸ + å‘布,这并没有使他æˆä¸ºå†…æ ¸é‚®ä»¶åˆ—è¡¨ä¸æœ€å—欢迎的人。一个补ä¸å¯ä»¥ç›¸å½“大, + åªè¦å®ƒä»ç„¶åŒ…å«ä¸€ä¸ªå•一的 *逻辑* å˜æ›´ã€‚ - - ç”¨ä¸€ç³»åˆ—è¡¥ä¸æ·»åŠ ä¸€ä¸ªå…¨æ–°çš„åŸºç¡€è®¾æ–½æ˜¯å¾ˆæœ‰è¯±æƒ‘åŠ›çš„ï¼Œä½†æ˜¯åœ¨ç³»åˆ—ä¸çš„æœ€åŽä¸€ä¸ª - è¡¥ä¸å¯ç”¨æ•´ä¸ªè¡¥ä¸ä¹‹å‰ï¼Œè¯¥åŸºç¡€è®¾æ–½æ˜¯ä¸ä½¿ç”¨çš„。如果å¯èƒ½çš„è¯ï¼Œåº”该é¿å…è¿™ç§ - è¯±æƒ‘ï¼›å¦‚æžœè¿™ä¸ªç³»åˆ—å¢žåŠ äº†å›žå½’ï¼Œé‚£ä¹ˆäºŒåˆ†æ³•å°†æŒ‡å‡ºæœ€åŽä¸€ä¸ªè¡¥ä¸æ˜¯å¯¼è‡´é—®é¢˜çš„ - è¡¥ä¸ï¼Œå³ä½¿çœŸæ£çš„bug在其他地方。åªè¦æœ‰å¯èƒ½ï¼Œæ·»åŠ æ–°ä»£ç 的补ä¸ç¨‹åºåº”è¯¥ç«‹å³ - 激活该代ç 。 + - ç”¨ä¸€ç³»åˆ—è¡¥ä¸æ·»åŠ ä¸€ä¸ªå…¨æ–°çš„åŸºç¡€è®¾æ–½ï¼Œä½†æ˜¯è¯¥è®¾æ–½åœ¨ç³»åˆ—ä¸çš„æœ€åŽä¸€ä¸ªè¡¥ä¸å¯ç”¨ + æ•´ä¸ªå˜æ›´ä¹‹å‰ä¸èƒ½ä½¿ç”¨ï¼Œè¿™çœ‹èµ·æ¥å¾ˆè¯±äººã€‚如果å¯èƒ½çš„è¯ï¼Œåº”该é¿å…è¿™ç§è¯±æƒ‘ï¼› + å¦‚æžœè¿™ä¸ªç³»åˆ—å¢žåŠ äº†å›žå½’ï¼Œé‚£ä¹ˆäºŒåˆ†æ³•å°†æŒ‡å‡ºæœ€åŽä¸€ä¸ªè¡¥ä¸æ˜¯å¯¼è‡´é—®é¢˜çš„è¡¥ä¸ï¼Œ + å³ä½¿çœŸæ£çš„bug在其他地方。åªè¦æœ‰å¯èƒ½ï¼Œæ·»åŠ æ–°ä»£ç 的补ä¸ç¨‹åºåº”è¯¥ç«‹å³æ¿€æ´»è¯¥ + 代ç 。 -创建完美补ä¸ç³»åˆ—的工作å¯èƒ½æ˜¯ä¸€ä¸ªä»¤äººæ²®ä¸§çš„过程,在完æˆâ€œçœŸæ£çš„工作â€ä¹‹åŽéœ€è¦èŠ±è´¹ -大é‡çš„æ—¶é—´å’Œæ€è€ƒã€‚但是,如果åšå¾—好,这是一段很好的时间。 +创建完美补ä¸ç³»åˆ—的工作å¯èƒ½æ˜¯ä¸€ä¸ªä»¤äººæ²®ä¸§çš„过程,在完æˆâ€œçœŸæ£çš„工作â€ä¹‹åŽéœ€è¦ +花费大é‡çš„æ—¶é—´å’Œæ€è€ƒã€‚但是如果åšå¾—好,花费的时间就是值得的。 è¡¥ä¸æ ¼å¼å’Œæ›´æ”¹æ—¥å¿— ------------------ æ‰€ä»¥çŽ°åœ¨ä½ æœ‰äº†ä¸€ç³»åˆ—å®Œç¾Žçš„è¡¥ä¸å¯ä»¥å‘布,但是这项工作还没有完æˆã€‚æ¯ä¸ªè¡¥ä¸éƒ½ -需è¦è¢«æ ¼å¼åŒ–æˆä¸€æ¡æ¶ˆæ¯ï¼Œå®ƒå¯ä»¥å¿«é€Ÿè€Œæ¸…æ™°åœ°å°†å…¶ç›®çš„ä¼ è¾¾ç»™ä¸–ç•Œå…¶ä»–åœ°æ–¹ã€‚ä¸ºæ¤ï¼Œ +需è¦è¢«æ ¼å¼åŒ–æˆä¸€æ¡æ¶ˆæ¯ï¼Œä»¥å¿«é€Ÿè€Œæ¸…æ™°åœ°å°†å…¶ç›®çš„ä¼ è¾¾åˆ°ä¸–ç•Œå…¶ä»–åœ°æ–¹ã€‚ä¸ºæ¤ï¼Œ æ¯ä¸ªè¡¥ä¸å°†ç”±ä»¥ä¸‹éƒ¨åˆ†ç»„æˆï¼š - - 命åè¡¥ä¸ä½œè€…çš„å¯é€‰â€œfromâ€è¡Œã€‚åªæœ‰å½“ä½ é€šè¿‡ç”µåé‚®ä»¶ä¼ é€’åˆ«äººçš„è¡¥ä¸æ—¶ï¼Œè¿™ä¸€è¡Œ - æ‰æ˜¯å¿…è¦çš„ï¼Œä½†æ˜¯å¦‚æžœæœ‰ç–‘é—®ï¼Œæ·»åŠ å®ƒä¸ä¼šæœ‰ä»»ä½•伤害。 + - å¯é€‰çš„“Fromâ€è¡Œï¼Œè¡¨æ˜Žè¡¥ä¸ä½œè€…ã€‚åªæœ‰å½“ä½ é€šè¿‡ç”µå邮件å‘é€åˆ«äººçš„è¡¥ä¸æ—¶ï¼Œè¿™ä¸€è¡Œ + æ‰æ˜¯å¿…须的,但是为防æ¢ç–‘é—®åŠ ä¸Šå®ƒä¹Ÿä¸ä¼šæœ‰ä»€ä¹ˆå处。 - - 一行æè¿°è¡¥ä¸çš„作用。对于没有其他上下文的读者æ¥è¯´ï¼Œæ¤æ¶ˆæ¯åº”è¯¥è¶³å¤Ÿäº†è§£è¡¥ä¸ - çš„èŒƒå›´ï¼›è¿™æ˜¯å°†åœ¨â€œçŸæ ¼å¼â€å˜æ›´æ—¥å¿—䏿˜¾ç¤ºçš„è¡Œã€‚æ¤æ¶ˆæ¯é€šå¸¸é¦–先用相关的å系统 - åç§°æ ¼å¼åŒ–ï¼Œç„¶åŽæ˜¯è¡¥ä¸çš„目的。例如: + - 一行æè¿°ï¼Œè¯´æ˜Žè¡¥ä¸çš„作用。对于在没有其他上下文的情况下看到该消æ¯çš„读者æ¥è¯´ï¼Œ + 该消æ¯åº”足以确定修补程åºçš„范围;æ¤è¡Œå°†æ˜¾ç¤ºåœ¨â€œshort formï¼ˆç®€çŸæ ¼å¼ï¼‰â€å˜æ›´ + 日志ä¸ã€‚æ¤æ¶ˆæ¯é€šå¸¸éœ€è¦å…ˆåŠ ä¸Šå系统åç§°å‰ç¼€ï¼Œç„¶åŽæ˜¯è¡¥ä¸çš„目的。例如: - :: + :: - gpio: fix build on CONFIG_GPIO_SYSFS=n + gpio: fix build on CONFIG_GPIO_SYSFS=n - - 一个空白行,åŽé¢æ˜¯è¡¥ä¸å†…容的详细æè¿°ã€‚这个æè¿°å¯ä»¥æ˜¯å¿…éœ€çš„ï¼›å®ƒåº”è¯¥è¯´æ˜Žè¡¥ä¸ + - ä¸€è¡Œç©ºç™½ï¼ŒåŽæŽ¥è¡¥ä¸å†…容的详细æè¿°ã€‚æ¤æè¿°å¯ä»¥æ˜¯ä»»æ„需è¦çš„é•¿åº¦ï¼›å®ƒåº”è¯¥è¯´æ˜Žè¡¥ä¸ çš„ä½œç”¨ä»¥åŠä¸ºä»€ä¹ˆå®ƒåº”è¯¥åº”ç”¨äºŽå†…æ ¸ã€‚ - - ä¸€ä¸ªæˆ–å¤šä¸ªæ ‡è®°è¡Œï¼Œè‡³å°‘æœ‰ä¸€ä¸ªç”±è¡¥ä¸ä½œè€…的:signed-off-by ç¾å。ç¾åå°†åœ¨ä¸‹é¢ - 更详细地æè¿°ã€‚ + - ä¸€ä¸ªæˆ–å¤šä¸ªæ ‡è®°è¡Œï¼Œè‡³å°‘æœ‰ä¸€ä¸ªç”±è¡¥ä¸ä½œè€…çš„ Signed-off-by ç¾åã€‚æ ‡è®°å°†åœ¨ä¸‹é¢ + 详细æè¿°ã€‚ -上é¢çš„项目一起构æˆè¡¥ä¸çš„å˜æ›´æ—¥å¿—ã€‚å†™ä¸€ç¯‡å¥½çš„å˜æ›´æ—¥å¿—是一门至关é‡è¦ä½†å¸¸å¸¸è¢« -忽视的艺术;值得花一点时间æ¥è®¨è®ºè¿™ä¸ªé—®é¢˜ã€‚å½“ä½ å†™ä¸€ä¸ªå˜æ›´æ—¥å¿—æ—¶ï¼Œä½ åº”è¯¥è®°ä½ -有很多ä¸åŒçš„äººä¼šè¯»ä½ çš„è¯ã€‚å…¶ä¸åŒ…括å系统维护人员和审查人员,他们需è¦å†³å®šæ˜¯å¦ -应该包括补ä¸ï¼Œåˆ†é”€å•†å’Œå…¶ä»–维护人员试图决定是å¦åº”该将补ä¸åå‘ç§»æ¤åˆ°å…¶ä»–å†…æ ¸ï¼Œ -bugæœå¯»äººå‘˜æƒ³çŸ¥é“è¡¥ä¸æ˜¯å¦è´Ÿè´£ä»–们æ£åœ¨è¿½æŸ¥çš„问题,想知é“å†…æ ¸å¦‚ä½•å˜åŒ–的用户。 -ç‰ç‰ã€‚ä¸€ä¸ªå¥½çš„å˜æ›´æ—¥å¿—以最直接和最简æ´çš„æ–¹å¼å‘æ‰€æœ‰è¿™äº›äººä¼ è¾¾æ‰€éœ€çš„ä¿¡æ¯ã€‚ +上é¢çš„项目一起构æˆè¡¥ä¸çš„å˜æ›´æ—¥å¿—ã€‚å†™ä¸€åˆ™å¥½çš„å˜æ›´æ—¥å¿—是一门至关é‡è¦ä½†å¸¸å¸¸è¢« +忽视的艺术;值得花一点时间æ¥è®¨è®ºè¿™ä¸ªé—®é¢˜ã€‚å½“ä½ ç¼–å†™å˜æ›´æ—¥å¿—æ—¶ï¼Œä½ åº”è¯¥è®°ä½æœ‰ +很多ä¸åŒçš„äººä¼šè¯»ä½ çš„è¯ã€‚å…¶ä¸åŒ…括å系统维护人员和审查人员,他们需è¦å†³å®šæ˜¯å¦ +应该åˆå¹¶è¡¥ä¸ï¼Œåˆ†é”€å•†å’Œå…¶ä»–维护人员试图决定是å¦åº”该将补ä¸åå‘ç§»æ¤åˆ°å…¶ä»–å†…æ ¸ï¼Œ +缺陷æœå¯»äººå‘˜æƒ³çŸ¥é“è¡¥ä¸æ˜¯å¦å¯¼è‡´ä»–们æ£åœ¨è¿½æŸ¥çš„é—®é¢˜ï¼Œä»¥åŠæƒ³çŸ¥é“å†…æ ¸å¦‚ä½•å˜åŒ–çš„ +用户ç‰ç‰ã€‚ä¸€ä¸ªå¥½çš„å˜æ›´æ—¥å¿—以最直接和最简æ´çš„æ–¹å¼å‘æ‰€æœ‰è¿™äº›äººä¼ è¾¾æ‰€éœ€çš„ä¿¡æ¯ã€‚ -为æ¤ï¼Œæ€»ç»“行应该æè¿°å˜æ›´çš„å½±å“和动机,以åŠåœ¨ä¸€è¡Œçº¦æŸæ¡ä»¶ä¸‹å¯èƒ½å‘生的å˜åŒ–。 +在结尾,总结行应该æè¿°å˜æ›´çš„å½±å“和动机,以åŠåœ¨ä¸€è¡Œçº¦æŸæ¡ä»¶ä¸‹å¯èƒ½å‘生的å˜åŒ–。 ç„¶åŽï¼Œè¯¦ç»†çš„æè¿°å¯ä»¥è¯¦è¿°è¿™äº›ä¸»é¢˜ï¼Œå¹¶æä¾›ä»»ä½•需è¦çš„é™„åŠ ä¿¡æ¯ã€‚如果补ä¸ä¿®å¤äº† -一个bug,请引用引入该bugçš„commit(如果å¯èƒ½ï¼Œè¯·åœ¨å¼•用commitsæ—¶åŒæ—¶æä¾›commit id -å’Œæ ‡é¢˜ï¼‰ã€‚å¦‚æžœæŸä¸ªé—®é¢˜ä¸Žç‰¹å®šçš„æ—¥å¿—或编译器输出相关è”,请包å«è¯¥è¾“出以帮助其他 -人æœç´¢åŒä¸€é—®é¢˜çš„解决方案。如果更改是为了支æŒä»¥åŽè¡¥ä¸ä¸çš„其他更改,那么就这么 -说。如果更改了内部API,请详细说明这些更改以åŠå…¶ä»–å¼€å‘人员应该如何å“应。一般 -æ¥è¯´ï¼Œä½ 越能把自己放在æ¯ä¸ªé˜…è¯»ä½ çš„changelog的人的ä½ç½®ä¸Šï¼Œchangelogï¼ˆå’Œå†…æ ¸ +一个缺陷,请引用引入该缺陷的æäº¤ï¼ˆå¦‚æžœå¯èƒ½ï¼Œè¯·åœ¨å¼•用æäº¤æ—¶åŒæ—¶æä¾›å…¶ id å’Œ +æ ‡é¢˜ï¼‰ã€‚å¦‚æžœæŸä¸ªé—®é¢˜ä¸Žç‰¹å®šçš„æ—¥å¿—或编译器输出相关è”,请包å«è¯¥è¾“出以帮助其他 +人æœç´¢åŒä¸€é—®é¢˜çš„解决方案。如果更改是为了支æŒä»¥åŽè¡¥ä¸ä¸çš„其他更改,那么应当 +说明。如果更改了内部API,请详细说明这些更改以åŠå…¶ä»–å¼€å‘人员应该如何å“应。 +一般æ¥è¯´ï¼Œä½ 越把自己放在æ¯ä¸ªé˜…è¯»ä½ å˜æ›´æ—¥å¿—的人的ä½ç½®ä¸Šï¼Œå˜æ›´æ—¥å¿—ï¼ˆå’Œå†…æ ¸ 作为一个整体)就越好。 -ä¸ç”¨è¯´ï¼Œå˜æ›´æ—¥å¿—åº”è¯¥æ˜¯å°†å˜æ›´æäº¤åˆ°ä¿®è®¢æŽ§åˆ¶ç³»ç»Ÿæ—¶ä½¿ç”¨çš„æ–‡æœ¬ã€‚æŽ¥ä¸‹æ¥æ˜¯ï¼š +䏿¶ˆè¯´ï¼Œå˜æ›´æ—¥å¿—æ˜¯å°†å˜æ›´æäº¤åˆ°ç‰ˆæœ¬æŽ§åˆ¶ç³»ç»Ÿæ—¶ä½¿ç”¨çš„æ–‡æœ¬ã€‚接下æ¥å°†æ˜¯ï¼š - - è¡¥ä¸æœ¬èº«ï¼Œé‡‡ç”¨ç»Ÿä¸€çš„(“-uâ€ï¼‰è¡¥ä¸æ ¼å¼ã€‚将“-pâ€é€‰é¡¹ç”¨äºŽdiff将使函数å与更改 - 相关è”ï¼Œä»Žè€Œä½¿ç»“æžœè¡¥ä¸æ›´å®¹æ˜“被其他人读å–。 + - è¡¥ä¸æœ¬èº«ï¼Œé‡‡ç”¨ç»Ÿä¸€çš„(“-uâ€ï¼‰è¡¥ä¸æ ¼å¼ã€‚使用“-pâ€é€‰é¡¹æ¥diff将使函数å与 + 更改相关è”ï¼Œä»Žè€Œä½¿ç»“æžœè¡¥ä¸æ›´å®¹æ˜“被其他人读å–。 -您应该é¿å…在补ä¸ä¸åŒ…括对ä¸ç›¸å…³æ–‡ä»¶ï¼ˆä¾‹å¦‚,由构建过程生æˆçš„æ–‡ä»¶æˆ–编辑器 -备份文件)的更改。文档目录ä¸çš„æ–‡ä»¶â€œdontdiffâ€åœ¨è¿™æ–¹é¢æœ‰å¸®åŠ©ï¼›ä½¿ç”¨â€œ-Xâ€é€‰é¡¹å°† +您应该é¿å…在补ä¸ä¸åŒ…括与更改ä¸ç›¸å…³æ–‡ä»¶ï¼ˆä¾‹å¦‚,构建过程生æˆçš„æ–‡ä»¶æˆ–编辑器 +备份文件)。文档目录ä¸çš„“dontdiffâ€æ–‡ä»¶åœ¨è¿™æ–¹é¢æœ‰å¸®åŠ©ï¼›ä½¿ç”¨â€œ-Xâ€é€‰é¡¹å°† å…¶ä¼ é€’ç»™diff。 -ä¸Šé¢æåˆ°çš„æ ‡ç¾ç”¨äºŽæè¿°å„ç§å¼€å‘人员如何与这个补ä¸çš„å¼€å‘相关è”。 +ä¸Šé¢æåˆ°çš„æ ‡ç¾ï¼ˆtag)用于æè¿°å„ç§å¼€å‘人员如何与这个补ä¸çš„å¼€å‘相关è”。 :ref:`Documentation/translations/zh_CN/process/submitting-patches.rst <cn_submittingpatches>` 文档ä¸å¯¹å®ƒä»¬è¿›è¡Œäº†è¯¦ç»†æè¿°ï¼›ä¸‹é¢æ˜¯ä¸€ä¸ªç®€çŸçš„æ€»ç»“。æ¯ä¸€è¡Œçš„æ ¼å¼å¦‚下: @@ -154,87 +161,87 @@ bugæœå¯»äººå‘˜æƒ³çŸ¥é“è¡¥ä¸æ˜¯å¦è´Ÿè´£ä»–们æ£åœ¨è¿½æŸ¥çš„问题,想知 å¸¸ç”¨çš„æ ‡ç¾æœ‰ï¼š - - Signed-off-by: 这是一个开å‘äººå‘˜çš„è¯æ˜Žï¼Œä»–æˆ–å¥¹æœ‰æƒæäº¤è¡¥ä¸ä»¥åŒ…å«åˆ°å†…æ ¸ä¸ã€‚ - è¿™æ˜¯å¼€å‘æ¥æºè®¤è¯å议,其全文å¯åœ¨ + - Signed-off-by: 这是一个开å‘äººå‘˜çš„è¯æ˜Žï¼Œè¯æ˜Žä»–æˆ–å¥¹æœ‰æƒæäº¤è¡¥ä¸ä»¥åŒ…å«åˆ°å†…æ ¸ + ä¸ã€‚è¿™è¡¨æ˜ŽåŒæ„å¼€å‘è€…æ¥æºè®¤è¯åè®®ï¼Œå…¶å…¨æ–‡è§ :ref:`Documentation/translations/zh_CN/process/submitting-patches.rst <cn_submittingpatches>` - 䏿‰¾åˆ°ï¼Œå¦‚果没有适当的ç¾å—,则ä¸èƒ½åˆå¹¶åˆ°ä¸»çº¿ä¸ã€‚ + 如果没有åˆé€‚çš„ç¾å—,则ä¸èƒ½åˆå¹¶åˆ°ä¸»çº¿ä¸ã€‚ - Co-developed-by: å£°æ˜Žè¡¥ä¸æ˜¯ç”±å¤šä¸ªå¼€å‘人员共åŒåˆ›å»ºçš„ï¼›å½“å‡ ä¸ªäººåœ¨ä¸€ä¸ªè¡¥ä¸ä¸Š - 工作时,它用于将属性赋予共åŒä½œè€…(除了 From: æ‰€èµ‹äºˆçš„ä½œè€…ä¹‹å¤–ï¼‰ã€‚å› ä¸º - Co-developed-by: 表示作者身份,所以æ¯ä¸ªå…±åŒå¼€å‘人, 必须紧跟在相关åˆä½œä½œè€… - çš„ç¾å之åŽã€‚具体内容和示例å¯ä»¥åœ¨ä»¥ä¸‹æ–‡ä»¶ä¸æ‰¾åˆ° + 工作时,它用于给出共åŒä½œè€…(除了 From: 所给出的作者之外)。由于 + Co-developed-by: 表示作者身份,所以æ¯ä¸ªå…±åŒå¼€å‘人,必须紧跟在相关åˆä½œä½œè€… + çš„Signed-off-by之åŽã€‚具体内容和示例è§ä»¥ä¸‹æ–‡ä»¶ :ref:`Documentation/translations/zh_CN/process/submitting-patches.rst <cn_submittingpatches>` - Acked-by: 表示å¦ä¸€ä¸ªå¼€å‘人员(通常是相关代ç çš„ç»´æŠ¤äººå‘˜ï¼‰åŒæ„è¡¥ä¸é€‚åˆåŒ…å« åœ¨å†…æ ¸ä¸ã€‚ - - Tested-by: å£°æ˜ŽæŒ‡å®šçš„äººå·²ç»æµ‹è¯•了补ä¸å¹¶å‘现它å¯ä»¥å·¥ä½œã€‚ + - Tested-by: 声明æŸäººå·²ç»æµ‹è¯•了补ä¸å¹¶ç¡®è®¤å®ƒå¯ä»¥å·¥ä½œã€‚ - - Reviewed-by: 指定的开å‘人员已ç»å®¡æŸ¥äº†è¡¥ä¸çš„æ£ç¡®æ€§ï¼›æœ‰å…³è¯¦ç»†ä¿¡æ¯ï¼Œè¯·å‚阅 + - Reviewed-by: 表示æŸå¼€å‘人员已ç»å®¡æŸ¥äº†è¡¥ä¸çš„æ£ç¡®æ€§ï¼›æœ‰å…³è¯¦ç»†ä¿¡æ¯ï¼Œè¯·å‚阅 :ref:`Documentation/translations/zh_CN/process/submitting-patches.rst <cn_submittingpatches>` - - Reported-by: 指定报告æ¤è¡¥ä¸ä¿®å¤çš„é—®é¢˜çš„ç”¨æˆ·ï¼›æ¤æ ‡è®°ç”¨äºŽæä¾›æ„Ÿè°¢ã€‚ + - Reported-by: 指定报告æ¤è¡¥ä¸ä¿®å¤çš„é—®é¢˜çš„ç”¨æˆ·ï¼›æ¤æ ‡è®°ç”¨äºŽè¡¨ç¤ºæ„Ÿè°¢ã€‚ - - Cc:指定的人收到了补ä¸çš„副本,并有机会对æ¤å‘表评论。 + - Cc:指定æŸäººæ”¶åˆ°äº†è¡¥ä¸çš„副本,并有机会对æ¤å‘表评论。 -在补ä¸ä¸æ·»åŠ æ ‡ç¾æ—¶è¦å°å¿ƒï¼šåªæœ‰cc:æ‰é€‚åˆåœ¨æ²¡æœ‰æŒ‡å®šäººå‘˜æ˜Žç¡®è®¸å¯çš„æƒ…å†µä¸‹æ·»åŠ ã€‚ +在补ä¸ä¸æ·»åŠ æ ‡ç¾æ—¶è¦å°å¿ƒï¼šåªæœ‰Cc:æ‰é€‚åˆåœ¨æ²¡æœ‰æŒ‡å®šäººå‘˜æ˜Žç¡®è®¸å¯çš„æƒ…å†µä¸‹æ·»åŠ ã€‚ å‘é€è¡¥ä¸ -------- -在邮寄补ä¸ä¹‹å‰ï¼Œæ‚¨è¿˜éœ€è¦æ³¨æ„ä»¥ä¸‹å‡ ç‚¹ï¼š +在寄出补ä¸ä¹‹å‰ï¼Œæ‚¨è¿˜éœ€è¦æ³¨æ„ä»¥ä¸‹å‡ ç‚¹ï¼š - - 您确定您的邮件å‘é€ç¨‹åºä¸ä¼šæŸåè¡¥ä¸å—?有å…费的空白更改或由邮件客户端 - 执行的行包装的补ä¸ä¸ä¼šåœ¨å¦ä¸€ç«¯å¤åŽŸï¼Œå¹¶ä¸”é€šå¸¸ä¸ä¼šè¿›è¡Œä»»ä½•详细检查。如果有 - 任何疑问,把补ä¸å¯„ç»™ä½ è‡ªå·±ï¼Œè®©ä½ è‡ªå·±ç›¸ä¿¡å®ƒæ˜¯å®Œå¥½æ— æŸçš„。 + - 您确定您的邮件å‘é€ç¨‹åºä¸ä¼šæŸåè¡¥ä¸å—ï¼Ÿè¢«é‚®ä»¶å®¢æˆ·ç«¯æ›´æ”¹ç©ºç™½æˆ–ä¿®é¥°äº†è¡Œçš„è¡¥ä¸ + æ— æ³•è¢«å¦ä¸€ç«¯æŽ¥å—,并且通常ä¸ä¼šè¿›è¡Œä»»ä½•详细检查。如果有任何疑问,先把补ä¸å¯„ + ç»™ä½ è‡ªå·±ï¼Œè®©ä½ è‡ªå·±ç¡®å®šå®ƒæ˜¯å®Œå¥½æ— æŸçš„。 :ref:`Documentation/translations/zh_CN/process/email-clients.rst <cn_email_clients>` - æä¾›äº†ä¸€äº›æœ‰ç”¨çš„æç¤ºï¼Œå¯ä»¥è®©ç‰¹å®šçš„邮件客户机工作以å‘é€è¡¥ä¸ã€‚ + æä¾›äº†ä¸€äº›æœ‰ç”¨çš„æç¤ºï¼Œå¯ä»¥è®©ç‰¹å®šçš„邮件客户端æ£å¸¸å‘é€è¡¥ä¸ã€‚ - - ä½ ç¡®å®šä½ çš„è¡¥ä¸æ²¡æœ‰æ„šè ¢çš„错误å—?您应该始终通过scripts/checkpatch.plè¿è¡Œ - è¡¥ä¸ç¨‹åºï¼Œå¹¶è§£å†³å®ƒæå‡ºçš„æŠ•诉。请记ä½ï¼Œcheckpatch.plè™½ç„¶æ˜¯å¤§é‡æ€è€ƒå†…æ ¸ - è¡¥ä¸åº”è¯¥æ˜¯ä»€ä¹ˆæ ·åçš„ä½“çŽ°ï¼Œä½†å®ƒå¹¶ä¸æ¯”æ‚¨èªæ˜Žã€‚如果修å¤checkpatch.pl投诉会 + - ä½ ç¡®å®šä½ çš„è¡¥ä¸æ²¡æœ‰è’å”的错误å—?您应该始终通过scripts/checkpatch.pl检查 + è¡¥ä¸ç¨‹åºï¼Œå¹¶è§£å†³å®ƒæå‡ºçš„问题。请记ä½ï¼Œcheckpatch.plï¼Œè™½ç„¶ä½“çŽ°äº†å¯¹å†…æ ¸è¡¥ä¸ + åº”è¯¥æ˜¯ä»€ä¹ˆæ ·çš„å¤§é‡æ€è€ƒï¼Œä½†å®ƒå¹¶ä¸æ¯”æ‚¨èªæ˜Žã€‚如果修å¤checkpatch.pl给的问题会 使代ç å˜å¾—更糟,请ä¸è¦è¿™æ ·åšã€‚ è¡¥ä¸åº”始终以纯文本形å¼å‘é€ã€‚请ä¸è¦å°†å®ƒä»¬ä½œä¸ºé™„ä»¶å‘é€ï¼›è¿™ä½¿å¾—审阅者在ç”å¤ä¸æ›´éš¾ 引用补ä¸çš„部分。相å,åªéœ€å°†è¡¥ä¸ç›´æŽ¥æ”¾åˆ°æ‚¨çš„æ¶ˆæ¯ä¸ã€‚ -é‚®å¯„è¡¥ä¸æ—¶ï¼Œé‡è¦çš„æ˜¯å°†å‰¯æœ¬å‘é€ç»™ä»»ä½•å¯èƒ½æ„Ÿå…´è¶£çš„人。与其他一些项目ä¸åŒï¼Œå†…æ ¸ -鼓励人们错误地å‘é€è¿‡å¤šçš„副本;ä¸è¦å‡å®šç›¸å…³äººå‘˜ä¼šçœ‹åˆ°æ‚¨åœ¨é‚®ä»¶åˆ—表ä¸çš„å‘布。 +å¯„å‡ºè¡¥ä¸æ—¶ï¼Œé‡è¦çš„æ˜¯å°†å‰¯æœ¬å‘é€ç»™ä»»ä½•å¯èƒ½æ„Ÿå…´è¶£çš„人。与其他一些项目ä¸åŒï¼Œå†…æ ¸ +鼓励人们甚至错误地å‘é€è¿‡å¤šçš„副本;ä¸è¦å‡å®šç›¸å…³äººå‘˜ä¼šçœ‹åˆ°æ‚¨åœ¨é‚®ä»¶åˆ—表ä¸çš„å‘布。 尤其是,副本应å‘é€è‡³ï¼š - - å—å½±å“åç³»ç»Ÿçš„ç»´æŠ¤äººå‘˜ã€‚å¦‚å‰æ‰€è¿°ï¼Œç»´æŠ¤äººå‘˜æ–‡ä»¶æ˜¯æŸ¥æ‰¾è¿™äº›äººå‘˜çš„第一个地方。 + - å—å½±å“åç³»ç»Ÿçš„ç»´æŠ¤äººå‘˜ã€‚å¦‚å‰æ‰€è¿°ï¼Œç»´æŠ¤äººå‘˜æ–‡ä»¶æ˜¯æŸ¥æ‰¾è¿™äº›äººå‘˜çš„首选地方。 - 其他在åŒä¸€é¢†åŸŸå·¥ä½œçš„å¼€å‘人员,尤其是那些现在å¯èƒ½åœ¨é‚£é‡Œå·¥ä½œçš„å¼€å‘人员。使用 git查看还有è°ä¿®æ”¹äº†æ‚¨æ£åœ¨å¤„ç†çš„æ–‡ä»¶ï¼Œè¿™å¾ˆæœ‰å¸®åŠ©ã€‚ - - 如果您对错误报告或功能请求åšå‡ºå“应,也å¯ä»¥æŠ„é€åŽŸå§‹å‘é€äººã€‚ + - 如果您对æŸé”™è¯¯æŠ¥å‘Šæˆ–功能请求åšå‡ºå“应,也å¯ä»¥æŠ„é€åŽŸå§‹å‘é€äººã€‚ - - 将副本å‘é€åˆ°ç›¸å…³é‚®ä»¶åˆ—表,或者,如果没有其他应用,则å‘é€åˆ°Linuxå†…æ ¸åˆ—è¡¨ã€‚ + - 将副本å‘é€åˆ°ç›¸å…³é‚®ä»¶åˆ—è¡¨ï¼Œæˆ–è€…è‹¥æ— ç›¸å…³åˆ—è¡¨ï¼Œåˆ™å‘é€åˆ°linux-kernel列表。 - - 如果您æ£åœ¨ä¿®å¤ä¸€ä¸ªbugï¼Œè¯·è€ƒè™‘è¯¥ä¿®å¤æ˜¯å¦åº”è¿›å…¥ä¸‹ä¸€ä¸ªç¨³å®šæ›´æ–°ã€‚å¦‚æžœæ˜¯è¿™æ ·ï¼Œ - stable@vger.kernel.org 应该得到补ä¸çš„副本。å¦å¤–ï¼Œåœ¨è¡¥ä¸æœ¬èº«çš„æ ‡ç¾ä¸æ·»åŠ - 一个“cc:stable@vger.kernel.orgâ€ï¼›è¿™å°†ä½¿ç¨³å®šå›¢é˜Ÿåœ¨ä¿®å¤è¿›å…¥ä¸»çº¿æ—¶æ”¶åˆ°é€šçŸ¥ã€‚ + - 如果您æ£åœ¨ä¿®å¤ä¸€ä¸ªç¼ºé™·ï¼Œè¯·è€ƒè™‘è¯¥ä¿®å¤æ˜¯å¦åº”è¿›å…¥ä¸‹ä¸€ä¸ªç¨³å®šæ›´æ–°ã€‚å¦‚æžœæ˜¯è¿™æ ·ï¼Œ + è¡¥ä¸å‰¯æœ¬ä¹Ÿåº”å‘到stable@vger.kernel.org 。å¦å¤–ï¼Œåœ¨è¡¥ä¸æœ¬èº«çš„æ ‡ç¾ä¸æ·»åŠ ä¸€ä¸ª + “Cc: stable@vger.kernel.orgâ€ï¼›è¿™å°†ä½¿ç¨³å®šç‰ˆå›¢é˜Ÿåœ¨ä¿®å¤è¿›å…¥ä¸»çº¿æ—¶æ”¶åˆ°é€šçŸ¥ã€‚ -当为一个补ä¸é€‰æ‹©æŽ¥æ”¶è€…时,最好知é“ä½ è®¤ä¸ºè°æœ€ç»ˆä¼šæŽ¥å—这个补ä¸å¹¶å°†å…¶åˆå¹¶ã€‚虽然 -å¯ä»¥å°†è¡¥ä¸ç›´æŽ¥å‘é€ç»™LinusTorvalds并让他åˆå¹¶ï¼Œä½†é€šå¸¸æƒ…况下ä¸ä¼šè¿™æ ·åšã€‚Linus -很忙,并且有åç³»ç»Ÿç»´æŠ¤äººå‘˜è´Ÿè´£ç›‘è§†å†…æ ¸çš„ç‰¹å®šéƒ¨åˆ†ã€‚é€šå¸¸æ‚¨ä¼šå¸Œæœ›ç»´æŠ¤äººå‘˜åˆå¹¶æ‚¨ -的补ä¸ã€‚如果没有明显的维护人员,Andrew Morton通常是最åŽçš„è¡¥ä¸ç›®æ ‡ã€‚ +当为一个补ä¸é€‰æ‹©æŽ¥æ”¶è€…æ—¶ï¼Œæœ€å¥½æ¸…æ¥šä½ è®¤ä¸ºè°æœ€ç»ˆä¼šæŽ¥å—这个补ä¸å¹¶å°†å…¶åˆå¹¶ã€‚虽然 +å¯ä»¥å°†è¡¥ä¸ç›´æŽ¥å‘ç»™Linus Torvalds并让他åˆå¹¶ï¼Œä½†é€šå¸¸æƒ…况下ä¸ä¼šè¿™æ ·åšã€‚Linus很 +忙,并且有åç³»ç»Ÿç»´æŠ¤äººå‘˜è´Ÿè´£ç›‘è§†å†…æ ¸çš„ç‰¹å®šéƒ¨åˆ†ã€‚é€šå¸¸æ‚¨ä¼šå¸Œæœ›ç»´æŠ¤äººå‘˜åˆå¹¶æ‚¨çš„ +è¡¥ä¸ã€‚如果没有明显的维护人员,Andrew Morton通常是最åŽçš„è¡¥ä¸æŽ¥æ”¶è€…ã€‚ -è¡¥ä¸éœ€è¦å¥½çš„主题行。补ä¸ç¨‹åºè¡Œçš„è§„èŒƒæ ¼å¼å¦‚下: +è¡¥ä¸éœ€è¦å¥½çš„主题行。补ä¸ä¸»é¢˜è¡Œçš„è§„èŒƒæ ¼å¼å¦‚下: :: [PATCH nn/mm] subsys: one-line description of the patch -å…¶ä¸â€œnnâ€æ˜¯è¡¥ä¸çš„åºå·ï¼Œâ€œmmâ€æ˜¯ç³»åˆ—ä¸è¡¥ä¸çš„æ€»æ•°ï¼Œâ€œsubsysâ€æ˜¯å—å½±å“å系统的å称。 -显然,一个å•独的补ä¸å¯ä»¥çœç•¥nn/mm。 +å…¶ä¸â€œnnâ€æ˜¯è¡¥ä¸çš„åºå·ï¼Œâ€œmmâ€æ˜¯ç³»åˆ—ä¸è¡¥ä¸çš„æ€»æ•°ï¼Œâ€œsubsysâ€æ˜¯å—å½±å“å系统的 +å称。当然,一个å•独的补ä¸å¯ä»¥çœç•¥nn/mm。 -如果您有一系列é‡è¦çš„è¡¥ä¸ï¼Œé‚£ä¹ˆé€šå¸¸å°†ä»‹ç»æ€§æè¿°ä½œä¸ºé›¶éƒ¨åˆ†å‘é€ã€‚ä¸è¿‡ï¼Œè¿™ç§çº¦å®š -并没有得到普ééµå¾ªï¼›å¦‚果您使用它,请记ä½ç®€ä»‹ä¸çš„ä¿¡æ¯ä¸ä¼šä½¿å®ƒè¿›å…¥å†…æ ¸å˜æ›´æ—¥å¿—。 +如果您有一系列é‡è¦çš„è¡¥ä¸ï¼Œé‚£ä¹ˆé€šå¸¸å‘é€ä¸€ä¸ªç®€ä»‹ä½œä¸ºç¬¬ã€‡éƒ¨åˆ†ã€‚ä¸è¿‡ï¼Œè¿™ä¸ªçº¦å®š +并没有得到普ééµå¾ªï¼›å¦‚果您使用它,请记ä½ç®€ä»‹ä¸çš„ä¿¡æ¯ä¸ä¼šè¿›å…¥å†…æ ¸å˜æ›´æ—¥å¿—。 å› æ¤ï¼Œè¯·ç¡®ä¿è¡¥ä¸æœ¬èº«å…·æœ‰å®Œæ•´çš„å˜æ›´æ—¥å¿—ä¿¡æ¯ã€‚ 一般æ¥è¯´ï¼Œå¤šéƒ¨åˆ†è¡¥ä¸çš„第二部分和åŽç»éƒ¨åˆ†åº”作为对第一部分的回å¤å‘é€ï¼Œä»¥ä¾¿å®ƒä»¬ 在接收端都连接在一起。åƒgitå’Œcoiltè¿™æ ·çš„å·¥å…·æœ‰å‘½ä»¤ï¼Œå¯ä»¥é€šè¿‡é€‚当的线程å‘é€ -一组补ä¸ã€‚但是,如果您有一个长系列,并且æ£åœ¨ä½¿ç”¨git,请远离–chain reply-to -选项,以é¿å…创建异常深的嵌套。 +一组补ä¸ã€‚但是,如果您有一长串补ä¸ï¼Œå¹¶æ£ä½¿ç”¨git,请ä¸è¦ä½¿ç”¨â€“-chain-reply-to +选项,以é¿å…创建过深的嵌套。 diff --git a/Documentation/translations/zh_CN/process/6.Followthrough.rst b/Documentation/translations/zh_CN/process/6.Followthrough.rst index f509e077e1cb08ebd549632499dc16c4a752c9e1..2a127e737b6a585b0a031e2c4fceb2a4e936eead 100644 --- a/Documentation/translations/zh_CN/process/6.Followthrough.rst +++ b/Documentation/translations/zh_CN/process/6.Followthrough.rst @@ -1,145 +1,152 @@ .. include:: ../disclaimer-zh_CN.rst :Original: :ref:`Documentation/process/6.Followthrough.rst <development_followthrough>` -:Translator: Alex Shi <alex.shi@linux.alibaba.com> + +:Translator: + + 时奎亮 Alex Shi <alex.shi@linux.alibaba.com> + +:æ ¡è¯‘: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> .. _cn_development_followthrough: è·Ÿè¿› ==== -在这一点上,您已ç»éµå¾ªäº†åˆ°ç›®å‰ä¸ºæ¢ç»™å‡ºçš„æŒ‡å¯¼æ–¹é’ˆï¼Œå¹¶ä¸”,éšç€æ‚¨è‡ªå·±çš„工程技能 -çš„å¢žåŠ ï¼Œå·²ç»å‘布了一系列完美的补ä¸ã€‚å³ä½¿æ˜¯ç»éªŒä¸°å¯Œçš„å†…æ ¸å¼€å‘人员也能犯的最大 -错误之一是,认为他们的工作现在已ç»å®Œæˆäº†ã€‚事实上,å‘å¸ƒè¡¥ä¸æ„味ç€è¿›å…¥æµç¨‹çš„下 -一个阶段,å¯èƒ½è¿˜éœ€è¦åšå¾ˆå¤šå·¥ä½œã€‚ +æ¤æ—¶ï¼Œæ‚¨å·²ç»éµå¾ªäº†åˆ°ç›®å‰ä¸ºæ¢ç»™å‡ºçš„æŒ‡å¯¼æ–¹é’ˆï¼Œå¹¶ä¸”,éšç€æ‚¨è‡ªå·±çš„å·¥ç¨‹æŠ€èƒ½çš„å¢žåŠ ï¼Œ +å·²ç»å‘布了一系列完美的补ä¸ã€‚å³ä½¿æ˜¯ç»éªŒä¸°å¯Œçš„å†…æ ¸å¼€å‘人员也能犯的最大错误之一 +是,认为他们的工作现在已ç»å®Œæˆäº†ã€‚事实上,å‘å¸ƒè¡¥ä¸æ„味ç€è¿›å…¥æµç¨‹çš„下一个阶段, +å¯èƒ½è¿˜éœ€è¦åšå¾ˆå¤šå·¥ä½œã€‚ -一个补ä¸åœ¨ç¬¬ä¸€æ¬¡å‘布时就éžå¸¸å‡ºè‰²ï¼Œæ²¡æœ‰æ”¹è¿›çš„余地,这是很罕è§çš„ã€‚å†…æ ¸å¼€å‘æµç¨‹ -è®¤è¯†åˆ°è¿™ä¸€äº‹å®žï¼Œå› æ¤ï¼Œå®ƒéžå¸¸æ³¨é‡å¯¹å·²å‘布代ç 的改进。作为代ç 的作者,您应该与 +一个补ä¸åœ¨é¦–次å‘布时就éžå¸¸å‡ºè‰²ã€æ²¡æœ‰æ”¹è¿›çš„余地,这是很罕è§çš„ã€‚å†…æ ¸å¼€å‘æµç¨‹å·² +è®¤è¯†åˆ°è¿™ä¸€äº‹å®žï¼Œå› æ¤å®ƒéžå¸¸æ³¨é‡å¯¹å·²å‘布代ç 的改进。作为代ç 的作者,您应该与 å†…æ ¸ç¤¾åŒºåˆä½œï¼Œä»¥ç¡®ä¿æ‚¨çš„代ç 符åˆå†…æ ¸çš„è´¨é‡æ ‡å‡†ã€‚如果ä¸å‚与这个过程,很å¯èƒ½ä¼š -阻æ¢å°†è¡¥ä¸åŒ…å«åˆ°ä¸»çº¿ä¸ã€‚ +æ— æ³•å°†è¡¥ä¸åˆå¹¶åˆ°ä¸»çº¿ä¸ã€‚ 与审阅者åˆä½œ ------------ 任何æ„义上的补ä¸éƒ½ä¼šå¯¼è‡´å…¶ä»–å¼€å‘äººå‘˜åœ¨å®¡æŸ¥ä»£ç æ—¶å‘表大é‡è¯„è®ºã€‚å¯¹äºŽè®¸å¤šå¼€å‘ -人员æ¥è¯´ï¼Œä¸Žå®¡æŸ¥äººå‘˜åˆä½œå¯èƒ½æ˜¯å†…æ ¸å¼€å‘è¿‡ç¨‹ä¸æœ€ä»¤äººç”Ÿç•çš„éƒ¨åˆ†ã€‚ä½†æ˜¯ï¼Œå¦‚æžœä½ +人员æ¥è¯´ï¼Œä¸Žå®¡é˜…人员åˆä½œå¯èƒ½æ˜¯å†…æ ¸å¼€å‘è¿‡ç¨‹ä¸æœ€ä»¤äººç”Ÿç•çš„éƒ¨åˆ†ã€‚ä½†æ˜¯å¦‚æžœä½ è®°ä½ä¸€äº›äº‹æƒ…,生活会å˜å¾—容易得多: - - å¦‚æžœä½ å·²ç»å¾ˆå¥½åœ°è§£é‡Šäº†ä½ 的补ä¸ï¼Œè¯„论人员会ç†è§£å®ƒçš„价值,以åŠä¸ºä»€ä¹ˆä½ 会 - 费尽心æ€åŽ»å†™å®ƒã€‚ä½†æ˜¯è¿™ä¸ªå¹¶ä¸èƒ½é˜»æ¢ä»–们æå‡ºä¸€ä¸ªåŸºæœ¬çš„问题:五年或åå¹´åŽ - 用这个代ç ç»´æŠ¤ä¸€ä¸ªå†…æ ¸ä¼šæ˜¯ä»€ä¹ˆæ„Ÿè§‰ï¼Ÿä½ å¯èƒ½è¢«è¦æ±‚åšå‡ºçš„许多改å˜â€”—从编ç é£Žæ ¼ - 的调整到大é‡çš„é‡å†™â€”—都æ¥è‡ªäºŽå¯¹Linuxçš„ç†è§£ï¼Œå³ä»ŽçŽ°åœ¨èµ·åå¹´åŽï¼ŒLinuxä»å°†åœ¨ - å¼€å‘ä¸ã€‚ + - å¦‚æžœä½ å·²ç»å¾ˆå¥½åœ°è§£é‡Šäº†ä½ 的补ä¸ï¼Œå®¡é˜…人员会ç†è§£å®ƒçš„价值,以åŠä¸ºä»€ä¹ˆä½ 会 + 费尽心æ€åŽ»å†™å®ƒã€‚ä½†æ˜¯è¿™ä¸ªå¹¶ä¸èƒ½é˜»æ¢ä»–们æå‡ºä¸€ä¸ªåŸºæœ¬çš„问题:在五年或åå¹´åŽ + ç»´æŠ¤å«æœ‰æ¤ä»£ç çš„å†…æ ¸ä¼šæ€Žä¹ˆæ ·ï¼Ÿä½ å¯èƒ½è¢«è¦æ±‚åšå‡ºçš„许多改å˜â€”—从编ç é£Žæ ¼çš„ + 调整到大é‡çš„é‡å†™â€”—都æ¥è‡ªäºŽå¯¹Linuxçš„ç†è§£ï¼Œå³ä»ŽçŽ°åœ¨èµ·åå¹´åŽï¼ŒLinuxä»å°† + 在开å‘ä¸ã€‚ - 代ç 审查是一项艰苦的工作,这是一项相对åƒåŠ›ä¸è®¨å¥½çš„工作;人们记得è°ç¼–写了 - å†…æ ¸ä»£ç ,但对于那些审查它的人æ¥è¯´ï¼Œå‡ 乎没有什么æŒä¹…çš„åå£°ã€‚å› æ¤ï¼Œè¯„论 + å†…æ ¸ä»£ç ,但对于那些审查它的人æ¥è¯´ï¼Œå‡ 乎没有什么长久的åå£°ã€‚å› æ¤ï¼Œå®¡é˜… 人员å¯èƒ½ä¼šå˜å¾—æš´èºï¼Œå°¤å…¶æ˜¯å½“ä»–ä»¬çœ‹åˆ°åŒæ ·çš„错误被一éåˆä¸€é地犯下时。如果 - ä½ å¾—åˆ°äº†ä¸€ä¸ªçœ‹èµ·æ¥æ„¤æ€’ã€ä¾®è¾±æˆ–å®Œå…¨å†’çŠ¯ä½ çš„è¯„è®ºï¼ŒæŠµåˆ¶ä»¥åŒæ ·æ–¹å¼å›žåº”的冲动。 - 代ç 审查是关于代ç çš„ï¼Œè€Œä¸æ˜¯å…³äºŽäººçš„,代ç 审查人员ä¸ä¼šäº²è‡ªæ”»å‡»æ‚¨ã€‚ + ä½ å¾—åˆ°äº†ä¸€ä¸ªçœ‹èµ·æ¥æ„¤æ€’ã€ä¾®è¾±æˆ–å®Œå…¨å†’çŠ¯ä½ çš„è¯„è®ºï¼Œè¯·æŠ‘åˆ¶ä»¥åŒæ ·æ–¹å¼å›žåº”的冲动。 + 代ç 审查是关于代ç çš„ï¼Œè€Œä¸æ˜¯å…³äºŽäººçš„,代ç 审阅人员ä¸ä¼šäº²è‡ªæ”»å‡»æ‚¨ã€‚ - - åŒæ ·ï¼Œä»£ç å®¡æŸ¥äººå‘˜ä¹Ÿä¸æƒ³ä»¥ç‰ºç‰²ä½ 雇主的利益为代价æ¥å®£ä¼ 他们雇主的议程。 + - åŒæ ·ï¼Œä»£ç å®¡é˜…äººå‘˜ä¹Ÿä¸æƒ³ä»¥ç‰ºç‰²ä½ 雇主的利益为代价æ¥å®£ä¼ 他们雇主的议程。 å†…æ ¸å¼€å‘人员通常希望今åŽå‡ å¹´èƒ½åœ¨å†…æ ¸ä¸Šå·¥ä½œï¼Œä½†ä»–ä»¬æ˜Žç™½ä»–ä»¬çš„é›‡ä¸»å¯èƒ½ä¼šæ”¹ å˜ã€‚ä»–ä»¬çœŸçš„ï¼Œå‡ ä¹Žæ¯«æ— ä¾‹å¤–åœ°ï¼Œè‡´åŠ›äºŽåˆ›é€ ä»–ä»¬æ‰€èƒ½åšåˆ°çš„æœ€å¥½çš„å†…æ ¸ï¼›ä»–ä»¬å¹¶ æ²¡æœ‰è¯•å›¾ç»™é›‡ä¸»çš„ç«žäº‰å¯¹æ‰‹é€ æˆä¸é€‚。 -æ‰€æœ‰è¿™äº›å½’æ ¹ç»“åº•éƒ½æ˜¯ï¼Œå½“å®¡é˜…è€…å‘æ‚¨å‘é€è¯„è®ºæ—¶ï¼Œæ‚¨éœ€è¦æ³¨æ„他们æ£åœ¨è¿›è¡Œçš„æŠ€æœ¯ -观察。ä¸è¦è®©ä»–ä»¬çš„è¡¨è¾¾æ–¹å¼æˆ–ä½ è‡ªå·±çš„éª„å‚²é˜»æ¢è¿™ç§äº‹æƒ…çš„å‘ç”Ÿã€‚å½“ä½ åœ¨ä¸€ä¸ªè¡¥ä¸ -上得到评论时,花点时间去ç†è§£è¯„论人想说什么。如果å¯èƒ½çš„è¯ï¼Œè¯·ä¿®å¤å®¡é˜…è€…è¦æ±‚ -您修å¤çš„内容。然åŽå›žå¤å®¡ç¨¿äººï¼šè°¢è°¢ä»–们,并æè¿°ä½ 将如何回ç”他们的问题。 +æ‰€æœ‰è¿™äº›å½’æ ¹ç»“åº•å°±æ˜¯ï¼Œå½“å®¡é˜…è€…å‘æ‚¨å‘é€è¯„è®ºæ—¶ï¼Œæ‚¨éœ€è¦æ³¨æ„他们æ£åœ¨è¿›è¡Œçš„æŠ€æœ¯ +评论。ä¸è¦è®©ä»–ä»¬çš„è¡¨è¾¾æ–¹å¼æˆ–ä½ è‡ªå·±çš„éª„å‚²é˜»æ¢æ¤äº‹ã€‚å½“ä½ åœ¨ä¸€ä¸ªè¡¥ä¸ä¸Šå¾—到评论 +时,花点时间去ç†è§£è¯„论人想说什么。如果å¯èƒ½çš„è¯ï¼Œè¯·ä¿®å¤å®¡é˜…è€…è¦æ±‚您修å¤çš„内 +容。然åŽå›žå¤å®¡é˜…者:谢谢他们,并æè¿°ä½ 将如何回ç”他们的问题。 请注æ„,您ä¸å¿…åŒæ„审阅者建议的æ¯ä¸ªæ›´æ”¹ã€‚如果您认为审阅者误解了您的代ç ,请 解释到底å‘生了什么。如果您对建议的更改有技术上的异议,请æè¿°å®ƒå¹¶è¯æ˜Žæ‚¨å¯¹è¯¥ -问题的解决方案是æ£ç¡®çš„ã€‚å¦‚æžœä½ çš„è§£é‡Šæœ‰é“ç†ï¼Œå®¡ç¨¿äººä¼šæŽ¥å—的。ä¸è¿‡ï¼Œå¦‚æžœä½ çš„ -解释ä¸èƒ½è¯æ˜Žæ˜¯æœ‰è¯´æœåŠ›çš„ï¼Œå°¤å…¶æ˜¯å½“å…¶ä»–äººå¼€å§‹åŒæ„审稿人的观点时,请花些时间 -釿–°è€ƒè™‘ä¸€ä¸‹ã€‚ä½ å¾ˆå®¹æ˜“å¯¹è‡ªå·±è§£å†³é—®é¢˜çš„æ–¹æ³•è§†è€Œä¸è§ï¼Œä»¥è‡³äºŽä½ 没有æ„识到æŸä¸ª -é—®é¢˜æ ¹æœ¬æ˜¯é”™è¯¯çš„ï¼Œæˆ–è€…ä½ ç”šè‡³æ²¡æœ‰è§£å†³æ£ç¡®çš„问题。 +问题的解决方案是æ£ç¡®çš„ã€‚å¦‚æžœä½ çš„è§£é‡Šæœ‰é“ç†ï¼Œå®¡é˜…者会接å—的。ä¸è¿‡ï¼Œå¦‚æžœä½ çš„ +è§£é‡Šè¯æ˜Žç¼ºä¹è¯´æœåŠ›ï¼Œå°¤å…¶æ˜¯å½“å…¶ä»–äººå¼€å§‹åŒæ„å®¡ç¨¿äººçš„è§‚ç‚¹æ—¶ï¼Œè¯·èŠ±äº›æ—¶é—´é‡æ–°è€ƒè™‘ +ä¸€ä¸‹ã€‚ä½ å¾ˆå®¹æ˜“å¯¹è‡ªå·±è§£å†³é—®é¢˜çš„æ–¹æ³•è§†è€Œä¸è§ï¼Œä»¥è‡³äºŽä½ 没有æ„识到æŸäº›ä¸œè¥¿å®Œå…¨ +æ˜¯é”™è¯¯çš„ï¼Œæˆ–è€…ä½ ç”šè‡³æ²¡æœ‰è§£å†³æ£ç¡®çš„问题。 -Andrew Morton建议,æ¯ä¸€æ¡ä¸ä¼šå¯¼è‡´ä»£ç 更改的评论都应该导致é¢å¤–çš„ä»£ç æ³¨é‡Šï¼› -è¿™å¯ä»¥å¸®åŠ©æœªæ¥çš„评论人员é¿å…出现第一次出现的问题。 +Andrew Morton建议,æ¯ä¸€ä¸ªä¸ä¼šå¯¼è‡´ä»£ç 更改的审阅评论都应该产生一个é¢å¤–的代ç +注释;这å¯ä»¥å¸®åŠ©æœªæ¥çš„审阅人员é¿å…第一次出现的问题。 -一个致命的错误是忽视评论,希望它们会消失。他们ä¸ä¼šèµ°çš„ã€‚å¦‚æžœæ‚¨åœ¨æ²¡æœ‰å¯¹ä¹‹å‰ -收到的注释åšå‡ºå“åº”çš„æƒ…å†µä¸‹é‡æ–°å‘布代ç ,那么很å¯èƒ½ä¼šå‘çŽ°è¡¥ä¸æ¯«æ— 用处。 +一个致命的错误是忽视评论,希望它们会消失。它们ä¸ä¼šèµ°çš„ã€‚å¦‚æžœæ‚¨åœ¨æ²¡æœ‰å¯¹ä¹‹å‰ +收到的评论åšå‡ºå“åº”çš„æƒ…å†µä¸‹é‡æ–°å‘布代ç ,那么很å¯èƒ½ä¼šå‘çŽ°è¡¥ä¸æ¯«æ— 用处。 è¯´åˆ°é‡æ–°å‘布代ç :请记ä½ï¼Œå®¡é˜…者ä¸ä¼šè®°ä½æ‚¨ä¸Šæ¬¡å‘布的代ç çš„æ‰€æœ‰ç»†èŠ‚ã€‚å› æ¤ï¼Œ -æé†’å®¡æŸ¥äººå‘˜ä»¥å‰æå‡ºçš„é—®é¢˜ä»¥åŠæ‚¨å¦‚何处ç†è¿™äº›é—®é¢˜æ€»æ˜¯ä¸€ä¸ªå¥½ä¸»æ„;补ä¸å˜æ›´ +æé†’å®¡é˜…äººå‘˜ä»¥å‰æå‡ºçš„é—®é¢˜ä»¥åŠæ‚¨å¦‚何处ç†è¿™äº›é—®é¢˜æ€»æ˜¯ä¸€ä¸ªå¥½ä¸»æ„;补ä¸å˜æ›´ 日志是æä¾›æ¤ç±»ä¿¡æ¯çš„好地方。审阅者ä¸å¿…æœç´¢åˆ—表档案æ¥ç†Ÿæ‚‰ä¸Šæ¬¡æ‰€è¯´çš„内容; -如果您帮助他们开始è¿è¡Œï¼Œå½“他们釿–°è®¿é—®æ‚¨çš„ä»£ç æ—¶ï¼Œä»–们的心情会更好。 +å¦‚æžœæ‚¨å¸®åŠ©ä»–ä»¬ç›´æŽ¥å¼€å§‹ï¼Œå½“ä»–ä»¬é‡æ–°æŸ¥çœ‹æ‚¨çš„ä»£ç æ—¶ï¼Œå¿ƒæƒ…会更好。 å¦‚æžœä½ å·²ç»è¯•ç€åšæ£ç¡®çš„事情,但事情ä»ç„¶æ²¡æœ‰è¿›å±•呢?大多数技术上的分æ§éƒ½å¯ä»¥ -通过讨论æ¥è§£å†³ï¼Œä½†æœ‰æ—¶äººä»¬åªéœ€è¦åšå‡ºå†³å®šã€‚å¦‚æžœä½ çœŸçš„è®¤ä¸ºè¿™ä¸ªå†³å®šå¯¹ä½ ä¸åˆ©ï¼Œ -ä½ å¯ä»¥è¯•ç€å‘更高的æƒåŠ›ä¸Šè¯‰ã€‚åœ¨è¿™ç¯‡æ–‡ç« ä¸ï¼Œæ›´é«˜çš„æƒåŠ›å€¾å‘于Andrew Morton。 -Andrewåœ¨å†…æ ¸å¼€å‘社区ä¸å—i很大的尊é‡ï¼›ä»–ç»å¸¸ä¸ºä¼¼ä¹Žè¢«ç»æœ›åœ°é˜»å¡žäº‹æƒ…清障。 -尽管如æ¤ï¼Œå¯¹Andrew的呼åä¸åº”轻而易举,也ä¸åº”åœ¨æ‰€æœ‰å…¶ä»–æ›¿ä»£æ–¹æ¡ˆéƒ½è¢«æŽ¢ç´¢ä¹‹å‰ -使用。当然,记ä½ï¼Œä»–也å¯èƒ½ä¸åŒæ„ä½ çš„æ„è§ã€‚ +通过讨论æ¥è§£å†³ï¼Œä½†æœ‰æ—¶äººä»¬ä»éœ€è¦åšå‡ºå†³å®šã€‚å¦‚æžœä½ çœŸçš„è®¤ä¸ºè¿™ä¸ªå†³å®šå¯¹ä½ ä¸åˆ©ï¼Œ +ä½ å¯ä»¥è¯•ç€å‘有更高æƒåŠ›çš„äººä¸Šè¯‰ã€‚å¯¹äºŽæœ¬æ–‡ï¼Œæ›´é«˜æƒåŠ›çš„äººæ˜¯ Andrew Morton 。 +Andrew åœ¨å†…æ ¸å¼€å‘社区ä¸éžå¸¸å—尊敬;他ç»å¸¸ä¸ºä¼¼ä¹Žè¢«ç»æœ›é˜»å¡žçš„事情清障。尽管 +如æ¤ï¼Œä¸åº”轻易就直接找 Andrew ,也ä¸åº”在所有其他替代方案都被å°è¯•之剿‰¾ä»–。 +当然,记ä½ï¼Œä»–也å¯èƒ½ä¸åŒæ„ä½ çš„æ„è§ã€‚ 接下æ¥ä¼šå‘生什么 ---------------- -如果一个补ä¸è¢«è®¤ä¸ºæ˜¯æ·»åŠ åˆ°å†…æ ¸ä¸çš„一件好事,并且一旦大多数审查问题得到解决, -下一æ¥é€šå¸¸æ˜¯è¿›å…¥åç³»ç»Ÿç»´æŠ¤äººå‘˜çš„æ ‘ä¸ã€‚工作方å¼å› å系统而异;æ¯ä¸ªç»´æŠ¤äººå‘˜éƒ½ -有自己的工作方å¼ã€‚特别是,å¯èƒ½æœ‰ä¸æ¢ä¸€æ£µæ ‘â€”â€”ä¸€æ£µæ ‘ï¼Œä¹Ÿè®¸ï¼Œä¸“é—¨ç”¨äºŽè®¡åˆ’ä¸‹ä¸€ -个åˆå¹¶çª—å£çš„è¡¥ä¸ï¼Œå¦ä¸€æ£µæ ‘用于长期工作。 +如果一个补ä¸è¢«è®¤ä¸ºé€‚åˆæ·»åŠ åˆ°å†…æ ¸ä¸ï¼Œå¹¶ä¸”大多数审查问题得到解决,下一æ¥é€šå¸¸ +是进入åç³»ç»Ÿç»´æŠ¤äººå‘˜çš„æ ‘ä¸ã€‚工作方å¼å› å系统而异;æ¯ä¸ªç»´æŠ¤äººå‘˜éƒ½æœ‰è‡ªå·±çš„ +工作方å¼ã€‚特别是å¯èƒ½æœ‰ä¸æ¢ä¸€æ£µæ ‘â€”â€”ä¹Ÿè®¸ä¸€æ£µæ ‘ä¸“é—¨ç”¨äºŽè®¡åˆ’ä¸‹ä¸€ä¸ªåˆå¹¶çª—å£çš„ +è¡¥ä¸ï¼Œå¦ä¸€æ£µæ ‘用于长期工作。 -对于应用于没有明显åç³»ç»Ÿæ ‘ï¼ˆä¾‹å¦‚å†…å˜ç®¡ç†ä¿®è¡¥ç¨‹åºï¼‰çš„区域的修补程åºï¼Œé»˜è®¤æ ‘ -通常以-mm结尾。影å“多个å系统的补ä¸ä¹Ÿå¯ä»¥æœ€ç»ˆé€šè¿‡-mmæ ‘ã€‚ +对于应用到ä¸å±žäºŽæ˜Žæ˜¾åç³»ç»Ÿæ ‘ï¼ˆä¾‹å¦‚å†…å˜ç®¡ç†ä¿®è¡¥ç¨‹åºï¼‰çš„区域的修补程åºï¼Œé»˜è®¤æ ‘ +通常上溯到-mm。影å“多个å系统的补ä¸ä¹Ÿå¯ä»¥æœ€ç»ˆè¿›å…¥-mmæ ‘ã€‚ 包å«åœ¨åç³»ç»Ÿæ ‘ä¸å¯ä»¥æé«˜è¡¥ä¸çš„å¯è§æ€§ã€‚çŽ°åœ¨ï¼Œä½¿ç”¨è¯¥æ ‘çš„å…¶ä»–å¼€å‘人员将默认获 å¾—è¡¥ä¸ã€‚åç³»ç»Ÿæ ‘é€šå¸¸ä¹Ÿä¸ºLinuxæä¾›æ”¯æŒï¼Œä½¿å…¶å†…容对整个开å‘社区å¯è§ã€‚在这一点 上,您很å¯èƒ½ä¼šä»Žä¸€ç»„新的审阅者那里得到更多的评论;这些评论需è¦åƒä¸Šä¸€è½®é‚£æ · -得到回ç”。 +得到回应。 -在这一点上也会å‘生什么,这å–å†³äºŽä½ çš„è¡¥ä¸çš„æ€§è´¨ï¼Œæ˜¯ä¸Žå…¶ä»–人æ£åœ¨åšçš„工作å‘生 +在这时也会å‘生点什么,这å–å†³äºŽä½ çš„è¡¥ä¸çš„æ€§è´¨ï¼Œæ˜¯å¦ä¸Žå…¶ä»–人æ£åœ¨åšçš„工作å‘生 冲çªã€‚在最å的情况下,严é‡çš„è¡¥ä¸å†²çªå¯èƒ½ä¼šå¯¼è‡´ä¸€äº›å·¥ä½œè¢«æç½®ï¼Œä»¥ä¾¿å‰©ä½™çš„è¡¥ä¸ å¯ä»¥æˆå½¢å¹¶åˆå¹¶ã€‚å¦ä¸€äº›æ—¶å€™ï¼Œå†²çªè§£å†³å°†æ¶‰åŠåˆ°ä¸Žå…¶ä»–å¼€å‘人员åˆä½œï¼Œå¯èƒ½è¿˜ä¼š åœ¨æ ‘ä¹‹é—´ç§»åŠ¨ä¸€äº›è¡¥ä¸ï¼Œä»¥ç¡®ä¿æ‰€æœ‰çš„应用都是干净的。这项工作å¯èƒ½æ˜¯ä¸€ä»¶ç—›è‹¦çš„ -事情,但è¦è®¡ç®—您的ç¦ç¥‰ï¼šåœ¨Linuxä¸‹ä¸€æ£µæ ‘å‡ºçŽ°ä¹‹å‰ï¼Œè¿™äº›å†²çªé€šå¸¸åªåœ¨åˆå¹¶çª—å£ -ä¸å‡ºçŽ°ï¼Œå¿…é¡»è¿…é€Ÿè§£å†³ã€‚çŽ°åœ¨å¯ä»¥åœ¨åˆå¹¶çª—壿‰“开之å‰ï¼Œåœ¨ç©ºé—²æ—¶è§£å†³è¿™äº›é—®é¢˜ã€‚ +事情,但也需庆幸现在的幸ç¦ï¼šåœ¨linux-nextæ ‘å‡ºçŽ°ä¹‹å‰ï¼Œè¿™äº›å†²çªé€šå¸¸åªåœ¨åˆå¹¶çª—å£ +ä¸å‡ºçŽ°ï¼Œå¿…é¡»è¿…é€Ÿè§£å†³ã€‚çŽ°åœ¨å¯ä»¥åœ¨åˆå¹¶çª—壿‰“开之å‰çš„空闲时间解决这些问题。 有æœä¸€æ—¥ï¼Œå¦‚果一切顺利,您将登录并看到您的补ä¸å·²ç»åˆå¹¶åˆ°ä¸»çº¿å†…æ ¸ä¸ã€‚ç¥è´ºä½ ï¼ -ç„¶è€Œï¼Œä¸€æ—¦åº†ç¥æ´»åŠ¨å®Œæˆï¼ˆå¹¶ä¸”您已ç»å°†è‡ªå·±æ·»åŠ åˆ°ç»´æŠ¤äººå‘˜æ–‡ä»¶ä¸ï¼‰ï¼Œå°±å€¼å¾—è®°ä½ -一个é‡è¦çš„å°äº‹å®žï¼šå·¥ä½œä»ç„¶æ²¡æœ‰å®Œæˆã€‚并入主线带æ¥äº†è‡ªèº«çš„æŒ‘战。 +然而,一旦庆ç¥å®Œäº†ï¼ˆå¹¶ä¸”您已ç»å°†è‡ªå·±æ·»åŠ åˆ°ç»´æŠ¤äººå‘˜æ–‡ä»¶ä¸ï¼‰ï¼Œå°±ä¸€å®šè¦è®°ä½ +一个é‡è¦çš„å°äº‹å®žï¼šå·¥ä½œä»ç„¶æ²¡æœ‰å®Œæˆã€‚并入主线也带æ¥äº†å®ƒçš„æŒ‘战。 -首先,补ä¸çš„å¯è§æ€§å†æ¬¡æé«˜ã€‚å¯èƒ½ä¼šæœ‰æ–°ä¸€è½®çš„å¼€å‘者评论,他们以å‰ä¸çŸ¥é“è¿™ -个补ä¸ã€‚忽略它们å¯èƒ½å¾ˆæœ‰è¯±æƒ‘åŠ›ï¼Œå› ä¸ºæ‚¨çš„ä»£ç ä¸å†å˜åœ¨ä»»ä½•被åˆå¹¶çš„问题。但是, -è¦æŠµåˆ¶è¿™ç§è¯±æƒ‘,您ä»ç„¶éœ€è¦å¯¹æœ‰é—®é¢˜æˆ–建议的开å‘人员作出å“应。 +首先,补ä¸çš„å¯è§æ€§å†æ¬¡æé«˜ã€‚å¯èƒ½ä¼šæœ‰ä»¥å‰ä¸çŸ¥é“这个补ä¸çš„å¼€å‘者的新一轮评论。 +忽略它们å¯èƒ½å¾ˆæœ‰è¯±æƒ‘åŠ›ï¼Œå› ä¸ºæ‚¨çš„ä»£ç ä¸å†å˜åœ¨ä»»ä½•被åˆå¹¶çš„é—®é¢˜ã€‚ä½†æ˜¯ï¼Œè¦æŠµåˆ¶ +è¿™ç§è¯±æƒ‘,您ä»ç„¶éœ€è¦å¯¹æœ‰é—®é¢˜æˆ–建议的开å‘人员作出å“应。 -ä¸è¿‡ï¼Œæ›´é‡è¦çš„æ˜¯ï¼šå°†ä»£ç 包å«åœ¨ä¸»çº¿ä¸ä¼šå°†ä»£ç 交给更大的一组测试人员。å³ä½¿æ‚¨ -为尚未æä¾›çš„硬件æä¾›äº†é©±åŠ¨ç¨‹åºï¼Œæ‚¨ä¹Ÿä¼šæƒŠè®¶äºŽæœ‰å¤šå°‘äººä¼šå°†æ‚¨çš„ä»£ç æž„å»ºåˆ°å†…æ ¸ -ä¸ã€‚当然,如果有测试人员,也会有错误报告。 +ä¸è¿‡ï¼Œæ›´é‡è¦çš„æ˜¯ï¼šå°†ä»£ç 包å«åœ¨ä¸»çº¿ä¸ä¼šå°†ä»£ç 交给更多的一些测试人员。å³ä½¿æ‚¨ +为尚未å¯ç”¨çš„硬件æä¾›äº†é©±åŠ¨ç¨‹åºï¼Œæ‚¨ä¹Ÿä¼šæƒŠè®¶äºŽæœ‰å¤šå°‘äººä¼šå°†æ‚¨çš„ä»£ç æž„å»ºåˆ°å†…æ ¸ +ä¸ã€‚当然,如果有测试人员,也å¯èƒ½ä¼šæœ‰é”™è¯¯æŠ¥å‘Šã€‚ -æœ€ç³Ÿç³•çš„é”™è¯¯æŠ¥å‘Šæ˜¯å›žå½’ã€‚å¦‚æžœä½ çš„è¡¥ä¸å¯¼è‡´å›žå½’ï¼Œä½ ä¼šå‘现很多ä¸èˆ’æœçš„眼ç›ç›¯ç€ -ä½ ï¼›å›žå½’éœ€è¦å°½å¿«ä¿®å¤ã€‚å¦‚æžœæ‚¨ä¸æ„¿æ„æˆ–æ— æ³•ä¿®å¤å›žå½’(其他人都ä¸ä¼šä¸ºæ‚¨ä¿®å¤ï¼‰ï¼Œ +æœ€ç³Ÿç³•çš„é”™è¯¯æŠ¥å‘Šæ˜¯å›žå½’ã€‚å¦‚æžœä½ çš„è¡¥ä¸å¯¼è‡´å›žå½’ï¼Œä½ ä¼šå‘çŽ°å¤šåˆ°è®©ä½ ä¸èˆ’æœçš„眼ç›ç›¯ +ç€ä½ ;回归需è¦å°½å¿«ä¿®å¤ã€‚å¦‚æžœæ‚¨ä¸æ„¿æ„æˆ–æ— æ³•ä¿®å¤å›žå½’(其他人都ä¸ä¼šä¸ºæ‚¨ä¿®å¤ï¼‰ï¼Œ 那么在稳定期内,您的补ä¸å‡ 乎肯定会被移除。除了å¦å®šæ‚¨ä¸ºä½¿è¡¥ä¸è¿›å…¥ä¸»çº¿æ‰€åšçš„ -所有工作之外,如果由于未能修å¤å›žå½’è€Œå–æ¶ˆè¡¥ä¸ï¼Œå¾ˆå¯èƒ½ä¼šä½¿å°†æ¥çš„工作更难åˆå¹¶ã€‚ +所有工作之外,如果由于未能修å¤å›žå½’è€Œå–æ¶ˆè¡¥ä¸ï¼Œå¾ˆå¯èƒ½ä¼šä½¿å°†æ¥çš„工作更难被åˆå¹¶ã€‚ -在处ç†å®Œä»»ä½•回归之åŽï¼Œå¯èƒ½è¿˜æœ‰å…¶ä»–普通的bug需è¦å¤„ç†ã€‚稳定期是修å¤è¿™äº›é”™è¯¯å¹¶ -ç¡®ä¿ä»£ç åœ¨ä¸»çº¿å†…æ ¸ç‰ˆæœ¬ä¸çš„首次å‘布尽å¯èƒ½å¯é 的最好机会。所以,请回ç”错误 +在处ç†å®Œä»»ä½•回归之åŽï¼Œå¯èƒ½è¿˜æœ‰å…¶ä»–普通缺陷需è¦å¤„ç†ã€‚稳定期是修å¤è¿™äº›é”™è¯¯å¹¶ +ç¡®ä¿ä»£ç åœ¨ä¸»çº¿å†…æ ¸ç‰ˆæœ¬ä¸çš„首次å‘布尽å¯èƒ½å¯é 的最好机会。所以,请回应错误 报告,并尽å¯èƒ½è§£å†³é—®é¢˜ã€‚这就是稳定期的目的;一旦解决了旧补ä¸çš„任何问题,就 -å¯ä»¥å¼€å§‹åˆ›å»ºé…·çš„æ–°è¡¥ä¸ã€‚ +å¯ä»¥å¼€å§‹å°½æƒ…创建新补ä¸ã€‚ -别忘了,还有其他里程碑也å¯èƒ½ä¼šåˆ›å»ºbug报告:下一个主线稳定版本,当著åçš„å‘行 -商选择包å«è¡¥ä¸çš„å†…æ ¸ç‰ˆæœ¬æ—¶ï¼Œç‰ç‰ã€‚ç»§ç»å“应这些报告是您工作的基本骄傲。但是, -å¦‚æžœè¿™ä¸æ˜¯è¶³å¤Ÿçš„动机,那么也值得考虑的是,开å‘社区会记ä½é‚£äº›åœ¨åˆå¹¶åŽå¯¹ä»£ç -失去兴趣的开å‘äººå‘˜ã€‚ä¸‹ä¸€æ¬¡ä½ å‘å¸ƒè¡¥ä¸æ—¶ï¼Œä»–ä»¬ä¼šä»¥ä½ ä»¥åŽä¸ä¼šåœ¨èº«è¾¹ç»´æŠ¤å®ƒä¸ºå‡ -设æ¥è¯„估它。 +别忘了,还有其他节点也å¯èƒ½ä¼šåˆ›å»ºç¼ºé™·æŠ¥å‘Šï¼šä¸‹ä¸€ä¸ªä¸»çº¿ç¨³å®šç‰ˆæœ¬ï¼Œå½“è‘—åçš„å‘行 +å•†é€‰æ‹©åŒ…å«æ‚¨è¡¥ä¸çš„å†…æ ¸ç‰ˆæœ¬æ—¶ç‰ç‰ã€‚ç»§ç»å“åº”è¿™äº›æŠ¥å‘Šæ˜¯æ‚¨å·¥ä½œçš„åŸºæœ¬ç´ å…»ã€‚ä½†æ˜¯ +如果这ä¸èƒ½æä¾›è¶³å¤Ÿçš„动机,那么也需è¦è€ƒè™‘:开å‘社区会记ä½é‚£äº›åœ¨åˆå¹¶åŽå¯¹ä»£ç +失去兴趣的开å‘äººå‘˜ã€‚ä¸‹ä¸€æ¬¡ä½ å‘å¸ƒè¡¥ä¸æ—¶ï¼Œä»–ä»¬ä¼šä»¥ä½ ä»¥åŽä¸ä¼šæŒç»ç»´æŠ¤å®ƒä¸ºå‰æ +æ¥è¯„估它。 å…¶ä»–å¯èƒ½å‘生的事情 ------------------ -æœ‰ä¸€å¤©ï¼Œä½ å¯ä»¥æ‰“å¼€ä½ çš„é‚®ä»¶å®¢æˆ·ç«¯ï¼Œçœ‹åˆ°æœ‰äººç»™ä½ å¯„äº†ä¸€ä¸ªä»£ç è¡¥ä¸ã€‚毕竟,这是 +æŸå¤©ï¼Œå½“ä½ æ‰“å¼€ä½ çš„é‚®ä»¶å®¢æˆ·ç«¯æ—¶ï¼Œçœ‹åˆ°æœ‰äººç»™ä½ å¯„äº†ä¸€ä¸ªä»£ç è¡¥ä¸ã€‚毕竟,这是 让您的代ç 公开å˜åœ¨çš„å¥½å¤„ä¹‹ä¸€ã€‚å¦‚æžœæ‚¨åŒæ„这个补ä¸ï¼Œæ‚¨å¯ä»¥å°†å®ƒè½¬å‘ç»™å系统 -维护人员(确ä¿åŒ…å«ä¸€ä¸ªæ£ç¡®çš„From:è¡Œï¼Œè¿™æ ·å±žæ€§æ˜¯æ£ç¡®çš„ï¼Œå¹¶æ·»åŠ ä¸€ä¸ªæ‚¨è‡ªå·± -çš„ç¾å‡†ï¼‰ï¼Œæˆ–者回å¤ä¸€ä¸ªAcked-by,让原始å‘é€è€…å‘上å‘é€å®ƒã€‚ +维护人员(确ä¿åŒ…å«ä¸€ä¸ªæ£ç¡®çš„From:è¡Œï¼Œè¿™æ ·å±žæ€§æ˜¯æ£ç¡®çš„ï¼Œå¹¶æ·»åŠ ä¸€ä¸ªæ‚¨è‡ªå·±çš„ +signoff ),或者回å¤ä¸€ä¸ª Acked-by: 让原始å‘é€è€…å‘上å‘é€å®ƒã€‚ -如果您ä¸åŒæ„è¡¥ä¸ï¼Œè¯·å‘é€ä¸€ä¸ªç¤¼è²Œçš„回å¤ï¼Œè§£é‡ŠåŽŸå› ã€‚å¦‚æžœå¯èƒ½çš„è¯ï¼Œå‘Šè¯‰ä½œè€…éœ€è¦ -åšå“ªäº›æ›´æ”¹æ‰èƒ½è®©æ‚¨æŽ¥å—è¡¥ä¸ã€‚对于代ç 的编写者和维护者所å对的åˆå¹¶è¡¥ä¸ï¼Œå˜åœ¨ç€ -一定的阻力,但仅æ¤è€Œå·²ã€‚å¦‚æžœä½ è¢«è®¤ä¸ºä¸å¿…è¦çš„阻ç¢äº†å¥½çš„å·¥ä½œï¼Œé‚£ä¹ˆè¿™äº›è¡¥ä¸æœ€ -终会ç»è¿‡ä½ 身边并进入主线。在Linuxå†…æ ¸ä¸ï¼Œæ²¡æœ‰äººå¯¹ä»»ä½•ä»£ç æ‹¥æœ‰ç»å¯¹çš„å¦å†³æƒã€‚ -除了Linus。 +如果您ä¸åŒæ„è¡¥ä¸ï¼Œè¯·ç¤¼è²Œåœ°å›žå¤ï¼Œè§£é‡ŠåŽŸå› ã€‚å¦‚æžœå¯èƒ½çš„è¯ï¼Œå‘Šè¯‰ä½œè€…需è¦åšå“ªäº› +更改æ‰èƒ½è®©æ‚¨æŽ¥å—è¡¥ä¸ã€‚åˆå¹¶ä»£ç 的编写者和维护者所å对的补ä¸çš„ç¡®å˜åœ¨ç€ä¸€å®šçš„ +阻力,但仅æ¤è€Œå·²ã€‚å¦‚æžœä½ è¢«è®¤ä¸ºä¸å¿…è¦çš„阻ç¢äº†å¥½çš„å·¥ä½œï¼Œé‚£ä¹ˆè¿™äº›è¡¥ä¸æœ€ç»ˆä¼š +ç»•è¿‡ä½ å¹¶è¿›å…¥ä¸»çº¿ã€‚åœ¨Linuxå†…æ ¸ä¸ï¼Œæ²¡æœ‰äººå¯¹ä»»ä½•ä»£ç æ‹¥æœ‰ç»å¯¹çš„å¦å†³æƒã€‚å¯èƒ½é™¤ +了Linus。 在éžå¸¸ç½•è§çš„æƒ…况下,您å¯èƒ½ä¼šçœ‹åˆ°å®Œå…¨ä¸åŒçš„东西:å¦ä¸€ä¸ªå¼€å‘人员å‘布了针对您 -的问题的ä¸åŒè§£å†³æ–¹æ¡ˆã€‚在这一点上,两个补ä¸ä¸çš„一个å¯èƒ½ä¸ä¼šåˆå¹¶ï¼Œâ€œæˆ‘的在这里 -是第一个â€ä¸è¢«è®¤ä¸ºæ˜¯ä¸€ä¸ªä»¤äººä¿¡æœçš„æŠ€æœ¯è®ºæ®ã€‚如果有人的补ä¸å–ä»£äº†ä½ çš„è¡¥ä¸è€Œè¿› -å…¥äº†ä¸»çº¿ï¼Œé‚£ä¹ˆåªæœ‰ä¸€ç§æ–¹æ³•å¯ä»¥å›žåº”ä½ ï¼šé«˜å…´ä½ çš„é—®é¢˜å¾—åˆ°è§£å†³ï¼Œç»§ç»ä½ 的工作。 -ä»¥è¿™ç§æ–¹å¼æŠŠä¸€ä¸ªäººçš„工作推到一边å¯èƒ½ä¼šä¼¤å®³å’Œæ°”é¦ï¼Œä½†æ˜¯åœ¨ä»–们忘记了è°çš„è¡¥ä¸ -真æ£è¢«åˆå¹¶å¾ˆä¹…之åŽï¼Œç¤¾åŒºä¼šè®°ä½ä½ çš„å应。 +的问题的ä¸åŒè§£å†³æ–¹æ¡ˆã€‚在这时,两个补ä¸ä¹‹ä¸€å¯èƒ½ä¸ä¼šè¢«åˆå¹¶ï¼Œâ€œæˆ‘的补ä¸é¦–å…ˆ +å‘布â€ä¸è¢«è®¤ä¸ºæ˜¯ä¸€ä¸ªä»¤äººä¿¡æœçš„æŠ€æœ¯è®ºæ®ã€‚如果有别人的补ä¸å–ä»£äº†ä½ çš„è¡¥ä¸è€Œè¿› +å…¥äº†ä¸»çº¿ï¼Œé‚£ä¹ˆåªæœ‰ä¸€ç§æ–¹æ³•å¯ä»¥å›žåº”ä½ ï¼šå¾ˆé«˜å…´ä½ çš„é—®é¢˜è§£å†³äº†ï¼Œè¯·ç»§ç»å·¥ä½œå§ã€‚ +ä»¥è¿™ç§æ–¹å¼æŠŠæŸäººçš„工作推到一边å¯èƒ½å¯¼è‡´ä¼¤å¿ƒå’Œæ°”é¦ï¼Œä½†æ˜¯ç¤¾åŒºä¼šè®°ä½ä½ çš„å应, +å³ä½¿å¾ˆä¹…以åŽä»–们已ç»å¿˜è®°äº†è°çš„è¡¥ä¸çœŸæ£è¢«åˆå¹¶ã€‚ diff --git a/Documentation/translations/zh_CN/process/7.AdvancedTopics.rst b/Documentation/translations/zh_CN/process/7.AdvancedTopics.rst index 2f0ef750746f385f6022620a9c8b9e57e9ef62b0..6d0dadae13b12ad1fa3313e5de468b202db480a3 100644 --- a/Documentation/translations/zh_CN/process/7.AdvancedTopics.rst +++ b/Documentation/translations/zh_CN/process/7.AdvancedTopics.rst @@ -1,7 +1,14 @@ .. include:: ../disclaimer-zh_CN.rst :Original: :ref:`Documentation/process/7.AdvancedTopics.rst <development_advancedtopics>` -:Translator: Alex Shi <alex.shi@linux.alibaba.com> + +:Translator: + + 时奎亮 Alex Shi <alex.shi@linux.alibaba.com> + +:æ ¡è¯‘: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> .. _cn_development_advancedtopics: @@ -15,110 +22,112 @@ --------------- å†…æ ¸ä½¿ç”¨åˆ†å¸ƒå¼ç‰ˆæœ¬æŽ§åˆ¶å§‹äºŽ2002å¹´åˆï¼Œå½“æ—¶Linus首次开始使用专有的Bitkeeper应用 -程åºã€‚虽然bitkeeperå˜åœ¨äº‰è®®ï¼Œä½†å®ƒæ‰€ä½“çŽ°çš„è½¯ä»¶ç‰ˆæœ¬ç®¡ç†æ–¹æ³•å´è‚¯å®šä¸æ˜¯ã€‚åˆ†å¸ƒå¼ -版本控制å¯ä»¥ç«‹å³åŠ é€Ÿå†…æ ¸å¼€å‘项目。在当å‰çš„æ—¶ä»£ï¼Œæœ‰å‡ ç§å…è´¹çš„æ¯”ç‰¹ä¿æŒå™¨æ›¿ä»£å“。 -æ— è®ºå¥½åï¼Œå†…æ ¸é¡¹ç›®éƒ½å°†Git作为其选择的工具。 +程åºã€‚虽然BitKeeperå˜åœ¨äº‰è®®ï¼Œä½†å®ƒæ‰€ä½“çŽ°çš„è½¯ä»¶ç‰ˆæœ¬ç®¡ç†æ–¹æ³•å´è‚¯å®šä¸æ˜¯ã€‚åˆ†å¸ƒå¼ +版本控制å¯ä»¥ç«‹å³åŠ é€Ÿå†…æ ¸å¼€å‘é¡¹ç›®ã€‚çŽ°åœ¨æœ‰å¥½å‡ ç§å…费的BitKeeper替代å“。 +ä½†æ— è®ºå¥½åï¼Œå†…æ ¸é¡¹ç›®éƒ½å·²ç»é€‰æ‹©äº†Git作为其工具。 -使用Git管ç†è¡¥ä¸å¯ä»¥ä½¿å¼€å‘äººå‘˜çš„ç”Ÿæ´»æ›´åŠ è½»æ¾ï¼Œå°¤å…¶æ˜¯éšç€è¡¥ä¸æ•°é‡çš„å¢žåŠ ã€‚Git -也有其粗糙的边缘和一定的å±é™©ï¼Œå®ƒæ˜¯ä¸€ä¸ªå¹´è½»å’Œå¼ºå¤§çš„工具,ä»ç„¶åœ¨å…¶å¼€å‘人员完善 +使用Git管ç†è¡¥ä¸å¯ä»¥ä½¿å¼€å‘äººå‘˜çš„ç”Ÿæ´»æ›´åŠ è½»æ¾ï¼Œå°¤å…¶æ˜¯éšç€è¡¥ä¸æ•°é‡çš„增长。Git也 +有其粗糙的边角和一定的å±é™©æ€§ï¼Œå®ƒæ˜¯ä¸€ä¸ªå¹´è½»å’Œå¼ºå¤§çš„工具,ä»ç„¶åœ¨å…¶å¼€å‘人员完善 ä¸ã€‚本文档ä¸ä¼šè¯•图教会读者如何使用git;这会是个巨长的文档。相å,这里的é‡ç‚¹ -将是Git如何特别适åˆå†…æ ¸å¼€å‘过程。想è¦åŠ å¿«Git的开å‘人员å¯ä»¥åœ¨ä»¥ä¸‹ç½‘站上找到 -更多信æ¯ï¼š +将是Git如何特别适åˆå†…æ ¸å¼€å‘过程。想è¦åŠ å¿«ç”¨Git速度的开å‘人员å¯ä»¥åœ¨ä»¥ä¸‹ç½‘站上 +找到更多信æ¯ï¼š https://git-scm.com/ https://www.kernel.org/pub/software/scm/git/docs/user-manual.html -在å°è¯•使用它使补ä¸å¯ä¾›å…¶ä»–人使用之å‰ï¼Œç¬¬ä¸€è¦åŠ¡æ˜¯é˜…è¯»ä¸Šè¿°ç«™ç‚¹ï¼Œå¯¹Git的工作 -æ–¹å¼æœ‰ä¸€ä¸ªæ‰Žå®žçš„了解。使用Git的开å‘人员应该能够获得主线å˜å‚¨åº“的副本,探索 -修订历å²ï¼Œæäº¤å¯¹æ ‘的更改,使用分支ç‰ã€‚了解Git用于é‡å†™åކå²çš„工具(如Rebase) -也很有用。Git有自己的术è¯å’Œæ¦‚念;Git的新用户应该了解refsã€è¿œç¨‹åˆ†æ”¯ã€ç´¢å¼•〠-å¿«è¿›åˆå¹¶ã€æŽ¨æ‹‰ã€åˆ†ç¦»å¤´ç‰ã€‚一开始å¯èƒ½æœ‰ç‚¹å“人,但这些概念ä¸éš¾é€šè¿‡ä¸€ç‚¹å¦ä¹ æ¥ +åŒæ—¶ç½‘上也能找到å„ç§å„æ ·çš„æ•™ç¨‹ã€‚ + +在å°è¯•使用它生æˆè¡¥ä¸ä¾›ä»–人使用之å‰ï¼Œç¬¬ä¸€è¦åŠ¡æ˜¯é˜…è¯»ä¸Šè¿°ç½‘é¡µï¼Œå¯¹Gitçš„å·¥ä½œæ–¹å¼ +有一个扎实的了解。使用Git的开å‘人员应能进行拉å–主线å˜å‚¨åº“的副本,查询修订 +历å²ï¼Œæäº¤å¯¹æ ‘çš„æ›´æ”¹ï¼Œä½¿ç”¨åˆ†æ”¯ç‰æ“作。了解Git用于é‡å†™åކå²çš„工具(如rebase) +也很有用。Git有自己的术è¯å’Œæ¦‚念;Git的新用户应该了解引用ã€è¿œç¨‹åˆ†æ”¯ã€ç´¢å¼•〠+å¿«è¿›åˆå¹¶ã€æŽ¨æ‹‰ã€æ¸¸ç¦»å¤´ç‰ã€‚一开始å¯èƒ½æœ‰ç‚¹å“人,但这些概念ä¸éš¾é€šè¿‡ä¸€ç‚¹å¦ä¹ æ¥ ç†è§£ã€‚ 使用git生æˆé€šè¿‡ç”µå邮件æäº¤çš„è¡¥ä¸æ˜¯æé«˜é€Ÿåº¦çš„ä¸€ä¸ªå¾ˆå¥½çš„ç»ƒä¹ ã€‚ -当您准备好开始安装Gitæ ‘ä¾›å…¶ä»–äººæŸ¥çœ‹æ—¶ï¼Œæ‚¨å½“ç„¶éœ€è¦ä¸€ä¸ªå¯ä»¥ä»Žä¸æå–çš„æœåŠ¡å™¨ã€‚ -如果您有一个å¯ä»¥è®¿é—®Internet的系统,那么使用gitå®ˆæŠ¤è¿›ç¨‹è®¾ç½®è¿™æ ·çš„æœåŠ¡å™¨ç›¸ -对简å•。å¦åˆ™ï¼Œå…费的公共托管网站(例如github)开始出现在网络上。æˆç†Ÿçš„å¼€å‘ -人员å¯ä»¥åœ¨kernel.orgä¸ŠèŽ·å¾—ä¸€ä¸ªå¸æˆ·ï¼Œä½†è¿™äº›å¸æˆ·å¹¶ä¸å®¹æ˜“找到;有关更多信æ¯ï¼Œ -请å‚阅 https://kernel.org/faq/ +当您准备好开始建立Gitæ ‘ä¾›å…¶ä»–äººæŸ¥çœ‹æ—¶ï¼Œæ— ç–‘éœ€è¦ä¸€ä¸ªå¯ä»¥ä»Žä¸æ‹‰å–çš„æœåŠ¡å™¨ã€‚ +如果您有一个å¯ä»¥è®¿é—®å› 特网的系统,那么使用git-daemonè®¾ç½®è¿™æ ·çš„æœåŠ¡å™¨ç›¸å¯¹ +简å•ã€‚åŒæ—¶ï¼Œå…费的公共托管网站(例如github)也开始出现在网络上。æˆç†Ÿçš„å¼€å‘ +人员å¯ä»¥åœ¨kernel.orgä¸ŠèŽ·å¾—ä¸€ä¸ªå¸æˆ·ï¼Œä½†è¿™äº›å¸æˆ·å¹¶ä¸å®¹æ˜“得到;更多有关信æ¯ï¼Œ +请å‚阅 https://kernel.org/faq/ 。 æ£å¸¸çš„Git工作æµç¨‹æ¶‰åŠåˆ°è®¸å¤šåˆ†æ”¯çš„使用。æ¯ä¸€æ¡å¼€å‘线都å¯ä»¥åˆ†ä¸ºå•独的“主题 -分支â€ï¼Œå¹¶ç‹¬ç«‹ç»´æŠ¤ã€‚Git的分支机构很便宜,没有ç†ç”±ä¸å…费使用它们。而且,在 -任何情况下,您都ä¸åº”该在任何您打算让其他人从ä¸å—益的分支ä¸è¿›è¡Œå¼€å‘。应该 -å°å¿ƒåœ°åˆ›å»ºå…¬å¼€å¯ç”¨çš„分支;当它们处于完整的形å¼å¹¶å‡†å¤‡å¥½è¿è¡Œæ—¶(è€Œä¸æ˜¯ä¹‹å‰ï¼‰ï¼Œ -åˆå¹¶å¼€å‘分支的补ä¸ã€‚ +分支â€ï¼Œå¹¶ç‹¬ç«‹ç»´æŠ¤ã€‚Git的分支很容易使用,没有ç†ç”±ä¸ä½¿ç”¨å®ƒä»¬ã€‚而且,在任何 +情况下,您都ä¸åº”è¯¥åœ¨ä»»ä½•æ‚¨æ‰“ç®—è®©å…¶ä»–äººä»Žä¸æ‹‰å–的分支ä¸è¿›è¡Œå¼€å‘。应该å°å¿ƒåœ° +创建公开å¯ç”¨çš„分支;当开å‘分支处于完整状æ€å¹¶å·²å‡†å¤‡å¥½æ—¶(è€Œä¸æ˜¯ä¹‹å‰ï¼‰æ‰åˆå¹¶ +å¼€å‘分支的补ä¸ã€‚ Gitæä¾›äº†ä¸€äº›å¼ºå¤§çš„工具,å¯ä»¥è®©æ‚¨é‡å†™å¼€å‘历å²ã€‚ä¸€ä¸ªä¸æ–¹ä¾¿çš„è¡¥ä¸ï¼ˆæ¯”如说, ä¸€ä¸ªæ‰“ç ´äºŒåˆ†æ³•çš„è¡¥ä¸ï¼Œæˆ–者有其他一些明显的缺陷)å¯ä»¥åœ¨é€‚当的ä½ç½®ä¿®å¤ï¼Œæˆ–者 -完全从历å²ä¸æ¶ˆå¤±ã€‚一个补ä¸ç³»åˆ—å¯ä»¥è¢«é‡å†™ï¼Œå°±å¥½åƒå®ƒæ˜¯åœ¨ä»Šå¤©çš„主线之上写的 -ä¸€æ ·ï¼Œå³ä½¿ä½ å·²ç»èŠ±äº†å‡ ä¸ªæœˆçš„æ—¶é—´åœ¨å†™å®ƒã€‚å¯ä»¥é€æ˜Žåœ°å°†æ›´æ”¹ä»Žä¸€ä¸ªåˆ†æ”¯è½¬ç§»åˆ°å¦ -一个分支。ç‰ç‰ã€‚明智地使用git修改历å²çš„能力å¯ä»¥å¸®åŠ©åˆ›å»ºé—®é¢˜æ›´å°‘çš„å¹²å‡€è¡¥ä¸é›†ã€‚ +完全从历å²ä¸æ¶ˆå¤±ã€‚一个补ä¸ç³»åˆ—å¯ä»¥è¢«é‡å†™ï¼Œå°±å¥½åƒå®ƒæ˜¯åœ¨ä»Šå¤©çš„ä¸»çº¿ä¸Šå†™çš„ä¸€æ ·ï¼Œ +å³ä½¿ä½ å·²ç»èŠ±äº†å‡ ä¸ªæœˆçš„æ—¶é—´åœ¨å†™å®ƒã€‚å¯ä»¥é€æ˜Žåœ°å°†æ›´æ”¹ä»Žä¸€ä¸ªåˆ†æ”¯è½¬ç§»åˆ°å¦ä¸€ä¸ª +分支。ç‰ç‰ã€‚明智地使用git修改历å²çš„能力å¯ä»¥å¸®åŠ©åˆ›å»ºé—®é¢˜æ›´å°‘çš„å¹²å‡€è¡¥ä¸é›†ã€‚ -然而,过度使用这ç§èƒ½åŠ›å¯èƒ½ä¼šå¯¼è‡´å…¶ä»–问题,而ä¸ä»…仅是对创建完美项目历å²çš„ -简å•痴迷。é‡å†™åކå²å°†é‡å†™è¯¥åކå²ä¸åŒ…å«çš„æ›´æ”¹ï¼Œå°†ç»è¿‡æµ‹è¯•ï¼ˆå¸Œæœ›ï¼‰çš„å†…æ ¸æ ‘å˜ -ä¸ºæœªç»æµ‹è¯•çš„å†…æ ¸æ ‘ã€‚ä½†æ˜¯ï¼Œé™¤æ¤ä¹‹å¤–,如果开å‘人员没有对项目历å²çš„共享视图, -ä»–ä»¬å°±æ— æ³•è½»æ¾åœ°å作;如果您é‡å†™äº†å…¶ä»–å¼€å‘人员拉入他们å˜å‚¨åº“的历å²ï¼Œæ‚¨å°† -使这些开å‘äººå‘˜çš„ç”Ÿæ´»æ›´åŠ å›°éš¾ã€‚å› æ¤ï¼Œè¿™é‡Œæœ‰ä¸€ä¸ªç®€å•çš„ç»éªŒæ³•则:被导出到其他 -人的历å²åœ¨æ¤åŽé€šå¸¸è¢«è®¤ä¸ºæ˜¯ä¸å¯å˜çš„。 +然而,过度使用这ç§åŠŸèƒ½å¯èƒ½ä¼šå¯¼è‡´å…¶ä»–问题,而ä¸ä»…仅是对创建完美项目历å²çš„ +简å•痴迷。é‡å†™åކå²å°†é‡å†™è¯¥åކå²ä¸åŒ…å«çš„æ›´æ”¹ï¼Œå°†ç»è¿‡æµ‹è¯•(希望如æ¤ï¼‰çš„å†…æ ¸æ ‘ +å˜ä¸ºæœªç»æµ‹è¯•çš„å†…æ ¸æ ‘ã€‚é™¤æ¤ä¹‹å¤–,如果开å‘人员没有共享项目历å²ï¼Œä»–ä»¬å°±æ— æ³• +è½»æ¾åœ°å作;如果您é‡å†™äº†å…¶ä»–å¼€å‘人员拉入他们å˜å‚¨åº“的历å²ï¼Œæ‚¨å°†ä½¿è¿™äº›å¼€å‘ +äººå‘˜çš„ç”Ÿæ´»æ›´åŠ å›°éš¾ã€‚å› æ¤ï¼Œè¿™é‡Œæœ‰ä¸€ä¸ªç®€å•çš„ç»éªŒæ³•åˆ™ï¼šè¢«å¯¼å‡ºåˆ°å…¶ä»–åœ°æ–¹çš„åŽ†å² +在æ¤åŽé€šå¸¸è¢«è®¤ä¸ºæ˜¯ä¸å¯å˜çš„。 å› æ¤ï¼Œä¸€æ—¦å°†ä¸€ç»„更改推é€åˆ°å…¬å¼€å¯ç”¨çš„æœåŠ¡å™¨ä¸Šï¼Œå°±ä¸åº”该é‡å†™è¿™äº›æ›´æ”¹ã€‚如果您 -å°è¯•强制进行ä¸ä¼šå¯¼è‡´å¿«è¿›åˆå¹¶ï¼ˆå³ä¸å…±äº«åŒä¸€åކå²è®°å½•的更改)的更改,Gitå°†å° -试强制执行æ¤è§„则。å¯ä»¥é‡å†™æ¤æ£€æŸ¥ï¼Œæœ‰æ—¶å¯èƒ½éœ€è¦é‡å†™å¯¼å‡ºçš„æ ‘ã€‚åœ¨æ ‘ä¹‹é—´ç§»åŠ¨å˜ -更集以é¿å…Linux-nextä¸çš„冲çªå°±æ˜¯ä¸€ä¸ªä¾‹å。但这ç§è¡Œä¸ºåº”该是罕è§çš„。这就是为 -什么开å‘åº”è¯¥åœ¨ç§æœ‰åˆ†æ”¯ä¸è¿›è¡Œï¼ˆå¿…è¦æ—¶å¯ä»¥é‡å†™ï¼‰å¹¶ä¸”åªæœ‰åœ¨å…¬å…±åˆ†æ”¯å¤„于åˆç†çš„ -é«˜çº§çŠ¶æ€æ—¶æ‰è½¬ç§»åˆ°å…¬å…±åˆ†æ”¯ä¸çš„åŽŸå› ä¹‹ä¸€ã€‚ +å°è¯•å¼ºåˆ¶è¿›è¡Œæ— æ³•å¿«è¿›åˆå¹¶çš„æ›´æ”¹ï¼ˆå³ä¸å…±äº«åŒä¸€åކå²è®°å½•的更改),Gitå°†å°è¯•强制 +执行æ¤è§„则。这å¯èƒ½è¦†ç›–检查,有时甚至需è¦é‡å†™å¯¼å‡ºçš„æ ‘ã€‚åœ¨æ ‘ä¹‹é—´ç§»åŠ¨å˜æ›´é›†ä»¥ +é¿å…linux-nextä¸çš„冲çªå°±æ˜¯ä¸€ä¸ªä¾‹å。但这ç§è¡Œä¸ºåº”该是罕è§çš„。这就是为什么 +å¼€å‘åº”è¯¥åœ¨ç§æœ‰åˆ†æ”¯ä¸è¿›è¡Œï¼ˆå¿…è¦æ—¶å¯ä»¥é‡å†™ï¼‰å¹¶ä¸”åªæœ‰åœ¨å…¬å…±åˆ†æ”¯å¤„于åˆç†çš„较新 +çŠ¶æ€æ—¶æ‰è½¬ç§»åˆ°å…¬å…±åˆ†æ”¯ä¸çš„åŽŸå› ä¹‹ä¸€ã€‚ å½“ä¸»çº¿ï¼ˆæˆ–å…¶ä»–ä¸€ç»„å˜æ›´æ‰€åŸºäºŽçš„æ ‘)å‰è¿›æ—¶ï¼Œå¾ˆå®¹æ˜“ä¸Žè¯¥æ ‘åˆå¹¶ä»¥ä¿æŒé¢†å…ˆåœ°ä½ã€‚ å¯¹äºŽä¸€ä¸ªç§æœ‰çš„分支,rebasing å¯èƒ½æ˜¯ä¸€ä¸ªå¾ˆå®¹æ˜“跟上å¦ä¸€æ£µæ ‘的方法,但是一旦 -ä¸€æ£µæ ‘è¢«å¯¼å‡ºåˆ°å…¨ä¸–ç•Œï¼Œrebasing就䏿˜¯ä¸€ä¸ªé€‰é¡¹ã€‚一旦å‘ç”Ÿè¿™ç§æƒ…况,就必须进行 -完全åˆå¹¶ï¼ˆmerge)。åˆå¹¶æœ‰æ—¶æ˜¯å¾ˆæœ‰æ„义的,但是过于频ç¹çš„åˆå¹¶ä¼šä¸å¿…è¦åœ°æ‰°ä¹± -历å²ã€‚åœ¨è¿™ç§æƒ…况下,建议的技术是ä¸ç»å¸¸åˆå¹¶ï¼Œé€šå¸¸åªåœ¨ç‰¹å®šçš„å‘布点(如主线-rc -å‘布)åˆå¹¶ã€‚å¦‚æžœæ‚¨å¯¹ç‰¹å®šçš„æ›´æ”¹æ„Ÿåˆ°ç´§å¼ ï¼Œåˆ™å¯ä»¥å§‹ç»ˆåœ¨ç§æœ‰åˆ†æ”¯ä¸æ‰§è¡Œæµ‹è¯•åˆå¹¶ã€‚ -åœ¨è¿™ç§æƒ…况下,git rerere 工具很有用;它记ä½åˆå¹¶å†²çªæ˜¯å¦‚ä½•è§£å†³çš„ï¼Œè¿™æ ·æ‚¨å°± -ä¸å¿…é‡å¤ç›¸åŒçš„工作。 +ä¸€æ£µæ ‘è¢«å¯¼å‡ºåˆ°å¤–ç•Œï¼Œrebasingå°±ä¸å¯å–了。一旦å‘ç”Ÿè¿™ç§æƒ…况,就必须进行完全 +åˆå¹¶ï¼ˆmerge)。åˆå¹¶æœ‰æ—¶æ˜¯å¾ˆæœ‰æ„义的,但是过于频ç¹çš„åˆå¹¶ä¼šä¸å¿…è¦åœ°æ‰°ä¹±åކå²ã€‚ +åœ¨è¿™ç§æƒ…å†µä¸‹å»ºè®®çš„åšæ³•是ä¸è¦é¢‘ç¹åˆå¹¶ï¼Œé€šå¸¸åªåœ¨ç‰¹å®šçš„å‘布点(如主线-rcå‘布) +åˆå¹¶ã€‚å¦‚æžœæ‚¨å¯¹ç‰¹å®šçš„æ›´æ”¹æ„Ÿåˆ°ç´§å¼ ï¼Œåˆ™å¯ä»¥å§‹ç»ˆåœ¨ç§æœ‰åˆ†æ”¯ä¸æ‰§è¡Œæµ‹è¯•åˆå¹¶ã€‚在 +è¿™ç§æƒ…况下,git“rerereâ€å·¥å…·å¾ˆæœ‰ç”¨ï¼›å®ƒèƒ½è®°ä½åˆå¹¶å†²çªæ˜¯å¦‚ä½•è§£å†³çš„ï¼Œè¿™æ ·æ‚¨ +å°±ä¸å¿…é‡å¤ç›¸åŒçš„工作。 关于Gitè¿™æ ·çš„å·¥å…·çš„ä¸€ä¸ªæœ€å¤§çš„åå¤æŠ±æ€¨æ˜¯ï¼šè¡¥ä¸ä»Žä¸€ä¸ªå˜å‚¨åº“到å¦ä¸€ä¸ªå˜å‚¨åº“çš„ 大é‡ç§»åŠ¨ä½¿å¾—å¾ˆå®¹æ˜“é™·å…¥é”™è¯¯å»ºè®®çš„å˜æ›´ä¸ï¼Œè¿™äº›å˜æ›´é¿å¼€å®¡æŸ¥é›·è¾¾è¿›å…¥ä¸»çº¿ã€‚当内 -æ ¸å¼€å‘äººå‘˜çœ‹åˆ°è¿™ç§æƒ…况å‘生时,他们往往会感到ä¸é«˜å…´ï¼›åœ¨Gitæ ‘ä¸Šæ”¾ç½®æœªæŸ¥çœ‹æˆ– -主题外的补ä¸å¯èƒ½ä¼šå½±å“您将æ¥èŽ·å–æ ‘的能力。引用Linus: +æ ¸å¼€å‘äººå‘˜çœ‹åˆ°è¿™ç§æƒ…况å‘生时,他们往往会感到ä¸é«˜å…´ï¼›åœ¨Gitæ ‘ä¸Šæ”¾ç½®æœªå®¡é˜…æˆ– +主题外的补ä¸å¯èƒ½ä¼šå½±å“您将æ¥è®©æ ‘被拉å–的能力。引用Linusçš„è¯: :: - ä½ å¯ä»¥ç»™æˆ‘å‘è¡¥ä¸ï¼Œä½†è¦æˆ‘ä»Žä½ å“ªé‡Œå–一个Gitè¡¥ä¸ï¼Œæˆ‘需è¦çŸ¥é“ä½ çŸ¥é“ - ä½ åœ¨åšä»€ä¹ˆï¼Œæˆ‘需è¦èƒ½å¤Ÿç›¸ä¿¡äº‹æƒ…而ä¸åŽ»æ£€æŸ¥æ¯ä¸ªä¸ªäººæ”¹å˜ã€‚ + ä½ å¯ä»¥ç»™æˆ‘å‘è¡¥ä¸ï¼Œä½†å½“æˆ‘ä»Žä½ é‚£é‡Œæ‹‰å–一个Gitè¡¥ä¸æ—¶ï¼Œæˆ‘需è¦çŸ¥é“ä½ æ¸…æ¥š + 自己在åšä»€ä¹ˆï¼Œæˆ‘需è¦èƒ½å¤Ÿç›¸ä¿¡äº‹æƒ…而 *æ— éœ€* 手动检查æ¯ä¸ªå•独的更改。 (http://lwn.net/articles/224135/)。 为了é¿å…è¿™ç§æƒ…况,请确ä¿ç»™å®šåˆ†æ”¯ä¸çš„æ‰€æœ‰è¡¥ä¸éƒ½ä¸Žç›¸å…³ä¸»é¢˜ç´§å¯†ç›¸å…³ï¼›â€œé©±åŠ¨ç¨‹åº ä¿®å¤â€åˆ†æ”¯ä¸åº”æ›´æ”¹æ ¸å¿ƒå†…å˜ç®¡ç†ä»£ç 。而且,最é‡è¦çš„æ˜¯ï¼Œä¸è¦ä½¿ç”¨Gitæ ‘æ¥ç»•过 -å®¡æŸ¥è¿‡ç¨‹ã€‚ä¸æ—¶çš„å°†æ ‘çš„æ‘˜è¦å‘布到相关的列表ä¸ï¼Œå½“æ—¶é—´åˆé€‚时,请求 -Linux-next ä¸åŒ…å«è¯¥æ ‘。 +å®¡æŸ¥è¿‡ç¨‹ã€‚ä¸æ—¶çš„å°†æ ‘çš„æ‘˜è¦å‘布到相关的列表ä¸ï¼Œåœ¨åˆé€‚时候请求linux-nextä¸ +包å«è¯¥æ ‘。 -如果其他人开始å‘é€è¡¥ä¸ä»¥åŒ…å«åˆ°æ‚¨çš„æ ‘ä¸ï¼Œä¸è¦å¿˜è®°æŸ¥çœ‹å®ƒä»¬ã€‚还è¦ç¡®ä¿æ‚¨ç»´æŠ¤æ£ç¡® -的作者信æ¯ï¼› ``git am`` 工具在这方é¢åšå¾—最好,但是如果它通过第三方转å‘给您, -您å¯èƒ½éœ€è¦åœ¨è¡¥ä¸ä¸æ·»åŠ â€œFrom:â€è¡Œã€‚ +如果其他人开始å‘é€è¡¥ä¸ä»¥åŒ…å«åˆ°æ‚¨çš„æ ‘ä¸ï¼Œä¸è¦å¿˜è®°å®¡é˜…它们。还è¦ç¡®ä¿æ‚¨ç»´æŠ¤æ£ç¡® +的作者信æ¯ï¼› git “amâ€å·¥å…·åœ¨è¿™æ–¹é¢åšå¾—最好,但是如果补ä¸é€šè¿‡ç¬¬ä¸‰æ–¹è½¬å‘给您, +您å¯èƒ½éœ€è¦åœ¨è¡¥ä¸ä¸æ·»åŠ â€œFrom:â€è¡Œã€‚ -请求pullæ“作时,请务必æä¾›æ‰€æœ‰ç›¸å…³ä¿¡æ¯ï¼šæ ‘çš„ä½ç½®ã€è¦æ‹‰çš„åˆ†æ”¯ä»¥åŠæ‹‰æ“作将导致 -的更改。在这方é¢ï¼Œgit request pull 命令éžå¸¸æœ‰ç”¨ï¼›å®ƒå°†æŒ‰ç…§å…¶ä»–å¼€å‘人员的预期 -æ ¼å¼åŒ–è¯·æ±‚ï¼Œå¹¶æ£€æŸ¥ä»¥ç¡®ä¿æ‚¨è®°ä½äº†å°†è¿™äº›æ›´æ”¹æŽ¨é€åˆ°å…¬å…±æœåŠ¡å™¨ã€‚ +è¯·æ±‚æ‹‰å–æ—¶ï¼Œè¯·åŠ¡å¿…æä¾›æ‰€æœ‰ç›¸å…³ä¿¡æ¯ï¼šæ ‘çš„ä½ç½®ã€è¦æ‹‰å–çš„åˆ†æ”¯ä»¥åŠæ‹‰å–将导致的 +æ›´æ”¹ã€‚åœ¨è¿™æ–¹é¢ git request-pull 命令éžå¸¸æœ‰ç”¨ï¼›å®ƒå°†æŒ‰ç…§å…¶ä»–å¼€å‘人员所期望的 +æ ¼å¼åŒ–è¯·æ±‚ï¼Œå¹¶æ£€æŸ¥ä»¥ç¡®ä¿æ‚¨å·²è®°å¾—将这些更改推é€åˆ°å…¬å…±æœåŠ¡å™¨ã€‚ -å®¡æŸ¥è¡¥ä¸ +å®¡é˜…è¡¥ä¸ -------- -一些读者当然会åå¯¹å°†æœ¬èŠ‚ä¸Žâ€œé«˜çº§ä¸»é¢˜â€æ”¾åœ¨ä¸€èµ·ï¼Œå› 为å³ä½¿æ˜¯åˆšå¼€å§‹çš„å†…æ ¸å¼€å‘人员 -也应该检查补ä¸ã€‚当然,å¦ä¹ å¦‚ä½•åœ¨å†…æ ¸çŽ¯å¢ƒä¸ç¼–程没有比查看其他人å‘å¸ƒçš„ä»£ç æ›´å¥½ -的方法了。æ¤å¤–,审阅者永远供ä¸åº”求;通过查看代ç ,您å¯ä»¥å¯¹æ•´ä¸ªæµç¨‹åšå‡ºé‡å¤§è´¡çŒ®ã€‚ +一些读者显然会åå¯¹å°†æœ¬èŠ‚ä¸Žâ€œé«˜çº§ä¸»é¢˜â€æ”¾åœ¨ä¸€èµ·ï¼Œå› 为å³ä½¿æ˜¯åˆšå¼€å§‹çš„å†…æ ¸å¼€å‘人员 +也应该审阅补ä¸ã€‚当然,没有比查看其他人å‘å¸ƒçš„ä»£ç æ›´å¥½çš„æ–¹æ³•æ¥å¦ä¹ å¦‚ä½•åœ¨å†…æ ¸çŽ¯å¢ƒ +ä¸ç¼–程了。æ¤å¤–,审阅者永远供ä¸åº”求;通过审阅代ç ,您å¯ä»¥å¯¹æ•´ä¸ªæµç¨‹åšå‡ºé‡å¤§è´¡çŒ®ã€‚ -审查代ç å¯èƒ½æ˜¯ä¸€ä¸ªä»¤äººç”Ÿç•çš„å‰æ™¯ï¼Œç‰¹åˆ«æ˜¯å¯¹äºŽä¸€ä¸ªæ–°çš„å†…æ ¸å¼€å‘人员æ¥è¯´ï¼Œä»–们 +审查代ç å¯èƒ½æ˜¯ä¸€å‰¯ä»¤äººç”Ÿç•çš„å›¾æ™¯ï¼Œç‰¹åˆ«æ˜¯å¯¹ä¸€ä¸ªæ–°çš„å†…æ ¸å¼€å‘人员æ¥è¯´ï¼Œä»–们 å¯èƒ½ä¼šå¯¹å…¬å¼€è¯¢é—®ä»£ç æ„Ÿåˆ°ç´§å¼ ï¼Œè€Œè¿™äº›ä»£ç æ˜¯ç”±é‚£äº›æœ‰æ›´å¤šç»éªŒçš„人å‘布的。ä¸è¿‡ï¼Œ -å³ä½¿æ˜¯æœ€æœ‰ç»éªŒçš„å¼€å‘人员编写的代ç 也å¯ä»¥å¾—到改进。也许对评审员(所有评审员) -最好的建议是:把评审评论当æˆé—®é¢˜è€Œä¸æ˜¯æ‰¹è¯„。询问“在这æ¡è·¯å¾„ä¸å¦‚何释放é”?†+å³ä½¿æ˜¯æœ€æœ‰ç»éªŒçš„å¼€å‘人员编写的代ç 也å¯ä»¥å¾—到改进。也许对(所有)审阅者最好 +的建议是:把审阅评论当æˆé—®é¢˜è€Œä¸æ˜¯æ‰¹è¯„。询问“在这æ¡è·¯å¾„ä¸å¦‚何释放é”ï¼Ÿâ€ æ€»æ˜¯æ¯”è¯´â€œè¿™é‡Œçš„é”æ˜¯é”™è¯¯çš„â€æ›´å¥½ã€‚ -ä¸åŒçš„å¼€å‘人员将从ä¸åŒçš„角度审查代ç 。一些主è¦å…³æ³¨çš„æ˜¯ç¼–ç æ ·å¼ä»¥åŠä»£ç 行是 -妿œ‰å°¾éšç©ºæ ¼ã€‚其他人将主è¦å…³æ³¨è¡¥ä¸ä½œä¸ºä¸€ä¸ªæ•´ä½“å®žçŽ°çš„å˜æ›´æ˜¯å¦å¯¹å†…æ ¸æœ‰å¥½å¤„ã€‚ -然而,其他人会检查是å¦å˜åœ¨é”定问题ã€å †æ ˆä½¿ç”¨è¿‡åº¦ã€å¯èƒ½çš„安全问题ã€åœ¨å…¶ä»– -地方å‘现的代ç é‡å¤ã€è¶³å¤Ÿçš„æ–‡æ¡£ã€å¯¹æ€§èƒ½çš„ä¸åˆ©å½±å“ã€ç”¨æˆ·ç©ºé—´ABI更改ç‰ã€‚所有 -类型的检查,如果它们导致更好的代ç è¿›å…¥å†…æ ¸ï¼Œéƒ½æ˜¯å—æ¬¢è¿Žå’Œå€¼å¾—的。 +ä¸åŒçš„å¼€å‘人员将从ä¸åŒçš„角度审查代ç 。部分人会主è¦å…³æ³¨ä»£ç é£Žæ ¼ä»¥åŠä»£ç 行是 +妿œ‰å°¾éšç©ºæ ¼ã€‚其他人会主è¦å…³æ³¨è¡¥ä¸ä½œä¸ºä¸€ä¸ªæ•´ä½“å®žçŽ°çš„å˜æ›´æ˜¯å¦å¯¹å†…æ ¸æœ‰å¥½å¤„ã€‚ +åŒæ—¶ä¹Ÿæœ‰äººä¼šæ£€æŸ¥æ˜¯å¦å˜åœ¨é”问题ã€å †æ ˆä½¿ç”¨è¿‡åº¦ã€å¯èƒ½çš„安全问题ã€åœ¨å…¶ä»–地方 +å‘现的代ç é‡å¤ã€è¶³å¤Ÿçš„æ–‡æ¡£ã€å¯¹æ€§èƒ½çš„ä¸åˆ©å½±å“ã€ç”¨æˆ·ç©ºé—´ABI更改ç‰ã€‚所有类型 +的检查,åªè¦å®ƒä»¬èƒ½å¼•导更好的代ç è¿›å…¥å†…æ ¸ï¼Œéƒ½æ˜¯å—æ¬¢è¿Žå’Œå€¼å¾—的。 diff --git a/Documentation/translations/zh_CN/process/8.Conclusion.rst b/Documentation/translations/zh_CN/process/8.Conclusion.rst index 90cec3de610673cff765f42ee9f0f8b5004eaeac..71c3e30efc6f8a5d9420ba506ae26580247d4ce6 100644 --- a/Documentation/translations/zh_CN/process/8.Conclusion.rst +++ b/Documentation/translations/zh_CN/process/8.Conclusion.rst @@ -1,7 +1,13 @@ .. include:: ../disclaimer-zh_CN.rst :Original: :ref:`Documentation/process/8.Conclusion.rst <development_conclusion>` -:Translator: Alex Shi <alex.shi@linux.alibaba.com> +:Translator: + + 时奎亮 Alex Shi <alex.shi@linux.alibaba.com> + +:æ ¡è¯‘: + + å´æƒ³æˆ Wu XiangCheng <bobwxc@email.cn> .. _cn_development_conclusion: @@ -9,56 +15,56 @@ ======== 关于Linuxå†…æ ¸å¼€å‘å’Œç›¸å…³ä¸»é¢˜çš„ä¿¡æ¯æ¥æºå¾ˆå¤šã€‚é¦–å…ˆæ˜¯åœ¨å†…æ ¸æºä»£ç 分å‘䏿‰¾åˆ°çš„ -文档目录。顶级 :ref:`Documentation/translations/zh_CN/process/howto.rst <cn_process_howto>` -文件是一个é‡è¦çš„起点 +文档目录。顶级 +:ref:`Documentation/translations/zh_CN/process/howto.rst <cn_process_howto>` +文件是一个é‡è¦çš„起点; :ref:`Documentation/translations/zh_CN/process/submitting-patches.rst <cn_submittingpatches>` -å’Œ :ref:`process/submitting-drivers.rst <submittingdrivers>` +å’Œ :ref:`Documentation/transaltions/zh_CN/process/submitting-drivers.rst <cn_submittingdrivers>` ä¹Ÿæ˜¯æ‰€æœ‰å†…æ ¸å¼€å‘äººå‘˜éƒ½åº”è¯¥é˜…è¯»çš„å†…å®¹ã€‚è®¸å¤šå†…éƒ¨å†…æ ¸API都是使用kerneldoc机制 -记录的;“make htmldocsâ€æˆ–“make pdfdocsâ€å¯ç”¨äºŽä»¥HTML或PDFæ ¼å¼ç”Ÿæˆè¿™äº›æ–‡æ¡£ï¼ˆ -尽管æŸäº›å‘行版æä¾›çš„tex版本会é‡åˆ°å†…部é™åˆ¶ï¼Œæ— 法æ£ç¡®å¤„ç†æ–‡æ¡£ï¼‰ã€‚ +记录的;“make htmldocsâ€æˆ–“make pdfdocsâ€å¯ç”¨äºŽä»¥HTML或PDFæ ¼å¼ç”Ÿæˆè¿™äº›æ–‡æ¡£ +(尽管æŸäº›å‘行版æä¾›çš„tex版本会é‡åˆ°å†…部é™åˆ¶ï¼Œæ— 法æ£ç¡®å¤„ç†æ–‡æ¡£ï¼‰ã€‚ -ä¸åŒçš„网站在å„ä¸ªç»†èŠ‚å±‚æ¬¡ä¸Šè®¨è®ºå†…æ ¸å¼€å‘。您的作者想谦虚地建议用 https://lwn.net/ -ä½œä¸ºæ¥æºï¼›æœ‰å…³è®¸å¤šç‰¹å®šå†…æ ¸ä¸»é¢˜çš„ä¿¡æ¯å¯ä»¥é€šè¿‡ä»¥ä¸‹ç½‘å€çš„lwnå†…æ ¸ç´¢å¼•æ‰¾åˆ°ï¼š +ä¸åŒçš„网站在å„ä¸ªç»†èŠ‚å±‚æ¬¡ä¸Šè®¨è®ºå†…æ ¸å¼€å‘。本文作者想谦虚地建议用 https://lwn.net/ +ä½œä¸ºæ¥æºï¼›æœ‰å…³è®¸å¤šç‰¹å®šå†…æ ¸ä¸»é¢˜çš„ä¿¡æ¯å¯ä»¥é€šè¿‡ä»¥ä¸‹ç½‘å€çš„ LWN å†…æ ¸ç´¢å¼•æ‰¾åˆ°ï¼š - http://lwn.net/kernel/index/ + http://lwn.net/kernel/index/ 除æ¤ä¹‹å¤–ï¼Œå†…æ ¸å¼€å‘人员的一个å®è´µèµ„æºæ˜¯ï¼š - https://kernelnewbies.org/ + https://kernelnewbies.org/ -当然,我们ä¸åº”该忘记 https://kernel.org/ è¿™æ˜¯å†…æ ¸å‘布信æ¯çš„æœ€ç»ˆä½ç½®ã€‚ +当然,也ä¸åº”该忘记 https://kernel.org/ ï¼Œè¿™æ˜¯å†…æ ¸å‘布信æ¯çš„æœ€ç»ˆä½ç½®ã€‚ å…³äºŽå†…æ ¸å¼€å‘æœ‰å¾ˆå¤šä¹¦ï¼š - Linux设备驱动程åºï¼Œç¬¬ä¸‰ç‰ˆï¼ˆJonathan Corbetã€Alessandro Rubiniå’ŒGreg Kroah Hartman)。 - 在线:http://lwn.net/kernel/ldd3/ + 《Linux设备驱动程åºã€‹ç¬¬ä¸‰ç‰ˆï¼ˆJonathan Corbetã€Alessandro Rubiniå’ŒGreg Kroah Hartman) + 线上版本在 http://lwn.net/kernel/ldd3/ - Linuxå†…æ ¸å¼€å‘(Robert Love)。 + 《Linuxå†…æ ¸è®¾è®¡ä¸Žå®žçŽ°ã€‹ï¼ˆRobert Love) - 了解Linuxå†…æ ¸ï¼ˆDaniel Bovetå’ŒMarco Cesati)。 + 《深入ç†è§£Linuxå†…æ ¸ã€‹(Daniel Bovetå’ŒMarco Cesati) -然而,所有这些书都有一个共åŒçš„缺点:当它们上架时,它们往往有些过时,而且它们 -å·²ç»ä¸Šæž¶ä¸€æ®µæ—¶é—´äº†ã€‚ä¸è¿‡ï¼Œåœ¨é‚£é‡Œè¿˜å¯ä»¥æ‰¾åˆ°ç›¸å½“多的好信æ¯ã€‚ +然而,所有这些书都有一个共åŒçš„缺点:它们上架时就往往有些过时,而且已ç»ä¸Šæž¶ +一段时间了。ä¸è¿‡ï¼Œåœ¨é‚£é‡Œè¿˜æ˜¯å¯ä»¥æ‰¾åˆ°ç›¸å½“多的好信æ¯ã€‚ 有关git的文档,请访问: - https://www.kernel.org/pub/software/scm/git/docs/ + https://www.kernel.org/pub/software/scm/git/docs/ - https://www.kernel.org/pub/software/scm/git/docs/user-manual.html + https://www.kernel.org/pub/software/scm/git/docs/user-manual.html 结论 ==== -ç¥è´ºæ‰€æœ‰é€šè¿‡è¿™ç¯‡å†—长的文件的人。希望它能够帮助您ç†è§£Linuxå†…æ ¸æ˜¯å¦‚ä½•å¼€å‘的, +ç¥è´ºæ‰€æœ‰é€šè¿‡è¿™ç¯‡å†—长的文档的人。希望它能够帮助您ç†è§£Linuxå†…æ ¸æ˜¯å¦‚ä½•å¼€å‘的, ä»¥åŠæ‚¨å¦‚何å‚与这个过程。 -最åŽï¼Œé‡è¦çš„æ˜¯å‚与。任何开æºè½¯ä»¶é¡¹ç›®éƒ½ä¸è¶…过其贡献者投入其ä¸çš„æ€»å’Œã€‚Linuxå†…æ ¸ -çš„å‘展速度和以å‰ä¸€æ ·å¿«ï¼Œå› 为它得到了大é‡å¼€å‘人员的帮助,他们都在努力使它å˜å¾— -æ›´å¥½ã€‚å†…æ ¸æ˜¯ä¸€ä¸ªä¸»è¦çš„例å,说明当æˆåƒä¸Šä¸‡çš„人为了一个共åŒçš„ç›®æ ‡ä¸€èµ·å·¥ä½œæ—¶ï¼Œ -å¯ä»¥åšäº›ä»€ä¹ˆã€‚ +最åŽï¼Œé‡è¦çš„æ˜¯å‚与。任何开æºè½¯ä»¶é¡¹ç›®éƒ½ä¸ä¼šè¶…过其贡献者投入其ä¸çš„æ€»å’Œã€‚Linux +å†…æ ¸çš„å‘展速度和以å‰ä¸€æ ·å¿«ï¼Œå› 为它得到了大é‡å¼€å‘人员的帮助,他们都在努力使它 +å˜å¾—æ›´å¥½ã€‚å†…æ ¸æ˜¯ä¸€ä¸ªæœ€æˆåŠŸçš„ä¾‹å,说明了当æˆåƒä¸Šä¸‡çš„人为了一个共åŒçš„ç›®æ ‡ä¸€èµ· +工作时,å¯ä»¥åšå‡ºä»€ä¹ˆã€‚ -ä¸è¿‡ï¼Œå†…æ ¸æ€»æ˜¯å¯ä»¥ä»Žæ›´å¤§çš„å¼€å‘人员基础ä¸èŽ·ç›Šã€‚æ€»æœ‰æ›´å¤šçš„å·¥ä½œè¦åšã€‚ä½†æ˜¯ï¼ŒåŒæ · +ä¸è¿‡ï¼Œå†…æ ¸æ€»æ˜¯å¯ä»¥ä»Žæ›´å¤§çš„å¼€å‘人员基础ä¸èŽ·ç›Šã€‚æ€»æœ‰æ›´å¤šçš„å·¥ä½œè¦åšã€‚ä½†æ˜¯åŒæ · é‡è¦çš„æ˜¯ï¼ŒLinux生æ€ç³»ç»Ÿä¸çš„大多数其他å‚与者å¯ä»¥é€šè¿‡ä¸ºå†…æ ¸åšå‡ºè´¡çŒ®è€Œå—益。使 代ç 进入主线是æé«˜ä»£ç è´¨é‡ã€é™ä½Žç»´æŠ¤å’Œåˆ†å‘æˆæœ¬ã€æé«˜å¯¹å†…æ ¸å¼€å‘æ–¹å‘的影å“程度 -ç‰çš„关键。这是一ç§äººäººéƒ½èµ¢çš„å±€é¢ã€‚è¸¢å¼€ä½ çš„ç¼–è¾‘ï¼Œæ¥åŠ å…¥æˆ‘ä»¬å§ï¼Œä½ 会éžå¸¸å— -欢迎的。 +ç‰çš„关键。这是一ç§å…±èµ¢çš„å±€é¢ã€‚å¯åŠ¨ä½ çš„ç¼–è¾‘å™¨ï¼Œæ¥åŠ å…¥æˆ‘ä»¬å§ï¼›ä½ 会éžå¸¸å—欢迎的。 diff --git a/Documentation/translations/zh_CN/process/index.rst b/Documentation/translations/zh_CN/process/index.rst index 8051a7b322c53256bbefd2ea7185567c33046868..39e9c88fbaa602f6a81395d21cada78802df69c1 100644 --- a/Documentation/translations/zh_CN/process/index.rst +++ b/Documentation/translations/zh_CN/process/index.rst @@ -13,11 +13,11 @@ 与Linux å†…æ ¸ç¤¾åŒºä¸€èµ·å·¥ä½œ ======================== -é‚£ä¹ˆä½ æƒ³æˆä¸ºLinuxå†…æ ¸å¼€å‘人员? æ¬¢è¿Žï¼ ä¸ä½†ä»ŽæŠ€æœ¯æ„ä¹‰ä¸Šè®²æœ‰å¾ˆå¤šå…³äºŽå†…æ ¸çš„çŸ¥è¯† -需è¦å¦ï¼Œè€Œä¸”了解我们社区的工作方å¼ä¹Ÿå¾ˆé‡è¦ã€‚ é˜…è¯»è¿™äº›æ–‡ç« å¯ä»¥è®©æ‚¨ä»¥æ›´è½»æ¾åœ°, -麻烦最少的方å¼å°†æ›´æ”¹åˆå¹¶åˆ°å†…æ ¸ã€‚ +ä½ æƒ³æˆä¸ºLinuxå†…æ ¸å¼€å‘人员å—?欢迎之至ï¼åœ¨å¦ä¹ è®¸å¤šå…³äºŽå†…æ ¸çš„æŠ€æœ¯çŸ¥è¯†çš„åŒæ—¶ï¼Œ +了解我们社区的工作方å¼ä¹Ÿå¾ˆé‡è¦ã€‚阅读这些文档å¯ä»¥è®©æ‚¨ä»¥æ›´è½»æ¾çš„ã€éº»çƒ¦æ›´å°‘çš„ +æ–¹å¼å°†æ›´æ”¹åˆå¹¶åˆ°å†…æ ¸ã€‚ -以下是æ¯ä½å¼€å‘人员应阅读的基本指å—。 +以下是æ¯ä½å¼€å‘人员都应阅读的基本指å—: .. toctree:: :maxdepth: 1 @@ -47,7 +47,7 @@ management-style embargoed-hardware-issues -这些是一些总体技术指å—ï¼Œç”±äºŽç¼ºä¹æ›´å¥½çš„åœ°æ–¹ï¼ŒçŽ°åœ¨å·²ç»æ”¾åœ¨è¿™é‡Œ +这些是一些总体性技术指å—,由于ä¸å¤§å¥½åˆ†ç±»è€Œæ”¾åœ¨è¿™é‡Œï¼š .. toctree:: :maxdepth: 1 diff --git a/Documentation/translations/zh_CN/process/submit-checklist.rst b/Documentation/translations/zh_CN/process/submit-checklist.rst index 50386e0e42e7fd6a629e612c5743771efa2de24c..a64858d321fcdc6ce9496ffc441e2777d3567201 100644 --- a/Documentation/translations/zh_CN/process/submit-checklist.rst +++ b/Documentation/translations/zh_CN/process/submit-checklist.rst @@ -82,24 +82,22 @@ Linuxå†…æ ¸è¡¥ä¸æäº¤æ¸…å• è¯·å‚阅 ``Documentation/ABI/README`` 。更改用户空间接å£çš„è¡¥ä¸åº”è¯¥æŠ„é€ linux-api@vger.kernel.org。 -20) 检查是å¦å…¨éƒ¨é€šè¿‡ ``make headers_check`` 。 - -21) 已通过至少注入slabå’Œpage分é…失败进行检查。请å‚阅 ``Documentation/fault-injection/`` +20) 已通过至少注入slabå’Œpage分é…失败进行检查。请å‚阅 ``Documentation/fault-injection/`` å¦‚æžœæ–°ä»£ç æ˜¯å®žè´¨æ€§çš„ï¼Œé‚£ä¹ˆæ·»åŠ å系统特定的故障注入å¯èƒ½æ˜¯åˆé€‚的。 -22) æ–°æ·»åŠ çš„ä»£ç å·²ç»ç”¨ ``gcc -W`` 编译(使用 ``make EXTRA-CFLAGS=-W`` )。这 +21) æ–°æ·»åŠ çš„ä»£ç å·²ç»ç”¨ ``gcc -W`` 编译(使用 ``make EXTRA-CFLAGS=-W`` )。这 将产生大é‡å™ªå£°ï¼Œä½†å¯¹äºŽæŸ¥æ‰¾è¯¸å¦‚“è¦å‘Šï¼šæœ‰ç¬¦å·å’Œæ— 符å·ä¹‹é—´çš„æ¯”较â€ä¹‹ç±»çš„错误 很有用。 -23) 在它被åˆå¹¶åˆ°-mmè¡¥ä¸é›†ä¸ä¹‹åŽè¿›è¡Œæµ‹è¯•,以确ä¿å®ƒä»ç„¶ä¸Žæ‰€æœ‰å…¶ä»–排队的补ä¸ä»¥ +22) 在它被åˆå¹¶åˆ°-mmè¡¥ä¸é›†ä¸ä¹‹åŽè¿›è¡Œæµ‹è¯•,以确ä¿å®ƒä»ç„¶ä¸Žæ‰€æœ‰å…¶ä»–排队的补ä¸ä»¥ åŠVMã€VFS和其他å系统ä¸çš„å„ç§æ›´æ”¹ä¸€èµ·å·¥ä½œã€‚ -24) 所有内å˜å±éšœä¾‹å¦‚ ``barrier()``, ``rmb()``, ``wmb()`` éƒ½éœ€è¦æºä»£ç ä¸çš„æ³¨ +23) 所有内å˜å±éšœä¾‹å¦‚ ``barrier()``, ``rmb()``, ``wmb()`` éƒ½éœ€è¦æºä»£ç ä¸çš„æ³¨ 释æ¥è§£é‡Šå®ƒä»¬æ£åœ¨æ‰§è¡Œçš„æ“ä½œåŠå…¶åŽŸå› çš„é€»è¾‘ã€‚ -25) å¦‚æžœè¡¥ä¸æ·»åŠ äº†ä»»ä½•ioctlï¼Œé‚£ä¹ˆä¹Ÿè¦æ›´æ–° ``Documentation/userspace-api/ioctl/ioctl-number.rst`` +24) å¦‚æžœè¡¥ä¸æ·»åŠ äº†ä»»ä½•ioctlï¼Œé‚£ä¹ˆä¹Ÿè¦æ›´æ–° ``Documentation/userspace-api/ioctl/ioctl-number.rst`` -26) 如果修改åŽçš„æºä»£ç ä¾èµ–或使用与以下 ``Kconfig`` 符å·ç›¸å…³çš„ä»»ä½•å†…æ ¸API或 +25) 如果修改åŽçš„æºä»£ç ä¾èµ–或使用与以下 ``Kconfig`` 符å·ç›¸å…³çš„ä»»ä½•å†…æ ¸API或 功能,则在ç¦ç”¨ç›¸å…³ ``Kconfig`` 符å·å’Œ/或 ``=m`` (如果该选项å¯ç”¨ï¼‰çš„æƒ…况 下测试以下多个构建[å¹¶éžæ‰€æœ‰è¿™äº›éƒ½åŒæ—¶å˜åœ¨ï¼Œåªæ˜¯å®ƒä»¬çš„å„ç§/éšæœºç»„åˆ]: diff --git a/Documentation/translations/zh_CN/riscv/boot-image-header.rst b/Documentation/translations/zh_CN/riscv/boot-image-header.rst new file mode 100644 index 0000000000000000000000000000000000000000..241bf9c1bcbe7d881434afdc4cb64210cdb653d2 --- /dev/null +++ b/Documentation/translations/zh_CN/riscv/boot-image-header.rst @@ -0,0 +1,67 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: :doc:`../../../riscv/boot-image-header` +:Translator: Yanteng Si <siyanteng@loongson.cn> + +.. _cn_boot-image-header.rst: + + +========================== +RISC-V Linuxå¯åŠ¨é•œåƒæ–‡ä»¶å¤´ +========================== + +:Author: Atish Patra <atish.patra@wdc.com> +:Date: 20 May 2019 + +æ¤æ–‡æ¡£ä»…æè¿°RISC-V Linux å¯åŠ¨æ–‡ä»¶å¤´çš„è¯¦æƒ…ã€‚ + +TODO: + 写一个完整的å¯åŠ¨æŒ‡å—。 + +在解压åŽçš„Linuxå†…æ ¸é•œåƒä¸å˜åœ¨ä»¥ä¸‹64å—节的文件头:: + + u32 code0; /* Executable code */ + u32 code1; /* Executable code */ + u64 text_offset; /* Image load offset, little endian */ + u64 image_size; /* Effective Image size, little endian */ + u64 flags; /* kernel flags, little endian */ + u32 version; /* Version of this header */ + u32 res1 = 0; /* Reserved */ + u64 res2 = 0; /* Reserved */ + u64 magic = 0x5643534952; /* Magic number, little endian, "RISCV" */ + u32 magic2 = 0x05435352; /* Magic number 2, little endian, "RSC\x05" */ + u32 res3; /* Reserved for PE COFF offset */ + +è¿™ç§å¤´æ ¼å¼ä¸ŽPE/COFF文件头兼容,并在很大程度上å—到ARM64文件头的å¯å‘ã€‚å› æ¤ï¼ŒARM64 +å’ŒRISC-V文件头å¯ä»¥åœ¨æœªæ¥åˆå¹¶ä¸ºä¸€ä¸ªå…±åŒçš„头。 + +æ³¨æ„ +==== + +- å°†æ¥ä¹Ÿå¯ä»¥å¤ç”¨è¿™ä¸ªæ–‡ä»¶å¤´ï¼Œç”¨æ¥å¯¹RISC-Vçš„EFIæ¡©æä¾›æ”¯æŒã€‚ä¸ºäº†ä½¿å†…æ ¸é•œåƒå¦‚åŒä¸€ä¸ª + EFI应用程åºä¸€æ ·åŠ è½½ï¼ŒEFI规范ä¸è§„å®šåœ¨å†…æ ¸é•œåƒçš„开始需è¦PE/COFFé•œåƒæ–‡ä»¶å¤´ã€‚为了 + 支æŒEFI桩,应该用“MZâ€é”术å—ç¬¦æ›¿æ¢æŽ‰code0,并且res3(åç§»é‡æœª0x3c)应指å‘PE/COFF + 文件头的其余部分. + +- 表示文件头版本å·çš„Drop-bitä½åŸŸ + + ========== ========== + Bits 0:15 æ¬¡è¦ ç‰ˆæœ¬ + Bits 16:31 ä¸»è¦ ç‰ˆæœ¬ + ========== ========== + + è¿™ä¿æŒäº†æ–°æ—§ç‰ˆæœ¬ä¹‹é—´çš„兼容性。 + 当å‰ç‰ˆæœ¬è¢«å®šä¹‰ä¸º0.2。 + +- 从版本0.2开始,结构体æˆå‘˜â€œmagicâ€å°±å·²ç»è¢«å¼ƒç”¨ï¼Œåœ¨ä¹‹åŽçš„版本ä¸ï¼Œå¯èƒ½ä¼šç§»é™¤æŽ‰å®ƒã€‚ + 最åˆï¼Œè¯¥æˆå‘˜åº”该与ARM64头的“magicâ€æˆå‘˜åŒ¹é…ï¼Œä½†é—æ†¾çš„æ˜¯å¹¶æ²¡æœ‰ã€‚ + “magic2â€æˆå‘˜ä»£æ›¿â€œmagicâ€æˆå‘˜ä¸ŽARM64头相匹é…。 + +- 在当å‰çš„æ–‡ä»¶å¤´ï¼Œæ ‡å¿—ä½åŸŸåªå‰©ä¸‹äº†ä¸€ä¸ªä½ã€‚ + + ===== ============================== + Bit 0 å†…æ ¸å—节åºã€‚1 if BE, 0 if LE. + ===== ============================== + +- å¯¹äºŽå¼•å¯¼åŠ è½½ç¨‹åºåŠ è½½å†…æ ¸æ˜ åƒæ¥è¯´ï¼Œimage_sizeæˆå‘˜å¯¹å¼•å¯¼åŠ è½½ç¨‹åºè€Œè¨€æ˜¯å¿…é¡»çš„ï¼Œå¦ + 则将引导失败。 diff --git a/Documentation/translations/zh_CN/riscv/index.rst b/Documentation/translations/zh_CN/riscv/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..db13b1101490cf54aa0864cd902d065263027c20 --- /dev/null +++ b/Documentation/translations/zh_CN/riscv/index.rst @@ -0,0 +1,28 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: :doc:`../../../riscv/index` +:Translator: Yanteng Si <siyanteng@loongson.cn> + +.. _cn_riscv_index: + + +=============== +RISC-V 体系结构 +=============== + +.. toctree:: + :maxdepth: 1 + + boot-image-header + pmu + patch-acceptance + + +.. only:: subproject and html + + 目录 + ==== + + * :ref:`genindex` diff --git a/Documentation/translations/zh_CN/riscv/patch-acceptance.rst b/Documentation/translations/zh_CN/riscv/patch-acceptance.rst new file mode 100644 index 0000000000000000000000000000000000000000..9fd1c8216763f148e169706075f39ec4f625bed3 --- /dev/null +++ b/Documentation/translations/zh_CN/riscv/patch-acceptance.rst @@ -0,0 +1,31 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: :doc:`../../../riscv/patch-acceptance` +:Translator: Yanteng Si <siyanteng@loongson.cn> + +.. _cn_riscv_patch-acceptance: + + +arch/riscv å¼€å‘è€…ç»´æŠ¤æŒ‡å— +========================= + +概述 +---- +RISC-V指令集体系结构是公开开å‘的: +æ£åœ¨è¿›è¡Œçš„è‰æ¡ˆå¯ä¾›æ‰€æœ‰äººæŸ¥çœ‹å’Œæµ‹è¯•å®žçŽ°ã€‚æ–°æ¨¡å—æˆ–è€…æ‰©å±•è‰æ¡ˆå¯èƒ½ä¼šåœ¨å¼€å‘过程ä¸å‘ +生更改---有时以ä¸å…¼å®¹çš„æ–¹å¼å¯¹ä»¥å‰çš„è‰æ¡ˆè¿›è¡Œæ›´æ”¹ã€‚è¿™ç§çµæ´»æ€§å¯èƒ½ä¼šç»™RISC-V Linux +ç»´æŠ¤è€…å¸¦æ¥æŒ‘战。Linuxå¼€å‘过程更喜欢ç»è¿‡è‰¯å¥½æ£€æŸ¥å’Œæµ‹è¯•的代ç ï¼Œè€Œä¸æ˜¯è¯•验代ç 。我 +ä»¬å¸Œæœ›æŽ¨å¹¿åŒæ ·çš„规则到å³å°†è¢«å†…æ ¸åˆå¹¶çš„RISC-V相关代ç 。 + +é™„åŠ çš„æäº¤æ£€æŸ¥å• +---------------- +我们仅接å—ç›¸å…³æ ‡å‡†å·²ç»è¢«RISC-VåŸºé‡‘ä¼šæ ‡å‡†ä¸ºâ€œå·²æ‰¹å‡†â€æˆ–“已冻结â€çš„æ‰©å±•或模å—的补ä¸ã€‚ +(开å‘者当然å¯ä»¥ç»´æŠ¤è‡ªå·±çš„Linuxå†…æ ¸æ ‘ï¼Œå…¶ä¸åŒ…嫿‰€éœ€ä»£ç æ‰©å±•è‰æ¡ˆçš„代ç 。) + +æ¤å¤–,RISC-V规范å…许爱好者创建自己的自定义扩展。这些自定义拓展ä¸éœ€è¦é€šè¿‡RISC-V +åŸºé‡‘ä¼šçš„ä»»ä½•å®¡æ ¸æˆ–æ‰¹å‡†ã€‚ä¸ºäº†é¿å…将爱好者一些特别的RISC-Væ‹“å±•æ·»åŠ è¿›å†…æ ¸ä»£ç å¸¦æ¥ +çš„ç»´æŠ¤å¤æ‚性和对性能的潜在影å“ï¼Œæˆ‘ä»¬å°†åªæŽ¥å—RISC-V基金会æ£å¼å†»ç»“或批准的的扩展 +è¡¥ä¸ã€‚(开å‘者当然å¯ä»¥ç»´æŠ¤è‡ªå·±çš„Linuxå†…æ ¸æ ‘ï¼Œå…¶ä¸åŒ…å«ä»–们想è¦çš„任何自定义扩展 +的代ç 。) diff --git a/Documentation/translations/zh_CN/riscv/pmu.rst b/Documentation/translations/zh_CN/riscv/pmu.rst new file mode 100644 index 0000000000000000000000000000000000000000..22dcf3a9ca6eec76aa76d5aa42af721263bcc1d4 --- /dev/null +++ b/Documentation/translations/zh_CN/riscv/pmu.rst @@ -0,0 +1,233 @@ +.. include:: ../disclaimer-zh_CN.rst + +:Original: :doc:`../../../riscv/pmu` +:Translator: Yanteng Si <siyanteng@loongson.cn> + +.. _cn_riscv_pmu: + + +======================== +RISC-Vå¹³å°ä¸Šå¯¹PMUsçš„æ”¯æŒ +======================== + +Alan Kao <alankao@andestech.com>, Mar 2018 + +简介 +------------ + +æˆªæ¢æœ¬æ–‡æ’°å†™æ—¶ï¼Œåœ¨The RISC-V ISA Privileged Version 1.10ä¸æåˆ°çš„ perf_event +相关特性如下: +(详情请查阅手册) + +* [m|s]counteren +* mcycle[h], cycle[h] +* minstret[h], instret[h] +* mhpeventx, mhpcounterx[h] + +仅有以上这些功能,移æ¤perf需è¦åšå¾ˆå¤šå·¥ä½œï¼Œç©¶å…¶åŽŸå› æ˜¯ç¼ºå°‘ä»¥ä¸‹é€šç”¨æž¶æž„çš„æ€§èƒ½ +监测特性: + +* å¯ç”¨/åœç”¨è®¡æ•°å™¨ + 在我们这里,计数器一直在自由è¿è¡Œã€‚ +* è®¡æ•°å™¨æº¢å‡ºå¼•èµ·çš„ä¸æ– + è§„èŒƒä¸æ²¡æœ‰è¿™ç§åŠŸèƒ½ã€‚ +* 䏿–指示器 + ä¸å¯èƒ½æ‰€æœ‰çš„è®¡æ•°å™¨éƒ½æœ‰å¾ˆå¤šçš„ä¸æ–端å£ï¼Œæ‰€ä»¥éœ€è¦ä¸€ä¸ªä¸æ–指示器让软件æ¥åˆ¤æ– + 哪个计数器刚好溢出。 +* 写入计数器 + ç”±äºŽå†…æ ¸ä¸èƒ½ä¿®æ”¹è®¡æ•°å™¨ï¼Œæ‰€ä»¥ä¼šæœ‰ä¸€ä¸ªSBIæ¥æ”¯æŒè¿™ä¸ªåŠŸèƒ½[1]。 å¦å¤–,一些厂商 + 考虑实现M-S-Uåž‹å·æœºå™¨çš„硬件扩展æ¥ç›´æŽ¥å†™å…¥è®¡æ•°å™¨ã€‚ + +这篇文档旨在为开å‘者æä¾›ä¸€ä¸ªåœ¨å†…æ ¸ä¸æ”¯æŒPMUçš„ç®€è¦æŒ‡å—。下é¢çš„ç« èŠ‚ç®€è¦è§£é‡Šäº† +perf' 机制和待办事项。 + +ä½ å¯ä»¥åœ¨è¿™é‡ŒæŸ¥çœ‹ä»¥å‰çš„讨论[1][2]。 å¦å¤–,查看附录ä¸çš„ç›¸å…³å†…æ ¸ç»“æž„ä½“å¯èƒ½ä¼šæœ‰ +帮助。 + + +1. åˆå§‹åŒ– +--------- + +*riscv_pmu* 是一个类型为 *struct riscv_pmu* 的全局指针,它包å«äº†æ ¹æ®perf内部 +约定的å„ç§æ–¹æ³•å’ŒPMU-specific傿•°ã€‚äººä»¬åº”è¯¥å£°æ˜Žè¿™æ ·çš„å®žä¾‹æ¥ä»£è¡¨PMU。 默认情况 +下, *riscv_pmu* 指å‘一个常é‡ç»“构体 *riscv_base_pmu* ,它对基准QEMU模型有éžå¸¸ +基础的支æŒã€‚ + + +ç„¶åŽä»–/她å¯ä»¥å°†å®žä¾‹çš„æŒ‡é’ˆåˆ†é…ç»™ *riscv_pmu* ï¼Œè¿™æ ·å°±å¯ä»¥åˆ©ç”¨å·²ç»å®žçŽ°çš„æœ€å°é€» +辑,或者创建他/她自己的 *riscv_init_platform_pmu* 实现。 + +æ¢å¥è¯è¯´ï¼ŒçŽ°æœ‰çš„ *riscv_base_pmu* æºåªæ˜¯æä¾›äº†ä¸€ä¸ªå‚考实现。 å¼€å‘者å¯ä»¥çµæ´»åœ° +决定多少部分å¯ç”¨ï¼Œåœ¨æœ€æžç«¯çš„æƒ…况下,他们å¯ä»¥æ ¹æ®è‡ªå·±çš„需è¦å®šåˆ¶æ¯ä¸€ä¸ªå‡½æ•°ã€‚ + + +2. Event Initialization +----------------------- + +当用户å¯åЍperf命令æ¥ç›‘控一些事件时,首先会被用户空间的perf工具解释为多个 +*perf_event_open* 系统调用,然åŽè¿›ä¸€æ¥è°ƒç”¨ä¸Šä¸€æ¥åˆ†é…çš„ *event_init* æˆå‘˜å‡½æ•° +的主体。 在 *riscv_base_pmu* 的情况下,就是 *riscv_event_init* 。 + +该功能的主è¦ç›®çš„æ˜¯å°†ç”¨æˆ·æä¾›çš„äº‹ä»¶ç¿»è¯‘æˆæ˜ 射图,从而å¯ä»¥ç›´æŽ¥å¯¹HW-related的控 +制寄å˜å™¨æˆ–计数器进行æ“作。该翻译基于 *riscv_pmu* ä¸æä¾›çš„æ˜ å°„å’Œæ–¹æ³•ã€‚ + +注æ„,有些功能也å¯ä»¥åœ¨è¿™ä¸ªé˜¶æ®µå®Œæˆ: + +(1) 䏿–设置,这个在下一节说; +(2) 特é™çº§è®¾ç½®(仅用户空间ã€ä»…å†…æ ¸ç©ºé—´ã€ä¸¤è€…都有)ï¼› +(3) æžæž„函数设置。 通常应用 *riscv_destroy_event* å³å¯ï¼› +(4) 对éžé‡‡æ ·äº‹ä»¶çš„调整,这将被函数应用,如 *perf_adjust_period* ,通常如下:: + + if (!is_sampling_event(event)) { + hwc->sample_period = x86_pmu.max_period; + hwc->last_period = hwc->sample_period; + local64_set(&hwc->period_left, hwc->sample_period); + } + + +在 *riscv_base_pmu* 的情况下,目å‰åªæä¾›äº†ï¼ˆ3)。 + + +3. 䏿– +------- + +3.1. 䏿–åˆå§‹åŒ– + +è¿™ç§æƒ…况ç»å¸¸å‡ºçŽ°åœ¨ *event_init* æ–¹æ¡ˆçš„å¼€å¤´ã€‚é€šå¸¸æƒ…å†µä¸‹ï¼Œè¿™åº”è¯¥æ˜¯ä¸€ä¸ªä»£ç æ®µï¼Œå¦‚:: + + int x86_reserve_hardware(void) + { + int err = 0; + + if (!atomic_inc_not_zero(&pmc_refcount)) { + mutex_lock(&pmc_reserve_mutex); + if (atomic_read(&pmc_refcount) == 0) { + if (!reserve_pmc_hardware()) + err = -EBUSY; + else + reserve_ds_buffers(); + } + if (!err) + atomic_inc(&pmc_refcount); + mutex_unlock(&pmc_reserve_mutex); + } + + return err; + } + +而神奇的是 *reserve_pmc_hardware* ,它通常åšåŽŸåæ“ä½œï¼Œä½¿å®žçŽ°çš„IRQå¯ä»¥ä»ŽæŸä¸ªå…¨å±€å‡½ +数指针访问。 而 *release_pmc_hardware* 的作用æ£å¥½ç›¸å,它用在上一节æåˆ°çš„äº‹ä»¶åˆ†é… +器ä¸ã€‚ + + (注:从所有架构的实现æ¥çœ‹ï¼Œ*reserve/release* 对总是IRQ设置,所以 *pmc_hardware* + 似乎有些误导。 它并ä¸å¤„ç†äº‹ä»¶å’Œç‰©ç†è®¡æ•°å™¨ä¹‹é—´çš„绑定,这一点将在下一节介ç»ã€‚) + +3.2. IRQ结构体 + +基本上,一个IRQè¿è¡Œä»¥ä¸‹ä¼ªä»£ç :: + + for each hardware counter that triggered this overflow + + get the event of this counter + + // following two steps are defined as *read()*, + // check the section Reading/Writing Counters for details. + count the delta value since previous interrupt + update the event->count (# event occurs) by adding delta, and + event->hw.period_left by subtracting delta + + if the event overflows + sample data + set the counter appropriately for the next overflow + + if the event overflows again + too frequently, throttle this event + fi + fi + + end for + + 然而截至目å‰ï¼Œæ²¡æœ‰ä¸€ä¸ªRISC-V的实现为perfè®¾è®¡äº†ä¸æ–,所以具体的实现è¦åœ¨æœªæ¥å®Œæˆã€‚ + +4. Reading/Writing 计数 +----------------------- + +它们看似差ä¸å¤šï¼Œä½†perf对待它们的æ€åº¦å´æˆªç„¶ä¸åŒã€‚ 对于读,在 *struct pmu* 䏿œ‰ä¸€ä¸ª +*read* 接å£ï¼Œä½†å®ƒçš„作用ä¸ä»…仅是读。 æ ¹æ®ä¸Šä¸‹æ–‡ï¼Œ*read* 函数ä¸ä»…è¦è¯»å–计数器的内容 +(event->countï¼‰ï¼Œè¿˜è¦æ›´æ–°å·¦å‘¨æœŸåˆ°ä¸‹ä¸€ä¸ªä¸æ–(event->hw.period_left)。 + + 但 perf çš„æ ¸å¿ƒä¸éœ€è¦ç›´æŽ¥å†™è®¡æ•°å™¨ã€‚ 写计数器éšè—在以下两点的抽象化之åŽï¼Œ + 1) *pmu->start* ,从å—é¢ä¸Šçœ‹å°±æ˜¯å¼€å§‹è®¡æ•°ï¼Œæ‰€ä»¥å¿…须把计数器设置æˆä¸€ä¸ªåˆé€‚的值,以 + ä¾¿ä¸‹ä¸€æ¬¡ä¸æ–ï¼› + 2)在IRQ里é¢ï¼Œåº”该把计数器设置æˆåŒæ ·çš„åˆç†å€¼ã€‚ + +在RISC-Vä¸ï¼Œè¯»æ“ä½œä¸æ˜¯é—®é¢˜ï¼Œä½†å†™æ“作就需è¦è´¹äº›åŠ›æ°”äº†ï¼Œå› ä¸ºS模å¼ä¸å…许写计数器。 + + +5. add()/del()/start()/stop() +----------------------------- + +åŸºæœ¬æ€æƒ³: add()/del() å‘PMUæ·»åŠ /åˆ é™¤äº‹ä»¶ï¼Œstart()/stop() å¯åЍ/åœæ¢PMU䏿Ÿä¸ªäº‹ä»¶ +的计数器。 所有这些函数都使用相åŒçš„傿•°: *struct perf_event *event* å’Œ *int flag* 。 + +把 perf çœ‹ä½œä¸€ä¸ªçŠ¶æ€æœºï¼Œé‚£ä¹ˆä½ 会å‘现这些函数作为这些状æ€ä¹‹é—´çš„状æ€è½¬æ¢è¿‡ç¨‹ã€‚ +定义了三ç§çжæ€ï¼ˆevent->hw.state): + +* PERF_HES_STOPPED: è®¡æ•°åœæ¢ +* PERF_HES_UPTODATE: event->count是最新的 +* PERF_HES_ARCH: ä¾èµ–于体系结构的用法,。。。我们现在并ä¸éœ€è¦å®ƒã€‚ + +这些状æ€è½¬æ¢çš„æ£å¸¸æµç¨‹å¦‚下: + +* 用户å¯åŠ¨ä¸€ä¸ª perf 事件,导致调用 *event_init* 。 +* 当被上下文切æ¢è¿›æ¥çš„æ—¶å€™ï¼Œ*add* 会被 perf core è°ƒç”¨ï¼Œå¹¶å¸¦æœ‰ä¸€ä¸ªæ ‡å¿— PERF_EF_START, + ä¹Ÿå°±æ˜¯è¯´äº‹ä»¶è¢«æ·»åŠ åŽåº”该被å¯åŠ¨ã€‚ 在这个阶段,如果有的è¯ï¼Œä¸€èˆ¬äº‹ä»¶ä¼šè¢«ç»‘定到一个物 + ç†è®¡æ•°å™¨ä¸Šã€‚当状æ€å˜ä¸ºPERF_HES_STOPPEDå’ŒPERF_HES_UPTODATEï¼Œå› ä¸ºçŽ°åœ¨å·²ç»åœæ¢äº†, + (软件)事件计数ä¸éœ€è¦æ›´æ–°ã€‚ + + - ç„¶åŽè°ƒç”¨ *start* ,并å¯ç”¨è®¡æ•°å™¨ã€‚ + 通过PERF_EF_RELOADæ ‡å¿—ï¼Œå®ƒå‘计数器写入一个适当的值(详细情况请å‚考上一节)。 + å¦‚æžœæ ‡å¿—ä¸åŒ…å«PERF_EF_RELOAD,则ä¸ä¼šå†™å…¥ä»»ä½•内容。 + 现在状æ€è¢«é‡ç½®ä¸ºnoneï¼Œå› ä¸ºå®ƒæ—¢æ²¡æœ‰åœæ¢ä¹Ÿæ²¡æœ‰æ›´æ–°ï¼ˆè®¡æ•°å·²ç»å¼€å§‹ï¼‰ã€‚ + +*当被上下文切æ¢å‡ºæ¥æ—¶è¢«è°ƒç”¨ã€‚ ç„¶åŽï¼Œå®ƒæ£€æŸ¥å‡ºPMUä¸çš„æ‰€æœ‰äº‹ä»¶ï¼Œå¹¶è°ƒç”¨ *stop* æ¥æ›´æ–°å®ƒä»¬ + 的计数。 + + - *stop* 被 *del* å’Œperfæ ¸å¿ƒè°ƒç”¨ï¼Œæ ‡å¿—ä¸ºPERF_EF_UPDATE,它ç»å¸¸ä»¥ç›¸åŒçš„逻辑和 *read* + 共用åŒä¸€ä¸ªå程åºã€‚ + 状æ€åˆä¸€æ¬¡å˜ä¸ºPERF_HES_STOPPEDå’ŒPERF_HES_UPTODATE。 + + - 这两对程åºçš„生命周期: *add* å’Œ *del* åœ¨ä»»åŠ¡åˆ‡æ¢æ—¶è¢«åå¤è°ƒç”¨ï¼›*start* å’Œ *stop* 在 + perfæ ¸å¿ƒéœ€è¦å¿«é€Ÿåœæ¢å’Œå¯åŠ¨æ—¶ä¹Ÿä¼šè¢«è°ƒç”¨ï¼Œæ¯”å¦‚åœ¨è°ƒæ•´ä¸æ–周期时。 + +ç›®å‰çš„实现已ç»è¶³å¤Ÿäº†ï¼Œå°†æ¥å¯ä»¥å¾ˆå®¹æ˜“地扩展到功能。 + +A. 相关结构体 +------------- + +* struct pmu: include/linux/perf_event.h +* struct riscv_pmu: arch/riscv/include/asm/perf_event.h + + 两个结构体都被设计为åªè¯»ã€‚ + + *struct pmu* 定义了一些函数指针接å£ï¼Œå®ƒä»¬å¤§å¤šä»¥ *struct perf_event* ä½œä¸ºä¸»å‚æ•°ï¼Œæ ¹æ® + perfçš„å†…éƒ¨çŠ¶æ€æœºå¤„ç†perf事件(详情请查看kernel/events/core.c)。 + + *struct riscv_pmu* 定义了PMUçš„å…·ä½“å‚æ•°ã€‚ 命åéµå¾ªæ‰€æœ‰å…¶å®ƒæž¶æž„的惯例。 + +* struct perf_event: include/linux/perf_event.h +* struct hw_perf_event + + 表示 perf 事件的通用结构体,以åŠç¡¬ä»¶ç›¸å…³çš„细节。 + +* struct riscv_hw_events: arch/riscv/include/asm/perf_event.h + + ä¿å˜äº‹ä»¶çжæ€çš„结构有两个固定æˆå‘˜ã€‚ + 事件的数é‡å’Œäº‹ä»¶çš„æ•°ç»„。 + +å‚考文献 +-------- + +[1] https://github.com/riscv/riscv-linux/pull/124 + +[2] https://groups.google.com/a/groups.riscv.org/forum/#!topic/sw-dev/f19TmCNP6yA diff --git a/Documentation/translations/zh_CN/sound/hd-audio/controls.rst b/Documentation/translations/zh_CN/sound/hd-audio/controls.rst new file mode 100644 index 0000000000000000000000000000000000000000..54c028ab9a4076c8dadc5b5dfa9da70c8ad0ba3c --- /dev/null +++ b/Documentation/translations/zh_CN/sound/hd-audio/controls.rst @@ -0,0 +1,102 @@ +.. SPDX-License-Identifier: GPL-2.0 + +Chinese translator: Huang Jianghui <huangjianghui@uniontech.com> +--------------------------------------------------------------------- +.. include:: ../../disclaimer-zh_CN.rst +ä»¥ä¸‹ä¸ºæ£æ–‡ +--------------------------------------------------------------------- +====================================== +高清音频编解ç 器特定混音器控件 +====================================== + + +æ¤æ–‡ä»¶è§£é‡Šç‰¹å®šäºŽç¼–è§£ç 器的混音器控件. + +瑞昱编解ç 器 +------------ + +声铿¨¡å¼ + 这是一个用于更改环绕声é“设置的枚举控件,ä»…åœ¨çŽ¯ç»•å£°é“æ‰“开时显示出现。 + 它给出è¦ä½¿ç”¨çš„é€šé“æ•°:"2ch","4ch","6ch",和"8ch"ã€‚æ ¹æ®é…置,这还控 + 制多I/Oæ’å”çš„æ’å”é‡åˆ†é…。 + +自动é™éŸ³æ¨¡å¼ + 这是一个枚举控件,用于更改耳机和线路输出æ’å”的自动é™éŸ³è¡Œä¸ºã€‚如果内 + 置扬声器ã€è€³æœºå’Œ/或线路输出æ’å”在机器上å¯ç”¨ï¼Œåˆ™æ˜¾ç¤ºè¯¥æŽ§ä»¶ã€‚å½“åªæœ‰ + 耳机或者线路输出的时候,它给出â€ç¦ç”¨â€œå’Œâ€å¯ç”¨â€œçжæ€ã€‚当å¯ç”¨åŽï¼Œæ’唿’ + å…¥åŽæ‰¬å£°å™¨ä¼šè‡ªåЍé™éŸ³ã€‚ + + 当耳机和线路输出æ’å”都å˜åœ¨æ—¶ï¼Œå®ƒç»™å‡ºâ€ç¦ç”¨â€œã€â€ä»…扬声器“和â€çº¿è·¯è¾“出+扬 + 声器“。当â€ä»…扬声器“被选择,æ’入耳机或者线路输出æ’å”å¯ä½¿æ‰¬å£°å™¨é™éŸ³ï¼Œ + 但ä¸ä¼šä½¿çº¿è·¯è¾“出é™éŸ³ã€‚当线路输出+扬声器被选择,æ’入耳机æ’å”ä¼šåŒæ—¶ä½¿æ‰¬ + 声器和线路输出é™éŸ³ã€‚ + + +矽玛特编解ç 器 +-------------- + +模拟环回 + æ¤æŽ§ä»¶å¯ç”¨/ç¦ç”¨æ¨¡æ‹ŸçŽ¯å›žç”µè·¯ã€‚åªæœ‰åœ¨ç¼–è§£ç 器æç¤ºä¸å°†â€lookback“设置为真 + æ—¶æ‰ä¼šå‡ºçް(è§HD-Audio.txt)。请注æ„,在æŸäº›ç¼–è§£ç 器上,模拟环回和æ£å¸¸ + PCMæ’æ”¾æ˜¯ç‹¬å çš„,å³å½“æ¤é€‰é¡¹æ‰“开时,您将å¬ä¸åˆ°ä»»ä½•PCMæµã€‚ + +交æ¢ä¸ç½®/低频 + 交æ¢ä¸ç½®å’Œä½Žé¢‘通é“顺åºï¼Œé€šå¸¸æƒ…况下,左侧对应ä¸ç½®ï¼Œå³ä¾§å¯¹åº”低频,å¯åŠ¨æ¤ + 项åŽï¼Œå·¦è¾¹ä½Žé¢‘,å³è¾¹ä¸ç½®ã€‚ + +耳机作为线路输出 + å½“æ¤æŽ§åˆ¶å¼€å¯æ—¶ï¼Œå°†è€³æœºè§†ä¸ºçº¿è·¯è¾“出æ’å”。也就是说,耳机ä¸ä¼šè‡ªåЍé™éŸ³å…¶ä»– + 线路输出,没有耳机放大器被设置到引脚上。 + +麦克风æ’壿¨¡å¼ã€çº¿è·¯æ’唿¨¡å¼ç‰ + 这些枚举控制输入æ’å”引脚的方å‘å’Œåç½®ã€‚æ ¹æ®æ’å”类型,它å¯ä»¥è®¾ç½®ä¸ºâ€éº¦å…‹é£Ž + 输入“和â€çº¿è·¯è¾“入“以确定输入åç½®,或者当引脚是环绕声é“的多I/Oæ’唿—¶ï¼Œå®ƒ + å¯ä»¥è®¾ç½®ä¸ºâ€çº¿è·¯è¾“出“。 + + +å¨ç››ç¼–è§£ç 器 +------------ + +智能5.1 + ä¸€ä¸ªæžšä¸¾æŽ§ä»¶ï¼Œç”¨äºŽä¸ºçŽ¯ç»•è¾“å‡ºé‡æ–°åˆ†é…多个I/Oæ’å”的任务。当它打开时,相应 + 的输入æ’å”(通常是线路输入和麦克风输入)被切æ¢ä¸ºçŽ¯ç»•å’Œä¸å¤®ä½Žé¢‘输出æ’å”。 + +独立耳机 + å¯ç”¨æ¤æžšä¸¾æŽ§åˆ¶æ—¶ï¼Œè€³æœºè¾“出从å•个æµï¼ˆç¬¬ä¸‰ä¸ªPCM,如hw:0,2ï¼‰è€Œä¸æ˜¯ä¸»æµè·¯ç”±ã€‚ + 如果耳机DAC与侧边或ä¸å¤®ä½Žé¢‘通é“DAC共享,则DAC将自动切æ¢åˆ°è€³æœºã€‚ + +çŽ¯å›žæ··åˆ + 一个用于确定是å¦å¯åŠ¨äº†æ¨¡æ‹ŸçŽ¯å›žè·¯ç”±çš„æžšä¸¾æŽ§ä»¶ã€‚å½“å®ƒå¯ç”¨åŽï¼Œæ¨¡æ‹ŸçŽ¯å›žè·¯ç”±åˆ° + å‰ç½®é€šé“ã€‚åŒæ ·ï¼Œè€³æœºä¸Žæ‰¬å£°å™¨è¾“出也采用相åŒçš„路径。作为一个副作用,当设置 + æ¤æ¨¡å¼åŽï¼Œå•ä¸ªéŸ³é‡æŽ§åˆ¶å°†ä¸å†é€‚ç”¨äºŽè€³æœºå’Œæ‰¬å£°å™¨ï¼Œå› ä¸ºåªæœ‰ä¸€ä¸ªDAC连接到混 + 音器å°éƒ¨ä»¶ã€‚ + +动æ€ç”µæºæŽ§åˆ¶ + æ¤æŽ§ä»¶å†³å®šæ˜¯å¦å¯åЍæ¯ä¸ªæ’å”的动æ€ç”µæºæŽ§åˆ¶æ£€æµ‹ã€‚å¯ç”¨æ—¶ï¼Œæ ¹æ®æ’å”çš„æ’入情况 + åŠ¨æ€æ›´æ”¹ç»„件的电æºçжæ€ï¼ˆD0/D3)以节çœç”µé‡æ¶ˆè€—。但是,如果您的系统没有æ + ä¾›æ£ç¡®çš„æ’å”æ£€æµ‹ï¼Œè¿™å°†æ— 法工作;åœ¨è¿™ç§æƒ…å†µä¸‹ï¼Œè¯·å…³é—æ¤æŽ§ä»¶ã€‚ + +æ’唿£€æµ‹ + æ¤æŽ§ä»¶ä»…ä¸ºVT1708ç¼–è§£ç 器æä¾›ï¼Œå®ƒä¸ä¼šä¸ºæ¯ä¸ªæ’唿’æ‹”æä¾›é€‚当的未请求事件。 + å½“æ¤æŽ§ä»¶æ‰“å¼€ï¼Œé©±åŠ¨å°†è½®è¯¢æ’唿£€æµ‹ï¼Œä»¥ä¾¿è€³æœºè‡ªåЍé™éŸ³å¯ä»¥å·¥ä½œï¼Œè€Œå…³é—æ¤æŽ§ + ä»¶å°†é™ä½ŽåŠŸè€—ã€‚ + + +科胜讯编解ç 器 +-------------- + +自动é™éŸ³æ¨¡å¼ + è§ç‘žæ˜±è§£ç 器 + + + +模拟编解ç 器 +------------ + +é€šé“æ¨¡å¼ + 这是一个用于更改环绕声é“设置的枚举控件,仅在环绕声é“å¯ç”¨æ—¶æ˜¾ç¤ºã€‚它æä¾›äº†èƒ½ + è¢«ä½¿ç”¨çš„é€šé“æ•°:â€2ch“ã€â€4ch“和â€6châ€œã€‚æ ¹æ®é…置,这还控制多I/Oæ’å”çš„æ’å”é‡ + 分é…。 + +独立耳机 + å¯åŠ¨æ¤æžšä¸¾æŽ§åˆ¶åŽï¼Œè€³æœºè¾“出从å•个æµï¼ˆç¬¬ä¸‰ä¸ªPCM,如hw:0,2ï¼‰è€Œä¸æ˜¯ä¸»æµè·¯ç”±ã€‚ diff --git a/Documentation/translations/zh_CN/sound/hd-audio/index.rst b/Documentation/translations/zh_CN/sound/hd-audio/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..d9885d53b069f4417842dabfed445104b049e5ae --- /dev/null +++ b/Documentation/translations/zh_CN/sound/hd-audio/index.rst @@ -0,0 +1,14 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../../disclaimer-zh_CN.rst + +:Original: :doc:`../../../../sound/hd-audio/index` +:Translator: Huang Jianghui <huangjianghui@uniontech.com> + + +高清音频 +======== + +.. toctree:: + :maxdepth: 2 + + controls diff --git a/Documentation/translations/zh_CN/sound/index.rst b/Documentation/translations/zh_CN/sound/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..28d5dca34a636692963a1cd4ad512617ce59c9a7 --- /dev/null +++ b/Documentation/translations/zh_CN/sound/index.rst @@ -0,0 +1,22 @@ +.. SPDX-License-Identifier: GPL-2.0 +.. include:: ../disclaimer-zh_CN.rst + +:Original: :doc:`../../../sound/index` +:Translator: Huang Jianghui <huangjianghui@uniontech.com> + + +==================== +Linux 声音å系统文档 +==================== + +.. toctree:: + :maxdepth: 2 + + hd-audio/index + +.. only:: subproject and html + + Indices + ======= + + * :ref:`genindex` diff --git a/Documentation/userspace-api/ioctl/ioctl-number.rst b/Documentation/userspace-api/ioctl/ioctl-number.rst index 181211beb01de7c8684d48d2792c2ef5f162e10b..9bfc2b510c6484bd752a266374adb6b78a6431c4 100644 --- a/Documentation/userspace-api/ioctl/ioctl-number.rst +++ b/Documentation/userspace-api/ioctl/ioctl-number.rst @@ -349,6 +349,7 @@ Code Seq# Include File Comments 0xB5 00-0F uapi/linux/rpmsg.h <mailto:linux-remoteproc@vger.kernel.org> 0xB6 all linux/fpga-dfl.h 0xB7 all uapi/linux/remoteproc_cdev.h <mailto:linux-remoteproc@vger.kernel.org> +0xB7 all uapi/linux/nsfs.h <mailto:Andrei Vagin <avagin@openvz.org>> 0xC0 00-0F linux/usb/iowarrior.h 0xCA 00-0F uapi/misc/cxl.h 0xCA 10-2F uapi/misc/ocxl.h diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst index 307f2fcf1b021239c505eed0f066bc69a1b983c3..245d80581f159580318215708d624166124a630a 100644 --- a/Documentation/virt/kvm/api.rst +++ b/Documentation/virt/kvm/api.rst @@ -55,7 +55,7 @@ not cause harm to the host, their actual behavior is not guaranteed by the API. See "General description" for details on the ioctl usage model that is supported by KVM. -It is important to note that althought VM ioctls may only be issued from +It is important to note that although VM ioctls may only be issued from the process that created the VM, a VM's lifecycle is associated with its file descriptor, not its creator (process). In other words, the VM and its resources, *including the associated address space*, are not freed diff --git a/Documentation/watchdog/pcwd-watchdog.rst b/Documentation/watchdog/pcwd-watchdog.rst index 405e2a3700828eb43592817002078067f0f47e5e..151505c856f63c8dbfa9ef4a3de8a0c0ae26afad 100644 --- a/Documentation/watchdog/pcwd-watchdog.rst +++ b/Documentation/watchdog/pcwd-watchdog.rst @@ -47,7 +47,7 @@ Documentation and Driver by Ken Hollis <kenji@bitgate.com> WDIOC_GETSTATUS This returns the status of the card, with the bits of WDIOF_* bitwise-anded into the value. (The comments - are in linux/pcwd.h) + are in include/uapi/linux/watchdog.h) WDIOC_GETBOOTSTATUS This returns the status of the card that was reported diff --git a/MAINTAINERS b/MAINTAINERS index 1162b0917630a3c4c755b422943ed07100150d14..ac0ff5feef1d42dd861d4311f6273ba26514f868 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -4235,13 +4235,20 @@ X: drivers/char/tpm/ CHECKPATCH M: Andy Whitcroft <apw@canonical.com> M: Joe Perches <joe@perches.com> +R: Dwaipayan Ray <dwaipayanray1@gmail.com> +R: Lukas Bulwahn <lukas.bulwahn@gmail.com> S: Maintained F: scripts/checkpatch.pl +CHECKPATCH DOCUMENTATION +M: Dwaipayan Ray <dwaipayanray1@gmail.com> +M: Lukas Bulwahn <lukas.bulwahn@gmail.com> +R: Joe Perches <joe@perches.com> +S: Maintained +F: Documentation/dev-tools/checkpatch.rst + CHINESE DOCUMENTATION -M: Harry Wei <harryxiyou@gmail.com> -M: Alex Shi <alex.shi@linux.alibaba.com> -L: xiyoulinuxkernelgroup@googlegroups.com (subscribers-only) +M: Alex Shi <alexs@kernel.org> S: Maintained F: Documentation/translations/zh_CN/ @@ -5469,6 +5476,12 @@ X: Documentation/power/ X: Documentation/spi/ X: Documentation/userspace-api/media/ +DOCUMENTATION REPORTING ISSUES +M: Thorsten Leemhuis <linux@leemhuis.info> +L: linux-doc@vger.kernel.org +S: Maintained +F: Documentation/admin-guide/reporting-issues.rst + DOCUMENTATION SCRIPTS M: Mauro Carvalho Chehab <mchehab@kernel.org> L: linux-doc@vger.kernel.org @@ -9800,6 +9813,11 @@ F: include/uapi/linux/sunrpc/ F: net/sunrpc/ F: Documentation/filesystems/nfs/ +KERNEL REGRESSIONS +M: Thorsten Leemhuis <linux@leemhuis.info> +L: regressions@lists.linux.dev +S: Supported + KERNEL SELFTEST FRAMEWORK M: Shuah Khan <shuah@kernel.org> M: Shuah Khan <skhan@linuxfoundation.org> diff --git a/fs/eventpoll.c b/fs/eventpoll.c index 3196474cbe24c884b866a9a14c183a4f842a8c2b..73138ea6834252acce735346ff4235ae989525c5 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c @@ -366,8 +366,8 @@ static inline struct epitem *ep_item_from_wait(wait_queue_entry_t *p) * * @ep: Pointer to the eventpoll context. * - * Returns: Returns a value different than zero if ready events are available, - * or zero otherwise. + * Return: a value different than %zero if ready events are available, + * or %zero otherwise. */ static inline int ep_events_available(struct eventpoll *ep) { @@ -1023,7 +1023,7 @@ struct file *get_epoll_tfile_raw_ptr(struct file *file, int tfd, } #endif /* CONFIG_KCMP */ -/** +/* * Adds a new entry to the tail of the list in a lockless way, i.e. * multiple CPUs are allowed to call this function concurrently. * @@ -1035,10 +1035,10 @@ struct file *get_epoll_tfile_raw_ptr(struct file *file, int tfd, * completed. * * Also an element can be locklessly added to the list only in one - * direction i.e. either to the tail either to the head, otherwise + * direction i.e. either to the tail or to the head, otherwise * concurrent access will corrupt the list. * - * Returns %false if element has been already added to the list, %true + * Return: %false if element has been already added to the list, %true * otherwise. */ static inline bool list_add_tail_lockless(struct list_head *new, @@ -1076,11 +1076,11 @@ static inline bool list_add_tail_lockless(struct list_head *new, return true; } -/** +/* * Chains a new epi entry to the tail of the ep->ovflist in a lockless way, * i.e. multiple CPUs are allowed to call this function concurrently. * - * Returns %false if epi element has been already chained, %true otherwise. + * Return: %false if epi element has been already chained, %true otherwise. */ static inline bool chain_epi_lockless(struct epitem *epi) { @@ -1105,8 +1105,8 @@ static inline bool chain_epi_lockless(struct epitem *epi) * mechanism. It is called by the stored file descriptors when they * have events to report. * - * This callback takes a read lock in order not to content with concurrent - * events from another file descriptors, thus all modifications to ->rdllist + * This callback takes a read lock in order not to contend with concurrent + * events from another file descriptor, thus all modifications to ->rdllist * or ->ovflist are lockless. Read lock is paired with the write lock from * ep_scan_ready_list(), which stops all list modifications and guarantees * that lists state is seen correctly. @@ -1335,8 +1335,8 @@ static int reverse_path_check_proc(struct hlist_head *refs, int depth) * paths such that we will spend all our time waking up * eventpoll objects. * - * Returns: Returns zero if the proposed links don't create too many paths, - * -1 otherwise. + * Return: %zero if the proposed links don't create too many paths, + * %-1 otherwise. */ static int reverse_path_check(void) { @@ -1734,7 +1734,7 @@ static struct timespec64 *ep_timeout_to_timespec(struct timespec64 *to, long ms) } /** - * ep_poll - Retrieves ready events, and delivers them to the caller supplied + * ep_poll - Retrieves ready events, and delivers them to the caller-supplied * event buffer. * * @ep: Pointer to the eventpoll context. @@ -1747,7 +1747,7 @@ static struct timespec64 *ep_timeout_to_timespec(struct timespec64 *to, long ms) * until at least one event has been retrieved (or an error * occurred). * - * Returns: Returns the number of ready events which have been fetched, or an + * Return: the number of ready events which have been fetched, or an * error code, in case of error. */ static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events, @@ -1774,9 +1774,9 @@ static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events, /* * This call is racy: We may or may not see events that are being added - * to the ready list under the lock (e.g., in IRQ callbacks). For, cases + * to the ready list under the lock (e.g., in IRQ callbacks). For cases * with a non-zero timeout, this thread will check the ready list under - * lock and will added to the wait queue. For, cases with a zero + * lock and will add to the wait queue. For cases with a zero * timeout, the user by definition should not care and will have to * recheck again. */ @@ -1869,15 +1869,15 @@ static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events, /** * ep_loop_check_proc - verify that adding an epoll file inside another - * epoll structure, does not violate the constraints, in + * epoll structure does not violate the constraints, in * terms of closed loops, or too deep chains (which can * result in excessive stack usage). * - * @priv: Pointer to the epoll file to be currently checked. + * @ep: the &struct eventpoll to be currently checked. * @depth: Current depth of the path being checked. * - * Returns: Returns zero if adding the epoll @file inside current epoll - * structure @ep does not violate the constraints, or -1 otherwise. + * Return: %zero if adding the epoll @file inside current epoll + * structure @ep does not violate the constraints, or %-1 otherwise. */ static int ep_loop_check_proc(struct eventpoll *ep, int depth) { @@ -1919,14 +1919,14 @@ static int ep_loop_check_proc(struct eventpoll *ep, int depth) /** * ep_loop_check - Performs a check to verify that adding an epoll file (@to) - * into another epoll file (represented by @from) does not create + * into another epoll file (represented by @ep) does not create * closed loops or too deep chains. * - * @from: Pointer to the epoll we are inserting into. + * @ep: Pointer to the epoll we are inserting into. * @to: Pointer to the epoll to be inserted. * - * Returns: Returns zero if adding the epoll @to inside the epoll @from - * does not violate the constraints, or -1 otherwise. + * Return: %zero if adding the epoll @to inside the epoll @from + * does not violate the constraints, or %-1 otherwise. */ static int ep_loop_check(struct eventpoll *ep, struct eventpoll *to) { @@ -2074,8 +2074,8 @@ int do_epoll_ctl(int epfd, int op, int fd, struct epoll_event *epds, ep = f.file->private_data; /* - * When we insert an epoll file descriptor, inside another epoll file - * descriptor, there is the change of creating closed loops, which are + * When we insert an epoll file descriptor inside another epoll file + * descriptor, there is the chance of creating closed loops, which are * better be handled here, than in more critical paths. While we are * checking for loops we also determine the list of files reachable * and hang them on the tfile_check_list, so we can check that we @@ -2113,7 +2113,7 @@ int do_epoll_ctl(int epfd, int op, int fd, struct epoll_event *epds, } /* - * Try to lookup the file inside our RB tree, Since we grabbed "mtx" + * Try to lookup the file inside our RB tree. Since we grabbed "mtx" * above, we can be sure to be able to use the item looked up by * ep_find() till we release the mutex. */ diff --git a/fs/namespace.c b/fs/namespace.c index 56bb5a5fdc0d099c3c150c7d3d1c20d2165e3e95..f63337828e1c474daa4ac8f13ebb99fc180e5eae 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -1242,8 +1242,9 @@ struct vfsmount *mntget(struct vfsmount *mnt) } EXPORT_SYMBOL(mntget); -/* path_is_mountpoint() - Check if path is a mount in the current - * namespace. +/** + * path_is_mountpoint() - Check if path is a mount in the current namespace. + * @path: path to check * * d_mountpoint() can only be used reliably to establish if a dentry is * not mounted in any namespace and that common case is handled inline. @@ -1369,7 +1370,7 @@ void mnt_cursor_del(struct mnt_namespace *ns, struct mount *cursor) /** * may_umount_tree - check if a mount tree is busy - * @mnt: root of mount tree + * @m: root of mount tree * * This is called to check if a tree of mounts has any * open files, pwds, chroots or sub mounts that are @@ -1939,10 +1940,11 @@ void drop_collected_mounts(struct vfsmount *mnt) /** * clone_private_mount - create a private clone of a path + * @path: path to clone * - * This creates a new vfsmount, which will be the clone of @path. The new will - * not be attached anywhere in the namespace and will be private (i.e. changes - * to the originating mount won't be propagated into this). + * This creates a new vfsmount, which will be the clone of @path. The new mount + * will not be attached anywhere in the namespace and will be private (i.e. + * changes to the originating mount won't be propagated into this). * * Release with mntput(). */ diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index df8b23dc1eb0af01280ae720331149086f10a506..f42e5ba16d9b5ea6a22c4f6894c0b9362ebaeb32 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -23,6 +23,9 @@ my $V = '0.32'; use Getopt::Long qw(:config no_auto_abbrev); my $quiet = 0; +my $verbose = 0; +my %verbose_messages = (); +my %verbose_emitted = (); my $tree = 1; my $chk_signoff = 1; my $chk_patch = 1; @@ -61,6 +64,7 @@ my $spelling_file = "$D/spelling.txt"; my $codespell = 0; my $codespellfile = "/usr/share/codespell/dictionary.txt"; my $conststructsfile = "$D/const_structs.checkpatch"; +my $docsfile = "$D/../Documentation/dev-tools/checkpatch.rst"; my $typedefsfile; my $color = "auto"; my $allow_c99_comments = 1; # Can be overridden by --ignore C99_COMMENT_TOLERANCE @@ -78,6 +82,7 @@ Version: $V Options: -q, --quiet quiet + -v, --verbose verbose mode --no-tree run without a kernel tree --no-signoff do not check for 'Signed-off-by' line --patch treat FILE as patchfile (default) @@ -158,15 +163,51 @@ sub list_types { my $text = <$script>; close($script); - my @types = (); + my %types = (); # Also catch when type or level is passed through a variable - for ($text =~ /(?:(?:\bCHK|\bWARN|\bERROR|&\{\$msg_level})\s*\(|\$msg_type\s*=)\s*"([^"]+)"/g) { - push (@types, $_); + while ($text =~ /(?:(\bCHK|\bWARN|\bERROR|&\{\$msg_level})\s*\(|\$msg_type\s*=)\s*"([^"]+)"/g) { + if (defined($1)) { + if (exists($types{$2})) { + $types{$2} .= ",$1" if ($types{$2} ne $1); + } else { + $types{$2} = $1; + } + } else { + $types{$2} = "UNDETERMINED"; + } } - @types = sort(uniq(@types)); + print("#\tMessage type\n\n"); - foreach my $type (@types) { + if ($color) { + print(" ( Color coding: "); + print(RED . "ERROR" . RESET); + print(" | "); + print(YELLOW . "WARNING" . RESET); + print(" | "); + print(GREEN . "CHECK" . RESET); + print(" | "); + print("Multiple levels / Undetermined"); + print(" )\n\n"); + } + + foreach my $type (sort keys %types) { + my $orig_type = $type; + if ($color) { + my $level = $types{$type}; + if ($level eq "ERROR") { + $type = RED . $type . RESET; + } elsif ($level eq "WARN") { + $type = YELLOW . $type . RESET; + } elsif ($level eq "CHK") { + $type = GREEN . $type . RESET; + } + } print(++$count . "\t" . $type . "\n"); + if ($verbose && exists($verbose_messages{$orig_type})) { + my $message = $verbose_messages{$orig_type}; + $message =~ s/\n/\n\t/g; + print("\t" . $message . "\n\n"); + } } exit($exitcode); @@ -198,6 +239,46 @@ if (-f $conf) { unshift(@ARGV, @conf_args) if @conf_args; } +sub load_docs { + open(my $docs, '<', "$docsfile") + or warn "$P: Can't read the documentation file $docsfile $!\n"; + + my $type = ''; + my $desc = ''; + my $in_desc = 0; + + while (<$docs>) { + chomp; + my $line = $_; + $line =~ s/\s+$//; + + if ($line =~ /^\s*\*\*(.+)\*\*$/) { + if ($desc ne '') { + $verbose_messages{$type} = trim($desc); + } + $type = $1; + $desc = ''; + $in_desc = 1; + } elsif ($in_desc) { + if ($line =~ /^(?:\s{4,}|$)/) { + $line =~ s/^\s{4}//; + $desc .= $line; + $desc .= "\n"; + } else { + $verbose_messages{$type} = trim($desc); + $type = ''; + $desc = ''; + $in_desc = 0; + } + } + } + + if ($desc ne '') { + $verbose_messages{$type} = trim($desc); + } + close($docs); +} + # Perl's Getopt::Long allows options to take optional arguments after a space. # Prevent --color by itself from consuming other arguments foreach (@ARGV) { @@ -208,6 +289,7 @@ foreach (@ARGV) { GetOptions( 'q|quiet+' => \$quiet, + 'v|verbose!' => \$verbose, 'tree!' => \$tree, 'signoff!' => \$chk_signoff, 'patch!' => \$chk_patch, @@ -247,13 +329,27 @@ GetOptions( help(0) if ($help); +die "$P: --git cannot be used with --file or --fix\n" if ($git && ($file || $fix)); +die "$P: --verbose cannot be used with --terse\n" if ($verbose && $terse); + +if ($color =~ /^[01]$/) { + $color = !$color; +} elsif ($color =~ /^always$/i) { + $color = 1; +} elsif ($color =~ /^never$/i) { + $color = 0; +} elsif ($color =~ /^auto$/i) { + $color = (-t STDOUT); +} else { + die "$P: Invalid color mode: $color\n"; +} + +load_docs() if ($verbose); list_types(0) if ($list_types); $fix = 1 if ($fix_inplace); $check_orig = $check; -die "$P: --git cannot be used with --file or --fix\n" if ($git && ($file || $fix)); - my $exit = 0; my $perl_version_ok = 1; @@ -268,18 +364,6 @@ if ($#ARGV < 0) { push(@ARGV, '-'); } -if ($color =~ /^[01]$/) { - $color = !$color; -} elsif ($color =~ /^always$/i) { - $color = 1; -} elsif ($color =~ /^never$/i) { - $color = 0; -} elsif ($color =~ /^auto$/i) { - $color = (-t STDOUT); -} else { - die "$P: Invalid color mode: $color\n"; -} - # skip TAB size 1 to avoid additional checks on $tabsize - 1 die "$P: Invalid TAB size: $tabsize\n" if ($tabsize < 2); @@ -2209,7 +2293,16 @@ sub report { splice(@lines, 1, 1); $output = join("\n", @lines); } - $output = (split('\n', $output))[0] . "\n" if ($terse); + + if ($terse) { + $output = (split('\n', $output))[0] . "\n"; + } + + if ($verbose && exists($verbose_messages{$type}) && + !exists($verbose_emitted{$type})) { + $output .= $verbose_messages{$type} . "\n\n"; + $verbose_emitted{$type} = 1; + } push(our @report, $output); diff --git a/scripts/get_abi.pl b/scripts/get_abi.pl index 92d9aa6cc4f5d2bd98c845adffb1e3b37d5e3749..d7aa8209429676c587194ba1f5f4fc543bbee7a6 100755 --- a/scripts/get_abi.pl +++ b/scripts/get_abi.pl @@ -281,8 +281,12 @@ sub create_labels { # Outputs the book on ReST format # -# \b doesn't work well with paths. So, we need to define something else -my $bondary = qr { (?<![\w\/\`\{])(?=[\w\/\`\{])|(?<=[\w\/\`\{])(?![\w\/\`\{]) }x; +# \b doesn't work well with paths. So, we need to define something else: +# Boundaries are punct characters, spaces and end-of-line +my $start = qr {(^|\s|\() }x; +my $bondary = qr { ([,.:;\)\s]|\z) }x; +my $xref_match = qr { $start(\/(sys|config|proc|dev|kvd)\/[^,.:;\)\s]+)$bondary }x; +my $symbols = qr { ([\x01-\x08\x0e-\x1f\x21-\x2f\x3a-\x40\x7b-\xff]) }x; sub output_rest { create_labels(); @@ -305,7 +309,6 @@ sub output_rest { } my $w = $what; - $w =~ s/([\(\)\_\-\*\=\^\~\\])/\\$1/g; if ($type ne "File") { my $cur_part = $what; @@ -329,6 +332,7 @@ sub output_rest { my $len = 0; foreach my $name (@names) { + $name =~ s/$symbols/\\$1/g; $name = "**$name**"; $len = length($name) if (length($name) > $len); } @@ -377,32 +381,60 @@ sub output_rest { # Enrich text by creating cross-references - $desc =~ s,Documentation/(?!devicetree)(\S+)\.rst,:doc:`/$1`,g; + my $new_desc = ""; + my $init_indent = -1; + my $literal_indent = -1; + + open(my $fh, "+<", \$desc); + while (my $d = <$fh>) { + my $indent = $d =~ m/^(\s+)/; + my $spaces = length($indent); + $init_indent = $indent if ($init_indent < 0); + if ($literal_indent >= 0) { + if ($spaces > $literal_indent) { + $new_desc .= $d; + next; + } else { + $literal_indent = -1; + } + } else { + if ($d =~ /()::$/ && !($d =~ /^\s*\.\./)) { + $literal_indent = $spaces; + } + } - my @matches = $desc =~ m,Documentation/ABI/([\w\/\-]+),; - foreach my $f (@matches) { - my $xref = $f; - my $path = $f; - $path =~ s,.*/(.*/.*),$1,;; - $path =~ s,[/\-],_,g;; - $xref .= " <abi_file_" . $path . ">"; - $desc =~ s,\bDocumentation/ABI/$f\b,:ref:`$xref`,g; - } + $d =~ s,Documentation/(?!devicetree)(\S+)\.rst,:doc:`/$1`,g; - @matches = $desc =~ m,$bondary(/sys/[^\s\.\,\;\:\*\s\`\'\(\)]+)$bondary,; + my @matches = $d =~ m,Documentation/ABI/([\w\/\-]+),g; + foreach my $f (@matches) { + my $xref = $f; + my $path = $f; + $path =~ s,.*/(.*/.*),$1,;; + $path =~ s,[/\-],_,g;; + $xref .= " <abi_file_" . $path . ">"; + $d =~ s,\bDocumentation/ABI/$f\b,:ref:`$xref`,g; + } + + # Seek for cross reference symbols like /sys/... + @matches = $d =~ m/$xref_match/g; - foreach my $s (@matches) { - if (defined($data{$s}) && defined($data{$s}->{label})) { - my $xref = $s; + foreach my $s (@matches) { + next if (!($s =~ m,/,)); + if (defined($data{$s}) && defined($data{$s}->{label})) { + my $xref = $s; - $xref =~ s/([\x00-\x1f\x21-\x2f\x3a-\x40\x7b-\xff])/\\$1/g; - $xref = ":ref:`$xref <" . $data{$s}->{label} . ">`"; + $xref =~ s/$symbols/\\$1/g; + $xref = ":ref:`$xref <" . $data{$s}->{label} . ">`"; - $desc =~ s,$bondary$s$bondary,$xref,g; + $d =~ s,$start$s$bondary,$1$xref$2,g; + } } + $new_desc .= $d; } + close $fh; + - print "$desc\n\n"; + print "$new_desc\n\n"; } else { $desc =~ s/^\s+//; diff --git a/scripts/kernel-doc b/scripts/kernel-doc index 8b5bc7bf4bb87cf2f997380242f00b3672cc3e57..2a85d34fdcd0a8d9da79166cb67f7a44b46815f0 100755 --- a/scripts/kernel-doc +++ b/scripts/kernel-doc @@ -391,8 +391,14 @@ my $doc_com = '\s*\*\s*'; my $doc_com_body = '\s*\* ?'; my $doc_decl = $doc_com . '(\w+)'; # @params and a strictly limited set of supported section names +# Specifically: +# Match @word: +# @...: +# @{section-name}: +# while trying to not match literal block starts like "example::" +# my $doc_sect = $doc_com . - '\s*(\@[.\w]+|\@\.\.\.|description|context|returns?|notes?|examples?)\s*:(.*)'; + '\s*(\@[.\w]+|\@\.\.\.|description|context|returns?|notes?|examples?)\s*:([^:].*)?$'; my $doc_content = $doc_com_body . '(.*)'; my $doc_block = $doc_com . 'DOC:\s*(.*)?'; my $doc_inline_start = '^\s*/\*\*\s*$'; @@ -1201,12 +1207,23 @@ sub dump_union($$) { sub dump_struct($$) { my $x = shift; my $file = shift; + my $decl_type; + my $members; + my $type = qr{struct|union}; + # For capturing struct/union definition body, i.e. "{members*}qualifiers*" + my $definition_body = qr{\{(.*)\}(?:\s*(?:__packed|__aligned|____cacheline_aligned_in_smp|____cacheline_aligned|__attribute__\s*\(\([a-z0-9,_\s\(\)]*\)\)))*}; - if ($x =~ /(struct|union)\s+(\w+)\s*\{(.*)\}(\s*(__packed|__aligned|____cacheline_aligned_in_smp|____cacheline_aligned|__attribute__\s*\(\([a-z0-9,_\s\(\)]*\)\)))*/) { - my $decl_type = $1; + if ($x =~ /($type)\s+(\w+)\s*$definition_body/) { + $decl_type = $1; $declaration_name = $2; - my $members = $3; + $members = $3; + } elsif ($x =~ /typedef\s+($type)\s*$definition_body\s*(\w+)\s*;/) { + $decl_type = $1; + $declaration_name = $3; + $members = $2; + } + if ($members) { if ($identifier ne $declaration_name) { print STDERR "${file}:$.: warning: expecting prototype for $decl_type $identifier. Prototype was for $decl_type $declaration_name instead\n"; return; @@ -1401,9 +1418,14 @@ sub dump_enum($$) { if ($members) { if ($identifier ne $declaration_name) { - print STDERR "${file}:$.: warning: expecting prototype for enum $identifier. Prototype was for enum $declaration_name instead\n"; + if ($identifier eq "") { + print STDERR "${file}:$.: warning: wrong kernel-doc identifier on line:\n"; + } else { + print STDERR "${file}:$.: warning: expecting prototype for enum $identifier. Prototype was for enum $declaration_name instead\n"; + } return; } + $declaration_name = "(anonymous)" if ($declaration_name eq ""); my %_members; @@ -1755,12 +1777,14 @@ sub dump_function($$) { $prototype =~ s/^noinline +//; $prototype =~ s/__init +//; $prototype =~ s/__init_or_module +//; + $prototype =~ s/__flatten +//; $prototype =~ s/__meminit +//; $prototype =~ s/__must_check +//; $prototype =~ s/__weak +//; $prototype =~ s/__sched +//; $prototype =~ s/__printf\s*\(\s*\d*\s*,\s*\d*\s*\) +//; my $define = $prototype =~ s/^#\s*define\s+//; #ak added + $prototype =~ s/__attribute_const__ +//; $prototype =~ s/__attribute__\s*\(\( (?: [\w\s]++ # attribute name @@ -2085,15 +2109,28 @@ sub process_name($$) { } } elsif (/$doc_decl/o) { $identifier = $1; - if (/\s*([\w\s]+?)(\(\))?\s*([-:].*)?$/) { + my $is_kernel_comment = 0; + my $decl_start = qr{\s*\*}; + # test for pointer declaration type, foo * bar() - desc + my $fn_type = qr{\w+\s*\*\s*}; + my $parenthesis = qr{\(\w*\)}; + my $decl_end = qr{[-:].*}; + if (/^$decl_start\s*([\w\s]+?)$parenthesis?\s*$decl_end?$/) { $identifier = $1; } if ($identifier =~ m/^(struct|union|enum|typedef)\b\s*(\S*)/) { $decl_type = $1; $identifier = $2; - } else { + $is_kernel_comment = 1; + } + # Look for foo() or static void foo() - description; or misspelt + # identifier + elsif (/^$decl_start\s*$fn_type?(\w+)\s*$parenthesis?\s*$decl_end?$/ || + /^$decl_start\s*$fn_type?(\w+.*)$parenthesis?\s*$decl_end$/) { + $identifier = $1; $decl_type = 'function'; $identifier =~ s/^define\s+//; + $is_kernel_comment = 1; } $identifier =~ s/\s+$//; @@ -2115,13 +2152,20 @@ sub process_name($$) { $declaration_purpose = ""; } + if (!$is_kernel_comment) { + print STDERR "${file}:$.: warning: This comment starts with '/**', but isn't a kernel-doc comment. Refer Documentation/doc-guide/kernel-doc.rst\n"; + print STDERR $_; + ++$warnings; + $state = STATE_NORMAL; + } + if (($declaration_purpose eq "") && $verbose) { print STDERR "${file}:$.: warning: missing initial short description on line:\n"; print STDERR $_; ++$warnings; } - if ($identifier eq "") { + if ($identifier eq "" && $decl_type ne "enum") { print STDERR "${file}:$.: warning: wrong kernel-doc identifier on line:\n"; print STDERR $_; ++$warnings; diff --git a/scripts/sphinx-pre-install b/scripts/sphinx-pre-install index b5f9fd5b28808868bccca9818460674ee6549785..fe92020d67e3fc0c513daaa60905df02d5ba98e8 100755 --- a/scripts/sphinx-pre-install +++ b/scripts/sphinx-pre-install @@ -259,7 +259,7 @@ sub get_sphinx_version($) open IN, "$cmd --version 2>&1 |"; while (<IN>) { - if (m/^\s*sphinx-build\s+([\d\.]+)(\+\/[\da-f]+)?$/) { + if (m/^\s*sphinx-build\s+([\d\.]+)((\+\/[\da-f]+)|(b\d+))?$/) { $ver=$1; last; } diff --git a/tools/debugging/kernel-chktaint b/tools/debugging/kernel-chktaint index 607b2b280945bc4de744bf70e90fba6f70cafa8d..719f18b1edf0db06b3a9aeaa8800fc79b5a09748 100755 --- a/tools/debugging/kernel-chktaint +++ b/tools/debugging/kernel-chktaint @@ -25,7 +25,7 @@ if [ "$1"x != "x" ]; then elif [ $1 -ge 0 ] 2>/dev/null ; then taint=$1 else - echo "Error: Parameter '$1' not a positive interger. Aborting." >&2 + echo "Error: Parameter '$1' not a positive integer. Aborting." >&2 exit 1 fi else diff --git a/tools/scripts/Makefile.include b/tools/scripts/Makefile.include index a402f32a145c0de38bb3325e7fd33080a5e15b48..84dbf61a7eca469f845c12f2456905d39f4795fd 100644 --- a/tools/scripts/Makefile.include +++ b/tools/scripts/Makefile.include @@ -86,7 +86,8 @@ endif # in newer systems. # Needed for the __raw_cmpxchg in tools/arch/x86/include/asm/cmpxchg.h # -# See https://lkml.org/lkml/2006/11/28/253 and https://gcc.gnu.org/gcc-4.8/changes.html, +# See https://lore.kernel.org/lkml/9a8748490611281710g78402fbeh8ff7fcc162dbcbca@mail.gmail.com/ +# and https://gcc.gnu.org/gcc-4.8/changes.html, # that takes into account Linus's comments (search for Wshadow) for the reasoning about # -Wshadow not being interesting before gcc 4.8.