메모리의 2 제곱에서 오프셋을 사용하여 메모리의 변수 정렬

마카 푸프

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) 그래서 나는 가지고 싶습니다 :

  • 0x2000000-일부 변수
  • 0x2000010-다른 변수 ...
  • 0x2000100-다른 변수 ...
  • 0x20003F0-char buf [2048] : here (int) & buf [16] % 1024 = 0x2000400 % 1024 == 0
  • 0x2000BF0-다른 변수 ...
TrentP

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

고정 된 범위의 메모리에서 메모리 할당을 수행하도록 perl을 제한

분류에서Dev

4 개 또는 8 개의 정렬 규칙을 사용하여 메모리에로드를 처리합니다.

분류에서Dev

jQuery 메모리에서 복제 된 요소의 html을 수정하는 방법

분류에서Dev

ctypes 모듈 및 GDB 세션을 사용하여 메모리에서 Python 정수 변경

분류에서Dev

리셀러 계정을 사용하여 리셀러의 GApps (모든 도메인)에서 최고 관리자 만 얻을 수 있습니까?

분류에서Dev

cocos2dx에서 C ++를 사용하여 자산의 파일을 Android의 내부 메모리로 복사

분류에서Dev

최소한의 내부 메모리 리소스를 사용하여 효율적으로 디스크에서 문자열을 정렬하는 알고리즘

분류에서Dev

JXLS를 사용하여 메모리의 행 수 제한

분류에서Dev

메모리 누수없이 Fortran FFT (FFTW)에 정렬 된 메모리 사용

분류에서Dev

변환 명령을 사용하여 메모리의 이미지 크기를 조정하는 방법

분류에서Dev

셰이더 (OpenGL 4.0)에서 크기 조정이 가능한 2의 비 제곱 메모리에 어떻게 액세스 할 수 있습니까?

분류에서Dev

메모리 매핑을 사용하여 Android의 프로세스간에 메모리 공유

분류에서Dev

메모리 매핑을 사용하여 Android의 프로세스간에 메모리 공유

분류에서Dev

const void 포인터에서 메모리 오프셋에 값을 설정하는 방법은 무엇입니까?

분류에서Dev

함수를 호출 할 때 C ++에서 사용자 정의 클래스로 메모리를 읽을 수 없음

분류에서Dev

vmalloc을 사용하여 커널 모듈에 많은 양의 메모리 할당

분류에서Dev

약 2MB의 메모리를 사용하여 메모리 소모

분류에서Dev

두 개의 실행 파일을 동시에 실행하여 메모리 사용량 측정

분류에서Dev

Symfony2의 가상 호스트에 메모리의 httpd.exe 응용 프로그램 오류를 읽을 수 없습니다.

분류에서Dev

Linux에서 특정 프로세스의 메모리 사용량을 어떻게 제한합니까?

분류에서Dev

nodejs를 사용하여 Windows에서 프로세스의 메모리 값 읽기

분류에서Dev

C #에서 System.IO.Compression을 사용하여 메모리의 개체 압축

분류에서Dev

malloc을 사용하여 구조의 메모리 크기를 변경할 때

분류에서Dev

하나의 메모리 주소에 두 개의 정수 변수가 있습니까?

분류에서Dev

IOS의 Custom WifiStatus 파일에서 메모리 누수를 수정하는 방법

분류에서Dev

메모리의 변수에 파일 내용 유지

분류에서Dev

정렬 된 연결 목록의 삽입에서 메모리 누수

분류에서Dev

전역 적으로 정의 된 변수에 어떤 메모리가 사용됩니까?

분류에서Dev

C ++는 메모리 할당을 사용하여 함수의 staic 변수를 파괴합니다.

Related 관련 기사

  1. 1

    고정 된 범위의 메모리에서 메모리 할당을 수행하도록 perl을 제한

  2. 2

    4 개 또는 8 개의 정렬 규칙을 사용하여 메모리에로드를 처리합니다.

  3. 3

    jQuery 메모리에서 복제 된 요소의 html을 수정하는 방법

  4. 4

    ctypes 모듈 및 GDB 세션을 사용하여 메모리에서 Python 정수 변경

  5. 5

    리셀러 계정을 사용하여 리셀러의 GApps (모든 도메인)에서 최고 관리자 만 얻을 수 있습니까?

  6. 6

    cocos2dx에서 C ++를 사용하여 자산의 파일을 Android의 내부 메모리로 복사

  7. 7

    최소한의 내부 메모리 리소스를 사용하여 효율적으로 디스크에서 문자열을 정렬하는 알고리즘

  8. 8

    JXLS를 사용하여 메모리의 행 수 제한

  9. 9

    메모리 누수없이 Fortran FFT (FFTW)에 정렬 된 메모리 사용

  10. 10

    변환 명령을 사용하여 메모리의 이미지 크기를 조정하는 방법

  11. 11

    셰이더 (OpenGL 4.0)에서 크기 조정이 가능한 2의 비 제곱 메모리에 어떻게 액세스 할 수 있습니까?

  12. 12

    메모리 매핑을 사용하여 Android의 프로세스간에 메모리 공유

  13. 13

    메모리 매핑을 사용하여 Android의 프로세스간에 메모리 공유

  14. 14

    const void 포인터에서 메모리 오프셋에 값을 설정하는 방법은 무엇입니까?

  15. 15

    함수를 호출 할 때 C ++에서 사용자 정의 클래스로 메모리를 읽을 수 없음

  16. 16

    vmalloc을 사용하여 커널 모듈에 많은 양의 메모리 할당

  17. 17

    약 2MB의 메모리를 사용하여 메모리 소모

  18. 18

    두 개의 실행 파일을 동시에 실행하여 메모리 사용량 측정

  19. 19

    Symfony2의 가상 호스트에 메모리의 httpd.exe 응용 프로그램 오류를 읽을 수 없습니다.

  20. 20

    Linux에서 특정 프로세스의 메모리 사용량을 어떻게 제한합니까?

  21. 21

    nodejs를 사용하여 Windows에서 프로세스의 메모리 값 읽기

  22. 22

    C #에서 System.IO.Compression을 사용하여 메모리의 개체 압축

  23. 23

    malloc을 사용하여 구조의 메모리 크기를 변경할 때

  24. 24

    하나의 메모리 주소에 두 개의 정수 변수가 있습니까?

  25. 25

    IOS의 Custom WifiStatus 파일에서 메모리 누수를 수정하는 방법

  26. 26

    메모리의 변수에 파일 내용 유지

  27. 27

    정렬 된 연결 목록의 삽입에서 메모리 누수

  28. 28

    전역 적으로 정의 된 변수에 어떤 메모리가 사용됩니까?

  29. 29

    C ++는 메모리 할당을 사용하여 함수의 staic 변수를 파괴합니다.

뜨겁다태그

보관