概述
最近有个项目需要做内核裁剪,我之前也没做过,为了更了解内核和硬件,把相应的知识记录一下
内核的配置使用menuconfig,界面如下:
我们将针对每个选项,解释选项的含义,以及说明是否推荐使用(在什么情况下使用
General setup(通用设置
- Cross-compiler tool prefix – 交叉编译工具前缀,如果你要使用交叉编译工具的话输入相关前缀。默认不使用。嵌入式linux不需要。
- Compile also drivers which will not load – 在其他平台编译以便测试驱动程序编译流程,通常不需要
- Local version - append to kernel release – 在内核版本后面加上自定义的版本字符串,默认不选择
- Automatically append version information to the version string – 自动增加版本信息到版本字符串,默认不选择
- Support for paging of anonymous memory – 内核支持虚拟内存,即是交换分区(swap),嵌入式Linux不需要
- System V IPC – 一种进程间通信规范,定义了消息对流,信号量,共享内存,需要勾选
- Enable process_vm_readv/writev syscalls – 使能这两个系统调用,这些调用允许具有正确权限的进程直接读取或写入另一个进程的地址空间。现在它们只用于openMPI快速进程通信,也可以用于调试程序.未来也许还会有其他用途。看情况勾选。
- open by fhandle syscalls – 是否允许使用文件handle替代文件名来进行文件操作,默认勾选。
- uselib syscall – 启用老旧的uselib()系统接口支持,仅在你需要使用基于libc5的古董级程序时才需要,推荐不选择。
- IRQ subsystem —> 中断请求子系统
- Expose hardware/virtual IRQ mapping via debugfs – 通过debugfs中的irq_domain_mapping文件向用户显示硬件IRQ号/Linux IRQ号之间的对应关系.仅用于开发调试.推荐不选择。
- Expose irq internals in debugfs – 通过debugfs公开内部状态信息。 主要用于开发人员和调试难以诊断的中断问题。推荐不选择。 - Timers subsystem —> 时钟子系统
- Timer tick handling (Idle dynticks system (tickless idle)) —> 内核时钟滴答处理程序,更多信息可以参考内核源码树下的"Documentation/timers/NO_HZ.txt"文件
1. Periodic timer ticks (constant rate, no dynticks)无论CPU是否需要,都强制按照固定频率不断触发时钟中断.这是最耗电的方式,不推荐使用
2. Idle dynticks system (tickless idle) CPU在空闲状态时不产生不必要的时钟中断,以使处理器能够在较低能耗状态下运行以节约电力,适合于大多数场合
3. Full dynticks system (tickless) 即使CPU在忙碌状态也尽可能关闭所有时钟中断,适用于CPU在同一时间仅运行一个任务,或者用户空间程序极少与内核交互的场合.即使开启此选项,也需要额外设置"nohz_full=?"内核命令行参数才能真正生效.
- Old Idle dynticks config 为了兼容以前的配置文件而存在的,不需要选中。
- High Resolution Timer Support 支持高精度时钟,需要选中 - CPU/Task time and stats accounting —> CPU/进程的时间及状态统计
- Cputime accounting —>
1. Simple tick based cputime accountin 简单的基于滴答的统计,适用于大多数场合
2. Full dynticks CPU time accounting 利用上下文跟踪子系统,通过观察每一个内核与用户空间的边界进行统计.该选项对性能有显著的不良影响,目前仅用于完全无滴答子系统(CONFIG_NO_HZ_FULL)的调试
- Fine granularity task level IRQ time accounting – 通过读取TSC时间戳进行统计,这是统计进程IRQ时间的更细粒度的统计方式,但对性能有些不良影响(特别是在RDTSC指令速度较慢的CPU上).不需要选中。
- BSD Process Accounting – 用户空间程序可以要求内核将进程的统计信息写入一个指定的文件,主要包括进程的创建时间/创建者/内存占用等信息. 不需要选中。
- BSD Process Accounting version 3 file format – 使用新的v3版文件格式,可以包含每个进程的PID和其父进程的PID,但是不兼容老版本的文件格式.不需要选中。 - RCU Subsystem —> 非对称读写锁系统 是一种新的kernel锁机制,适用于读多写少环境。不做专家级别调整。
- Kernel .config support – 这个选项允许.config文件(即编译LINUX时的配置文件)保存在内核当中。它提供正在运行中的或者还在硬盘中的内核的相关配置选项。可以通过内核 镜像文件 kernel image file 用命令 script scripts/extract-ikconfig 来提取出来,作为当前内核重编译或者另一个内核编译的参考。如果你的内核在运行中,可以通过/proc/config.gz文件来读取。下一个选项提供这 项支持。这个功能在pc中比较实用,在嵌入式上不需要。不选。
- Memory placement aware NUMA scheduler – 允许自动根据NUMA系统的节点分布状况进行进程/内存均衡(方法很原始,就是简单的内存移动).这个选项对UMA系统无效。简单的嵌入式Linux不需要勾选。
- Control Group support —> 默认设置即可
- Checkpoint/restore support 在内核中添加"检查点/恢复"支持.也就是添加一些辅助的代码用于设置进程的 text, data, heap 段,并且在 /proc 文件系统中添加一些额外的条目.主要用于调试目的。不需要勾选。
- Namespaces support —> 命名空间支持,每个进程有自己的命名空间,防止名称重复。需要勾选。
- Automatic process group scheduling – 自动进程组的调度。需要勾选。
- Enable deprecated sysfs features to support old userspace tools – 使能废弃的sysfs特性来支持老的用户空间工具。不选。
- Kernel->user space relay support (formerly relayfs) – 在某些文件系统上(比如debugfs)提供从内核空间向用户空间传递大量数据的接口 。保持默认状态。
- Initial RAM filesystem and RAM disk (initramfs/initrd) support – 初始 RAM 文件系统是一个 ramfs,它由引导加载程序(loadlin 或 lilo)加载,并在正常引导过程之前以 root 身份安装。 它通常用于加载挂载“真实”根文件系统等所需的模块。有关详细信息,请参见 <file:Documentation/admin-guide/initrd.rst>。 如果还包括 RAM 磁盘支持 (BLK_DEV_RAM),这也会启用初始 RAM 磁盘 (initrd) 支持并将 15 KB(在某些其他体系结构上更多)添加到内核大小。不确定就勾选
- Initramfs source file(s) – 这可以是带有 .cpio 后缀的单个 cpio 存档,也可以是用于构建 initramfs 映像的以空格分隔的目录和文件列表。 cpio 存档应包含用作 initramfs 映像的文件系统存档。 目录应包含要包含在 initramfs 映像中的文件系统布局。 文件应包含符合内核树中“usr/gen_init_cpio”程序描述的格式的条目。 当指定多个目录和文件时,initramfs 映像将是所有目录和文件的集合。
- ***Configure standard kernel features (expert users) —>***保持默认
- Enable bpf() system call – 开启内核的bpf()系统调用支持(从3.15版本开始引入),以支持eBPF功能.可用于内核调试与网络包过滤。勾选。
- Use full shmem filesystem – 启用shmem支持.shmem是基于共享内存的文件系统(可能用到swap),在启用TMPFS后可以挂载为tmpfs供用户空间使用,它比简单的ramfs先进许多。
- Enable AIO support – 支持AIO(Asynchronous I/O 异步事件非阻塞I/O),(包含aio.h, aio_read,向内核发出读命令,aio_write向内核写命令,详细见‘AIO介绍‘文档),AIO机制为服务器端高并发应用程序提供了一种性能优化的手段。加大了系统吞吐量,所以一般用于大型服务器,一般不用选。
- Enable madvise/fadvise syscalls – 开启内核的madvise()/fadvise()系统调用支持(2.6.16版本开始引入).以允许应用程序预先提示内核,它将如何使用特定的内存与文件.这种措施有助于提升应用程序的性能.建议选”Y”.
- Enable userfaultfd() system call – 开启内核的userfaultfd()系统调用支持(从4.3版本开始引入).Userfaults 允许从用户态实现按需分页,更一般地说,它们允许用户态控制各种内存页面错误,否则只有内核代码才能做到。
- Enable PCI quirk workarounds – 这为各种 PCI 芯片组错误/ 怪癖提供了解决方法。 仅当您的目标机器不受 PCI 怪癖影响时才禁用此功能。
- Enable membarrier() system call – 开启内核的membarrier()系统调用支持(与Memory Barrier相关).有助于提升多CPU场景下的并行计算性能.建议选"Y".
- Embedded system – 嵌入式系统,一些专业的选项会出现。
- PC/104 support – 公开 PC/104 外形设备驱动程序和可供选择和配置的选项。 如果您的目标机器有 PC/104 总线,请启用此选项。
- Kernel Performance Events And Counters —> – 不确定就勾选。
- Enable VM event counters for /proc/vmstat – 允许在/proc/vmstat中包含虚拟内存事件记数器。
- Enable SLUB debugging support – SLUB 具有广泛的调试支持功能。 禁用这些可以显着节省代码大小。 这也会禁用 SLUB sysfs 支持。 /sys/slab 将不存在,也不支持缓存验证等。
- Enable memcg SLUB sysfs support by default – SLUB 在 /sys/kernel/slab 下为每个分配缓存创建一个目录来托管信息和调试文件。 如果启用了 memory cgroup,则每个缓存可以具有每个内存 cgroup 缓存。 SLUB 可以在 /sys/kernel/slab/CACHE/cgroup 下为这些缓存创建相同的 sysfs 目录,但这会导致创建大量调试文件。 这由 slub_memcg_sysfs 引导参数控制,此配置选项确定参数的默认值。
- Disable heap randomization – 禁用随机heap,不勾选
- Allow slab caches to be merged – 为了减少内核内存碎片,slab 缓存可以在拥有相同大小和其他特性时合并。 这带来了内核堆溢出能够覆盖合并缓存中对象的风险(并且更容易控制缓存布局),这使得攻击者更容易利用此类堆攻击。 通过保持缓存未合并,这些类型的漏洞通常只能损坏同一缓存中的对象。 要在运行时禁用合并,可以在内核命令行上传递“slab_nomerge”。
- SLAB freelist randomization – 随机化创建新页面时使用的空闲列表顺序。 此安全功能降低了内核slab分配器对堆溢出的可预测性。
- Harden slab freelist metadata – 许多内核堆攻击试图针对slab缓存元数据和其他基础设施。 此选项会牺牲较小的性能以加强内核slab分配器以抵抗常见的空闲列表利用方法。
- SLUB per cpu partial cache – 每个 cpu 部分缓存加速了处理器本地的对象分配和释放,但代价是空闲延迟的不确定性更大。 溢出时,这些缓存将被清除,这需要获取可能导致延迟峰值的锁。 通常,对于实时系统,人们会选择“否”。
- Profiling support – 扩展的分析支持机制
- Kprobes – kprobes调试技术是内核开发者们专门为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术。利用kprobes技术,内核开发人员可以在内核的绝大多数指定函数中动态的插入探测点来收集所需的调试状态信息而基本不影响内核原有的执行流程。
- Optimize very unlikely/likely branches – 对极不可能、非常可能分支的优化
- Stack Protector buffer overflow detection – 此选项打开“堆栈保护器”GCC 功能。 此功能在函数的开头将 Canary 值放在堆栈中返回地址之前的值,并在实际返回之前验证该值。 基于堆栈的缓冲区溢出(需要覆盖此返回地址)现在也会覆盖金丝雀,它会被检测到,然后通过内核恐慌消除攻击。
- Use a virtually-mapped stack – 如果您希望使用带有保护页的虚拟映射内核堆栈,请启用此选项。 这会导致内核堆栈溢出立即被捕获,而不是导致难以诊断的损坏。 这目前与 KASAN 不兼容,因为如果堆栈在 vmalloc 空间中,则 KASAN 期望堆栈使用不正确的公式直接映射到 KASAN 阴影贴图。
- Perform full reference count validation at the expense of speed – 启用此功能会将引用计数基础结构从快速的未经检查的 atomic_t 实现切换到完全经过状态检查的实现,这可能会(稍微)慢一些,但提供了针对可用于安全漏洞利用的各种释放后使用条件的保护。
- GCOV-based kernel profiling – 不确定就不勾选
最后
以上就是诚心飞鸟为你收集整理的Linux 内核配置(一)General setup(通用设置的全部内容,希望文章能够帮你解决Linux 内核配置(一)General setup(通用设置所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复