1.2Linux内核简介1.2.1Linux体系结构

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)。

linux内核映像文件_内核映像文件时_内核映像文件是什么

1.3Linux内核配置与编译

按照硬件和软件需求进行配置。

1,makeconfig:基于文本模式的交互式配置,过分冗长,一般不使用。

2linux内核映像文件,makemenuconfig:基于文本模式的菜单型配置,图形化界面,简单易用。

linux内核映像文件_内核映像文件是什么_内核映像文件时

[*]:表示配置项所对应的源文件最终编译成内核映像(如bzImage),运行在显存中

:表示配置项对应的源文件最终编译成内核模块(*.ko文件),倒入硬碟中,在须要时调用。

linux内核映像文件_内核映像文件时_内核映像文件是什么

或[]:表示不编译该项。

使用空格键进行切换。

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文件

添加如下信息:

内核映像文件时_linux内核映像文件_内核映像文件是什么

(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、shellutils等工具集。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

linux内核映像文件_内核映像文件时_内核映像文件是什么

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

本文原创地址:https://www.linuxprobe.com/lnhjglnhyyhk.html编辑:刘遄,审核员:暂无