Linux主要分为两个部份:UserSpace(用户空间)和kernelSpace(内核空间)
用户空间包括:用户应用程序(UserApplication)和C函数库(GNUCLibrary).
内核空间包括:系统调用插口(SystemCallInterface),内核(Kernel)和j构架相关的内核代码(Architechure-DependentKernale)。
现代CPU一般实现了不同的工作模式,以ARM为例,实现了7种工作模式:用户模式(usr)、快速中断(fiq)、外部中断(irq)、管理模式(svc)、数据访问终止(abt)、系统模式(sys)、未定义指令异常(und)。X86也实现了4个不同级别:Ring0-Ring3。Ring0下,可以执行特权指令,可以访问IO设备等,在Ring3则有好多限制。Linux系统借助了CPU的这一特点,使用了其中的两级来分别运行Linux内核与应用程序,这样使操作系统本身得到充分保护。诸如:假如使用X86,用户代码运行在Ring3,内核代码运行在Ring0。
内核空间与用户空间是程序执行的两种状态,通过系统调用和硬件中断才能完成用户空间到内核空间的转移。
1.2.2Linux内核构架
Linux内核主要包括:系统调用插口(SystemCallInterface,SCI)、进程管理(ProcessManagement,PM)、内存管理(MemoryManagement,MM)、虚拟文件系统(VirtualFileSystem,VFS)、网络合同栈(NetworkStack)、CPU体系结构相关代码(Arch)、设备驱动(DeviceDrivers,DD)。
1.3Linux内核配置与编译
按照硬件和软件需求进行配置。
1,makeconfig:基于文本模式的交互式配置,过分冗长,一般不使用。
2linux内核映像文件,makemenuconfig:基于文本模式的菜单型配置,图形化界面,简单易用。
[*]:表示配置项所对应的源文件最终编译成内核映像(如bzImage),运行在显存中
:表示配置项对应的源文件最终编译成内核模块(*.ko文件),倒入硬碟中,在须要时调用。
或[]:表示不编译该项。
使用空格键进行切换。
1.3.2编译内核1,流程
//(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)重启系统
系统开始启动时,会有一个倒计时,迅速按下任意键,步入内核版本选择。
2,清除内核
makeclean:只清楚内核模块(*.ko文件)。
makedistclean:将生成的配置和编译文件全部清楚。
1.4嵌入式linux内核制做
制做嵌入式平台使用的linux内核,技巧和制做PC平台的Linux内核基本一致。通常开发板厂商会提供对于本开发板的linux内核源代码,将其拷贝到linux系统中解压缩。
1,去除原有配置与中间文件
x86:makedistclean
arm:makedistclean
2,配置内核
x86:makemenuconfig
arm:makemenuconfigARCH=arm
3linux内核映像文件,编译内核
x86:makebzImage
arm:makeuImageARCH=armCROSS_COMPILE=arm-linux-
编译的时侯可能会报错,mkimage在u-boot中的/tools/目录中,将其拷贝到/usr/bin目录下,重新编译即可成功。
编译好的uImage文件在./arch/arm/boot目录下,将其拷贝到服务器目录(/home/tftpboot)下。
4,启动开发板即可启动1.5根文件系统制做1.5.1构建根文件系统目录和文件
//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
5,编译/安装busybox
Busybox是一个开源项目,遵守GPLv2合同。Busybox将诸多的UNIX集合进一个很小的可执行程序中,可以拿来取代GNUfileutils、utils等工具集。Busybox中各类与相应的GNU工具相比,所能提供的选项比较少,而且也足够通常的应用了。Busybox主要用于嵌入式系统。Busybox按模块设计,可以很容易地加入、去除个别,或增减命令的个别选项。在创建根文件系统的时侯,假如使用Busybox的话,只须要在/dev目录下创建必要的设备节点,在/etc目录下降低一些配置文件即可,其实,假如Busybox使用动态链接,这么还须要再/lib目录下包含库文件。
(1)配置busybox
makemenuconfig
(1)编译选项设置
BusyboxSettings->buildOptions
选中“Buildbusyboxasastaticbinary”
CrossCompilerprefix(arm-linux-)
说明:静态链接,使用arm-linux-交叉编译器。
(2)安装选项设置
BusyboxSettings->InstallationOptions
选中“Don‘tuse/usr”
BusyboxInstallationPrefix(/…/rootfs)
说明:选中该项可以防止busybox被安装到寄主系统的/usr目录下,破坏寄主系统。并指明编译后的busybox的安装位置/…/rootfs。
(2)编译并安装
make
makeinstall
(3)构建软联接(为内核编译做打算)
cd ../rootfs/
ln -s ./bin/busybox init
1.5.2挂载根文件系统到内核
不同的文件系统类型有不同的应用场合。在嵌入式Linux应用中,主要的储存设备为RAM和FLASH,常用的基于储存设备的文件系统类型包括:jffs2,yaffs2,ubifs,ramdisk等。
1red hat linux,使用Initramfs
(1)配置Linux内核redhat linux 9.0,支持initramfs
makemenuconfigARCH=arm
Generalsetup--->
选中InitialRAMfilesystemandRAMdisk(initramfs/initrd)support
配置Initramfssourcefile(s)/…/rootfs
(2)编译内核
makeuImageARCH=armCROSS_COMPILE=arm-linux-
(3)设置U-boot环境变量bootargs
setenvbootargsnoinitrdconsole=ttySAC0,115200
ttySAC0表示控制台使用并口0,码率是115200
2,使用NFC(网路文件系统)
(1)配置内核,支持NFS
makemenuconfigARCH=arm
(1)Generalsetup--->
取消选中InitialRAMfilesystemandRAMdisk(initramfs/initrd)support
(2)Filesystems--->
选中NetworkFileSystems--->
选中RootfilesystemonNFS
(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
本文原创地址://lrxjmw.cn/lnhjglnhyyhk.html编辑:刘遄,审核员:暂无