2010년 1월 23일 토요일

U-Boot의 Memory 조작 Commands

5.9.2. Memory Commands

5.9.2.1. base - print or set address offset

=> help base
base
- print address offset for memory commands
base off
- set address offset for memory commands to 'off'
=>

"base"명령(short: ba)은 메모리를 조작하는 명령어를 수행하기 위해 사용되는 오프셋 주소인 "base address"를 설정하거나, 프린트 한다.
"base address"의 기본 값은 '0'이다. 그래서 사용자가 입력하는 모든 메모리 주소는 수정되지 않고 사용된다. 하옇튼, 반복적으로 어떤 메모리 영역을 조작하고자 하는 경우, 이 영역은 시작 주소를 "base address"로 설정하고, 오프셋을 이용하면 매우 편리하다.

=> bas
Base Address: 0x00000000
=>
=> md 0 c
00000000: ffff0000 00000000 ffffffff ffffffff ................
00000010: ffff0000 00000000 ffffffff ffffffff ................
00000020: 7c8000a6 70840020 41820008 64630001 |...p.. A...dc..
=>
=> base 100000
Base Address: 0x00100000
=>
=> md 0 c
00100000: 27051956 6aa09851 47f3731e 0000009e '..Vj..QG.s.....
00100010: 00000000 00000000 f54c21db 05070600 .........L!.....
00100020: 6175746f 73637220 6578616d 706c6520 autoscr example
=>

5.9.2.2. crc32 - checksum calculation

crc32 명령(short: crc)은 어떤 메모리 영역에 대한 CRC32 체크섬을 계산하기 위해 사용할 수 있다.

=> crc 100004 3FC
CRC32 for 00100004 ... 001003ff ==> 3c82ba9d
=>

3 번째의 입력 변수를 사용하면, 이때 주어진 값의 주소에 계산된 체크섬 값을 저장한다.

=> crc 100004 3FC 100000
CRC32 for 00100004 ... 001003ff ==> 3c82ba9d
=>
=> md 100000 4
00100000: 3c82ba9d 6aa09851 47f3731e 0000009e <...j..QG.s.....
=>

이때, 위에서 보여주고 있는 것처럼, CRC32 체크섬은 프린트 하지 않고, 주어진 주소 0x100000에 저장된다.

5.9.2.3. cmp - memory compare

=> help cmp
cmp [.b, .w, .l] addr1 addr2 count
- compare memory
=>

"cmp" 명령은 두 메모리 영역의 내용이 동인한지 아닌지를 검사할 수 있다. 이 명령은 3 번째 입력변수의 영역의 전체를 검사할 뿐만아니라, 첫번재 다른 내용이 나오는 주소에서 검사를 멈춘다.

=> cmp 100000 200000 400
word at 0x00100000 (0x3c82ba9d) != word at 0x00200000 (0xfda7aec5)
Total of 0 words were the same
=>
=> md 100000 C
00100000: 3c82ba9d 6aa09851 47f3731e 0000009e <...j..QG.s.....
00100010: 00000000 00000000 f54c21db 05070600 .........L!.....
00100020: 6175746f 73637220 6578616d 706c6520 autoscr example
=>
=> md 200000 C
00200000: fda7aec5 7c42d757 e4bd86f8 e0f1e5c8 ....|B.W........
00200010: 4b74f157 a82c74b8 ea13e792 faec767f Kt.W.,t.......v.
00200020: 74e3cb5d f4dc3a04 1e65bc42 4bf7bfc0 t..]..:..e.BK...
=>

대부분 메모리 명령어들처럼 32 bits(long word), 16 bits(word), 8 bits(byte) 와 같은 조작의 단위를 조절할 수 있다.
그냥 "cmp"만을 입력하였다면 기본을 32 bits(또는 long words)로 하는 조작 단위를 갖으며, "cmp.l"명령을 사용하는 것과 같다.
만약, 16 bits(word data) 단위의 메모리 조작을 원한다면 "cmp.w" 명령을, 8 bits(byte data) 단위의 메모리 조작을 원한다면 "cpm.b" 명령을 사용한다.
이때, 검사할 메모리 영역의 개수를 지정한 3 번째 카운트 입력 변수는 조작하는 데이터의 개수를 의미 한다는 것을 주의하여야 한다.

=> cmp.l 100000 200000 400
word at 0x00100000 (0x3c82ba9d) != word at 0x00200000 (0xfda7aec5)
Total of 0 words were the same
=>
=> cmp.w 100000 200000 800
halfword at 0x00100000 (0x3c82) != halfword at 0x00200000 (0xfda7)
Total of 0 halfwords were the same
=>
=> cmp.b 100000 200000 1000
byte at 0x00100000 (0x3c) != byte at 0x00200000 (0xfd)
Total of 0 bytes were the same
=>

5.9.2.4. cp - memory copy

=> help cp
cp [.b, .w, .l] source target count
- copy memory
=>

"cp"는 어떤 메모리의 영역을 복사하기 위해 사용한다.

=> cp 200000 100000 10000
=>

"cp"는 ".l", ".w", ".b" 확장자를 해석한다.

=> cp.l 200000 100000 10000
=>
=> cp.w 200000 100000 20000
=>
=> cp.b 200000 100000 40000
=>

5.9.2.5. md - memory display

=> help md
md [.b, .w, .l] address [# of objects]
- memory display
=>

"md" 명령은 메모리의 내용을 16 진수 데이터와 ASCII 데이터로 표시하기 위해 사용된다.

=> md 100000
00100000: fda7aec5 7c42d757 e4bd86f8 e0f1e5c8 ....|B.W........
00100010: 4b74f157 a82c74b8 ea13e792 faec767f Kt.W.,t.......v.
00100020: 74e3cb5d f4dc3a04 1e65bc42 4bf7bfc0 t..]..:..e.BK...
=>

이 명령 또한 .l, .w, .b 확장자을 사용할 수 있다.

=> md.w 100000
00100000: fda7 aec5 7c42 d757 e4bd 86f8 e0f1 e5c8 ....|B.W........
00100010: 4b74 f157 a82c 74b8 Kt.W.,t.
=>
=> md.b 100000
00100000: fd a7 ae c5 7c 42 d7 57 e4 bd 86 f8 ....|B.W....
=>

마지막으로 표시된 주소와 입력변수는 기억되어 있다가, "md" 명령을 입력변수 없이 다시 입력하면 자동적으로 다음 주소에서 같은 개수의 데이터 표시하는 "md" 명령을 연속적으로 수행한다.

=> md.b 100000 20
00100000: fd a7 ae c5 7c 42 d7 57 e4 bd 86 f8 e0 f1 e5 c8 ....
B.W........
00100010: 4b 74 f1 57 a8 2c 74 b8 ea 13 e7 92 fa ec 76 7f Kt.W.,t.......v.
=>
=> md.w 100000
00100000: fda7 aec5 7c42 d757 e4bd 86f8 e0f1 e5c8 ....|B.W........
00100010: 4b74 f157 a82c 74b8 ea13 e792 faec 767f Kt.W.,t.......v.
00100020: 74e3 cb5d f4dc 3a04 1e65 bc42 4bf7 bfc0 t..]..:..e.BK...
00100030: c744 e937 9da0 3af3 f9f9 7902 bc74 f4a4 .D.7..:...y..t..
=>
=> md 100000
00100000: fda7aec5 7c42d757 e4bd86f8 e0f1e5c8 ....|B.W........
00100010: 4b74f157 a82c74b8 ea13e792 faec767f Kt.W.,t.......v.
00100020: 74e3cb5d f4dc3a04 1e65bc42 4bf7bfc0 t..]..:..e.BK...
00100030: c744e937 9da03af3 f9f97902 bc74f4a4 .D.7..:...y..t..
00100040: 260fb31b 749b7b0c baadbd0d fa52fadf &...t.{......R..
00100050: 2c6cbbf5 ae5613d7 9fdea1bc 45382c8d ,l...V......E8,.
00100060: 95b49da0 3d5d437b f33686b8 2616d8f9 ....=]C{.6..&...
00100070: c1f68fdb f849d974 0fe5eb2d 807dae8e .....I.t...-.}..
=>

5.9.2.6. mm - memory modify (auto-incrementing)

=> help mm
mm [.b, .w, .l] address
- memory modify, auto increment address
=>

"mm" 명령은 대화형식을 통하여 메모리의 내용을 수정할 수 있다. 명령을 입력하면 주소와 현재의 내용을 표시하고 사용자가 입력할 수 있도록 프롬프트를 표시한다. 정상적인 16 진수를 입력하면 이 값이 그 주소에 새로운 값으로 입력된다. 그리고 다음 주소와 그 내용을 표시하며 프롬프트를 표시한다. 만약, 비 정상적인 값을 입력하면 "mm" 명령을 끝내고, 현재 주소의 내용은 바뀌지 않는다. 즉, 비 정상적인 16 진수를 입력하면 "mm" 명령의 계속적인 진행을 멈춘다.

=> mm 100000
00100000: fda7aec5 ? 0
00100004: 7c42d757 ? aabbccdd
00100008: e4bd86f8 ? 01234567
0010000c: e0f1e5c8 ? .
=>
=> md 100000 10
00100000: 00000000 aabbccdd 01234567 e0f1e5c8 .........#Eg....
00100010: 4b74f157 a82c74b8 ea13e792 faec767f Kt.W.,t.......v.
00100020: 74e3cb5d f4dc3a04 1e65bc42 4bf7bfc0 t..]..:..e.BK...
00100030: c744e937 9da03af3 f9f97902 bc74f4a4 .D.7..:...y..t..
=>

"mm" 명령도 마찬가지로 .l, .w, .b 확장자를 사용할 수 있다.

=> mm.w 100000
00100000: 0000 ? 0101
00100002: 0000 ? 0202
00100004: aabb ? 4321
00100006: ccdd ? 8765
00100008: 0123 ? .
=>
=> md 100000 10
00100000: 01010202 43218765 01234567 e0f1e5c8 ....C!.e.#Eg....
00100010: 4b74f157 a82c74b8 ea13e792 faec767f Kt.W.,t.......v.
00100020: 74e3cb5d f4dc3a04 1e65bc42 4bf7bfc0 t..]..:..e.BK...
00100030: c744e937 9da03af3 f9f97902 bc74f4a4 .D.7..:...y..t..
=>
=> mm.b 100000
00100000: 01 ? 48
00100001: 01 ? 65
00100002: 02 ? 6c
00100003: 02 ? 6c
00100004: 43 ? 6f
00100005: 21 ? 20
00100006: 87 ? 20
00100007: 65 ? 20
00100008: 01 ? .
=>
=> md 100000 10
00100000: 48656c6c 6f202020 01234567 e0f1e5c8 Hello .#Eg....
00100010: 4b74f157 a82c74b8 ea13e792 faec767f Kt.W.,t.......v.
00100020: 74e3cb5d f4dc3a04 1e65bc42 4bf7bfc0 t..]..:..e.BK...
00100030: c744e937 9da03af3 f9f97902 bc74f4a4 .D.7..:...y..t..
=>

5.9.2.7. mtest - simple RAM test

=> help mtest
mtest [start [end [pattern]]]
- simple RAM read/write test
=>

"mtest"는 단순 메모리 테스트 기능을 제공한다.

=> mtest 100000 200000
Pattern 00000000 Writing...
=>

이 메모리 테스트는 메모리에 어떤 값을 기록하여 비교하는 동작을 하기 때문에 메모리의 내용을 변경한다. 그러므로, ROM 또는 플레시 메모리에 적용하면 에러가 될 것이다.
테스트하는 메모리의 영역이 U-Boot가 동작하는데 요구되는 메모리의 영역(exception vector code, U-Boot의 내부 프로그램 code, stack 또는 heap memory)을 포함하게 된다면, U-Boot의 동작에 예기치 않은 결과를 주게 될 것이다.

5.9.2.8. mw - memory write (fill)

=> help mw
mw [.b, .w, .l] address value [count]
- write memory
=>

"mw" 명령은 어떤 값을 가지고 메모리를 초기화 할 수 있다. [count] 입력변수 없이 수행되었을때, 그 값은 단지 지정된 주소에만 기록될 것이다. [count] 입력 변수가 사용되면, [count] 입력변수 만큼의 메모리의 영역이 초기화 될 것이다.

=> md 100000 10
00100000: 0000000f 00000010 00000011 00000012 ................
00100010: 00000013 00000014 00000015 00000016 ................
00100020: 00000017 00000018 00000019 0000001a ................
00100030: 0000001b 0000001c 0000001d 0000001e ................
=>
=> mw 100000 aabbccdd
=>
=> md 100000 10
00100000: aabbccdd 00000010 00000011 00000012 ................
00100010: 00000013 00000014 00000015 00000016 ................
00100020: 00000017 00000018 00000019 0000001a ................
00100030: 0000001b 0000001c 0000001d 0000001e ................
=>
=> mw 100000 0 6
=>
=> md 100000 10
00100000: 00000000 00000000 00000000 00000000 ................
00100010: 00000000 00000000 00000015 00000016 ................
00100020: 00000017 00000018 00000019 0000001a ................
00100030: 0000001b 0000001c 0000001d 0000001e ................
=>

이 명령도 마찬가지로 .l, .w, .b 확장자를 사용할 수 있다.

=> mw.w 100004 1155 6
=>
=> md 100000 10
00100000: 00000000 11551155 11551155 11551155 .....U.U.U.U.U.U
00100010: 00000000 00000000 00000015 00000016 ................
00100020: 00000017 00000018 00000019 0000001a ................
00100030: 0000001b 0000001c 0000001d 0000001e ................
=>
=> mw.b 100007 ff 7
=>
=> md 100000 10
00100000: 00000000 115511ff ffffffff ffff1155 .....U.........U
00100010: 00000000 00000000 00000015 00000016 ................
00100020: 00000017 00000018 00000019 0000001a ................
00100030: 0000001b 0000001c 0000001d 0000001e ................
=>

5.9.2.9. nm - memory modify (constant address)

=> help nm
nm [.b, .w, .l] address
- memory modify, read and keep address
=>

"nm" 명령은 주소의 변경없이 대화형식을 통하여 같은 주소의 데이터를 여러번 다른 값으로 입력할 수 있다. 이는 어떤 디바이스의 레지스터를 읽고 쓰고 하는 동작을 수행할 때 아주 유용하다.

=> nm.b 100000
00100000: 00 ? 48
00100000: 48 ? 65
00100000: 65 ? 6c
00100000: 6c ? 6c
00100000: 6c ? 6f
00100000: 6f ? .
=>
=> md 100000 8
00100000: 6f000000 115511ff ffffffff ffff1155 o....U.........U
00100010: 00000000 00000000 00000015 00000016 ................
=>

이 명령도 마찬가지로 .l, .w, .b 확장자를 사용할 수 있다.

5.9.2.10. loop - infinite loop on address range

=> help loop
loop [.b, .w, .l] address number_of_objects
- loop on a set of addresses
=>

"loop" 명령은 메모리의 영역을 계속적으로 읽는 동작을 수행한다. 이는 종종 메모리 테스트의 특별한 형식을 사용된다. 왜냐하면 이 명령은 메모리를 가장 빠른 속도로 읽어 내기 때문이다.
주의: 이 명령을 끝을 내지 않는다, 그러므로 타겟 보들 리셋하여 멈추는 방법 밖에 없다.

=> loop 100000 8

댓글 없음:

댓글 쓰기