树莓派高阶开发

1. 树莓派等芯片带操作系统的启动过程

        C51,STM32(裸机)》》》》》》C直接操控底层寄存器实现相关业务。  业务流程型的裸机代码

                           遥控灯: while(1)

                           垃圾桶:WemosD1 LOOP

                           恩智浦智能车: stm32

       

        X86,Intel   windows

        启动过程:  电源 -》 BIOS -》windows内核-》C,D盘-》 程序启动(QQ)

        嵌入式产品: 树莓派,mini2440, mini6410,nanopi,海思,RK(瑞芯微)------人脸识别打卡器,智能家居主控。。。

        启动过程:  电源-》BootLoader(引导操作系统启动)-》Linux内核-》文件系统(根据功能性来组织文件夹,带访问权限)-》KTV点歌机,

   

        安卓

        启动过程:  电源-》 fastBoot/Bootloader/-》linux内核-》文件系统-》虚拟机-》HOME应用程序-》点某图标打开某APP

        BootLoader:   一阶段 让CPU  跟内存,FLASH, 串口,IIC,IIS, 数据段,打交道,驱动这些设备(汇编和C结合)

                       二阶段: 引导Linux内核启动 (纯C)

2. 树莓派Linux源码目录树分析

arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录。和32位PC相关的代码存放在i386目录下,其中比较重要的包括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。
 
在i386体系下,系统引导将从arch/i386/kernel/head.s开始执行,并进而转移到init/main.c中的main()函数初始化内核。

      大约1.3w个C文件  1100w行代码

      Linux是开源,免费,LInux开源社区工作者共同维护,爱好

            Linux是一个开源的,支持多架构多平台代码  =非常牛逼

            可以执行非常高

            但是Linux内核编译出来一般就几M.   4M

            因为支持多平台,多架构,所以编译之前要配置,配置成适合的目标平台来用

            ARM

                海思 友善之臂 RK 树莓派 nanoPi

            X86

            PowerPC

            MIPS

3. 树莓派Linux源码配置

            驱动代码的编写

                驱动代码的编译需要一个提前编译好的内核

                   编译内核就必须配置

            配置的最终目标会生成 .config文件,该文件指导Makefile去把有用东西组织成内核

   

                厂家配linux内核源码,比如说买了树莓派,树莓派linux内核源码

            第一种方式:

                cp 厂家.config .config

            第二种方式:

                make menuconfig 一项项配置,通常是基于厂家的config来配置

            第三种方式:

                完全自己来

            如何配置树莓派的Linux内核

            驱动两种加载方式:

                * 编译进内核  zImage包含了驱动

                M 模块方式生成驱动文件xxx.ko  系统启动后,通过命令inmosd xxx.ko 加载

            内核配置:

            ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig

            指定ARM架构   指定编译器                                           树莓派                   主要核心指令

4. 树莓派Linux内核编译

           

            4.1 编译:

            ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs

                                                                          指定用多少电脑资源进行编译

                                                                          zImage生成内核镜像

                                                                          modules要生成驱动模块

                                                                          dtbs生成配置文件

            4.2 编译成功后,看到源码树目录多了vmlinux,失败则无此文件

            成功后,目标zImage镜像arch/arm/boot底下

            4.3 打包zImage成树莓派可用的xxx.img

            ./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img

            4.4 数据拷贝

                mkdir data1 data2

                挂载U盘

                sudo mount /dev/sdb1 data1   一个fat分区,是boot相关的内容,kernel的img

                sudo mount /dev/sdb2 data2   一个是ext4分区,也就是系统的根目录分区。

                安装modules, 设备驱动文件: hdmi usb wifi io ...             

sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/chenlc/data2 modules_install

                安装更新 kernel.img 文件,注意镜像名字是kernel7.img

                先备份

                   cd /home/chenlc/data1

                   cp kernel7.img kernel7OLD.img

                再把编译新生成的拷贝到data1,起名kernel7.img

                   cp kernel_new.img /home/chenlc/data1/kernel7.img

                拷贝配置文件         

cp arch/arm/boot/dts/.*dtb* /home/chenlc/data1  
cp arch/arm/boot/dts/overlays/.*dtb* /home/clenlc/data1/overlays/
cp arch/arm/boot/dts/overlays/README /home/lbw/data1/overlays/  

5. 文件系统

    1. 什么是文件系统?

            常规认知: 根目录

        文件系统是操作系统用于明确存储设备组织文件的方法。

        以上说的方法:就是文件管理系统(程序),简称文件系统

    2. 文件系统(文件管理系统的方法)的种类有哪些?

        FAT VFAT NTFS EXT1/2/3/4 HFS ....

        树莓派查看文件系统的命令: df -T

        vfat  :  boot(bootloader, kernel)

        ext4  :  根目录

        tmpfs : 内存文件系统

    3. 什么是分区?

        windows: 随意(面向普通用户PC),目录即分区

            C(装系统的位置)也可以随意在C盘存放文件.    D盘(用户随意发挥)

        Linux: 按照功能来分区,每个分区严格存放文件(开发者)  

            嵌入式系统可以分为4个区,分别是

            bootloader、  启动代码

            para、        启动代码向内核传递参数的位置

            kernel、        内核分区

            根分区等      文件系统结构

    2. 什么是文件系统目录结构?

            常规认知: 根目录,不是分区,和windows不同

/ 所有linux操作系统的顶点目录,不像windows,每个分区都有一个顶点目录
/boot 存放系统启动时相关的文件,比如kernel内核,grub引导菜单.(不要删除.)
/bin 存放的都是命令,但仅普通用户能执行
/sbin 超级管理员能执行的命令.
/home 存放普通用户的家目录
/root 超级管理员的家目录,普通用户是无法进入
/etc 存放配置文件的目录,
/etc/hostname 主机名
/etc/hosts 本地解析域名一种方式
/etc/sysconfig/network-script/ifcfg-* 网卡的配置文件
/dev 设备目录,硬盘\硬盘的分区\光盘.....
/dev/null 黑洞,接收所有的东西,只进不出
/dev/zero 摇钱树,可以生产源源不断的数据
/dev/random 产生随机数的一个设备
/dev/pts/0 虚拟的Bash Shell终端,提供给远程用户使用 0,代表一个终端 1代表2个终端 以此类推
/usr 类似于windows的C盘下面的windows目录
/usr/lib 共享库文件,后缀都是so结尾, share object
/usr/lib64 共享库文件64位,后缀都是so结尾, share object
/usr/local 早起大家都把软件放在这个目录下,和windows C:\ProgramFile
/usr/bin
/usr/sbin
/var 存放一些可变化的内容,比如/var/log日志,可以人为让其发生变化,也或者是随着时间推移产生变化
/tmp 存放临时文件,无论哪个用户都可以放
/proc 反馈当前运行的进程的状态信息.
/run 存放程序运行后所产生的pid文件
/media
/mnt 提供挂载的一个目录
/opt 早期第三方厂商的软件存放的目录.
/srv 物理设备产生的一些文件

在 Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。
/etc: 这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。
/bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在/bin/ls 目录下的。
值得提出的是,/bin, /usr/bin 是给系统用户使用的指令(除root外的通用户),而/sbin, /usr/sbin 则是给root使用的指令。
/var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在/var/log 目录下,另外mail的预设放置也是在这里。    

    2. 什么虚拟文件系统Virtual File System ?

            vfs就是对各种文件系统的一个抽象,它为各种文件系统提供了一个通用的接口,

   

    3. 虚拟文件系统有什么作用?

        简化应用程序员的开发

            不管是什么文件类型,不管文件是磁盘还是设备,都只用open read write统一操作

6.内核驱动框架基本

        a.驱动代码编写        参考pin4test.c

        b.内核驱动编译

                a1.  把驱动代码拷贝到 driver/char

                a2.  修改Makefile,告诉编译器,要编译该驱动文件

                a3.

ARCH=arm CROSS_COMPILE=arm-linux=gnueabihf- KERNEL=kernel7 make modules

7.驱动测试步骤

内核驱动装载:sudo insmod xxx.ko

内核驱动卸载: sudo rmmod xxx 不需要写ko

查看内核模块:lsmod

验证步骤:

        a.装载驱动

        b.驱动装载后生成设备 比如/dev/pin4,通过sudo chmod 666 /dev/pin4添加访问权限

        c.运行测试程序调用驱动

        d.内核的printk是内核层的printf,通过dmesg查看打印信息

8.地址

        1.总线地址

地址总线 (Address Bus;又称:位址总线) 属于一种电脑总线 (一部份),是由CPU 或有DMA 能力的单元,用来沟通这些单元想要存取(读取/写入)电脑内存元件/地方的实体位址。

通俗点来讲就是CPU能够访问内存的范围。
表现得现象有:
装了32位的win7的系统,明明内存条8G,可是系统只识别了3.8G ,装了64位系统才能识别8G
因为 32位操作系统只能表示/访问:4294967296 bit
bit 4,294,967,296
Kb 4,192,304
Mb 4096
Gb 4
树莓派 1G 949M

        2.物理地址

在存储器里以字节为单位存储信息,为正确地存放或取得信息,每一个字节单元给以一个唯一的存储器地址,称为物理地址(Physical Address),又叫实际地址或绝对地址。

        3.虚拟地址

虚拟地址是Windows程序时运行在386保护模式下,这样程序访问存储器所使用的逻辑地址称为虚拟地址,与实地址模式下的分段地址类似,虚拟地址也可以写为“段:偏移量”的形式,这里的段是指段选择器。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从入门到捕蛇者说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值