Linux系统主要分为两个部分:User Space(用户空间)和kernel Space(内核空间)
用户空间包括:用户应用程序(User Application)和C 函数库(GNU C Library).
内核空间包括:系统调用接口(System Call Interface),内核(Kernel)和j架构相关的内核代码(Architechure-Dependent Kernale)。
现代CPU通常实现了不同的工作模式,以ARM为例,实现了7种工作模式:用户模式(usr)、快速中断(fiq)、外部中断(irq)、管理模式(svc)、数据访问中止(abt)、系统模式(sys)、未定义指令异常(und)。X86也实现了4个不同级别:Ring0-Ring3。Ring0下,可以执行特权指令,可以访问IO设备等,在Ring3则有很多限制。Linux系统利用了CPU的这一特性,使用了其中的两级来分别运行Linux内核与应用程序,这样使操作系统本身得到充分保护。例如:如果使用X86,用户代码运行在Ring3,内核代码运行在Ring0。
内核空间与用户空间是程序执行的两种状态,通过系统调用和硬件中断能够完成用户空间到内核空间的转移。
Linux内核主要包括:系统调用接口(System Call Interface, SCI)、进程管理(Process Management, PM)、内存管理(Memory Management, MM)、虚拟文件系统(Virtual File System, VFS)、网络协议栈(Network Stack)、CPU体系结构相关代码(Arch)、设备驱动(Device Drivers, DD)。
根据硬件和软件需求进行配置。
1,make config:基于文本模式的交互式配置,过于繁琐,通常不使用。
2,make menuconfig:基于文本模式的菜单型配置,图形化界面,简单易用。
[*]:表示配置项所对应的源文件最终编译成内核映像(如bzImage),运行在内存中
< >或[ ]:表示不编译该项。
使用空格键进行切换。
//(1)参考正在运行的Linux系统的内核配置文件,在/boot目录下的config-2.6.32-279.el6.i686
cp /boot/config-2.6.32-279.el6.i686 ./.config
//配置文件默认为.config
//(2)编译内核
make bzImage
//编译的内核文件放在./arch/x86/boot目录下,和配置文件有关。
//(3)编译内核模块
make modules
//编译的内核模块(*.ko文件)分散在各个模块的文件夹中。
make modules_install
//将分散的内核模块文件复制到/lib/modules下的以Linux内核版本号命名的目录下
//(4)打包内核模块
mkinitrd /boot/initrd-2.6.39 2.6.39
//将/lib/modules 下的2.6.39打包到/boot 目录下的initrd-2.6.39
//(5)拷贝内核映像
cp ./arch/x86/boot/bzImage/boot/vmlinuz-2.6.39
//将bzImage映像复制到/boot/目录下,命名为vnlinuz-2.6.39
(6)修改/etc/grub.conf文件
(7)重启系统
系统开始启动时,会有一个倒计时,迅速按下任意键,进入内核版本选择。
make clean:只清楚内核模块(*.ko文件)。
make distclean:将生成的配置和编译文件全部清楚。
制作嵌入式平台使用的linux内核,方法和制作PC平台的Linux内核基本一致。一般开发板厂商会提供对于本开发板的linux内核源代码,将其拷贝到linux系统中解压缩。
x86:make distclean
arm:make distclean
x86:make menuconfig
arm:make menuconfig ARCH=arm
x86:make bzImage
arm:make uImage ARCH=arm CROSS_COMPILE=arm-linux-
编译的时候可能会报错,mkimage在u-boot中的/tools/目录中,将其拷贝到/usr/bin目录下,重新编译即可成功。
编译好的uImage文件在./arch/arm/boot目录下,将其拷贝到服务器目录(/home/tftpboot)下。
//1,创建目录
mkdir rootfs
cd rootfs
mkdir bin dev etc lib proc sbin sys usr mnt tmp var
mkdir usr/bin usr/lib usr/sbin lib/modules
//2,创建设备文件
cd rootfs/dev
mknod -m 666 console c 5 1
mknod -m 666 null c 1 3
//linux系统中的设备都是以文件方式存在,存放在dev目录下;console和null设备是必须要有的。
c:表示字符设备,其后是主设备号和次设备号。
//3,添加配置文件
tar xvzf etc.tar.gz
mv -rf etc/* ./rootfs/etc/
//4,添加内核模块
cd ../Tiny6410/linux-tiny6410
make modules ARCH=arm CROSS_COMPILE=arm-linux-
make modules_install ARCH=arm INSTALL_MOD_PATH=../rootfs
Busybox是一个开源项目,遵循GPL v2协议。Busybox将众多的UNIX命令集合进一个很小的可执行程序中,可以用来替代GNU fileutils、shellutils等工具集。Busybox中各种命令与相应的GNU工具相比,所能提供的选项比较少,但是也足够一般的应用了。Busybox主要用于嵌入式系统。Busybox按模块设计,可以很容易地加入、去除某些命令,或增减命令的某些选项。在创建根文件系统的时候,如果使用Busybox的话,只需要在/dev目录下创建必要的设备节点,在/etc目录下增加一些配置文件即可,当然,如果Busybox使用动态链接,那么还需要再/lib目录下包含库文件。
(1)配置busybox
make menuconfig
(1)编译选项设置
Busybox Settings -> build Options
选中 “Build busybox as a static binary”
Cross Compiler prefix (arm-linux-)
说明:静态链接,使用arm-linux-交叉编译器。
(2) 安装选项设置
Busybox Settings -> Installation Options
选中 “Don‘t use /usr”
Busybox Installation Prefix (/…/rootfs)
说明:选中该项可以避免busybox被安装到宿主系统的/usr目录下,破坏宿主系统。并指明编译后的busybox的安装位置/…/rootfs。
(2)编译并安装
make
make install
(3)建立软连接(为内核编译做准备)
cd ../rootfs/
ln -s ./bin/busybox init
不同的文件系统类型有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为RAM和FLASH,常用的基于存储设备的文件系统类型包括:jffs2, yaffs2, ubifs, ramdisk等。
(1)配置Linux内核,支持initramfs
make menuconfig ARCH=arm
General setup --->
选中Initial RAM filesystem and RAM disk(initramfs/initrd)support
配置Initramfs source file(s) /…/rootfs
(2)编译内核
make uImage ARCH=arm CROSS_COMPILE=arm-linux-
(3)设置U-boot环境变量bootargs
setenv bootargs noinitrd console=ttySAC0,115200
ttySAC0表示控制台使用串口0,波特率是115200
(1)配置内核,支持NFS
make menuconfig ARCH=arm
(1)General setup --->
取消选中Initial RAM filesystem and RAM disk(initramfs/initrd)support
(2)File systems --->
选中Network File Systems --->
选中Root file system on NFS
(2)编译内核
make uImage ARCH=arm CROSS_COMPILE=arm-linux-
(3)启动宿主机NFS服务器
vim /etc/exports
//添加:/home/win/rootfs 192.168.3.*(rw,sync,no_root_squash)
///etc/eports用于配置NFS服务器的共享目录和权限
/etc/init.d/mfs restart
//重启nfs服务器
(4)设置U-Boot环境变量bootargs
setenv bootargs noinitrd console=ttySAC0,115200 init=/init root=/dev/nfs rw nfsroot=192.168.3.111:/home/win/rootfs,proto=tcp,nfsvers=3 ip=192.168.3.115"192.168.3.111:255.255.255.0::eth0:off
//root表明根目录使用nfs设备;nfsroot表明nfs文件系统位置;ip依次指明[开发板ip]:[nfs服务器ip]:[网关]:[子网掩码]:[开发板名称]:[网卡]:off