=========================
作业 0——内核 API
=========================

.. meta::
   :description: 介绍了课程作业 0,要求学生实现一个内核模块来操作内核链表 API。文档包括作业目标、实现要求、测试和提交说明、以及一些编程资源和技巧。
   :keywords: 内核模块, 内核 API, 链表, procfs, 静态分析

-  截止日期: :command:`周一,2024 年 3 月 25 日,23:59`

作业目标
=======================

*  熟悉 qemu 的设置
*  加载/卸载内核模块
*  熟悉内核中实现的列表 API
*  玩得开心 :)

说明
=========

编写名为 `list` 的内核模块(生成的文件必须命名为 `list.ko`),该模块在内部列表中存储数据(字符串)。

必须使用内核中实现的 `列表 API <https://github.com/torvalds/linux/blob/master/include/linux/list.h>`__。有关详细信息,请参阅 `实验 2 </so2/lab2-kernel-api.html>`__。

该模块向 procfs 导出名为 :command:`list` 的目录。该目录包含两个文件:

-   :command:`management`:只能写入;用于向内核模块传输命令的接口
-   :command:`preview`:只读;用于查看内核列表的内部内容的接口。

`代码骨架 <https://github.com/linux-kernel-labs/linux/blob/master/tools/labs/templates/assignments/0-list/list.c>`__ 实现了这两个 procfs 文件。你需要创建一个列表,并实现对数据的 `添加` 和 `读取` 支持。请按照代码中的 TODO 进行操作。

要与内核列表进行交互,你必须在 `/proc/list/management` 文件中编写命令(使用 `echo` 命令):

- `addf name`:将 `name` 元素添加到列表的顶部
- `adde name`:将 `name` 元素添加到列表的末尾
- `delf name`:删除列表中第一个 `name` 项
- `dela name`:删除列表中所有的 `name` 元素

要想查看列表内容,可以查看 `/proc/list/preview` 文件的内容(使用 `cat` 命令)。格式为每行一个元素。

测试
=======

为了简化作业评估过程,同时也为了减少提交作业时的错误,作业评估将通过一个名为 `_checker` 的 `测试脚本 <https://github.com/linux-kernel-labs/linux/blob/master/tools/labs/templates/assignments/0-list/checker/_checker>`__ 自动进行。测试脚本假定内核模块名为 `list.ko`。

快速开始
==========

你必须从 `list.c <https://gitlab.cs.pub.ro/so2/0-list/-/blob/master/src/list.c>`__ 文件中找到的代码骨架开始实现作业。你应该按照 `任务仓库 <https://gitlab.cs.pub.ro/so2/0-list>`__ 的 `README.md 文件 <https://gitlab.cs.pub.ro/so2/0-list/-/blob/master/README.md>`__ 中的说明进行操作。

提示
----

要想增加获得最高分的机会,请阅读并遵循 Linux 内核编码风格,该风格在 `代码风格文档 <https://elixir.bootlin.com/linux/v4.19.19/source/Documentation/process/coding-style.rst>`__ 中有描述。

此外,使用以下静态分析工具来验证代码:

- checkpatch.pl

.. code-block:: console

   $ linux/scripts/checkpatch.pl --no-tree --terse -f /path/to/your/list.c

- sparse

.. code-block:: console

   $ sudo apt-get install sparse
   $ cd linux
   $ make C=2 /path/to/your/list.c

- cppcheck

.. code-block:: console

   $ sudo apt-get install cppcheck
   $ cppcheck /path/to/your/list.c

扣分项
---------

有关作业扣分项的信息可以在 `基本说明页面 <https://ocw.cs.pub.ro/courses/so2/teme/general>`__ 中找到。

在特殊情况下(作业通过测试,但不符合要求)以及如果作业未通过所有测试,成绩可能会降低更多。

提交作业
------------------------

使用 `vmchecker-next <https://github.com/systems-cs-pub-ro/vmchecker-next/wiki/Student-Handbook>`__ 基础设施自动对作业进行评分。提交将在 moodle 上的 `课程页面 <https://curs.upb.ro/2022/course/view.php?id=5121>`__ 上与相关作业相关联。你可以在 `仓库 <https://gitlab.cs.pub.ro/so2/0-list/-/blob/master>`__ 的 `README.md 文件 <https://gitlab.cs.pub.ro/so2/0-list/-/blob/master/README.md>`__ 中找到提交详细信息。

资源
=========

我们建议你使用 gitlab 存储作业。请按照 `README.md 文件 <https://gitlab.cs.pub.ro/so2/0-list/-/blob/master/README.md>`__ 中的说明进行操作。

问题
=========

如果你有相关的问题,你可以查阅邮件 `列表存档 <http://cursuri.cs.pub.ro/pipermail/so2/>`__,或在专用的 Teams 频道上提出问题。