ARM学习笔记之驱动程序篇二----Linux内核简介及制作,文件系统的制作

1.2 Linux内核简介

1.2.1 Linux体系结构

    Linux系统主要分为两个部分:User Space(用户空间)和kernel Space(内核空间)

    用户空间包括:用户应用程序(User Application)和C 函数库(GNU C Library).

    内核空间包括:系统调用接口(System Call Interface),内核(Kernel)和j架构相关的内核代码(Architechure-Dependent Kernale)。

                                      ARM学习笔记之驱动程序篇二----Linux内核简介及制作,文件系统的制作_第1张图片

   

        现代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.2 Linux内核架构

Linux内核主要包括:系统调用接口(System Call Interface, SCI)、进程管理(Process Management, PM)、内存管理(Memory Management, MM)、虚拟文件系统(Virtual File System, VFS)、网络协议栈(Network Stack)、CPU体系结构相关代码(Arch)、设备驱动(Device Drivers, DD)。

                                          ARM学习笔记之驱动程序篇二----Linux内核简介及制作,文件系统的制作_第2张图片               

1.3 Linux内核配置与编译

根据硬件和软件需求进行配置。

1,make config:基于文本模式的交互式配置,过于繁琐,通常不使用。

2,make menuconfig:基于文本模式的菜单型配置,图形化界面,简单易用。

               ARM学习笔记之驱动程序篇二----Linux内核简介及制作,文件系统的制作_第3张图片 

[*]:表示配置项所对应的源文件最终编译成内核映像(如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文件

添加如下信息: 
                          ARM学习笔记之驱动程序篇二----Linux内核简介及制作,文件系统的制作_第4张图片

(7)重启系统

系统开始启动时,会有一个倒计时,迅速按下任意键,进入内核版本选择。

                        ARM学习笔记之驱动程序篇二----Linux内核简介及制作,文件系统的制作_第5张图片

2,清理内核

        make clean:只清楚内核模块(*.ko文件)。

        make distclean:将生成的配置和编译文件全部清楚。

 

1.4 嵌入式linux内核制作

      制作嵌入式平台使用的linux内核,方法和制作PC平台的Linux内核基本一致。一般开发板厂商会提供对于本开发板的linux内核源代码,将其拷贝到linux系统中解压缩。

1,清除原有配置与中间文件

x86:make distclean

arm:make distclean

2,配置内核

x86:make menuconfig

arm:make menuconfig ARCH=arm

3,编译内核

x86:make bzImage

arm:make uImage ARCH=arm CROSS_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是一个开源项目,遵循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

1.5.2 挂载根文件系统到内核

    不同的文件系统类型有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为RAM和FLASH,常用的基于存储设备的文件系统类型包括:jffs2, yaffs2, ubifs, ramdisk等。

1,使用Initramfs

(1)配置Linux内核,支持initramfs

 make menuconfig ARCH=arm

General setup --->

选中Initial RAM filesystem and RAM disk(initramfs/initrd)support

配置Initramfs source file(s)   /…/rootfs

ARM学习笔记之驱动程序篇二----Linux内核简介及制作,文件系统的制作_第6张图片

(2)编译内核

make uImage ARCH=arm CROSS_COMPILE=arm-linux-

(3)设置U-boot环境变量bootargs

setenv bootargs noinitrd console=ttySAC0,115200

ttySAC0表示控制台使用串口0,波特率是115200

2,使用NFC(网络文件系统)

(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

ARM学习笔记之驱动程序篇二----Linux内核简介及制作,文件系统的制作_第7张图片

(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

 

 

 

你可能感兴趣的:(ARM学习笔记)