ARXXUBOOT編譯入門_第1頁(yè)
ARXXUBOOT編譯入門_第2頁(yè)
ARXXUBOOT編譯入門_第3頁(yè)
ARXXUBOOT編譯入門_第4頁(yè)
ARXXUBOOT編譯入門_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、2. 解壓代碼 這個(gè)就隨便了,一般解壓在主目錄。 將下載的 mr3420_3220v1.tar.gz 移動(dòng)到主目錄。 注意:這里壓縮包擴(kuò)展名有誤,實(shí)際上是 bzip2 壓縮的。 打開終端,此時(shí)終端應(yīng)該默認(rèn)在主目錄下,若不在主目錄下,就運(yùn)行 cd 命令進(jìn)入主目錄。 運(yùn)行命令 tar -jxvf mr3420_3220v1.tar.gz 以解壓代碼。tar_jxvf_mr3420_3220v1.png (31.25 KB, 下載次數(shù): 0) 3. 編譯代碼 運(yùn)行命令 cd mr3420_3220v1/build 進(jìn)入代碼編譯目錄。 運(yùn)行命令 make BOARD_TYPE=ap99 fs_prep

2、 以創(chuàng)建編譯過(guò)程所需的目錄。 運(yùn)行命令 make BOARD_TYPE=ap99 uboot 以開始編譯 U-Boot。 4. 刷機(jī)測(cè)試 如果沒(méi)有意外,那么編譯結(jié)束后的輸出應(yīng)該是這樣的: 生成的 u-boot.bin 位于 mr3420_3220v1/images/ap99/ 目錄下。 此文件未被填充到 128K,需要手動(dòng)填充。 填充后的文件就可以進(jìn)行刷機(jī)測(cè)試了。 此文件是未壓縮版,因此本身體積很大。此代碼也不能生成壓縮版的 U-Boot。 5. 說(shuō)明 操作說(shuō)明請(qǐng)參閱代碼根目錄下的 readme.txt。入門級(jí)的操作就這么簡(jiǎn)單。進(jìn)階級(jí): 進(jìn)階級(jí)依然使用 TL-MR3420 v1 的代碼。 進(jìn)階

3、級(jí)將分離 U-Boot 代碼及現(xiàn)成的工具鏈,搭建基本的交叉編譯環(huán)境。 1. 分離 U-Boot 代碼 U-Boot 代碼位于 mr3420_3220v1/ap99/boot/u-boot 。 將整個(gè) u-boot 目錄復(fù)制到一個(gè)地方,如用戶主目錄。 此 u-boot 目錄里的代碼就是全部所需的代碼了。之后的所有操作都在這里面完成。2. 復(fù)制工具鏈 此工具鏈即為編譯器,但是是針對(duì) mips 架構(gòu)的交叉編譯器。 工具鏈位于 mr3420_3220v1/build/gcc-2.16.1/build_mips。 將整個(gè) build_mips 復(fù)制到一個(gè)地方,如主目錄。 3. 搭建編譯環(huán)境 現(xiàn)在,mr3

4、420_3220v1 目錄已經(jīng)沒(méi)有用,可以刪掉,因?yàn)樗行枰奈募家褟?fù)制出來(lái)了。 設(shè)置環(huán)境變量以讓 Shell 能夠訪問(wèn)到工具鏈。運(yùn)行命令 export PATH=$PATH:/build_mips/bin 即可。 此設(shè)置只在當(dāng)前的 Shell 里有效。關(guān)于如何設(shè)置永久的環(huán)境變量,請(qǐng)自行百度。 4. 清理代碼 此操作用于清理上次編譯產(chǎn)生的臨時(shí)文件及配置文件,為下次配置及編譯做準(zhǔn)備。 進(jìn)入 u-boot 目錄:運(yùn)行命令 cd /u-boot 。 運(yùn)行命令 make distclean 以執(zhí)行完全清理。 5. 編譯代碼 這里是一個(gè)完整的編譯步驟。 a. 指定開發(fā)板類型 此操作表示我們要編譯哪個(gè)開

5、發(fā)板。AR7241 的開發(fā)板(這里其實(shí)叫參考板,reference board)名稱為 ap99,因此運(yùn)行 make ap99_config 以進(jìn)行配置。 所有的開發(fā)板定義都寫在 Makefile 里。其中以 *_config: 開頭的行,* 就是開發(fā)板名稱。 AR 及 QCA 系列的參考板名稱會(huì)在最后列出。 有些開發(fā)板還有額外的參數(shù)可以定義,這里暫不講解。b. 編譯 運(yùn)行命令 make CROSS_COMPILE=mips-linux- 進(jìn)行編譯。 CROSS_COMPILE=mips-linux- 指定了交叉編譯器的文件名前綴為 mips-linux-。例如,要使用工具鏈中的 gcc 程序

6、,那么就運(yùn)行 mips-linux-gcc。這個(gè)可以看一下 build_mips/bin 目錄下的文件名。 由于之前運(yùn)行了 export PATH=$PATH:/build_mips/bin 命令,所以 Shell 能夠直接找到相關(guān)程序的位置。否則,CROSS_COMPILE= 需要指定為 /build_mips/bin/mips-linux-。 c. 測(cè)試 編譯成功后,u-boot 目錄下會(huì)生成 u-boot.bin,這就是未填充到 128K 的文件。 6. 常用編譯命令。 make *_config 配置生成為指定的開發(fā)板(* 為開發(fā)板名稱)。 make CROSS_COMPILE=* 編

7、譯代碼,并指定交叉編譯器文件名前綴為 *。 make clean 清理上次編譯生成的臨時(shí)文件。此命令不會(huì)刪除開發(fā)板配置,下次編譯可以直接運(yùn)行 make 命令。 make distclean 清理編譯生成的臨時(shí)文件及開發(fā)板配置。運(yùn)行此命令后,需要再次指定開發(fā)板后才能進(jìn)行編譯。其它說(shuō)明: 這里使用的 MR3420 v1 代碼不能生成壓縮代碼。其他的,如 AR9331 AR934x 等代碼需要在編譯時(shí)加入 COMPRESSED_UBOOT=1 來(lái)進(jìn)行編譯,如 make CROSS_COMPILE=mips-linux- COMPRESSED_UBOOT=1 。 編譯 AR934x QCA95xx 的

8、代碼需要指定使用的以太網(wǎng)交換機(jī) PHY 類型,即在編譯時(shí)加入 ETH_CONFIG=_s27 或 ETH_CONFIG=_s17 。其中 _s27 為內(nèi)置百兆 PHY,_s17 為外部千兆 PHY。 具體路由型號(hào)的 GPL 代碼里都有說(shuō)明文件,可以根據(jù)說(shuō)明文件來(lái)進(jìn)行編譯,并了解參考板名稱。常見參考板名稱: AR7240 - ap91 AR7241 - ap99 AR9331 - ap121 AR9341 - ap123 AR9342 - mi124 AR9344 - db12x QCA953x - ap143 QCA9558 - ap135 其它的請(qǐng)?jiān)?及 上進(jìn)行查找。:UBoot 啟動(dòng)過(guò)程及

9、簡(jiǎn)單代碼分析這里以 AR7241 的 U-Boot 為例MIPS 架構(gòu)簡(jiǎn)介MIPS 地址空間:這里說(shuō)的是地址空間,不是內(nèi)存空間。內(nèi)存只是映射在一部分地址空間上而已。內(nèi)存分為4段 (Kuseg、Kseg0、Kseg1、Kseg2),其中 Kseg0 (0x80000000 0x9fffffff) 為緩存段,直接映射在物理地址段上。Kseg1 (0xa0000000 0xbfffffff) 為非緩存段,直接映射在物理地址段上。Kuseg 和 Kseg2 需要經(jīng)過(guò)地址轉(zhuǎn)換才能訪問(wèn)。在 CPU 復(fù)位時(shí),緩存未被初始化,只有 Kseg1 能夠被直接訪問(wèn)。AR71XX 物理段:內(nèi)存、Flash、IO寄存器

10、等都被映射在物理段上范圍為 00x1fffffff,訪問(wèn)時(shí)需要通過(guò)宏 KSEG0ADDR(_addr) 來(lái)通過(guò) Kseg0 訪問(wèn)或 KSEG1ADDR(_addr) 來(lái)通過(guò) Kseg1 訪問(wèn)。物理地址一般不能直接訪問(wèn),都需要通過(guò) Kseg0 或 Kseg1 來(lái)訪問(wèn)。主要的映射范圍:DDR:00x0fffffff (這一段直接映射物理內(nèi)存,一般通過(guò)帶緩存的 Kseg0 來(lái)訪問(wèn),以便加快速度)I/O空間:0x10000000 0x1dffffff (這一段直接控制硬件,必須通過(guò) Kseg1 來(lái)訪問(wèn))SPI Flash 空間:0x1f000000 0x1fffffff (這一段映射閃存的前 16MB

11、 數(shù)據(jù))AR71XX 啟動(dòng)過(guò)程CPU 上電時(shí),物理段中,SPI Flash 的前4MB 被循環(huán)映射在 0x1f000000 上,因此會(huì)被重復(fù) 4 次。執(zhí)行地址為 KSEG1ADDR(0x1fc00000),即 0xbfc00000。*注意:U-Boot 在編譯時(shí),實(shí)際設(shè)置的基址,即啟動(dòng)地址為 KSEG0ADDR(0x1f000000),即 0x9f000000。下面會(huì)講到為什么要這么設(shè)置。U-Boot 中的起始代碼在 cpu/mips/start.S 中:_start:#ifndef COMPRESSED_UBOOTRVECENT(reset,0) /* U-boot entry point

12、*/RVECENT(reset,1) /* software reboot */RVECENT(romReserved,2)-省略-RVECENT(romReserved,125)RVECENT(romReserved,126)RVECENT(romReserved,127)/* We hope there are no more reserved vectors!* 128 * 8 = 1024 = 0x400* so this is address R_VEC+0x400 = 0xbfc00400*/復(fù)制代碼以上代碼設(shè)置異常向量,不需要理解第一句 RVECENT(reset,0) 為一個(gè)跳

13、轉(zhuǎn),直接轉(zhuǎn)到下面的代碼進(jìn)行運(yùn)行.align 4reset:/* set GPIO_OE- added by lsz to fix the LED issue */li a1, AR7100_GPIO_OElw v1, 0(a1)li v0, 0x3fdffor v1, v1, v0sw v1, 0(a1)lw v0, 0(a1)lw v0, 0(a1)-省略-/* CONFIG0 register */li t0, CONF_CM_UNCACHEDmtc0 t0, CP0_CONFIG復(fù)制代碼以上代碼前半部分通過(guò)設(shè)置 GPIO 來(lái)點(diǎn)亮路由的 LED。后半部分設(shè)置 CPU 相關(guān)參數(shù),不需要理解以

14、上代碼沒(méi)有包含使用相對(duì)地址的指令,也就是說(shuō),無(wú)論這段代碼在 CPU 地址空間的何種位置,都能夠正常執(zhí)行因此雖然 CPU 的執(zhí)行地址為 0xbfc00000,以上代碼依然能執(zhí)行/* Initialize GOT pointer.*/bal 1fnop.word _GLOBAL_OFFSET_TABLE_1:move gp, ralw t1, 0(ra)move gp, t1復(fù)制代碼以上代碼加載了用于 U-Boot 重定位的 GOT 指針,它是 U-Boot 在內(nèi)存中進(jìn)行自身移動(dòng)的關(guān)鍵la t9, lowlevel_initjalr t9nop復(fù)制代碼以上代碼進(jìn)行 CPU 頻率設(shè)置,超頻就是在這里

15、實(shí)現(xiàn)的la t0, rel_startj t0noprel_start:復(fù)制代碼以上代碼很關(guān)鍵,它實(shí)現(xiàn)了 U-Boot 的執(zhí)行地址的轉(zhuǎn)移假設(shè)當(dāng)前 CPU 的執(zhí)行地址在 0xbfc00000 + x那么執(zhí)行此段代碼后,CPU 執(zhí)行地址將跳轉(zhuǎn)到 0x9f000000 + x 處進(jìn)行執(zhí)行前面提到了 CPU 在復(fù)位時(shí),物理段 0x1f000000 處循環(huán)映射 4 次 Flash 的前 4MB,而 U-Boot 大小只有100KB多,因此 0x1f000000 跟 0x1fc00000 處的數(shù)據(jù)是一樣的,這就實(shí)現(xiàn)了運(yùn)行地址的轉(zhuǎn)移。至于為什么不跳轉(zhuǎn)到 0xbf000000 + x 處運(yùn)行,是因?yàn)?AR71

16、XX CPU 在復(fù)位時(shí),緩存可用,因此通過(guò) Kseg0 段執(zhí)行,可以加快速度。/* REMAP_DISABLE */li a0, AR7100_SPI_CLOCKli t0, 0x43sw t0, 0(a0)復(fù)制代碼以上代碼的作用是禁用物理段 0x1f000000 的 4MB Flash 數(shù)據(jù)循環(huán)映射,以便讓 0x1f000000 能夠映射 16MB 的 Flash 數(shù)據(jù)/* Initialize caches.*/* 初始化緩存 */la t9, simple_mips_cache_resetjalr t9nop/* . and enable them.*/* 啟用緩存 */li t0, C

17、ONF_CM_CACHABLE_NONCOHERENTmtc0 t0, CP0_CONFIG-省略-#if defined(CONFIG_AR7100) | defined(CONFIG_AR7240)/* 將緩存鎖定在 Kseg0 低端處 */la t9, mips_cache_lock_24kjalr t9nop#endif#endif /* #ifndef COMPRESSED_UBOOT */* 將棧指針指向緩存 */li t0, CFG_SDRAM_BASE + CFG_INIT_SP_OFFSETla sp, 0(t0)/* 進(jìn)入 C 環(huán)境 */la t9, board_init_

18、fj t9nop復(fù)制代碼這段代碼的作用是初始化緩存,并將緩存鎖定在 Kseg0 上,用作臨時(shí)的??臻g此時(shí)內(nèi)存并未初始化, Kseg0 對(duì)應(yīng)的 0x80000000 0x8fffffff 還不能被訪問(wèn),因此需要用緩存代替。然后跳轉(zhuǎn)到 board_init_f 進(jìn)行執(zhí)行下面開始在 C 環(huán)境中運(yùn)行void board_init_f(ulong bootflag)gd_t gd_data, *id;bd_t *bd;init_fnc_t *init_fnc_ptr;ulong addr, addr_sp, len = (ulong)&uboot_end - CFG_MONITOR_BASE;ulong

19、 *s;#ifdef COMPRESSED_UBOOTchar board_string50;#endif#ifdef CONFIG_PURPLEvoid copy_code (ulong);#endif/* Pointer is writable since we allocated a register for it.*/gd = &gd_data;/* compiler optimization barrier needed for GCC = 3.4 */_asm_ _volatile_(: : :memory);memset (void *)gd, 0, sizeof (gd_t);

20、/* 依次運(yùn)行初始化函數(shù) */for (init_fnc_ptr = init_sequence; *init_fnc_ptr; +init_fnc_ptr) if (*init_fnc_ptr)() != 0) hang ();#ifdef COMPRESSED_UBOOTcheckboard(board_string);printf(%snn,board_string);gd-ram_size = bootflag;puts (DRAM:);print_size (gd-ram_size, n);#endif/* Now that we have DRAM mapped and worki

21、ng, we can* relocate the code and continue running from DRAM.*/addr = CFG_SDRAM_BASE + gd-ram_size;/* We can reserve some RAM on top here.*/* round down to next 4 kB limit.*/addr &= (4096 - 1);debug (Top of RAM usable for U-Boot at: %08lxn, addr);-省略-/* Save local variables to board info struct*/* 記

22、錄內(nèi)存基址及大小、串口波特率 */bd-bi_memstart = CFG_SDRAM_BASE; /* start ofDRAM memory */bd-bi_memsize = gd-ram_size; /* sizeofDRAM memory in bytes */bd-bi_baudrate = gd-baudrate; /* Console Baudrate */memcpy (id, (void *)gd, sizeof (gd_t);/* On the purple board we copy the code in a special way* in order to solv

23、e flash problems*/#ifdef CONFIG_PURPLEcopy_code(addr);#endif/* 執(zhí)行代碼轉(zhuǎn)移 */relocate_code (addr_sp, id, addr);/* NOTREACHED - relocate_code() does not return */復(fù)制代碼board_init_f 的作用為進(jìn)行內(nèi)存、時(shí)鐘、串口等設(shè)備的初始化,并為 U-Boot 的運(yùn)行劃分內(nèi)存。初始化函數(shù)位于 board_init_f 函數(shù)上方init_fnc_t *init_sequence = #ifndef COMPRESSED_UBOOTtimer_init

24、, /* 初始化時(shí)鐘 */#endifenv_init, /* initialize environment */ /* 初始化環(huán)境變量 */#ifdef CONFIG_INCA_IPincaip_set_cpuclk, /* set cpu clock according to environment variable */#endifinit_baudrate, /* initialze baudrate settings */#ifndef COMPRESSED_UBOOTserial_init, /* serial communications setup */ /* 初始化串口,這樣

25、 TTL 才有輸出 */#endifconsole_init_f, /* 初始化控制臺(tái)環(huán)境 */display_banner, /* say that we are here */ /* 顯示 U-Boot . */#ifndef COMPRESSED_UBOOTcheckboard, /* 顯示 AP99 (ar7241 - Virian) U-boot */init_func_ram, /* 初始化內(nèi)存 */#endifNULL,;復(fù)制代碼以上為初始化函數(shù)列表,依次運(yùn)行在初始化完成后,board_init_f 調(diào)用 relocate_code 將 U-Boot 代碼從 Flash 中復(fù)制到

26、內(nèi)存中,再?gòu)膬?nèi)存中執(zhí)行.globl relocate_code.ent relocate_coderelocate_code:move sp, a0 /* Set new stack pointer */li t0, CFG_MONITOR_BASEla t3, in_ramlw t2, -12(t3) /* t2 - uboot_end_data */move t1, a2/* Fix GOT pointer:* New GOT-PTR = (old GOT-PTR - CFG_MONITOR_BASE) + Destination Address*/* 根據(jù)傳遞的參數(shù)計(jì)算移動(dòng)距離 */mo

27、ve t6, gpsub gp, CFG_MONITOR_BASEadd gp, a2 /* gp now adjusted */sub t6, gp, t6 /* t6 - relocation offset */* t0 = source address* t1 = target address* t2 = source end address*/* 復(fù)制代碼到內(nèi)存 */1:lw t3, 0(t0)sw t3, 0(t1)addu t0, 4ble t0, t2, 1baddu t1, 4 /* delay slot */* If caches were enabled, we would

28、 have to flush them here.*/* Jump to where weve relocated ourselves.*/* 跳轉(zhuǎn)到移動(dòng)后的代碼繼續(xù)執(zhí)行 */addi t0, a2, in_ram - _startj t0nop.word uboot_end_data.word uboot_end.word num_got_entriesin_ram:/* 此時(shí)已經(jīng)在內(nèi)存中了 */* Now we want to update GOT.*/lw t3, -4(t0) /* t3 - num_got_entries */addi t4, gp, 8 /* Skipping fi

29、rst two entries. */li t2, 2/* GOT 表重定位 */1:lw t1, 0(t4)beqz t1, 2fadd t1, t6sw t1, 0(t4)2:addi t2, 1blt t2, t3, 1baddi t4, 4 /* delay slot */* Clear BSS.*/lw t1, -12(t0) /* t1 - uboot_end_data */lw t2, -8(t0) /* t2 flags |= GD_FLG_RELOC; /* tell others: relocation done */debug (Now running in RAM -

30、U-Boot at: %08lxn, dest_addr);gd-reloc_off = dest_addr - CFG_MONITOR_BASE;/* 記錄 U-Boot 重定位時(shí)移動(dòng)的偏移量 */monitor_flash_len = (ulong)&uboot_end_data - dest_addr;/* We have to relocate the command table manually*/* U-Boot 命令表,重定位所有字符串地址和函數(shù)地址 */for (cmdtp = &_u_boot_cmd_start; cmdtp !=&_u_boot_cmd_end; cmdt

31、p+) ulong addr;addr = (ulong) (cmdtp-cmd) + gd-reloc_off;#if 0printf (Command %s: 0x%08lx = 0x%08lxn,cmdtp-name, (ulong) (cmdtp-cmd), addr);#endifcmdtp-cmd =(int (*)(struct cmd_tbl_s *, int, int, char *)addr;addr = (ulong)(cmdtp-name) + gd-reloc_off;cmdtp-name = (char *)addr;if (cmdtp-usage) addr =

32、(ulong)(cmdtp-usage) + gd-reloc_off;cmdtp-usage = (char *)addr;#ifdef CFG_LONGHELPif (cmdtp-help) addr = (ulong)(cmdtp-help) + gd-reloc_off;cmdtp-help = (char *)addr;#endif/* there are some other pointer constants we must deal with */#ifndef CFG_ENV_IS_NOWHEREenv_name_spec += gd-reloc_off;#endif/* 熄

33、滅路由的 LED */* turn off switch LED added by tiger 20091225 */ar7240_gpio_sw_led();-省略-/* configure available FLASH banks */* 初始化 Flash,顯示 Flash:XXXX (X MB) */size = flash_init();display_flash_config (size);bd = gd-bd;bd-bi_flashstart = CFG_FLASH_BASE;bd-bi_flashsize = size;#if CFG_MONITOR_BASE = CFG_F

34、LASH_BASEbd-bi_flashoffset = monitor_flash_len; /* reserved area for U-Boot */#elsebd-bi_flashoffset = 0;#endif/* initialize malloc() area */* 初始化內(nèi)存管理器,以便能夠使用 malloc 等函數(shù) */mem_malloc_init();malloc_bin_reloc();/* relocate environment function pointers etc. */* 重定位環(huán)境變量相關(guān)函數(shù)和數(shù)據(jù) */env_relocate();/* board

35、 MAC address */s = getenv (ethaddr);for (i = 0; i bi_enetaddri = s ? simple_strtoul (s, &e, 16) : 0;if (s)s = (*e) ? e + 1 : e;/* IP Address */bd-bi_ip_addr = getenv_IPaddr(ipaddr);#if defined(CONFIG_PCI)/* Do pci configuration*/* PCI 設(shè)備初始化 */pci_init();#endif/* leave this here (after malloc(), envi

36、ronment and PCI are working) */* Initialize devices */devices_init ();jumptable_init ();/* Initialize the console (after the relocation and devices init) */console_init_r ();/* * * * * * * * * * * * * * * * * * * * * */* Initialize from environment */if (s = getenv (loadaddr) != NULL) load_addr = si

37、mple_strtoul (s, NULL, 16);#if (CONFIG_COMMANDS & CFG_CMD_NET)if (s = getenv (bootfile) != NULL) copy_filename (BootFile, s, sizeof (BootFile);#endif /* CFG_CMD_NET */#if defined(CONFIG_MISC_INIT_R)/* miscellaneous platform dependent initialisations */misc_init_r ();#endif#if (CONFIG_COMMANDS & CFG_

38、CMD_NET)/* 初始化網(wǎng)絡(luò) */#if defined(CONFIG_NET_MULTI)puts (Net: );#endifeth_initialize(gd-bd);#endif/* main_loop() can return to retry autoboot, if so just run it again. */* 進(jìn)入命令主循環(huán),永不返回 */for (;) main_loop ();/* NOTREACHED - no way out of command loop except booting */復(fù)制代碼到此為止 U-Boot 就開始正常運(yùn)行了在處理交互命令前,U-Boot 會(huì)檢查有沒(méi)有啟動(dòng)命令void main_loop (void)-省略-#if defined(CONFIG_BOOTDELAY) & (CONFIG_BO

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論