ARM中的預取命令pld的使用

2021-01-06 電子產品世界

Kernel version:2.6.14

CPU architecture:ARM920T

本文引用地址:http://www.eepw.com.cn/article/201611/320011.htm

最近在分析ARM Linux的copy_from_user,主要功能由__arch_copy_from_user實現,該函數定義在linux/arch/arm/lib/uaccess.S文件中,使用彙編實現,部分源碼如下:

[plain]view plaincopy

print?

ENTRY(__arch_copy_from_user)stmfdsp!,{r0,r2,r4-r7,lr}cmpr2,#4blt.cfu_not_enoughPLD(pld[r1,#0])//因為後面要用到r0和r1,所有進行預讀取,加速存儲器的訪問PLD(pld[r0,#0])andsip,r0,#3bne.cfu_dest_not_aligned.cfu_dest_aligned:andsip,r1,#3bne.cfu_src_not_aligned...
這段代碼中用到了預讀取指令pld(preload),大寫的PLD是一個宏,其定義如下(linux/include/asm-arm/assembler.h):

[plain]view plaincopy

print?

#if__LINUX_ARM_ARCH__>=5#definePLD(code...)code#else#definePLD(code...)#endif
pld,即預讀取指令,pld指令只在armv5以上版本有效。使用pld指令可以提示ARM預先把cache line填充好。pld指令中的offset很有講究。一般為64-byte的倍數。
功能:cache預讀取(PLD,PreLoad),使用pld指示存儲系統從後面幾條指令所指定的存儲器地址讀取,存儲系統可使用這種方法加速以後的存儲器訪問。
格式:pld[Rn,{offset}]
其中:
Rn 存儲器的基址寄存器。Offset 加在Rn上的偏移量。

相關焦點

  • arm-linux-gcc的安裝
    在X86電腦上開發的程序要在ARM系統上運行就必須使用交叉工具鏈arm-linux-gcc,linux系統上是沒有這個工具鏈的,為此必須自己下載安裝,安裝步驟為
  • 在Cortex-A8平臺下memcpy ARM/NEON彙編性能的測試
    此外,這個測試程序運行在openembedded-gpe軟體系統中。QualComm / Samsung硬體平臺只提供Android軟體系統,要更換到GPE系統有些麻煩,則採用chroot方式進行測試。不論是哪種軟體平臺,都是進入到圖形系統後,靜置,等待黑屏,然後再進行測試。下表是運行環境的統計。
  • Ubuntu12.10 使用JLink連接開發板用arm-gdb調試ARM程序
    Part1 環境搭建和工具安裝1.1 設置交叉編譯環境安裝相關的編譯工具:sudo apt-get install  build-essential gcc-arm-linux-gnueabi這裡我使用的是ubuntu系統源中含有的gcc-arm-linux-gnueabi系列工具
  • CAD計算器如何使用?
    以前發過關於介紹在繪圖中使用計算器的文章通過捕捉無法直接定位怎麼辦?教你用計算器來定位點,其實計算器的應用還有更多,這裡再為大家總結一下。 一、在CAD繪圖中如何利用計算器 CAD當前版本提供了兩種計算器。
  • 玄鐵910與ARM_arm彙編 - CSDN
    於是到淘寶上買了塊三星s3c2440(arm 9)開發板,學起內核開發。沒有過多久,機緣巧合,正式加入了公司的內核開發部。就這樣跟內核和arm打上交道了。 沒有想到這一做就是3年了,arm晶片只有在公司才能使用,回到家裡就不能訪問了。去年(2014)開始覺得做內核久了,應該向內核社區提交patch,提升知名度和影響力。
  • 如何在Linux系統中手動安裝arm-linux-gcc交叉編譯工具
    嵌入式開發少不了arm開發平臺。要編譯出能在arm平臺上運行的程序,必須使用交叉編譯工具arm-linux-gcc、arm-linux-ld、arm-linux-objcopy、arm-linux-objdump等。arm-linux-gcc是幹什麼的?gcc是linux系統下面用來將代碼編譯成一個可執行程序的手段。
  • Arm Linux 內核生成過程
    將上面的vmlinux去除調試信息、注釋、符號表等內容,生成arch/arm/boot/Image,這是不帶多餘信息的linux內核,Image的大小約3.2MB;命令:arm-linux-gnu-objcopy -O binary -R .note -R .comment -S vmlinux arch/arm/boot/Image3.
  • 淺析gcc、arm-linux-gcc和arm-elf-gcc的關係
    GCC 中的一般工具通常都是通過在命令行上調用命令(如 gcc)來執行的。在使用交叉編譯的情況下,這些工具將根據它編譯的目標而命名。例如,要使用交叉工具鏈為 ARM 機器編譯簡單的 Hello World 程序,你可以運行如下所示的命令:使用如下命令編譯並測試這個代碼:arm-linux-gcc -o hello hello.c。
  • M1 Mac使用原生Go與開發環境
    當然Mac上還需要安裝一些工具鏈:當然如果MacOS在升級更新後會出現其它問題比如:xcrun: error: invalid active developerpath, missing xcrun我們同樣使用下面命令可以解決:xcode-select sudo xcode-select -switch /
  • openocd 命令行燒寫ARM裸機程序 problems and solutions
    為了便於學習Linux,使用Openocd會是個不錯的選擇,可以學習gnu 彙編,Makefile編寫,工具鏈命令行使用。 如果這些命令搞熟悉了,你還可以利用Qt 來做個自己的圖形化界面燒寫調試工具。
  • ARM-LINUX-GCC設置環境變量
    在/etc/profile裡添加arm-linux-gcc的存放路徑具體是在命令行輸入#sudo gedit /etc/profile回車export PATH=$PATH:/你的arm-linux-gcc存放的路徑
  • ARM在嵌入式linux內核裁剪與移植的應用
    其中,binutils主要用於生成一些輔助工具;gcc則用來生成交叉編譯器,主要生成arm-linux-gcc交叉編譯工具;glibc主要是提供用戶程序所使用的一些基本的函數庫。自行搭建交叉編譯環境通常比較複雜,而且很容易出錯。
  • ARM Linux根文件系統Root Filesystem的製作
    如果沒有「proc文件系統」,很多Shell自己的命令就沒有辦法運行,比如ifconfig。「proc文件系統」不像devfs可以自動掛載,它需要使用初始化腳本掛載。另外,udev也需要「proc文件系統」的支持。/sys用於掛載「sysfs文件系統」,「sysfs文件系統」在內核裡面可以選。目前我認為它就是給udev提供支持的,。「sysfs文件系統」也需要使用初始化腳本掛載。
  • Ubuntu 16.04 LTS-嵌入式交叉編譯環境arm-linux-gcc搭建過程圖解
    例如,arm-linux-表示是對arm的交叉編譯工具鏈;arm-linux-gcc表示是使用gcc的編譯器。除了體系結構相關的編譯選項以外,其使用方法與Linux主機上的gcc相同,所以Linux編程技術對於嵌入式同樣適用。不過,並不是任何一個版本拿來都能用,各種軟體包往往存在版本匹配問題。
  • arm-linux連接以及連接腳本
    前言:arm linux的連接工具可以使用arm-linux-ld,在進行連接時可以使用-T命令採用腳本控制,如不指明腳本,則使用默認的腳本文件,參見arm-linux-ld的預設linker script。
  • python爬蟲29 | 使用scrapy爬取糗事百科
    是時候給你說說爬蟲框架了使用框架來爬取數據會節省我們更多時間很快就能抓取到我們想要抓取的內容好了現在假設你已經安裝好了 scrapy 這個框架那麼接下來小帥b會帶你使用它來爬取一下糗事百科 的段子主要讓你知道 scrapy 的使用以及體驗它的牛逼之處廢話不多說在你想要存放的爬蟲文件目錄下使用命令來創建一個
  • Arm linux內核構建關於.config的問題
    我們這裡使用arch/arm/configs/xxx_defconfig默認的配置文件。使用如下命令。make ARCH=arm xxx_defconfig然後使用make menuconfig 這裡可以根據需要更改配置。
  • Arm Linux Kernel 構建 情景分析
    命令:# CROSS_COMPILE 的值根據自己情況設定make ARCH=arm CROSS_COMPILE=arm-linux-androideabi-這條命令做了什麼呢,把 make 輸出到控制臺的信息貼出來(省略中間相似的信息):make ARCH=arm CROSS_COMPILE
  • 建立ARM平臺上的交叉調試器gdb和gdbserver
    其中:host指定了運行環境為i386機器,target指定了需要調試的目標機環境(我使用的ARM toolchain是armv5-linux-uclibc-gcc,因此這樣指定,如果是用arm-linux-gcc,則 --target=arm-linux),prefix指定了編譯後的結果存放的位置,也就是安裝目錄。
  • 快速上手系列-C語言之預編譯命令、宏定義及條件編譯
    上一篇寫了C語言中變量的存儲類別,提到普通局部變量、普通全局變量和靜態局部變量及靜態全局變量,這裡簡單了解一下C語言的預編譯命令、宏定義和條件編譯。預編譯命令(預編譯處理--->編譯---->彙編--->連接)1、預處理:預處理是C語言的一個重要功能,如文件包含、常量定義都屬於預處理命令,C語言提供的預處理功能主要有以下三種:1)文件包含 #include2)宏定義 #define3)條件編譯 #if #endif4)防止頭文件重複包含2、文件包含處理