Chinaunix首页 | 论坛 | 博客
  • 博客访问: 32928
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 71
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-02 21:05
文章分类
文章存档

2014年(5)

我的朋友

分类: LINUX

2014-09-16 16:26:22

针对3.14版本内核

1、ARM架构

1、1 patch physical to virtual translations at runtime
在内核映像启动以及内核模块加载时根据内核本身在内存中的地址,修正物理地址/虚拟地址相互转换函数。只针对非XIP方式运行的内核。

2、general setup
->cross-compiler tool prefix
在内核配置阶段直接指定编译工具链的前缀,配置完成后可以直接调用make;这个选项只针对本内核生效。

->compile also drivers which will not load
在其他平台编译以便测试驱动程序编译流程,通常不需要

->local version - append to kernel release
附加额外的字符串到内核版本信息后面,以及localversion*文件内容后面

->automatically append version information to the version string
查找git标记的版本号信息,附加到localversion*文件内容后面,以及CONFIG_LOCALVERSION设置值的后面。

->kernel compression mode
配置内核映像启动自解压算法,支持GZIP等

->default hostname
配置内核运行系统的主机名字,用户空间可使用sethostname覆盖。

->support for paging of anonymous memory(swap)
是否使用SWAP虚拟内存管理

->system v ipc
IPC是进程间通信的简称,由一套库函数和系统调用组成,用来实现进程间的同步和数据交换。

->posix message queues
消息队列的POSIX版本是IPC的一部分,每一个消息都有对应的优先级,决定了它被进程接收的连续性。POSIX版本的消息队列提供了文件系统访问接口mqueue,可以在需要访问的时候加载。

->open by fhandle syscalls
用户空间程序可以将文件名映射为文件句柄,并在之后使用文件句柄访问文件,即使文件名变更也不影响访问。

->auditing support
使能内核审计框架,该框架可被其他内核子系统使用,比如selinux;主要和权限管理相关。

->irq subsystem
中断子系统,必选的,当然也没有不选的可能

->timer subsystem
    ->timers tick handing
        periodic timer ticks    时钟节拍无论CPU是否空闲,都以恒定速率运行
        idle dynticks system    当CPU处于空闲状态时,时钟节拍只在需要的时候产生中断,以节约电量
    ->old idle dynticks config    为了兼容以前的配置文件而存在的,不需要选中
    ->high resolution timer support    支持高精度定时器

->cpu/task time and stats accouting
    ->cputime accounting
        simple tick based cputime accounting    基于时钟节拍维护用户态、内核态以及空闲状态的时间统计(以jiffies为单位)。
        full dynticks cpu time accounting    使能动态时钟节拍系统上的任务和CPU时间统计;该统计通过观察内核用户态切换上下文的跟踪代码来得到,因此需要带来明细的额外CPU开销。目前除非用来开发工作在动态时钟节拍的内核,否则不应该选择它。
            fine granularity task level irq time accounting    使能任务中断时间统计,这是通过在软中断状态和硬中断状态之间转换时读取时间戳得到,这种方式会带来少量的性能损失。
    ->bsd process accounting
    用户态程序可以通过特殊的系统调用将进程的统计信息写入文件,当进程退出运行时,内核将把该进程的相关信息附加到那个文件。这些信息包括:进程创建时间、进程拥有者、执行的命令名、内存使用情况、连接的控制终端等,完成的列表参考include/linux/acct.h
    ->export task/process statistics throuhg netlink
    通过内核netlink机制将进程的统计信息导出到用户空间,相对于BSD方式,统计信息的获取在整个进程生命周期内都可获取。
        ->enable per-task delay accounting
        以进程为单位收集进程等待CPU、块IO以及页交换等资源的时间统计。
        ->enable extended accounting over taskstats
        收集任务的扩展统计数据到用户态

->rcu subsysyem
    ->rcu implementation
        up-only small-memory-footprint rcu    在不需要实时响应的场合中选择为UP系统设计的RCU实现, 这个选项可以极大的减少内存占用情况.
    ->build-forced no-cbs cpus
    允许在编译时指定no-CBs CPUs(RCU回调函数在内核线程调用而非软中断),另外的no-CBs CPUs可以由启动参数rcu_nocbs指定.

->kernel .config support
将内核顶层目录下的.config配置文件编译到内核映像中,之后可以使用scripts/extract-ikconfig工具从生成的内核映像中提取.config文件;或者内核运行时从/proc/config.gz读取出来。

->control group support 进程分组资源调度
     ->example debug cgroup subsystem
     导出cgroup子系统的调试信息
     ->freezer cgroup subsystem
     允许冻结和解冻一个资源调度组中的所有任务
     ->device control for cgroups
     针对设备提供cgroup执行的白名单,cgroup中的进程可以mknod或者open该设备
     ->cpuset support
     允许创建和管理CPUSETs,允许把系统中的内存节点和CPU划分为不同的区域,分配给不同的任务组使用。
     ->include legacy /proc//cpuset file
     创建兼容旧系统的/proc//cpuset文件
     ->simple cpu accounting cgroup subsystem
     提供一个简单的资源控制器来监控cgroup中的任务使用CPU的情况
     ->resource counters
     提供配合cgroup运行的独立资源控制器统计框架
     ->memory resource controller for control groups
     提供内存资源控制器管理匿名内存和页缓存。该功能将增加内存中每个页的固定内存开销。启动时内存使用跟踪结构体将占用每页8/16字节的空间,总的占用情况在启动时会打印出来。即使启动该选项时,也可以在启动时传递内核参数cgroup_disable=memory禁止内存资源控制器。
    ->memory resource controller kernel memory accounting
    内存资源控制器的内核内存功能扩展可以限制内核对象使用的内存大小。这些限制完全不同于标准内存控制器所处理的实体(基于页、可交换)。内核扩展功能的使用者可以用它保证没有进程组将单独的耗尽内核资源。
     ->enable perf_event per-cpu per-container group monitoring
    延伸每CPU模式以便限制对那些属于指定cgroup以及运行于指定CPU上的进程的监控
     ->group cpu scheduler
     允许内核任务调度器在调度时考虑任务组的CPU带宽限制。可分别针对RR/FIFO/CFS等任务进行分别设置
    -> block io controller
    提供通过块IO控制器分组管理接口,不同的IO控制策略应该基于该接口实现。目前CFQ IO调度算法使用该接口来识别任务组,从而控制每个任务的磁盘访问带宽(按比例的时间片分配)。块设备层的BIO阻塞模块也使用该接口限制上层访问外设的IO速率。该选项只使能通用块IO控制器框架,具体的IO控制模块需要在其他选项中使能。
     ->enable block io controller debugging
    使能块IO控制器资源管理调试信息

->checkpoint/restore support
    设置进程代码段、数据段和堆的大小,以及在/proc增加内核控制参数。这个选项主要用于调试?

->namespaces support
使任务使用同样的ID与不同的对象一起运行。比如同样的IPC id号可能参考不同的对象,同样的用户ID或者PID在使用不同的命名空间时参考不同的任务。
    ->UTS namespace
    在这个命名空间,任务可以看到uname系统调用提供的不同信息。
    ->IPC namespace
    在这个命名空间,任务与IPC ids一同运行,该IPC ids对应不同命名空间的不同IPC对象。
    ->user namespace
    使用用户空间为不同用户提供不同的内核服务信息。
    ->PID namespace
    提供进程的命名空间,允许多个进程在不同PID命名空间使用同样的PID。
    ->network namespace
    在用户空间为内核网络协议栈创建多个命名空间实例。

->automatic process group scheduling
该选项通过自动创建和控制任务分组,为普通的桌面应用场景进行调度优化。通过任务分组可以将那些占用CPU过高的任务与普通的桌面应用程序分离开来。

->enable deprecated sysfs features to support old userspace tools
该选项将“block”类实体从/sys/class/block迁移到/sys/block。这个变化只有在sysfs.deprecated=1或者SYSFS_DEPRECATED_V2选项选中的情况下才能激活。该选项运行新编译内核运行在旧的发行版环境(旧的发行版可能无法识别/sys/class/block)。2007/2008以后的主流发行版和工具对这个已经支持的比较好了。最近的发行版和用户空间工具依赖于/sys/class/block,当该选项被使能后,将无法正常工作。只有当新内核运行于旧发行版才需要使能该选项。

->kernel->user space relay support
该选项使能某些文件系统(比如debugfs)提供的relay接口的支持。该接口提供从内核空间向用户空间转移大量数据的高效机制。

->initial ram filesystem and ram disk support
内核启动时挂载处于RAM中的临时根文件系统(initramfs),通常用来加载内核模块(该模块负载挂载最终的根文件系统)。如果RAM磁盘被使能,该选项也将允许initrd(初始的RAM磁盘)支持,该功能将增加15K的内核尺寸。
    ->initramfs source files
    指定创建initramfs映像的源文件清单,该文件可以是.cpio为后缀的cpio压缩档或者空格分开的目录列表以及文件列表。
    ->support initial ramdisks compressed using ***
    指定initramfs映像使用的压缩算法,支持gzip/bzip2/lzma/xz/lz0/lz4等。

->optimize for size
编译内核时将传递-Os优化选项给编译器

->configure standard kernel features
定制内核的基本特性,这意味着内核的一些基本功能将被禁止,除非特别必要,不要修改该选项。
    ->enable 16-bit uid system calls
    使能旧的16位UID系统调用封装
    ->sysctl syscall support
    sys_sysctl系统调用使用二进制路径,所以很难维护和使用。现在/proc/sys提供的接口使用ASCII方式的路径来代替以上功能。
    ->load all symbols for debugging/ksymoops
    支持内核打印符号化的宕机信息和堆栈跟踪信息,所有的符号信息豆浆编译进内核,所以将增加内核映像的尺寸。
        ->include all symbols in kallsyms
        通常kallsyms只包含函数符号,以便提供更友好的oops信息。大多数情况下这已经足够了,只有在极少数情况下才需要包含更详细的符号信息,比如变量名等。该选项将把所有的符号都编译进内核映像,可能增加大概300K的内核尺寸。
    ->enable support for printk
    支持在内核使用printk打印功能
    ->BUG() support
    提供对BUG()和WARN()打印支持
    ->enable ELF core dumps
    允许内核产生程序的CORE DUMP信息
    ->enable full-sized data structures for core
    允许内核数据结构以全尺寸进行编译
    ->enable futex support
    Futex(Fast Userspace Mutex)快速用户态互斥体,它是一种由用户态和内核态共同完成的同步机制。创建时是在用户空间通过mmap申请一片共享内存以便多进程间共同访问此futex,用户程序首先访问用户态的futex,只在判断出存在冲突(如一个进程已经拥有此futex,另一个进程申请访问,此时便存在一个冲突)时才进入内核态进行仲裁同步。用户空间的访问和冲突判断由glibc库完成,冲突仲裁由内核的futex模块完成。

->enable eventpoll support
eventpoll由一组系统调用组成,epoll机制是针对select/poll的缺陷设计的。通过新引入的eventpollfs文件系统,epoll把参数拷贝到内核态,在每次轮询时不会重复拷贝。通过把操作拆分为epoll_create,epoll_ctl,epoll_wait,避免了重复地遍历要监视的文件描述符。此外,由于调用epoll的进程被唤醒后,只要直接从epitem的完成队列中找出完成的事件,找出完成事件的复杂度由O(N)降到了O(1)。但是epoll的性能提高是有前提的,那就是监视的文件描述符非常多,而且每次完成操作的文件非常少。

->enable signalfd() system call
传统的处理信号的方式是注册信号处理函数;由于信号是异步发生的,要解决数据的并发访问,可重入问题。signalfd可以将信号抽象为一个文件描述符,当有信号发生时可以对其read,这样可以将信号的监听放到select、poll、epoll等监听队列中。

->enable timerfd() system call
可以实现定时器的功能,将定时器抽象为文件描述符,当定时器到期时可以对其read,这样也可以放到监听队列的主循环中。

->enable eventfd() system call
实现了线程之间事件通知的方式,eventfd的缓冲区大小是sizeof(uint64_t);向其write可以递增这个计数器,read操作可以读取,并进行清零;eventfd也可以放到监听队列中,当计数器不是0时,有可读事件发生,可以进行读取。

->use full shmem filesystem
支持完整的shmem文件系统,在用户空间导出为tmpfs。当禁止shmem功能时,shmem和tmpfs由ramfs代码替代实现。这对于不支持swap功能的小系统比较合适。

->enable aio support
支持POSIX AIO,Linux 异步 I/O 是 Linux 内核中提供的一个相当新的增强。它是 2.6 版本内核的一个标准特性,但是我们在 2.4 版本内核的补丁中也可以找到它。AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成。稍后或在接收到 I/O 操作完成的通知时,进程就可以检索 I/O 操作的结果。

->embedded system
使能该选项,将打开专门针对嵌入式系统设定的配置选项。

->kernel performance events and counters
通过内核对软件性能分析和硬件性能统计的支持,分析每个任务的运行性能,可通过perf工具配合提供分析。

->enable vm event counter for /proc/vmstat
为/proc/vmstat提供额外的虚拟内存子系统事件统计信息。

->enable slub debugging support
提供slub调试支持,以及/sys/slab接口

->disable heap randomization
堆随机化是一个让利用堆漏洞更加困难的特性(Disable heap randomization (COMPAT_BRK))。然而我们不应该去启用它,因为任何基于libc5的软件都无法工作在这个系统上!只有我们有特别的理由这么做或者如果你不会使用基于libc5的软件时才去启用它。我禁用了这个特性。当编译一个通用的内核时,开发者会希望禁用这个特性。

->choose slab allocator
选择内存分配器,可选slob/slab/slub

->profiling support
->OProfile system profiling
剖面支持,用一个工具来扫描和提供计算机的剖面图。支持系统评测,支持对诸如OProfile等工具提供性能分析支持。

->kprobes
Kprobe机制是内核提供的一种调试机制,它提供了一种方法,能够在不修改现有代码的基础上,灵活的跟踪内核函数的执行。它的基本工作原理是:用户指定一个探测点,并把一个用户定义的处理函数关联到该探测点,当内核执行到该探测点时,相应的关联函数被执行,然后继续执行正常的代码路径。Kprobe提供了三种形式的探测点,一种是最基本的kprobe,能够在指定代码执行前、执行后进行探测,但此时不能访问被探测函数内的相关变量信息;一种是jprobe,用于探测某一函数的入口,并且能够访问对应的函数参数;一种是kretprobe,用于完成指定函数返回值的探测功能。其中最基本的就是kprobe机制,jprobe以及kretprobe的实现都依赖于kprobe。

->optimize very unlikely/likely branches
编译阶段对unlikely/likely分支宏进行优化

->stack protector buffer overflow detection
支持GCC提供的堆栈保护编译选项

->gcov-based kernel profiling
支持基于gcov的内核剖面分析,gcov是一个测试代码覆盖率的工具,可以分析代码的执行情况。


阅读(2997) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~