1024 바이트 정렬 전에 16 바이트로 정렬 된 2kB 메모리 청크를 배치하고 싶습니다 .
플랫폼 : arm, 베어 메탈, GNU 툴체인. 휴대 성 필요 없음
GCC / attributes pragma, ld
사용자 지정 링커 스크립트 또는 다른 솔루션으로 그렇게 할 수 있습니까 ?
이를 위해 1kB를 낭비하는 것을 피하고 싶습니다 (기본적으로 3kB 메모리 청크를 1kB로 정렬하고 1024-16 바이트의 패딩 추가). 데이터를 배치하기 위해 특정 주소를 강요하는 것은 가능하지만 그 ld
전후에 변수를 배치 할 수 있습니다 (또는 패딩을 넣는 방법입니까?).
컨텍스트 : 버퍼는 하드웨어 설계에 의해 1k 경계에 있어야하지만, 내 소스가 최대 16B 너비인지 확인하는 경계없이이 버퍼에 복사 할 수 있도록 전후에 약간의 공간을 추가하고 싶습니다.
편집 : 추가 된 예.
0x2000000에서 시작하는 RAM이 있다고 가정 해 보겠습니다. char buf[2048]
1024 * N-16 오프셋에 배치 해야합니다. 즉 (&buf[16])%1024==0
, 1008 패딩 바이트를 잃지 않기를 바랍니다.
(edit2) 그래서 나는 가지고 싶습니다 :
ALIGN(exp)
와 동일합니다 (. + exp - 1) & ~(exp - 1)
. 물론이 표현 exp
은 2의 거듭 제곱 일 때만 작동합니다 . 따라서을 사용할 수 없지만 ALIGN()
원하는 결과를 생성하는 고유 한 표현식을 작성할 수 있습니다. 같은 ((. + 1024 + 16 - 1) & ~(1024 - 1)) - 16
것이 트릭을해야합니다. 다양한 값을 입력 .
하면 원하는대로 반올림되는 것을 볼 수 있습니다.
문제는 링커가 지정한 모든 섹션을 특수 섹션 앞에 배치하고 그 뒤에 있도록 지정된 모든 섹션을 배치한다는 것입니다. 최소한의 패딩을 생성하기 위해 다른 파일의 .data 섹션을 이전 또는 이후로 영리하게 정렬하지 않습니다. 또한 개체 파일 및 섹션 내에서 개별 변수를 다시 정렬하지 않습니다. 가능한 한 단단하게 포장하려면 다음과 같이해야합니다.
.data : {
*(.about1008bytes)
. = ((. + 1024 + 16 - 1) & ~(1024 - 1)) - 16
*(.DMAbuf)
*(.data)
}
섹션 속성을 사용하여 버퍼를 배치 .DMAbuf
하고 1008 바이트 이하의 다른 데이터 변수를 찾아서 섹션에 붙입니다 .about1008bytes
.
미쳐 가고 싶다면 gcc -fdata-sections
모든 데이터 개체를 자체 섹션에 배치하고 readelf로 섹션 크기를 추출한 다음 작성한 프로그램에 제공하여 최적의 패킹을 위해 정렬 한 다음이를 나열하는 링커 스크립트 덩어리를 뱉어냅니다. 최적의 주문.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다