实验环境:
centos6.5 linux-2.6.32.65
声明:以下所有均实验自《深度探索Linux操作系统 系统构建和原理解析》
没有深入探索,仅为了解整个启动流程,如感兴趣,可自行查阅原书。
整个系统的启动流程:
bootloader–>kernel(initrd/initramfs)–>init(/etc/inittab)
构建内核:
ELF:
可执行和可链接格式 (英语:Executable and Linkable Format,缩写为ELF),常被称为ELF格式,在计算机科学中,是一种用于执行档、目的档、共享库和核心转储的标准文件格式。
1999年,被86open项目选为x86架构上的类Unix操作系统的二进制文件格式标准,用来取代COFF。因其可扩展性与灵活性,也可应用在其它处理器、计算机系统架构的操作系统上。
映像的格式:
操作系统映像没必要使用ELF格式来组织,将代码和数据顺次存放即可,即所谓的裸二进制格式。所以,内核映像都采用裸二进制格式进行存储。
交叉编译:
内核构建系统默认内核是本地编译,即编译的内核是运行在与宿主系统相同的体系架构上,如果是为其他的架构编译内核,即交叉编译。
基本内核配置: 3种情况
- 如果存在宿主系统,可以将宿主系统的内核配置文件复制到要编译的内核的目录下,命名为.config,然后运行make oldconfig,然后使用make menuconfig进行微调。
- 內核默认为很多平台提供了默认的配置文件,存放在arch/
/configs目录下。 make x86_64_defconfig
- kbuild提供了创建最小配置的方法
make allnoconfig
配置处理器:
1 | #cat /proc/cpuinfo | grep "model name" |
processor type and features–>…
配置内核支持SMP
processor type and features–>symmetric multi-processing support
配置内核支持模块
Enable loadable module support
Module unloading
配置硬盘控制器驱动
1 | #lspvi -v |
挂载rootfs:
解压initramfs到rootfs:
需要指明,需在内核配置中选择对initramfs的支持。(否则这个并不是那么必须的,例如在gentoo编译中,只是默认编译内核,Options中可以直接下载编译好的。)
配置内核支持initramfs:
General setup–>Initial RAM filesystem and RAM disk(initramfs/initrd) support
在挂载了rootfs后,内核将bootloader加载到内存中的initramfs中的文件解压到rootfs中。而这些文件中包含了子驱动以及挂载真正的根文件系统的工具,
内核通过加载这些驱动,使用这些工具实现挂载真正的根文件系统。
挂载真正的根文件系统后,rootfs中的内容已经没有保留的意义,但是并不能将rootfs卸载,因为rootfs是整个虚拟文件系统的根。因此,
为了不占用内存空间,将rootfs中的内容释放掉即可,然后将真正的根文件系统移动到虚拟文件系统的根,最后再将进程的文件系统的namespace
切换到真正的根文件系统。
rf
构建基本的initramfs:
1 | mkdir initramfs |
将硬盘驱动编译为模块
initramfs的重要作用之一就是允许内核将保存根文件系统的存储设备的驱动不再编译进内核。
配置devtmpfs
既然提到设备,需要说设备文件或者设备节点,通常情况下,某些需要从用户空间访问的设备都会在文件系统中建立一个设备文件,作为用户空间
访问设备的接口,
在Linux系统早期,设备文件是静态创建的,所有的设备节点是手动、事先创建的。这样就存在一个问题,随着设备的种类越来越多,该目录将会越来越大,
就会造成不需要的进驻空间,浪费资源。
后来出现成功的是udev,是的设备命名策略、权限控制等都在用户控件完成。如此,设备文件不再是静态创建,而是有udev根据内核检测到的
实际连接的设备,创建相应的设备文件。
从2.6.18开始使用udev,/dev目录使用了基于内存的文件系统tmpfs管理设备文件。
2009初,开发人员又提出devtmpfs,内核引导时,devtmpfs将所有注册的设备在devtmpfs中建立相应的设备文件,一旦进入用户空间,在启动udev前,
就可以将devtmpfs挂载到/dev目录下。
配置内核支持devtmpfs:
Device Drivers–>Generic Driver options –> Maintain a devtmpfs filesystem to mount at /dev
将硬盘控制器驱动配置为模块(改动前面的)
Intel ESB,ICH,PIIX3,PIIX4, PATA/SATA support
配置内核支持NETLINK
内核与udevd通过Unix Domain Sockets使用NETLINK协议进行通信。
Networking support–>Networking options–>unix domain sockets
配置内核支持inotify
因为udev使用inotify机制监测udev的规则文件是否发生变化,所以配置内核使其支持inotify机制,否则udevd将因为初始化inotify失败而退出。
Eile system–>Inotify support for userspace
配置内核支持网络
配置内核支持TCP/IP协议
TCP/IP networking
配置内核支持网卡
lspci 查看Ethernet controller,得到网卡的型号。
Device Drivers–>Network device support–>选择相应的类别。
安装X的输入设备驱动
Device Drivers–>USB support–>UHCI HCD(most Intel and VIA)support
配置时间处理模块
Device Drivers–>Input device support–>Event interface
配置AGP总线:
Device Drivers–>Graphics support–>/dev/agpgart(AGP Support)–>选择对应的(such as:Intel/NVIDIA)
配置DRM模块
Device Drivers–>Graphics support–>Enable modesetting on intel by default
额,大概先弄到这里,默认情况下,这些都已选上,在真实的机子上,要有以太网网卡,无线网卡,显卡等,如果以后还回到这里,会继续更新。