网站导航: 首页 > 设计参考 > 正文 文章搜索
S3C44B0 调试笔记—uClinux
 
文章编号:
090104155604
文章分类: 单片机 ARM
点 击:
...
关 键 词: S3C44B0,,uClinux,调试笔记
文章来源:
网络
摘 要:
编译出一个uClinux的内核出来,就必须在linux环境下,windows下是编译不了的(如果可行的话,我很愿意那样做)。一阵迷惑,根本没有方向,从何下手。后来在44B0 QQ群里有人指点使用vmware + FC4...

    上班时间很少有机会搞这些东西,基本上都是下班在家里搞,不过在公司写写文挡还是可以的。调试uClinux也是断断续续进行的。以前根本没接触过linux,搞起来可真是头都要大了。虽说到最后调通比前面耗时少很多,主要原因是网上很多参考资料。但个人感觉这部分难度要更大一些。
    接着前面的说吧,编译出一个uClinux的内核出来,就必须在linux环境下,windows下是编译不了的(如果可行的话,我很愿意那样做)。一阵迷惑,根本没有方向,从何下手。后来在44B0 QQ群里有人指点使用vmware + FC4。Vmware是一款虚拟平台软件,它支持在windows系统中运行linux,就好象cygwin一样,大家都说cygwin很复杂,不是很好用,我也不想去试了。FC4是Fedora Core 4的缩写,是Red Hat Linux平台的一个版本。
 到网上下载vmware5,然后在windows下直接安装就可以了。安装后运行vmware,进行FC4的安装,这部分挺简单的,关于这方面的细节可以到网上查一下。注意一点,linux的空间尽量多分一点儿,最好不要小于8G。
 到网上下载这三个文件:  arm-elf-tools-20030314.sh
uClinux-dist-20040408.tar.gz
uClinux-20040408-ARMSYS.rar
参考下载地址:
http://www.uclinux.org/pub/uClinux/m68k-elf-tools/arm-elf-tools-20030314.sh
http://www.uclinux.org/pub/uClinux/dist/uClinux-dist-20040408.tar.gz
http://www.hzlitai.com.cn/download/uClinux-20040408-ARMSYS.rar
放到同一个文件夹中,例如:uClinux Share
 然后就可以在windows上通过vmware启动FC4了,注意,启动之前修改一下linux光盘指向的内容,将光盘设置到VMware\VMware Workstation\linux.iso,这里放的是vmware-tools。然后启动就可以了。一下子就进入到了linux的世界。我以前从没玩过linux,但感觉linux还是很不错的。接下来就是安装vmware-tools,我们用这个工具主要是用于window系统和linux系统文件共享。
 让虚拟机运行于窗口状态,不要全屏,按ctrl+alt让鼠标释放出来。在vmware的菜单栏上选择“虚拟机”/"安装虚拟机工具“。然后切换到客户操作系统,即linux。 双击linux的光盘图标进入linux的虚拟光盘,可以看到两个文件,一个是压缩包,一个是rmp包。右键点击rmp包,“用install Packages打开“。(如果不能正常打开虚拟光盘,可以从linux的终端里运行mount /media/cdrom)上述操作完成后,进入/usr/bin目录,查找vmware-config-tools.pl.(ls /usr/bin/*.pl).找到后,运行它。即(./vmware-config-tools.pl)注意,斜杠前有一个点。一路回车即可完成安装。
 完成后,我们就可以在/mnt/hgfs中,看到我们刚才在vmware里设置的windows共享文件夹“uClinux Share”。接下来就是搭建uClinux交叉编译环境。
 首先,我们安装arm-elf-tools。将arm-elf-tools-20030314.sh拷贝到根目录,运行安装:sh arm-elf-tools-20030314.sh
#ls /usr/local/bin        
可以看到arm-elf-gcc已经安装ok.
 然后,安装uClinux-dist内核。将uClinux-dist-20040408.tar.gz拷贝到/usr/local/bin  解压 uClinux-dist-20040408.tar.gz 文件到 uClinux-dist 目录:
        tar xvzf uClinux-dist-20040408.tar.gz
此时当前工作目录下增加了一个名为 uClinux-dist 的目录。
 接着,我们安装patch。将/usr/local/bin/uClinux-dist/vector/Samsung/4510B文件夹重命名成/usr/local/bin/uClinux-dist/vector/Samsung/44B0,将uClinux-20040408-ARMSYS.rar拷贝到uClinux-dist目录下,运行:
 tar xvzf uClinux-ARMSYS-20040801.tar.gz
 解压补丁包后,生成patch文件uClinux-20040408-ARMSYS.patch。然后,安装patch文件:
 patch –p1 < uClinux-20040408-ARMSYS.patch
安装过程中可能会出现一些错误信息,可以手动地按照patch文件的内容在指定的文件处进行修改一下。主要修改对象是uClinux-dist/vector/Samsung/44b0文件夹中的两个文件:Makefile 和 rc。提醒大家注意这两个文件。(建议修改这两个文件之前,进行一次编译)

 补丁打好后,我们还要做一些修改:
 手动修改uClinux-dist/Makefile
 在TFTPDIR = /tftpboot后加上:
 LINUXTARGET=bzImage
 否则make 不过。 在make image  时,cp命令,报找不到
 $(ROOTDIR)/$(LINUXDIR)/arch/armnommu/root/zImage文件。不能生成image.rom文件。
 make menuconfig
 make dep
 make clean
 make lib_only
 make user_only
 make romfs
 make image
 make
 生成image.rom后,通过共享文件夹uClinux Share 将image.rom传递到windows系统下。然后,切换到windows系统,将image.rom通过网线下载(我板子已经修好了)到ram,然后烧录到flash的0x100000位置,运行uclinux 没有反应。

 错误在哪里呢?后来在立宇泰的论坛里找到了三个配置文件,(config_main/config_kernel/config_user)这三个文件都是make menuconfig时候用的。重新运行
 make menuconfig
 进入配置主界面。选中Customize Kernel Settings 和  user config setting(就是第二和第三项,具体记不清了)。退出保存,然后进入Customize Kernel Settings,选LOAD,输入文件所在路径。(例如:/mnt/hgfs/uClinux/config/config_kernel)注意,LOAD完成,此处去掉了USB选项。 保存,退出。 进入user config setting,同样方法LOAD config_user。保存,退出。然后,
 make dep
 make clean
 make lib_only
 make user_only
 make romfs
 make image
 make
 得到image.ram 和image.rom.。

  将两个文件共享到windows下,用上面的方法,程序运行如下:
\>uclinux
Uncompressing Linux........................................................ done, booting the kernel.

Linux version 2.4.24-uc0 (root@localhost) (gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from http://www.snapgear.com/)) #13
Processor: Samsung S3C44B0X revision 0
Architecture: S3C44B0X
On node 0 totalpages: 2048
zone(0): 0 pages.
zone(1): 2048 pages.
zone(2): 0 pages.
Kernel command line: root=/dev/rom0 init=/ lnuxrc
然后就停止了。死机。。。。。。
 后来发现这里是我的中断向量表出现了问题,中断地址应该指向uClinux运行的地址空间,即0x0c0000xx。修改之后编译得到boot.bin,烧录到FLASH的零地址。然后再次运行uClinux:
\>uclinux
Uncompressing Linux........................................................ done, booting the kernel.
Linux version 2.4.24-uc0 (root@localhost) (gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from http://www.snapgear.com/)) #23
Processor: Samsung S3C44B0X revision 0
Architecture: S3C44B0X
On node 0 totalpages: 2048
zone(0): 0 pages.
zone(1): 2048 pages.
zone(2): 0 pages.
Kernel command line: root=/dev/rom0 init=/linuxrc
Calibrating delay loop... 31.84 BogoMIPS
Memory: 8MB = 8MB total
Memory: 6252KB available (1591K code, 170K data, 44K init)
Dentry cache hash table entries: 1024 (order: 1, 8192 bytes)
Inode cache hash table entries: 512 (order: 0, 4096 bytes)
Mount cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 2048 (order: 1, 8192 bytes)
POSIX conformance testing by UNIFIX
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Starting kswapd
ttyS0 at I/O 0x1d00000 (irq = 3) is a S3C44B0
ttyS1 at I/O 0x1d04000 (irq = 2) is a S3C44B0
Blkmem copyright 1998,1999 D. Jeff Dionne
Blkmem copyright 1998 Kenneth Albanowski
Blkmem 1 disk images:
0: C700000-CEFFFFF [VIRTUAL C700000-CEFFFFF] (RO)
RAMDISK driver initialized: 16 RAM disks of 1024K size 1024 blocksize
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 512 bind 512)
Kernel panic: VFS: Unable to mount root fs on 1f:00
然后又DOWN掉了。。。。。。。。。
 后来找到了问题,问题出在文件系统romfs。
修改:/uClinux-dist/Linux-2.4.x/Driver/Block/blkmem.c
-#ifdef CONFIG_BOARD_SNDS100
+//#ifdef CONFIG_BOARD_SNDS100
extern char romfs_data[];
extern char romfs_data_end[];
-#endif
+//#endif

#ifdef CONFIG_BOARD_MBA44
-{0, 0xc700000, -1},  /*{0, 0x100000, -1}*/
+{0, romfs_data, -1}, /*{0, 0x100000, -1}*/
#endif
 
修改后
make linux
make
运行结果:
\>uclinux
Uncompressing Linux........................................................ done, booting the kernel.
Linux version 2.4.24-uc0 (root@localhost) (gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from http://www.snapgear.com/)) #23
Processor: Samsung S3C44B0X revision 0
Architecture: S3C44B0X
On node 0 totalpages: 2048
zone(0): 0 pages.
zone(1): 2048 pages.
zone(2): 0 pages.
Kernel command line: root=/dev/rom0 init=/linuxrc
Calibrating delay loop... 31.84 BogoMIPS
Memory: 8MB = 8MB total
Memory: 6252KB available (1591K code, 170K data, 44K init)
Dentry cache hash table entries: 1024 (order: 1, 8192 bytes)
Inode cache hash table entries: 512 (order: 0, 4096 bytes)
Mount cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 2048 (order: 1, 8192 bytes)
POSIX conformance testing by UNIFIX
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Starting kswapd
ttyS0 at I/O 0x1d00000 (irq = 3) is a S3C44B0
ttyS1 at I/O 0x1d04000 (irq = 2) is a S3C44B0
Blkmem copyright 1998,1999 D. Jeff Dionne
Blkmem copyright 1998 Kenneth Albanowski
Blkmem 1 disk images:
0: C0ECCF0-C1A0CEF [VIRTUAL C0ECCF0-C1A0CEF] (RO)
RAMDISK driver initialized: 16 RAM disks of 1024K size 1024 blocksize
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 512 bind 512)
VFS: Mounted root (romfs filesystem) readonly.
Freeing init memory: 44Shell invoked to run file: /etc/rc
Command: hostname Samsung
Command: /bin/expand /etc/ramfs.img /dev/ram0
Command: /bin/expand /etc/ramfs2048.img /dev/ram1
Command: mount -t proc proc /proc
Command: mount -t ext2 /dev/ram0 /var
Command: mount -t ext2 /dev/ram1 /ramdisk
mount failed: No such file or directory
Command: chmod 777 /ramdisk
/ramdisk: No such file or directory
Command: mkdir /var/config
Command: mkdir /var/tmp
Command: mkdir /var/log
Command: mkdir /var/run
Command: mkdir /var/lock
Command: ifconfig lo 127.0.0.1
Command: route add -net 127.0.0.0 netmask 255.255.255.0 lo
Command: ifconfig eth0 192.168.168.101 netmask 255.255.255.0 up
SIOCSIFADDR: No such device
eth0: unknown interface: No such device
SIOCSIFNETMASK: No such device
eth0: unknown interface: No such device
pid 12: failed 65280
Command: cat /etc/motd
Welcome to
          ____ _  _
         /  __| ||_|                
    _   _| |  | | _ ____  _   _  _  _
   | | | | |  | || |  _ \| | | |\ \/ /
   | |_| | |__| || | | | | |_| |/    \
   |  ___\____|_||_|_| |_|\____|\_/\_/
   | |
   |_|
For further information check:
http://www.uclinux.org/
Execution Finished, Exiting
Sash command shell (version 1.1.1)
/>
长出一口气,终于通了。
接着,我想大家都应该期待helloworld吧。下面开始。
cd /usr/local/bin/uClinux-dist/user
mkdir myapp
然后,在myapp文件夹里新建两个文件:helloworld.c 和 Makefile
helloworld.c文件如下编写:
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
 printf(“hello world ! \n”);
 return 0;
}
Makefile 文件如下编写:

 
编辑后,保存两个文件。然后修改uClinux-dist/user/Makefile 文件:
dir_$(CONFIG_USER_ZEBRA_RIPD_RIPD)          += zebra
dir_$(CONFIG_USER_ZEBRA_ZEBRA_ZEBRA)        += zebra
+ dir_$(CONFIG_USER_MYAPP_HELLOWORLD)     +=myapp
dir_y += games

all: config

然后修改uClinux-dist/config/config.in 文件:
在文件最后添加:
comment "Debug tools"
bool 'tpt'    CONFIG_USER_TIMEPEG_TPT
comment "Debug libraries"
bool 'ccmalloc'    CONFIG_LIB_LIBCCMALLOC

endmenu

#############################################################################
+mainmenu_option next_comment
+comment 'My App'

+bool 'helloworld' CONFIG_USER_MYAPP_HELLOWORLD
+bool 'app1' CONFIG_USER_MYAPP_APP1

+ comment 'My App'
+endmenu

保存文件修改。
然后运行:make menuconfig
进入Kernel/library/Defaults Setting
空格键选中Custom Vector/User Setting, 保存退出。
程序自动进入Custom Vector/User Setting:
进入My App
空格选中 helloworld, 保存退出。
make user_only
make romfs
make image
make
得到image.rom 和 image.ram.

将image.rom 烧到板子上,运行结果如下:
\>uclinux
Uncompressing Linux......................................................... done, booting the kernel.

Linux version 2.4.24-uc0 (root@localhost) (gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from http://www.snapgear.com/)) #25

Processor: Samsung S3C44B0X revision 0

Architecture: S3C44B0X

On node 0 totalpages: 2048

zone(0): 0 pages.

zone(1): 2048 pages.

zone(2): 0 pages.

Kernel command line: root=/dev/rom0 init=/linuxrc

Calibrating delay loop... 31.84 BogoMIPS

Memory: 8MB = 8MB total

Memory: 6228KB available (1618K code, 167K data, 44K init)

Dentry cache hash table entries: 1024 (order: 1, 8192 bytes)

Inode cache hash table entries: 512 (order: 0, 4096 bytes)

Mount cache hash table entries: 512 (order: 0, 4096 bytes)

Buffer cache hash table entries: 1024 (order: 0, 4096 bytes)

Page-cache hash table entries: 2048 (order: 1, 8192 bytes)

POSIX conformance testing by UNIFIX

Linux NET4.0 for Linux 2.4

Based upon Swansea University Computer Society NET3.039

Initializing RT netlink socket

Starting kswapd

ttyS0 at I/O 0x1d00000 (irq = 3) is a S3C44B0

ttyS1 at I/O 0x1d04000 (irq = 2) is a S3C44B0

Blkmem copyright 1998,1999 D. Jeff Dionne

Blkmem copyright 1998 Kenneth Albanowski

Blkmem 1 disk images:

0: C0ECCF0-C1A78EF [VIRTUAL C0ECCF0-C1A78EF] (RO)

RAMDISK driver initialized: 16 RAM disks of 1024K size 1024 blocksize

NET4: Linux TCP/IP 1.0 for NET4.0

IP Protocols: ICMP, UDP, TCP

IP: routing cache hash table of 512 buckets, 4Kbytes

TCP: Hash tables configured (established 512 bind 512)

VFS: Mounted root (romfs filesystem) readonly.

Freeing init memory: 44Shell invoked to run file: /etc/rc
Command: hostname Samsung
Command: /bin/expand /etc/ramfs.img /dev/ram0
Command: /bin/expand /etc/ramfs2048.img /dev/ram1
Command: mount -t proc proc /proc
Command: mount -t ext2 /dev/ram0 /var
Command: mount -t ext2 /dev/ram1 /ramdisk
mount failed: No such file or directory
Command: chmod 777 /ramdisk
/ramdisk: No such file or directory
Command: mkdir /var/config
Command: mkdir /var/tmp
Command: mkdir /var/log
Command: mkdir /var/run
Command: mkdir /var/lock
Command: ifconfig lo 127.0.0.1
Command: route add -net 127.0.0.0 netmask 255.255.255.0 lo
Command: ifconfig eth0 192.168.168.101 netmask 255.255.255.0 up
SIOCSIFADDR: No such device
eth0: unknown interface: No such device
SIOCSIFNETMASK: No such device
eth0: unknown interface: No such device
pid 12: failed 65280
Command: cat /etc/motd
Welcome to
          ____ _  _
         /  __| ||_|                
    _   _| |  | | _ ____  _   _  _  _
   | | | | |  | || |  _ \| | | |\ \/ /
   | |_| | |__| || | | | | |_| |/    \
   |  ___\____|_||_|_| |_|\____|\_/\_/
   | |
   |_|

For further information check:
http://www.uclinux.org/

Execution Finished, Exiting

Sash command shell (version 1.1.1)
/> ls
bin
dev
etc
home
lib
mnt
proc
sbin
tmp
usr
var
/> cd bin
/bin> ls
arp
boa
expand
helloworld
httpd
ifconfig
inetd
init
ping
portmap
route
sh
snmpd
/bin> helloworld
hello world !


Robertchain@163.com

 
相关文章:
S3C2440A驱动RGB接口TFT LCD的研究[图]
关于arm汇编中的align
s3c2410 Timer工作原理[图]
ARM920T的MMU与Cache
32 位ARM 嵌入式系统扩展USB 接口设计[图]
虚拟SPI时序在TC77与S3C2410通信中的应用[图]
s3c2410 MMU(存储器管理单元)讲解[图]
s3c2410 CACHES,WRITE BUFFER讲解[图]
S3C2410中的脉宽调制定时器(PWM)
S3C2410 中断程序的实现
s3c2410 watchdog详解
s3c2410 中断异常处理[图]
基于ARM9芯片S3C2410a的GPRS数据终端设计
基于ARM920T的IDE硬盘接口设计
ARM9远程图像无线监控系统[图]
S3C2440 Windows CE的RTC模块驱动设计与实现[图]
嵌入式系统中Nand-Flash的原理及应用[图]
ARM系统中DMA方式在数据采集中的应用[图]
AD7888与S3C2410的SPI接口及Linux下嵌入式驱动的实现[图]
基于s3c2410的ARMer9开发平台的使用
S3C44B0X的最小系统构架[图]
ARM S3C2410硬件手册重点
基于ARM S3C2410与TMS320C6416的接口设计[图]
S3C2410上Jffs2的移植
ARM S3C2410驱动TFT-LCD的研究[图]
Blob 在S3C44B0 上的移植
Arm结构体gcc内存边界对齐问题
ARM汇编伪指令介绍
ARM中C和汇编混合编程及示例
MINIGUI在S3C2410开发板的移植
使用ARM标准C函数库进行嵌入式应用程序开发
基于S3C44B0的大型LED显示系统设计[图]
ARM MPlayer移植过程
mplayer在S3C2410上的移植
在S3C2410上移植yaffs2文件系统
S3C2410 bootloader(vivi)阅读笔记
ARM 嵌入式系统C 语言编程
U-boot的修改简介
U-Boot 在44B0X 开发板上的移植以及代码分析
s3c2410 LCD图片显示
关于ARM芯片浮点运算的资料
s3c2440(2410) USB HOST不稳定的原因及解决方法
ARM 汇编的必知必会
使用ads1.2调试2440开发板的过程
S3C2410 LCD 驱动程序移植及GUI程序编写[图]
ARM开发笔记
S3C2410X开发总结及心得
U-Boot在S3C2410开发板上的移植
S3C44B0X上的一款Boot Loader解析
flashpgm 使用注意事项
自制wiggler-附原理图
ARM JTAG仿真器电路讨论[图]
ARM 中断程序的原理和实现
ARM 万年历程序
用ADS1.2进行嵌入式软件开发
ARM7常用启动流程
AT91系列ARM 硬件设计笔记
ARM的三种中断调试方法的探讨
用ADS(AXD)在线调试恒坚4510开发板
用AXD 和Multi-ICE调试uClinux内核
用AXD 在线调试uClinux-2.4.x操作系统
ads(axd)使用心得
关于ARM处理器Remap的理解
ARM汇编器与GCC汇编器支持的汇编语言差别
ARM SDT汇编格式与GNU汇编格式的移植
ARM开发调试教程
基于ARM的嵌入式系统Bootloader启动流程分析
S3C44B0 调试笔记-BIOS
基于ARM-uCLinux嵌入式系统启动引导的实现
S3C2410初始化
S3C2410通过IIS总线与音频芯片UDA1380进行通信
在S3C2410上移植bluetooth(蓝牙)
MiniGUI在AT91RM9200开发板上的移植
S3c2410软件调试总结
uboot移植到S3C44B0X开发板的经历
Flash ROM编程示例
S3C2410上触摸屏的应用实例
S3c2410的触摸屏及模数转换
S3C2410的快速启动技术
关于三星S3C44B0X目标板的uClinux Bootloader
ARM中LDR伪指令与LDR加载指令
基于嵌入式linux和s3c2410平台的视频采集
FLASH地址线接线原理及设置小结
S3C44b0的中断控制
关于S3C44b0向量中断的疑问
S3C44b0 RTC调试经验
ARM内核的中断技术
一步一步制作arm-linux 交叉编译环境
ARM的开发步骤
S3C44B0下ucos-ii的移植
S3C44B0存储器的BANK设计和控制
S3C44B0 寄存器描述
S3c44b0 RTC程序
S3C44b0引导注释
S3C2440应用笔记
ARM开发软件及实用工具介绍
嵌入式C语言的0x8本“经书”
ARM7和Cortex-M3比较
ARM启动代码研究
S3c2410 LCD驱动学习心得
基于S3C44B0X和M12模块的GPS接收终端
ARM9的QT开发平台的建立
静态编译web server Appweb(带Matrixssl支持) For linux 、ARM9
uclinux平台下ucd-snmp的编译
OpenWrt嵌入式Linux开发环境
ucos WiFi无线网卡驱动程序的开发
LwIP在,uCOS II下的实现
uCOS II 的移植
uCGUI 移植到 S3C44B0X的实验
基于 uCGUI 数据显示系统的设计
uCOS II在ARM处理器上移植过程中的中断处理
在UCGUI中增加汉字显示
基于uCOS II的MP3文件播放系统设计
提高uCOS-II在ARM上的执行效率
Google Android 内核编译教程
将Android移植到FS2410开发板上
RT73 USB无线网卡驱动在armlinux平台上的移植实例
STM8S系列单片机开发环境快速入门教程
Linux内核同步机制-自旋锁
s3c2410移植MPlayer到linux2.6
基于VxWorks的多串口卡通信实现
VxWorks下的任务监控方法及应用
实时操作系统VxWorks的内核任务调度研究

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4