树莓派(三):Bootloader,Linux内核配置编译,Linux文件系统

嵌入式系统启动过程

        电源----BootLoader----Linux内核----文件系统----应用程

 BootLoader

        引导操作系统启动,启动大多分为两个阶段:

        一阶段主要依赖于CPU的体系结构硬件初始化的代码,通常都用汇编语言来实现。

        硬件初始化(屏蔽所有的中断、关闭处理器内部指令/数据Cache等)。
        固态存储媒质中,复制Bootloader二阶段代码到RAM。
        预备RAM空间。
        设置堆栈。 

        二阶段C语言完成,实现复杂的功能,程序有更好的可读性和可移植性。

        初始化硬件。
        检测系统内存映射。
        内核映像和根文件系统映像从Flash读到RAM。
        为内核设置启动参数。
        调用内核。

        为什么要关闭Cache?

        使用Cache以及buffer提高系统性能,由于Cache的使用改变访问主存的数量、类型和时间,Bootloader通常是不需要的跳转到第二阶段的C程序入口点

Linux源码目录    

        arch:硬件体系结构相关的代码。包括kernel(内核核心部分)、mm(内存管理)、math-emu(浮点单元仿真)、lib(硬件相关工具函数)、boot(引导程序)、pci(PCI总线)和power(CPU相关状态)。
 
        block:部分块设备驱动程序。
 
        crypto:常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法。
 
        Documentation:关于内核各部分的通用解释和注释。
 
        drivers:设备驱动程序,每个不同的驱动占用一个子目录。
 
        fs:各种支持的文件系统,如ext、fat、ntfs等。
 
        include:头文件。系统相关的头文件被放置在linux子目录下。
 
        init:内核初始化代码(注意不是系统引导代码)。
 
        ipc:进程间通信的代码。
 
        kernel:内核的最核心部分,包括进程调度、定时器等,和平台相关的一部分代码放在arch/*/kernel目录下。
 
        lib:库文件代码。
 
        mm:内存管理代码,和平台相关的一部分代码放在arch/*/mm目录下。
 
        net:网络相关代码,实现了各种常见的网络协议。
 
        scripts:用于配置内核文件的脚本文件。
 
        security:主要是一个SELinux的模块。
 
        sound:常用音频设备的驱动程序等。
 
        usr:实现了一个cpio(文件备份程序及文件格式)。

树莓派Linux源码配置(ubuntu18.04)

        内核配置方式:copy已发布的config,依据已发布的config配置(make menuconfig)

        驱动加载的两种方式:编译进内核(zImage内),生成moudle启动后加载(insmod)

        

解压源码包
unzip linux-rpi-4.14.y.zip

内核配置
cd linux-rpi-4.14.y
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig

ARCH:指定架构
CROSS_COMPILE:指定编译工具(提前做好环境变量)
KERNEL:内核版本
make:配置命令
后缀为内核文件

树莓派Linux内核编译(ubuntu18.04)

搭建编译环境
sudo apt-get install -y  bc l libncurses5-dev libncursesw5-dev zlib1g:i386 libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5

编译
cd /root/linux-rpi-4.14.y
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs
																			
j4: 指定编译资源
zImage:生成内核镜像(arch/arm/boot/)
modules:生成驱动模块
dtbs:生成配置文件
生成vmlinux

打包镜像
cd /root/linux-rpi-4.14.y
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img

挂载树莓派SD卡
cd /root
mkdir fat ext4
mount /dev/sdb1 fat  
mount /dev/sdb2 ext4  

fat分区是boot相关,kernel_img
ext4分区是系统的根目录分区

安装modules, 设备驱动文件(hdmi,usb ,wifi,io...)
/root/linux-rpi-4.14.y
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/root/ext4 modules_install

备份
备份树莓派原有镜像(fat)
cd /root/fat/
cp kernel7.img kernel7_old.img
拷贝新的镜像为树莓派镜像(fat)
cp /root/linux-rpi-4.14.y/kernel_new.img /root/fat/kernel7.img

拷贝配置文件
cp /root/linux-rpi-4.14.y/arch/arm/boot/dts/.*dtb* /root/fat/
cp /root/linux-rpi-4.14.y/arch/arm/boot/dts/overlays/.*dtb* /root/fat/
cp /root/linux-rpi-4.14.y/arch/arm/boot/dts/overlays/README /root/fat/

取消挂载,重启树莓派查看内核

树莓派(三):Bootloader,Linux内核配置编译,Linux文件系统_第1张图片

 linux文件系统

    文件系统
        文件系统是操作系统用于明确存储设备组织文件的方法。即文件管理系统,简称文件系统。   

    文件系统分类
        FAT VFAT NTFS EXT1/2/3/4 HFS等(df -T)        
        vfat:boot(bootloader, kernel)
        ext4:根目录
        tmpfs:内存文件系统

    文件目录结构
      
        /bin:二进制文件目录,含系统启动和运行的命令。

        /boot:启动Linux系统所需的文件,如内核文件和启动加载程序。

        /dev:设备文件目录,含与硬件设备相关的文件。

        /etc:配置文件目录,含系统的各种配置文件。

        /home:用户主目录。

        /lib:系统库文件目录,含运行基本命令和程序所需的库文件。

        /media:可移动媒体设备挂载目录,包括U盘、光盘等。

        /mnt:挂载目录,用于临时挂载其他文件系统。

        /opt:可选应用程序目录,含第三方应用程序。

        /proc:虚拟文件系统目录,当前运行的系统进程信息和内核状态信息。

        /root:超级用户的主目录。

        /run:系统运行时的临时文件目录。

        /sbin:系统管理员命令目录,含系统管理命令。

        /srv:服务数据目录,含与特定服务相关的数据文件。

        /sys:虚拟文件系统目录,含系统硬件设备相关的信息。

        /tmp:临时文件目录,用于存放一些临时文件。

        /usr:用户程序和数据目录,含系统安装的应用程序和用户数据文件。

        /var:可变数据目录,含系统运行过程中的可变数据,如日志文件和缓存文件等。

    分区 
        嵌入式系统分为4个区:
                bootloader:启动代码
                para:启动代码向内核传递参数的位置
                kernel:内核分区
                根分区等

    虚拟文件系统
        vfs是对各种文件系统的一个抽象,它为各种文件系统提供了一个通用的接口。不管文件类型,不管文件是磁盘还是设备,都只用open, read,write统一操作。

你可能感兴趣的:(linux,嵌入式硬件)