Linux系统移植开发篇1:系统移植前说明及源码编译

发布者:SereneSoul55最新更新时间:2023-10-30 来源: elecfans关键字:Linux  系统移植 手机看文章 扫描二维码
随时随地手机看文章

本文章为《STM32MP157 Linux系统移植开发篇》系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板)。stm32mp157是ARM双核,2个A7核,1个M4核,A7核上可以跑Linux操作系统,M4核上可以跑FreeRTOS、RT-Thread等实时操作系统,STM32MP157开发板所以既可以学嵌入式linux,也可以学stm32单片机


针对FS-MP1A开发板,除了Linux系统移植篇外,还包括其他多系列教程,包括Cortex-A7开发篇、Cortex-M4开发篇、扩展板驱动移植篇、Linux应用开发篇、FreeRTOS系统移植篇、Linux驱动开发篇、硬件设计篇、人工智能机器视觉篇、Qt应用编程篇、Qt综合项目实战篇等。
————————————————

系统移植前说明

关于命令行提示符:

在实验步骤中会涉及到执行命令的操作,为区分操作是在Ubuntu上完成还是在开发板上完成,不同操作会有不同的提示符:

Ubuntu操作时命令行提示符为:linux@ubuntu:$

开发板Linux系统下操作时命令行提示符为:root@fsmp1a:$

开发板u-boot期间操作是命令行提示符为:STM32MP>

注意:由于部分操作需要进入特定目录下完成,导致命令行提示符较长如:

linux@ubuntu:~/FS-MP1A/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/u-boot-stm32mp-2020.01-r0/u-boot-stm32mp-2020.01$

过长的命令行提示符不便于文档编写,所以本文中所有命令行提示符均忽略了当前工作目录的显示,命令行提示符不代表当前目录,具体当前操作是在哪个目录下完成,请结合文档上下文确定。

 

1. 源码编译

1.1 源码目录结构

1.1.1 编译环境配置

由于OpenSTLinux所涉及到的源码较多,且有路径的依赖。所以请按照本文的说明建立源码文件夹。

在用户home目录下建立fs-mp1a文件夹。

linux@ubuntu: $ cd ~

linux@ubuntu: $ mkdir fs-mp1a

将工作目录切换到fs-mp1a目录下,建立linux、optee-os、trusted-firmware、u-boot、tools文件夹

linux@ubuntu: $ cd ~/fs-mp1a

linux@ubuntu: $ mkdir linux optee-os trusted-firmware u-boot tools

 

请务必按照此目录名称建立文件夹,否则会导致后续的OpenSTLinux系统编译错误。

 

1.1.2 SDK工具链安装

  1.  

 

OpenSTLinux SDK是Yocto SDK定制发行版的软件开发套件,它提供了独立的交叉开发工具链和针对特定镜像中所使用到的特定链接库。

开发资料光盘中提供的SDK是基于FS-MP1A开发板的定制交叉编译工具链,该工具链可用于FS-MP1A开发板中所有项目的编译与调试。

将资料光盘下【华清远见-FS-MP1A开发资料1-工具软件】的en.SDK-x86_64-stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24.tar.xz复制到ubuntu主机中,可以采用共享文件夹的方式也可以使用tfp方式将文件存入FS-MP1A源码目录下的tools文件夹下进行解压。

linux@ubuntu: $ tar -xvf en.SDK-x86_64-stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24.tar.xz -C /home/linux/fs-mp1a/tools/

解压之后得到sdk目录,进入到sdk文件夹之后内容如下。

 

执行st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1-openstlinux-5.4-dunfell-mp1-20-06-24.sh安装脚本。

linux@ubuntu: $ ./st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1-openstlinux-5.4-dunfell-mp1-20-06-24.sh

运行之后会提示输入安装位置,直接按回车键默认即可:

 

继续询问是否安装SDK,输入Y,回车

 

默认安装路径安装在opt目录下,这个目录需要有root权限,所以安装时需要使用sudo安装,过程中需要输入用户的sudo密码(如果当前用户sudo功能已经授权,这个密码就是用户的登录密码),输入密码后开始进行安装。

 

输入密码后等待安装,安装后显示如下:

 

导入sdk

linux@ubuntu: $ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

验证开发工具是否安装正确,显示版本信息如下图所示。

linux@ubuntu: $ $CC --version

 

1.1.3 源码导入

  1.  

 

Bootloader源码

 

将光盘资料中【华清远见-FS-MP1A开发资料2-程序源码5-预装系统源码u-boot】下的u-boot-fsmp1a-2020.01.tar.xz和Makefile.sdk导入到fs-mp1a目录下u-boot文件夹中

将u-boot-fsmp1a-2020.01.tar.xz解压之后得到u-boot-fsmp1a-2020.01文件夹

linux@ubuntu:$ tar -xvf u-boot-fsmp1a-2020.01.tar.xz

 

     trusted-firmware源码

 

将光盘资料中【华清远见-FS-MP1A开发资料2-程序源码5-预装系统源码tf-a】下的fsmp1a-trusted-firmware-2.2.tar.xz和Makefile.sdk导入到fs-mp1a目录下trusted-firmware文件夹中

将fsmp1a-trusted-firmware-2.2.tar.xz解压之后得到fsmp1a-trusted-firmware-2.2文件夹

linux@ubuntu:$ tar -xvf fsmp1a-trusted-firmware-2.2.tar.xz

 

optee_os源码

将光盘资料中【华清远见-FS-MP1A开发资料2-程序源码5-预装系统源码optee】下的fsmp1a-optee_os-3.9.0.tar.xz和Makefile.sdk导入到fs-mp1a目录下optee-os文件夹中

将fsmp1a-optee_os-3.9.0.tar.xz解压之后得到fsmp1a-optee_os-3.9.0文件夹

linux@ubuntu:$ tar -xvf fsmp1a-optee_os-3.9.0.tar.xz

 

 

linux源码

盘资料中【华清远见-FS-MP1A开发资料2-程序源码5-预装系统源码linux】下的fsmp1a-linux-5.4.31.tar.xz导入到fs-mp1a目录下linux文件夹中

将fsmp1a-linux-5.4.31.tar.xz解压之后得到fsmp1a-linux-5.4.31文件夹

linux@ubuntu:$ tar -xvf fsmp1a-linux-5.4.31.tar.xz

 

Yocto源码

盘资料中【华清远见-FS-MP1A开发资料2-程序源码5-预装系统源码Yocto】下的fsmp1a-ST-Yocto.tar.xz导入到fs-mp1a目录下

将fsmp1a-ST-Yocto.tar.xz解压之后得到fsmp1a-ST-Yocto文件夹

linux@ubuntu:$ tar -xvf fsmp1a-ST-Yocto.tar.xz

盘资料中【华清远见-FS-MP1A开发资料2-程序源码5-预装系统源码Yocto】下的downloads.tar.xz导入到由fsmp1a-ST-Yocto.tar.xz得到的fsmp1a-ST-Yocto文件夹下。

将downloads.tar.xz解压之后得到downloads文件夹。

linux@ubuntu:$ tar -xvf downloads.tar.xz

 

 

至此OpenSTLinux全部源码就导入完成了。导入源码完成后的fs-mp1a目录结构如下。

 

 

1.2 u-boot源码编译

导入交叉编译工具链并验证

linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

linux@ubuntu:$$CC --version

 

 

将工作目录切换到u-boot-fsmp1a-2020.01源码目录下。

linux@ubuntu:$ cd ${HOME}/fs-mp1a/u-boot/u-boot-fsmp1a-2020.01

 

 

导入配置文件。

fsmp1a的u-boot可以支持basic、trusted、optee三种配置。分别对应三种配置文件。

 

 

这里使用trusted配置来编译

linux@ubuntu:$ make stm32mp15_trusted_defconfig

 

 

编译源码

linux@ubuntu:$ make DEVICE_TREE=stm32mp157a-fsmp1a all

编译完成后得到u-boot.img文件

 

 

使用Makefile.sdk编译

除了传统的编译方式之外还可以通过上层目录下的Makefile.sdk来编译镜像。使用此方法需要将先前编译过的源码清除后再编译,否则会导致编译出错。

linux@ubuntu:$ make distclean

编译basic镜像

linux@ubuntu:$ make -f $PWD/../Makefile.sdk all UBOOT_CONFIGS=stm32mp15_fsmp1a_basic_defconfig,basic,u-boot.img

编译成功后会在上级目录下生成build-basic目录。其中的u-boot-stm32mp157a-fsmp1a-basic.img和u-boot-spl.stm32-stm32mp157a-fsmp1a-basic即为生成的烧写镜像

 

编译trusted镜像

linux@ubuntu:$make -f $PWD/../Makefile.sdk all UBOOT_CONFIGS=stm32mp15_fsmp1a_trusted_defconfig,trusted,u-boot.stm32

编译成功后会在上级目录下生成build-trusted目录。其中的u-boot-stm32mp157a-fsmp1a-trusted.stm32即为生成的烧写镜像

 

 

编译optee镜像

linux@ubuntu:$ make -f $PWD/../Makefile.sdk all UBOOT_CONFIGS=stm32mp15_fsmp1a_trusted_defconfig,optee,u-boot.stm32

编译成功后会在上级目录下生成build-optee目录。其中的u-boot-stm32mp157a-fsmp1a-optee.stm32即为生成的烧写镜像

 

 

编译basic、trusted、optee三种镜像

linux@ubuntu:$ make -f $PWD/../Makefile.sdk all

编译成功后会在上级目录下会同时生成build-basic、build-trusted、build-optee三个目录。

 

 

 

1.3 tf-a源码编译

导入交叉编译工具链并验证

linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

linux@ubuntu:$ $CC --version

 

 

将工作目录切换到fsmp1a-trusted-firmware-2.2源码目录下。

linux@ubuntu:$ cd ${HOME}/fs-mp1a/trusted-firmware/fsmp1a-trusted-firmware-2.2

编译trusted镜像

linux@ubuntu:$ make -f $PWD/../Makefile.sdk TFA_DEVICETREE=stm32mp157a-fsmp1a TF_A_CONFIG=trusted ELF_DEBUG_ENABLE='1' all

编译成功之后会在上级目录下生成build目录,build目录下的trusted目录中tf-a-stm32mp157a-fsmp1a-trusted.stm32即为烧写镜像。

 

 

编译optee镜像

linux@ubuntu:$ make -f $PWD/../Makefile.sdk TFA_DEVICETREE=stm32mp157a-fsmp1a TF_A_CONFIG=optee ELF_DEBUG_ENABLE='1' all

编译成功之后会在上级目录下生成build目录,build目录下的optee目录中tf-a-stm32mp157a-fsmp1a-optee.stm32即为烧写镜像。

 

 

编译trusted、optee两种镜像

linux@ubuntu:$ make -f $PWD/../Makefile.sdk all

编译成功后会在上级目录下生成build目录,该目录下同时生成了trusted和optee两个目录。

 

 

1.4 optee-os源码编译

 

导入交叉编译工具链并验证

linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

linux@ubuntu:$ $CC --version

 

 

将工作目录切换到fsmp1a-optee_os-3.9.0源码目录下。

linux@ubuntu:$ cd ${HOME}/fs-mp1a/optee-os/fsmp1a-optee_os-3.9.0

 

 

编译源码

linux@ubuntu:$ make -f $PWD/../Makefile.sdk CFG_EMBED_DTB_SOURCE_FILE=stm32mp157a-fsmp1a

编译成功之后会在上级目录下生成build目录其目录下的tee-header_v2-stm32mp157a-fsmp1a-optee.stm32、tee-pageable_v2-stm32mp157a-fsmp1a-optee.stm32、tee-pager_v2-stm32mp157a-fsmp1a-optee.stm32即为烧写镜像。

 

 

 

1.5 linux源码编译

 

导入交叉编译工具链并验证

linux@ubuntu:$ linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

linux@ubuntu:$ $CC --version

 

 

将工作目录切换到fsmp1a-linux-5.4.31源码目录下。

linux@ubuntu:$cd ${HOME}/fs-mp1a/linux/fsmp1a-linux-5.4.31

 

 

导入配置文件

linux@ubuntu:$make stm32_fsmp1a_defconfig

 

 

如果需要修改配置可以使用如下命令来启动menuconfig

linux@ubuntu:$make menuconfig

 

编译内核镜像

linux@ubuntu:$make -j4 ARCH=arm uImage vmlinux LOADADDR=0xC2000040

编译成功之后会在arch/arm/boot/目录下生成uImage文件

 

 

在源码目录下生成用于调试的vmlinux文件

 

 

编译设备树文件

linux@ubuntu:$make ARCH=arm dtbs

编译成功之后会在arch/arm/boot/dts目录下生成stm32mp157a-fsmp1a.dtb、stm32mp157a-fsmp1a-rgb070.dtb和stm32mp157a-fsmp1a-mipi050.dtb文件

 

 

stm32mp157a-fsmp1a-rgb070.dtb为rgb屏幕的设备树文件

stm32mp157a-fsmp1a-mipi050.dtb为mipi屏幕的设备树文件

编译内核模块

linux@ubuntu:$make ARCH=arm modules

linux@ubuntu:$make ARCH=arm INSTALL_MOD_PATH="$PWD/../build/install_artifact" modules_install

编译成功后会在上层目录生成build目录其中的install_artifact目录中存放的即为导出的驱动模块。

 

1.6 Yocto构建系统

将工作目录切换到fsmp1a-ST-Yocto源码目录下。

linux@ubuntu:$cd ${HOME}/fs-mp1a/ fsmp1a-ST-Yocto

 

导入编译配置

linux@ubuntu:$DISTRO=openstlinux-weston MACHINE=fsmp1a source layers/meta-farsight/scripts/envsetup.sh

如下界面提示主机的ubuntu版本与期望的版本不同,这里输入y

 

 

如果是第一次配置,需要同意一些协议,输入y。。

 

 

之后按空格键到协议底部

 

 

输入y会出现如下界面

 

 

编译源码

linux@ubuntu:$bitbake fs-mp1a-weston

注意:在编译Yocto系统时确保ubuntu主机可以连接互联网

由于OpenSTLinux涉及到的源码较多,因此编译会比较耗时。

编译完成后所生成的镜像文件保存在tmp-glibc/deploy/images/fsmp1a/目录下。

 

这里生成了fs-mp1a开发板所需的烧写镜像,包括basic、trusted、optee三种。

basic专有镜像

u-boot-spl.stm32-stm32mp157a-fsmp1a-basic

u-boot-stm32mp157a-fsmp1a-basic.img

trusted专有镜像

tf-a-stm32mp157a-fsmp1a-trusted.stm32

u-boot-stm32mp157a-fsmp1a-trusted.stm32

optee专有镜像

tf-a-stm32mp157a-fsmp1a-optee.stm32

u-boot-stm32mp157a-fsmp1a-optee.stm32

tee-header_v2-stm32mp157a-fsmp1a-optee.stm32

tee-pageable_v2-stm32mp157a-fsmp1a-optee.stm32

tee-pager_v2-stm32mp157a-fsmp1a-optee.stm32

公用镜像

st-image-bootfs-openstlinux-weston-fsmp1a.ext4

st-image-userfs-openstlinux-weston-fsmp1a.ext4

st-image-vendorfs-openstlinux-weston-fsmp1a.ext4

fs-mp1a-weston-openstlinux-weston-fsmp1a.ext4

配置文件

flashlayout_fs-mp1a-weston文件夹中存放的是烧写时所使用的配置文件

 

由上图可以看到配置文件分为sdcard烧写配置和emmc烧写配置。


关键字:Linux  系统移植 引用地址:Linux系统移植开发篇1:系统移植前说明及源码编译

上一篇:一种基于STM32的力反馈型康复机器人控制系统设计
下一篇:存储器系统的非对齐访问

推荐阅读最新更新时间:2024-10-17 10:26

Linux下驱动STN彩色LCD
伴随着高性能嵌入式处理器的飞速发展与普及,特别是ARM处理器系列的出现,嵌入式系统的功能也变得越来越强大。以前的单色LCD已不能满足现今的各种多媒体应用,彩色LCD被越来越多地应用到嵌入式系统中。同时,在应用需求的促使下,许多工作在Linux下的图形界面软件包的开发和移植工作中都涉及到底层LCD驱动的开发问题。 在硬件采用Intel ASSABET开发板,软件采用Linux 2.4.19平台,编译器为arm-linux-gcc的交叉编译器作为开发的前提下,因为ASSABET开发板上使用的是Sharp 3.9英寸320%26;#215;240 TFT彩色LCD,现改用Kyocera 7.7英寸640%26;#215;480 S
[应用]
Linux基金会与一批领先科技公司启动开源Dronecode项目
Dronecode项目将推进无人机开发进程;项目创始成员包括:3D Robotics、百度、Box、DroneDeploy、英特尔、jDrones、Laser Navigation、高通科技、SkyWard、Squadrone System、Walkera和Yuneec。 Marketwired 2014年10月13日德国杜塞尔多夫消息----欧洲嵌入式Linux大会----专注于推动Linux和协作开发发展的非营利性组织Linux基金会(Linux Foundation)今日宣布创立Dronecode项目(Dronecode Project)。该项目将把现有的开源无人机项目和资产整合为一个由Linux基金会管理的非营利
[嵌入式]
基于ARM-Linux与GPRS技术的家庭智能控制终端
本文中介绍的方案,结合了GPRS(General Packet Radio Service)技术永远在线,速度快,接入范围广,体积小,功耗低等优点,采用RS485工业总线,设计实现了一种基于嵌入式系统的家庭智能控制器。用户可以通过短信及互联网等方式现远程无线监控,在手机和互联网相当普及的今天,为用户提供了更简单、方便的选择。同时由于该控制器RS485接口的特殊设计,外挂节点可以由原来的32个扩展到64个,解决了家用设备的布线组网以及控制等问题。 1 系统设计 从结构上看主要分为用户,控制器,和RS485总线的家用设备控制三个部分。用户通过手机短信或网络方式向控制器的GPRS模块发送命令,而控制器也通过GPRS模块向用户反馈信息
[单片机]
基于ARM-<font color='red'>Linux</font>与GPRS技术的家庭智能控制终端
基于Linux-2.6.16的高速模数转换器的应用
1 引言 在嵌入式系统中基于ARM微核的嵌入式处理器已经成为市场主流。随着ARM技术的广泛应用,建立面向ARM构架的嵌入式操作系统成为测量行业的热点问题。在LINUX操作系统中添加新的外部设备时,只需为其添加对应的驱动程序即可。介绍另一种驱动程序的编写方式,即采用MISC类设备。其实质也是一个字符设备。可将用户各种不同的驱动设备类型合成到一种类型中,共用一个主设备号,通过不同的次设备号和设备节点名来区分。可方便管理这些驱动模块。字符型的驱动设备模块在挂载时都要分配主设备号、次设备号和创建设备节点名,在卸载驱动设备时还必须同时删掉设备节点名。通过采用MISC类设备,在挂载设备驱动时无须再用到mknod命令分配主设备号、次设备
[模拟电子]
Linux系统下超线程感知的调度算法研究
  随着计算机应用的日益普及,用户对计算机的处理能力的需求成指数级增长。为了满足用户的需求,处理器生产厂商采用了诸如超流水、分支预测、超标量、乱序执行及缓存等技术以提高处理器的性能。但是这些技术的采用增加了微处理器的复杂性,带来了诸如材料、功耗、光刻、电磁兼容性等一系列问题。因此处理器设计人员开始寻找新的途径来提高处理器的性能。Intel公司于2002年底推出了超线程技术,通过共享处理器的执行资源,提高CPU的利用率,让处理单元获得更高的吞吐量。    1 超线程技术背景   传统的处理器内部存在着多种并行操作方式。①指令级并行ILP(Instruction Level Paramllelism):同时执行几条指令,单CP
[嵌入式]
基于ARM和Linux的字符采集与识别系统
传统纸质读物的数字化以及诸如条码识别等字符识别系统都离不开图像的读入与识别,然而目前广泛使用的字符识别设备将这两部分独立开,即由图像读入设备(如扫描仪)和安装于计算机上的识别软件构成,但这样的设备构成离不开安装识别软件的计算机,造成成本上升和使用不便。随着电子产品的普及,具有摄像功能的电子产品及其上的识别软件也可以构成一个字符识别系统,但是这种识别系统的识别速度受到摄像头调焦的限制,难以广泛应用。文中提出的便携式字符采集和识别系统,其硬件平台是基于接触式图像传感器(CIS)与ARM9处理器S3C2410,软件平台是基于嵌入式Linux系统,可以克服以上两种设备的缺点,同时满足方便性和快速性的要求。另一方面,由于设备基于Li-nux
[嵌入式]
基于S3C2410-ARM-Linux静态映射分析
s3c2410_gpio_cfgpin(S3C2410_GPB0, S3C2410_GPB0_TOUT0); 我们可以这样控制外设寄存器,想过它怎么实现的吗? 首先分析下 struct machine_desc (include/asm-arm/Mach/Arch.h) 这是一个非常重要的结构体,内核通过 machine_desc 来控制体系架构相关部分的初始化,包括map_io,init_irq,init_machine,pthys_io,timer等 struct machine_desc { /* * Note! The first five elements are
[单片机]
linux之rootfs (UBIFS)
以下切换到root用户进行操作(在其他用户模式下编译出来的rootfs登录时不是以root登录,好像是比较麻烦,简单起见先) 修改Makefile: CROSS_COMPILE = /opt/arm-2010q1/bin/arm-none-linux-gnueabi- ARCH = arm 保存退出后: make menuconfig 1.18.1已经把make install目录默认改成./_install了。而且也不打算改成静态库,所以没啥好改的,看一看保存退出后: make (生成busybox) make install (生成文件到_install目录) 然后修改_install/bi
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved