인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

김상현님의 프로필 이미지
김상현

작성한 질문수

FreeRTOS 프로그래밍

동시성 문제

disassembly 된 내용에 관한 질문 드립니다.

해결된 질문

작성

·

192

1

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

안녕하세요. FreeRTOS에 관한 질문은 아니라 올릴까 말까 고민했는데, 혼자 힘으로는 해결이 안될 것 같아 도움 요청 드립니다.

아래의 사진을 보시면

1. 프로그램 카운터의 경우 0x8002e60인데,

ldr r3, [pc, #20]의 결과가 왜 0x8002e78이 되는 건가요?

pc에서 20만큼 더한 곳의 값을 r3에 불러오라는 것으로 해석이 되는데, pc에서 20만큼 더한거면 0x8002e74 아닌가요?

2. 

0x8002e78 번지의 값을 보면 0x20000020인데, 제 생각엔 이건 ticket 변수의 값이 저장된 곳이라 생각이 됩니다.

그런데 list 파일을 보면 

0x8002e78번지는 저 text 섹션에 속해있는데, text 섹션엔 실행 코드가 저장되는 것으로 알고 있는데,  왜 실행 코드가 아닌 0x20000020이 저장되는 것인지 궁금합니다..

답변 부탁 드립니다. 감사합니다.

답변 2

0

홍영기님의 프로필 이미지
홍영기
지식공유자

김상현님!

1. 그렇다면 stm32f1xx의 경우 파이프라인이 Fetch(PC가 가리키는 위치) -> Decode -> Execute라 Thumb 모드의 경우 2 + 2 = 4만큼, ARM 모드의 경우엔 4+4 = 8만큼 차이가 생기는 건가요?

(ANS) 정확합니다:)

2. ticket 변수가 저장되어 있는 위치가 0x20000020 번지인 것은 알겠는데, 이것이 왜 text 섹션에 저장되는지 모르겠습니다.

(ANS) ARM 과 같은 RISC 프로세서들은 메모리 접근을 할 때 상대주소(pc relative address) 을 즐겨 사용합니다.

ROM(.text)                                              --------> RAM(.data)

0x20000020                                                         ticket변수

(ticket 변수의 주소를 저장하고 있슴)

김상현님의 프로필 이미지
김상현
질문자

감사합니다. 많은 도움이 되었어요!

0

홍영기님의 프로필 이미지
홍영기
지식공유자

김상현님! 반갑습니다.^^

(ANS) 이 상황을 이해하기 위해서는 ARM의 파이프라인에 기인한 PC 레지스터의 동작 특성과 ldr 명령에 대한 이해가 필수인데요. 천천히 설명드려보겠습니다.

첫째, ARM의 파이프라인은 자세히 설명하자면 글이 너무 장황해지기 때문에 효율적인 방법을 알려드릴게요. 구글 검색 'ARM의 파이프라인 PC'  키워드로 찾아보시면 됩니다.

둘째, 적어주신 글과 그림으로 보면 ticket 변수는 말씀하신 것처럼 램주소 0x20000020 번지에 저장되어 있는 것이 맞습니다.

ldr r3, [pc, #20] @ r3= [ 0x08002e60 + 0x14 + 4(파이프라인 동작 특성) ] = 0x20000020

ldr r3, [r3, #0] @ r3=[r3+0] = [ 0x20000020 ] = 결국 ticket 변수의 값이 r3에 로드되죠.

단위 명령어 당 2바이트의 크기를 갖는 THUMB 명령어가 사용되고 있다는 점, 그리고 파이프라인의 특성 때문에  메모리 접근 주소 계산시 정수 값 ('4') 가 계산 결과에 같이 반영된다는 점 다시 한번 강조해 드립니다.

제 설명 중 이해가 안가는 점이 있거나, 추가적인 질문이 있으면 다시 질문주세요. 감사합니다.~~

김상현님의 프로필 이미지
김상현
질문자

알려주신 키워드로 공부해보았습니다. 감사합니다.

1. 그렇다면 stm32f1xx의 경우 파이프라인이 Fetch(PC가 가리키는 위치) -> Decode -> Execute라 Thumb 모드의 경우 2 + 2 = 4만큼, ARM 모드의 경우엔 4+4 = 8만큼 차이가 생기는 건가요?

2. ticket 변수가 저장되어 있는 위치가 0x20000020 번지인 것은 알겠는데, 이것이 왜 text 섹션에 저장되는지 모르겠습니다.

김상현님의 프로필 이미지
김상현

작성한 질문수

질문하기