实验六 u-boot-2013.01移植

【实验目的】

了解u-boot 的代码结构及移植的基本方法

【实验环境】

  1. ubuntu 14.04发行版
  2. FS4412实验平台
  3. 交叉编译工具arm-none-linux-gnueabi-

【注意事项】

  1. 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行

【实验步骤】

一、建立自己的平台

  1. 下载uboot源码
    在uboot官网下载uboot源码(这里我们选择u-boot-2013.01.tar.bz2)
    ftp://ftp.denx.de/pub/u-boot/

  2. 解压uboot源码
    拷贝uboot源码包到ubuntu的家目录下,解压并进入其顶层目录

     $ tar  xvf  u-boot-2013.01.tar.bz2$ cd  u-boot-2013.01/
    
  3. 指定交叉编译工具信息
    uboot源码并不知道我们使用的处理器架构及交叉编译工具是什么,这里我们需要自己 在Makefile中指定

     $ vi  Makefile
    

     ifeq ($(HOSTARCH),$(ARCH))CROSS_COMPILE ?=endif
    

    修改为如下内容(注意后边不要有多余的空格),然后保存退出

     ifeq (arm,arm)CROSS_COMPILE ?= arm-none-linux-gnueabi-endif
    
  4. 添加Board信息
    因为uboot源码并不支持我们的开发板,这里我们需要从源码支持的开发板中找一个硬 件与我们最类似的,在其基础上进行修改,这里我们参考的是samsung公司的origen

     $ cp  -rf  board/samsung/origen/  board/samsung/fs4412$ mv  board/samsung/fs4412/origen.c  board/samsung/fs4412/fs4412.c
    

    因为修改了文件名,所以对应的Makefile也要修改

     $ vi  board/samsung/fs4412/Makefile
    

     ifndef CONFIG_SPL_BUILDCOBJS	+= origen.oendif
    

    修改为如下内容,然后保存退出

     ifndef CONFIG_SPL_BUILDCOBJS	+= fs4412.oendif
    

    拷贝origen相关的头文件并将其重命名

     $ cp  include/configs/origen.h  include/configs/fs4412.h
    

    修改文件中的信息

     $ vi  include/configs/fs4412.h
    

     #define CONFIG_SYS_PROMPT		"ORIGEN # "
    

    修改为如下内容

     #define CONFIG_SYS_PROMPT		"fs4412 # "
    

    再将

     #define CONFIG_IDENT_STRING		" for ORIGEN"
    

    修改为如下内容,然后保存退出

     #define CONFIG_IDENT_STRING		" for fs4412"
    

    打开uboot源码顶层目录下的boards.cfg文件

     $ vi  boards.cfg
    

     origen			     arm	 armv7	     origen		 samsung	exynos
    

    后添加如下内容(FS4412的相关信息),然后保存退出

     fs4412			     arm	 armv7	     fs4412		 samsung	exynos
    

    至此我们在uboot源码中给我们的板子添加了“档案”,源码就支持我们的开发板了

  5. 编译uboot
    在uboot源码顶层目录下执行如下命令,指定当前使用的Board信息

     $ make  fs4412_config
    

    编译uboot

     $ make
    

    编译完成后会在源码顶层目录下生成u-boot.bin文件,但该文件还不能在我们的开发板 上运行,因为以上操作我们只是把origen相关的文件的名字改成了fs4412,使uboot能 识别fs4412开发板,但文件中的代码还是origen的,和我们的开发板不匹配,所以我 们还需要进一步进行修改和配置

二、添加三星加密引导方式

考虑芯片启动的安全性,Exynos4412需要三星提供的初始引导加密后我们的u-boot才 能被引导运行,所以我们需要在uboot源码中添加三星提供的加密处理代码

  1. 添加三星加密引导方式
    将资料中“移植相关文件”下的sdfuse_q和CodeSign4SecureBoot目录拷贝到uboot源 码的顶层目录下(这之后不要执行make clean或make distclean,这会将加密文件清除
    在这里插入图片描述

    因为添加的加密文件也要编译,所以对应的Makefile也要修改

     $ vi  Makefile 
    

     $(obj)u-boot.bin:	$(obj)u-boot$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@$(BOARD_SIZE_CHECK)
    

    后添加如下内容(添加的内容需要tab键缩进,否则编译报错),然后保存退出

     @#./mkuboot@split -b 14336 u-boot.bin bl2@+make -C sdfuse_q/@#cp u-boot.bin u-boot-4212.bin@#cp u-boot.bin u-boot-4412.bin@#./sdfuse_q/add_sign@./sdfuse_q/chksum@./sdfuse_q/add_padding@rm bl2a*@echo
    
  2. 添加调试代码(点灯法)
    很多时候我们不确定uboot是否已经在板子上运行,所以我们在uboot源码中添加一段 代码使板子上的LED点亮,这样如果看到LED亮的话就表示uboot已经在运行了
    打开uboot启动后的第一段代码

     $ vi  arch/arm/cpu/armv7/start.S
    

    在第134行后添加如下代码(即点亮LED2),然后保存退出

     ldr r0, =0x11000c40ldr r1, [r0]bic r1, r1, #0xf0000000orr r1, r1, #0x10000000str r1, [r0]ldr r0, =0x11000c44mov r1, #0xffstr r1, [r0]
    
  3. 添加编译脚本
    使用make命令编译时只链接uboot源码中的相关代码,而我们添加的初始引导加密的 代码不会被连接到u-boot.bin中,所以这里我们自己编写编译脚本build.sh,这个脚本 中除了对uboot源码进行配置和编译外还将初始引导加密代码链接到了u-boot.bin上, 最终生成一个完成的uboot镜像u-boot-fs4412.bin
    将资料中“移植相关文件”下的build.sh拷贝到uboot源码的顶层目录下
    在这里插入图片描述

    给编译脚本添加可执行权限

     $ chmod  777  build.sh	
    
  4. 编译uboot
    通过脚本编译uboot源码

     $ ./build.sh
    

    编译完成后在源码的顶层目录下会生成“u-boot-fs4412.bin”
    在这里插入图片描述

  5. 测试uboot

    参照之前的实验(实验四 SD 卡启动盘制作)将生成的u-boot-fs4412.bin烧写到SD卡中,开发板选择SD卡启动, 然后上电查看现象,若LED2点亮则说明我自己移植的u-boot已经能够被加载运行

三、实现串口输出

虽然uboot已经能在开发板上加载运行,但是此时的uboot还不能在终端上打印信息, 原因在于uboot源码中对UART的配置与我们实际的硬件不匹配

  1. 修改UART源码

     $ vi  board/samsung/fs4412/lowlevel_init.S
    

     lowlevel_init:
    

    后添加如下内容(初始化临时栈)

     	ldr  sp,=0x02060000
    

     beq	wakeup_reset
    

    后添加如下内容(关闭看门狗)

     #if 1ldr r0, =0x1002330cldr r1, [r0]orr r1, r1, #0x300str r1, [r0]ldr r0, =0x11000c08ldr r1, =0x0str r1, [r0]/* Clear  MASK_WDT_RESET_REQUEST  */ldr r0, =0x1002040cldr r1, =0x00str r1, [r0]#endif
    

     uart_asm_init:/* setup UART0-UART3 GPIOs (part1) */mov	r0, r7ldr	r1, =EXYNOS4_GPIO_A0_CON_VALstr	r1, [r0, #EXYNOS4_GPIO_A0_CON_OFFSET]ldr	r1, =EXYNOS4_GPIO_A1_CON_VALstr	r1, [r0, #EXYNOS4_GPIO_A1_CON_OFFSET]
    

    后添加如下内容(UART初始化)

     ldr	r0, =0x10030000ldr	r1, =0x666666ldr	r2, =CLK_SRC_PERIL0_OFFSETstr	r1, [r0, r2]ldr	r1, =0x777777ldr	r2, =CLK_DIV_PERIL0_OFFSETstr	r1, [r0, r2]
    

    注释掉

     bl uart_asm_init
    

    后的一条语句,然后保存退出

     #if 0bl tzpc_init#endif
    
  2. 编译uboot
    通过脚本编译uboot源码

     $ ./build.sh
    
  3. 测试uboot
    参照之前的实验将生成的u-boot-fs4412.bin烧写到SD卡中,开发板选择SD卡启动, 然后上电查看现象,若终端有打印信息则说明UART移植成功
    在这里插入图片描述

四、 网卡移植

虽然可以通过终端输入命令,但此时的uboot还不能使用ping. tftp等命令,原因在于 命令都是操作网络的,而uboot源码中网卡的相关配置与我们当前的板子不匹配,所以 我们还要对网卡进行移植

  1. 修改网络初始化代码

     $ vi  board/samsung/fs4412/fs4412.c
    

     struct exynos4_gpio_part2 *gpio2;
    

    后添加如下内容

     #ifdef  CONFIG_DRIVER_DM9000#define EXYNOS4412_SROMC_BASE 0X12570000#define DM9000_Tacs     (0x1) #define DM9000_Tcos     (0x1) #define DM9000_Tacc     (0x5) #define DM9000_Tcoh     (0x1) #define DM9000_Tah      (0xC) #define DM9000_Tacp     (0x9)   #define DM9000_PMC      (0x1)  struct exynos_sromc {unsigned int bw;unsigned int bc[6];};void exynos_config_sromc(u32 srom_bank, u32 srom_bw_conf, u32 srom_bc_conf){unsigned int tmp;struct exynos_sromc *srom = (struct exynos_sromc *)(EXYNOS4412_SROMC_BASE);/* Configure SMC_BW register to handle proper SROMC bank */tmp = srom->bw;tmp &= ~(0xF << (srom_bank * 4));tmp |= srom_bw_conf;srom->bw = tmp;/* Configure SMC_BC register */srom->bc[srom_bank] = srom_bc_conf;}static void dm9000aep_pre_init(void){unsigned int tmp;unsigned char smc_bank_num = 1;unsigned int     smc_bw_conf=0;unsigned int     smc_bc_conf=0;/* gpio configuration */writel(0x00220020, 0x11000000 + 0x120);writel(0x00002222, 0x11000000 + 0x140);/* 16 Bit bus width */writel(0x22222222, 0x11000000 + 0x180);writel(0x0000FFFF, 0x11000000 + 0x188);writel(0x22222222, 0x11000000 + 0x1C0);writel(0x0000FFFF, 0x11000000 + 0x1C8);writel(0x22222222, 0x11000000 + 0x1E0);writel(0x0000FFFF, 0x11000000 + 0x1E8);              smc_bw_conf &= ~(0xf<<4);smc_bw_conf |= (1<<7) | (1<<6) | (1<<5) | (1<<4);smc_bc_conf = ((DM9000_Tacs << 28)| (DM9000_Tcos << 24)| (DM9000_Tacc << 16)| (DM9000_Tcoh << 12)| (DM9000_Tah  << 8)| (DM9000_Tacp << 4)| (DM9000_PMC));exynos_config_sromc(smc_bank_num,smc_bw_conf,smc_bc_conf);}#endif
    

     gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL);
    

    后添加如下内容

     #ifdef CONFIG_DRIVER_DM9000dm9000aep_pre_init();#endif
    

    在文件末尾添加如下内容,然后保存退出

     #ifdef CONFIG_CMD_NETint board_eth_init(bd_t *bis)      {      int rc = 0;#ifdef CONFIG_DRIVER_DM9000rc = dm9000_initialize(bis);     #endif                      return rc;                }  #endif
    
  2. 修改网络配置代码

     $ vi  include/configs/fs4412.h
    

     #undef CONFIG_CMD_PING
    

    修改为

     #define CONFIG_CMD_PING
    

    再将

     #undef CONFIG_CMD_NET
    

    修改为

     #define CONFIG_CMD_NET
    

    在文件末尾

     #endif	/* __CONFIG_H */
    

    前添加如下内容,然后保存退出

     #ifdef  CONFIG_CMD_NET#define CONFIG_NET_MULTI#define CONFIG_DRIVER_DM9000	1#define CONFIG_DM9000_BASE	0x05000000#define DM9000_IO	CONFIG_DM9000_BASE#define DM9000_DATA	(CONFIG_DM9000_BASE + 4)#define CONFIG_DM9000_USE_16BIT#define CONFIG_DM9000_NO_SROM	1#define CONFIG_ETHADDR	11:22:33:44:55:66#define CONFIG_IPADDR	192.168.9.200#define CONFIG_SERVERIP	192.168.9.120#define CONFIG_GATEWAYIP	192.168.9.1#define CONFIG_NETMASK	255.255.255.0#endif
    
  3. 编译uboot
    通过脚本编译uboot源码

     $ ./build.sh
    
  4. 测试uboot
    参照之前的实验将生成的u-boot-fs4412.bin烧写到SD卡中,开发板选择SD卡启动, 然后上电查看现象;设置好相关的环境变量,使用网线连接开发板与开发主机,使用 ping命令连接ubuntu,若显示“host xxx.xxx.xxx.xxx is alive”则表示网卡移植成功
    在这里插入图片描述

五、EMMC移植

因为uboot源码中对EMMC的配置与我们的板子不匹配,这里还需要对EMMC相关的 代码进行修改和配置

  1. 修改EMMC初始化代码
    将资料中“移植相关文件”下的movi.c拷贝到uboot源码的arch/arm/cpu/armv7/exynos/ 目录下
    在这里插入图片描述

    因为添加的新文件也要编译,所以对应的Makefile也要修改

     $ vi  arch/arm/cpu/armv7/exynos/Makefile
    

     COBJS	+= clock.o power.o soc.o system.o pinmux.o
    

    修改为如下内容,然后保存退出

     COBJS	+= clock.o power.o soc.o system.o pinmux.o movi.o
    

    修改板级文件

     $ vi  board/samsung/fs4412/fs4412.c
    

     #include <asm/arch/mmc.h>
    

    后添加如下内容

     #include <asm/arch/clk.h>#include "origen_setup.h"
    

     #ifdef CONFIG_GENERIC_MMC
    

    后添加如下内容

     u32 sclk_mmc4;  /*clock source for emmc controller*/#define __REGMY(x) (*((volatile u32 *)(x)))#define CLK_SRC_FSYS  __REGMY(EXYNOS4_CLOCK_BASE + CLK_SRC_FSYS_OFFSET)#define CLK_DIV_FSYS3 __REGMY(EXYNOS4_CLOCK_BASE + CLK_DIV_FSYS3_OFFSET)int emmc_init(){u32 tmp;u32 clock;u32 i;/* setup_hsmmc_clock *//* MMC4 clock src = SCLKMPLL */tmp = CLK_SRC_FSYS & ~(0x000f0000);CLK_SRC_FSYS = tmp | 0x00060000;/* MMC4 clock div */tmp = CLK_DIV_FSYS3 & ~(0x0000ff0f);clock = get_pll_clk(MPLL)/1000000;for(i=0 ; i<=0xf; i++)  {sclk_mmc4=(clock/(i+1));if(sclk_mmc4 <= 160) //200{CLK_DIV_FSYS3 = tmp | (i<<0);break;}}emmcdbg("[mjdbg] sclk_mmc4:%d MHZ; mmc_ratio: %d\n",sclk_mmc4,i);sclk_mmc4 *= 1000000;/** MMC4 EMMC GPIO CONFIG** GPK0[0]	SD_4_CLK* GPK0[1]	SD_4_CMD* GPK0[2]	SD_4_CDn* GPK0[3:6]	SD_4_DATA[0:3]*/writel(readl(0x11000048)&~(0xf),0x11000048); //SD_4_CLK/SD_4_CMD pull-down enablewritel(readl(0x11000040)&~(0xff),0x11000040);//cdn set to be outputwritel(readl(0x11000048)&~(3<<4),0x11000048); //cdn pull-down disablewritel(readl(0x11000044)&~(1<<2),0x11000044); //cdn output 0 to shutdown the emmc powerwritel(readl(0x11000040)&~(0xf<<8)|(1<<8),0x11000040);//cdn set to be outputudelay(100*1000);writel(readl(0x11000044)|(1<<2),0x11000044); //cdn output 1writel(0x03333133, 0x11000040);writel(0x00003FF0, 0x11000048);writel(0x00002AAA, 0x1100004C);#ifdef CONFIG_EMMC_8Bitwritel(0x04444000, 0x11000060);writel(0x00003FC0, 0x11000068);writel(0x00002AAA, 0x1100006C);#endif#ifdef USE_MMC4smdk_s5p_mshc_init();#endif }
    

    将board_mmc_init函数中的内容修改为(之前的内容删除即可)如下内容

     int board_mmc_init(bd_t *bis){int i, err;#ifdef CONFIG_EMMCerr = emmc_init();#endifreturn err;}
    

    在文件的最末尾添加如下内容,然后保存退出

     #ifdef CONFIG_BOARD_LATE_INIT#include <movi.h>int  chk_bootdev(void)//mj for boot device check{char run_cmd[100];struct mmc *mmc;int boot_dev = 0;int cmp_off = 0x10;ulong  start_blk, blkcnt;mmc = find_mmc_device(0);if (mmc == NULL){printf("There is no eMMC card, Booting device is SD card\n");boot_dev = 1;return boot_dev;}start_blk = (24*1024/MOVI_BLKSIZE);blkcnt = 0x10;sprintf(run_cmd,"emmc open 0");run_command(run_cmd, 0);sprintf(run_cmd,"mmc read 0 %lx %lx %lx",CFG_PHY_KERNEL_BASE,start_blk,blkcnt);run_command(run_cmd, 0);/* switch mmc to normal paritition */sprintf(run_cmd,"emmc close 0");run_command(run_cmd, 0);return 0;}int board_late_init (void){int boot_dev =0 ;char boot_cmd[100];boot_dev = chk_bootdev();if(!boot_dev){printf("\n\nChecking Boot Mode ... EMMC4.41\n");}return 0;}#endif
    
  2. 添加EMMC命令
    将资料中“移植相关文件”下的cmd_movi.c. cmd_mmc.c. cmd_mmc_fdisk.c拷贝到uboot 源码的common/目录下
    在这里插入图片描述

    因为添加的新文件也要编译,所以对应的Makefile也要修改

     $ vi  common/Makefile
    

     COBJS-$(CONFIG_CMD_MMC) += cmd_mmc.o
    

    后添加如下内容,然后保存退出

     COBJS-$(CONFIG_CMD_MMC) += cmd_mmc_fdisk.oCOBJS-$(CONFIG_CMD_MOVINAND) += cmd_movi.o
    

    将资料中“移植相关文件”下的mmc.c. s5p_mshc.c拷贝到uboot源码的drivers/mmc/ 目录下
    在这里插入图片描述

    将资料中“移植相关文件”下的mmc.h. movi.h. s5p_mshc.h拷贝到uboot源码的include/ 目录下
    在这里插入图片描述

    因为添加的新文件也要编译,所以对应的Makefile也要修改

     $ vi  drivers/mmc/Makefile 
    

     COBJS-$(CONFIG_S5P_SDHCI) += s5p_sdhci.o
    

    后添加如下内容,然后保存退出

     COBJS-$(CONFIG_S5P_MSHC) += s5p_mshc.o
    
  3. 修改EMMC配置代码

     $ vi  include/configs/fs4412.h
    

    在文件的末尾

     #endif	/* __CONFIG_H */
    

    前添加如下内容,然后保存退出

     #define CONFIG_EVT1     1       /* EVT1 */#ifdef CONFIG_EVT1#define CONFIG_EMMC44_CH4 //eMMC44_CH4 (OMPIN[5:1] = 4)#ifdef CONFIG_SDMMC_CH2#define CONFIG_S3C_HSMMC#undef DEBUG_S3C_HSMMC#define USE_MMC2  #endif#ifdef CONFIG_EMMC44_CH4#define CONFIG_S5P_MSHC#define CONFIG_EMMC             1#define USE_MMC4  /* #define CONFIG_EMMC_8Bit */#define CONFIG_EMMC_EMERGENCY/*#define emmcdbg(fmt,args...) printf(fmt ,##args) */#define emmcdbg(fmt,args...)#endif#endif /*end CONFIG_EVT1*/#define CONFIG_CMD_MOVINAND#define CONFIG_CLK_1000_400_200#define CFG_PHY_UBOOT_BASE      CONFIG_SYS_SDRAM_BASE + 0x3e00000#define CFG_PHY_KERNEL_BASE     CONFIG_SYS_SDRAM_BASE + 0x8000#define BOOT_MMCSD      0x3#define BOOT_EMMC43     0x6#define BOOT_EMMC441    0x7#define CONFIG_BOARD_LATE_INIT	
    
  4. 编译uboot
    通过脚本编译uboot源码

     $ ./build.sh
    
  5. 测试uboot
    参照之前的实验将生成的u-boot-fs4412.bin烧写到SD卡中,开发板选择SD卡启动, 然后上电查看现象;若显示EMMC的相关信息则表示EMMC移植成功
    在这里插入图片描述

六、电源管理移植

因为uboot源码中对电源管理芯片的配置与我们的板子不匹配,后续有可能会导致内核 启动卡死,这里还需要对电源管理芯片相关的代码进行修改和配置

  1. 修改电源管理相关代码
    将资料中“移植相关文件”下的pmic_s5m8767.c拷贝到uboot源码的drivers/power/pmic/ 目录下
    在这里插入图片描述

    因为添加的新文件也要编译,所以对应的Makefile也要修改

     $ vi  drivers/power/pmic/Makefile
    

     COBJS-$(CONFIG_POWER_MAX77686) += pmic_max77686.o
    

    后添加如下内容,然后保存退出

     COBJS-$(CONFIG_POWER_S5M8767) += pmic_s5m8767.o
    

    将添加的函数在头文件中声明

     $ vi  include/power/pmic.h
    

     int pmic_set_output(struct pmic *p, u32 reg, int ldo, int on);
    

    后添加如下内容,然后保存退出

     void pmic_s5m8767_init(void);
    

    修改配置文件

     $ vi  include/configs/fs4412.h
    

    在文件末尾

     #endif	/* __CONFIG_H */
    

    前添加如下内容,然后保存退出

     #define CONFIG_POWER_S5M8767
    

    修改板级文件

     $ vi  board/samsung/fs4412/fs4412.c
    

    在board_init函数中

     #ifdef CONFIG_DRIVER_DM9000dm9000aep_pre_init();#endif
    

    后添加如下内容,然后保存退出

     #ifdef CONFIG_POWER_S5M8767pmic_s5m8767_init();#endif
    

    注释原有的代码

     $ vi  drivers/power/Makefile
    

     COBJS-$(CONFIG_POWER) += power_core.o
    

    修改为(即注释掉)

     #COBJS-$(CONFIG_POWER) += power_core.o
    

    修改架构文件

     $ vi  arch/arm/cpu/armv7/s5p-common/cpu_info.c
    

     #include <asm/arch/clk.h>
    

    后添加如下内容,然后保存退出

     #include <power/pmic.h>
    
  2. 编译uboot
    通过脚本编译uboot源码

     $ ./build.sh
    
  3. 测试uboot
    参照之前的实验将生成的u-boot-fs4412.bin烧写到SD卡中,开发板选择SD卡启动,然后上电查看现象

在这里插入图片描述
至此,uboot移植完成

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

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

相关文章

【网络】DNS | ICMP | NAT | 代理服务器

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 前面几篇文章虽然讲介绍了整个网络通信的协议栈&#xff0c;我们也知道了完整的网络通信过程&#xff…

【⑬MySQL | 数据类型(一)】简介 | 整数 | 浮点 | 定点类型

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL数据类型简介 | 整数 | 浮点 | 定点类型的分享✨ 目录 前言0.数据类型简介1 整数类型2 浮点类型3 定点类型4 日期/时间类型总结 0.数据类型简介 数据类型&#xff08;data_type&#xff09;是指系统中所允许的…

LRU淘汰策略执行过程

1 介绍 Redis无论是惰性删除还是定期删除&#xff0c;都可能存在删除不尽的情况&#xff0c;无法删除完全&#xff0c;比如每次删除完过期的 key 还是超过 25%&#xff0c;且这些 key 再也不会被客户端访问。 这样的话&#xff0c;定期删除和堕性删除可能都彻底的清理掉。如果…

百度许少辉著Baidu《乡村振兴战略下传统村落文化旅游设计》图书馆新书通报

百度许少辉著Baidu《乡村振兴战略下传统村落文化旅游设计》图书馆新书通报

AWS SDK 3.x for .NET Framework 4.0 可行性测试

前言 为了应对日益增长的网络安全挑战, 越来越多的互联网厂商已经陆续开始或者已经彻底停止了对 SSL 3 / TLS 1.0 / TLS1.1 等上古加密算法的支持. 而对于一些同样拥有悠久历史的和 AWS 服务相关联的应用程序, 是否可以通过仅更新 SDK 版本的方式来适应新的环境. 本文将以 Win…

揭开pkill的秘密:在Linux中杀死进程的完整指南

揭开pkill的秘密&#xff1a;在Linux中杀死进程的完整指南 一、前言二、进程管理基础知识2.1、什么是进程&#xff1f;2.2、进程管理的原理和目的2.3、进程状态和标识符 三、理解Linux pkill命令3.1、pkill命令的概述和作用3.2、与kill命令的对比3.3、常见的pkill命令选项和参数…

PCAP01介绍和STM32模拟SPI驱动

一.芯片介绍 Pcap01是德国acam公司设计的一款革命性的电容测量芯片。该芯片 内部有DSP计算单元&#xff0c;可以直接将电容元件接到Pcap01芯片&#xff0c;然后芯片计算出容值大小&#xff0c;通过SPI总线将电容容值数据传送给CPU&#xff0c;电容测量完全数字化。 二,测量原…

无脑入门pytorch系列(五)—— nn.Dropout

本系列教程适用于没有任何pytorch的同学&#xff08;简单的python语法还是要的&#xff09;&#xff0c;从代码的表层出发挖掘代码的深层含义&#xff0c;理解具体的意思和内涵。pytorch的很多函数看着非常简单&#xff0c;但是其中包含了很多内容&#xff0c;不了解其中的意思…

docker启用cgroup v2

要求 本人的操作系统是kali&#xff0c;基于debian docker info如果你这里是2那么说明启用了&#xff0c;如果是1&#xff0c;那么就未启用 对于Docker来说&#xff0c;Cgroups v2的使用需要满足以下条件&#xff1a; Linux内核版本在4.15以上。 uname -r 系统已经启用Cgro…

前端处理图片文件的方法

在项目开发过程中&#xff0c;有一个需求&#xff0c;需要前端对上传的图片进行处理&#xff0c;以字符串的形式传给后端&#xff0c;实现效果如下&#xff1a; 1.上传图片的组件 在该项目中&#xff0c;使用了element plus组件库 <el-uploadv-model:file-list"fileL…

c++(8.23)类,this指针,构造函数,析构函数,拷贝构造函数

设计一个Per类&#xff0c;类中包含私有成员&#xff1a;姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员&#xff1a;成绩、Per类对象 p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 #include <iostream>u…

​8th参考文献:[8]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑工业出版社,2022.

​&#xff18;th参考文献&#xff1a;&#xff3b;&#xff18;&#xff3d;许少辉&#xff0e;乡村振兴战略下传统村落文化旅游设计&#xff3b;&#xff2d;&#xff3d;北京&#xff1a;中国建筑工业出版社&#xff0c;&#xff12;&#xff10;&#xff12;&#xff12;&a…

notebook写好代码后直接生成PPT报告(html格式)

注&#xff1a;记录使用notebook直接生成html格式的PPT报告&#xff08;html格式&#xff09;。 前置内容&#xff1a;如果直接导出没有Reveal.js.slides(.slides.html)选项&#xff0c;需要安装插件nbextensions。 安装参考&#xff1a;插件nbextensions安装 操作步骤&#x…

PostgreSQL-UDF用户自定义函数-扩展插件

目录 PostgreSQL-UDF用户自定义函数-扩展插件零、前置条件一、创建 .c 和 .sql 文件创建.c文件创建.sql文件 二、创建 .control 和 Makefile 文件创建 .control 文件创建 Makefile 文件 三、编译 & 链接四、psql&#xff08;或者其他PG backend&#xff09;中创建扩展 Post…

【C++杂货铺】探索string的底层实现

文章目录 一、成员变量二、成员函数2.1 默认构造函数2.2 拷贝构造函数2.3 operator2.4 c_str()2.5 size()2.6 operator[ ]2.7 iterator2.8 reserve2.9 resize2.10 push_back2.11 append2.12 operator2.13 insert2.14 erase2.15 find2.16 substr2.17 operator<<2.18 opera…

【微服务】spring 条件注解从使用到源码分析详解

目录 一、前言 二、spring 条件注解概述 2.1 条件注解Conditional介绍 2.2 Conditional扩展注解 2.2.1 Conditional扩展注解汇总 三、spring 条件注解案例演示 3.1 ConditionalOnBean 3.2 ConditionalOnMissingBean 3.2.1 使用在类上 3.2.2 使用场景补充 3.3 Condit…

jvm-类加载子系统

1.内存结构概述 类加载子系统负责从文件系统或网络中加载class文件&#xff0c;class文件在文件开头有特定的文件标识 ClassLoader只负责class文件的加载&#xff0c;至于它是否运行&#xff0c;则由Execution Engine决定 加载的类信息存放于一块称为方法区的内存空间&#xff…

什么是安全测试报告,怎么获得软件安全检测报告?

安全测试报告 软件安全测试报告&#xff1a;是指测试人员对软件产品的安全缺陷和非法入侵防范能力进行检查和验证的过程&#xff0c;并对软件安全质量进行整体评估&#xff0c;发现软件的缺陷与 bug&#xff0c;为开发人员修复漏洞、提高软件质量奠定坚实的基础。 怎么获得靠谱…

Hadoop学习:深入解析MapReduce的大数据魔力之数据压缩(四)

Hadoop学习&#xff1a;深入解析MapReduce的大数据魔力之数据压缩&#xff08;四&#xff09; 4.1 概述1&#xff09;压缩的好处和坏处2&#xff09;压缩原则 4.2 MR 支持的压缩编码4.3 压缩方式选择4.3.1 Gzip 压缩4.3.2 Bzip2 压缩4.3.3 Lzo 压缩4.3.4 Snappy 压缩4.3.5 压缩…

学会Mybatis框架:让你的代码更具灵活性、可维护性、安全性和高效性【二.动态SQL】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Mybatis的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Mybatis动态SQL如何应用 1.需求 2.…