1

I have a requirement in kernel space wherein i have to program device register with 64K aligned address. Currently i am using kmalloc() to allocate memory but not sure how to align this 64K. Does linux provide a API which does this? Do i need to write my own code to do the same?

pkumarn
  • 1,383
  • 4
  • 22
  • 29
  • See http://stackoverflow.com/questions/5310641/how-to-perform-data-structure-alignment-with-kmalloc – Dan D. May 17 '13 at 08:51

1 Answers1

2

Try following approach:

First calling kmem_cache_create(...) function to create a cache pool for your structure which should be 64K aligned like following:

    buff_64k_cachep = kmem_cache_create("buff_64k_cache",
                                     sizeof(struct test_struct),
                                     1<<16, /* 64k alignment */
                                     flags,
                                     );

Then calling kmem_cache_alloc(...) and kmem_cache_free(...) to allocate and free the buffers you needed.

tian_yufeng
  • 1,780
  • 10
  • 8
  • Thanks for the reply. I am only supposed to use kmalloc(). Doing some reading on net i see few answers: For eg if i want a memory of 2K, allocate 4K of memory, add 64K offset to the kmalloc() address and then &~(0x10000) to make it 64K aligned. I quite didn't understand this as we are wasting memory here. I also got confused when they say "bit" and "byte" alignment are different. Please help me out here. – pkumarn May 17 '13 at 13:09
  • After Googling and some think throw, i finally arrived at this logic. pusedocode : unal_addr = (Memory address + alignment_no); aligned_addr = unal_addr - (unal_addr%alignment_no) should give the required alignment. Please let me know if this is not right. – pkumarn May 21 '13 at 10:51
  • i dont' think so... your aligned_address should be larger than unalligned address – Erben Mo Dec 16 '14 at 02:11