当前位置: 首页 > news >正文

从0开始学linux韦东山教程第三章问题小结(3)

  本人从0开始学习linux,使用的是韦东山的教程,在跟着课程学习的情况下的所遇到的问题的总结,理论虽枯燥但是是基础。说实在的越看视频越感觉他讲的有点乱后续将以他的新版PDF手册为中心,视频作为辅助理解的工具。参考手册为嵌入式Linux应用开发完全手册V5.3_IMX6ULL_Pro开发板。
摘要关键词:git仓库数据提取,adb安装,设备树内核更新

本文详细介绍以下问题,如果你遇到了以下问题,看看我的方案能否解决。

1.git文档代码下载注意事项
2.adb安装
3.adb传输内核文件到开发板

1.git文档代码下载注意事项
当时忘记下载git的文件代码了,搞得我找不着他的文件和代码,接下来补充一下
在这里插入图片描述
  手册的第4页中写到了,源码放在了git中,我就说我怎么找不着代码。在git bash中输入以下命令行,打开win11系统中/d/Linux/02_100ask_imx6ull_pro_2022.08目录,下载01_all_series_quickstart文件至此目录

cd /d/Linux/02_100ask_imx6ull_pro_2022.08
git clone https://e.coding.net/weidongshan/01_all_series_quickstart.git

注意只有分盘的打开需要 /d斜杠,其他文件的打开不需要
在这里插入图片描述
下载完成后,我就多出来了这个文件。

2.adb安装
  以下命令行请参考手册的65页,这是手册和视频都提及的内容,考虑到你得ubuntu可能没有安装adb但是你的开发板是支持adb命令行的。

sudo apt install adb
sudo chmod a+x /usr/bin/adb
sudo chmod a+s /usr/bin/adb
sudo adb kill-server

sudo apt install adb:这个命令使用 apt 包管理器安装 ADB 工具。sudo 表示以管理员权限执行此命令。apt 是 Debian 和 Ubuntu 系统中的软件包管理工具。adb 是用于与 Android 设备进行调试和通信的工具。

sudo chmod a+x /usr/bin/adb:这个命令为 /usr/bin/adb 文件添加执行权限。chmod 是一个用于修改文件权限的命令,a+x 表示给所有用户(a)添加执行(x)权限。

sudo chmod a+s /usr/bin/adb:这个命令为 /usr/bin/adb 文件设置 SUID(Set User ID) 权限。a+s 表示给所有用户设置 SUID。当一个程序设置了 SUID 权限时,程序在运行时将以文件所有者的权限执行,而不是运行该程序的用户权限。这里可能是为了让 adb 在执行时具有管理员权限。

sudo adb kill-server:这个命令用来终止 ADB 服务。adb kill-server 会关闭正在运行的 ADB 服务器实例,通常用于重启 ADB 服务或解决 ADB 通信的问题。
安装过程中出现以下界面就正常了。

在这里插入图片描述
安装adb的时候跟着他的教程来就行,我最开始出现了一个问题

E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

  说我adb锁着了,占线了,是因为我最开始开发板连接的我的win11,改口后没有反应过来,还有可能就是我当时没把板子的USB模式切换过来,我把以上两点完成后重启一下就行了。
在这里插入图片描述
他视频里面不是说会出错嘛,我出现了以上错误。

adb shell

adb shell:通过 ADB(Android Debug Bridge) 与 Android 设备进行交互的一条命令。具体来说,adb shell 会启动一个远程 shell 会话,让你能够在连接的 Android 设备上执行命令。
打开开发板后,你会发现这个命令行有一点不好的地方就是它只有sh-5.0#开头你不知道它进入了那个文件夹,如下图所示我已经进入了root地址但是是看不出来的。

在这里插入图片描述

adb push 2.txt /root 
adb pull /root/2.txt

在这里插入图片描述
第一行代码是ubuntu传送2.txt文件,第二行代码是ubuntu接受开发板发来的2.txt文件

  编译替换内核部分(手册93页)手册中写得很清楚为什么编译驱动程序之前要先编译内核,详细参考手册。首先得注意你要配置的是arm内核,所以你得用一下命令行,设置交叉编译环境的变量。

export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin

export ARCH=arm:这行命令设置了 ARCH 环境变量为 arm。它告诉构建系统当前的目标架构是 ARM 架构。通常,这个变量用于告诉编译工具链,编译的代码应该针对 ARM 处理器架构(而不是 x86、MIPS 等)。

export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-:这行命令设置了 CROSS_COMPILE 环境变量。它指定了交叉编译工具链的前缀。交叉编译工具链是一套可以在一种平台(如 x86)上编译生成另一个平台(如 ARM)上的可执行文件的工具。例如,arm-buildroot-linux-gnueabihf- 表示该工具链是为 ARM 架构和 GNU ABI (Application Binary Interface) 进行优化,并支持硬浮点运算(hf 代表硬浮点)。所以,工具链中的工具(如 gcc)将自动带上这个前缀,像 arm-buildroot-linux-gnueabihf-gcc 这样的命令会被用来编译 ARM 目标代码。

export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin:这行命令将一个目录添加到系统的 PATH 环境变量中。这样做是为了确保系统能够找到交叉编译工具链的二进制文件。通过添加路径 /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin,你可以在终端中直接调用交叉编译工具,如 arm-buildroot-linux-gnueabihf-gcc,而不需要指定其完整路径。
不然就会出现以下错误。

在这里插入图片描述
  如果还是出现以上错误,建议重启一下MobaXterm和串口,然后重新输入以上命令行,打开内核。
编译内核命令行如下所示

cd /home/book/100ask_imx6ull-sdk/Linux-4.9.88
make mrproper
make 100ask_imx6ull_defconfig
make zImage -j4
make dtbs
cp arch/arm/boot/zImage ~/nfs_rootfs
cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs

make mrproper:清理编译环境,准备进行全新编译。

make 100ask_imx6ull_defconfig:为 i.MX6ULL 硬件生成一个默认的内核配置。

make zImage -j4:该命令编译内核,并生成压缩的内核映像文件 zImage。-j4 表示使用 4 个 CPU 核心并行编译,能够加快编译过程。(看你的电脑性能,也就是此处编译了你的Ubuntu新内核)

make dtbs:此命令编译设备树二进制文件(DTB)。设备树文件描述了硬件信息,使操作系统能够正确地识别和配置硬件。dtbs 代表设备树二进制文件(Device Tree Blob),它通常是 .dtb 文件格式。(也就是此处编译了你的Ubuntu新设备树)

cp arch/arm/boot/zImage ~/nfs_rootfs:此命令将生成的内核映像 zImage 复制到指定的目标目录(/nfs_rootfs)。arch/arm/boot/zImage 是生成的内核文件的路径,~/nfs_rootfs 是目标路径。(之所以叫nfs应该是以前用的nfs传输内核文件现在用的是adb,文件叫啥名不影响)

cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs:将设备树二进制文件复制到 NFS 根文件系统目录中,以便在引导过程中使用。
输入以上命令行后会出现以下图片。

在这里插入图片描述在这里插入图片描述在这里插入图片描述
  以上已经实现了Ubuntu中的内核和设备树的更新了,而且还拷贝了一份在/home/book/nfs_rootfs中,接下来要实现的就是将拷贝的相同的内核和设备树传输给开发板了,使用啥呢?adb呀!

3.adb传输内核文件到开发板
在这里插入图片描述

cd /home
cd book
cd nfs_rootfs
adb push zImage /boot
adb push 100ask_imx6ull-14x14.dtb  /boot
adb push lib/modules /lib

在这里插入图片描述
  输入以上命令重新启动开发板,以上重启命令行仅支持adb也就是,你可以远程访问Ubuntu输入这些命令行,也可以在ubuntu终端中直接输入这些命令行。

  然后看了手册94页后我很好奇,我不是已经编译内核了吗?为什么还得编译内核模块并且拷贝,原因如下:
编译内核和编译内核模块是两个不同的过程,它们虽然相关,但有不同的目的和步骤。

1.内核的编译(make zImage)
  这个步骤的目的是编译内核的核心部分,也就是生成内核映像(zImage),这是操作系统启动时需要加载的核心部分。通过这个过程,你将获得一个可以运行的内核文件。
2. 内核模块的编译(make modules)
  内核模块是内核的可加载部分,通常用于扩展内核功能,比如设备驱动、文件系统支持、网络协议等。内核模块不像内核本身那样在启动时就必须加载,而是根据需要加载。内核模块并不是内核的直接组成部分,它们通常是动态加载的。比如,某些硬件驱动可能会在你连接硬件时才被加载,而并非所有硬件驱动都被编译进内核。

make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs modules_install
为 ARM 架构编译并将内核模块安装到指定目录 /home/book/nfs_rootfs,而不是默认的 /lib/modules/ 目录。通常用于交叉编译或在嵌入式系统中部署内核模块。

  接下来按照手册要求,将已经安装在Ubuntu中的内核以及设备树、内核模块文件安装到开发板上,具体请参考手册95页。安装成功后输入以上命令行进行重启。

adb shell
sync
reboot

还有种方法就是串口输入命令行,如图所示一样可以实现重启功能。
在这里插入图片描述

在这里插入图片描述
从以上就可以看到,更新了内核和设备树。

adb shell
uname -a

  其实本文一直有个问题,就是Ubuntu是怎么知道我要安装的内核驱动的版本的,是直接安装最新版的吗?还有就是内核驱动模块我也没有指明安装哪些驱动模块,为什么一定是编译安装那些模块呢?有大佬明白的话,还请在评论区指点一下,感谢啦!

相关文章:

  • 微服务架构实战:从服务拆分到RestTemplate远程调用
  • 模型过拟合是什么?
  • springboot3整合SpringSecurity实现登录校验与权限认证
  • 理解反向Shell:隐藏在合法流量中的威胁
  • React 从零到一执行原理 (2025 最新版)
  • 数据仓库Hive
  • 力扣2680题解
  • 趣味编程:四叶草
  • 一种混沌驱动的后门攻击检测指标
  • 关于chatshare.xyz激活码使用说明和渠道指南!
  • vue数据可视化开发echarts等组件、插件的使用及建议-浅看一下就行
  • MNIST 手写数字分类
  • HVV面试题汇总合集
  • 雷达工程师面试题目
  • Redis 基础详解:从入门到精通
  • 【Redis】Redis的主从复制
  • 5G-A来了!5G信号多个A带来哪些改变?
  • C++ stl中的priority_queue的相关函数用法
  • 大模型都有哪些超参数
  • 如何实现Flask应用程序的安全性
  • 中国巴西民间推动建立经第三方验证的“森林友好型”牛肉供应链
  • “11+2”复式票,宝山购彩者领走大乐透1170万头奖
  • 缺字危机:一本书背后有多少“不存在”的汉字?
  • 张笑宇:物质极大丰富之后,我们该怎么办?
  • 【社论】人工智能将为教育带来什么
  • 《三餐四季》广东篇今晚开播:食在岭南,遇见百味