Linux kernel 这个内核函数是否更具可读性?(学术研究所需的想法!)

Linux kernel 这个内核函数是否更具可读性?(学术研究所需的想法!),linux-kernel,switch-statement,mcc,Linux Kernel,Switch Statement,Mcc,关于超长函数背后的基本原理,我想提出一个关于我正在为我的研究而学习的函数的具体问题。这是一个来自Linux内核的函数,它相当长(412行)和复杂(133行)。基本上,它是一个长的嵌套switch语句 坦率地说,我想不出任何办法来改善这种混乱局面。分派表看起来既庞大又低效,任何子例程调用都需要大量参数才能覆盖足够大的代码段 您认为有什么方法可以在不损失效率的情况下以更可读的方式重写此函数吗?如果没有,代码对您来说是否可读 不用说,我的研究中出现的任何答案都会得到充分的认可——无论是在这里还是在提交

关于超长函数背后的基本原理,我想提出一个关于我正在为我的研究而学习的函数的具体问题。这是一个来自Linux内核的函数,它相当长(412行)和复杂(133行)。基本上,它是一个长的嵌套switch语句

坦率地说,我想不出任何办法来改善这种混乱局面。分派表看起来既庞大又低效,任何子例程调用都需要大量参数才能覆盖足够大的代码段

您认为有什么方法可以在不损失效率的情况下以更可读的方式重写此函数吗?如果没有,代码对您来说是否可读

不用说,我的研究中出现的任何答案都会得到充分的认可——无论是在这里还是在提交的论文中


我不太了解内核,也不知道如何重新分解它们

我想到的主要事情是使用switch语句,并将每个子步骤分解为一个单独的函数,该函数的名称描述了该部分正在执行的操作。基本上,更具描述性的名称

但是,我认为这不会再优化函数。它只是把它分解成更小的函数,这些函数可能会有帮助。。。我不知道


这是我的2美分。

我不认为这个函数太乱了。我以前写过这么乱七八糟的东西

该功能是将微处理器制造商的表转换为代码。它是非常低级的东西,为特定的中断或错误原因复制适当的硬件寄存器。在这种代码中,您通常无法触摸硬件未填写的寄存器,这可能会导致总线错误。这可以防止使用更通用的代码(如复制所有寄存器)

我确实看到了一些代码重复。然而,在此级别(在中断级别操作),速度更为重要。除非我知道提取的方法是内联的,否则我不会在公共代码上使用提取方法


顺便说一句,当您在那里(内核)时,请确保捕获此代码的更改历史记录。我怀疑你会发现这里没有太多的变化,因为它与硬件有关。这类代码随时间变化的性质与大多数用户模式代码所经历的变化性质完全不同


例如,当一个新的整合IO芯片实现时,这种情况将会改变。在这种情况下,更改可能是复制粘贴并更改新副本,而不是修改现有代码以适应更改的寄存器。

我首先为各种类定义常量。进入这个代码冷,这是一个谜,切换是为了什么;如果切换是针对命名常量的,我就有了一个起点


更新:您可以去掉大约70行,其中案例返回MARGY_0C_EXCP;简单地让他们完成日常工作直到结束。由于这是内核代码,我要提到的是,这可能会有一些性能问题,特别是在案例顺序已经优化的情况下,但这至少会减少您需要处理的代码量。

这里有一种规律性,我怀疑对于领域专家来说,这实际上感觉非常连贯

此外,近距离的变化允许立即进行目视检查


我认为没有必要重构这段代码

绝对可怕,伊姆霍。一个显而易见的首要解决办法是使交换机中的每种情况都成为对函数的调用。在任何人开始抱怨效率之前,让我说一个词——“内联”


编辑:这段代码可能是Linux FPU仿真器的一部分吗?如果是这样的话,这是一个非常古老的代码,是一个黑客让linux在没有FPU的386这样的英特尔芯片上工作。如果是的话,这可能不是一个适合学者的研究,除了历史学家

你正在进行非常有趣的研究…这篇文章,以及你在这个主题上发表的任何其他文章,都应该是社区维基,IMHO。我认为内核代码与普通的应用程序代码非常不同。尤其是那些实现了一个定义良好且易于理解的概念的代码,这些概念不需要改变或发展。函数调用开销将是令人望而却步的。这看起来像是中断处理程序的一部分-需要进入和退出。我能想到的唯一缺点是需要传递的参数太多。尼尔:更多的话:这是Linux。它可能需要构建在各种编译器上。除了做研究的人之外,很可能没有人看这段代码。@Udi因为它似乎与FPU有关,所以传递某种FPU结构似乎是合适的。