主頁 > 作業系統 > UBOOT編譯--- UBOOT的編譯和鏈接選項詳解(六)

UBOOT編譯--- UBOOT的編譯和鏈接選項詳解(六)

2022-11-16 06:09:03 作業系統

1. 前言

 UBOOT版本:uboot2018.03,開發板myimx8mmek240,

2. 函式 cc-option

編譯選項變數cc-option 定義在 scripts/Kbuild.include中:

# scripts/Kbuild.include
# output directory for tests below
TMPOUT := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/)

# try-run
# Usage: option = $(call try-run, $(CC)...-o "$$TMP",option-ok,otherwise)
# Exit code chooses option. "$$TMP" is can be used as temporary file and
# is automatically cleaned up.
# modifed for U-Boot: prevent cc-option from leaving .*.su files
try-run = $(shell set -e;		\
	TMP="$(TMPOUT).$$$$.tmp";	\
	TMPO="$(TMPOUT).$$$$.o";	\
	TMPSU="$(TMPOUT).$$$$.su";	\
	if ($(1)) >/dev/null 2>&1;	\
	then echo "$(2)";		\
	else echo "$(3)";		\
	fi;				\
	rm -f "$$TMP" "$$TMPO" "$$TMPSU")
	
# cc-option
# Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586)

cc-option = $(call try-run,\
	$(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2))

2.1 command >/dev/null 2>&1

command >/dev/null 2>&1 == command 1>/dev/null 2>&1

  • ‘command’ : 表示shell命令或者為一個可執行程式;
  • ‘>’ : 表示重定向到哪里;
  • ‘/dev/null’ : 表示Linux的空設備檔案;
  • ‘2’ : 表示標準錯誤輸出;
  • ‘&1’ : &表示等同于的意思,2>&1,表示2的輸出重定向等于于1;

(1)1>/dev/null:表示標準輸出重定向到空設備檔案,也就是不輸出任何資訊到終端,不顯示任何資訊,
(2)2>&1:表示標準錯誤輸出重定向等同于標準輸出,因為之前標準輸出已經重定向到了空設備檔案,所以標準錯誤輸出也重定向到空設備檔案,

這條命令的意思就是:將錯誤輸出2重定向到標準輸出1,然后將標準輸出1全部放到/dev/null檔案,也就是清空,所以可以看出" >/dev/null 2>&1 "常用來避免shell命令或者程式等運行中有內容輸出到終端,

2.2 cc-option決議

舉例:

PLATFORM_CPPFLAGS += $(call cc-option,-marm,)

函式cc-option

  • 第一個引數賦給$ (1)(這里是指-marm),
  • 第二個引數給$(2)(這里為空),

變數cc-option的值是函式try-run的執行結果,函式try-run又是$(shell ....)輸出的結果;也就是if ...else...的結果,在函式try-run中

  • $(1) : $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "
  • $(2) : 函式cc-option的 $(1) (這里是指-marm)
  • $(3) : 函式cc-option的 $(2) (這里為空)

如果函式try-run的$(1)能執行,那么echo $(2),否則echo $(3);echo 的值正是cc-option的值

綜上:該例子的意思是如果交叉編譯工具$(CC)支持cc-optionl函式的引數一表示的選項(也就是指-marm),那么cc-option函式的回傳就是該選項(指-marm),否則回傳的是call函式的引數二表示的選項,

cc-option:檢測$(CC) 是否支持給定的選項

3. 平臺代碼重定位需要的編譯選項$(PLATFORM_RELFLAGS))

#(1) 頂層config.mk
PLATFORM_RELFLAGS :=

#(2) arch/arm/config.mk
PLATFORM_RELFLAGS += -ffunction-sections -fdata-sections \
		     -fno-common -ffixed-r9
PLATFORM_RELFLAGS += $(call cc-option, -msoft-float) \
      $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))  //空
......
PLATFORM_RELFLAGS	+= $(LLVM_RELFLAGS)     //空
  
#(3) arch/arm/cpu/armv8/config.mk
PLATFORM_RELFLAGS += -fno-common -ffixed-x18

展開為:

PLATFORM_RELFLAGS= -ffunction-sections -fdata-sections -fno-common -ffixed-r9 -fno-common -ffixed-x18

引數講解見本文末尾參考小節

4. 平臺代碼預處理需要的編譯選項$(PLATFORM_CPPFLAGS)

#(1) 頂層config.mk
PLATFORM_CPPFLAGS :=
......
ifdef FTRACE
PLATFORM_CPPFLAGS += -finstrument-functions -DFTRACE  //除錯時使用,一般不會打開
endif
# Allow use of stdint.h if available
ifneq ($(USE_STDINT),)
PLATFORM_CPPFLAGS += -DCONFIG_USE_STDINT   //空
endif
RELFLAGS := $(PLATFORM_RELFLAGS)          //見上一小節

PLATFORM_CPPFLAGS += $(RELFLAGS)
PLATFORM_CPPFLAGS += -pipe
export PLATFORM_CPPFLAGS

#(2) arch/arm/config.mk
# Choose between ARM/Thumb instruction sets
ifeq ($(CONFIG_$(SPL_)SYS_THUMB_BUILD),y)
AFLAGS_IMPLICIT_IT	:= $(call as-option,-Wa$(comma)-mimplicit-it=always)
PF_CPPFLAGS_ARM		:= $(AFLAGS_IMPLICIT_IT) \
			$(call cc-option, -mthumb -mthumb-interwork,\
			$(call cc-option,-marm,)\
			$(call cc-option,-mno-thumb-interwork,)\
		)
else //走else分支
PF_CPPFLAGS_ARM := $(call cc-option,-marm,) \
		$(call cc-option,-mno-thumb-interwork,) //空
endif
......
# Try if EABI is supported, else fall back to old API,
# i. e. for example:
# - with ELDK 4.2 (EABI supported), use:
#	-mabi=aapcs-linux
# - with ELDK 4.1 (gcc 4.x, no EABI), use:
#	-mabi=apcs-gnu
# - with ELDK 3.1 (gcc 3.x), use:
#	-mapcs-32
PF_CPPFLAGS_ABI := $(call cc-option,\      //空
			-mabi=aapcs-linux,\
			$(call cc-option,\
				-mapcs-32,\
				$(call cc-option,\
					-mabi=apcs-gnu,\
				)\
			)\
		)
......		
PLATFORM_CPPFLAGS += -D__ARM__ //定義宏__ARM__
PLATFORM_CPPFLAGS += $(PF_CPPFLAGS_ARM) $(PF_CPPFLAGS_ABI) //空

ifneq ($(CONFIG_SPL_BUILD),y)   //編譯SPL的時候才會傳納-DCONFIG_SPL_BUILD
......
# The movt / movw can hardcode 16 bit parts of the addresses in the
# instruction. Relocation is not supported for that case, so disable
# such usage by requiring word relocations.
PLATFORM_CPPFLAGS += $(call cc-option, -mword-relocations)
PLATFORM_CPPFLAGS += $(call cc-option, -fno-pic)  //不編譯SPL的時候支持
endif

#(3) arch/arm/cpu/armv8/config.mk
PF_NO_UNALIGNED := $(call cc-option, -mstrict-align) //支持
PLATFORM_CPPFLAGS += $(PF_NO_UNALIGNED)

#(4) arch/arm/Makefile
# This selects which instruction set is used.
arch-$(CONFIG_ARM64)		=-march=armv8-a -mgeneral-regs-only

# On Tegra systems we must build SPL for the armv4 core on the device
# but otherwise we can use the value in CONFIG_SYS_ARM_ARCH
ifeq ($(CONFIG_SPL_BUILD)$(CONFIG_TEGRA),yy)
arch-y += -D__LINUX_ARM_ARCH__=4
else
arch-y += -D__LINUX_ARM_ARCH__=$(CONFIG_SYS_ARM_ARCH)
endif

# Evaluate arch cc-option calls now
arch-y := $(arch-y) //-march=armv8-a -mgeneral-regs-only -D__LINUX_ARM_ARCH__=8

# Evaluate tune cc-option calls now
tune-y := $(tune-y)

PLATFORM_CPPFLAGS += $(arch-y) $(tune-y)

machdirs := $(patsubst %,arch/arm/mach-%/,$(machine-y)) //我使用的單板未定義machine-y

PLATFORM_CPPFLAGS += $(patsubst %,-I$(srctree)/%include,$(machdirs))//空

展開為:

PLATFORM_CPPFLAGS= -D__ARM__ -fno-pic -mstrict-align -ffunction-sections -fdata-sections -fno-common -ffixed-r9 -fno-common -ffixed-x18 -pipe -march=armv8-a -mgeneral-regs-only -D__LINUX_ARM_ARCH__=8

引數講解見本文末尾參考小節

5. 編譯系統kbuild需要的預處理選項$(KBUILD_CPPFLAGS)

# /scripts/Makefile.spl
KBUILD_CPPFLAGS += -DCONFIG_SPL_BUILD

#(1) 頂層config.mk
KBUILD_CPPFLAGS := -D__KERNEL__ -D__UBOOT__ //定義__KERNEL__和__UBOOT__ 宏

# Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments
KBUILD_CPPFLAGS += $(KCPPFLAGS)
......

展開為:

KBUILD_CPPFLAGS=-D__KERNEL__ -D__UBOOT__

引數講解見本文末尾參考小節

6. 編譯系統kbuild需要的編譯選項$(KBUILD_CFLAGS)

# /scripts/Makefile.spl
KBUILD_CFLAGS   := -Wall -Wstrict-prototypes \
		   -Wno-format-security \
		   -fno-builtin -ffreestanding
KBUILD_CFLAGS	+= -fshort-wchar
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
KBUILD_CFLAGS	+= -Os
else
KBUILD_CFLAGS	+= -O2
endif

KBUILD_CFLAGS += $(call cc-option,-fno-stack-protector)
KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks)

KBUILD_CFLAGS	+= -g
KBUILD_CFLAGS += $(call cc-option,-Wno-format-nonliteral)

# Prohibit date/time macros, which would make the build non-deterministic
KBUILD_CFLAGS   += $(call cc-option,-Werror=date-time)

# Report stack usage if supported
ifeq ($(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-stack-usage.sh $(CC)),y)
	KBUILD_CFLAGS += -fstack-usage
endif

#(1) 頂層config.mk
KBUILD_CFLAGS += $(KCFLAGS)

展開為:

KBUILD_CFLAGS=-Wall -Wstrict-prototypes -Wno-format-security -fno-builtin -ffreestanding -fshort-wchar -Os -fno-stack-protector -fno-delete-null-pointer-checks -g -fstack-usage -Wno-format-nonliteral -Werror=date-time

引數講解見本文末尾參考小節

7. 預處理需要的編譯選項$(cpp_flags)

#(1) 頂層config.mk
# Use UBOOTINCLUDE when you must reference the include/ directory.
# Needed to be compatible with the O= option
UBOOTINCLUDE    := \
		-Iinclude \
		$(if $(KBUILD_SRC), -I$(srctree)/include) \
		$(if $(CONFIG_$(SPL_)SYS_THUMB_BUILD), \
			$(if $(CONFIG_HAS_THUMB2),, \
				-I$(srctree)/arch/$(ARCH)/thumb1/include),) \
		-I$(srctree)/arch/$(ARCH)/include \          //-I./arch/arm/include
		-include $(srctree)/include/linux/kconfig.h  //-include ./include/linux/kconfig.h
		
......		

NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include) 
// $(CC) -print-file-name=include : 列印GCC默認搜索include頭檔案的路徑

......		

# FIX ME
cpp_flags := $(KBUILD_CPPFLAGS) $(PLATFORM_CPPFLAGS) $(UBOOTINCLUDE) $(NOSTDINC_FLAGS)

預處理編譯選項$(cpp_flags)定義在頂層Makefile中,主要由:編譯系統kbuild需要的預處理選項 $(KBUILD_CPPFLAGS)、平臺代碼預處理需要的編譯選項 $(PLATFORM_CPPFLAGS)、UBOOT要使用的頭檔案路徑、CC默認搜索include頭檔案的路徑組成,

展開為:

cpp_flags=-D__KERNEL__ -D__UBOOT__ -D__ARM__ -fno-pic -mstrict-align -ffunction-sections -fdata-sections -fno-common -ffixed-r9 -fno-common -ffixed-x18 -pipe -march=armv8-a -mgeneral-regs-only -D__LINUX_ARM_ARCH__=8 -Iinclude -I./arch/arm/include -include ./include/linux/kconfig.h -nostdinc -isystem /home/h/my-work/03_toolchain/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/7.3.1/include

8. 編譯需要的編譯選項$(c_flags)

#(1) 頂層config.mk
c_flags := $(KBUILD_CFLAGS) $(cpp_flags)

編譯選項$(c_flags)定義在頂層Makefile中,主要由 $(KBUILD_CFLAGS) (編譯系統kbuild需要的編譯選項)和 $(cpp_flags)(uboot整體代碼預處理需要的編譯選項)組成,

展開為:

c_flags=-Wall -Wstrict-prototypes -Wno-format-security -fno-builtin -ffreestanding -fshort-wchar -Os -fno-stack-protector -fno-delete-null-pointer-checks -g -fstack-usage -Wno-format-nonliteral -Werror=date-time -D__KERNEL__ -D__UBOOT__ -D__ARM__ -fno-pic -mstrict-align -ffunction-sections -fdata-sections -fno-common -ffixed-r9 -fno-common -ffixed-x18 -pipe -march=armv8-a -mgeneral-regs-only -D__LINUX_ARM_ARCH__=8 -Iinclude -I./arch/arm/include -include ./include/linux/kconfig.h -nostdinc -isystem /home/h/my-work/03_toolchain/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/../lib/gcc/aarch64-linux-gnu/7.3.1/include

引數講解見本文末尾參考小節

9. 鏈接需要的編譯選項$(LDFLAGS_FINAL)

#(1) 頂層config.mk
LDFLAGS_FINAL :=
......
LDFLAGS_FINAL += -Bstatic

export LDFLAGS_FINAL

#(2) arch/arm/config.mk
LDFLAGS_FINAL += --gc-sections

展開為:

LDFLAGS_FINAL= --gc-sections -Bstatic  //指定從-L指定的目錄串列中查找libfoo.a

引數講解見本文末尾參考小節

10. 參考

[1] -Wall:打開全部編譯告警;
[2] -Wstrict-prototypes:如果在未指定引數型別的情況下宣告或定義函式,則發出警告, (如果前面有一個指定引數型別的宣告,則允許在沒有警告的情況下進行舊式函式定義);
[3] -Wformat、-Wformat=n、-Wformat-security:Wformat、-Wformat=n:檢查對 printf 和 scanf 等的呼叫,以確保提供的引數具有適合指定格式字串的型別,并且格式字串中指定的轉換是有意義的,這包括 printf、scanf、strftime 和 strfmon(X/Open 擴展,不在 C 標準中)系列(或其他特定于目標的系列)中的標準函式和其他由格式屬性(請參閱函式屬性)指定的函式,在沒有指定格式屬性的情況下檢查哪些函式取決于所選的標準版本,并且對沒有指定屬性的函式的這種檢查被 -ffreestanding 或 -fno-builtin 禁用;-Wformat-security:如果指定了“-Wformat”,還會警告使用表示可能的安全問題的格式函式,目前,這會警告呼叫 printf 和 scanf 函式,其中格式字串不是字串文字并且沒有格式引數,如 printf (foo);
[4] -Wformat-nonliteral、-Wno-format-nonliteral :如果指定了 -Wformat,如果格式字串不是字串文字并且因此無法檢查,也會發出警告,除非格式函式將其格式引數作為 va_list;
[5] -fno-builtin、-fno-builtin-function:不識別不以“builtin”作為前綴的內置函式,;
[6] -ffreestanding:編譯輸出(可執行檔案)是運行在一個 freestanding environment 環境下,這個選項 包含 -fno-builtin 選項,等同于 -fno-hosted;
[7] -O -O0 -O1 -O2 -O3 -Os -Ofast -Og -Oz:-Os相當于-O2.5,是使用了所有-O2的優化選項,但又不縮減代碼尺寸的方法;
[8] -fstack-protector、-fno-stack-protector、-fstack-protector-all:-fstack-protector:啟用堆疊保護,不過只為區域變數中含有 char 陣列的函式插入保護代碼;-fstack-protector-all:啟用堆疊保護,為所有函式插入保護代碼;-fno-stack-protector:禁用堆疊保護,GCC中的堆疊保護機制;
[9] -fdelete-null-pointer-checks/-fno-delete-null-pointer-checks:delete-null-pointer-checks是一種優化手段,通過全域的資料流分析來識別和洗掉所有對空指標的檢測操作;編譯器假定對空指標的解參考會造成程式終止,但因為有些環境下,這一結論并不一定成立,而O2,O3和Os時會開啟此優化,因此GCC增加了選項-fno-delete-null-pointer-checks;
[10] -g:告訴gcc生成并嵌入除錯資訊;
[11] -fstack-usage:為每一個函式輸出堆疊使用資訊,每一個原始碼檔案生成一個.su (Stack Usage)檔案, su檔案中有每一個函式的堆疊使用資訊;
[12] -Wstack-usage=byte-size:如果函式的堆疊使用量可能超過位元組大小,則發出警告,;
[13] -Wdate-time:當遇到宏__TIME
_、 宏__DATE__ 、 宏__TIMESTAMP__時發出警告;
[14] -Werror=date-time:將指定的警告變成錯誤;
[15] -fpic、-FPIC、-fpie、-fPIE:相同點:都是為了在動態庫中生成位置無關的代碼,通過全域偏移表(GOT)訪問所有常量地址,程式啟動時動態加載程式決議GOT條目,不同點:如果鏈接的可執行檔案的GOT大小超過計算機特定的最大大小,則會從聯結器收到錯誤訊息,指示-fpic不起作用;在這種情況下,請使用-fPIC重新編譯,GOT大小根據作業系統的不同而大小不一樣,SPARC上為8k,在AArch64上為28k,在m68k和RS / 6000上為32k,x86沒有此限制;-fpie、-fPIE這些選項類似于 -fpic 和 -fPIC,但生成的與位置無關的代碼只能鏈接到可執行檔案中, 通常這些選項用于編譯將使用 -pie GCC 選項鏈接的代碼,-fpie 和 -fPIE 都定義了宏 piePIE, 宏的 -fpie 值為 1,-fPIE 值為 2,-fno-pic :生產位置有關代碼,
[16] -ffixed-reg:生成的代碼不要用暫存器r9,uboot中用來指另做它用;
[17] -ffunction-sections、-fdata-sections:在鏈接生成最終可執行檔案時,如果帶有-Wl,--gc-sections引數,并且之前編譯目標檔案時帶有-ffunction-sections、-fdata-sections引數,則聯結器ld不會鏈接未使用的函式,從而減小可執行檔案大小;
[18] -fshort-wchar:強制將wchar_t指定成兩個位元組,使用這個欄位常常是因為wchar_t型別在Windows和Linux平臺下位元組大小的不同,但這樣做只會改變代碼中實作的部分,而內部庫或者是第三方庫中用到的介面和函式都是沒有變的,仍然采用的是4位元組編碼
[19] --gc-sections ,-gc-sections:同上
[20] -fcommon、-fno-common: 指定編譯器將未初始化的全域變數放在物件檔案的BSS部分,
[21] -mthumb、-marm、-mthumb-interwork、-mno-thumb-interwork:-marm 和-mthumb用來執行生成的代碼在arm模式還是thumb模式執行,-mno-thumb-interwork 是指沒有ARM/Thumb之間的切換
[22] -mword-relocations:由于使用pic時movt / movw指令會硬編碼16bit的地址域,而uboot的relocation并不支持這個, 所以arm平臺使用mword-relocations來生成位置無關代碼
[23] -mabi=name:這些' -m '選項是為ARM埠定義的,為指定的ABI(Application Binary Interface)生成代碼,允許的值是:' apcs-gnu ',' atpcs ', ' aapcs ', ' aapcs-linux '和' iwmmxt ',
[24] -mstrict-align、-mno-strict-align:是否允許非對齊訪問;
[25] -finstrument-functions:生成函式的進入和退出的檢測呼叫;
[26] -pipe:編譯的各個階段之間使用管道而不是臨時檔案進行通信,這在匯編程式無法從管道讀取資料的某些系統上無法作業;但是GNU匯編器沒有問題;
[27] -march=name:指定目標架構的名稱,以及一個或多個可選的特性修飾符;
[28] -mgeneral-regs-only:生成只使用通用暫存器的代碼,這將防止編譯器使用浮點暫存器和高級SIMD暫存器,但不會對匯編程式施加任何限制;
[29] -Bdynamic、-Bstatic:-Bdynamic and -Bstatic這兩個選項是position-dependent選項,影響后面命令列出現的-lname,-Bdynamic (default):在-L指定的目錄串列中查找libfoo.so和libfoo.a;-Bstatic:在-L指定的目錄串列中查找libfoo.a,注意,歷史上-Bstatic和-static同義,編譯器driver的-static是個不同的選項,除了傳遞-static給ld外,還會去除預設的--dynamic-linker,影響libgcc libc等的鏈接;
[30] 下面以uboot的編譯和鏈接程序arm gcc相關的引數,具體內容可以參考:官方檔案;pdf版本下載;
[31] arm gcc 編譯與鏈接引數
[uboot] (番外篇)uboot relocation介紹
[32] 一個問題引出的>/dev/null 2>&1詳解
[33] linuxC編譯引數CPPFLAGS、CFLAGS、LDFLAGS引數的理解
[34] Linux內核移植 part1:arm gcc 編譯與鏈接引數

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/534038.html

標籤:嵌入式

上一篇:UBOOT編譯--- UBOOT的頂層config.mk(五)

下一篇:STM32F7xx外設驅動1-led(暫存器)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more