1
实验六 linux内核定制和 FloppyLinux的实现
一,实验目的
完成这个实验后,您将具有以下能力:
n 了解 Linux内核的结构
n 编译 Linux内核的能力
n 了解一个操作系统的构造
n 制作floppylinux
二,基础知识
进行本实验前,您应具有:
n C语言基础
n Linux环境下 vi编译器的使用
三,实验环境准备
为了完成本实验,以下硬件条件是必需的:
n PC机 Pentium500以上,硬盘 40G以上,内存 128M以上,带软驱
n 一张软盘
为了完成本实验,以下软件条件是必需的:
n PC机操作系统 RedHat Linux 9.0
四,情景描述
1. 重新编译生成一个新的系统内核,然后烧写到开发板启动之。
2. 生成FloppyLinux。
五,实验基本原理——Linux的相关介绍
1,Linux的版本号
可以使用 uname –a命令或者 cat /proc/version命令来查看运行系统的内核版本号:如图 6.1。
图 6.1
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
2
由此可知,该系统内核版本号为 2.4.20-8。其中第一个数为主版本号,第二个数为次版
本号,第三个为修订号。如果次版本号为偶数则表明是该版本是稳定发行版本,如果是奇数
则说明仍在开发中。
2,Linux的内核目录介绍
现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序和网络等组成。Linux
内核源码的各个目录大致与此相对应,如图 6.2所示。其组成如下:
图 6.2
arch 包括了所有和体系结构相关的核心代码。它下面的每一个子目录都代表一种 Linux
支持的体系结构。
include 包括编译核心所需要的大部分头文件。
init 包含核心的初始化代码(不是系统的引导代码),有main.c和 Version.c两个文件。
mm 包含了所有的内存管理代码。
drivers 包含系统中所有的设备驱动程序。
ipc 包含了核心进程间的通信代码。
fs 存放 Linux支持的文件系统代码。不同的文件系统有不同的子目录对应。
kernel 包含内核管理的核心代码放在这里。
net 核心的网络部分代码,其每个子目录对应于网络的一个方面。
lib 包含了核心的库代码。
scripts 包含用于配置核心的脚本文件。
Documentation下是一些文档,是对每个目录作用的具体说明。
一般在每个目录下都有一个.depend文件和一个Makefile文件。这两个文件都是编译时使用
的辅助文件。另外有的目录下还有 readme文件,它是对该目录下文件的一些说明。
3,关于配置文件和配置工具
配置文件:给用户提供配置选择的功能
各级Makefile和.depend文件:各级目录的 make文件和依赖工具
.config:内核配置文件,保存配置结果。
Rules.make:规则文件。
配置工具:包括配置命令解释器
其中配置用户界面如下:
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
3
(1)基于字符的界面 make config (如图 6.3)
图 6.3
该方法简单且不需要调用 Xwindows,不过操作麻烦,用户界面差。
(2)基于 Ncurses 的文本模式图形用户界面make menuconfig (如图 6.4)
图 6.4
该方法简单且不需要调用 Xwindows,而且操作简单,用户界面好。
这次实验就使用该方法进行内核的相关配置。
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
4
(3)基于 Xwindows 图形界面的用户配置界面make xconfig (如图 6.5)
图 6.5
4,内核的编译
(1)在该级目录下的 Config.in中添加对该模块的编译条件,该变量可以设置为三种状态:
(如图 6.6所示)
Y ---将该功能模块编译进内核
N ---不将该功能模块编译进内核
M ---将该功能编译成模块的方式,可以在需要时动态插入到内核中的模块
图 6.6
(2)内核的编译操作
# make menuconfig -----配置编译选项
# make dep -----提供变量依赖关系信息.
# make clean -----删除生成的模块和目标文件.
# make zImage -----编译内核生成压缩的映象.
# make modules -----编译模块.
# make modules_install -----安装编译完成的模块.
最终生成的压缩内核映象的路径:arch/arm/boot/zImage
拷贝新内核文件 zImage到启动目录,并改为合适的名字。
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
5
5,新内核的引导
修改/boot/grub/grub.conf文件的内容如下:
default=0 timeout=30
splashimage=(hd0,6)
title Red Hat Linux (2.4.24)
root (hd0,0)
kernel vmlinuz-2.4.24 ro root=/dev/hda0
initrd /initrd-2.4.24.img
设置完成,然后就可以重启计算进入新编译的内核了。
六,估计完成实验需要时间:180分钟
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
6
练习 1
重新编译生成一个新的系统内核
情景描述
进入内核所在目录,使用make menuconfig进行配置。之后编译生成一个新的内核镜像,并
且烧写到ARM9嵌入式开发板上进行测试。
任务 详细步骤
1. 配置arm内核相关信息
a. 进入 arm内核所在目录
# cd /arm2410s/kernel-2410s
b. 进入 menuconfig配置菜单
# make menuconfig
c. 进行一定的更改之后,按 esc按键退出界面并保存。如图 6.7。
2. 编译生成新的内核。 a. 输入如下命令,清除无用信息。
# make clean
b. 输入如下命令,建立依赖关系。
# make dep
c. 编译新内核
# make
最终生成的压缩内核映象的路径:arch/arm/boot/zImage,将该镜像拷贝出来,准备烧入到开发板中。
图 6.7
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
7
任务 详细步骤
3. 烧写内核镜像
a. 打开宿主机,进入 windows xp系统,打开超级终端。超级终端设置
参数如图 6.8和图 6.9所示。
b. 打开嵌入式平台,按住任何一个非回车键进入 vivi,然后按下如下命
令查看开发板信息:
vivi> part show
mtdpart info. (6 partitions)
name offset size flag
------------------------------------------------
vivi : 0x00000000 0x00020000 0 128k
param : 0x00020000 0x00010000 0 64k
kernel : 0x00030000 0x00100000 0 1M
root : 0x00130000 0x00300000 4 3M
yaffs : 0x00430000 0x03b00000 8 59M
ucos : 0x03f30000 0x000cc000 0 816k
注意:以上信息全部存储在 64M的 flash之中。
c. 准备烧写内核镜像,输入如下命令:
vivi> load flash kernel x
d. 在超级终端上点击传送菜单的发送文件,选择镜像文件 zImage和
Xmodem协议,之后点击发送即可。等待过程结束(如图 6.10和图 6.11
所示)。
4. 测试
a. 完成上述操作之后,在/vivi提示符下输入命令 boot,之后就可以看
到启动新编译的内核了。
图 6.8
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
8
图 6.9
图 6.10
图 6.11
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
9
实验说明
关于 make meunconfig的具体内容
当输入 make menuconfig命令之后,系统会进入内核配置选项界面(如图 6.12)。
图 6.12
其各个界面内容介绍如下:
Code maturity level options(代码成熟度选项) --->
[*] Prompt for development and/or incomplete code/drivers
选择那些还在发展阶段,不成熟的代码或驱动
[ ] Prompt for obsolete code/drivers
对于已经不用的代码或驱动的支持
Loadable module support(动态模块支持) --->
[*] Enable loadable module support
加载模块支持
[ ] Set version information on all module symbols
支持跨内核版本的所有模块类型
[*] Kernel module loader
内核模块加载,提供自动载入或者卸载可载入的模块。
System Type(系统类型) --->
(S3C2410-based) ARM system type
--- S3C2410 Implementation
[*] SMDK (MERI TECH BOARD)
[*] change AIJI
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
10
S3C2410 USB function support
Support for S3C2410 USB character device emulation
--- Processor Type(处理器类型)
[*] ARM920T CPU idle
[*] ARM920T I-Cache on
[*] ARM920T D-Cache on
[ ] Force write through caches on ARM920T
[ ] Support Thumb instructions (experimental)
General setup(一般设置) --->
[*] Support hot-pluggable devices
热拔插设备支持
[*] Networking support
网络支持
[*] System V IPC
SystemV进程间通讯支持
[*] Sysctl support
不重启直接改变内核参数
<*> NWFPE math emulation
模拟数学协处理器
<*> Kernel support for ELF binaries
内核支持 ELF二进制
[*] Kernel-mode alignment trap handler
内核模式错误处理程序
Parallel port support (并口支持) --->
Memory Technology Devices (MTD) --->
<*> Memory Technology Device (MTD) support
MTD支持
<*> MTD partitioning support
MTD分区支持
<*> Direct char device access to MTD devices
直接字符设备到MTD设备的访问
<*> Caching block device access to MTD devices
缓冲块设备到MTD设备的访问
RAM/ROM/Flash chip drivers --->
Mapping drivers for chip access --->
Self-contained MTD device drivers --->
NAND Flash Device Drivers --->
Plug and Play configuration(即插即用配置) --->
Block devices(块设备) --->
Multi-device support (RAID and LVM) --->
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
11
Networking options(网络选项) --->
<*> Packet socket
包协议支持
<*> Netlink device emulation
利用 netlink与内核传送信息
<*> Unix domain sockets
Unix Socket支持
[*] TCP/IP networking
TCP/IP 协议栈支持
Network device support(网络设备支持) --->
[*] Network device support?
Ethernet (10 or 100Mbit) --->
Ethernet (1000 Mbit) --->
<*> PPP (point-to-point protocol) support
点对点协议支持
[*] PPP multilink support (EXPERIMENTAL)
<*> PPP support for async serial ports
<*> PPP support for sync tty ports
<*> PPP over Ethernet (EXPERIMENTAL)
Amateur Radio support(无线网络支持) --->
IrDA (infrared) support(红外通讯支持) --->
ATA/IDE/MFM/RLL support(ATA/IDE/MFM/RLL等协议支持) --->
SD/MMC support (SD/MMC等协议支持)--->
SCSI support (SCSI设备支持) --->
I2O device support (I2O设备支持) --->
ISDN subsystem (综合业务数字网) --->
Input core support (输入核心支持) --->
Character devices (字符设备) --->
[*] Virtual terminal
虚拟终端
Serial drivers --->
串口设备
S3C2410 ADC
S3C2410 FPGA
S3C2410 TUBE
S3C2410 INT
S3C2410 485
S3C2410 DA
S3C2410 STEP MOTOR
S3C2410 DC MOTOR
S3C2410 CAN BUS
S3C2410 GPRS
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
12
[*] Unix98 PTY support
I2C support ---> I2C总线支持
L3 serial bus support ---> L3串口总线支持
Mice ---> 鼠标支持
Joysticks ---> 手柄支持
Watchdog Cards ---> 看门狗定时设备支持
<*> S3C2410 Real Time Clock 内建实时时钟
PCMCIA character devices ---> PC字符设备支持
Multimedia devices (多媒体设备) --->
Video For Linux
Video For Linux ---> V4L
Radio Adapters --->
File systems --->
<*> Kernel automounter version 4 support (also supports v3)
V4版本支持,兼容 V3
<*> DOS FAT fs support
DOS FAT文件系统支持
<*> VFAT (Windows-95) fs support
VFAT文件系统支持
<*> Yaffs filesystem on NAND
NAND FLASH上的 Yaffs文件系统
<*> Compressed ROM file system support
[*] Virtual memory file system support (former shm fs)
<*> Simple RAM-based file system support
[*] /proc file system support
/proc虚拟文件系统支持,可以提供系统当前情况
[*] /dev file system support (EXPERIMENTAL)
/dev文件系统支持,支持 devfs
[*]Automatically mount at boot
[*] /dev/pts file system for Unix98 PTYs
Network File Systems --->
Partition Types --->
Native Language Support --->
Console drivers (控制台驱动) --->
Sound (声音) --->
Multimedia Capabilities Port drivers (多媒体驱动) --->
USB support (USB驱动) --->
Bluetooth support (蓝牙) --->
Kernel hacking (内核调试相关信息) --->
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
13
练习 2
制作 FloppyLinux
情景描述
使用软盘进行GRUB配置,之后使用make menuconfig进行内核配置,之后使用Busybox编译
生成一个新的根文件系统,把这些整合到软盘中完成FloppyLinux。
任务 详细步骤
1. 软盘上安装引导器(grub)
a. 首先对软盘建立 ex2文件系统
[root@localhost floppylinux]# mke2fs /dev/fd0
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
184 inodes, 1440 blocks
72 blocks (5.00%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
184 inodes per group
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 26 mounts or 180 days,
whichever comes first. Use tune2fs -c or -i to override.
b. 之后将系统中 grub目录下的引导文件 stage1,stage2复制到软盘中
[root@localhost floppylinux]# mount /dev/fd0 /mnt/floppy
[root@localhost floppylinux]# cd /mnt/floppy/
[root@localhost floppy]# mkdir boot
[root@localhost floppy]# mkdir boot/grub
[root@localhost floppy]# cp /boot/grub/stage1 /mnt/floppy/boot/grub/
[root@localhost floppy]# cp /boot/grub/stage2 /mnt/floppy/boot/grub/
[root@localhost floppy]# ls boot/grub/
stage1 stage2
c. 最后配置 grub信息
[root@localhost floppy]# grub
Probing devices to guess BIOS drives. This may take a long time.
GRUB version 0.93 (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the
possible completions of a device/filename.]
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
14
grub> root (fd0)
Filesystem type is ext2fs, using whole disk
grub> setup (fd0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... no
Running "install /boot/grub/stage1 (fd0) /boot/grub/stage2 p
/boot/grub/grub.conf "... succeeded
Done.
grub> quit
至此,引导盘安装完成!
2. 配置 busybox相关选项 a. 解压 busybox,进入其文件夹
[root@localhost busybox-1.00]# pwd
/floppylinux/floppylinux/busybox-1.00
[root@localhost busybox-1.00]# make menuconfig
之后进入配置界面,并在选项中作如图 6.13配置。
b. 在 General Configuration中如图 6.14选择。
c. 在 Build Options中如图 6.15选择
d. 在 Installation Options中如图 6.16选择
e. 其他选项遵从 linux基本命令默认选项,配置好保存退出。
最终生成的压缩内核映象的路径:arch/arm/boot/zImage,将该镜像拷贝出来,准备烧入到开发板中。
图 6.13
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
15
图 6.14
图 6.15
图 6.16
任务 详细步骤
3. 编译并安装 busybox
[root@localhost busybox-1.00]# make
[root@localhost busybox-1.00]# make install
编译好后在 busybox目录下生成子目录_install
[root@localhost busybox-1.00]# cd _install/
[root@localhost _install]# ll
总用量 8
drwxr-xr-x 2 root root 4096 10月 31 22:29 bin
lrwxrwxrwx 1 root root 11 10月 31 22:29 linuxrc -> bin/busybox
drwxr-xr-x 2 root root 4096 10月 31 22:29 sbin
其中可执行文件 busybox在 bin目录下,其他的都是指向他的符号链接
4. 建立临时目录,该目录为软盘
的文件系统
[root@localhost floppyImage]# pwd
/floppylinux/floppylinux/floppyImage
将 busybox下的_install目录下的文件复制过来
cp /floppylinux/floppylinux/busybox-1.00/_install/*
/floppylinux / floppylinux/ floppyImage/ -r
[root@localhost floppylinux]# cd floppyImage/
[root@localhost floppyImage]# ls
bin linuxrc sbin
[root@localhost floppyImage]# mkdir dev etc etc/init.d proc mnt
tmp var
[root@localhost floppyImage]# chmod 755 dev etc etc/init.d bin
mnt tmp var
[root@localhost floppyImage]# chmod 555 proc
5. 建立设备列表 [root@localhost floppyImage]# cd dev
[root@localhost dev]# mknod tty c 5 0
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
16
[root@localhost dev]# mknod console c 5 1
[root@localhost dev]# chmod 666 tty console
[root@localhost dev]# mknod tty0 c 4 0
[root@localhost dev]# chmod 666 tty0
[root@localhost dev]# mknod ram0 b 1 0
[root@localhost dev]# chmod 600 ram0
[root@localhost dev]# mknod fd0 b 2 0
[root@localhost dev]# chmod 600 fd0
[root@localhost dev]# mknod null c 1 3
[root@localhost dev]# chmod 666 null
建立完毕,显示内容如图 6.17
图 6.17
6. 建立启动配置文件
[root@localhost floppyImage]# cd etc/
[root@localhost etc]# vi inittab
[root@localhost etc]# vi fstab
[root@localhost etc]# cd init.d/
[root@localhost init.d]# vi rcS
其中
initab:
::sysinit:/etc/init.d/rcS
::askfirst:/bin/sh
rcS:
#!/bin/sh
mount –a
# chmod 755 rc.sysinit
fstab:
proc /proc proc defaults 0 0
[root@localhost init.d]# cd /mnt/floppy/
[root@localhost floppy]# ls
boot lost+found
[root@localhost floppy]# cd boot/grub
[root@localhost grub]# vi grub.conf
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
17
grub.conf:
timeout 0
default 10
title FloppyLinux
root (fd0)
kernel /boot/bzImage
initrd /initrd.img.gz
之后建立连接文件 menu.1st
[root@localhost grub]# ln -s grub.conf menu.1st
[root@localhost grub]# ls
stage1 stage2 grub.conf menu.1st
7. 制作镜像文件 initrd.img
[root@localhost boot]# dd if=/dev/zero of=/dev/ram1
dd: 正在写入 ‘/dev/ram1’: 设备上没有空间
读入了 8193+0 个块
输出了 8192+0 个块
[root@localhost boot]# mke2fs -m0 /dev/ram1
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1024 inodes, 4096 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
1024 inodes per group
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@localhost boot]# mkdir /mnt/ram
[root@localhost boot]# mount /dev/ram1 /mnt/ram/
将先前做好的 floppylinux根文件系统拷贝到 ram1上
[root@localhost boot]# cp -R
/floppylinux/floppylinux/floppyImage/* /mnt/ram/
[root@localhost boot]# umount /dev/ram1
[root@localhost boot]# dd if=/dev/ram1
of=/floppylinux/floppylinux/floppyImage/initrd.img
读入了 8192+0 个块
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
18
输出了 8192+0 个块
[root@localhost boot]# file
/floppylinux/floppylinux/floppyImage/initrd.img
/floppylinux/floppylinux/floppyImage/initrd.img: Linux rev 1.0 ext2
filesystem data
8. 检查,用 loop设备来把它重
新挂装到文件系统里
之后压缩 initrd.img镜像文件
[root@localhost boot]# cd
/floppylinux/floppylinux/floppyImage/
[root@localhost floppyImage]# mount -o loop initrd.img
/mnt/ram/
查看/mnt/ram下的内容,和/tmp/floppy-linux /下的一模一样
[root@localhost floppyImage]# ls /mnt/ram/
bin dev etc linuxrc lost+found mnt proc sbin tmp
var
[root@localhost floppyImage]# umount /mnt/ram/
[root@localhost floppyImage]# gzip -v9 initrd.img
initrd.img: 90.2% -- replaced with initrd.img.gz
查看压缩之后的大小
[root@localhost floppyImage]# ls -lh initrd.img.gz
-rw-r--r-- 1 root root 403K 10 月 31 22:57
initrd.img.gz
只有 403k大小
9. 编译 linux系统内核
[root@localhost usr]# cp linux-2.4.20.bz2 /usr/src/
[root@localhost usr]# cd /usr/src
[root@localhost src]# tar xfvj linux-2.4.20.bz2
[root@localhost src]# ln -s linux-2.4.20 linux
进入 linux源代码目录:
[root@localhost src]# cd linux
清理源代码树:
[root@localhost src]# make mrproper
运行配置程序:
[root@localhost src]# make menuconfig
具体的配置信息请见该实验步骤后面附带的实验说明
10. 整合启动盘
[root@localhost floppyImage]# cp bzImage /mnt/floppy/boot/
[root@localhost floppyImage]# cp initrd.img.gz /mnt/floppy/
全部文件(文件夹)如下:
[root@localhost mnt]# tree floppy/
floppy/
|-- boot
| |-- bzImage
| `-- grub
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
19
| |-- grub.conf
| |-- menu.1st -> grub.conf
| |-- stage1
| `-- stage2
|-- initrd.img.gz
`-- lost+found
3 directories, 6 files
11. 测试
重启机器,从软盘启动后,能进入 GRUB引导程序,之后开始运行
floppylinux系统。
当系统启动之后,显示内容如图 6.18和图 6.19所示。
图 6.18
图 6.19
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
20
实验说明
1,关于 make meunconfig的具体内容
当输入 make menuconfig命令之后,系统会进入内核配置选项界面(如图 6.12)。其各个
界面内容介绍如下:
code maturity level options
先选择 N,当我们配置好常规的东西,要加入 framebuffer 支持时再将这一项选择 Y,如果不在
code maturity level options选择为 Y,将不能配置 framebuffer.
Loadable module support 选择 N 不选择可加载内核模块的支持.
processor type and features processor family 中选择 386CPU 其他选项都不要
General setup 选择 networking support,PCI support ,System V ipc ,systrl
support,kernel support for ELF ,其他不要
chnology devices (MTD) 不要
Parallel port support 不要
Plug and Play configuration 不要
block devices 选择 Normal floppy disk support ,Loopback device support ,
RAM disk support ,initial RAM disk (initrd) support ,Per
partition statics in /proc/partitions ,其他不要
Multi-device support (RAID and LVM) 默认
Cryptography support (CryptoAPI) 全部选择 N
Networking options 把之后项目编译进内核 : Packet socket :mmapped IO ,
TCP/IP networking , Telephony Support 选 择 N ,
ATA/IDE/MFM/RLL support 选择 Y,然后下面的 'IDE,ATA
and ATAPI Block Devices'按钮就被激活 。下面几项选择 Y,
其余都可以是 N.
Enhanced IDE/MFM/RLL disk/cdrom/t