008——根文件系统(基于鸿蒙liteos-a内核)

news2024/11/14 1:44:59

目录

一、根文件系统

1.1 鸿蒙根文件系展示

1.2 根文件系统的内容

1.3 根文件系统的制作

1.3.1 Makefile分析

1. ROOTFS目标:

2. 编译APP

1.3.2 演示

二、正式版本的init进程

1.1 测试版本

1.2 正式版本

1.2.1 配置文件

1. 分析配置文件

2. 示例

3. 配置文件执行过程


一、根文件系统

1.1 鸿蒙根文件系展示

        两步走先创建一个文件夹存放我们必须的系统库,可执行文件等然后把这个文件夹做成映像文件,这样才能烧入到flash里。

1.2 根文件系统的内容

看看一个简单的程序:

#include <stdio.h>
int main(int argc, char **argv)
{
    printf("hello, world!\n");
    return 0;
}

可以编译出一个APP:hello。 有几个问题要考虑:

  • printf不是我们实现的,它在哪?

  • hello放在板子上后,怎么启动它?能否自动启动?

解决这几个问题后,就可以知道根文件系统的内容了:

  • /lib:库,比如printf函数就是在库里的

  • /bin:APP,hello这样的程序放在/bin或/usr/bin这些目录里

  • 至少有这些APP:

    • init:内核启动的第一个APP,它会去启动其他APP,比如shell

    • shell:也是一个APP,可以让我们输入各类命令

    • 我们自己的APP:比如hello

  • /etc:想自动启动APP怎么办?应该有配置文件,init进程根据配置文件去启动其他APP

    • 比如/etc/init.cfg

  • /dev:设备节点,在Liteos-a中不需要我们自己创建

1.3 根文件系统的制作

1.3.1 Makefile分析

kernnel/liteos_a目录执行make help

 

可以知道:执行make rootfs可以制作根文件系统。 分析Makefile确定它的制作过程。

1. ROOTFS目标:
$(ROOTFS): $(ROOTFSDIR)
    $(HIDE)$(shell $(LITEOSTOPDIR)/tools/scripts/make_rootfs/rootfsimg.sh $(ROOTFS_DIR) $(FSTYPE)  ${ROOTFS_SIZE})
    $(HIDE)cd $(ROOTFS_DIR)/.. && zip -r $(ROOTFS_ZIP) $(ROOTFS)
ifneq ($(OUT), $(LITEOS_TARGET_DIR))
    $(HIDE)mv $(ROOTFS_DIR) $(LITEOS_TARGET_DIR)rootfs
endif
​
$(ROOTFSDIR): prepare $(APPS)
    $(HIDE)$(MAKE) clean -C apps
    $(HIDE)$(shell $(LITEOSTOPDIR)/tools/scripts/make_rootfs/rootfsdir.sh $(OUT)/bin $(OUT)/musl $(ROOTFS_DIR))
ifneq ($(VERSION),)
    $(HIDE)$(shell $(LITEOSTOPDIR)/tools/scripts/make_rootfs/releaseinfo.sh "$(VERSION)" $(ROOTFS_DIR))
endif
​
prepare:
    $(HIDE)mkdir -p $(OUT)/musl
ifeq ($(LOSCFG_COMPILER_CLANG_LLVM), y)
    $(HIDE)cp -f $(LITEOSTOPDIR)/../../prebuilts/lite/sysroot/usr/lib/$(LLVM_TARGET)/a7_softfp_neon-vfpv4/libc.so $(OUT)/musl
    $(HIDE)cp -f $(LITEOS_COMPILER_PATH)/lib/$(LLVM_TARGET)/c++/a7_softfp_neon-vfpv4/libc++.so $(OUT)/musl
else
    $(HIDE)cp -f $(LITEOS_COMPILER_PATH)/target/usr/lib/libc.so $(OUT)/musl
    $(HIDE)cp -f $(LITEOS_COMPILER_PATH)/arm-linux-musleabi/lib/libstdc++.so.6 $(OUT)/musl
    $(HIDE)cp -f $(LITEOS_COMPILER_PATH)/arm-linux-musleabi/lib/libgcc_s.so.1 $(OUT)/musl
    $(STRIP) $(OUT)/musl/*
endif
​
$(APPS): $(LITEOS_TARGET)
    $(HIDE)$(MAKE) -C apps all
  • ROOTFSDIR:使用rootfsdir.sh创建一些目录

  • prepare:复制libc.so、libc++.so

  • APPS:进入apps目录执行make all

make -C 目录  目标 : 进入这个目录去执行对应目标

makefile会使用tool目录下的脚本去制作根文件系统

        linux内核只能用上面的那个文件系统,突然发现之前哭错坟了。我在移植openhamony,去hamonyOS那里去问问题,我说今天仔细一看怎么社区里都是基于java写的代码。

2. 编译APP

有目录:kernel/liteos_a/apps,这个目录下有:

  • module.mk:定义了

    APP_SUBDIRS += shell
    APP_SUBDIRS += init
  • Makefile:

    $(APPS):
    ifneq ($(APP_SUBDIRS), )
            $(HIDE) for dir in $(APP_SUBDIRS); do $(MAKE) -C $$dir ; done
    endif

    就是再次进入shell、init目录,执行make命令,去变量shell程序、init程序。

1.3.2 演示

        我们之前用内存模拟了flash,假设根文件系统2MB这里还有剩余的8MB内存没初始化,要么就用uboot去都写上全F要么就把8MB的全F填充到2MB的后面。老师说mp157不好使用uboot做这个操作,原因不详,反正6ull和mp157两个板子一个用一种方式。

这面编译没问题呢

他现在是10MB的,但是我们不想他是10MB看看咋回事

         脚本里把这个扩充成了10MB,这里的大小是我们之前在makefile中定义的,makefile用这个脚本时第三个参数指定了大小。

文件系统我们改回jffs2 

.bin是给157用的因为它只支持后缀名是bin的。

忘记改名字了还是10MB,再来修改一下shell

#!/bin/bash
#
# Copyright (c) 2013-2019, Huawei Technologies Co., Ltd. All rights reserved.
# Copyright (c) 2020, Huawei Device Co., Ltd. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this list of
#    conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
#    of conditions and the following disclaimer in the documentation and/or other materials
#    provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors may be used
#    to endorse or promote products derived from this software without specific prior written
#    permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
set -e

system=$(uname -s)
ROOTFS_DIR=$1
FSTYPE=$2
ROOTFS_SIZE=$3
ROOTFS_IMG=${ROOTFS_DIR}".img"
ROOTFS_JFFS2=${ROOTFS_DIR}".jffs2"
JFFS2_TOOL=$(dirname $(readlink -f "$0"))/../../fsimage/mkfs.jffs2
WIN_JFFS2_TOOL=$(dirname $(readlink -f "$0"))/../../fsimage/win-x86/mkfs.jffs2.exe

if [ "${ROOTFS_DIR}" = "*rootfs" ]; then
    chmod -R 755 ${ROOTFS_DIR}
    chmod 700 ${ROOTFS_DIR}/bin/init 2> /dev/null
    chmod 700 ${ROOTFS_DIR}/bin/shell 2> /dev/null
fi

if [ "${FSTYPE}" = "jffs2" ]; then
    if [ "${system}" != "Linux" ] ; then
        ${WIN_JFFS2_TOOL} -q -o ${ROOTFS_IMG} -d ${ROOTFS_DIR} --pagesize=4096
    else
        chmod +x ${JFFS2_TOOL}
        echo ${JFFS2_TOOL} -q -o ${ROOTFS_IMG} -d ${ROOTFS_DIR} --pagesize=4096 --pad=${ROOTFS_SIZE}
        ${JFFS2_TOOL} -q -o ${ROOTFS_IMG} -d ${ROOTFS_DIR} --pagesize=4096 --pad=${ROOTFS_SIZE}
        ${JFFS2_TOOL} -q -o ${ROOTFS_JFFS2} -d ${ROOTFS_DIR} --pagesize=4096
	cp ${ROOTFS_JFFS2} ${ROOTFS_DIR}".jffs2"
	cp ${ROOTFS_IMG} ${ROOTFS_DIR}".jffs2.bin"
    fi
elif [ "${FSTYPE}" = "vfat" ]; then
    if [ "${system}" != "Linux" ] ; then
        echo "Unsupported fs type!"
    else
        BLK_SIZE=512
        CLT_SIZE=2048
        FAT_TAB_NUM=2
        CLT_CNT=$(( ${CLT_SIZE} / ${BLK_SIZE} ))
        if [ $# -eq 3 ]; then
            IMG_SIZE=$3
        else
            FAT32_ITEM_SIZE=4
            RESV_CNT=38
            IMG_MIN_SIZE=1048576
            DIR_SIZE=$(( $(echo $(du -s ${ROOTFS_DIR} | awk '{print $1}')) * 1024 ))
            IMG_SIZE=$(( ${DIR_SIZE} / (1 - ${FAT_TAB_NUM} * ${FAT32_ITEM_SIZE} / ${CLT_SIZE}) + ${RESV_CNT} * ${BLK_SIZE}))
            if [ ${IMG_SIZE} -le ${IMG_MIN_SIZE} ]; then
                IMG_SIZE=${IMG_MIN_SIZE}
            fi
        fi
        IMG_CNT=$(( (${IMG_SIZE} + ${BLK_SIZE} - 1) / ${BLK_SIZE} ))
        echo mtools_skip_check=1 >> ~/.mtoolsrc
        dd if=/dev/zero of=${ROOTFS_IMG} count=${IMG_CNT} bs=${BLK_SIZE}
        mkfs.vfat ${ROOTFS_IMG} -s ${CLT_CNT} -f ${FAT_TAB_NUM} -S ${BLK_SIZE} > /dev/null
        mcopy -i ${ROOTFS_IMG} ${ROOTFS_DIR}/* -/ ::/
    fi
else
    echo "Unsupported fs type!"
fi

现在就ok了只有1019k了

名字不对原来,cp报错了没看到

这次没毛病了

二、正式版本的init进程

Liteos-a中有两个init程序:

  • 测试版本:kernel\liteos_a\apps\init\src\init.c

  • 正式版本:base\startup\services\init_lite\src\main.c

        我之前在杭州实习的时候还研究过linux的init进程之前写过一篇文章,有好多东西当时记得后面离职了一个多月再回来写都忘记了。

简单来说就是init-》sysV init-》systemd

1.1 测试版本

源码:kernel\liteos_a\apps\init\src\init.c 我们在kernel\liteos_a目录下执行make rootfs时使用的就是测试版本, 它的功能很简单:只是启动/bin/shell程序,源码如下:

int main(int argc, char * const *argv)
{
    int ret;
    const char *shellPath = "/bin/shell";
​
    ret = fork();
    if (ret < 0) {
        printf("Failed to fork for shell\n");
    } else if (ret == 0) {
        (void)execve(shellPath, NULL, NULL);
        exit(0);
    }
​
    while (1) {
        ret = waitpid(-1, 0, WNOHANG);
        if (ret == 0) {
            sleep(1);
        }
    };
}

1.2 正式版本

源码:base\startup\services\init_lite\src\main.c

怎么单独编译正式版本,尚未研究。 可以使用这样的命令去编译:python build.py ipcamera_hi3518ev300 -b debug 可以得到rootfs目录,里面有/bin/init, /etc/init.cfg等文件。

1.2.1 配置文件

1. 分析配置文件

配置文件中内容分为两部分:

  • services:定义了多个服务,它对应某些APP

  • jobs:可以定义一些APP,也可去启动服务

    • pre-init:预先执行的初始化

    • init:初始化

    • post-init:最后的初始化

2. 示例
./vendor/huawei/camera/init_configs/init_liteos_a_3516dv300.cfg
./vendor/huawei/camera/init_configs/init_liteos_a_3518ev300.cfg
{
    "jobs" : [{
            "name" : "pre-init",
            "cmds" : [
                "mkdir /storage/data/log",
                "chmod 0755 /storage/data/log",
                "chown 4 4 /storage/data/log",
                "mkdir /storage/data/softbus",
                "chmod 0700 /storage/data/softbus",
                "chown 7 7 /storage/data/softbus",
                "mkdir /sdcard",
                "chmod 0777 /sdcard",
                "mount vfat /dev/mmcblk0 /sdcard rw,umask=000",
                "mount vfat /dev/mmcblk1 /sdcard rw,umask=000"
            ]
        }, {
            "name" : "init",
            "cmds" : [
                "start shell",
                "start apphilogcat",
                "start foundation",
                "start bundle_daemon",
                "start appspawn",
                "start media_server",
                "start wms_server"
            ]
        }, {
            "name" : "post-init",
            "cmds" : [
                "chown 0 99 /dev/dev_mgr",
                "chown 0 99 /dev/hdfwifi",
                "chown 0 99 /dev/gpio",
                "chown 0 99 /dev/i2c-0",
                "chown 0 99 /dev/i2c-1",
                "chown 0 99 /dev/i2c-2",
                "chown 0 99 /dev/i2c-3",
                "chown 0 99 /dev/i2c-4",
                "chown 0 99 /dev/i2c-5",
                "chown 0 99 /dev/i2c-6",
                "chown 0 99 /dev/i2c-7",
                "chown 0 99 /dev/uartdev-0",
                "chown 0 99 /dev/uartdev-1",
                "chown 0 99 /dev/uartdev-2",
                "chown 0 99 /dev/uartdev-3",
                "chown 0 99 /dev/spidev0.0",
                "chown 0 99 /dev/spidev1.0",
                "chown 0 99 /dev/spidev2.0",
                "chown 0 99 /dev/spidev2.1"
         ]
        }
    ],
    "services" : [{
            "name" : "foundation",
            "path" : "/bin/foundation",
            "uid" : 7,
            "gid" : 7,
            "once" : 0,
            "importance" : 1,
            "caps" : [10, 11, 12, 13]
        }, {
            "name" : "shell",
            "path" : "/bin/shell",
            "uid" : 2,
            "gid" : 2,
            "once" : 0,
            "importance" : 0,
            "caps" : [4294967295]
        }, {
            "name" : "appspawn",
            "path" : "/bin/appspawn",
            "uid" : 1,
            "gid" : 1,
            "once" : 0,
            "importance" : 0,
            "caps" : [2, 6, 7, 8, 23]
        }, {
            "name" : "apphilogcat",
            "path" : "/bin/apphilogcat",
            "uid" : 4,
            "gid" : 4,
            "once" : 1,
            "importance" : 0,
            "caps" : []
        }, {
            "name" : "media_server",
            "path" : "/bin/media_server",
            "uid" : 5,
            "gid" : 5,
            "once" : 1,
            "importance" : 0,
            "caps" : []
        }, {
            "name" : "wms_server",
            "path" : "/bin/wms_server",
            "uid" : 0,
            "gid" : 0,
            "once" : 1,
            "importance" : 0,
            "caps" : []
        }, {
            "name" : "bundle_daemon",
            "path" : "/bin/bundle_daemon",
            "uid" : 8,
            "gid" : 8,
            "once" : 0,
            "importance" : 0,
            "caps" : [0, 1]
        }
    ]
}

这种配置文件都是这种键值对的形式,我现在也分不清应该叫他哈希还是json了

3. 配置文件执行过程

各种dojob,job的内容就是上面那些

系统移植到这就完成了

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

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

相关文章

MinIO+Docker从零搭建一个文件存储服务

本文&#xff0c;将带你使用 MinIO Docker 来从零搭建一个文件存储服务&#xff0c;并在 SpringBoot 项目中上传图片到 MinIO 中。 一.为什么要自己搭建&#xff1f; 对于个人来说&#xff0c;当然是攻击风险。第三方对象存储服务通常会收取费用&#xff0c;尤其随着数据量的…

[自研开源] MyData 数据集成之任务调度模式 v0.7

开源地址&#xff1a;gitee | github 详细介绍&#xff1a;MyData 基于 Web API 的数据集成平台 部署文档&#xff1a;用 Docker 部署 MyData 使用手册&#xff1a;MyData 使用手册 试用体验&#xff1a;http://demo.mydata.work 交流 Q 群&#xff1a;430089673 概述 本…

[C++]C/C++内存管理——喵喵要吃C嘎嘎5

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

vscode 问题汇总

vscode vscode 问题汇总 一: vscode 大纲 文档中找不到符号二:vscode 找不到头文件三:级目录 一: vscode 大纲 文档中找不到符号 报错原因&#xff1a; 缺少c/c必要插件 安装插件&#xff1a;名称: C/C名称: C/C Extension Pack名称: C Intellisense名称: CMake名称: CMake To…

学习网络编程No.15【高级IO之多路转接】

引言&#xff1a; 北京时间&#xff1a;2024/3/19/11:16&#xff0c;若是说记忆有克星的话&#xff0c;那么一定是时间。若是说耐心有克星的话&#xff0c;那么一定是人的心态。连续几天睡眠问题&#xff0c;加上环境影响&#xff0c;上篇博客还有部分知识只能放在该篇博客介绍…

太牛逼了!视频号下载器手机版(工具+方法)绝了

在众多的视频号下载中&#xff0c;可以说这个工具真的是很牛逼了&#xff01;这里问大家一个问题&#xff01; 你使用视频号下载工具以及视频号下载器都会不会因时间导致而失效呢&#xff1f; 自从小编使用了这款工具后&#xff0c;就不会因为视频失效而烦恼。 很多人免费推荐…

c++进阶(c++里的多态)

文章目录 1.多态的概念1.1多态的概念 2.动态的定义及实现2.1多态的构成条件2.2虚函数2.3虚函数的重写虚函数重写的两个例外 2.4 C11 override和final2.5重载、覆盖&#xff08;重写&#xff09;、隐藏&#xff08;重定义&#xff09;的对比 3.抽象类3.1概念3.2接口继承和实现继…

记录微信小程序云开发的增删改查

目录 一、准备工作 1、创建集合添加数据 2、设置数据权限 3、小程序连接数据库 二、增删改查 1.查 1、查询单集合所有数据 2、条件查询 1、直接:相当于等于 2、调用指令 3、查询单条&#xff08;根据id查询&#xff09; 2.增 3.改 4.删 一、准备工作 1、创建集合添…

Linux--任务管理与守护进程

目录 任务管理 进程组概念 作业概念 会话概念 补充 守护进程 基本概念 守护进程的查看 守护进程的创建 自己手写守护进程 使用系统调用函数创建守护进程 任务管理 进程组概念 每一个进程除了有一个进程ID之外&#xff0c;还有一个进程组ID&#xff0c;进程组是一个或…

由浅到深认识Java语言(29):集合

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

光致发光荧光量子产率测试光纤光谱仪

光致发光荧光量子产率测试系统是一种用于测量材料发光效率的高精度设备&#xff0c;它通过光致发光方法来确定样品的发射效率。光致发光荧光量子产率测试系统不仅提供了一种高效、可靠的测量手段&#xff0c;而且对于提升科学研究和工业应用中的发光材料性能具有重要作用。通过…

Python:基础语法

一、import与from.....import 有时候我们需要使用一些第三方库或包时&#xff0c;我们就需要通过import或from.....import导入模块。 # 导入库 import sys print("hello,world") 当我们自己写了些函数&#xff0c;在其他py文件&#xff0c;我们也可以通过from.....im…

【Java程序设计】【C00361】基于Springboot的考勤管理系统(有论文)

基于Springboot的考勤管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以及idea&…

「10」文本(GDI+):添加文字,可设置背景添加移动效果

「10」文本&#xff08;GDI&#xff09;添加文字&#xff0c;可设置背景添加移动效果 在OBS软件里&#xff0c;通过来源组件「文本&#xff08;GDI&#xff09;」&#xff0c;您可以添加任意您想要呈现的文字&#xff0c;在直播窗口中显示&#xff0c;它可以是提示语、广告词、…

SQLServer SEQUENCE用法

SEQUENCE&#xff1a;数据库中的序列生成器 在数据库管理中&#xff0c;经常需要生成唯一且递增的数值序列&#xff0c;用于作为主键或其他需要唯一标识的列的值。为了实现这一功能&#xff0c;SQL Server 引入了 SEQUENCE 对象。SEQUENCE 是一个独立的数据库对象&#xff0c;用…

python.类

1.类用class定义 name等是属性 是成员变量 定义完类了要定义对象 class Student: #定义了一个Student的类nameNoneageNonegenderNonesdu1Student() #创建了一个Student类的对象 sdu1.nameleo sdu1.age20 sdu1.gendermaleprint(sdu1.name) print(sdu1.age) print(sdu1.…

Day21|二叉树part07:530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

530. *二叉搜索树的最小绝对差&#xff08;双指针题型&#xff09; 众所周知二叉搜索树的中序遍历序列是一个有序数组&#xff0c;因此最基本的方法就是遍历得到中序序列再进行计算&#xff0c;实际上可以用双指针法&#xff0c;记录中序遍历前一个指针和当前指针的差值&#…

一个bitter组织下载器样本分析

BITTER 该组织最早在2016由美国安全公司Forcepoint进行了披露&#xff0c;并且命名为“BITTER”&#xff0c;同年国内友商360也跟进发布了分析报告&#xff0c;命名为“蔓灵花” 样本分析 MD5&#xff1a;806626d6e7a283efffb53b3831d53346 vt:看文件名判断是伪装成pdf的自解…

小学生古诗文大会往届真题测一测(来自主办方)和非常详细的解析

新学期开学一眨眼已经过了一个多月了&#xff0c;有家长朋友开始关心2024年上海市小学生古诗文大会什么时候开始&#xff1f;如何准备小学生古诗文大会&#xff1f;如何激发孩子学习古诗词的兴趣&#xff1f;如何提高小学古诗词和古诗文大会的学习成绩&#xff1f;... 最近&…

YT8531调试记录

总结 还是从设备树&#xff0c;mac驱动&#xff0c;mac驱动对mdio总线的注册&#xff0c;phy驱动 &#xff0c;phy的datasheet&#xff0c;cpu的datasheet 几个方面来看来看 0.确认供电&#xff0c;以及phy的地址(一般会有多个地址&#xff0c;根据相关引脚电平可配置) 1.确…