Skip to content

Commit 515f18e

Browse files
author
deployBot
committed
Deploy at Sat Apr 13 15:17:32 UTC 2024
1 parent 2442f28 commit 515f18e

File tree

82 files changed

+250
-232
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+250
-232
lines changed

_sources/index.rst.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@
22
Linux 内核教学
33
=============
44

5-
这是一系列关于 Linux 内核主题的课程和实验。课程侧重于理论和 Linux 内核探索。
5+
本文档包含一系列 Linux 内核主题的课程和实验。课程侧重于理论和 Linux 内核探索。
66

77
实验侧重于设备驱动程序主题,文档风格类似“howto”。每个主题分两部分:
88

9-
* 主题概述,包含概述、主要抽象概念、简单示例和 API 的指引。
9+
* 主题概述,包含概述、主要抽象概念、简单示例和对 API 的指引。
1010

11-
* 实践部分,包含几个应由学生解决的练习;为了使学生专注于当下的主题,学生会得到一个起始编码框架和深入的技巧提示来解决练习
11+
* 实践部分,包含几个应由学生解决的练习;为了使学生专注于当下的主题,学生会得到一个起始编码框架和深入的解决练习的技巧提示
1212

13-
这些内容基于布加勒斯特理工大学自动控制与计算机学院计算机科学与工程系的“操作系统 2”<http://ocw.cs.pub.ro/courses/so2>`_ 课程。
13+
本文档内容基于布加勒斯特理工大学自动控制与计算机学院计算机科学与工程系的 `“操作系统 2” <http://ocw.cs.pub.ro/courses/so2>`_ 课程。
1414

1515
你可以在 https://github.com/linux-kernel-labs-zh 获取最新版本。
1616

17-
在你的主机上安装 docker-compose 后,可以从源代码构建文档:
17+
在你的主机上安装 docker-compose 后,可以从源代码构建文档
1818

1919
.. code-block:: bash
2020

_sources/info/contributing.rst.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
===========================
2-
Linux 内核实验室项目做贡献
2+
Linux 内核实验项目做贡献
33
===========================
44

5-
``Linux 内核实验室`` 是一个开放的平台。你可以通过对文档、练习或基础设施的贡献来帮助它变得更好。无论是对错别字的修正还是在文档中添加新的部分,所有的贡献我们都欢迎。
5+
``Linux 内核实验`` 是一个开放的平台。你可以通过对文档、练习或基础设施的贡献来帮助它变得更好。无论是对错别字的修正还是在文档中添加新的部分,所有的贡献我们都欢迎。
66

7-
所有需要进行贡献的信息都可以在 `linux 内核实验室 Linux 仓库 <https://github.com/linux-kernel-labs/linux>`_ 中找到。如果要改变任何东西,你需要从你自己的 fork 创建一个拉取请求(``Pull Request``,``PR``)到这个仓库。PR 将由团队成员进行审核,并在解决任何可能的问题后合并。
7+
所有需要进行贡献的信息都可以在 `Linux 内核实验 Linux 仓库 <https://github.com/linux-kernel-labs/linux>`_ 中找到。如果要改变任何东西,你需要从你自己的 fork 创建一个拉取请求(``Pull Request``,``PR``)到这个仓库。PR 将由团队成员进行审核,并在解决任何可能的问题后合并。
88

99
********
1010
仓库结构
1111
********
1212

13-
`Linux 内核实验室仓库 <https://github.com/linux-kernel-labs/linux>`_ 是 Linux 内核仓库的一个 fork,增加了以下内容:
13+
`Linux 内核实验仓库 <https://github.com/linux-kernel-labs/linux>`_ 是 Linux 内核仓库的一个 fork,增加了以下内容:
1414

1515
* ``/tools/labs``: 包含实验室和:ref:`虚拟机(VM)基础设施<vm_link>`
1616

_sources/labs/device_drivers.rst.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ inode 结构包含许多信息,其中包括一个 ``i_cdev`` 字段,它是
314314

315315
``open`` 函数执行设备的初始化。在大多数情况下,这些操作涉及初始化设备并填充特定数据(如果是第一次打开调用)。*释放函数*用于释放设备特定资源:在调用全部完成后,解除对特定数据的锁定并关闭设备。
316316
317-
在大多数情况下*打开函数*的结构如下所示:
317+
在大多数情况下, *打开函数* 的结构如下所示:
318318

319319
.. code-block:: c
320320
@@ -695,7 +695,7 @@ ioctl
695695

696696
3. 实现完成后,使用 ``cat /dev/so2_cdev`` 进行测试。
697697

698-
.. note:: 命令 ``cat /dev/so2_cdev`` 不会结束(使用Ctrl+C)。请阅读 `读和写`_ 和 `访问进程的地址空间`_ 部分。如果要显示偏移值,请使用以下形式的构造: ``pr_info("Offset: %lld \n", *offset)``;偏移值的数据类型 ``loff_t`` 是 ``long long int`` 的 typedef。
698+
.. note:: 命令 ``cat /dev/so2_cdev`` 不会结束(使用Ctrl+C)。请阅读 `读取和写入`_ 和 `访问进程地址空间`_ 部分。如果要显示偏移值,请使用以下形式的构造: ``pr_info("Offset: %lld \n", *offset)``;偏移值的数据类型 ``loff_t`` 是 ``long long int`` 的 typedef。
699699

700700
``cat`` 命令一直读取到文件的末尾,文件通过读取返回值为 0 来表示读到末尾了。因此,为了正确实现,你需要更新并使用读函数中接收的偏移参数,并在用户达到缓冲区末尾时返回 0。
701701

@@ -721,7 +721,7 @@ ioctl
721721
echo "arpeggio"> /dev/so2_cdev
722722
cat /dev/so2_cdev
723723
724-
请阅读 `读和写`_ 小节和 `访问进程地址空间`_ 小节。
724+
请阅读 `读取和写入`_ 小节和 `访问进程地址空间`_ 小节。
725725
726726
7. ioctl 操作
727727
-------------

_sources/labs/filesystems_part1.rst.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,7 @@ minfs
653653
3. 创建和销毁 minfs 索引节点
654654
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
655655

656-
挂载操作中,我们需要初始化根索引节点,并且为了获得根索引节点,我们需要实现与索引节点相关的函数。也就是说,你需要实现 ``minfs_alloc_inode`` 和 ``minfs_destroy_inode`` 函数。按照标有 ``TODO 3`` 的指示进行操作。你可以将 :c:func:`minix_alloc_inode``:c:func:`minix_destroy_inode` 函数作为参考。
656+
挂载操作中,我们需要初始化根索引节点,并且为了获得根索引节点,我们需要实现与索引节点相关的函数。也就是说,你需要实现 ``minfs_alloc_inode`` 和 ``minfs_destroy_inode`` 函数。按照标有 ``TODO 3`` 的指示进行操作。你可以将 :c:func:`minix_alloc_inode` 和 :c:func:`minix_destroy_inode` 函数作为参考。
657657

658658
为了实现,请查看 ``minfs.h`` 头文件中的宏和结构。
659659

_sources/labs/infrastructure.rst.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
为了帮助学习,我们每个主题都有一个实践练习部分,其中包含详细的、逐步的提示,以解决一个或多个任务。为了便于专注于特定问题,大多数任务将在现有的骨架(skeleton)驱动程序上执行。每个骨架驱动程序都有清晰标记的部分,需要填写之以完成任务。
55

6-
骨架驱动程序是从位于 tools/labs/templates 目录中的完整源代码示例生成的。要解决任务,你可以通过在 *tools/labs* 目录下运行**skels**目标来生成骨架驱动程序。为了保持工作空间的干净,建议一次只为一个实验生成骨架,然后在开始新的实验之前清理工作空间。你可以使用**LABS**变量来选择实验:
6+
骨架驱动程序是从位于 tools/labs/templates 目录中的完整源代码示例生成的。要解决任务,你可以通过在 *tools/labs* 目录下运行 **skels** 目标来生成骨架驱动程序。为了保持工作空间的干净,建议一次只为一个实验生成骨架,然后在开始新的实验之前清理工作空间。你可以使用 **LABS** 变量来选择实验:
77

88
.. code-block:: shell
99
@@ -24,7 +24,7 @@
2424
6-cmd-mod 8-kprobes
2525
2626
27-
对于每个任务,你可能需要执行多个步骤,这通常是逐步进行的。这些步骤在源代码中以及实验练习中都用关键字*TODO*标记。如果我们有多个步骤要执行,它们将以数字作为前缀,例如 *TODO1* *TODO2* 等。如果没有使用数字,则是只有一个步骤。如果你想从某个特定步骤开始执行任务,可以使用 **TODO** 变量。以下示例将生成解决了第一个 *TODO* 步骤的骨架:
27+
对于每个任务,你可能需要执行多个步骤,这通常是逐步进行的。这些步骤在源代码中以及实验练习中都用关键字 *TODO* 标记。如果我们有多个步骤要执行,它们将以数字作为前缀,例如 *TODO1*, *TODO2* 等。如果没有使用数字,则是只有一个步骤。如果你想从某个特定步骤开始执行任务,可以使用 **TODO** 变量。以下示例将生成解决了第一个 *TODO* 步骤的骨架:
2828

2929
.. code-block:: shell
3030

_sources/labs/introduction.rst.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ Cscope 也可以作为独立工具使用,但与编辑器结合使用时更加
112112
set cscopequickfix=s-,c-,d-,i-,t-,e-,g-
113113
endif
114114
115-
脚本在当前目录或父目录中搜索名为 :file:`cscope.out` 的文件。如果 :command:`vim` 找到该文件,你可以使用快捷键 :code:`Ctrl + ]` 或 :code:`Ctrl+\ g`按下 control-\\ 然后按 g直接跳转到光标所在单词的定义(函数、变量、结构等)。类似地,你可以使用 :code:`Ctrl+\ s` 前往光标所在单词的使用位置。
115+
脚本在当前目录或父目录中搜索名为 :file:`cscope.out` 的文件。如果 :command:`vim` 找到该文件,你可以使用快捷键 :code:`Ctrl + ]` 或 :code:`Ctrl+\ g` (按下 control-\\ 然后按 g) 直接跳转到光标所在单词的定义(函数、变量、结构等)。类似地,你可以使用 :code:`Ctrl+\ s` 前往光标所在单词的使用位置。
116116

117117
你可以从以下网址获取一个启用了 cscope 的 :file:`.vimrc` 文件(还包含其他好用的东西):https://github.com/ddvlad/cfg/blob/master/\_vimrc。以下指南基于该文件,同时也展示了具有相同效果的基本 :command:`vim` 命令。
118118

@@ -367,7 +367,7 @@ Linux 内核的主要优势是可以访问源代码和其开放式开发系统
367367
- 你可以在 :ref:`vm_link` 找到有关虚拟机的更多详细信息。
368368
369369
.. important::
370-
在解决练习之前**仔细**阅读所有要点。
370+
在解决练习之前, **仔细** 阅读所有要点。
371371
372372
..
373373
_[SECTION-EXERCISES-REMARKS-END]

_sources/labs/kernel_modules.rst.txt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@
103103
obj-m = modul.o
104104
105105
106-
正如你所见,在示例中调用 :command:`make` 命令对 :file:`Makefile` 文件进行编译将导致在内核源代码目录``/lib/modules/`uname -r`/build``中调用 :command:`make` 并引用当前目录``M = `pwd``。该过程最终会读取当前目录中的 :file:`Kbuild` 文件,并按照该文件中的指示编译模块。
106+
正如你所见,在示例中调用 :command:`make` 命令对 :file:`Makefile` 文件进行编译将导致在内核源代码目录 (``/lib/modules/`uname -r`/build``) 中调用 :command:`make` 并引用当前目录 (``M = `pwd``)。该过程最终会读取当前目录中的 :file:`Kbuild` 文件,并按照该文件中的指示编译模块。
107107

108108
.. note:: 对于实验,我们将根据虚拟机的规格配置不同的 :command:`KDIR`:
109109

@@ -469,12 +469,12 @@ addr2line
469469
faust:~/lab-01/modul-oops# addr2line -e oops.o 0x5
470470
/root/lab-01/modul-oops/oops.c:23
471471
472-
其中``0x5``是生成 oops 的程序计数器的值(``EIP = c89d4005``),减去根据 :file:`/proc/modules` 的信息得出的模块的基地址(``0xc89d4000``
472+
其中 ``0x5`` 是生成 oops 的程序计数器的值(``EIP = c89d4005``),减去根据 :file:`/proc/modules` 的信息得出的模块的基地址(``0xc89d4000``)。
473473
474474
minicom
475475
-------
476476
477-
:command:`Minicom`或其他等效程序,例如 :command:`picocom` 以及 :command:`screen`是一种用于与串行端口(serial port)连接和交互的程序。串行端口是在开发阶段分析内核消息(kernel message)或与嵌入式系统进行交互的基本方法。有两种常见的连接方式:
477+
:command:`Minicom` (或其他等效程序,例如 :command:`picocom` 以及 :command:`screen`) 是一种用于与串行端口(serial port)连接和交互的程序。串行端口是在开发阶段分析内核消息(kernel message)或与嵌入式系统进行交互的基本方法。有两种常见的连接方式:
478478
479479
* 使用串行端口,设备路径为 :file:`/dev/ttyS0`
480480
@@ -517,7 +517,7 @@ netconsole
517517
518518
alice:~# modprobe netconsole netconsole=6666@192.168.191.130/eth0,6000@192.168.191.1/00:50:56:c0:00:08
519519
520-
因此,在具有地址 ``192.168.191.130`` 的站点上,调试消息将被发送到 ``eth0`` 接口,源端口为``6666``。消息将被发送到``192.168.191.1``,使用 MAC 地址``00:50:56:c0:00:08``,至端口``6000``上。
520+
因此,在具有地址 ``192.168.191.130`` 的站点上,调试消息将被发送到 ``eth0`` 接口,源端口为 ``6666``。消息将被发送到 ``192.168.191.1``,使用 MAC 地址 ``00:50:56:c0:00:08``,至端口 ``6000`` 上。
521521
522522
可以在目标站点上使用 :command:`netcat` 显示消息:
523523
@@ -691,9 +691,9 @@ Dyndbg 选项
691691
KDB:内核调试器
692692
--------------
693693
694-
内核调试器已被证明在开发和调试过程中非常有用。其主要优势之一是可以进行实时调试。这使得我们能够实时监视对内存的访问,甚至在调试过程中修改内存。内核调试器从版本 2.6.26-rc1 开始,已集成到主线内核中。KDB 不是一个*源代码调试器*,但在进行完整分析时,可以与 gdb 和符号文件并行使用——请参见 :ref:`GDB调试部分 <gdb_intro>`
694+
内核调试器已被证明在开发和调试过程中非常有用。其主要优势之一是可以进行实时调试。这使得我们能够实时监视对内存的访问,甚至在调试过程中修改内存。内核调试器从版本 2.6.26-rc1 开始,已集成到主线内核中。KDB 不是一个 *源代码调试器*,但在进行完整分析时,可以与 gdb 和符号文件并行使用——请参见 :ref:`GDB调试部分 <gdb_intro>`
695695
696-
要使用KDB,你有以下选项:
696+
要使用 KDB,你有以下选项:
697697
698698
* 非 USB 键盘 + VGA 文本控制台
699699
* 串口控制台
@@ -705,13 +705,13 @@ KDB:内核调试器
705705
706706
echo hvc0 > /sys/module/kgdboc/parameters/kgdboc
707707
708-
KDB 是一种*停止模式调试器*,这意味着在其活动期间,所有其他进程都将停止。可以使用 `SysRq <http://zh.wikipedia.org/wiki/Magic_SysRq組合鍵>`__ 命令强制内核在执行过程中进入 KDB
708+
KDB 是一种 *停止模式调试器*,这意味着在其活动期间,所有其他进程都将停止。可以使用 `SysRq <http://zh.wikipedia.org/wiki/Magic_SysRq組合鍵>`__ 命令强制内核在执行过程中进入 KDB
709709
710710
.. code-block:: bash
711711
712712
echo g > /proc/sysrq-trigger
713713
714-
或者在连接到串口的终端中使用键盘组合键 ``Ctrl+O g``例如使用 :command:`minicom`
714+
或者在连接到串口的终端中使用键盘组合键 ``Ctrl+O g`` (例如使用 :command:`minicom`)
715715
716716
KDB 具有各种命令来控制和定义被调试系统的上下文:
717717
@@ -842,7 +842,7 @@ KDB 具有各种命令来控制和定义被调试系统的上下文:
842842
843843
生成名为 **3-error-mod** 的任务的框架。编译源代码并得到相应的内核模块。
844844
845-
为什么会出现编译错误**提示**这个模块与前一个模块有什么不同?
845+
为什么会出现编译错误? **提示:** 这个模块与前一个模块有什么不同?
846846
847847
修改该模块以解决这些错误的原因,然后编译和测试该模块。
848848

_sources/labs/kernel_profiling.rst.txt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@ perf
3434
``perf`` 是一个使用跟踪点、kprobes 和 uprobes 来对 CPU 进行插装的工具。该工具允许我们查看在给定点调用了哪些函数。这使我们能够了解内核在哪里花费了最多的时间,打印函数的调用栈,以及记录 CPU 正在运行的内容。
3535

3636
``perf`` 集成了以下模块:
37-
* 静态跟踪
38-
* 动态跟踪
39-
* 资源监控
37+
38+
* 静态跟踪
39+
* 动态跟踪
40+
* 资源监控
4041

4142
perf 提供的跟踪接口可以通过 ``perf`` 命令及其子命令来使用。
4243

@@ -94,7 +95,7 @@ ps
9495
9596
``ps`` 是 Linux 上的工具,我们借此可以监视机器在给定时间运行的进程,包括内核线程。这个工具简单易用,可以一目了然地查看 CPU 上正在运行的进程以及它们的 CPU 和内存使用情况。
9697
97-
为了列出所有正在运行的进程,我们使用 ``ps aux``命令,就像下面这样:
98+
为了列出所有正在运行的进程,我们使用 ``ps aux`` 命令,就像下面这样:
9899
99100
.. code-block:: c
100101
@@ -163,7 +164,7 @@ top
163164
164165
.. warning::
165166
166-
运行 ``perf`` 时,请确保运行的是下载的版本,而不是``PATH``变量中的版本。
167+
运行 ``perf`` 时,请确保运行的是下载的版本,而不是 ``PATH`` 变量中的版本。
167168
168169
.. note::
169170
@@ -198,7 +199,7 @@ top
198199
199200
我们将运行 ``0-demo`` 目录的 ``io-app`` 应用程序。
200201
201-
为了检查运行在 CPU 上的内容,并查看进程的堆栈,我们可以使用 ``perf record``子命令,就像下面这样:
202+
为了检查运行在 CPU 上的内容,并查看进程的堆栈,我们可以使用 ``perf record`` 子命令,就像下面这样:
202203
203204
.. code-block:: bash
204205

_sources/labs/memory_mapping.rst.txt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ mmap 系统调用有以下参数:
129129
130130
int (*mmap)(struct file *filp, struct vm_area_struct *vma);
131131
132-
*filp* 字段是一个指针,指向在用户空间打开设备时创建的 :c:type:`struct file`。 *vma* 字段用于指示设备应该将内存映射到哪一个虚拟地址空间。驱动程序应该分配内存 (使用 :c:func:`kmalloc`, :c:func:`vmalloc` 或者 :c:func:`alloc_pages`), 然后使用辅助函数(如:c:func:`remap_pfn_range`根据 *vma* 参数将其映射到用户地址空间。
132+
*filp* 字段是一个指针,指向在用户空间打开设备时创建的 :c:type:`struct file`。 *vma* 字段用于指示设备应该将内存映射到哪一个虚拟地址空间。驱动程序应该分配内存 (使用 :c:func:`kmalloc`, :c:func:`vmalloc` 或者 :c:func:`alloc_pages`), 然后使用辅助函数 (如 :c:func:`remap_pfn_range`) 根据 *vma* 参数将其映射到用户地址空间。
133133

134134
:c:func:`remap_pfn_range` 将连续的物理地址空间映射到由 :c:type:`vm_area_struct` 表示的虚拟空间:
135135

@@ -289,9 +289,10 @@ mmap 系统调用有以下参数:
289289

290290
.. attention:: vmalloc 页面不是物理连续的,因此需要为每个页面单独使用 :c:func:`remap_pfn_range`。
291291

292-
遍历所有虚拟页面,并对于每个页面:
293-
* 确定物理地址
294-
* 使用 :c:func:`remap_pfn_range` 进行映射
292+
遍历所有虚拟页面,并对于每个页面:
293+
294+
* 确定物理地址
295+
* 使用 :c:func:`remap_pfn_range` 进行映射
295296

296297
确保每次都确定物理地址,并且只映射一个页面。
297298

0 commit comments

Comments
 (0)