u-boot第二阶段初始化内容的入口函数是_main,_main位于arch/arm/lib/crt0.S文件中:

_main函数中先为调用board_init_f准备初始化环境(设置栈指针sp和并给gd_t结构分配空间):

  1. .global _main
  2.  
  3. _main:
  4.  
  5. /*
  6. * Set up initial C runtime environment and call board_init_f().
  7. */
  8.  
  9. #if defined(CONFIG_NAND_SPL)
  10. /* deprecated, use instead CONFIG_SPL_BUILD */
  11. ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
  12. #elif defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)
  13. ldr sp, =(CONFIG_SPL_STACK)
  14. #else
  15. ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
  16. #endif
  17. bic sp, sp, # /* -byte alignment for ABI compliance */
  18. sub sp, #GD_SIZE /* allocate one GD above SP */
  19. bic sp, sp, # /* -byte alignment for ABI compliance */
  20. mov r8, sp /* GD is above SP */

然后调用board_init_f(0),这是因为r0可以作为输入参数:

  1. mov r0, #
  2. bl board_init_f

board_init_f(0)代码如下:

  1. init_fnc_t *init_sequence[] = {
    arch_cpu_init, /* basic arch cpu dependent setup */
    mark_bootstage,
    #ifdef CONFIG_OF_CONTROL
    fdtdec_check_fdt,
    #endif
    #if defined(CONFIG_BOARD_EARLY_INIT_F)
    board_early_init_f,
    #endif
    timer_init, /* initialize timer */
    #ifdef CONFIG_BOARD_POSTCLK_INIT
    board_postclk_init,
    #endif
    #ifdef CONFIG_FSL_ESDHC
    get_clocks,
    #endif
    env_init, /* initialize environment */
    init_baudrate, /* initialze baudrate settings */
    serial_init, /* serial communications setup */
    console_init_f, /* stage 1 init of console */
    display_banner, /* say that we are here */
    #if defined(CONFIG_DISPLAY_CPUINFO)
    print_cpuinfo, /* display cpu info (and speed) */
    #endif
    #if defined(CONFIG_DISPLAY_BOARDINFO)
    checkboard, /* display board info */
    #endif
    #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
    init_func_i2c,
    #endif
    dram_init, /* configure available RAM banks */
    NULL,
    };
  1. void board_init_f(ulong bootflag)
  2. {
  3. bd_t *bd;
  4. init_fnc_t **init_fnc_ptr;
  5. gd_t *id;
  6. ulong addr, addr_sp;
  7. #ifdef CONFIG_PRAM
  8. ulong reg;
  9. #endif
  10. void *new_fdt = NULL;
  11. size_t fdt_size = ;
  12.  
  13. memset((void *)gd, , sizeof(gd_t));
  14.  
  15. gd->mon_len = _bss_end_ofs;
  16. #ifdef CONFIG_OF_EMBED
  17. /* Get a pointer to the FDT */
  18. gd->fdt_blob = _binary_dt_dtb_start;
  19. #elif defined CONFIG_OF_SEPARATE
  20. /* FDT is at end of image */
  21. gd->fdt_blob = (void *)(_end_ofs + _TEXT_BASE);
  22. #endif
  23. /* Allow the early environment to override the fdt address */
  24. gd->fdt_blob = (void *)getenv_ulong("fdtcontroladdr", ,
  25. (uintptr_t)gd->fdt_blob);
  26.  
  27. for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
  28. if ((*init_fnc_ptr)() != ) {
  29. hang ();
  30. }
  31. }
  32.  
  33. #ifdef CONFIG_OF_CONTROL
  34. /* For now, put this check after the console is ready */
  35. if (fdtdec_prepare_fdt()) {
  36. panic("** CONFIG_OF_CONTROL defined but no FDT - please see "
  37. "doc/README.fdt-control");
  38. }
  39. #endif
  40.  
  41. debug("monitor len: %08lX\n", gd->mon_len);
  42. /*
  43. * Ram is setup, size stored in gd !!
  44. */
  45. debug("ramsize: %08lX\n", gd->ram_size);
  46. #if defined(CONFIG_SYS_MEM_TOP_HIDE)
  47. /*
  48. * Subtract specified amount of memory to hide so that it won't
  49. * get "touched" at all by U-Boot. By fixing up gd->ram_size
  50. * the Linux kernel should now get passed the now "corrected"
  51. * memory size and won't touch it either. This should work
  52. * for arch/ppc and arch/powerpc. Only Linux board ports in
  53. * arch/powerpc with bootwrapper support, that recalculate the
  54. * memory size from the SDRAM controller setup will have to
  55. * get fixed.
  56. */
  57. gd->ram_size -= CONFIG_SYS_MEM_TOP_HIDE;
  58. #endif
  59.  
  60. addr = CONFIG_SYS_SDRAM_BASE + gd->ram_size;
  61.  
  62. #ifdef CONFIG_LOGBUFFER
  63. #ifndef CONFIG_ALT_LB_ADDR
  64. /* reserve kernel log buffer */
  65. addr -= (LOGBUFF_RESERVE);
  66. debug("Reserving %dk for kernel logbuffer at %08lx\n", LOGBUFF_LEN,
  67. addr);
  68. #endif
  69. #endif
  70.  
  71. #ifdef CONFIG_PRAM
  72. /*
  73. * reserve protected RAM
  74. */
  75. reg = getenv_ulong("pram", , CONFIG_PRAM);
  76. addr -= (reg << ); /* size is in kB */
  77. debug("Reserving %ldk for protected RAM at %08lx\n", reg, addr);
  78. #endif /* CONFIG_PRAM */
  79.  
  80. #if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF))
  81. /* reserve TLB table */
  82. gd->tlb_size = * ;
  83. addr -= gd->tlb_size;
  84.  
  85. /* round down to next 64 kB limit */
  86. addr &= ~(0x10000 - );
  87.  
  88. gd->tlb_addr = addr;
  89. debug("TLB table from %08lx to %08lx\n", addr, addr + gd->tlb_size);
  90. #endif
  91.  
  92. /* round down to next 4 kB limit */
  93. addr &= ~( - );
  94. debug("Top of RAM usable for U-Boot at: %08lx\n", addr);
  95.  
  96. #ifdef CONFIG_LCD
  97. #ifdef CONFIG_FB_ADDR
  98. gd->fb_base = CONFIG_FB_ADDR;
  99. #else
  100. /* reserve memory for LCD display (always full pages) */
  101. addr = lcd_setmem(addr);
  102. gd->fb_base = addr;
  103. #endif /* CONFIG_FB_ADDR */
  104. #endif /* CONFIG_LCD */
  105.  
  106. /*
  107. * reserve memory for U-Boot code, data & bss
  108. * round down to next 4 kB limit
  109. */
  110. addr -= gd->mon_len;
  111. addr &= ~( - );
  112.  
  113. debug("Reserving %ldk for U-Boot at: %08lx\n", gd->mon_len >> , addr);
  114.  
  115. #ifndef CONFIG_SPL_BUILD
  116. /*
  117. * reserve memory for malloc() arena
  118. */
  119. addr_sp = addr - TOTAL_MALLOC_LEN;
  120. debug("Reserving %dk for malloc() at: %08lx\n",
  121. TOTAL_MALLOC_LEN >> , addr_sp);
  122. /*
  123. * (permanently) allocate a Board Info struct
  124. * and a permanent copy of the "global" data
  125. */
  126. addr_sp -= sizeof (bd_t);
  127. bd = (bd_t *) addr_sp;
  128. gd->bd = bd;
  129. debug("Reserving %zu Bytes for Board Info at: %08lx\n",
  130. sizeof (bd_t), addr_sp);
  131.  
  132. #ifdef CONFIG_MACH_TYPE
  133. gd->bd->bi_arch_number = CONFIG_MACH_TYPE; /* board id for Linux */
  134. #endif
  135.  
  136. addr_sp -= sizeof (gd_t);
  137. id = (gd_t *) addr_sp;
  138. debug("Reserving %zu Bytes for Global Data at: %08lx\n",
  139. sizeof (gd_t), addr_sp);
  140.  
  141. #if defined(CONFIG_OF_SEPARATE) && defined(CONFIG_OF_CONTROL)
  142. /*
  143. * If the device tree is sitting immediate above our image then we
  144. * must relocate it. If it is embedded in the data section, then it
  145. * will be relocated with other data.
  146. */
  147. if (gd->fdt_blob) {
  148. fdt_size = ALIGN(fdt_totalsize(gd->fdt_blob) + 0x1000, );
  149.  
  150. addr_sp -= fdt_size;
  151. new_fdt = (void *)addr_sp;
  152. debug("Reserving %zu Bytes for FDT at: %08lx\n",
  153. fdt_size, addr_sp);
  154. }
  155. #endif
  156.  
  157. /* setup stackpointer for exeptions */
  158. gd->irq_sp = addr_sp;
  159. #ifdef CONFIG_USE_IRQ
  160. addr_sp -= (CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ);
  161. debug("Reserving %zu Bytes for IRQ stack at: %08lx\n",
  162. CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ, addr_sp);
  163. #endif
  164. /* leave 3 words for abort-stack */
  165. addr_sp -= ;
  166.  
  167. /* 8-byte alignment for ABI compliance */
  168. addr_sp &= ~0x07;
  169. #else
  170. addr_sp += ; /* leave 32 words for abort-stack */
  171. gd->irq_sp = addr_sp;
  172. #endif
  173.  
  174. debug("New Stack Pointer is: %08lx\n", addr_sp);
  175.  
  176. #ifdef CONFIG_POST
  177. post_bootmode_init();
  178. post_run(NULL, POST_ROM | post_bootmode_get());
  179. #endif
  180.  
  181. gd->bd->bi_baudrate = gd->baudrate;
  182. /* Ram ist board specific, so move it to board code ... */
  183. dram_init_banksize();
  184. display_dram_config(); /* and display it */
  185.  
  186. gd->relocaddr = addr;
  187. gd->start_addr_sp = addr_sp;
  188. gd->reloc_off = addr - _TEXT_BASE;
  189. debug("relocation Offset is: %08lx\n", gd->reloc_off);
  190. if (new_fdt) {
  191. memcpy(new_fdt, gd->fdt_blob, fdt_size);
  192. gd->fdt_blob = new_fdt;
  193. }
  194. memcpy(id, (void *)gd, sizeof(gd_t));
  195. }

从代码中可以看出,board_init_f对gd内容进行初始化并将其拷贝到id变量中。

此外,代码中还对init_sequence中的所有函数按顺序依次执行,

从而完成了对MPLL、UPLL、GPIO、Timer、波特率、串口配置以及显示u-boot版本号、显示CPU型号、显示DRAM信息等功能

接着设置新sp和gd,然后跳转到relocate_code进行重定位,relocate_code的代码如下:

  1. .globl relocate_code
  2. relocate_code:
  3. mov r4, r0 /* save addr_sp */
  4. mov r5, r1 /* save addr of gd */
  5. mov r6, r2 /* save addr of destination */
  6.  
  7. adr r0, _start
  8. cmp r0, r6
  9. moveq r9, # /* no relocation. relocation offset(r9) = */
  10. beq relocate_done /* skip relocation */
  11. mov r1, r6 /* r1 <- scratch for copy_loop */
  12. ldr r3, _bss_start_ofs
  13. add r2, r0, r3 /* r2 <- source end address */
  14.  
  15. copy_loop:
  16. ldmia r0!, {r9-r10} /* copy from source address [r0] */
  17. stmia r1!, {r9-r10} /* copy to target address [r1] */
  18. cmp r0, r2 /* until source end address [r2] */
  19. blo copy_loop
  20.  
  21. #ifndef CONFIG_SPL_BUILD
  22. /*
  23. * fix .rel.dyn relocations
  24. */
  25. ldr r0, _TEXT_BASE /* r0 <- Text base */
  26. sub r9, r6, r0 /* r9 <- relocation offset */
  27. ldr r10, _dynsym_start_ofs /* r10 <- sym table ofs */
  28. add r10, r10, r0 /* r10 <- sym table in FLASH */
  29. ldr r2, _rel_dyn_start_ofs /* r2 <- rel dyn start ofs */
  30. add r2, r2, r0 /* r2 <- rel dyn start in FLASH */
  31. ldr r3, _rel_dyn_end_ofs /* r3 <- rel dyn end ofs */
  32. add r3, r3, r0 /* r3 <- rel dyn end in FLASH */
  33. fixloop:
  34. ldr r0, [r2] /* r0 <- location to fix up, IN FLASH! */
  35. add r0, r0, r9 /* r0 <- location to fix up in RAM */
  36. ldr r1, [r2, #]
  37. and r7, r1, #0xff
  38. cmp r7, # /* relative fixup? */
  39. beq fixrel
  40. cmp r7, # /* absolute fixup? */
  41. beq fixabs
  42. /* ignore unknown type of fixup */
  43. b fixnext
  44. fixabs:
  45. /* absolute fix: set location to (offset) symbol value */
  46. mov r1, r1, LSR # /* r1 <- symbol index in .dynsym */
  47. add r1, r10, r1 /* r1 <- address of symbol in table */
  48. ldr r1, [r1, #] /* r1 <- symbol value */
  49. add r1, r1, r9 /* r1 <- relocated sym addr */
  50. b fixnext
  51. fixrel:
  52. /* relative fix: increase location by offset */
  53. ldr r1, [r0]
  54. add r1, r1, r9
  55. fixnext:
  56. str r1, [r0]
  57. add r2, r2, # /* each rel.dyn entry is bytes */
  58. cmp r2, r3
  59. blo fixloop
  60. #endif
  61.  
  62. relocate_done:
  63.  
  64. mov pc, lr

relocate_code刚开始执行前先将here的值保存到lr寄存器中,然后执行重定位,执行完毕后跳转到lr寄存器(即here)执行。

然后对BSS段进行初始化:

  1. here:
  2.  
  3. /* Set up final (full) environment */
  4.  
  5. bl c_runtime_cpu_setup /* we still call old routine here */
  6.  
  7. ldr r0, =__bss_start /* this is auto-relocated! */
  8. ldr r1, =__bss_end__ /* this is auto-relocated! */
  9.  
  10. mov r2, #0x00000000 /* prepare zero to clear BSS */
  11.  
  12. clbss_l:cmp r0, r1 /* while not at end of BSS */
  13. strlo r2, [r0] /* clear -bit BSS word */
  14. addlo r0, r0, # /* move to next */
  15. blo clbss_l

接着调用board_init_r()函数:

  1. bl coloured_LED_init
  2. bl red_led_on
  3.  
  4. #if defined(CONFIG_NAND_SPL)
  5.  
  6. /* call _nand_boot() */
  7. ldr pc, =nand_boot
  8.  
  9. #else
  10.  
  11. /* call board_init_r(gd_t *id, ulong dest_addr) */
  12. mov r0, r8 /* gd_t */
  13. ldr r1, [r8, #GD_RELOCADDR] /* dest_addr */
  14. /* call board_init_r */
  15. ldr pc, =board_init_r /* this is auto-relocated! */
  16.  
  17. #endif

board_init_r函数代码如下:

  1. void board_init_r(gd_t *id, ulong dest_addr)
  2. {
  3. ulong malloc_start;
  4. #if !defined(CONFIG_SYS_NO_FLASH)
  5. ulong flash_size;
  6. #endif
  7.  
  8. gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */
  9. bootstage_mark_name(BOOTSTAGE_ID_START_UBOOT_R, "board_init_r");
  10.  
  11. monitor_flash_len = _end_ofs;
  12.  
  13. /* Enable caches */
  14. enable_caches();
  15.  
  16. debug("monitor flash len: %08lX\n", monitor_flash_len);
  17. board_init(); /* Setup chipselects */
  18. /*
  19. * TODO: printing of the clock inforamtion of the board is now
  20. * implemented as part of bdinfo command. Currently only support for
  21. * davinci SOC's is added. Remove this check once all the board
  22. * implement this.
  23. */
  24. #ifdef CONFIG_CLOCKS
  25. set_cpu_clk_info(); /* Setup clock information */
  26. #endif
  27. serial_initialize();
  28.  
  29. debug("Now running in RAM - U-Boot at: %08lx\n", dest_addr);
  30.  
  31. #ifdef CONFIG_LOGBUFFER
  32. logbuff_init_ptrs();
  33. #endif
  34. #ifdef CONFIG_POST
  35. post_output_backlog();
  36. #endif
  37.  
  38. /* The Malloc area is immediately below the monitor copy in DRAM */
  39. malloc_start = dest_addr - TOTAL_MALLOC_LEN;
  40. mem_malloc_init (malloc_start, TOTAL_MALLOC_LEN);
  41.  
  42. #ifdef CONFIG_ARCH_EARLY_INIT_R
  43. arch_early_init_r();
  44. #endif
  45. power_init_board();
  46.  
  47. #if !defined(CONFIG_SYS_NO_FLASH)
  48. puts("Flash: ");
  49.  
  50. flash_size = flash_init();
  51. if (flash_size > ) {
  52. # ifdef CONFIG_SYS_FLASH_CHECKSUM
  53. print_size(flash_size, "");
  54. /*
  55. * Compute and print flash CRC if flashchecksum is set to 'y'
  56. *
  57. * NOTE: Maybe we should add some WATCHDOG_RESET()? XXX
  58. */
  59. if (getenv_yesno("flashchecksum") == ) {
  60. printf(" CRC: %08X", crc32(,
  61. (const unsigned char *) CONFIG_SYS_FLASH_BASE,
  62. flash_size));
  63. }
  64. putc('\n');
  65. # else /* !CONFIG_SYS_FLASH_CHECKSUM */
  66. print_size(flash_size, "\n");
  67. # endif /* CONFIG_SYS_FLASH_CHECKSUM */
  68. } else {
  69. puts(failed);
  70. hang();
  71. }
  72. #endif
  73.  
  74. #if defined(CONFIG_CMD_NAND)
  75. puts("NAND: ");
  76. nand_init(); /* go init the NAND */
  77. #endif
  78.  
  79. #if defined(CONFIG_CMD_ONENAND)
  80. onenand_init();
  81. #endif
  82.  
  83. #ifdef CONFIG_GENERIC_MMC
  84. puts("MMC: ");
  85. mmc_initialize(gd->bd);
  86. #endif
  87.  
  88. #ifdef CONFIG_HAS_DATAFLASH
  89. AT91F_DataflashInit();
  90. dataflash_print_info();
  91. #endif
  92.  
  93. /* initialize environment */
  94. if (should_load_env())
  95. env_relocate();
  96. else
  97. set_default_env(NULL);
  98.  
  99. #if defined(CONFIG_CMD_PCI) || defined(CONFIG_PCI)
  100. arm_pci_init();
  101. #endif
  102.  
  103. stdio_init(); /* get the devices list going. */
  104.  
  105. jumptable_init();
  106.  
  107. #if defined(CONFIG_API)
  108. /* Initialize API */
  109. api_init();
  110. #endif
  111.  
  112. console_init_r(); /* fully init console as a device */
  113.  
  114. #ifdef CONFIG_DISPLAY_BOARDINFO_LATE
  115. # ifdef CONFIG_OF_CONTROL
  116. /* Put this here so it appears on the LCD, now it is ready */
  117. display_fdt_model(gd->fdt_blob);
  118. # else
  119. checkboard();
  120. # endif
  121. #endif
  122.  
  123. #if defined(CONFIG_ARCH_MISC_INIT)
  124. /* miscellaneous arch dependent initialisations */
  125. arch_misc_init();
  126. #endif
  127. #if defined(CONFIG_MISC_INIT_R)
  128. /* miscellaneous platform dependent initialisations */
  129. misc_init_r();
  130. #endif
  131.  
  132. /* set up exceptions */
  133. interrupt_init();
  134. /* enable exceptions */
  135. enable_interrupts();
  136.  
  137. /* Initialize from environment */
  138. load_addr = getenv_ulong("loadaddr", , load_addr);
  139.  
  140. #ifdef CONFIG_BOARD_LATE_INIT
  141. board_late_init();
  142. #endif
  143.  
  144. #ifdef CONFIG_BITBANGMII
  145. bb_miiphy_init();
  146. #endif
  147. #if defined(CONFIG_CMD_NET)
  148. puts("Net: ");
  149. eth_initialize(gd->bd);
  150. #if defined(CONFIG_RESET_PHY_R)
  151. debug("Reset Ethernet PHY\n");
  152. reset_phy();
  153. #endif
  154. #endif
  155.  
  156. #ifdef CONFIG_POST
  157. post_run(NULL, POST_RAM | post_bootmode_get());
  158. #endif
  159.  
  160. #if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER)
  161. /*
  162. * Export available size of memory for Linux,
  163. * taking into account the protected RAM at top of memory
  164. */
  165. {
  166. ulong pram = ;
  167. uchar memsz[];
  168.  
  169. #ifdef CONFIG_PRAM
  170. pram = getenv_ulong("pram", , CONFIG_PRAM);
  171. #endif
  172. #ifdef CONFIG_LOGBUFFER
  173. #ifndef CONFIG_ALT_LB_ADDR
  174. /* Also take the logbuffer into account (pram is in kB) */
  175. pram += (LOGBUFF_LEN + LOGBUFF_OVERHEAD) / ;
  176. #endif
  177. #endif
  178. sprintf((char *)memsz, "%ldk", (gd->ram_size / ) - pram);
  179. setenv("mem", (char *)memsz);
  180. }
  181. #endif
  182.  
  183. /* main_loop() can return to retry autoboot, if so just run it again. */
  184. for (;;) {
  185. main_loop();
  186. }
  187.  
  188. /* NOTREACHED - no way out of command loop except booting */
  189. }

在board_init_r函数中依次执行使能数据Cache和指令Cache,三个串口初始化,内存分配初始化,flash初始化,nand初始化,mmc设备初始化,stdio初始化,stdout和stderr初始化,开中断,网卡初始化等操作,

然后反复执行main_loop函数。

u-boot第二个阶段的执行内容如下:

(1)为board_init_f准备sp和gd

(2)执行board_init_f,对MPLL、UPLL、GPIO、Timer、波特率、串口配置,显示u-boot版本号、CPU型号和DRAM信息,并初始化gd内容。

(3)调用relocate_code进行代码重定位

(4)初始化BSS

(5)调用board_init_r,使能数据Cache和指令Cache,三个串口初始化,内存分配初始化,flash初始化,nand初始化,

mmc设备初始化,stdio初始化,stdout和stderr初始化,开中断,网卡初始化,然后执行main_loop等待用户输入命令或者超时后进入linux内核。

uboot 2013.01 代码简析(3)第二阶段初始化的更多相关文章

  1. uboot 2013.01 代码简析(2)第一阶段初始化

    uboot执行"make smdk2410_config"之后就可以进行编译了,可以执行make命令进行编译, 因为整个输出太长,我仅仅列出部分最关键的输出(部分我不关心的内容直接 ...

  2. uboot 2013.01 代码简析(1)开发板配置

    u-boot下载地址:ftp://ftp.denx.de/pub/u-boot/u-boot-2013.01.01.tar.bz2 下载之后对该文件进行解压. 我试着分析smdk2410_config ...

  3. uboot 2013.01 s3c6400编译失败

    通常我们对s3c6410平台开发u-boot是在s3c6400的基础上修改而成的,但是从uboot 2013.01这个版本之后的版本都把smdk6400对应的配置给删除了. 这是因为该版本smdk64 ...

  4. OpenStack之虚机冷迁移代码简析

    OpenStack之虚机冷迁移代码简析 前不久我们看了openstack的热迁移代码,并进行了简单的分析.真的,很简单的分析.现在天气凉了,为了应时令,再简析下虚机冷迁移的代码. 还是老样子,前端的H ...

  5. WinForm 自动完成控件实例代码简析

    在Web的应用方面有js的插件实现自动完成(或叫智能提示)功能,但在WinForm窗体应用方面就没那么好了. TextBox控件本身是提供了一个自动提示功能,只要用上这三个属性: AutoComple ...

  6. Log4js 工作原理及代码简析

    本文地址 http://www.cnblogs.com/jasonxuli/p/6518650.html   log4js   版本 0.6.16, 最新版1.1.1 大体类似.   使用 log4j ...

  7. Hive Metastore 代码简析

    1.  hive metastore 内部结构 1.1 包结构 从package结构来看,主要的5个package,让我们来看看这几个package的内容 (1) metastorepackage是m ...

  8. GPXReader工具代码简析

    完整的文件在TerraExplorer Pro的默认安装目录下C:\Program Files (x86)\Skyline\TerraExplorer Pro\Tools\GPXReader: 如果你 ...

  9. ortp代码简析

    ortp初始化 /** *    Initialize the oRTP library. You should call this function first before using *     ...

随机推荐

  1. Android文章收藏

     Android集 1.Himi李华明的<Android游戏开发专栏>http://blog.csdn.net/column/details/androidgame.html2.老罗的&l ...

  2. 约瑟夫环用php实现

    百度百科的解释:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数 ...

  3. devpress grid表格自适应列宽的问题

    /// <summary> /// 自适应列宽,显示横向滚轴,只有当所有列都已经在界面上加载完成之后才能生效 /// </summary> public void setAut ...

  4. zabbix自动发现监控远程端口

    zabbix监控远程服务器端口,simple checks是zabbix用来监控无agent的主机 脚本和模板地址: https://github.com/mikeluwen/tcpmonitor

  5. js 正则表达式 取反

    http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp 以匹配中文为例 const test_value = '李钊鸿' if (/[^\u4e00 ...

  6. PHPthinking为全部PHP爱好者指路

    1.新手学习路线:个人觉得.自己手上应该有本參考书.像细说PHP,然后看书学习,穿插网上的一些免费视频教程(随便百度一下即可,之后我尽量整理一些给大家).当然假设自控能力差的同学.也能够參加一些培训机 ...

  7. webpack 功能大全 【环境配置】

    1. webpack简介 webpack 是一个模块打包工具.它使得模块相互依赖并且可构建等价于这些模块的静态资源.相比于已经存在的模块打包器(module bundler),webpack的开发动机 ...

  8. Android环境变量的设置(详细图解版)

    分类: Android初学学习笔记2011-07-10 09:47 99479人阅读 评论(0) 收藏 举报 androidtoolspathcmd 查阅了网上很多的资料但是对于环境变量设置介绍的不够 ...

  9. 一个方便的图片载入框架——ImageViewEx

    我的博客:http://mrfufufu.github.io/ 一.前言 近期在整理项目中的一些代码,以备即将开展的新项目中使用,刚刚整理到一个图片载入的 lib.用起来很的简单,和 picasso ...

  10. FP Tree算法原理总结(转载)

    FP Tree算法原理总结 在Apriori算法原理总结中,我们对Apriori算法的原理做了总结.作为一个挖掘频繁项集的算法,Apriori算法需要多次扫描数据,I/O是很大的瓶颈.为了解决这个问题 ...