內核調試之devmem直接讀寫寄存器

今天分享一個內核調試實用工具——devmem。

相信很多做底層驅動的人都會經常用到。

什么是devmem?

在Linux系統,如果我們想要訪問某個寄存器,就需要寫一個驅動程序,在驅動中映射寄存器地址,轉為虛擬地址后就可以訪問。

但有時候,我們只是單純想知道某個寄存器的值,不想這么麻煩,怎么辦呢?

Linux早就想到這一點了,于是提供了一個工具devmem,通過devmem就可以直接讀寫寄存器,

devmem是一個命令,在shell中輸入devmem命令就可以非常方便的讀寫寄存器。

如何使用devmem?

devmem命令格式:

Usage:?devmem?ADDRESS?[WIDTH?[VALUE]]Read/write?from?physical?addressADDRESS?Address?to?act?uponWIDTH?Width?(8/16/...)VALUE?Data?to?be?written

ADDRESS:物理地址

WIDTH:位寬,32位、64位等等

VALUE:要寫入的值

例如,讀取32位寄存器0x40200000的值:

devmem?0x40200000?32

向32位寄存器0x40200000寫入0x12345678

devmem?0x40200000?32?0x12345678

可以看到,devmem的使用非常簡單,有了devmem就可以輕松訪問寄存器。

內核配置devmem

devmem命令依賴于/dev/mem設備節點,需要在Linux內核中打開/dev/mem的配置:

Device Drivers  --->Character devices  --->[*] /dev/mem virtual device support

?

Linux應用層操作寄存器

除了直接使用devmem,我們也可以在Linux應用層自己實現一個devmem。

devmem的實現原理,就是打開/dev/mem,然后通過mmap映射物理地址,從而實現讀寫寄存器。因此,我們只要實現這些操作,就可以自己實現類似devmem的功能。

例如,在Linux應用層讀取物理地址為0x40000000的值:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>#define MAP_SIZE 0x80000
#define base 0x40000000int main(int argc, char **argv)
{int fd = open("/dev/mem",O_RDWR|O_NDELAY);if (fd < 0){printf("open /dev/mem error!\n");return -1;}void *map_base = mmap(NULL,MAP_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fd,base);if (map_base == MAP_FAILED)return -1;printf("%x \n",*(volatile unsigned int*)(map_base));close(fd);munmap(map_base,MAP_SIZE);return 0;
}

總結

devmem是一個很常用的工具,主要給驅動開發人員在Linux應用層調試使用。devmem不僅僅是訪問寄存器,只要有權限訪問某個物理地址,就可以使用devmem,方便我們調試。

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

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

相關文章

windows電腦系統自帶的畫圖工具如何實現自由拼圖

1.首先選中你要拼接的第一張圖片&#xff0c;右鍵選著編輯&#xff0c;會自動打開自帶的畫圖工具 然后就是打開第一張圖片&#xff0c;如下圖所示 接著就是將畫布托大&#xff0c;如下圖所示。 然后點擊選擇&#xff0c;選擇下面的空白區域&#xff0c;選著區域的范圍要比準備拼…

05-微信小程序常用組件-表單組件

05-微信小程序常用組件-表單組件 文章目錄 表單組件button 按鈕案例代碼 form 表單案例代碼 image 圖片支持長按識別的碼案例代碼 微信小程序包含了六大組件&#xff1a; 視圖容器、 基礎內容、 導航、 表單、 互動和 導航。這些組件可以通過WXML和WXSS進行布局和樣式設…

jQuery第一次接觸

jQuery是一個輕量級js庫 1.下載jquery庫&#xff0c;網址Download jQuery | jQuery npm i jquery 2.還可以從cdn中載入jquery <script src"https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"> 3.j代表js&#xff0c;query代表查詢&#xff0c;jQu…

超實用的40道JAVA經典算法題(含答案)

作為一名Java程序員&#xff0c;想要拿到一份滿意的offer&#xff0c;就必須做好充足的準備。眾所周知&#xff0c;算法可以說是大廠面試Java程序員的必問題。好的算法可以讓性能得到萬倍提升&#xff0c;做到毫秒級處理千萬數據的程度。因此&#xff0c;算法的重要性不言而喻&…

fedora

about firewall well, I don’t know how to use fedora firewall,but it I come up with that I can use ubuntu’s ufw for blocking evil connection, download wps extremely boredness drove me to install fedora&#xff0c; It can use wps pdf&#xff0c;但我仍然…

PAT 1018 Public Bike Management

個人學習記錄&#xff0c;代碼難免不盡人意。 There is a public bike service in Hangzhou City which provides great convenience to the tourists from all over the world. One may rent a bike at any station and return it to any other stations in the city. The Pu…

【實用插件】ArcGIS for AutoCAD插件分享下載

ArcGIS包含一系列功能&#xff0c;其中ArcGIS for AutoCAD一個免費的可下載的AutoCAD插件&#xff0c;它可簡化將CAD和GIS數據整合在一起的過程提供互操作性。 ArcGIS for AutoCAD互操作性平臺將連接AutoCAD和 ArcGIS&#xff0c;以增強使用地理環境設計CAD工程圖時的用戶體驗…

Kubernetes 企業級高可用部署

目錄 1、Kubernetes高可用項目介紹 2、項目架構設計 2.1、項目主機信息 2.2、項目架構圖 2.3、項目實施思路 3、項目實施過程 3.1、系統初始化 3.2、配置部署keepalived服務 3.3、配置部署haproxy服務 3.4、配置部署Docker服務 3.5、部署kubelet kubeadm kubectl工具…

程序員你可長點心吧!代碼檢查你得用

代碼檢查的重要性不言而喻&#xff0c;很多重要的項目都要做代碼的檢查&#xff0c;及時糾正代碼中的錯誤&#xff0c;確保代碼的可讀性、可維護性和可拓展性&#xff0c;從而保證軟件的質量。 一、代碼檢查的定義 代碼檢查是指通過對程序代碼的獨立檢查來提高代碼質量和開發效…

論壇項目之用戶部分

注冊接口 實現思路 1.特殊字段檢查&#xff08;比如性別沒有給出需要給出默認值&#xff09; 2.對比檢查兩次輸入的密碼是否一致&#xff0c;不一致報錯 3.利用UUID生成隨機‘鹽’值&#xff0c;并使用密碼進行MD5加密后與‘鹽’進行拼接&#xff0c;生成加密后的密碼 4.創建U…

什么是P2P?

P2P (Peer-to-Peer) 是一種分布式的網絡架構&#xff0c;其中各個節點&#xff08;通常被稱為“peers”或“節點”&#xff09;直接進行數據共享和交換&#xff0c;而無需依賴中央服務器。P2P 網絡強調平等的參與和共享&#xff0c;每個節點既可以是數據的消費者&#xff08;下…

推進深度融合 打造智慧媒體

以下內容來自于易知微官網&#xff0c;點擊一下&#xff0c;即可進入官網了解詳情。 注意&#xff1a;案例數據均為虛擬數據 數字改革是一場波及經濟社會發展全局、涵蓋生產力到生產關系的全方位變革。在數字化時代&#xff0c;以數字改革賦能媒體深度融合已然成為時代所向、…

每日一題——連續子數組的最大和

題目 輸入一個長度為n的整型數組array&#xff0c;數組中的一個或連續多個整數組成一個子數組&#xff0c;子數組最小長度為1。求所有子數組的和的最大值。 數據范圍:1<n<2105 ?100<a[i]<100 要求:時間復雜度為 O(n)&#xff0c;空間復雜度為 O(n) 示例1 輸入…

ubuntu中安裝python

最簡單方便的是 apt 使用第三方的 ppa 源&#xff0c;然后直接 apt 安裝 python3.9 安裝 software-properties-common 獲取add-apt-repository命令&#xff1a;apt install -y software-properties-common添加第三方的 ppa 源&#xff1a;add-apt-repository ppa:deadsnakes/p…

Spring系列篇--關于Spring Bean完整的生命周期【附有流程圖,超級易懂】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下來看看由輝輝所寫的關于Spring的相關操作吧 目錄 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Spring Bean是單例模式還是多例模式 二…

Kafka如何保證消息?定能被消費

Kafka 通過多種機制來保證消息一定能被消費&#xff0c;從而實現數據的可靠性和持久性。 以下是一些常見的方法和策略來提高消息的可靠性&#xff1a; 復制機制&#xff1a; Kafka 使用了分區和副本的概念。每個分區可以有多個副本&#xff0c;分布在不同的 Broker 上。當消息…

k8s 自身原理 3

前面有分享到 master 主節點上的 四個組件&#xff0c;etcd&#xff0c;ApiServer&#xff0c;scheduler&#xff0c;controller manager 接下來我們分享一波 woker 節點上的組件&#xff0c;xdm 還記得 worker 節點上都有什么嗎&#xff1f; kubeletkube-proxy實際的服務對應…

【數據結構】棧和隊列常見題目

文章目錄 有效的括號用隊列實現棧兩個隊列實現棧一個隊列實現棧用棧實現隊列設計循環隊列最小棧棧的壓入&彈出序列逆波蘭表達式隊列:先進先出 棧:后進先出 有效的括號 https://leetcode.cn/problems/valid-parentheses/ class Solution {public:bool isValid(string s) {…

如何讓多線程步調一致?

前幾天老板突然匆匆忙忙的過來說對賬系統最近越來越慢了&#xff0c;能不能快速優化一下&#xff1f;我了解了對賬系統的業務后&#xff0c;發現還是挺簡單的&#xff0c;用戶通過在線商城下單&#xff0c;會生成電子訂單&#xff0c;保存在訂單庫。之后物流會生成派送單給用戶…

Redis - 數據類型映射底層結構

簡介 從數據類型上體現就是&#xff0c;同一個數據類型&#xff0c;在不同的情況下會使用不同的編碼類型&#xff0c;底層所使用的的數據結構也不相同。 字符串對象 字符串對象的編碼可以是 int、raw 和 embstr 三者之一。 embstr 編碼是專門用于保存簡短字符串的一種優化編…