14_04_3_Linux启动和内核初涉

实验环境:
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种情况

  1. 如果存在宿主系统,可以将宿主系统的内核配置文件复制到要编译的内核的目录下,命名为.config,然后运行make oldconfig,然后使用make menuconfig进行微调。
  2. 內核默认为很多平台提供了默认的配置文件,存放在arch/ /configs目录下。

    make x86_64_defconfig

  3. kbuild提供了创建最小配置的方法

    make allnoconfig

配置处理器:

1
2
3
4
#cat /proc/cpuinfo | grep "model name" 
#make mrproper (如果以前有编译过,要备份.config)
#make allnoconfig(不知为何,我实验时如果使用这步,然后按照下面走,不能成功,不知为何,然后我跳这一步,然后就成功了)
#make menuconfig (如果直接使用这一步,剩下的会默认配置上,只要改动CPU信息,以及不想要的即可,加快编译速度)

processor type and features–>…
配置内核支持SMP
processor type and features–>symmetric multi-processing support

配置内核支持模块
Enable loadable module support
Module unloading

配置硬盘控制器驱动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#lspvi -v 
配置PCI总线-->PCI support
配置SCSI:
Device Drivers-->SCSI device support -->SCSI disk support
Device Drivers-->Serial ATA and Parallel ATA drivers-->Intel ESB,ICH,PIIX3,PIIX4, PATA/SATA support
配置文件系统:
File systems--> The Extended 4(ext4)filesystem
File systems-->use ext4 for ext2/ext3 file system(NEW)
File systems-->ext4 extended attributes(NEW)
配置内核支持ELF文件格式
Executable file formats/Emulations-->Kernel support for ELF binaries
Executable file formats/Emulations-->Write ELF core dumps with partial segments(NEW)
说明:上面这些全部加载到内核,不是以模块挂载。
这时引导启动会遇到No init found,init会干什么呢?源码中:先找initramfs,目前我们没有使用initramfs,所以内核会接着找/sbin/init
/etc/init /bin/init /bin/sh  
这个时候如果不是拿原系统的内核做实验,则需要自己编译bash,然后
#ln -s bin/bash bin/sh
#ldd bin/bash 移植所需要的库。
#cd /mnt/sysroot && mkdir dev proc usr var usr/bin usr/sbin sbin bin etc 
timeout=5
root (hd0,0)
kernel /bzImage ro root=/dev/sda2 init=/bin/bash
这个时候内核就能基本启动了,可以见得,initramf并不是必须需要的,不过一个基本的系统也就这样起来了。

挂载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
2
3
4
5
6
mkdir initramfs 
vim initramfs/init
#!/bin/bash
echo -e "\033[033mHello,welcome to my Linux\033[0m"
exec /bin/bash
chmod +x init

将硬盘驱动编译为模块
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

额,大概先弄到这里,默认情况下,这些都已选上,在真实的机子上,要有以太网网卡,无线网卡,显卡等,如果以后还回到这里,会继续更新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值