2008年3月5日 星期三

Linux Memory - 080408

findout:

kernel module memory location
kernel memory alloc location
kernel's data/text/bss segment, stack addresses

dma_map_single / pci_map_single
dma_sync_single / pci_dma_sync_single
copy_from_user / copy_to_user
vmalloc/kmalloc/pci_alloc_consistent


http://en.wikipedia.org/wiki/CPU_cache
(?)how kernel alloc NCNB (non-cacheable, non-bufferable) buffer
dma_is_consistent在arm沒辦法知道mem是不是consistent/NCNB
linux/include/asm-arm/dma-mapping.h
static inline int dma_get_cache_alignment(void)
{
return 32;
}
static inline int dma_is_consistent(dma_addr_t handle)
{
return 0;
}
CONFIG_GROCX_CONSISTENT_DMA_16M
CONSISTENT_DMA_SIZE
(2.6.23.9) arch/arm/mm/consistent.c
/* Sanity check size */
#if (CONSISTENT_DMA_SIZE % SZ_2M)
#error "CONSISTENT_DMA_SIZE must be multiple of 2MiB"
#endif

#define CONSISTENT_END (0xffe00000)
#define CONSISTENT_BASE (CONSISTENT_END - CONSISTENT_DMA_SIZE)

#define CONSISTENT_OFFSET(x) (((unsigned long)(x) - CONSISTENT_BASE) >> PAGE_SHIFT)
#define CONSISTENT_PTE_INDEX(x) (((unsigned long)(x) - CONSISTENT_BASE) >> PGDIR_SHIFT)
#define NUM_CONSISTENT_PTES (CONSISTENT_DMA_SIZE >> PGDIR_SHIFT)




L1_CACHE_ALIGN, L1_CACHE_BYTES
How to Align Data Structures on Cache Boundaries
syn_str * align_p = (syn_str *)( (((int) p) + 127) & -128 );
Linux source
./include/linux/cache.h
#define L1_CACHE_ALIGN(x) ALIGN(x, L1_CACHE_BYTES)
./include/linux/kernel.h
#define ALIGN(x,a) (((x)+(a)-1)&~((a)-1))
./include/asm-arm/cache.h, depend on the architecture.
#define L1_CACHE_SHIFT 5
#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)


to alloc a buf for DMA uses
  • kmalloc (n, (in_interrupt () ? GFP_ATOMIC : GFP_KERNEL) | GFP_DMA)
  • align the virtual addr by L1_CACHE_ALIGN
  • get the physical addr by
    phy_addr=dma_map_single (dma->pdevice, dma->virt_addr, len, DMA_BIDIRECTIONAL);


user space local variable 的位置大約是在
0xbebc8e00
user space global varialbe 的位置大約是在
0x000108e0
kernel space static link
kernel space module
oxbf015f60

kernel kmalloc
c3751000(va)
kmalloc (GFP_KERNEL|GFP_DMA);
0xbf01677c

沒有留言: