偶然地偶然发现了内核丛林中的一些代码,并感到有些困惑。 kzalloc()有两种实现:在tools/virtio/linux/kernel.h中和在linux/slab.h中的主要实现。显然,在大多数情况下,使用第二个。但是有时会使用“virtio” kzalloc()

“virtio” kzalloc()看起来像这样:

static inline void *kzalloc(size_t s, gfp_t gfp)
{
    void *p = kmalloc(s, gfp);

    memset(p, 0, s);
    return p;
}

我的困惑是,在“工具”目录中使用的“假” kmalloc()可以返回NULL指针。而且看起来memset()实现不检查NULL指针,因此可能存在NULL指针取消引用。
是一个错误还是我错过了什么?

最佳答案

是的,那肯定看起来像是个错误。
tools/子目录是用户空间工具的集合(顾名思义)。您还可以通过包含几个C标准库 header 的事实来看到这一点。因此,这当然不是内核错误(那将是非常糟糕的),只是对virtio测试工具的一个较小的疏忽。

virtio测试工具似乎重新定义了一些内核API,以模拟它们在用户空间中的行为。该功能虽然似乎从未在实践中使用过,但仅定义了即可。

marco:~/git/linux/tools/virtio$ grep -r kzalloc
linux/kernel.h:static inline void *kzalloc(size_t s, gfp_t gfp)
ringtest/ptr_ring.c:static inline void *kzalloc(unsigned size, gfp_t flags)
marco:~/git/linux/tools/virtio$

它可能打算由希望在用户空间中测试一些virtio内核代码的人使用。

无论如何,您都可以尝试reporting the bugget_mantainer.pl脚本建议:

$ perl scripts/get_maintainer.pl -f tools/virtio/linux/kernel.h
Bad divisor in main::vcs_assign: 0
"Michael S. Tsirkin" <[email protected]> (maintainer:VIRTIO CORE AND NET DRIVERS)
Jason Wang <[email protected]> (maintainer:VIRTIO CORE AND NET DRIVERS)
[email protected] (open list:VIRTIO CORE AND NET DRIVERS)
[email protected] (open list)

10-07 16:38