Commit Graph

303 Commits

Author SHA1 Message Date
linD026
1a6fb67cf2
Fix potential concurrent access problems with VFS (#108)
Since Linux v3.14, the read, write and seek operations of "struct file" are
guaranteed for thread safety [1][2]. This patch added an explanation.

Here are the potential problems:
chardev.c:
- Move the "msg_ptr" pointer into the read function to remove unnecessary usage.
- List the clear states of "already_open" by using mnemonic enumeration.

chardev2.c:
- The "buffer" in the write function is user space data. It cannot use in the
  kernel space.
- Reduce the redundant type transformation.
- List the states of "already_open". Same as chardev.c.

[1] https://lore.kernel.org/lkml/20140303210359.26624.qmail@science.horizon.com/T/#u
[2] 9c225f2655
2021-09-23 12:20:10 +08:00
Jim Huang
027f39c0c1 Denote LWN hyperlink 2021-09-23 00:36:42 +08:00
Jim Huang
37f9a86fec Mention the Online Books Page 2021-09-22 01:38:39 +08:00
Jim Huang
81a1e88c64
Merge pull request #109 from YLowy/master
Fix typo
2021-09-19 20:47:19 +08:00
Ylowy
24257e837e
Typo. 2021-09-19 20:39:56 +08:00
Jim Huang
09e636cc80
Merge pull request #107 from sprowell/master
Fixed parameter name for hello-5.
2021-09-16 04:19:49 +08:00
Stacy Prowell
728b7fd432
Fixed parameter name for hello-5.
Parameters are case-sensitive, so myintArray is different from myintarray, and people who are running the example with copy/paste will find it doesn't work as described in the text.
2021-09-15 16:05:26 -04:00
Jim Huang
7fd696cb95
Merge pull request #106 from linD026/master
CI: Integrate the Sparse into the CI pipeline
2021-09-15 13:27:02 +08:00
linD026
25d82ec47f CI: Integrate the Sparse into the CI pipeline
Sparse[1] is a semantic parser for C language, it can find out the
potential problem of the example code.

[1] https://www.kernel.org/doc/html/latest/dev-tools/sparse.html
2021-09-15 12:43:56 +08:00
linD026
5070fcd9d0
CI: Run static analysis with Cppcheck (#105)
Cppcheck[1] is integrated into CI pipeline for running static analysis.

However, Cppcheck is known to report false-positive, and we have to
suppress some warnings in advance.

[1] https://cppcheck.sourceforge.io/
2021-09-14 00:52:04 +08:00
Jim Huang
55b77fac8d
Merge pull request #104 from linD026/master
ioctl: Remove unnecessary initialization
2021-09-13 16:15:08 +08:00
linD026
fa035da36e ioctl.c: Remove unnecessary initialization
The "alloc_chrdev_region" function will dynamically choose the
major number and store it at "dev". It is unnecessary to initialize
the "dev" before the "alloc_chrdev_region" function.
2021-09-13 14:55:16 +08:00
Jim Huang
a1aa18efe0 Trivial GitHub workflow tweak 2021-09-13 06:41:47 +00:00
Jim Huang
0a4aad90b4 Make CI validation more verbose 2021-09-13 04:03:04 +00:00
Jim Huang
42a21d2c55 Mention Free Ebook Foundation 2021-09-12 09:34:04 +00:00
Jim Huang
4473733c2e
Merge pull request #102 from giladreti/patch-1
Fix typo
2021-09-12 17:11:44 +08:00
Gilad Reti
e8d5bf7fd4
fix typo: compatibiity -> compatibility 2021-09-12 08:54:53 +03:00
Jim Huang
3c3ef728bf
Merge pull request #101 from fennecJ/patch
Enable kbleds in CI pipeline
2021-09-12 12:05:00 +08:00
fennecJ
377e63449b Remove kbleds from non-working list
Since #98 has fixed the error with kbleds caused by changed timer API,
now it can work again with docker container.
2021-09-12 11:47:00 +08:00
Jim Huang
c519f57403 Simplify the wording 2021-09-10 14:19:22 +00:00
Jim Huang
0400543038 Improve top-level documentation
This patch introduced the changes:
- Build instructions
- Strip duplicated commands
- Add more hyperlinks
- Mention nerdctl as Docker CLI replacement
2021-09-10 14:03:09 +00:00
linD026
62dbb1b7b8
Adapt the timer API Usage (#98)
Since v4.14 [1], the timer API has been changed to improve memory safety.
The series of improvements ended up at v4.15 [2].

Reference: https://lwn.net/Articles/735887/

Close #97

[1] 686fef928b
[2] 841b86f328
2021-09-10 12:29:48 +08:00
Kellegram
d5c43420c8
Workaround inconsistent text scaling (#100)
p + pre remains at em as we want to use the parent element here (however rem
could be used too, just requires a bigger value). I am setting it to 110% size,
otherwise some code blocks have relatively small text. The smaller code blocks
do appear bigger.
2021-09-10 12:08:57 +08:00
Kellegram
3b9a3bd0b8
Improve readability (#96)
This new foreground + background color maintains the minimum of 7:1 contrast ratio as specified by WCAG (this has 7.36:1) and is the same colors Firefox reading mode uses when choosing the sepia theme. 

Fonts are too small by default, using responsive units (em) let's me increase them, I am unsure where or if there is font-size specified for parent anywhere but it seems to have been manually decreased.

Increased max-width slightly to adjust for new size and more standard line-height, so the doc doesn't feel significantly longer, still maintains good eye travel.
2021-09-09 11:20:41 +08:00
Jim Huang
4ef3d90ffe suppress warning: no newline at end of file 2021-09-08 22:23:02 +08:00
fennecJ
3fcbb8e182
Improve CI pipeline to automate module testing (#95)
The script executes insmod/rmmod twice with available kernel modules.

Close #72
2021-09-08 20:38:50 +08:00
linD026
148fb013ee
Avoid unexpected concurrent access (#94)
In file {chardev,chardev2,sleep}.c, the variable to determine
the exclusive access was of integer type, which led to race
condition.

This patch rewrote the above with atomic CAS respectively
to eliminate the race.

Close #93
2021-09-07 23:42:06 +08:00
linD026
9289bfe59c
Fix the warnings raised by Sparse (#92)
Sparse[1] is a semantic parser, capable of finding out the potential
problems of Linux kernel code. This patch fixed the warnings.

[1] https://www.kernel.org/doc/html/latest/dev-tools/sparse.html
2021-09-04 17:53:29 +08:00
Jim Huang
21ca08a17e
Merge pull request #91 from ccs100203/master
Fix Typo
2021-09-03 23:13:10 +08:00
ccs100203
56c99328b3 Fix Typo
from "mask" to "masks"
from "quick" to "quickly"
from "a" to "an"
2021-09-03 23:02:17 +08:00
linD026
d27203ef46
Enforce consistent style for directory "other" (#89) 2021-09-02 16:26:29 +08:00
linD026
eef2bc4395
Enforce Linux kernel coding style (#88)
The only exception is to indent with four spaces rather than tabs
for sticking to compact layout of source listing.

Close #87
2021-09-02 15:15:07 +08:00
Jim Huang
6110f8ee3c Rewrite the descriptions about bottom half 2021-09-01 12:07:25 +08:00
Jim Huang
5b953eea75
Merge pull request #86 from linD026/master
Fix typo
2021-09-01 09:44:45 +08:00
linzhien
5cd96a80c9 Fix typo 2021-09-01 07:44:40 +08:00
fennecJ
0e11c00e1b
Add GitHub buttons in rendered HTML (#85)
GitHub buttons are rendered in the generated HTML:
one is GitHub project page; another is PDF download.

Close #84
2021-08-31 23:49:18 +08:00
linD026
cccc98ab2c
Fix disallowed cr0 write protection and close_fd (#80)
Since the commit 8dbec27a242cd3e2816eeb98d3237b9f57cf6232 [1]
(kernel version v5.3+ [2]) the sensitive CR0 bits in x86 is pinned,
we need to use the inline asm [3][4] to bypass it.

commit 8dbec27a242cd3e2816eeb98d3237b9f57cf6232 :
> With sensitive CR4 bits pinned now, it's possible that the WP bit for
> CR0 might become a target as well.
>
> Following the same reasoning for the CR4 pinning, pin CR0's WP
> bit. Contrary to the cpu feature dependend CR4 pinning this can be done
> with a constant value.

Also, getting "sys_call_table" [8] from the symbol lookup by using the address
of "close_fd" does not work for v5.11+ [5][6]. The reason is the entry of
"sys_call_table[__NR_close]" is not the address of "close_fd", actually
it is "__x64_sys_close" in x86.

Two solutions were proposed: using "kallsyms_lookup_name" [7] or just specifying
the address into the module. The symbol "kallsyms_lookup_name"  is unexported
since v5.7; the address of "sys_call_table" can be found in
"/boot/System.map" or "/proc/kallsyms".

Since v5.7, the manual symbol lookup is not guaranteed to work
because of control-flow integrity (or control-flow enforcement [9][10]) is added
[11] for x86, but it is disabled since v5.11 [12][13]. To make sure manual symbol
lookup work, it only uses up to v5.4.

Reference:
[1] 8dbec27a24
[2] https://outflux.net/blog/archives/2019/11/14/security-things-in-linux-v5-3/
[3] https://patchwork.kernel.org/project/linux-kbuild/patch/20200903203053.3411268-3-samitolvanen@google.com/
[4] https://stackoverflow.com/questions/58512430/how-to-write-to-protected-pages-in-the-linux-kernel
[5] https://lore.kernel.org/bpf/20201120231441.29911-21-ebiederm@xmission.com/
[6] https://lore.kernel.org/bpf/87blj83ysq.fsf@x220.int.ebiederm.org/
[7] 0bd476e6c6
[8] 8f27766a88
[9] https://lore.kernel.org/lkml/20200204171425.28073-1-yu-cheng.yu@intel.com/
[10] https://lore.kernel.org/linux-doc/20201110162211.9207-1-yu-cheng.yu@intel.com/T/
[11] 5790921bc1
[12] 20bf2b3787
[13] https://lore.kernel.org/bpf/20210128123842.c9e33949e62f504b84bfadf5@gmail.com/
2021-08-31 11:07:01 +08:00
Jim Huang
d3bde7daed print_string: Validate tty before accessing its operations
Close #81
2021-08-30 01:41:57 +08:00
Jim Huang
b990049715
Merge pull request #79 from xatier/patch-1
Update Arch Linux kernel headers information
2021-08-26 11:14:11 +08:00
xatier
1f9f201940
Update Archlinux kernel headers instructions
`linux-libre-headers` has been moved to AUR [1]. We can simply install `linux-headers` [2] instead.

[1] https://aur.archlinux.org/packages/linux-libre-headers/
[2] https://archlinux.org/packages/core/x86_64/linux-headers/
2021-08-25 20:11:27 -07:00
linD026
06b75942cc
Fix incorrect major number registration in chardev (#77)
chardev2.c demonstrates the ioctl operation with static major
number MAJOR_NUM, but there also exists "Major," the dynamic
one, which results in registration and deregistration on different
device. Once the module remove, it cannot insert again:

  $ sudo insmod chardev2.ko
  $ sudo rmmod chardev2
  $ cat /proc/devices
  Character devices:
  ...
  100 char_dev
  $ sudo insmod chardev2.ko
  insmod: ERROR: could not insert module chardev2.ko: Device or resource busy

This patch removed the use of dynamic major number.
2021-08-26 03:16:17 +08:00
Jim Huang
c97348d2d5
Merge pull request #75 from tuckerpo/fix/errno_assignment
Fix: errno assignment should be comparison.
2021-08-24 23:22:32 +08:00
Tucker Polomik
a183cc72f0 Fix: errno assignment should be comparison. 2021-08-24 11:16:25 -04:00
Jim Huang
ecfe9606de Get rid of the initial 0 that shows up in every (sub)section
Every section and subsection number can be eliminated by adding the
renewcommand.

Suggested by Lars Engebretsen.
2021-08-24 19:02:16 +08:00
Jim Huang
9d39f658c7
Merge pull request #74 from brdbkr/master
Fixed typo
2021-08-24 14:08:24 +08:00
Brad Baker
8012508508 Fixing typo 2021-08-24 00:15:47 -04:00
Jim Huang
fe3db9f939
Merge pull request #70 from fennecJ/patch
Adapt recent kernel changes
2021-08-24 03:41:14 +08:00
fennecJ
870b26fa2d Update several example code for newer kernel
Known issues with current example code:
If you using newer kernel(e.g linux 5.11.x) to compile the example code,
you may meet following error:
1. syscall.c:83:50: error: ‘ksys_close’ undeclared;
2. cryptosk.c:17:24: error: field ‘sg’ has incomplete type
3. cryptosk.c:143:9: error: implicit declaration of function
‘get_random_bytes’
4. error: macro "DECLARE_TASKLET" passed 3 arguments, but takes just 2

Solutions/workaround:
1. In syscall.c, replace #include <linux/syscalls.h> with
#include <linux/fdtable.h> and replace  ksys_close with close_fd
if the kernel version >= 5.11. [1][2]
2. Add #include <linux/scatterlist.h> into cryptosk.c
3. Add #include <linux/random.h> into cryptosk.c
4. In bottomhalf.c and example_tasklet.c, replace DECLARE_TASKLET
with DECLARE_TASKLET_OLD and dispose third argument(0L). [3]

[1] - https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1572bfdf21d4d50e51941498ffe0b56c2289f783
[2] - https://www.mail-archive.com/meta-arago@arago-project.org//msg11939.html
[3] - https://patchwork.kernel.org/project/kernel-hardening/patch/20200716030847.1564131-3-keescook@chromium.org/
2021-08-23 21:30:43 +08:00
Jim Huang
bd8342bc14
Merge pull request #69 from gagachang/master
Update path to kernel v5.x
2021-08-21 19:27:08 +08:00
gagachang
9827e32e4d Update some file path to kernel v5.x+ in example/kbleds.c
1. drivers/char/vt_ioctl.c -> drivers/tty/vt/vt_ioctl.c
2. drivers/char/keyboard.c -> drivers/tty/vt/keyboard.c
2021-08-21 14:51:37 +08:00