본문 바로가기

Physical

linux kernel 의 memory mapping 함수 정리 vaddr* = __ioremap(paddr, size) : paddr 로 시작하는 size만큼의 address 를 PA에서 VA로 mapping 한다. mmu page table에 이 range가 등록된다. vaddr* = phys_to_virt(paddr) paddr* = virt_to_phys(vaddr) : 이미 mmu page table에 등록된 range에서 찾아서, paddr 과 vaddr을 변환해 준다. 등록안된 addr에 대해서는 fail 할 것이다. 더보기
[arm] EL2 에서 EL1의 virtual address 보기 EL2 mode 에서 동작하는 code 에서 vbar_el1 값을 읽으면 아래와 같이 보인다. VBAR_EL1 FFFFFF8008082000 VBAR_EL2 00000000800BC800 vbar_el2 의 address 값을 d.l 로 보면, 아래와 같이 exception vector table을 볼 수 있으나, vbar_el1의 값을 따라가 보면 아무것도 볼 수 없다. 0x800BC800 _arm64_vectors_base: .global arm_vectors_minimal arm_vectors_minimal: // SPSel == 0 _arm64_fault // Synchronous EL2 _arm64_fault // IRQ EL2 _arm64_fault // FIQ EL2 _arm64_fault .. 더보기
virtual address to physical address (64bit linux) linux 64bit 에서 page address 변환에 대해서 한눈에 보기 쉽게 그려보았습니다. 사용할때는 꼭 출처를 명시해 주기 바랍니다. pde64_table = (pde64_t *)__va(BASE_TO_PAGE_ADDR(pdpe64_table->pd_base_addr) + (PDE64_INDEX(fault_addr)*sizeof(pde64_t))); if(!pde64_table->present) { uintptr_t tmp_pte64_table; tmp_pte64_table = (uintptr_t)petmem_smart_alloc_pages(map, (uintptr_t)NULL, (pte64_t *)NULL); memset((void *)__va(tmp_pte64_table), 0, PAGE_S.. 더보기
사용가용한 physical memory block 을 얻어오는 방법 /sys/devices/system/memory/ 의 메모리들 /sys/devices/system/memory# ls block_size_bytes memory14 memory32 memory4 memory47 memory54 memory61 memory8 hard_offline_page memory15 memory33 memory40 memory48 memory55 memory62 memory9 memory0 memory16 memory34 memory41 memory49 memory56 memory63 probe memory1 memory17 memory35 memory42 memory5 memory57 memory64 soft_offline_page memory10 memory18 memory36 .. 더보기
virtual address 와 physical address 를 서로 변환하기 static inline unsigned long virt_to_phys(volatile void * address) { return __pa(address); } static inline void * phys_to_virt(unsigned long address) { return __va(address); } 더보기
Device Driver - memory mapping 원문 : http://vincenthanna.springnote.com/pages/2267520?print=1 Device Driver - memory mapping 가상 주소와 MMU 간단한 시스템은 물리 주소만으로도 동작할 수 있다. 그러나 다중프로세스를 지원하고 각 프로세스에 대해 메모리 공간을 보호해야 하는 운영체제는 물리 주소만으로 구현하기는 어렵다. MMU는 프로세서에 전달되는 주소를 다른 주소로 변환한다. 그래서 프로세서가 메모리에 접근하는 주소가 메모리에 직접 전달되는 것이 아니라 먼저 MMU에 전달되고, MMU는 변환 테이블을 참고해 이 주소를 실제 물리 주소로 변환해 전달한다. 이때 프로세서가 MMU에 가상 주소를 전달하면, MMU가 이 가상 주소를 해석하여 나온 물리 주소를 실제 메모.. 더보기