Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 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
Tags
more
Archives
Today
Total
관리 메뉴

블로그

preserve_boot_args 본문

linux_kernel/head.S

preserve_boot_args

ledel 2019. 8. 11. 00:09

다음 소스코드는 linux ARM64 kernel v5.1의 소스코드이다.

 

preserve_boot_args는 부트로더로부터 전달된 인자인 x0, ... , x3 레지스터를 저장하는 프로시저이다.

 

x0는 FDT(Flatten Device Tree)의 주소 값을 담고 있다.

 

mov x21, x0

x21번 레지스터에 x0값을 복사한다.

 

adr_l x0, boot_args

adr_l, dst, sym 은 pseudo operation으로 symbol(sym)의 주소 값을 pc에 대한 offset형태인 상대 주소 값의 형태로

dst레지스터에 저장한다.

따라서 다음 명령어는 x0레지스터에 boot_args의 상대 주소를 저장한다.

 

stp x21, x1, [x0]

stp는 Store pair of registers라는 뜻으로 맨 마지막 인자인 레지스터의 값에 해당하는 주소의 메모리에 앞의 두 레지스터의 값을 저장한다.

여기서는 boot_args부터 x21(FDT)과 x1(argument from bootloader)을 순차적으로 저장을 한다.

 

stp     x2, x3, [x0, #16]

[x0, #16]에서 , #16은 signed offset으로 &(boot_args + 16)부터 x2, x3를 저장하라는 뜻이다.

 

다음과 같은 상태로 저장이 된다.

dmb sy

arm은 메모리 접근 명령의 순서를 바꾸어서 처리 성능을 높이는 방식을 사용한다.

dmb sy는 시스템 전체의 메모리 접근이 끝날 때까지 기다려서 이후에 오는 메모리 접근 명령어가 먼저 실행되지 않도록 한다.

 

이는 뒤에 오는 __inval_dcache_area에서의 메모리 접근과 분리를 시키기 위해서 사용되었다.

 

mov x1, #0x20

0x20은 10진수로는 32이며 이는 boot_args로부터 변경된 메모리 공간의 크기를 나타낸다.

x0레지스터에는 boot_args 가 저장되어 있다.

 

x0과 x1레지스터는 __inval_dcache_area 의 parameter로 사용이 된다.

 

b __inval_dcache_area

__inval_dcache_area 프로시저로 이동을 한다.

x0레지스터가 가지는 값에 해당하는 주소의 메모리부터 x1레지스터가 가지는 값에 해당하는 크기만큼의 data cache를 invalidate한다. 자세한 분석은 이어지는 __inval_dcache_area에서 다루도록 하겠다.

 

 

출처:

문C 블로그: http://jake.dothome.co.kr/barriers/

arm developer: https://developer.arm.com/docs/dui0802/a/a64-data-transfer-instructions/stp

'linux_kernel > head.S' 카테고리의 다른 글

__inval_dcache_area  (0) 2019.08.25
Comments