linux驱动学习(三)之uboot与内核编译

需要板子一起学习的可以这里购买(含资料):点击跳转

GEC6818内核源码下载:点击跳转

一、环境配置         

        由于GEC6818对应是64位系统,虚拟机中的linux系统也要是64位,比如:ubuntu16.04.rar
   
   但是,ubuntu16.04.rar系统,对虚拟机有要求:
   打开ubuntu16.04.vmx查看对虚拟机的要求:
   virtualHW.version = "12" ----- VM为12
   如果说电脑上的VM低于12,不要重新安装VM,
   virtualHW.version = "10"

二、源码拷贝

        把6818GEC.tar.gz拷贝到linux系统下,不能采用文件共享来在windows下编译uboot和内核

第一步:拷贝源码到linux的家目录下

第二步:解压源码

sudo tar zxvf 6818GEC.tar.gz

第三步:修改源码的权限

chmod 777 6818GEC

第四步:查看源码的目录内容

$ ls -l
total 40
drwxrwxr-x 15 gec gec 4096 Feb 15  2017 buildroot
drwxrwxr-x 20 gec gec 4096 Jul 17  2017 GEC6818uboot ---->开发板Uboot的源码
drwxrwxr-x 25 gec gec 4096 Jul 17  2017 kernel ---> 开发板内核的源码
drwxrwxr-x  3 gec gec 4096 Jul 18  2016 linux
-rwxrwxr-x  1 gec gec 6019 Jul 17  2017 mk ---> 脚本
drwxrwxr-x  5 gec gec 4096 Dec 21  2016 out ----> UBOOT和内核的输出
drwxrwxr-x  3 gec gec 4096 Jul 18  2016 prebuilts ---> 编译uboot与内核使用到的工具链
drwxrwxr-x  3 gec gec 4096 Jul 18  2016 prototype
drwxrwxr-x  3 gec gec 4096 Feb 14  2017 tools

三、mk脚本分析

1) 关于路径变量
    BS_DIR_TOP=$(cd `dirname $0` ; pwd) ----> gec@ubuntu:~/6818GEC$ ./mk 1 2 3 1  ./mk 相当于 $0
                              $() ----->提取内容,并且把内容赋值给变量BS_DIR_TOP
                                 gec@ubuntu:~/6818GEC$ pwd
                                /home/gec/6818GEC
                                BS_DIR_TOP=/home/gec/6818GEC
    BS_DIR_RELEASE=${BS_DIR_TOP}/out/release
    BS_DIR_TARGET=${BS_DIR_TOP}/out/target/product/GEC6818/
    BS_DIR_UBOOT=${BS_DIR_TOP}/GEC6818uboot  ----> uboot的路径
    BS_DIR_KERNEL=${BS_DIR_TOP}/kernel ----> 内核的路径
    BS_DIR_BUILDROOT=${BS_DIR_TOP}/buildroot
    
    以上都是变量进行赋值

2)关于路径变量
  BS_CROSS_TOOLCHAIN_BOOTLOADER=${BS_DIR_TOP}/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-
  BS_CROSS_TOOLCHAIN_KERNEL=${BS_DIR_TOP}/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-
  以上都是工具逻的路径

3) Target Config
    BS_CONFIG_BOOTLOADER_UBOOT=GEC6818_config  ---->编译uboot要使用到的配置文件
    BS_CONFIG_KERNEL=GEC6818_defconfig ---> 编译kernel要使用到的配置文件
        gec@ubuntu:~/6818GEC/kernel/arch/arm/configs$ ls
        GEC6818_defconfig 
    BS_CONFIG_FILESYSTEM=PRODUCT-GEC6818-userdebug
    BS_CONFIT_BUILDROOT=GEC6818_defconfig

4)编译各个模块的功能函数
    setup_environment()
    build_bootloader_uboot()
    build_kernel()
    
  5) 普通变量
    threads=4
    uboot=no ----> 默认情况下为no
    kernel=no
    system=no
    buildroot=no
  6) 分析shell语句
   if [ -z $1 ]; then
    uboot=yes
    kernel=yes
    system=yes
    buildroot=yes
  fi

7) case语句
   while [ "$1" ]; do
    case "$1" in
    -j=*)
        x=$1
        threads=${x#-j=}
        ;;
    -u|--uboot)
        uboot=yes
        ;;
    -k|--kernel)
        kernel=yes
        ;;
    -s|--system)
        system=yes
        ;;
    -b|--buildroot)
        buildroot=yes
        ;;
    -a|--all)
        uboot=yes
        kernel=yes
        system=yes
        buildroot=yes
        ;;
    如果$1 的值为 -u 或者 --uboot,则执行
       uboot=yes

8)  根据变量的值的状态调用相应的函数
   if [ "${uboot}" = yes ]; then
    build_bootloader_uboot || exit 1
    fi

    if [ "${kernel}" = yes ]; then
        build_kernel || exit 1
    fi
    
9)分析相关的函数
      build_bootloader_uboot
      
      build_kernel()
    {
        export PATH=${BS_DIR_UBOOT}/tools:$PATH  ---> 配置PATH
        # Compiler kernel
        cd ${BS_DIR_KERNEL} || return 1 ---> 进入到内核目录
        make ${BS_CONFIG_KERNEL} ARCH=arm CROSS_COMPILE=${BS_CROSS_TOOLCHAIN_KERNEL} || return 1-->
        等 价于 make GEC6818_defconfig ARCH=arm CROSS_COMPILE=/home/gec/6818GEC/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-
        make -j${threads} ARCH=arm CROSS_COMPILE=${BS_CROSS_TOOLCHAIN_KERNEL} || return 1
        make -j${threads} ARCH=arm CROSS_COMPILE=${BS_CROSS_TOOLCHAIN_KERNEL} uImage || return 1 --->
        生成内核的镜像:uImage

        # Copy uImage to release directory
        #cp -v ${BS_DIR_KERNEL}/arch/arm/boot/uImage ${BS_DIR_RELEASE}

        #echo "^_^ kernel path: ${BS_DIR_RELEASE}/uImage"

        # generate boot.img
        cd ${BS_DIR_TOP} || return 1
        echo 'boot.img ->' ${BS_DIR_RELEASE}
        # Make boot.img with ext4 format, 64MB
        cp -v ${BS_DIR_KERNEL}/arch/arm/boot/uImage ${BS_DIR_TARGET}/boot --->
        把uImage拷贝到${BS_DIR_TARGET}/boot目录下
        
        mkuserimg.sh -s ${BS_DIR_TARGET}/boot ${BS_DIR_TARGET}/boot.img ext4 boot 67108864 --->
        通过mkuserimg.sh脚本中的命令,把${BS_DIR_TARGET}/boot目录的uImage文件,制作成
        ${BS_DIR_TARGET}/目录 下boot.img镜像文件

        cp -av ${BS_DIR_TARGET}/boot.img ${BS_DIR_RELEASE} || return 1; --->
        把编译好的boot.img拷贝到 ${BS_DIR_RELEASE}目录下
        return 0
    }
    
    综上分析得出:
    编译uboot:./mk -u
    编译内核:./mk -k 

四、使用mk脚本来编译内核

~/6818GEC$ ls

buildroot  GEC6818uboot  kernel  linux  mk  out  prebuilts  prototype  tools

~/6818GEC$ ./mk -k 

 内核编译输出的结果:
   

Kernel: arch/arm/boot/Image is ready ---> 内核ImageKernel: arch/arm/boot/zImage is ready ---> 内核zImageUIMAGE  arch/arm/boot/uImage ---->内核的最终镜像gec@ubuntu:~/6818GEC/kernel/arch/arm/boot$ lsbootp  compressed  dts  Image  install.sh  Makefile  uImage  zImageImage Name:   Linux-3.4.39-gecCreated:      Sun Feb 17 19:14:47 2019Image Type:   ARM Linux Kernel Image (uncompressed)Data Size:    5532568 Bytes = 5402.90 kB = 5.28 MBLoad Address: 40008000Entry Point:  40008000Image arch/arm/boot/uImage is readyboot.img -> /home/gec/6818GEC/out/release'/home/gec/6818GEC/kernel/arch/arm/boot/uImage' -> '/home/gec/6818GEC/out/target/product/GEC6818//boot/uImage'make_ext4fs -s -T -1 -l 67108864 -a boot /home/gec/6818GEC/out/target/product/GEC6818//boot.img /home/gec/6818GEC/out/target/product/GEC6818//bootCreating filesystem with parameters:Size: 67108864Block size: 4096Blocks per group: 32768Inodes per group: 4096Inode size: 256Journal blocks: 1024Label: Blocks: 16384Block groups: 1Reserved block group size: 7Created filesystem with 18/4096 inodes and 4212/16384 blocks'/home/gec/6818GEC/out/target/product/GEC6818//boot.img' -> '/home/gec/6818GEC/out/release/boot.img'

    最终在6818GEC/out/release/boot.img找到镜像文件boot.img
    
    
注意事项:
       问题一:在首次编译内核时,未先编译uboot,会出现错误
       "mkimage" command not found - U-Boot images will not be built
       解决办法:先编译u-boot,再重新编译内核
       ./mk -u 
       ./mk -k
 

五、烧写内核到开发板

第一步:把编译生成的boot.img单独拷贝,并且与fastboot.exe、adb.exe AdbWinUsbApi.dll,AdbWinApi.dll
  第二步:连接USB线到开发板与电脑
        大端的USB口接电脑
        小端的USB口接开发板
  第三步:启动开发板并且运行在u-boot命令行下,执行fastboot命令   

X6818# fastboot

Fastboot Partitions:mmc.2: ubootpak, img : 0x200, 0x78000mmc.2: 2ndboot, img : 0x200, 0x4000mmc.2: bootloader, img : 0x8000, 0x70000mmc.2: boot, fs : 0x100000, 0x4000000mmc.2: system, fs : 0x4100000, 0x2f200000mmc.2: cache, fs : 0x33300000, 0x1ac00000mmc.2: misc, fs : 0x4e000000, 0x800000mmc.2: recovery, fs : 0x4e900000, 0x1600000mmc.2: userdata, fs : 0x50000000, 0x0Support fstype : 2nd  boot  factory  raw  fat  ext4  emmc  nand  ubi  ubifs Reserved part  : partmap  mem  env  cmd DONE: Logo bmp 311 by 300 (3bpp), len=280854 DRAW: 0x47000000 -> 0x46000000 Load USB Driver: androidCore usb device tie configuration doneOTG cable Connected!

在PC端的设备管理器上显示:Android Device

第四步:在PC端的命令行
    ctrl + r ---> cmd ---->弹出终端界面,并且进入到boot.img目录下

第五步:通过fastboot命令上传文件到开发板

fastboot flash boot boot.img

sending 'boot' (16848 KB)... OKAY
writing 'boot'... OKAY

第六步:重启动开发板
X6818# reset

六、使用make命令来编译kernel源码

第一步:进入到内核源码的目录下(~/6818GEC/kernel)

make clean -----> 清理一下项目

第二步:拷贝内核源码编译的配置文件(***_config)

cp arch/arm/configs/GEC6818_defconfig .config

第三步:执行make menuconfig 

make menuconfig ----->配置内核(以菜单来进行配置)

第四步:把执行make menuconfig修改后的.config拷贝回到对应的硬件平台配置目录下

cp .config arch/arm/configs/GEC6818_defconfig 

第五步:执行make 进行源码的编译

make  ARCH=arm CROSS_COMPILE=/home/gec/6818GEC/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-

七、内核源码的结构

Linux 内核源代码包含如下目录。
    ● arch :包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如i386、arm、arm64、powerpc、mips 等。Linux 内核目前已经支持30 种左右的体系结构。在arch目录下,存放的是各个平台以及各个平台的芯片对Linux 内核进程调度、内存管理、中断等的支持,以及每个具体的SoC 和电路板的板级支持代码。
    ● block:块设备驱动程序I/O 调度。
    ● crypto:常用加密和散列算法(如AES、SHA 等),还有一些压缩和CRC 校验算法。
    ● documentation:内核各部分的通用解释和注释。
    ● drivers :设备驱动程序,每个不同的驱动占用一个子目录,如char、block、net、mtd、i2c 等。
    ● fs:所支持的各种文件系统,如EXT、FAT、NTFS、JFFS2 等。
    ● include:头文件,与系统相关的头文件放置在include/linux 子目录下。
    ● init:内核初始化代码。著名的start_kernel() 就位于init/main.c 文件中。
    ● ipc:进程间通信的代码。
    ● kernel :内核最核心的部分,包括进程调度、定时器等,而和平台相关的一部分代码
    放在arch/*/kernel 目录下。
    ● lib:库文件代码。
    ● mm:内存管理代码,和平台相关的一部分代码放在arch/*/mm 目录下。
    ● net:网络相关代码,实现各种常见的网络协议。
    ● scripts:用于配置内核的脚本文件。
    ● security:主要是一个SELinux 的模块。
    ● sound:ALSA、OSS 音频设备的驱动核心代码和常用设备驱动。
    ● usr:实现用于打包和压缩的cpio 等。
    ● include:内核API 级别头文件。
  
   

觉得有帮助的话,打赏一下呗。。

           

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/21516.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

某红书旋转滑块验证码分析与协议算法实现(高通过率)

文章目录 1. 写在前面2. 接口分析3. 验证轨迹4. 算法还原 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致…

力扣SQL50 学生们参加各科测试的次数 查询 三表查询

Problem: 1280. 学生们参加各科测试的次数 👨‍🏫 参考题解 join等价于inner join,不用关联条件的join等价于cross join Code select stu.student_id,stu.student_name, sub.subject_name,count(e.subject_name) attended_exams from Stud…

关于windosw打开安全中心空白的解决方案

关于windosw打开安全中心空白的解决方案 问题如下 问题如下 之后点击一片空白 解决方案如下 按下WINR,输入regedit回车找到路径:“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SecurityHealthService”,然后双击右边的“start”…

windows 下编译 TessRact+leptonica 识别图片文字

目录 1、下载 2. 编译基础依赖库 1.1 zlib 1.2 jpegsr9f 1.3 lpng1643 1.4 libgif 3. 编译tifflib 4. 配置nasm到系统环境中 5. 编译 libjpeg-turbo 6 编译leptonica 7. 编译tesseract 8. 测试验证 1、下载 下载tesseract5.3.2 下载leptonica1.83.1 下载l…

1638. 统计只差一个字符的子串数目

题目 给你两个字符串 s 和 t,请找出 s 中的非空子串的数目,这些子串满足替换一个不同字符以后,是 t 串的子串。换言之,请你找到 s 和 t 串中恰好只有一个字符不同的子字符串对的数目。 一个子字符串是一个字符串中连续的字符。 …

【全开源】旅游门票预订系统(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp开发的旅游门票预订系统,支持景点门票、导游产品便捷预订、美食打卡、景点分享、旅游笔记分享等综合系统,提供前后台无加密源码,支持私有化部署。 ​便捷你的每一次出行🌍 🌟 轻松预订…

骨传导蓝牙耳机买哪款好?年度精选五款骨传导蓝牙耳机推荐

作为音乐爱好者的我,也一直在寻找一款好的骨传导耳机,听音乐对我来说不仅仅是一种消遣方式,更多是一种对生活、工作上压力和困难的舒缓,所以今天给大家推荐几款骨传导耳机。今天推荐这几款骨传导耳机都是比较有性价比,…

计算机网络学习实践:模拟RIP动态路由

计算机网络学习实践:模拟RIP动态路由 模拟动态路由RIP协议 1.实验准备 实验环境:华为模拟器ENSP 实验设备: 3个路由器,3个二层交换机(不是三层的),3个PC机 5个网段 192.168.1.0 255.255.…

电脑视频录制工具,推荐3款,让你的作品更专业!

随着信息技术的飞速发展,电脑视频录制工具在日常工作和娱乐中扮演着越来越重要的角色。它们不仅能帮助我们记录电脑屏幕上的精彩瞬间,还能为教学、演示、游戏直播等多种场景提供便利。本文将详细介绍三款电脑视频录制工具,并分步骤阐述它们的…

如何编辑pdf文件内容?编辑技巧大揭秘,秒变办公达人!

如何编辑pdf文件内容?在数字化办公日益普及的今天,PDF文件因其跨平台、格式稳定的特点,成为我们日常工作和学习中不可或缺的一部分。然而,PDF文件的编辑却常常令人头疼,许多人面对需要修改内容的PDF文件时感到无从下手…

【RPG Maker MV 仿新仙剑 战斗场景UI (九)】

RPG Maker MV 仿新仙剑 战斗场景UI 九 前言角色战斗精灵精灵图设置攻击 战斗背景图 前言 前段天研究并完成了主角人物行走图部分的开发,完成了对应的8方向行走,及精灵的展示。现在开始重新回到战斗场景的开发中,回顾下,已完成功能…

如何手动批准内核扩展 Tuxera NTFS for mac内核扩展需要批准 内核扩展怎么打开

在了解如何手动批准内核扩展之前,我们应该先了解什么叫做内核扩展。内核扩展又被称为KEXT,通过它可以实现macOS系统与软件组件之间的交互,例如磁盘管理、任务管理和内存管理等等。 kext 是内核扩展(Kernel Extension)…

【漏洞复现】海康威视综合安防管理平台 orgManage/v1/orgs/download 任意文件读取漏洞复现

0x01 产品简介 海康威视综合安防管理平台是一套“集成化”、“智能化”的平台,通过接入视频监控、一卡通、停车场、报警检测等系统的设备。海康威视集成化综合管理软件平台,可以对接入的视频监控点集中管理,实现统一部署、统一配置、统一管理和统一调度。 0x02 漏洞概述 海康…

C语言:学生成绩管理系统(含源代码)

一.功能 二.源代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NUM 100 typedef struct {char no[30];char name[10];char sex[10];char phone[20];float cyuyan;float computer;float datastruct; } *student, student1;typ…

渗透测试报告生成工具

目录 1.前言 1.1 渗透测试报告是什么? 1.2 渗透测试报告的编写需要考虑以下几点&#xff1a; 1.3 一份优秀的渗透测试报告应该具备以下特点&#xff1a; 1.4 在编写渗透测试报告之前&#xff0c;需要进行一些准备工作&#xff1a; 1.5 渗透测试报告一般包括以下部分&…

作为表达式调用时,无法解析类修饰器的签名。vue3+ts+vite,使用装饰器时报错

作为表达式调用时&#xff0c;无法解析类修饰器的签名。 The runtime will invoke the decorator with 2 arguments, but the decorator expects 1.ts(1238) 页面也无法打开 解决方案&#xff1a; {"extends": "vue/tsconfig/tsconfig.dom.json","in…

SEW交频器 MDX61801110-5A3-4-0T可议价

SEW交频器 MDX61801110-5A3-4-0T可议价 SEW交频器 MDX61801110-5A3-4-0T可议价 SEW交频器 MDX61801110-5A3-4-0T可议价 SEW交频器 MDX61801110-5A3-4-0T参数表 SEW交频器 MDX61801110-5A3-4-0T中文说明书 SEW交频器 MDX61B01110-5A3-4-0T 规格:MOVIDRIVE MDX61B0110-5A3…

探索数据结构:便捷的双向链表

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;渐入佳境之数据结构与算法 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ​​ 前言 前面我们学习了单链表&#xff0c;它解…

ICLR24大模型提示(3/11) | PromptAgent:利用语言模型进行战略规划,实现专家级提示优化

【摘要】高效的、针对特定任务的提示通常由专家精心设计&#xff0c;以整合详细的说明和领域见解&#xff0c;这些见解基于对大型语言模型 (LLM) 的本能和目标任务的复杂性的深刻理解。然而&#xff0c;自动生成这种专家级提示仍然难以实现。现有的提示优化方法往往忽视领域知识…

20240603每日AI------------项目引入Spring Cloud Alibaba AI (二)

项目源码解析 前端代码&#xff1a; <div class"container"><h1>Spring Cloud Alibaba AI Example</h1><form id"form"><label for"message">User Message&#xff1a;</label><input type"text&q…