Merge tag 'docs-5.7' of git://git.lwn.net/linux
Pull documentation updates from Jonathan Corbet: "This has been a busy cycle for documentation work. Highlights include: - Lots of RST conversion work by Mauro, Daniel ALmeida, and others. Maybe someday we'll get to the end of this stuff...maybe... - Some organizational work to bring some order to the core-api manual. - Various new docs and additions to the existing documentation. - Typo fixes, warning fixes, ..." * tag 'docs-5.7' of git://git.lwn.net/linux: (123 commits) Documentation: x86: exception-tables: document CONFIG_BUILDTIME_TABLE_SORT MAINTAINERS: adjust to filesystem doc ReST conversion docs: deprecated.rst: Add BUG()-family doc: zh_CN: add translation for virtiofs doc: zh_CN: index files in filesystems subdirectory docs: locking: Drop :c:func: throughout docs: locking: Add 'need' to hardirq section docs: conf.py: avoid thousands of duplicate label warning on Sphinx docs: prevent warnings due to autosectionlabel docs: fix reference to core-api/namespaces.rst docs: fix pointers to io-mapping.rst and io_ordering.rst files Documentation: Better document the softlockup_panic sysctl docs: hw-vuln: tsx_async_abort.rst: get rid of an unused ref docs: perf: imx-ddr.rst: get rid of a warning docs: filesystems: fuse.rst: supress a Sphinx warning docs: translations: it: avoid duplicate refs at programming-language.rst docs: driver.rst: supress two ReSt warnings docs: trace: events.rst: convert some new stuff to ReST format Documentation: Add io_ordering.rst to driver-api manual Documentation: Add io-mapping.rst to driver-api manual ...
Šī revīzija ir iekļauta:
@@ -18,18 +18,18 @@ major kernel release happening every two or three months. The recent
|
||||
release history looks like this:
|
||||
|
||||
====== =================
|
||||
4.11 April 30, 2017
|
||||
4.12 July 2, 2017
|
||||
4.13 September 3, 2017
|
||||
4.14 November 12, 2017
|
||||
4.15 January 28, 2018
|
||||
4.16 April 1, 2018
|
||||
5.0 March 3, 2019
|
||||
5.1 May 5, 2019
|
||||
5.2 July 7, 2019
|
||||
5.3 September 15, 2019
|
||||
5.4 November 24, 2019
|
||||
5.5 January 6, 2020
|
||||
====== =================
|
||||
|
||||
Every 4.x release is a major kernel release with new features, internal
|
||||
API changes, and more. A typical 4.x release contain about 13,000
|
||||
changesets with changes to several hundred thousand lines of code. 4.x is
|
||||
thus the leading edge of Linux kernel development; the kernel uses a
|
||||
Every 5.x release is a major kernel release with new features, internal
|
||||
API changes, and more. A typical release can contain about 13,000
|
||||
changesets with changes to several hundred thousand lines of code. 5.x is
|
||||
the leading edge of Linux kernel development; the kernel uses a
|
||||
rolling development model which is continually integrating major changes.
|
||||
|
||||
A relatively straightforward discipline is followed with regard to the
|
||||
@@ -48,9 +48,9 @@ detail later on).
|
||||
|
||||
The merge window lasts for approximately two weeks. At the end of this
|
||||
time, Linus Torvalds will declare that the window is closed and release the
|
||||
first of the "rc" kernels. For the kernel which is destined to be 2.6.40,
|
||||
first of the "rc" kernels. For the kernel which is destined to be 5.6,
|
||||
for example, the release which happens at the end of the merge window will
|
||||
be called 2.6.40-rc1. The -rc1 release is the signal that the time to
|
||||
be called 5.6-rc1. The -rc1 release is the signal that the time to
|
||||
merge new features has passed, and that the time to stabilize the next
|
||||
kernel has begun.
|
||||
|
||||
@@ -67,22 +67,23 @@ add at any time).
|
||||
As fixes make their way into the mainline, the patch rate will slow over
|
||||
time. Linus releases new -rc kernels about once a week; a normal series
|
||||
will get up to somewhere between -rc6 and -rc9 before the kernel is
|
||||
considered to be sufficiently stable and the final 2.6.x release is made.
|
||||
considered to be sufficiently stable and the final release is made.
|
||||
At that point the whole process starts over again.
|
||||
|
||||
As an example, here is how the 4.16 development cycle went (all dates in
|
||||
2018):
|
||||
As an example, here is how the 5.4 development cycle went (all dates in
|
||||
2019):
|
||||
|
||||
============== ===============================
|
||||
January 28 4.15 stable release
|
||||
February 11 4.16-rc1, merge window closes
|
||||
February 18 4.16-rc2
|
||||
February 25 4.16-rc3
|
||||
March 4 4.16-rc4
|
||||
March 11 4.16-rc5
|
||||
March 18 4.16-rc6
|
||||
March 25 4.16-rc7
|
||||
April 1 4.16 stable release
|
||||
September 15 5.3 stable release
|
||||
September 30 5.4-rc1, merge window closes
|
||||
October 6 5.4-rc2
|
||||
October 13 5.4-rc3
|
||||
October 20 5.4-rc4
|
||||
October 27 5.4-rc5
|
||||
November 3 5.4-rc6
|
||||
November 10 5.4-rc7
|
||||
November 17 5.4-rc8
|
||||
November 24 5.4 stable release
|
||||
============== ===============================
|
||||
|
||||
How do the developers decide when to close the development cycle and create
|
||||
@@ -98,43 +99,44 @@ release is made. In the real world, this kind of perfection is hard to
|
||||
achieve; there are just too many variables in a project of this size.
|
||||
There comes a point where delaying the final release just makes the problem
|
||||
worse; the pile of changes waiting for the next merge window will grow
|
||||
larger, creating even more regressions the next time around. So most 4.x
|
||||
larger, creating even more regressions the next time around. So most 5.x
|
||||
kernels go out with a handful of known regressions though, hopefully, none
|
||||
of them are serious.
|
||||
|
||||
Once a stable release is made, its ongoing maintenance is passed off to the
|
||||
"stable team," currently consisting of Greg Kroah-Hartman. The stable team
|
||||
will release occasional updates to the stable release using the 4.x.y
|
||||
numbering scheme. To be considered for an update release, a patch must (1)
|
||||
fix a significant bug, and (2) already be merged into the mainline for the
|
||||
next development kernel. Kernels will typically receive stable updates for
|
||||
a little more than one development cycle past their initial release. So,
|
||||
for example, the 4.13 kernel's history looked like:
|
||||
"stable team," currently Greg Kroah-Hartman. The stable team will release
|
||||
occasional updates to the stable release using the 5.x.y numbering scheme.
|
||||
To be considered for an update release, a patch must (1) fix a significant
|
||||
bug, and (2) already be merged into the mainline for the next development
|
||||
kernel. Kernels will typically receive stable updates for a little more
|
||||
than one development cycle past their initial release. So, for example, the
|
||||
5.2 kernel's history looked like this (all dates in 2019):
|
||||
|
||||
============== ===============================
|
||||
September 3 4.13 stable release
|
||||
September 13 4.13.1
|
||||
September 20 4.13.2
|
||||
September 27 4.13.3
|
||||
October 5 4.13.4
|
||||
October 12 4.13.5
|
||||
September 15 5.2 stable release
|
||||
July 14 5.2.1
|
||||
July 21 5.2.2
|
||||
July 26 5.2.3
|
||||
July 28 5.2.4
|
||||
July 31 5.2.5
|
||||
... ...
|
||||
November 24 4.13.16
|
||||
October 11 5.2.21
|
||||
============== ===============================
|
||||
|
||||
4.13.16 was the final stable update of the 4.13 release.
|
||||
5.2.21 was the final stable update of the 5.2 release.
|
||||
|
||||
Some kernels are designated "long term" kernels; they will receive support
|
||||
for a longer period. As of this writing, the current long term kernels
|
||||
and their maintainers are:
|
||||
|
||||
====== ====================== ==============================
|
||||
3.16 Ben Hutchings (very long-term stable kernel)
|
||||
4.1 Sasha Levin
|
||||
4.4 Greg Kroah-Hartman (very long-term stable kernel)
|
||||
4.9 Greg Kroah-Hartman
|
||||
4.14 Greg Kroah-Hartman
|
||||
====== ====================== ==============================
|
||||
====== ================================ =======================
|
||||
3.16 Ben Hutchings (very long-term kernel)
|
||||
4.4 Greg Kroah-Hartman & Sasha Levin (very long-term kernel)
|
||||
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
|
||||
====== ================================ =======================
|
||||
|
||||
The selection of a kernel for long-term support is purely a matter of a
|
||||
maintainer having the need and the time to maintain that release. There
|
||||
@@ -215,12 +217,12 @@ How patches get into the Kernel
|
||||
-------------------------------
|
||||
|
||||
There is exactly one person who can merge patches into the mainline kernel
|
||||
repository: Linus Torvalds. But, of the over 9,500 patches which went
|
||||
into the 2.6.38 kernel, only 112 (around 1.3%) were directly chosen by Linus
|
||||
himself. The kernel project has long since grown to a size where no single
|
||||
developer could possibly inspect and select every patch unassisted. The
|
||||
way the kernel developers have addressed this growth is through the use of
|
||||
a lieutenant system built around a chain of trust.
|
||||
repository: Linus Torvalds. But, for example, of the over 9,500 patches
|
||||
which went into the 2.6.38 kernel, only 112 (around 1.3%) were directly
|
||||
chosen by Linus himself. The kernel project has long since grown to a size
|
||||
where no single developer could possibly inspect and select every patch
|
||||
unassisted. The way the kernel developers have addressed this growth is
|
||||
through the use of a lieutenant system built around a chain of trust.
|
||||
|
||||
The kernel code base is logically broken down into a set of subsystems:
|
||||
networking, specific architecture support, memory management, video
|
||||
|
@@ -284,9 +284,9 @@ context lines.
|
||||
4) Naming
|
||||
---------
|
||||
|
||||
C is a Spartan language, and so should your naming be. Unlike Modula-2
|
||||
and Pascal programmers, C programmers do not use cute names like
|
||||
ThisVariableIsATemporaryCounter. A C programmer would call that
|
||||
C is a Spartan language, and your naming conventions should follow suit.
|
||||
Unlike Modula-2 and Pascal programmers, C programmers do not use cute
|
||||
names like ThisVariableIsATemporaryCounter. A C programmer would call that
|
||||
variable ``tmp``, which is much easier to write, and not the least more
|
||||
difficult to understand.
|
||||
|
||||
@@ -300,9 +300,9 @@ that counts the number of active users, you should call that
|
||||
``count_active_users()`` or similar, you should **not** call it ``cntusr()``.
|
||||
|
||||
Encoding the type of a function into the name (so-called Hungarian
|
||||
notation) is brain damaged - the compiler knows the types anyway and can
|
||||
check those, and it only confuses the programmer. No wonder MicroSoft
|
||||
makes buggy programs.
|
||||
notation) is asinine - the compiler knows the types anyway and can check
|
||||
those, and it only confuses the programmer. No wonder Microsoft makes buggy
|
||||
programs.
|
||||
|
||||
LOCAL variable names should be short, and to the point. If you have
|
||||
some random integer loop counter, it should probably be called ``i``.
|
||||
@@ -806,9 +806,9 @@ covers RTL which is used frequently with assembly language in the kernel.
|
||||
----------------------------
|
||||
|
||||
Kernel developers like to be seen as literate. Do mind the spelling
|
||||
of kernel messages to make a good impression. Do not use crippled
|
||||
words like ``dont``; use ``do not`` or ``don't`` instead. Make the messages
|
||||
concise, clear, and unambiguous.
|
||||
of kernel messages to make a good impression. Do not use incorrect
|
||||
contractions like ``dont``; use ``do not`` or ``don't`` instead. Make the
|
||||
messages concise, clear, and unambiguous.
|
||||
|
||||
Kernel messages do not have to be terminated with a period.
|
||||
|
||||
|
@@ -29,6 +29,28 @@ a header file, it isn't the full solution. Such interfaces must either
|
||||
be fully removed from the kernel, or added to this file to discourage
|
||||
others from using them in the future.
|
||||
|
||||
BUG() and BUG_ON()
|
||||
------------------
|
||||
Use WARN() and WARN_ON() instead, and handle the "impossible"
|
||||
error condition as gracefully as possible. While the BUG()-family
|
||||
of APIs were originally designed to act as an "impossible situation"
|
||||
assert and to kill a kernel thread "safely", they turn out to just be
|
||||
too risky. (e.g. "In what order do locks need to be released? Have
|
||||
various states been restored?") Very commonly, using BUG() will
|
||||
destabilize a system or entirely break it, which makes it impossible
|
||||
to debug or even get viable crash reports. Linus has `very strong
|
||||
<https://lore.kernel.org/lkml/CA+55aFy6jNLsywVYdGp83AMrXBo_P-pkjkphPGrO=82SPKCpLQ@mail.gmail.com/>`_
|
||||
feelings `about this
|
||||
<https://lore.kernel.org/lkml/CAHk-=whDHsbK3HTOpTF=ue_o04onRwTEaK_ZoJp_fjbqq4+=Jw@mail.gmail.com/>`_.
|
||||
|
||||
Note that the WARN()-family should only be used for "expected to
|
||||
be unreachable" situations. If you want to warn about "reachable
|
||||
but undesirable" situations, please use the pr_warn()-family of
|
||||
functions. System owners may have set the *panic_on_warn* sysctl,
|
||||
to make sure their systems do not continue running in the face of
|
||||
"unreachable" conditions. (For example, see commits like `this one
|
||||
<https://git.kernel.org/linus/d4689846881d160a4d12a514e991a740bcb5d65a>`_.)
|
||||
|
||||
open-coded arithmetic in allocator arguments
|
||||
--------------------------------------------
|
||||
Dynamic size calculations (especially multiplication) should not be
|
||||
@@ -63,51 +85,73 @@ Instead, use the helper::
|
||||
|
||||
header = kzalloc(struct_size(header, item, count), GFP_KERNEL);
|
||||
|
||||
See :c:func:`array_size`, :c:func:`array3_size`, and :c:func:`struct_size`,
|
||||
for more details as well as the related :c:func:`check_add_overflow` and
|
||||
:c:func:`check_mul_overflow` family of functions.
|
||||
See array_size(), array3_size(), and struct_size(),
|
||||
for more details as well as the related check_add_overflow() and
|
||||
check_mul_overflow() family of functions.
|
||||
|
||||
simple_strtol(), simple_strtoll(), simple_strtoul(), simple_strtoull()
|
||||
----------------------------------------------------------------------
|
||||
The :c:func:`simple_strtol`, :c:func:`simple_strtoll`,
|
||||
:c:func:`simple_strtoul`, and :c:func:`simple_strtoull` functions
|
||||
The simple_strtol(), simple_strtoll(),
|
||||
simple_strtoul(), and simple_strtoull() functions
|
||||
explicitly ignore overflows, which may lead to unexpected results
|
||||
in callers. The respective :c:func:`kstrtol`, :c:func:`kstrtoll`,
|
||||
:c:func:`kstrtoul`, and :c:func:`kstrtoull` functions tend to be the
|
||||
in callers. The respective kstrtol(), kstrtoll(),
|
||||
kstrtoul(), and kstrtoull() functions tend to be the
|
||||
correct replacements, though note that those require the string to be
|
||||
NUL or newline terminated.
|
||||
|
||||
strcpy()
|
||||
--------
|
||||
:c:func:`strcpy` performs no bounds checking on the destination
|
||||
strcpy() performs no bounds checking on the destination
|
||||
buffer. This could result in linear overflows beyond the
|
||||
end of the buffer, leading to all kinds of misbehaviors. While
|
||||
`CONFIG_FORTIFY_SOURCE=y` and various compiler flags help reduce the
|
||||
risk of using this function, there is no good reason to add new uses of
|
||||
this function. The safe replacement is :c:func:`strscpy`.
|
||||
this function. The safe replacement is strscpy().
|
||||
|
||||
strncpy() on NUL-terminated strings
|
||||
-----------------------------------
|
||||
Use of :c:func:`strncpy` does not guarantee that the destination buffer
|
||||
Use of strncpy() does not guarantee that the destination buffer
|
||||
will be NUL terminated. This can lead to various linear read overflows
|
||||
and other misbehavior due to the missing termination. It also NUL-pads the
|
||||
destination buffer if the source contents are shorter than the destination
|
||||
buffer size, which may be a needless performance penalty for callers using
|
||||
only NUL-terminated strings. The safe replacement is :c:func:`strscpy`.
|
||||
(Users of :c:func:`strscpy` still needing NUL-padding will need an
|
||||
explicit :c:func:`memset` added.)
|
||||
only NUL-terminated strings. The safe replacement is strscpy().
|
||||
(Users of strscpy() still needing NUL-padding should instead
|
||||
use strscpy_pad().)
|
||||
|
||||
If a caller is using non-NUL-terminated strings, :c:func:`strncpy()` can
|
||||
If a caller is using non-NUL-terminated strings, strncpy()() can
|
||||
still be used, but destinations should be marked with the `__nonstring
|
||||
<https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html>`_
|
||||
attribute to avoid future compiler warnings.
|
||||
|
||||
strlcpy()
|
||||
---------
|
||||
:c:func:`strlcpy` reads the entire source buffer first, possibly exceeding
|
||||
strlcpy() reads the entire source buffer first, possibly exceeding
|
||||
the given limit of bytes to copy. This is inefficient and can lead to
|
||||
linear read overflows if a source string is not NUL-terminated. The
|
||||
safe replacement is :c:func:`strscpy`.
|
||||
safe replacement is strscpy().
|
||||
|
||||
%p format specifier
|
||||
-------------------
|
||||
Traditionally, using "%p" in format strings would lead to regular address
|
||||
exposure flaws in dmesg, proc, sysfs, etc. Instead of leaving these to
|
||||
be exploitable, all "%p" uses in the kernel are being printed as a hashed
|
||||
value, rendering them unusable for addressing. New uses of "%p" should not
|
||||
be added to the kernel. For text addresses, using "%pS" is likely better,
|
||||
as it produces the more useful symbol name instead. For nearly everything
|
||||
else, just do not add "%p" at all.
|
||||
|
||||
Paraphrasing Linus's current `guidance <https://lore.kernel.org/lkml/CA+55aFwQEd_d40g4mUCSsVRZzrFPUJt74vc6PPpb675hYNXcKw@mail.gmail.com/>`_:
|
||||
|
||||
- If the hashed "%p" value is pointless, ask yourself whether the pointer
|
||||
itself is important. Maybe it should be removed entirely?
|
||||
- If you really think the true pointer value is important, why is some
|
||||
system state or user privilege level considered "special"? If you think
|
||||
you can justify it (in comments and commit log) well enough to stand
|
||||
up to Linus's scrutiny, maybe you can use "%px", along with making sure
|
||||
you have sensible permissions.
|
||||
|
||||
And finally, know that a toggle for "%p" hashing will `not be accepted <https://lore.kernel.org/lkml/CA+55aFwieC1-nAs+NFq9RTwaR8ef9hWa4MjNBWL41F-8wM49eA@mail.gmail.com/>`_.
|
||||
|
||||
Variable Length Arrays (VLAs)
|
||||
-----------------------------
|
||||
@@ -122,27 +166,37 @@ memory adjacent to the stack (when built without `CONFIG_VMAP_STACK=y`)
|
||||
|
||||
Implicit switch case fall-through
|
||||
---------------------------------
|
||||
The C language allows switch cases to "fall-through" when a "break" statement
|
||||
is missing at the end of a case. This, however, introduces ambiguity in the
|
||||
code, as it's not always clear if the missing break is intentional or a bug.
|
||||
The C language allows switch cases to fall through to the next case
|
||||
when a "break" statement is missing at the end of a case. This, however,
|
||||
introduces ambiguity in the code, as it's not always clear if the missing
|
||||
break is intentional or a bug. For example, it's not obvious just from
|
||||
looking at the code if `STATE_ONE` is intentionally designed to fall
|
||||
through into `STATE_TWO`::
|
||||
|
||||
switch (value) {
|
||||
case STATE_ONE:
|
||||
do_something();
|
||||
case STATE_TWO:
|
||||
do_other();
|
||||
break;
|
||||
default:
|
||||
WARN("unknown state");
|
||||
}
|
||||
|
||||
As there have been a long list of flaws `due to missing "break" statements
|
||||
<https://cwe.mitre.org/data/definitions/484.html>`_, we no longer allow
|
||||
"implicit fall-through".
|
||||
|
||||
In order to identify intentional fall-through cases, we have adopted a
|
||||
pseudo-keyword macro 'fallthrough' which expands to gcc's extension
|
||||
__attribute__((__fallthrough__)). `Statement Attributes
|
||||
<https://gcc.gnu.org/onlinedocs/gcc/Statement-Attributes.html>`_
|
||||
|
||||
When the C17/C18 [[fallthrough]] syntax is more commonly supported by
|
||||
implicit fall-through. In order to identify intentional fall-through
|
||||
cases, we have adopted a pseudo-keyword macro "fallthrough" which
|
||||
expands to gcc's extension `__attribute__((__fallthrough__))
|
||||
<https://gcc.gnu.org/onlinedocs/gcc/Statement-Attributes.html>`_.
|
||||
(When the C17/C18 `[[fallthrough]]` syntax is more commonly supported by
|
||||
C compilers, static analyzers, and IDEs, we can switch to using that syntax
|
||||
for the macro pseudo-keyword.
|
||||
for the macro pseudo-keyword.)
|
||||
|
||||
All switch/case blocks must end in one of:
|
||||
|
||||
break;
|
||||
fallthrough;
|
||||
continue;
|
||||
goto <label>;
|
||||
return [expression];
|
||||
* break;
|
||||
* fallthrough;
|
||||
* continue;
|
||||
* goto <label>;
|
||||
* return [expression];
|
||||
|
@@ -237,9 +237,9 @@ using Mutt to send patches through Gmail::
|
||||
|
||||
The Mutt docs have lots more information:
|
||||
|
||||
http://dev.mutt.org/trac/wiki/UseCases/Gmail
|
||||
https://gitlab.com/muttmua/mutt/-/wikis/UseCases/Gmail
|
||||
|
||||
http://dev.mutt.org/doc/manual.html
|
||||
http://www.mutt.org/doc/manual/
|
||||
|
||||
Pine (TUI)
|
||||
**********
|
||||
|
@@ -243,10 +243,10 @@ branches. These different branches are:
|
||||
Mainline tree
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
Mainline tree are maintained by Linus Torvalds, and can be found at
|
||||
The mainline tree is maintained by Linus Torvalds, and can be found at
|
||||
https://kernel.org or in the repo. Its development process is as follows:
|
||||
|
||||
- As soon as a new kernel is released a two weeks window is open,
|
||||
- As soon as a new kernel is released a two week window is open,
|
||||
during this period of time maintainers can submit big diffs to
|
||||
Linus, usually the patches that have already been included in the
|
||||
linux-next for a few weeks. The preferred way to submit big changes
|
||||
@@ -281,8 +281,9 @@ Various stable trees with multiple major numbers
|
||||
|
||||
Kernels with 3-part versions are -stable kernels. They contain
|
||||
relatively small and critical fixes for security problems or significant
|
||||
regressions discovered in a given major mainline release, with the first
|
||||
2-part of version number are the same correspondingly.
|
||||
regressions discovered in a given major mainline release. Each release
|
||||
in a major stable series increments the third part of the version
|
||||
number, keeping the first two parts the same.
|
||||
|
||||
This is the recommended branch for users who want the most recent stable
|
||||
kernel and are not interested in helping test development/experimental
|
||||
@@ -359,10 +360,10 @@ Managing bug reports
|
||||
|
||||
One of the best ways to put into practice your hacking skills is by fixing
|
||||
bugs reported by other people. Not only you will help to make the kernel
|
||||
more stable, you'll learn to fix real world problems and you will improve
|
||||
your skills, and other developers will be aware of your presence. Fixing
|
||||
bugs is one of the best ways to get merits among other developers, because
|
||||
not many people like wasting time fixing other people's bugs.
|
||||
more stable, but you'll also learn to fix real world problems and you will
|
||||
improve your skills, and other developers will be aware of your presence.
|
||||
Fixing bugs is one of the best ways to get merits among other developers,
|
||||
because not many people like wasting time fixing other people's bugs.
|
||||
|
||||
To work in the already reported bug reports, go to https://bugzilla.kernel.org.
|
||||
|
||||
|
@@ -313,7 +313,7 @@ On-line docs
|
||||
:URL: http://www.linuxjournal.com/article.php?sid=2391
|
||||
:Date: 1997
|
||||
:Keywords: RAID, MD driver.
|
||||
:Description: Linux Journal Kernel Korner article. Here is its
|
||||
:Description: Linux Journal Kernel Korner article.
|
||||
:Abstract: *A description of the implementation of the RAID-1,
|
||||
RAID-4 and RAID-5 personalities of the MD device driver in the
|
||||
Linux kernel, providing users with high performance and reliable,
|
||||
@@ -338,7 +338,7 @@ On-line docs
|
||||
:Date: 1996
|
||||
:Keywords: device driver, module, loading/unloading modules,
|
||||
allocating resources.
|
||||
:Description: Linux Journal Kernel Korner article. Here is its
|
||||
:Description: Linux Journal Kernel Korner article.
|
||||
:Abstract: *This is the first of a series of four articles
|
||||
co-authored by Alessandro Rubini and Georg Zezchwitz which present
|
||||
a practical approach to writing Linux device drivers as kernel
|
||||
@@ -354,7 +354,7 @@ On-line docs
|
||||
:Keywords: character driver, init_module, clean_up module,
|
||||
autodetection, mayor number, minor number, file operations,
|
||||
open(), close().
|
||||
:Description: Linux Journal Kernel Korner article. Here is its
|
||||
:Description: Linux Journal Kernel Korner article.
|
||||
:Abstract: *This article, the second of four, introduces part of
|
||||
the actual code to create custom module implementing a character
|
||||
device driver. It describes the code for module initialization and
|
||||
@@ -367,7 +367,7 @@ On-line docs
|
||||
:Date: 1996
|
||||
:Keywords: read(), write(), select(), ioctl(), blocking/non
|
||||
blocking mode, interrupt handler.
|
||||
:Description: Linux Journal Kernel Korner article. Here is its
|
||||
:Description: Linux Journal Kernel Korner article.
|
||||
:Abstract: *This article, the third of four on writing character
|
||||
device drivers, introduces concepts of reading, writing, and using
|
||||
ioctl-calls*.
|
||||
@@ -378,7 +378,7 @@ On-line docs
|
||||
:URL: http://www.linuxjournal.com/article.php?sid=1222
|
||||
:Date: 1996
|
||||
:Keywords: interrupts, irqs, DMA, bottom halves, task queues.
|
||||
:Description: Linux Journal Kernel Korner article. Here is its
|
||||
:Description: Linux Journal Kernel Korner article.
|
||||
:Abstract: *This is the fourth in a series of articles about
|
||||
writing character device drivers as loadable kernel modules. This
|
||||
month, we further investigate the field of interrupt handling.
|
||||
|
@@ -227,7 +227,7 @@ incompetence will grudgingly admit that you at least didn't try to weasel
|
||||
out of it.
|
||||
|
||||
Then make the developer who really screwed up (if you can find them) know
|
||||
**in_private** that they screwed up. Not just so they can avoid it in the
|
||||
**in private** that they screwed up. Not just so they can avoid it in the
|
||||
future, but so that they know they owe you one. And, perhaps even more
|
||||
importantly, they're also likely the person who can fix it. Because, let's
|
||||
face it, it sure ain't you.
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user