主頁 >  其他 > 嵌入式Linux學習筆記

嵌入式Linux學習筆記

2021-10-23 09:43:47 其他

學習正點原子《【正點原子】I.MX6U嵌入式Linux驅動開發指南V1.5.2.pdf》個人筆記

常用操作&相關知識

壓縮解壓

解壓.tar.bz2
tar -vxjf linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2
壓縮.tar.bz2
tar -vcjf alientek_uboot.tar.bz2 alientek_uboot

編譯

將前面編譯出來的 led.o 檔案鏈接到 0X87800000 這個地址,使用如下命令:
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
上述命令中-Ttext 就是指定鏈接地址,“-o”選項指定鏈接生成的 elf 檔案名,這里我們命名為 led.elf,上述命令執行完以后就會在工程目錄下多一個 led.elf 檔案

led.elf 檔案也不是我們最終燒寫到 SD 卡中的可執行檔案,我們要燒寫的.bin 檔案,因此還需要將 led.elf 檔案轉換為.bin 檔案,這里我們就需要用到 arm-linux-gnueabihf-objcopy 這個工具了,

arm-linux-gnueabihf-objcopy 更像一個格式轉換工具,我們需要用它將 led.elf 檔案轉換為led.bin 檔案,命令如下:
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
上述命令中,“-O”選項指定以什么格式輸出,后面的“binary”表示以二進制格式輸出,選項“-S”表示不要復制源檔案中的重定位資訊和符號資訊,“-g”表示不復制源檔案中的除錯資訊,

大多數情況下我們都是用 C 語言寫試驗例程的,有時候需要查看其匯編代碼來除錯代碼,因此就需要進行反匯編,一般可以將 elf 檔案反匯編,比如如下命令:
arm-linux-gnueabihf-objdump -D led.elf > led.dis
上述代碼中的“-D”選項表示反匯編所有的段,反匯編完成以后就會在當前目錄下出現一個名為 led.dis 檔案
可以打開 led.dis 檔案看一下,看看是不是匯編代碼
在這里插入圖片描述
從圖 可以看出 led.dis 里面是匯編代碼,而且還可以看到記憶體分配情況,在0X87800000 處就是全域標號_start,也就是程式開始的地方,通過 led.dis 這個反匯編檔案可以明顯的看出我們的代碼已經鏈接到了以 0X87800000 為起始地址的區域,

makefile

objs := start.o main.o

ledc.bin:$(objs)
	arm-linux-gnueabihf-ld -Timx6ul.lds -o ledc.elf $^
	arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@
	arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis
	
%.o:%.s
	arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<
	
%.o:%.S
	arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<
	
%.o:%.c
	arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<
	
clean:
	rm -rf *.o ledc.bin ledc.elf ledc.dis

第 1 行定義了一個變數 objs, objs 包含著要生成 ledc.bin 所需的材料: start.o 和 main.o,也就是當前工程下的 start.s 和 main.c 這兩個檔案編譯后的.o 檔案,這里要注意 start.o 一定要放到最前面!因為在后面鏈接的時候 start.o 要在最前面,因為 start.o 是最先要執行的檔案!
第 3 行就是默認目標,目的是生成最終的可執行檔案 ledc.bin, ledc.bin 依賴 start.o 和 main.o如果當前工程沒有 start.o 和 main.o 的時候就會找到相應的規則去生成 start.o 和 main.o,比如start.o 是 start.s 檔案編譯生成的,因此會執行第 8 行的規則,
第 4 行是使用 arm-linux-gnueabihf-ld 進行鏈接,鏈接起始地址是 0X87800000,但是這一行用到了自動變數“$^”,“$^”的意思是所有依賴檔案的集合,在這里就是 objs 這個變數的值:start.o 和 main.o,鏈接的時候 start.o 要鏈接到最前面,因為第一行代碼就是 start.o 里面的,因此這一行就相當于:
arm-linux-gnueabihf-ld -Ttext 0X87800000 -o ledc.elf start.o main.o
第 5 行使用 arm-linux-gnueabihf-objcopy 來將 ledc.elf 檔案轉為 ledc.bin,本行也用到了自動變數“$@”,“$@”的意思是目標集合,在這里就是“ledc.bin”,那么本行就相當于:
arm-linux-gnueabihf-objcopy -O binary -S ledc.elf ledc.bin
第 6 行使用 arm-linux-gnueabihf-objdump 來反匯編,生成 ledc.dis 檔案,
第 8~15 行就是針對不同的檔案型別將其編譯成對應的.o 檔案,其實就是匯編.s(.S)和.c 檔案,比如 start.s 就會使用第 8 行的規則來生成對應的 start.o 檔案,第 9 行就是具體的命令,這行也用到了自動變數“$@”和“$<”,其中“$<”的意思是依賴目標集合的第一個檔案,比如start.s 要編譯成 start.o 的話第 8 行和第 9 行就相當于:

start.o:start.s
    arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o start.o start.s

第 17 行就是工程清理規則,通過命令“make clean”就可以清理工程,

KERNELDIR := /home/zuozhongkai/linux/IMX6ULL/linux/temp/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek
CURRENT_PATH := $(shell pwd)
obj-m := chrdevbase.o

build: kernel_modules

kernel_modules:
	$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules
clean:
	$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

第 1 行, KERNELDIR 表示開發板所使用的 Linux 內核原始碼目錄,使用絕對路徑,大家根據自己的實際情況填寫即可,
第 2 行, CURRENT_PATH 表示當前路徑,直接通過運行“pwd”命令來獲取當前所處路徑,
第 3 行, obj-m 表示將 chrdevbase.c 這個檔案編譯為 chrdevbase.ko 模塊,
第 8 行,具體的編譯命令,后面的 modules 表示編譯模塊, -C 表示將當前的作業目錄切換到指定目錄中,也就是 KERNERLDIR 目錄, M 表示模塊原始碼目錄,“make modules”命令中加入 M=dir 以后程式會自動到指定的 dir 目錄中讀取模塊的原始碼并將其編譯為.ko 檔案,

Makefile 撰寫好以后輸入“make”命令編譯驅動模塊

鏈接腳本

SECTIONS{
	. = 0X10000000;
	.text : {*(.text)}
	. = 0X30000000;
	.data ALIGN(4) : { *(.data) }
	.bss ALIGN(4) : { *(.bss) }
}

第 1 行我們先寫了一個關鍵字“SECTIONS”,后面跟了一個大括號,這個大括號和第 7 行的大括號是一對,這是必須的,看起來就跟 C 語言里面的函式一樣,
第 2 行對一個特殊符號“.”進行賦值,“.”在鏈接腳本里面叫做定位計數器,默認的定位計數器為 0,我們要求代碼鏈接到以0X10000000 為起始地址的地方,因此這一行給“.”賦值0X10000000,表示以 0X10000000 開始,后面的檔案或者段都會以0X10000000 為起始地址開始鏈接,
第 3 行的“.text”是段名,后面的冒號是語法要求,冒號后面的大括號里面可以填上要鏈接到“.text”這個段里面的所有檔案,“*(.text)”中的“*”是通配符,表示所有輸入檔案的.text段都放到“.text”中,
第 4 行,我們的要求是資料放到 0X30000000 開始的地方,所以我們需要重新設定定位計數器“.”,將其改為 0X30000000,如果不重新設定的話會怎么樣?假設“.text”段大小為 0X10000,那么接下來的.data 段開始地址就是0X10000000+0X10000=0X10010000,這明顯不符合我們的要求,所以我們必須調整定位計數器為 0X30000000,
第 5 行跟第 3 行一樣,定義了一個名為“.data”的段,然后所有檔案的“.data”段都放到這里面,但是這一行多了一個“ALIGN(4)”,這是什么意思呢?這是用來對“.data”這個段的起始地址做位元組對齊的, ALIGN(4)表示 4 位元組對齊,也就是說段“.data”的起始地址要能被 4 整除,一般常見的都是 ALIGN(4)或者 ALIGN(8),也就是 4 位元組或者 8 位元組對齊,
第 6 行定義了一個“.bss”段,所有檔案中的“.bss”資料都會被放到這個里面,“.bss”資料就是那些定義了但是沒有被初始化的變數,

上面就是鏈接腳本最基本的語法格式,我們接下來就按照這個基本的語法格式來撰寫我們本試
驗的鏈接腳本,我們本試驗的鏈接腳本要求如下:
①、鏈接起始地址為 0X87800000,
②、 start.o 要被鏈接到最開始的地方,因為 start.o 里面包含這第一個要執行的命令,
根據要求,在 Makefile 同目錄下新建一個名為“imx6ul.lds”的檔案,然后在此檔案里面輸入如下所示代碼:

SECTIONS{
	. = 0X87800000;
	.text :
	{
		start.o
		main.o
		*(.text)
	}
	.rodata ALIGN(4) : {*(.rodata*)}
	.data ALIGN(4) : { *(.data) }
	__bss_start = .;
	.bss ALIGN(4) : { *(.bss) *(COMMON) }
	__bss_end = .;
}

第 2 行設定定位計數器為0X87800000,因為我們的鏈接地址就是0X87800000,
第5行設定鏈接到開始位置的檔案為start.o,因為 start.o 里面包含著第一個要執行的指令,所以一定要鏈接到最開始的地方,
第 6 行是 main.o這個檔案,其實可以不用寫出來,因為 main.o 的位置就無所謂了,可以由編譯器自行決定鏈接位置,
在第 11、 13 行有“__bss_start”和“__bss_end”這兩個東西?這個是什么呢?“__bss_start”和“__bss_end”是符號,第 11、 13 這兩行其實就是對這兩個符號進行賦值,其值為定位符“.”,這兩個符號用來保存.bss 段的起始地址和結束地址,前面說了.bss 段是定義了但是沒有被初始化的變數,我們需要手動對.bss 段的變數清零的,因此我們需要知道.bss 段的起始和結束地址,這樣我們直接對這段記憶體賦 0 即可完成清零,通過第 11、 13 行代碼, .bss 段的起始地址和結束地址就保存在了“__bss_start”和“__bss_end”中,我們就可以直接在匯編或者 C 檔案里面使用這兩個符號,

arm-linux-gnueabihf-ld -Ttext 0X87800000 -o ledc.elf $^
改為:
arm-linux-gnueabihf-ld -Timx6ul.lds -o ledc.elf $^
其實就是將-T 后面的 0X87800000 改為 imx6ul.lds,表示使用 imx6ul.lds 這個鏈接腳本檔案,

內核目錄

在這里插入圖片描述

linux內核編譯程序

make xxx_defconfig命令配置 Linux 的時候如下兩行命令會執行腳本scripts/Makefile.build:

@make -f ./scripts/Makefile.build obj=scripts/basic
@make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig
%_defconfig: scripts/kconfig/conf
@ scripts/kconfig/conf --defconfig=arch/arm/configs/%_defconfig Kconfig

%_defconfig依賴scripts/kconfig/conf,所以會編譯scripts/kconfig/conf.c生成conf這個軟體,
此軟體就會將%_defconfig 中的配置輸出到.config 檔案中,最終生成 Linux kernel 根目錄下的.config 檔案,

使用命令“make xxx_defconfig”配置好 Linux 內核以后就可以使用“make”或者“make all”命令進行編譯,頂層 Makefile 有如下代碼:

125 PHONY := _all
126 _all:
......
192 PHONY += all
193 ifeq ($(KBUILD_EXTMOD),)
194 _all: all
195 else
196 _all: modules
197 endif
......
608 all: vmlinux

第 126 行, _all 是默認目標,如果使用命令“make”編譯 Linux 的話此目標就會被匹配,
第 193 行,如果 KBUILD_EXTMOD 為空的話 194 行的代碼成立,
第 194 行,默認目標_all 依賴 all,
第 608 行,目標 all 依賴 vmlinux,所以接下來的重點就是 vmlinux!

要分析 Linux 啟動流程,同樣需要先編譯一下 Linux 原始碼,因為有很多檔案是需要編譯才會生成的,首先分析 Linux 內核的連接腳本檔案 arch/arm/kernel/vmlinux.lds,通過鏈接腳本可以找到 Linux 內核的第一行程式是從哪里執行的, vmlinux.lds 中有如下代碼:

492 OUTPUT_ARCH(arm)
493 ENTRY(stext)
494 jiffies = jiffies_64;

第 493 行的 ENTRY 指明了了 Linux 內核入口,入口為 stext, stext 定義在檔案arch/arm/kernel/head.S 中 , 因 此 要 分 析 Linux 內 核 的 啟 動 流 程 , 就 得 先 從 文 件arch/arm/kernel/head.S 的 stext 處開始分析,

linux內核移植步驟

1、設定目標架構和交叉編譯器

同 uboot一樣, Linux編譯的時候需要設定目標板架構ARCH 和交叉編譯器 CROSS_COMPILE,在頂層 Makefile 中代碼如下:

ARCH ?= $(SUBARCH)
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)

為了方便,一般直接修改頂層 Makefile 中的 ARCH 和 CROSS_COMPILE,直接將其設定為對應的架構和編譯器,比如本教程將 ARCH 設定為為 arm, CROSS_COMPILE 設定為 armlinux-gnueabihf-,如下所示:

ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabihf-

設定好以后我們就可以使用如下命令編譯 Linux 了:

make xxx_defconfig //使用默認組態檔配置 Linux
make menuconfig //啟動圖形化配置界面
make -j16 //編譯 Linux

內核啟動測驗

在上一小節我們已經得到了 NXP 官方 I.MX6ULL EVK 開發板對應的 zImage 和 imx6ull-14x14-evk.dtb 這兩個檔案,這兩個檔案能不能在正點原子的 I.MX6U-ALPHA EMMC 版開發板上啟動呢?測驗一下不就知道了,在測驗之前確保 uboot 中的環境變數 bootargs 內容如下:
console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw
將上一小節編譯出來的 zImage 和 imx6ull-14x14-evk.dtb 復制到 Ubuntu 中的 tftp 目錄下,因為我們要在 uboot 中使用 tftp 命令將其下載到開發板中,拷貝命令如下:

cp arch/arm/boot/zImage /home/zuozhongkai/linux/tftpboot/ -f
cp arch/arm/boot/dts/imx6ull-14x14-evk.dtb /home/zuozhongkai/linux/tftpboot/ -f

拷貝完成以后就可以測驗了,啟動開發板,進入 uboot 命令列模式,然后輸入如下命令將zImage 和 imx6ull-14x14-evk.dtb 下載到開發板中并啟動:

tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk.dtb
bootz 80800000 - 83000000

Linux 內核啟動以后是需要根檔案系統的,根檔案系統存在哪里是由 uboot 的 bootargs 環境變數指定 , bootargs 會傳遞給 Linux 內核作為命令列引數 , 比如上面設定root=/dev/mmcblk1p2,也就是說根檔案系統存盤在/dev/mmcblk1p2 中,也就是 EMMC 的磁區 2中,這是因為正點原子的 EMMC 版本開發板出廠的時候已經 EMMC 的磁區 2 中燒寫好了根檔案系統,所以設定 root=/dev/mmcblk1p2,

在 Linux 中添加自己的開發板

通過編譯 NXP 官方 I.MX6ULL EVK 開發板對應的 Linux 內核,發現其可以在正點原子的 EMMC 版本開發板啟動,所以我們就參考 I.MX6ULL EVK 開發板的設定,在 Linux 內核中添加正點原子的 I.MX6U-ALPHA 開發板,

添加開發板默認組態檔

將 arch/arm/configs 目 錄 下 的 imx_v7_mfg_defconfig 重 新 復 制 一 份 , 命 名 為imx_alientek_emmc_defconfig,命令如下:

cd arch/arm/configs
cp imx_v7_mfg_defconfig imx_alientek_emmc_defconfig

以后 imx_alientek_emmc_defconfig 就是正點原子的 EMMC 版開發板默認組態檔了,
以后就可以使用如下命令來配置正點原子 EMMC 版開發板對應的 Linux 內核了:
make imx_alientek_emmc_defconfig

添加開發板對應的設備樹檔案

添加適合正點原子 EMMC 版開發板的設備樹檔案,進入目錄 arch/arm/boot/dts 中,復制一份 imx6ull-14x14-evk.dts,然后將其重命名為 imx6ull-alientek-emmc.dts,命令如下:

cd arch/arm/boot/dts
cp imx6ull-14x14-evk.dts imx6ull-alientek-emmc.dts

.dts 是設備樹原始碼檔案,編譯 Linux 的時候會將其編譯為.dtb 檔案,imx6ull-alientek-emmc.dts創建好以后我們還需要修改檔案 arch/arm/boot/dts/Makefile ,找到“dtb-$(CONFIG_SOC_IMX6ULL)”配置項,在此配置項中加入“imx6ull-alientek-emmc.dtb”
這樣編譯 Linux 的時候就可以從 imx6ull-alientekemmc.dts 編譯出 imx6ull-alientek-emmc.dtb 檔案了,

編譯測驗

可以創建一個編譯腳本 ,imx6ull_alientek_emmc.sh,腳本內容如下:

1 #!/bin/sh
2 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
3 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihfimx_alientek_emmc_defconfig
4 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
5 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

第 2 行,清理工程,
第 3 行,使用默認組態檔 imx_alientek_emmc_defconfig 來配置 Linux 內核,
第 4 行,打開 Linux 的圖形配置界面,如果不需要每次都打開圖形配置界面可以洗掉此行,
第 5 行,編譯 Linux,

執行 shell 腳本 imx6ull_alientek_emmc.sh 編譯 Linux 內核, 命令如下:

chmod 777 imx6ull_alientek_emmc.sh //給予可執行權限
./imx6ull_alientek_emmc.sh //執行 shell 腳本編譯內核

編譯完成以后就會在目錄 arch/arm/boot 下生成 zImage 鏡像檔案,在 arch/arm/boot/dts 目錄下生成 imx6ull-alientek-emmc.dtb 檔案,

CPU 主頻修改

執行cat /proc/cpuinfo
在這里插入圖片描述
有 BogoMIPS 這一條,此時 BogoMIPS 為 3.00, BogoMIPS 是 Linux 系統中衡量處理器運行速度的一個“尺子”,處理器性能越強,主頻越高, BogoMIPS 值就越大,BogoMIPS 只是粗略的計算 CPU 性能,并不十分準確,但是我們可以通過 BogoMIPS 值來大致的判斷當前處理器的性能,在圖中并沒有看到當前 CPU 的作業頻率,那我們就轉變另一種方法查看當前 CPU 的作業頻率,進入到目錄/sys/bus/cpu/devices/cpu0/cpufreq 中,此目錄下會有很多檔案
在這里插入圖片描述
此目錄中記錄了 CPU 頻率等資訊,這些檔案的含義如下:

  • cpuinfo_cur_freq:當前 cpu 作業頻率,從 CPU 暫存器讀取到的作業頻率,
  • cpuinfo_max_freq:處理器所能運行的最高作業頻率(單位: KHz),
  • cpuinfo_min_freq :處理器所能運行的最低作業頻率(單位: KHz),
  • cpuinfo_transition_latency:處理器切換頻率所需要的時間(單位:ns),
  • scaling_available_frequencies:處理器支持的主頻率串列(單位: KHz),
  • scaling_available_governors:當前內核中支持的所有 governor(調頻)型別,
  • scaling_cur_freq:保存著 cpufreq 模塊快取的當前 CPU 頻率,不會對 CPU 硬體暫存器進行檢查,
  • scaling_driver:該檔案保存當前 CPU 所使用的調頻驅動,
  • scaling_governor: governor(調頻)策略, Linux 內核一共有 5 種調頻策略,
    ①、 Performance,最高性能,直接用最高頻率,不考慮耗電,
    ②、 Interactive,一開始直接用最高頻率,然后根據 CPU 負載慢慢降低,
    ③、 Powersave,省電模式,通常以最低頻率運行,系統性能會受影響,一般不會用這個!
    ④、 Userspace,可以在用戶空間手動調節頻率,
    ⑤、 Ondemand,定時檢查負載,然后根據負載來調節頻率,負載低的時候降低 CPU 頻率,這樣省電,負載高的時候提高 CPU 頻率,增加性能,
  • scaling_max_freq: governor(調頻)可以調節的最高頻率,
  • cpuinfo_min_freq: governor(調頻)可以調節的最低頻率,

stats 目錄下給出了 CPU 各種運行頻率的統計情況,比如 CPU 在各頻率下的運行時間以及變頻次數,
使用如下命令查看當前 CPU 頻率:
cat cpuinfo_cur_freq
在這里插入圖片描述
可以看出,當前 CPU 頻率為 198MHz,作業頻率很低!其他的值如下:

cpuinfo_cur_freq = 198000
cpuinfo_max_freq = 792000
cpuinfo_min_freq = 198000
scaling_cur_freq = 198000
scaling_max_freq = 792000
cat scaling_min_freq = 198000
scaling_available_frequencies = 198000 396000 528000 792000
cat scaling_governor = ondemand

可以看出,當前 CPU 支持 198MHz、 396MHz、 528Mhz 和 792000 四種頻率切換,其中調頻策略為 ondemand,也就是定期檢查負載,然后根據負載情況調節 CPU 頻率,因為當前我們開發板并沒有做什么作業,因此 CPU 頻率降低為 198MHz 以省電,如果開發板做一些高負載的作業,比如播放視頻等操作那么 CPU 頻率就會提升上去,
查看 stats 目錄下的 time_in_state 檔案可以看到 CPU 在各頻率下的作業時間,命令如下:
cat /sys/bus/cpu/devices/cpu0/cpufreq/stats/time_in_state
在這里插入圖片描述
從圖中可以看出, CPU 在 198MHz、 396MHz、 528MHz 和 792MHz 都作業過,其中 198MHz 的作業時間最長!假如我們想讓 CPU 一直作業在 792MHz 那該怎么辦?很簡單,配置 Linux 內核,將調頻策略選擇為 performance,或者修改imx_alientek_emmc_defconfig 檔案,此檔案中有下面幾行:

41 CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
42 CONFIG_CPU_FREQ_GOV_POWERSAVE=y
43 CONFIG_CPU_FREQ_GOV_USERSPACE=y
44 CONFIG_CPU_FREQ_GOV_INTERACTIVE=y

第 41 行,配置 ondemand 為默認調頻策略,
第 42 行,使能 powersave 策略,
第 43 行,使能 userspace 策略,
第 44 行,使能 interactive 策略,
將第 41 行屏蔽掉,然后在 44 行后面添加:

CONFIG_CPU_FREQ_GOV_ONDEMAND=y

結果下所示:

41 #CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
42 CONFIG_CPU_FREQ_GOV_POWERSAVE=y
43 CONFIG_CPU_FREQ_GOV_USERSPACE=y
44 CONFIG_CPU_FREQ_GOV_INTERACTIVE=y
45 CONFIG_CPU_FREQ_GOV_ONDEMAND=y

修改完成以后重新編譯 Linux 內核,編譯之前先清理一下工程!因為我們重新修改過默認組態檔了 , 編譯完成以后使用新的 zImage鏡像檔案重新 啟動 Linux , 再 次 查 看/sys/devices/system/cpu/cpu0/cpufreq/ cpuinfo_cur_freq 檔案的值,如圖
在這里插入圖片描述
可以看出,當前 CPU 頻率為 792MHz 了,查看 scaling_governor 檔案看一下當前的調頻策略,如圖
在這里插入圖片描述
可以看出當前的 CPU 調頻策略為 preformance,也就是高性能模式,一直以最高主頻運行,
我們再來看一下如何通過圖形化界面配置 Linux 內核的 CPU 調頻策略,輸入“ make menuconfig”打開 Linux 內核的圖形化配置界面,進入如下路徑:

CPU Power Management
	-> CPU Frequency scaling
		-> Default CPUFreq governor

打開默認調頻策略選擇界面,選擇“performance”,選擇以后退出圖形化配置界面,然后編譯 Linux內核,一定不要清理工程!否則的話我們剛剛的設定就會被清理掉,編譯完成以后使用新的zImage 重啟 Linux,查看當前 CPU 的作業頻率和調頻策略,
我們學習的時候為了高性能,大家可以使用 performance 模式,但是在以后的實際產品開發中,從省電的角度考慮,建議大家使用 ondemand 模式,一來可以省電,二來可以減少發熱,

超頻&修改頻率串列

超頻設定其實很簡單,修改一下設備樹檔案 arch/arm/boot/dts/imx6ull.dtsi 即可,打開imx6ull.dtsi,找到下面代碼:

54 cpu0: cpu@0 {
55 	compatible = "arm,cortex-a7";
56 	device_type = "cpu";
57 	reg = <0>;
58 	clock-latency = <61036>; /* two CLK32 periods */
59 	operating-points = <
60 		/* kHz uV */
61 		996000 1275000
62 		792000 1225000
63 		528000 1175000
64 		396000 1025000
65 		198000 950000
66 	>;
67 	fsl,soc-operating-points = <
68 		/* KHz uV */
69 		996000 1175000
70 		792000 1175000
71 		528000 1175000
72 		396000 1175000
73 		198000 1175000
74 	>;

上面代碼就是設定 CPU 頻率的,第 61-65 行和第 69-73 行就是 I.MX6ULL 所支持的頻率,單位為 KHz,可以看出 I.MX6ULL(視具體型號而定)支持 996MHz、 792MHz、 528MHz、396MHz 和 198MHz,在上一小節中,我們知道 Linux 內核默認支持 198MHz、 396MHz、 528MHz和 792MHz, 如果是 MCIMX6Y2CVM05AB 這顆芯片的話,默認最高只能運行在 528MHz, 我
們在示例代碼中加入針對 696MHz 的支持,修改以后代碼如下:

54 cpu0: cpu@0 {
55	 compatible = "arm,cortex-a7";
56	 device_type = "cpu";
57	 reg = <0>;
58 	clock-latency = <61036>; /* two CLK32 periods */
59	 operating-points = <
60		 /* kHz uV */
61		 996000 1275000
62		 792000 1225000
63		 696000 1225000
64		 528000 1175000
65		 396000 1025000
66		 198000 950000
67	 >;
68	 fsl,soc-operating-points = <
69		 /* KHz uV */
70 		996000 1175000
71		 792000 1175000
72		 696000 1175000
73		 528000 1175000
74		 396000 1175000
75		 198000 1175000
76	 >;

修改好以后保存,并且編譯設備樹,在 Linux 內核原始碼根目錄下輸入如下命令編譯設備樹:
make dtbs
命令“make dtbs”只編譯設備樹檔案,也就是將.dts 編譯為.dtb,編譯完成以后使用新的設備 樹 文 件 imx6ull-alientek_emmc.dtb 啟 動 Linux , 重 啟 以 后 查 看 文 件/sys/devices/system/cpu/cpu0/cpufreq/ scaling_available_frequencies 的內容,如圖
在這里插入圖片描述

使能8線EMMC驅動

正點原子 EMMC 版本核心板上的 EMMC 采用的 8 位資料線
在這里插入圖片描述
Linux 內核驅動里面 EMMC 默認是 4 線模式的, 4 線模式肯定沒有 8 線模式的速度快,所以本節我們將 EMMC 的驅動修改為 8 線模式,修改方法很簡單,直接修改設備樹即可,打開檔案 imx6ull-alientek-emmc.dts,找到如下所示內容

734 &usdhc2 {
735 	pinctrl-names = "default";
736 	pinctrl-0 = <&pinctrl_usdhc2>;
737 	non-removable;
738	 	status = "okay";
739 };

改為如下代碼即可:

734 &usdhc2 {
735 	pinctrl-names = "default", "state_100mhz", "state_200mhz";
736 	pinctrl-0 = <&pinctrl_usdhc2_8bit>;
737 	pinctrl-1 = <&pinctrl_usdhc2_8bit_100mhz>;
738 	pinctrl-2 = <&pinctrl_usdhc2_8bit_200mhz>;
739 	bus-width = <8>;
740 	non-removable;
741 	status = "okay";
742 };

修改完成以后保存一下 imx6ull-alientek-emmc.dts,然后使用命令“make dtbs”重新編譯一下設備樹,編譯完成以后使用新的設備樹重啟 Linux 系統即可,

修改網路驅動

因為在后面學習 Linux 驅動開發的時候要用到網路除錯驅動,所以必須要把網路驅動除錯好,在講解 uboot 移植的時候就已經說過了,正點原子開發板的網路和 NXP 官方的網路硬體上不同,網路 PHY 芯片由 KSZ8081 換為了 LAN8720A,兩個網路 PHY 芯片的復位 IO 也不同,所以 Linux 內核自帶的網路驅動是驅動不起來 I.MX6U-ALPHA 開發板上的網路的,需要做修改,

1、修改 LAN8720 的復位以及網路時鐘引腳驅動

ENET1 復位引腳 ENET1_RST 連接在 I.M6ULL 的 SNVS_TAMPER7 這個引腳上, ENET2的復位引腳 ENET2_RST 連接在 I.MX6ULL 的 SNVS_TAMPER8 上,打開設備樹檔案 imx6ullalientek-emmc.dts,找到如下代碼:

584 pinctrl_spi4: spi4grp {
585 			fsl,pins = <
586 				MX6ULL_PAD_BOOT_MODE0__GPIO5_IO10 0x70a1
587 				MX6ULL_PAD_BOOT_MODE1__GPIO5_IO11 0x70a1
588 				MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x70a1
589 				MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x80000000
590 			>;
591 };

示例代碼中第 588 和 589 行就是初始化 SNVS_TAMPER7 和 SNVS_TAMPER8 這兩個引腳的,不過看樣子好像是作為了 SPI4 的 IO,這不是我們想要的,所以將 588 和 589 這兩行洗掉掉!洗掉掉以后繼續在 imx6ull-alientek-emmc.dts 中找到如下所示代碼:

125 spi4 {
126 	compatible = "spi-gpio";
127 	pinctrl-names = "default";
128 	pinctrl-0 = <&pinctrl_spi4>;
129 	pinctrl-assert-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
......
133 	cs-gpios = <&gpio5 7 0>;

第 129 行,設定 GPIO5_IO08 為 SPI4 的一個功能引腳(我也不清楚具體作為什么功能用),而 GPIO5_IO08 就是 SNVS_TAMPER8 的 GPIO 功能引腳,
第 133 行,設定 GPIO5_IO07 作為 SPI4 的片選引腳,而 GPIO5_IO07 就是 SNVS_TAMPER7的 GPIO 功能引腳,
現在我們需要 GPIO5_IO07 和 GPIO5_IO08 分別作為 ENET1 和 ENET2 的復位引腳,而不是 SPI4 的什么功能引腳,因此將示例代碼 37.4.3.2 中的第 129 行和第 133 行處的代碼洗掉掉!!否則會干擾到網路復位引腳!
在 imx6ull-alientek-emmc.dts 里面找到名為“iomuxc_snvs”的節點(就是直接搜索),然后在此節點下添加網路復位引腳資訊,添加完成以后的“iomuxc_snvs”的節點內容如下:

1 &iomuxc_snvs {
2 	pinctrl-names = "default_snvs";
3 	pinctrl-0 = <&pinctrl_hog_2>;
4 	imx6ul-evk {
5
...... /*省略掉其他*/
43
44 		/*enet1 reset zuozhongkai*/
45 		pinctrl_enet1_reset: enet1resetgrp {
46 			fsl,pins = <
47 				/* used for enet1 reset */
48 				MX6ULL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0
49		 	>;
50 		};
51
52 		/*enet2 reset zuozhongkai*/
53 		pinctrl_enet2_reset: enet2resetgrp {
54 			fsl,pins = <
55 				/* used for enet2 reset */
56 				MX6ULL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0
57 			>;
58 		};
59	 };
60 };

第 1 行, imx6ull-alientek-emmc.dts 檔案中 iomuxc_snvs 節點,
第 45~50 行, ENET1 網路復位引腳配置資訊,
第 53~58 行, ENET2 網路復位引腳配置資訊,
最后還需要修改一下 ENET1 和 ENET2 的網路時鐘引腳配置, 繼續在 imx6ull-alientekemmc.dts 中找到如下所示代碼:

309 pinctrl_enet1: enet1grp {
310 	fsl,pins = <
311 		MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN 0x1b0b0
312 		MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER 0x1b0b0
313 		MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00 0x1b0b0
314 		MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01 0x1b0b0
315 		MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN 0x1b0b0
316 		MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00 0x1b0b0
317 		MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01 0x1b0b0
318 		MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 0x4001b009
319 	>;
320 };
321
322 pinctrl_enet2: enet2grp {
323 	fsl,pins = <
324 		MX6UL_PAD_GPIO1_IO07__ENET2_MDC 0x1b0b0
325 		MX6UL_PAD_GPIO1_IO06__ENET2_MDIO 0x1b0b0
326 		MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN 0x1b0b0
327 		MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER 0x1b0b0
328 		MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00 0x1b0b0
329 		MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01 0x1b0b0
330 		MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN 0x1b0b0
331 		MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00 0x1b0b0
332 		MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01 0x1b0b0
333 		MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 0x4001b009
334 	>;
335 };

第 318 和 333 行, 分別為 ENET1 和 ENET2 的網路時鐘引腳配置資訊,將這兩個引腳的電氣屬性值改為 0x4001b009,原來默認值為 0x4001b031,
修改完成以后記得保存一下 imx6ull-alientek-emmc.dts,網路復位以及時鐘引腳驅動就修改好了,

2、修改 fec1 和 fec2 節點的 pinctrl-0 屬性

在 imx6ull-alientek-emmc.dts 檔案中找到名為“fec1”和“fec2”的這兩個節點,修改其中的“pinctrl-0”屬性值,修改以后如下所示

1 &fec1 {
2 	pinctrl-names = "default";
3 	pinctrl-0 = <&pinctrl_enet1
4 	&pinctrl_enet1_reset>;
5 	phy-mode = "rmii";
......
9	 status = "okay";
10 };
11
12 &fec2 {
13	 pinctrl-names = "default";
14	 pinctrl-0 = <&pinctrl_enet2
15 	&pinctrl_enet2_reset>;
16	 phy-mode = "rmii";
......
36 };

第 3~4 行,修改后的 fec1 節點“pinctrl-0”屬性值,
第 14~15 行,修改后的 fec2 節點“pinctrl-0”屬性值,

3、修改 LAN8720A 的 PHY 地址

在 uboot 移植章節中,我們說過 ENET1 的 LAN8720A 地址為 0x0, ENET2 的 LAN8720A地址為 0x1,在 imx6ull-alientek-emmc.dts 中找到如下代碼:

171 &fec1 {
172		pinctrl-names = "default";
......
175		phy-handle = <&ethphy0>;
176		status = "okay";
177 };
178
179 &fec2 {
180 	pinctrl-names = "default";
......
183		phy-handle = <&ethphy1>;
184		status = "okay";
185
186 	mdio {
187 		#address-cells = <1>;
188 		#size-cells = <0>;
189
190 		ethphy0: ethernet-phy@0 {
191 			compatible = "ethernet-phy-ieee802.3-c22";
192 			reg = <2>;
193 		};
194
195 		ethphy1: ethernet-phy@1 {
196 			compatible = "ethernet-phy-ieee802.3-c22";
197 			reg = <1>;
198 		};
199 	};
200 };

第 171~177 行, ENET1 對應的設備樹節點,
第 179~200 行, ENET2 對應的設備樹節點,但是第 186~198 行的 mdio 節點描述了 ENET1和 ENET2 的 PHY 地址資訊,將示例代碼 37.4.3.6 改為如下內容:

171 &fec1 {
172 	pinctrl-names = "default";
173 	pinctrl-0 = <&pinctrl_enet1
174 	&pinctrl_enet1_reset>;
175 	phy-mode = "rmii";
176 	phy-handle = <&ethphy0>;
177 	phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
178 	phy-reset-duration = <200>;
179 	status = "okay";
180 };
181
182 &fec2 {
183 	pinctrl-names = "default";
184 	pinctrl-0 = <&pinctrl_enet2
185 	&pinctrl_enet2_reset>;
186 	phy-mode = "rmii";
187 	phy-handle = <&ethphy1>;
188 	phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
189 	phy-reset-duration = <200>;
190 	status = "okay";
191
192 	mdio {
193 		#address-cells = <1>;
194 		#size-cells = <0>;
195
196 		ethphy0: ethernet-phy@0 {
197 			compatible = "ethernet-phy-ieee802.3-c22";
198 			smsc,disable-energy-detect;
199 			reg = <0>;
200 		};
201
202 		ethphy1: ethernet-phy@1 {
203 			compatible = "ethernet-phy-ieee802.3-c22";
204 			smsc,disable-energy-detect;
205 			reg = <1>;
206 		};
207 	};
208 };

第 177 和 178 行,添加了 ENET1 網路復位引腳所使用的 IO 為 GPIO5_IO07,低電平有效,復位低電平信號持續時間為 200ms,
第 188 和 189 行, ENET2 網路復位引腳所使用的 IO 為 GPIO5_IO08,同樣低電平有效,持續時間同樣為 200ms,
第 198 和 204 行,“smsc,disable-energy-detect”表明 PHY 芯片是 SMSC 公司的,這樣 Linux內核就會找到 SMSC 公司的 PHY 芯片驅動來驅動 LAN8720A,
第 196 行,注意“ethernet-phy@”后面的數字是 PHY 的地址, ENET1 的 PHY 地址為 0,所以“@”后面是 0(默認為 2),
第 199 行, reg 的值也表示 PHY 地址, ENET1 的 PHY 地址為 0,所以 reg=0,
第 202 行, ENET2 的 PHY 地址為 1,因此“@”后面為 1,
第 205 行,因為 ENET2 的 PHY 地址為 1,所以 reg=1,
至此, LAN8720A 的 PHY 地址就改好了,保存一下 imx6ull-alientek-emmc.dts 檔案,然后使用“make dtbs”命令重新編譯一下設備樹,

3、修改 fec_main.c 檔案

要 在 I.MX6ULL 上 使 用 LAN8720A , 需 要 修 改 一 下 Linux 內 核 源 碼 , 打 開drivers/net/ethernet/freescale/fec_main.c,找到函式 fec_probe,在 fec_probe 中加入如下代碼:

3438 static int
3439 fec_probe(struct platform_device *pdev)
3440 {
3441 	struct fec_enet_private *fep;
3442 	struct fec_platform_data *pdata;
3443 	struct net_device *ndev;
3444 	int i, irq, ret = 0;
3445 	struct resource *r;
3446 	const struct of_device_id *of_id;
3447 	static int dev_id;
3448 	struct device_node *np = pdev->dev.of_node, *phy_node;
3449 	int num_tx_qs;
3450 	int num_rx_qs;
3451
3452	 /* 設定 MX6UL_PAD_ENET1_TX_CLK 和 MX6UL_PAD_ENET2_TX_CLK
3453	 * 這兩個 IO 的復用暫存器的 SION 位為 1,
3454 	*/
3455	 void __iomem *IMX6U_ENET1_TX_CLK;
3456 	void __iomem *IMX6U_ENET2_TX_CLK;
3457
3458	 IMX6U_ENET1_TX_CLK = ioremap(0X020E00DC, 4);
3459	 writel(0X14, IMX6U_ENET1_TX_CLK);
3460
3461	 IMX6U_ENET2_TX_CLK = ioremap(0X020E00FC, 4);
3462	 writel(0X14, IMX6U_ENET2_TX_CLK);
3463
......
3656	 return ret;
3657 }

第 3455~3462 就是新加入的代碼,如果要在 I.MX6ULL 上使用 LAN8720A 就需要設定ENET1 和 ENET2 的 TX_CLK 引腳復位暫存器的 SION 位為 1,

4、配置 Linux 內核,使能 LAN8720 驅動

輸入命令“make menuconfig”,打開圖形化配置界面,選擇使能 LAN8720A 的驅動,路徑如下:

-> Device Drivers
	-> Network device support
		-> PHY Device support and infrastructure
			-> Drivers for SMSC PHYs

在這里插入圖片描述
圖中選擇將“Drivers for SMSC PHYs”編譯到 Linux 內核中,因此“<>”里面變為了“*”, LAN8720A 是 SMSC 公司出品的,因此勾選這個以后就會編譯 LAN8720 驅動,配置好以后退出配置界面,然后重新編譯一下 Linux 內核,

5、修改 smsc.c 檔案

在修改 smsc.c 檔案之前先說點題外話,那就是我是怎么確定要修改 smsc.c 這個檔案的,在寫本書之前我并沒有修改過 smsc.c 這個檔案,都是使能 LAN8720A 驅動以后就直接使用,但是我在測驗 NFS 掛載檔案系統的時候發現檔案系統掛載成功率很低!老是提示 NFS 服務器找不到,三四次就有一次掛載失敗!很折磨人, NFS 掛載就是通過網路來掛載檔案系統,這樣做的好處就是方便我們后續除錯 Linux 驅動,既然老是掛載失敗那么可以肯定的是網路驅動有問題,網路驅動分兩部分:內部 MAC+外部 PHY,內部 MAC 驅動是由 NXP 提供的,一般不會出問題,否則的話用戶早就給 NXP 反饋了,而且我用 NXP 官方的開發板測驗網路是一直正常的,但是 NXP 官方的開發板所使用的 PHY 芯片為 KSZ8081,所以只有可能是外部 PHY,也就是LAN8720A 的驅動可能出問題了,鑒于 LAN8720A 有“前車之鑒”,那就是在 uboot 中需要對LAN8720A 進行一次軟復位,要設定 LAN8720A 的 BMCR(暫存器地址為 0)暫存器 bit15 為 1,所以我猜測,在 Linux 中也需要對 LAN8720A 進行一次軟復位,
首先需要找到 LAN8720A 的驅動檔案, LAN8720A 的驅動檔案是 drivers/net/phy/smsc.c,在此檔案中有個叫做 smsc_phy_reset 的函式,看名字都知道這是 SMSC PHY 的復位函式,因此, LAN8720A 肯定也會使用到這個復位函式, 修改此函式的內容,修改以后的 smsc_phy_reset函式內容如下所示:

6、網路驅動測驗

修改好設備樹和 Linux 內核以后重新編譯一下,得到新的 zImage 鏡像檔案和 imx6ullalientek-emmc.dtb 設備樹檔案,使用網線將 I.MX6U-ALPHA 開發板的兩個網口與路由器或者電腦連接起來,最后使用新的檔案啟動 Linux 內核,啟動以后使用“ifconfig”命令查看一下當前活動的網卡有哪些,結果如圖 37.4.3.2 所示:
在這里插入圖片描述
從圖 37.4.3.2 可以看出,當前沒有活動的網卡,輸入命令“ifconfig -a”來查看一下開發板中存在的所有網卡,結果如圖 37.4.3.3 所示:

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

標籤:其他

上一篇:JVM學習之-運行時資料區(Runtime data area)

下一篇:【Java】Tomcat服務器運行不了的各種解決辦法

標籤雲
其他(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)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more