天天看點

Linux驅動開發常用調試工具---之記憶體讀寫工具devmem和devkmem 問題 Linux下/dev/mem和/dev/kmem的差別 devmem devkmem

這段時間實驗室要完成一個記憶體故障注入工具和寄存器故障注入工具,在編寫驅動的過程中,調試起來很麻煩(一般都是printk列印出來的,調試起來太不友善),于是想

“可不可以在調試裝置驅動的時候,利用一個小工具來讀寫記憶體某塊區域的值以及cpu中寄存器的值?

這點前輩的大神已經為我們找到了,參見《ldd3》的《第十五章 記憶體映射和dma》

目前已經有這樣的工具了devmem和devkmem,就是通過mmap映射/dev/mem的。

這個工具的源碼簡單,google一下到處都是,這裡随便給出一兩個位址:

<a href="http://sources.buildroot.net/devmem2.c">http://sources.buildroot.net/devmem2.c</a>

<a href="https://dev.openwrt.org/browser/packages/utils/devmem2/src/devmem2.c">https://dev.openwrt.org/browser/packages/utils/devmem2/src/devmem2.c</a>

/dev/mem和/dev/kmem其實是在同一個驅動中代碼中産生的:drivers/char/mem.c

如果想知道具體的情況,建議大家認真學習《ldd3》的《第十五章 記憶體映射和dma》,然後自己分析源碼。

/dev/mem: 實體記憶體的全鏡像。可以用來通路實體記憶體。

用來通路實體io裝置,比如x用來通路顯示卡的實體記憶體,或嵌入式中通路gpio。用法一般就是open,然後mmap,接着可以使用map之後的位址來通路實體記憶體。這其實就是實作使用者空間驅動的一種方法。

/dev/kmem: kernel看到的虛拟記憶體的全鏡像。可以用來通路kernel的内容。

一般可以用來檢視kernel的變量,或者用作rootkit之類的。

1

2

3

4

參數

描述

address

實體位址,如果是要修改該位址的資料,需要填入下面的參數;如果隻是讀取,省略即可

type

要通路的資料類型 [b]yte, [h]alfword, [w]ord

data

想要寫入的資料

通過使用,發現io記憶體和實體核心都可以讀寫。

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

在後來的子產品調試中,有一次需要檢視核心虛拟位址中的資料,我又想起了“/dev/kmem”,

使用方法:

用法: devkmem { address }

虛拟位址(核心邏輯位址)

(僅支援讀取)核心虛拟位址中的資料。

轉載:http://blog.csdn.net/gatieme/article/details/50964903