시스템 DRAM에서 ioremap()
으로 전화하는 것이 좋지 않습니까? 다른 모든 프로세스에서 사용되지 않는 시스템 DRAM 공간을 예약하고 싶습니다. 이것이 그걸 할 수있는 방법일까요? 나는 DRAM이 실제로 입출력 기억 장치가 아니라는 것을 알고 있으므로 이것이 나쁜 실행으로 여겨지는지 확신 할 수 없었다.시스템 메모리 ioremap()을 예약 하시겠습니까?
답변
시스템 DRAM에서 ioremap()을 호출하는 것이 좋지 않습니까? 커널 관리
시스템 메모리는 ioremap()을 사용하여 재 맵핑해서는 안된다. 이러한 여러 매핑은 일부 아키텍처/프로세서에서 데이터 손상을 일으킬 수 있습니다. ARM의 경우이 문제에 대해서는 this article을 참조하십시오.
커널 관리에서 부트시 문제의 메모리 영역을 제외하여 단일 매핑 (ioremap())을 시도 할 수 있습니다.
ARM에서는 ATAG (ATAG_MEM
태그) 또는 장치 트리 (memory
속성)를 사용하여 축소 된 실제 메모리를 지정합니다.
1835 memmap=nn[KMG]$ss[KMG]
1836 [KNL,ACPI] Mark specific memory as reserved.
1837 Region of memory to be reserved is from ss to ss+nn.
1838 Example: Exclude memory from 0x18690000-0x1869ffff
1839 memmap=64K$0x18690000
1840 or
1841 memmap=0x10000$0x18690000
() 다중 요청 및 /PROC의 완전성/정확성을 방지하기 :
그렇지 커널 명령 라인에서 memmap = 커넬 파라미터를 사용/iomem.
커널 명령 줄 인수에서 "mem"을 사용하여 시스템 부팅 중에 메모리를 예약 할 수 있습니다. 256 MB의 경우
LDD3 채널 - 15 대학원 예를 들어 443
는, 인수 들어 mem = 255M은 최고 메가 바이트를 사용 에서 커널을 유지합니다. 모듈은 나중에 다음 코드를 사용하여 이러한 메모리에 액세스 할 수 있습니다.
dmabuf = ioremap (0xFF00000/* 255M /, 0x100000/ 1M * /);
그러나 커널이이 예약 된 메모리를 사용할 수 없기 때문에 효율적인 방법이 아닙니다. 현재 작동중인 SoC에서 메모리는 SoC 드라이버가이 메모리를 사용하지 않을 때 다른 프로세스에서 메모리를 다시 사용할 수 있도록하는 CMA (Contiguous Memory Allocator)를 사용하여 예약됩니다.
시스템 RAM에 공간을 예약하려면'kmalloc()','vmalloc()','get_free_pages()'등을 사용하십시오. –
동일한 방식으로 예약하고자하는 물리적 주소를 식별해야합니다. ioremap을 사용합니다. 내 장치는 여러 코어가있는 SOC이며 커널에서 침입 당하지 않는 공유 DDR 메모리 영역을 설정하려고합니다. – whh4000
실제 주소는 무엇이 필요합니까? –