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

[复制链接]
发表于 2025-9-11 18:56:16 | 显示全部楼层 |阅读模式
  本人从0开始学习linux,使用的是韦东山的教程,在跟着课程学习的环境下的所遇到的问题的总结,理论虽枯燥但是是根本。说实在的越看视频越感觉他讲的有点乱后续将以他的新版PDF手册为中央,视频作为辅助理解的工具。参考手册为嵌入式Linux应用开发完全手册V5.3_IMX6ULL_Pro开发板。
摘要关键词:git仓库数据提取,adb安装,设备树内核更新
本文具体先容以下问题,如果你遇到了以下问题,看看我的方案可否解决。
  1. 1.git文档代码下载注意事项
  2. 2.adb安装
  3. 3.adb传输内核文件到开发板
复制代码
1.git文档代码下载注意事项
当时忘记下载git的文件代码了,搞得我找不着他的文件和代码,接下来补充一下

  手册的第4页中写到了,源码放在了git中,我就说我怎么找不着代码。在git bash中输入以下下令行,打开win11体系中/d/Linux/02_100ask_imx6ull_pro_2022.08目录,下载01_all_series_quickstart文件至此目录
  1. cd /d/Linux/02_100ask_imx6ull_pro_2022.08
  2. git clone https://e.coding.net/weidongshan/01_all_series_quickstart.git
复制代码
注意只有分盘的打开需要 /d斜杠,其他文件的打开不需要

下载完成后,我就多出来了这个文件。
2.adb安装
  以下下令行请参考手册的65页,这是手册和视频都提及的内容,考虑到你得ubuntu大概没有安装adb但是你的开发板是支持adb下令行的。
  1. sudo apt install adb
  2. sudo chmod a+x /usr/bin/adb
  3. sudo chmod a+s /usr/bin/adb
  4. 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的时间跟着他的教程来就行,我最开始出现了一个问题
  1. E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
  2. E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
复制代码
  说我adb锁着了,占线了,是因为我最开始开发板连接的我的win11,改口后没有反应过来,还有大概就是我当时没把板子的USB模式切换过来,我把以上两点完成后重启一下就行了。

他视频里面不是说会出错嘛,我出现了以上错误。
  1. adb shell
复制代码
adb shell
通过 ADB(Android Debug Bridge) 与 Android 设备举行交互的一条下令。具体来说,adb shell
会启动一个远程 shell 会话,让你能够在连接的 Android 设备上执行下令。
打开开发板后,你会发现这个下令行有一点不好的地方就是它只有sh-5.0#开头你不知道它进入了那个文件夹,如下图所示我已经进入了root地点但是是看不出来的。
  1. adb push 2.txt /root
  2. adb pull /root/2.txt
复制代码

第一行代码是ubuntu传送2.txt文件,第二行代码是ubuntu接受开发板发来的2.txt文件
  编译更换内核部分(手册93页)手册中写得很清楚为什么编译驱动程序之前要先编译内核,具体参考手册。起首得注意你要设置的是arm内核,所以你得用一下下令行,设置交叉编译环境的变量。
  1. export ARCH=arm
  2. export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
  3. 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和串口,然后重新输入以上下令行,打开内核。
编译内核下令行如下所示
  1. cd /home/book/100ask_imx6ull-sdk/Linux-4.9.88
  2. make mrproper
  3. make 100ask_imx6ull_defconfig
  4. make zImage -j4
  5. make dtbs
  6. cp arch/arm/boot/zImage ~/nfs_rootfs
  7. 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传输内核文件到开发板
  1. cd /home
  2. cd book
  3. cd nfs_rootfs
  4. adb push zImage /boot
  5. adb push 100ask_imx6ull-14x14.dtb  /boot
  6. adb push lib/modules /lib
复制代码

  输入以上下令重新启动开发板,以上重启下令行仅支持adb也就是,你可以远程访问Ubuntu输入这些下令行,也可以在ubuntu终端中直接输入这些下令行。
  然后看了手册94页后我很好奇,我不是已经编译内核了吗?为什么还得编译内核模块而且拷贝,缘故原由如下:
编译内核和编译内核模块是两个不同的过程,它们虽然干系,但有不同的目的和步骤。
1.内核的编译(make zImage)
  这个步骤的目的是编译内核的核心部分,也就是天生内核映像(zImage),这是操作体系启动时需要加载的核心部分。通过这个过程,你将获得一个可以运行的内核文件。
2. 内核模块的编译(make modules)
  内核模块是内核的可加载部分,通常用于扩展内核功能,比如设备驱动、文件体系支持、网络协议等。内核模块不像内核本身那样在启动时就必须加载,而是根据需要加载。内核模块并不是内核的直接组成部分,它们通常是动态加载的。比如,某些硬件驱动大概会在你连接硬件时才被加载,而并非全部硬件驱动都被编译进内核。
  1. make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs modules_install
  2. 为 ARM 架构编译并将内核模块安装到指定目录 /home/book/nfs_rootfs,而不是默认的 /lib/modules/ 目录。通常用于交叉编译或在嵌入式系统中部署内核模块。
复制代码
  接下来按照手册要求,将已经安装在Ubuntu中的内核以及设备树、内核模块文件安装到开发板上,具体请参考手册95页。安装成功后输入以上下令行举行重启。
  1. adb shell
  2. syncreboot
复制代码
还有种方法就是串口输入下令行,如图所示一样可以实现重启功能


从以上就可以看到,更新了内核和设备树。
  1. adb shell
  2. uname -a
复制代码
  其实本文不停有个问题,就是Ubuntu是怎么知道我要安装的内核驱动的版本的,是直接安装最新版的吗?还有就是内核驱动模块我也没有指明安装哪些驱动模块,为什么肯定是编译安装那些模块呢?有大佬明确的话,还请在批评区指点一下,感谢啦!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表