aligned malloc free 예제 코드

이미지
 원하는 단위로 정렬된 메모리를 할당하는 예제 코드이다. aligned malloc void * aligned_malloc(size_t size, size_t align) {      void *ptr = NULL;      void *aligned_ptr = NULL;      if (size == 0 || align & (align-1))      {           return (void*)0;      }      ptr = malloc(size+align);      if (!ptr)      {           return (void*)0;      }      memset(ptr,0,size+align);      aligned_ptr = (void*)(((size_t)ptr+align) & ~(align-1));      ((void **)aligned_ptr)[-1] = ptr;      return aligned_ptr; } aligned free void aligned_free(void *aligned_ptr) {      if (aligned_ptr)      {           free(((void **)aligned_ptr)[-1]);      } }

ARM NEON asm memcpy 코드

이미지
ARM NEON 어셈블리 코드를 이용한 memcpy 이다. D0~D7 레지스터를 사용하여 src 포인터의 데이터를 dest 포인터로 복사한다.  ARM NEON 레지스터 < 출처 :  https://developer.arm.com/documentation/dht0002/a/Introducing-NEON/NEON-architecture-overview/NEON-registers > memcpy  코드 void __attribute__ ((noninline)) memcpy_neon(void *dest, const void *src, size_t n) {    // r0 : dest    // r1 : src    // r2 : n    asm(    "_copy_inner_loop:\n"    " pld [r1,#0xC00]\n" // cache preload    " vldm r1!,{d0-d7}\n" // load r1 point data do d0-d7 neno register, size is 64*8 bits = 64 bytes. and increase r1 pointer.    " vstm r0!,{d0-d7}\n" // store d0-d7 register to r0(dest) pointer, and increase r0 pointer    " subs r2,r2,#0x40\n" // decrease size of remains to copy    " bgt _copy_inner_loop\n" // continue loop until complete    ); } 빌드 옵션에 -mfpu=neon 을 추가해야하며, neon지원 여부나 버전은 "cat /proc/cpuinfo"를 통해 쉽게

OpenSSL인증서 시간 에러 해결 방법

OpenSSL을 사용하여 서버 연결시 인증서 유효 기간 체크 중 발생하는 에러의 해결 방법에 요약. #define X509_V_ERR_CERT_NOT_YET_VALID                   9 #define X509_V_ERR_CERT_HAS_EXPIRED                     10 1. 시스템 시간이 실 세계의 시간과 맞지 않아 발생할 수 있다.   인터넷 시간서버에서 시간 정보를 읽어와 시스템 시간을 동기화 한다.  2. 시스템 시간을 변경할 수 없는 경우 옵션 파라미터를 설정하여 해결할 수 있다. #define X509_V_FLAG_USE_CHECK_TIME              0x2 #define X509_V_FLAG_NO_CHECK_TIME               0x200000 void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t); int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, unsigned long flags); X509_VERIFY_PARAM_set_time를 사용하여 원하는 시간을 설정하여, 인증서 검사 때 설정된 시간을 사용할 수 있다. X509_VERIFY_PARAM_set_flags 함수로 X509_V_FLAG_NO_CHECK_TIME flag를 설정하면 인증서 시간 검사를 수행하지 않게 된다.  위 flag에 의한 인증서 검사 여부 동작에 관한 소스는 OpenSSL x509_vfy.c 파일의 internal_verify() 와  x509_check_cert_time()함수를 참조하면 된다. 아래는 사용 예제 코드이다.  X509_VERIFY_PARAM *sp = ssl_get0_param(ssl); X509_

linux 개발 및 디버깅에 유용한 hexdump 로그 c 소스 코드

이미지
 로그 메시지만으로 개발 및 디버깅을 하는 경우 메모리 버퍼 내에 어떤 데이터가 들어있는지 눈으로 확인하면 편한 경우가 많다. 이럴 때 사용하면 좋은 예제 코드이다. #include <stdio.h> #include <ctype.h> #include <string.h> void hexdump(unsigned char *data, int len) {   int i = 0;   int str_i = 0;   char *hexdigits = "0123456789abcdef";   unsigned char str[67] = { 0, };   if (!data || len <= 0)   {   return;   }   memset(str, ' ', sizeof(str));   for (i = 0; i < len; i++)   {   str[str_i * 3] = hexdigits[data[i] >> 4];   str[str_i * 3 + 1] = hexdigits[data[i] & 0xf];           str[str_i * 3 + 2] = ' ';   str[50 + str_i] = isprint((int)data[i]) ? (char)data[i] : '.';           str_i++;           if (str_i == 16)   {                str_i = 0;   str[48] = ':';   str[49] = ' 

mkfs.fat Device or resource busy 에러 해결법

이미지
 리눅스에서 SD 카드를 포맷할 때 아래와 같이 "Device or resource busy"에러를 출력하며 포맷이 되지 않는 경우가 있다. mkfs.fat: unable to open /dev/mmcblk0p1: Device or resource busy 해결법을 찾아보았다. 이 문제의 원인은  1. 파티션 dev path 가 맞지 않거나,  2. umount가 완전히 이루어 지지 않았거나,  3. mbr파티션에 문제가 있어 발생한다고 한다.  파티션에 문제가 있는 경우 fdisk를 사용하면 문제를 해결할 수 있다. umount에 문제가 있는 경우, umount할 때 -l 옵션이 사용되는 경우 umount 명령이 끝나도 커널 내부에서 리소스가 계속 사용될 가능성이 있다고 한다.  # umount -l /mnt/mmc umount2("/mnt/mmc",MNT_DETACH); 이런 경우 일정 시간 후 다시 시도하면 에러 없이 포맷이 되는 경우가 있다. 또, umount 가 되지 않을 때 "lsof" , "fuser" 명령어를 사용하여 어떤 프로세스가 mmc를 사용하고 있는지도 확인 가능하다. * lsof에서 사용 내역이 없다고 나와도, fuser에서 나올수 있다.  lsof, fuser 명령에서도 mmc를 사용하는 프로세스가 없는 경우에도 "Device or resource busy"에러가 발생할 경우, umount에 -lf 옵션을 두어 강제로 언마운트 후 SD 카드를 포맷하면 "Device or resource busy"에러가 나타나지 않을 확률이 높아진다. # umount -lf /mnt/mmc umount2("/mnt/mmc",MNT_DETACH | MNT_FORCE); * fat32에서는 "-f","