arm系統移植

目錄

    • 1. 流程
    • 2. 概念
      • 2.1 設備樹
      • 2.2 根文件系統
      • 2.3 文件說明
    • 3. 交叉編譯鏈
      • 3.1 作用
      • 3.2 在linux下配置
    • 4. tftp
      • 4.1 作用
      • 4.2 安裝過程
    • 5. nfs
      • 5.1 作用
      • 5.2 安裝過程
    • 6. 配置開發板
    • 7. linux下的uboot鏡像燒寫到SD卡中
      • 7.1 生成uboot二進制文件,二進制文件就是裸機程序。
      • 7.2 合成最終的uboot
      • 7.3 通過dd命令把u-boot-iTOP-4412.bin燒寫到SD卡中
    • 8. 制作linux根文件系統
      • 8.1 busybox
      • 8.2 需要配置的軟件環境
      • 8.3 配置busybox選項并編譯
      • 8.4 制作根文件系統

1. 流程

在SD卡內燒寫uboot,然后設置開發板,通過tftp把uimage和exynos.dtb下載到開發板,通過nfs掛載根文件系統。即可以在開發板上先啟動uboot,然后在模擬linux環境。或者可以自由制作uboot和rootfs根文件系統。

2. 概念

2.1 設備樹

Linux內核從3.x開始引入設備樹的概念,用于實現驅動代碼與設備信息相分離。在設備樹出現以前,所有關于設備的具體信息都要寫在驅動里,一旦外圍設備變化,驅動代碼就要重寫。引入了設備樹之后,驅動代碼只負責處理驅動的邏輯,而關于設備的具體信息存放到設備樹文件中,這樣,如果只是硬件接口信息的變化而沒有驅動邏輯的變化,驅動開發者只需要修改設備樹文件信息,不需要改寫驅動代碼。比如在ARM Linux內,一個.dts(device tree source)文件對應一個ARM的machine,一般放置在內核的"arch/arm/boot/dts/“目錄內,比如exynos4412參考板的板級設備樹文件就是"arch/arm/boot/dts/exynos4412-origen.dts”。這個文件可以通過$make dtbs命令編譯成二進制的.dtb文件供內核驅動使用。

2.2 根文件系統

根文件系統(root filesystem)是運行Linux系統所必須的各種工具軟件、庫文件、腳本、配置文件的一種特殊的文件目錄結構。Linux內核要啟動后要掛載一個文件系統才能運行。

2.3 文件說明

1.uImage : 編譯好的Linux內核文件,它是專門給u-boot提供的,u-boot是用來引導linux的一個系統。

2.exynos4412-itop-elite.dtb:編譯好的設備樹文件,設備樹中描述了硬件信息,如LED信息,網卡信息DM9606等等。

3.rootfs.tar.gz : 這是文件系統,Linux內核要運行必須掛載一個文件系統。

3. 交叉編譯鏈

3.1 作用

ubuntu為x86環境,交叉編譯鏈的作用是在x86的環境下模擬通過arm編譯。

3.2 在linux下配置

  1. gcc-arm-8.3.tar.gz 放到 /opt目錄下
sudo mv gcc-arm-8.3.tar.gz /opt
  1. 解壓
sudo tar zxvf gcc-arm-8.3.tar.gz
  1. 解壓后在 /opt 目錄下會出現
    gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf
  2. 編輯環境變量加載文件
sudo vim /etc/profile#在文件尾部添加下面兩行
export ARM_PATH=/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin
export PATH=${PATH}:${ARM_PATH}
  1. 使 /etc/profile 生效: 在控制終端運行 source /etc/profile
  2. 測試交叉編譯工具鏈有沒有安裝成功
在控制終端 輸入 arm-linux-gnueabihf-gcc -v

7.若以上方法無法找到arm-linux-gnueabihf-gcc命令(可選)
vim ~/.bashrc .bashrc文件是在你的用戶根目錄下,即在/home/<用戶名>目錄下
在.bashrc末尾添加

export ARM_PATH=/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin
export PATH=${PATH}:${ARM_PATH}

4. tftp

4.1 作用

(在這里的作用)把uimage和exynos.dtb下載到開發板

4.2 安裝過程

1.安裝tftp服務器及客戶端

sudo apt-get install tftpd-hpa tftp-hpa

2.在 /home/[用戶名]/路徑下創建一個文件夾: tftpboot

mkdir ~/tftpboot

3.修改tftp的配置文件

sudo vi /etc/default/tftpd-hpaTFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/[用戶名]/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-c -s -l"  

4.重啟tftp服務器

sudo systemctl restart tftpd-hpa.service

5.啟動成功
在這里插入圖片描述
6.上傳/下載文件測試
<1>上傳文件到tftp服務器
在任意一個目錄新建一個文件a.txt,并向其中寫入任意內容,然后執行下面的命令

tftp 127.0.0.1
tftp> put a.txttftp配置文件 sudo vi /etc/default/tftpd-hpa 中的OPTIONS里要加上-c,才能新建文件
修改 /home/[用戶名]/tftpboot  文件夾權限為777

<2>開發板測試tftp服務器功能
從開發板上傳文件到tftp服務器目錄 :

tftp 192.168.101.242 -p -l new_file.txt

從tftp服務器目錄下載文件到開發板 :

tftp 192.168.101.242 -g -r a.txt

測試從tftp服務器下載文件:

tftp 127.0.0.1
tftp> get a.txt 

將uImage 和 exynos4412-itop-elite.dtb放在tftp服務器的配置目錄下,如tftpboot目錄下。

5. nfs

5.1 作用

在linux運行起來后,掛載根文件系統。linux內核在運行時支持通過網絡掛載另一網絡地址上的文件系統。將pc機上的目錄共享給開發板使用,提高開發效率。

5.2 安裝過程

1.在/home/[用戶名]/目錄下創建一個文件夾nfs,將根文件系統的壓縮包rootfs.tar.gz拷貝至/home/[用戶名]/nfs目錄下,然后解壓。解壓后生成一個目錄rootfs,然后修改rootfs權限。

mkdir ~/nfs
cp rootfs.tar.gz ~/nfs
cd nfs
tar -zxvf rootfs.tar.gz
chmod 777 rootfs

2.重新安裝nfs服務器

sudo apt-get install nfs-kernel-server

3.配置NFS服務器

sudo vim /etc/exports在最末尾添加:
/home/[用戶名]/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)
選項可以參考 man 5 exports (/etc/exports注釋中提示的)

4.重啟NFS服務器

sudo service nfs-kernel-server restart 

5.查看狀態

$ sudo systemctl status nfs-kernel-server.service

6.進行掛載測試

sudo mkdir /mnt/root_nfs 
sudo mount -t nfs localhost:/home/[用戶名]/nfs/rootfs /mnt/root_nfs
ls -l /mnt/root_nfs 

7.卸載對rootfs的掛載(可選)

sudo umount /mnt/root_nfs

6. 配置開發板

1.設置開發板的IP地址,開發板通過USB轉串口連接到電腦,通過SecureCRT打開串口,輸入以下命令:

 setenv ipaddr 192.168.xx.xx

2.設置服務器的IP地址,就是虛擬機的地址

setenv serverip 192.168.xx.xx

3.設置網關ip

setenv gatewayip 192.168.101.1

4.設置網絡掩碼

setenv netmask 255.255.255.0

5.設置開發板啟動linux啟動的環境變量,設置從nfs掛載根文件系統

setenv bootargs root=/dev/nfs nfsroot=192.168.107.10:/home/[用戶名]/nfs/rootfs,proto=tcp,nfsvers=3 rw console=ttySAC2,115200n8 init=/linuxrc ip=192.168.107.100:192.168.107.10:192.168.107.1:255.255.255.0::eth0:o
//bootargs 中的ip參數解釋
//bootargs參數由linux內核運行到最后掛載根文件系統時使用
root=/dev/nfs	//使用的網絡文件系統
nfsroot=192.168.x.x   //為虛擬機服務器的ip
nfsroot=192.168.107.10:/home/wyl/nfs/rootfs	//其中/home/wyl/nfs/rootfs 是Ubuntu上rootfs的真實路徑
ip=192.168.x.x:192.168.x.x:192.168.x.1 //第一個ip為開發的ip,第二個是虛擬機的ip, 第三個是網關

6.下載kernel到內存

tftpboot 40008000 uImage
tftpboot 42000000 exynos4412-itop-elite.dtb 

7.手動啟動

bootm 40008000 - 42000000 

8.如果上面的測試通過的話,可以把2,3中的命令寫到bootcmd環境變量中,以后重啟就是自動執行

setenv bootcmd tftpboot 40008000 uImage\;tftpboot 42000000 exynos4412-itop-elite.dtb\;bootm 40008000 - 42000000
1. 切換到 u-boot 運行環境下,設置以下環境變量
setenv bootcmd tftpboot 40008000 uImage\;tftpboot 42000000 exynos4412-itop-elite.dtb\;bootm 40008000 - 42000000
再用 saveenv 命令保存u-boot下的環境變量,重啟開發板,u-boot倒計時結束 后會自動啟動linux

9.保存

saveenv

10.若開發板掛載根文件系統太慢,則可以在Ubuntu上 用ping命令,去ping開發板的IP地址。

7. linux下的uboot鏡像燒寫到SD卡中

7.1 生成uboot二進制文件,二進制文件就是裸機程序。

運行 uboot源碼目錄(uboot_itop4412_2017.11.tar.gz 或 jason412_uboot-2017.11)mkboot子目錄下的腳本程序 build.sh,在uboot/mkboot目錄下輸入 ./build.sh 進行 uboot源碼的編譯,編譯完成后,會生成兩個文件,一個是itop4412-spl.bin,一個是u-boot.bin。

uboot的源碼目錄是指:jason412_uboot-2017.11目錄
itop4412-spl.bin是在 uboot/spl目錄下
u-boot.bin是在 uboot目錄下

腳本程序build.sh會將itop4412-spl.bin文件和u-boot.bin拷貝到 uboot/mkboot目錄下。

7.2 合成最終的uboot

通過命令 cat E4412_N.bl1.bin itop4412-spl.bin env.bin u-boot.bin > u-boot-iTOP-4412.bin

E4412_N.bl1.bin:三星提供的二進制文件。
itop4412-spl.bin :u-boot編譯生成的。
env.bin :保存的環境變量。
u-boot.bin:編譯uboot生成的。

通過命令cat E4412_N.bl1.bin itop4412-spl.bin env.bin u-boot.bin > u-boot-iTOP-4412.bin把三個二進制文件合成為一個最終的 u-boot-iTOP-4412.bin

7.3 通過dd命令把u-boot-iTOP-4412.bin燒寫到SD卡中

sudo dd iflag=dsync oflag=dsync if=u-boot-iTOP-4412.bin of=/dev/sdb seek=1

解析:
sudo是超級用戶權限
dd 是linux 的命令;
dsync 讀寫數據采用同步IO;所謂同步就是寫入或讀取磁盤會花費時間,同步就是等待讀/寫結束,阻塞式等待。
iflag=dsync 使用iflag來控制讀取數據時的行為特征。
oflag=dsync 使用oflag來控制寫入數據時的行為特征。
if: 輸入的文件
of:輸出到哪個設備文件(磁盤文件),of=/dev/sdb 其中的 /dev/sdb就代表SD卡

因此意思是:使用超級用戶權限把u-boot-iTOP-4412.bin寫入到磁盤sdb上,跳過該設備的第一個塊(block)(每個block的大小為512B)

塊(block):舉例說明,內存是以字節為單位來訪問的,塊設備,如磁盤(flash,SD卡,emmc)是按照塊大小為單位來訪問的。塊的大小可以理解 為內存中的一個存儲單元。

磁盤設備的第一個塊,存儲有磁盤的一些重要信息,一定不能用dd命令去寫。

8. 制作linux根文件系統

8.1 busybox

BusyBox 是一個輕量級的開源工具箱,官網地址是:http://www.busybox.net/,其中包含了許多標準的 Unix 工具,例如 sh、ls、cp、sed、awk、grep 等,同時它也支持大多數關鍵的系統功能,例如自啟動、進程管理、啟動腳本等等。

8.2 需要配置的軟件環境

  • 安裝arm交叉編譯工具鏈 8.3.0
  • 在ubuntu中安裝libncurses5-dev sudo apt install libncurses5-dev

8.3 配置busybox選項并編譯

  1. 解壓buxybox壓縮包
tar -jxvf busybox-1.36.1.tar.bz2 //解壓buxybox壓縮包
cd busybox-1.36.1 //會在當前目錄下解壓為一個文件夾,進入
  1. 配置編譯選項
make menuconfig ARCH=arm //彈出圖形化界面

一般配置三個選項:

a)編譯器前綴
Settings ---->(arm-linux-gnueabihf-) Cross compiler prefix //添加交叉編譯鏈arm-linux-gnueabihf-b)編譯靜態庫
Settings ---->[*] Build static binary (no shared libs) c)安裝目錄
Settings ---->[*] ( ./_install) Destination path for 'make install'     //./install為rootfs安裝的目錄路徑d)保存后退出
  1. 編譯
make ARCH=arm CROSS_COMPILE=arm-linux-guneabihf-

在 busybox-1.36.1目錄下會生成一個busybox可執行文件。運行file busybox,如下:
$ file busybox 確認編譯生成的是 ARM 平臺的(顯示為ELF 32-bit LSB executable, ARM)

  1. 安裝
make install
  1. 做了什么
    至此通過busybox編譯安裝了根文件目錄_install,即rootfs,現在要做的是將根文件目錄放到nfs下

8.4 制作根文件系統

  1. 進入busybox install后的安裝目錄并創建所需目錄
cd _install
mkdir dev etc mnt  proc var tmp sys root lib
  1. 將工具鏈中的庫拷貝到_install/lib 目錄下
cd lib#從編譯工具鏈中拷貝運行庫到剛制作的根據文件系統的lib下
sudo cp -Parf /opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/arm-linux-gnueabihf/lib/*  ./
sudo cp -Parf /opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib/*  ./
  1. 刪除靜態庫和共享庫(動態庫)文件中的符號表以減小體積
#在 lib 目錄下,刪除掉靜態庫
rm *.a#裁剪掉調試信息 
arm-linux-gnueabihf-strip ./*
  1. 查看lib目錄大小
du -mh lib/

應該是7.0MB的大小左右

  1. 添加系統啟動文件
cp -rf ~/nfs/rootfs/etc .

拷入成熟的參考配置,將linux內核能成功掛載的rootfs目錄下的etc文件夾拷貝到新制作的rootfs目錄下面。
a) 在etc下添加文件inittab,文件內容如下:

#this is run first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS
# /bin/sh invocations on selected ttys
# Start an "askfirst" shell on the console (whatever that may be)
::respawn:-/bin/sh
# Stuff to do when restarting the init process
::restart:/sbin/init
# Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot 

b) 在etc目錄下創建init.d子目錄,并在etc/init.d目錄下添加rcS文件:

#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s
mount -o remount,rw /

c) 更改rcS的權限

chmod a+x _install/etc/init.d/rcS

d) 修改以可讀可寫方式掛載文件系統Readonly file system

vim  rootfs/etc/init.d/rcS

e) 在文件末尾添加以下內容

mount -o remount,rw /

f) 在etc下添加文件fstab,文件內容如下

#device     mount-point      type       options         dump     fsck order
proc	       /proc                proc       defaults             0               0
tmpfs        /tmp             tmpfs      defaults         0           0
sysfs          /sys              sysfs       defaults         0           0
tmpfs       /dev             tmpfs      defaults          0           0
  1. 支持掛載proc, sysfs, tmpfs文件的內核配置

這里我們掛載的文件系統有三個proc、sysfs和tmpfs。在內核中proc和sysfs默認都支持,而tmpfs是沒有支持的,我們需要添加tmpfs的支持。
進入linux-4.14.12內核源碼根目錄,修改Linux內核配置并重新編譯:

$ make menuconfig
File systems --->Pseudo filesystems --->[*] Tmpfs virtual memory file system support (former shm fs)[*] Tmpfs POSIX Access Control Lists

在Linux內核源碼根目錄下,重新編譯內核

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x40008000 uImage
  1. 在rootfs目錄下的etc目錄下添加profile文件,文件內容為
#!/bin/sh
export HOSTNAME=i4412
export USER=root
export HOME=root
export PS1="[$USER@$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH  LD_LIBRARY_PATH

重要:新制作的文件系統尺寸若超出8M,刪除不需要的庫文件
9. 創建設備文件

在根文件系統的根目錄執行以下命令

#在根文件系統的dev目錄一創建一個console設備文件
sudo mknod dev/console c 5 1#在根文件系統的dev目錄一創建一個null設備文件
sudo mknod dev/null c 1 3
  1. 測試:看新的根文件系統能否正常掛載到開發板
#把原有的根文件系統備份一下
linux@linux:~/busybox-1.22.1  $ mv  ~/nfs/rootfs /nfs/rootfs.ok把新的根文件系統拷貝過去(改名rootfs)
linux@linux:~/busybox-1.22.1$ sudo cp -arf _install  ~/nfs/rootfs
  1. 掛載成功

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87396.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87396.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87396.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

量子算法入門——5.Qiskit庫介紹與簡單應用(2)

參考資料&#xff1a; 【【零基礎入門量子計算】】 來自b站up&#xff1a;溴銻銻躍遷 建議關注他的更多高質量文章&#xff1a;CSDN&#xff1a;【溴銻銻躍遷】 &#xff08;實際上只帶一點點原創&#xff0c;絕大部分資料來自這位大佬&#xff09; 跟著視頻我手打了一遍notebo…

前端如何優雅地實現一個“請求隊列”,避免服務器被卡死?

有這樣一些場景&#xff1a; 頁面一加載&#xff0c;需要同時發 10 個請求&#xff0c;結果頁面卡住&#xff0c;服務器也快崩了。用戶可以批量操作&#xff0c;一次點擊觸發了幾十個上傳文件的請求&#xff0c;瀏覽器直接轉圈圈。 當后端處理不過來時&#xff0c;前端一股腦…

SSL/TLS協議信息泄露漏洞(CVE-2016-2183)、SSL/TLS RC4 信息泄露漏洞(CVE-2013-2566)修復方法

目錄 一、問題原因二、整改步驟 一、問題原因 通過綠盟漏洞檢測工具掃描發現Windows系統存在SSL/TLS協議信息泄露漏洞(CVE-2016-2183)、SSL/TLS RC4 信息泄露漏洞(CVE-2013-2566)、SSL/TLS 受誡禮(BAR-MITZVAH)攻擊漏洞(CVE-2015-2808)。 二、整改步驟 使用gpedit.msc進入組…

MinHook 如何對 .NET 母體 CoreCLR 進行攔截

一&#xff1a;背景 1. 講故事 這篇文章起源于和一家 .NET公司 開線上會議時&#xff0c;提出的一個場景問題&#xff0c;程序出現了非托管內存暴漲&#xff0c;這些非托管內存關聯的對象都囤積在 終結器隊列 中&#xff0c;很顯然這是代碼中沒用 using 及時釋放引發的&#…

DPI深度檢索原理和架構

大家讀完覺得有幫助記得關注和點贊&#xff01;&#xff01;&#xff01; DPI&#xff08;深度包檢測&#xff09;技術通過**透視網絡載荷內容**實現精細化流量管控與威脅檢測&#xff0c;其核心在于突破傳統防火墻僅檢查IP/端口等表層信息的局限&#xff0c;對**應用層數據**進…

QT Creator的返回到上一步、下一步的快捷鍵是什么?

在 Qt Creator 中&#xff0c;用于導航的 返回上一步 (Back) 和 前進下一步 (Forward) 的快捷鍵如下&#xff1a; 默認快捷鍵&#xff1a; 功能Windows/LinuxmacOS返回上一步Alt ←Command [前進下一步Alt →Command ]

UI前端大數據處理策略優化:基于云計算的數據存儲與計算

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 一、引言&#xff1a;大數據時代前端處理的挑戰與云計算破局 在數字化轉型的浪潮中&#xff…

機器學習基礎 多層感知機

機器學習基礎 多層感知機 文章目錄 機器學習基礎 多層感知機1. 多層感知機1.1 線性模型的失效1.2 感知機1.3 感知機的收斂定理1.4 從線性到非線性1.5 多層感知機的定義和實現 參考 1. 多層感知機 1.1 線性模型的失效 ? 在李沐《動手學深度學習》中有這樣的描述&#xff1a; …

關于安裝Ollama大語言模型本地部署工具

一、Ollama 安裝方法概述 Ollama 是一個開源的大型語言模型(LLM)本地部署工具&#xff0c;支持在 Windows、macOS 和 Linux 系統上運行。它簡化了在本地計算機上運行和管理大語言模型的流程&#xff0c;讓開發者能夠輕松部署各種開源模型。 Windows 系統安裝步驟 訪問 Ollam…

html配置rem實現頁面自適應

1.在js文件使用&#xff0c;建議放到全局js中 // 全局js文件 $(function () {// 設置根目錄字體大小var baseSize 16; // 設計稿的基準字體大小&#xff0c;通常是16pxvar baseWidth 750; // 設計稿的基準寬度&#xff0c;通常是750pxfunction adjustFontSize() {const widt…

POI實現文檔的圖片的提取和替換

1. 簡介 在日常辦公自動化開發中&#xff0c;常常需要對 Word 文檔中的圖片進行批量提取、保存&#xff0c;甚至將圖片替換為自定義的文本或鏈接。Apache POI 是一款強大的 Java 開源庫&#xff0c;支持對 Microsoft Office 文檔&#xff08;包括 Word、Excel、PowerPoint 等&…

毫米波雷達 – 深度學習

目錄 數據表示 公開數據庫 未來發展方向 稀疏點云 + 深度學習 直接處理點云 (1/2) 候選生成+特征提取+候選分類(DL* ) 候選生成+特征提取+候選分類(DL) 直接處理點云 (2/2) 候選生成+特征提取(DL)+候選分類(DL) 網格數據+端對端檢測(DL) 稠密數據塊 + 深度學習 直接…

Redis——常用指令匯總指南(一)

目錄 1.set & get ①set指令 ②get指令 2.keys 3.del 4.expire & setex & psetex 5.ttl 6.exists 7.setnx 8.flushall 9.object encoding 10. type 1.set & get set & get指令中key和value都是字符串&#xff0c;但是不需要加單引號或雙引號。 …

PDF處理控件Aspose.PDF教程:在 Java 中刪除 PDF 頁面

您是否需要使用 Java 從PDF文檔中刪除特定頁面&#xff1f;無論您是要清理空白頁、刪除機密部分&#xff0c;還是僅僅在分發前調整內容&#xff0c;以編程方式操作 PDF 頁面的能力都將大有裨益。本指南將向您展示如何借助Aspose.PDF僅用幾行代碼刪除不需要的頁面。讓我們深入了…

RediSearch 字段類型與配置選項

1. 數值字段&#xff08;NUMERIC&#xff09; 用途&#xff1a;存儲整數或浮點數&#xff0c;可進行范圍查詢與排序。 選項&#xff1a; SORTABLE&#xff1a;允許用 SORTBY 排序NOINDEX&#xff1a;不參與索引&#xff0c;僅供返回 定義語法 FT.CREATE idx ON HASH PREFIX…

PHP Yii2 安裝SQL Server擴展-MAC M4 Pro芯片

MAC M4 Pro芯片版本&#xff0c;千錘百煉編譯十幾次終于成功 # 設置基礎鏡像并強制使用 x86_64 架構&#xff08;適配 M4 芯片&#xff09; FROM --platformlinux/amd64 php:8.1-fpm-alpine3.18WORKDIR /var/www/html# 可選&#xff1a;設置時區 ARG TZAsia/Shanghai ENV TZ${…

HTML初學者第二天

<1>HTML的語法規范 1.1標簽 -雙標簽&#xff1a;如 <html></html> 前面的叫開始標簽&#xff0c;后面的叫結束標簽。 -單標簽&#xff1a;如 <br /> 1.2基本語法概述 -HTML標簽是由尖括號包圍的關鍵詞&#xff0c;例如<html>。 -HTML標…

【加解密與C】HASH系列(二) SHA

SHA&#xff08;安全散列算法&#xff09;簡介 SHA&#xff08;Secure Hash Algorithm&#xff09;是由美國國家安全局&#xff08;NSA&#xff09;設計的一系列密碼散列函數&#xff0c;用于將任意長度的數據轉換為固定長度的散列值。SHA家族包括SHA-1、SHA-2&#xff08;含S…

【Python】進階 - 數據結構與算法

系列篇章&#x1f389; No.文章1【Python】基礎知識&#xff08;詳細&#xff09;&#x1f680;2【Python】基礎 - 循環、容器類型&#x1f680;3【Python】基礎 - 推導式、函數&#x1f680;4【Python】基礎 - 文件、異常、模塊&#x1f680;5【Python】進階 - 面向對象&…

【如何實現分布式壓測中間件】

分布式壓測中間件的原理及其實現 原理全鏈路追蹤框架&#xff08;Trace&#xff09;MQ中間件數據庫分布式緩存中間件&#xff08;Redis&#xff09;分庫分表中間件 原理 通過大量閱讀中間件源碼&#xff0c;開源社區調研&#xff0c;得到設計原理&#xff1a; &#xff08;1&a…