YhOS 之内核篇
2. 内核编译加载
2.1 下载内核
现在的 Linux 下面程序的源代码都是一套,不管是 64 还是 32 ,也不管是在 PowerPC 上还是在 SUN 的服务器上,还是在手机上还是在你的计算机上,都是只一套源代码。Linux 是遵循 POSIX 规范的,所以这种一个源代码支持全部的架构理论上是存在的,但实际上各种条件都可能影响源代码的可移植性。
现在需要一份稳定的还是测试版的内核. 稳定版内核通常版本号第二位用偶数数字 -- 例如,
2.0.38、2.2.15、2.2.18 和2.4.1 是被认为是"稳定"的内核(分别由于其包含 0、2、2 和4)。测试版
内核,您通常需要那些版本号第二位是奇数的号码又最高的内核。例如,2.3.99 和 2.1.38都是测试
版内核(分别由于其包含 3 和 1)。
您将发现内核的源代码按内核版本(v2.x ,v3.x),被组织到多个不同的目录中。在每个目录中,您
将发现文件被冠以"ar.gz"和"ar.bz2"。这些就是Linux 内核的源代码。
您也将看到冠以 "" 和 "bz2" 的文件。这些是用来更新前面完整的内核源代码的补丁包。如果您希望编译一个新的内核版本,您将需要下载这些"linux"文件其中之一。
wget -c /pub/linux/kernel/v3.x/linux-3.10.
wget -c /pub/linux/kernel/v3.x/linux-3.14.
xz -d  linux-3.10. tar xvf linux-3.10.
2.2 内核源代码目录结构
arch目录 存放一些与CPU体系结构相关的代码 其中第个CPU子目录以分解boot,mm,kerner等子目录block目录 部分块设备驱动代码
crypto目录 加密、压缩、CRC校验算法
documentation 内核文档
drivers  设备驱动
fs  存放各种文件系统的实现代码
include  内核所需要的头文件。与平台无关的头文件入在include/linux子目录下,与平台相关的头文件则放在相应的子目录中
init  内核初始化代码
ipc  进程间通信的实现代码
kernel  Linux大多数关键的核心功能者是在这个目录实现(程序调度,进程控制,模块化)
lib  库文件代码
mm  与平台无关的内存管理,与平台相关的放在相应的arch/CPU目录 net  各种网络协议的实现代码,注意而不是驱动
samples  内核编程的范例
scripts  配置内核的脚本
security SElinux的模块
sound  音频设备的驱动程序
usr  cpip命令实现程序
virt  内核虚拟机
Ncurses 提供字符终端处理库,包括面板和菜单。是内核编译的依赖
apt-get install libncurses5-dev
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列【新】软件包将被安装:
libncurses5-dev
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 378 个软件包未被升级。
需要下载 1,618k B 的软件包。
解压缩后会消耗掉7,070k B 的额外空间。
获取:1 old-releases.ubuntu/ubuntu/ maverick/main libncurses5-dev amd64
5.7+20100626-0ubuntu1 [1,618k B]
下载 1,618k B,耗时 6秒 (252k B/s)                                                            选中了曾被取消选择的软件包 libncurses5-dev。
(正在读取数据库 ... 系统当前共安装有 117843 个文件和目录。)
正在解压缩 libncurses5-dev (从 .../libncurses5-dev_5.7+20100626-0ubuntu1_amd64.deb) ...
正在处理用于 man-db 的触发器...
正在设置 libncurses5-dev (5.7+20100626-0ubuntu1) ...
2.3 内核配置
1.清除
make clean    删除编译文件但保留配置文件,清除一些不必要的文件,那些乱七八糟的东东是可能会导致您在编译过程中出现错误的哦,一定要做哦…
make mrproper 删除所有编译文件和配置文件,清除原先此目录下残留的.config和.o(ob j ect文件) make distclean 删除编译文件、配置文件包括backup备份和patch补丁
2.内核配置方式
make config 基于文本模式的交互式配置
make menuconfig 基于文本模式的菜单配置
make oldconfig 使用已有的配置文件(.config),但配置时会询问新增的配置选项
make xconfig 图形化配置
3.make menuconfig一些说明或技巧
选择相应的配置时,有三种选择,它们分别代表的含义如下:
  Y--将该功能编译进内核
  N--不将该功能编译进内核
  M--将该功能编译成可以在需要时动态插入到内核中的模块
  在每一个选项前都有个括号, 中括号, 尖括号, 圆括号。用空格键选择时可以发现,中括号中要么是空,要么是“*”;而尖括号中可以 是空、“*”和“M”。这表示前者对应的项要么不要,要么编译到内核中;后者则多一样选择,可以编译成模块。而圆括号的内容是要你在所提供的几个选项中选择一项。
4.快速配置相应体系结构的内核配置
到arch/$cpu/configs目录下copy相应的处理器型号的配置文件到内核源目录下替换.config文件
5.内核配置
G eneral setup 普通的属性设置
[*]Prompt for development and/or incomplete code/drivers
显示尚在开发中或尚未完成的代码与驱动.你应该选择它,因为有许多设备可能必需选择这个选项才能进行配置,实际上它是安全的。这个选项同样会让一些老的驱动的可用。如果你选了Y,你将会得到更多的版本的驱动和代码的配置菜单。
()Cross-compiler tool prefix
交叉编译工具前缀,如果你要使用交叉编译工具的话输入相关前缀。默认不使用。不需要
[] Compile also drivers which will not load 编译不需要加载的驱动程序
()Local version - append to kernel release
在内核版本后面加上自定义的版本字符串(小于64字符),可以用"uname -a"命令看到
-yhOS-gonggong-0.1
[]A utomatically append version information to the version string
自动生成版本信息。这个选项会自动探测你的内核并且生成相应的版本,使之不会和原先的重复。这需
要Perl的支持。由于在编译的命令make-kpkg 中我们会加入 append-to-version 选项来生成自定义版本,所以这里选N。
K ernel compression mode (G zip)
内核压缩模式选baip2
(X) G zip  ; ( ) B zip2;;( ) L ZMA;( ) X Z; ( ) L Z O
•gzip用于UNIX系统的文件压缩。后缀 为.gz的文件。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。HTT P协议上的GZ IP编码是一种用来改进W E B应用程序性能的技术。大流量的W E B站点常常 使用GZ IP压缩技术来让用户感受更快的速度。
•bzip2是一个基于B urrows- W heeler 变换的无损压缩软件,压缩效果比传统的L Z77/L Z78压缩算法来得好。它是一款免费软件。bzip2能够进行高质量的数据压缩。它利用先进的压缩技术,能够把普通的数据文件压缩10%至15%,压缩的速度和解压的效率都非常高!支持现在大多数压缩格式,包括tar、gzip 等等。
•lzma是一个D eflate和L Z77算法改良和优化后的压缩算法,开发者是Igor Pavlov,2001年被首次应用于7-Z ip压缩工具中,是 2001年以来得到发展的一个数据压缩算法。它使用类似于 L Z77的字典编码机制,在一般的情况
((none)) D efault hostname
默认主机名,先保持none吧反正以后可以改。
[*] Support for paging of anonymous memory (swap)
将使你的内核支持虚拟内存。这个虚拟内存在LINUX中就是S WA P分区。除非你不想要S WA P分区,否则这里必选Y。
[*] System V IPC
System V进程间通信(IPC)支持,于处理器在程序之间同步和交换信息,如果不选这项,很多程序运行不起来,特别地, 所以不用考虑,这里一定要选。
[*] POSIX M essage Q ueues
POSIX消息队列,这是POSIX IPC中的一部分。建议你最好将它选上POSIX 表示可移植操作系统接口建议你最好将它选上 。
[*]B S D Process A ccounting
这是允许用户进程访问内核,将账户信息写入文件中。这通常被认为是个好主意,建议你最好将它选上。将进程的统计信息写入文件的用户级系统调用,主要包括进程的创建时间/创建者/内存占用等信息。
[]B S D Process A ccounting version 3 file format
选Y,统计信息将会以新的格式(V3)写入,这格式包含进程I D和父进程。注意这个格式和以前的
v0/v1/v2 格式不兼容,所以你需要 升级相关工具来使用它。 选不选均可。
open by fhandle syscalls
打开文件可以通过句柄子系统调用.(If you say Y here, a user level program will be able to map file names to handle and then later use the handle for different file system operations.
T his is useful in implementing userspace file servers, which now track files using handlesinstead of names. T he handle would remain the same even if file names get renamed.)稍微翻译一下, 可以通过1个叫句柄既野, 可以代替文件名来匹配文件, 即使文件名被修改, 句柄属性还是保留与修改前一至的。 按默认吧
-*- Export task/process statistics through netlink (EXPERI M EN TA L)
处于实验阶段的功能。通过通用的网络输出工作/进程的相应数据,和B S D不同的是,这些数据在进程运行的时候就可以通过相关命令访问。和B S D类似,数据将在进程结束时送入用户空间。如果不清楚,选N。
通过netlink接口向用户空间导出任务/进程的统计信息,与B S D Process A ccounting的不同之处在于这些统计信息在整个任务/进程生存期都是可用的
-*-  Enable per-task delay accounting (EXPERI M EN TA L)
在统计信息中包含进程等候系统资源(cpu,IO同步,内存交换等)所花费的时间
[*]  Enable extended accounting over taskstats (EXPERI M EN TA L)
在统计信息中包含扩展进程所花费的时间
[*]Enable per-task storage I/O accounting (EXPERI M EN TA L)
在统计信息中包含I/O存储进程所花费的时间
-*- A uditing support
审计支持,用于和内核的某些子模块同时工作,(例如SELinux)需要它,只有同时选择其子项才能对系统调用进行审计。
允许审计的下层能够被其他内核子系统使用,比如SE-Linux,它需要这个来进行登录时的声音和视频
输出。没有CON F I G_A U D I T S Y SC A LL 时(即下一个选项)无法进行系统调用。
[*]  Enable system-call auditing support
支持对系统调用的审计。允许系统独立地或者通过其他内核的子系统,调用审计支持,比如SE-Linux。要使用这种审计的文件系统来查看特性,请确保 INO T I F Y已经被设置。
IR Q subsystem  --->
申请中断系统, 保持默认吧.
RCU Subsystem  --->
一个高性能的锁机制RCU 子系统,不懂不了解,按默认吧。  RCU(Read-Copy Update),顾名思义为读取-复制更新。对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝一个副本,然后对副本进行修改,最后使用一个回调(callback)机制在适当的时机把指向原来数据的指针重新指向新的被修改的数据。这个时机就是所有引用该数据的 CPU都退出对共享数据的操作。
RCU Implementation (T ree-based hierarchical RCU) --->
RCU 实现机制
•(X) T ree-based hierarchical RCU
基本数按等级划分
•[] Enable tracing for RCU
激活跟踪
•(32) T ree-based hierarchical RCU fanout value
基本数按等级划分分列值
•[]D isable tree-based hierarchical RCU auto-balancing
<>K ernel .config support
perl怎么下载
这个选项允许.config文件(即编译LINUX时的配置文件)保存在内核当中。它提供正在运行中的或者还在硬盘中的内核的相关配置选项。可以通过内核镜像文件 kernel image file 用命令 script
scripts/extract-ikconfig 来提取出来,作为当前内核重编译或者另一个内核编译的参考。如果你的内核在运行中,可以通过/文件来读取。下一个选项提供这 项支持。
看起来好像是一个不错的功能,可以把编译时的 .config文件保存在内核中,以供今后参考调用。用来重编译和编译其他的内核的时候可以用上。你是一个编译内核的狂人的话,这项要选上
Kernel log buffer size (16 => 64KB, 17 => 128KB)
内核日志缓存的大小,使用默认值即可。12 => 4 KB,13 => 8 KB,14 => 16 KB单处理器,
15 => 32 KB多处理器,