华清远见嵌入式学习day29——Kenerl

复习


1. uboot 命令
    reset
    tftp
    mmc dev 
    mmc info 
    mmc write 
    mmc read 
    mmc erase
    
    uboot 配置交叉编译工具
        Makefile
    uboot 配置
        make boardname_config
        include/config.h
        include/config.mk
    uboot 编译
        make / make all 
        make -j4  V=1
    uboot 清除
        make clean        .o     
        make mrproper    .o  + 配置文件
        make distclean  .o  + 配置文件 +  .bak ..
        
    芯片启动流程

***********************************
1. uboot启动流程详解
    1. 连接脚本三个作用  u-boot.lds
        1. 指定入口地址
        2. 目标文件的连接顺序
        3. 指定连接地址 
    2. 根据入口地址开始 _start 开始分许uboot启动流程
    3. arch/arm/cpu/armv8/s5p6818/start.S

    第一阶段: 汇编阶段
        1. 设置SVC模式,
        2. 关中断,关看门狗,设置中断向量表
        3. 关cache, mmu
        4. 初始化时钟,内存,
        5. 完成自搬移
        6. 初始化C语言运行环境 (栈sp,bss段)

    第二阶段: C语言阶段
        1. 完成大部分硬件初始化
            串口,i2c, mmc, net,
            等大部分硬件初始化
        2. 进入 3 2 1 倒计时
        3. 读取bootcmd环境变量,    
            进入自启动模式

2. uboot内存分布


3. 自定义uboot命令
    1. 创建 cmd_aaa.c
        $ touch common/cmd_aaa.c
    2. 在中 common/cmd_aaa.c    输入如下代码                                                                 
        $ vi common/cmd_aaa.c
            #include <common.h>
            #include <command.h>

            static int do_aaaa(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
            {   
                printf("hello world\n");
                return 1;
            }

            #define func(a) int a=1
            func(b);  //int b=1;

            U_BOOT_CMD(
                aaaa,        // 命令的名字
                2,            // 命令参数个数
                0,          // 是否支持重复
                do_aaaa,    // 命令对应的函数
                "simple display",    // 简单的描述
                // 详细描述信息
                "   - print brief description of all commands asdfafasdf\n" 
            );
    3. 修改 Makfile 将 cmd_aaaa.c 编译进入 uboot
        $ vi common/Makefile 
            添加 如下一行
          obj-y += cmd_aaaa.o
        
    4. 重新编译uboot
        $ make 
           ...
        CC      common/board_f.o
        CC      common/cmd_aaaa.o        // 出现这一行 表示已经编译进入uboot
        CC      common/cmd_version.o
           ...
    5. 烧写 win-uboot.bin 到 SD 卡
    6. 用SD卡驱动 开发板
    7. 进入uboot 交互模式 输入命令行
        FS6818# aaaa
        hello world            //  出现这个表示成功
        FS6818# 

4. linux内核 和 Ubuntu的关系
    Ubuntu的内核使用的是 linux kernel 
    Ubuntu 包括了 kernel内核,桌面管理,应用软件等

5. linux内核的特点
    1. 支持多种平台和架构 ARM X86
    2. linux内核的可移植性和可裁剪性
    3. linux内核是开源
    4. linux内核采用模块化的设计
    5. linux内核采用了分层的思想

5. linux 内核的作用
    1. 多任务调度功能
    2. 网络协议
    3. 文件系统管理
    4. 内存管理
    5. 硬件驱动管理

6. 如何获取linux内核
    1. linux官网获取
        https://mirrors.edge.kernel.org/pub/linux/kernel/
    2. 开发板厂家
    3. 芯片厂家获取

7. linux内核的版本号的定义
    主版本号.次版本号.修订版本号

    次版本号:如果为偶数,代表稳定版,
        如果为奇数,代表测试版
    修订版本号:只要更新了代码,
        次版本号就要相应的更新

8. 内核的配置和编译
    配置交叉编译工具 :
        1. 修改顶层目录下  Makefile
                ARCH        ?= $(SUBARCH)
                CROSS_COMPILE    ?= $(CONFIG_CROSS_COMPILE:"%"=%)
                修改为:
                ARCH        ?= arm
                CROSS_COMPILE   ?= arm-none-linux-gnueabi-
        ------------------------------
            扩展学习
        2. make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
        3. export CROSS_COMPILE=arm-none-linux-gnueabi-
    
    配置内核支持fs6818平台
        make fs6818_defconfig
    
        相当于  1. cp arch/arm/configs/fs6818_defconfig .config
                2. make menuconfig

        其实就是在源码的顶层目录下生成一个.config文件
        
    图形化配置  
        make menuconfig
        
        1. 安装图形库 sudo apt-get install libncurses5-dev 
        2.  sudo apt-get install flex 
            sudo apt-get install bison
        3. 终端太小错误提示
    4. linux内核的编译
        make uImage
        make uImage -j2
        
        -j2 : 多核编译
        
        出现如下错误:
            1. "mkimage" command not found - U-Boot images will not be built
                make[1]: *** [arch/arm/boot/uImage] Error 1
                make: *** [uImage] Error 2
        u-boot-2014-07 $ cp  ./tools/mkimage  /usr/bin

    5. 清除编译的三个等级
        make clean        // 清除编译生成的所有目标文件
        make mrproper    // 清除目标文件  +  配置文件
        make distclean    // 清除目标文件  +  配置文件  +  备份文件

9. 内核的目录结构
    arch  体系结构相关代码
    include  头文件
    drivers  各种驱动代码
    lib         解压压缩代码,红黑树算法,md5, 字符串处理
    fs         文件系统代码
    net      网络协议代码
    ipc      进程间通信内核支持代码
    mm          内存管理
    kernel   进程创建,调度
    init      内核启动之初的初始化代码
    scripts     编译脚本
    Documentation  开发文档

10. 执行过程详解  make fs6818_defconfig
    
 491 %config: scripts_basic outputmakefile FORCE
 492     $(Q)mkdir -p include/linux include/config
 493     $(Q)$(MAKE) $(build)=scripts/kconfig $@

    @make -f scripts/Makefile.build obj=scripts/kconfig fs6818_defconfig
    
 95 %_defconfig: $(obj)/conf
 96     $(Q)$< --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)

    @conf --defconfig=arch/arm/configs/fs6818_defconfig Kconfig

11. 执行过程详解  make menuconfig 

 491 %config: scripts_basic outputmakefile FORCE
 492     $(Q)mkdir -p include/linux include/config
 493     $(Q)$(MAKE) $(build)=scripts/kconfig $@

    @make -f scripts/Makefile.build obj=scripts/kconfig menuconfig
    
 20 menuconfig: $(obj)/mconf
 21     $< $(Kconfig)
    
    $(obj)/mconf  Kconfig

12. 配置菜单语法说明
    1. config  SYMBOL
            [类型值]    bool/tristate/string/hex/int
            [提示字符]    prompt
            [默认值]    default     
            [依赖]        depends on     SYMBOL
            [反向依赖]  select    SYMBOL
            [帮助]        help/---help---        帮助信息

    2. if SYMBOL
       endif  # SYMBOL

    3. menu "提示字符"
            depends on SYMBOL
       endmenu 

    4. choice 
            prompt  "提示字符"
            depends on  SYMBOL
            default    SYMBOL
       endchoice

    5. comment  "提示字符" 

    6. source 

13. 自己添加一个符号选项,并将一个.c文件编译到内核中
    1. 写一个.c文件 
        在driver/char目录下创建一个test.c 

    2. 修改Makefile 
        在driver/char目录下打开Makefile
        添加一下内容
        obj-$(CONFIG_NOZUONODEI_TEST) += test.o 

    3. 添加菜单选项
        在driver/char目录下打开Kconfig 
         config NOZUONODEI_TEST                      
             bool  "no zuo no dei!"
             default y
             help
                 This is test code!~

    执行make menuconfig  
    输入"/",弹出搜索界面, 用于搜索符号
    输入要搜索的内容“NOZUONODEI_TEST”
    
     Symbol: NOZUONODEI_TEST [=y]
     Type  : boolean
     Prompt: no zuo no dei!
       Defined at drivers/char/Kconfig:12
       Location:
         -> Device Drivers
           -> Character devices

14. 自己添加一个符号选项,并将一个.c文件编译到成 ko
    <*>:编译到内核
    < >:不编译到内核
    <M>:以模块化的方式进行编译
        需要运行的时候,直接加载驱动,
        不需要运行的时候直接卸载你的驱动

    最终编译生成***.ko
    
    insmod  ***.ko  加载到内核
    rmmod  ***   从内核中卸载

     1. 写一个.c文件 
        在driver/char目录下创建一个test.c 
    
     2. 修改Makefile 
        在driver/char目录下打开Makefile
        添加一下内容
        obj-$(CONFIG_NOZUONODEI_TEST) += test.o 
    
     3. 添加菜单选项
        在driver/char目录下打开Kconfig 
           4 menu "No-zuo-no-dei"
              5 config NOZUONODEI_TEST
              6     tristate  "no zuo no dei!"
              7     default y
              8     help 
              9         This is test code!~
             10 endmenu
    
        执行make menuconfig  
        输入"/",弹出搜索界面,
        输入要搜索的内容“NOZUONODEI_TEST”
           Symbol: NOZUONODEI_TEST [=m]            
           Type  : boolean           
           Prompt: no zuo no dei!               
             Defined at drivers/char/Kconfig:5       
             Location:                   
               -> Device Drivers                          
                 -> No-zuo-no-dei  
    4. 对内核进行编译
        使用命令  make modules

          LD [M]  drivers/char/test.ko


15. 总结:Kconfig .config  Makefile  文件之间的关系


16. 内核的编译流程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值