我正在使用 ubuntu 12.04。如果我为设备驱动程序构建单片内核,即驱动程序将拥有自己的内核,这真的会提高系统性能和设备性能吗?有什么缺点吗?
答案1
一个迂腐的注释:“单片内核”意味着完全不同的东西。Linux 内核始终是单片的,无论其部分或全部模块是作为 LKM 构建的还是直接编译到内核中。
http://tldp.org/HOWTO/Module-HOWTO/x73.html#AEN77
当 LKM 被加载到内核中时,与内置模块相比,性能上没有任何差别,因为 LKM 代码与内核的其余部分在同一进程中运行,不存在任何进程间通信或任何其他内容。
顺便说一句,LKM 并不比基本内核模块慢。调用任何一个都只是简单地跳转到它所在的内存位置。
但是,LKM 可以根据请求加载,因此如果您采用标准的 Ubuntu 内核并使用所有内置模块重新编译它,那么您将得到一个巨大的内核,它可能会降低系统速度,因为所有那些未使用的模块使用了更多的 RAM(也可能导致各种冲突)。
另一方面,如果你编译一个内核,根据您的特定机器量身定制并且只内置了实际机器硬件的模块,这样的内核可能会比标准内核更快,特别是在启动时。我一直在玩在 Arch Linux 上为我的 EeePC 定制内核并且可以报告它实际上明显更快:
内核可以做得非常小,只包括您的机器实际使用的功能。整个
kernel-eeepc
内核只有 4Mb,这使得从磁盘加载的速度更快,加载时占用的 RAM 更少,从而为用户空间程序留出更多内存。无需加载模块意味着启动期间的磁盘 I/O 更少。
内置硬件驱动程序意味着在启动期间无需进行硬件探测,从而节省了时间。
内置硬件驱动程序无需在初始 ramdisk 中安装,因此内核可以直接由 GRUB 加载。
您可以禁用不需要的其他内核功能,这再次缩小了内核大小并使其运行得更快。
但缺点是:
自动内核升级变得毫无用处,你必须从源代码构建新内核
如果机器死机了,您将磁盘插入另一台计算机,机器可能无法启动。
总而言之,这是一项有趣且有教育意义的练习,但我不会考虑在硬件限制不太严格的机器上进行这项练习。
答案2
目前我看到的唯一优势是能够禁用模块加载(因此即使有人获得 root/超级用户访问权限,他们也无法加载“坏”模块)。
话虽如此,过去通过禁用未使用的驱动程序并编译可加载模块,性能会略有提升。随着硬件性能的提高,这些微小的改进变得越来越微不足道。
答案3
我想在这里插话。几年前我只做过单片内核,但如今的内核相当先进,使用了很多功能。据我所知,它不会让你 100% 满意。不过我可能错了。
据我所知,内核将有效地卸载模块,从而为您的系统提供更多内存和资源。对我来说,我只在不重要的情况下才将东西模块化。例如,USB 设备将是一个模块,但我的 EXT4 已全部编译进去。所有与网络相关的内容也是如此。此外,我在删除了所有可以删除的内容后才编译内核,并使用了一些其他方法
首先,安装所有硬件。它可能是 USB 设备,例如 iPod 或闪存驱动器。然后运行以下命令:
进行本地修改配置
这将修改 .config 以包含所有检测到的硬件并将其勾选为 M。
制作 xconfig
Xconfig 将为您提供删除内容的菜单,但要小心。我使内核具有较低的桌面延迟,并专门添加了对我的硬件的支持。
最后,如果 GCC 是最新的并且您使用以下命令,则可以使用 CPU 的附加功能:
CONCURRENCY_LEVEL= getconf _NPROCESSORS_ONLN
CFLAGS="-march=bdver1 -mtune=bdver1" CXXFLAGS="${CFLAGS}" make-kpkg --initrd --append-to-version=-MyKernelVersionNameHere kernel_image kernel_headers
这将启动内核构建过程,使用所有可用的 CPU 来构建它,另外还特别支持 AMD Zambezi CPU。更改“bdver1”以匹配您的特定 CPU,并更改 MyKernelVersionNameHere 以符合您自己的内核命名约定。
最后它是否更快?我认为是的。我重新编译了内核、GCC、WINE,在 Linux 上玩大多数 Windows PC 游戏比在 Windows 上玩得更好。