C/C++에서 공유 라이브러리 제작시 주의점

C/C++ 공유라이브러리 작업시 C++의 고유한 네이밍을 주의하기 위해 extern “c”을 하고 나면 다 끝나는줄 알았는데 그게 아니였다. extern “C”은 C++ 작업자의 컴파일러에 따라 네이밍 규칙이 다른데 이를 C 형태로 제공하는 하나의 키워드다. 다음의 표를 통해 확인 할 수 있다. https://en.wikipedia.org/wiki/Name_mangling 위에 표처럼 같은 함수인데도 컴파일러의 따라 이름이 변경이 된 걸 확인 할 수 있다. 이거 소개 더보기 C/C++에서 공유 라이브러리 제작시 주의점[…]

cross build 시 CMake Toolchain file 작성법

CMAKE로 이용하여 크로스 빌드하는 일이 많아짐에 따라 cmake toolchain file을 별도로 작성하게 된다. CMAKE_SYSROOT 는 기본적으로 프로그램은 어디 path에 라이브러리를 찾는지 기술되어 있다. 하지만 내가 컴파일한 환경과 실행시키는 환경의 lib가 다른 경우가 종종 발생하는데 이때 CMAKE_SYSROOT가 필수적이다. cmake 빌드 시 -DCMAKE_TOOLCHAIN_FILE 해당 파일을 설정해두면 된다. 참고시 좋은 링크 https://docs.oracle.com/cd/E88353_01/html/E37853/cmake-toolchains-7.html https://android.googlesource.com/platform/ndk/+/master/build/cmake/android.toolchain.cmake

크리티컬섹션(critical section) 은 정말로 유저 영역일까?

몇몇 책들과 네이버 블로그 및 구글 블로그에서는 크리티컬 세션에 대해 설명을 유저영역이여 세마포어와 뮤덱스에 비해 빠르다구 설명에 나와있다. 하지만 반대로 생각하자면 어떻게 프로그램 레벨에서 커널 함수를 호출안하고 해당 스레드를 중지 시킬수 있을까? 라고 반문을 하면 불가능하다. 오늘은 이거에 대해 알아 볼려고 한다. Windows의 OS는 기본적으로 소스코드는 비공개지만 이를 역 리버싱해서 구현한 OS가 존재 한다. ReactOS이며 소개 더보기 크리티컬섹션(critical section) 은 정말로 유저 영역일까?[…]

리눅스 커널 인터럽트 진입시 현재상태 저장

리눅스는 인터럽트 발생시 빠르게 레지스터값을 저장한다. 저장하는 함수는 __irq_svc이다. 이 코드는 어셈은 다음과 같다. https://github.com/raspberrypi/linux/blob/abaa3760da89d6fb38e55473fffc9a31dd0b1d7a/arch/arm/kernel/entry-armv.S#L206 좀 더 자세히 알아보기위해 어셈코드를 확인해보자. 커널을 빌드할때 심볼값인 System.map을 확인하자. __irq_svc의 함수의 시작은 0xc0009940 이고 끝나는 지점은 0xc00099bc 알수 있다. 다음은 위 커맨드를 입력한 출력값이다. 다음은 stm명령어를 통해 레지스터값을 전부 스택에 저장한다. http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ik/Cihcadda.html

커널에 do while 매크로가 있을까?

리눅스 커널을 보면 아래와 같이 do {} while 매크로가 있다. https://github.com/raspberrypi/linux/blob/f6b3ac28f0a9137d4c24c0b8832e693bbd16f5b7/include/linux/hardirq.h#L36 do ~ while로 매크로 함수를 사용하는 두가지 이유가 있다. 첫째는 {} 을 통해서 중복이름을 막는다. 매크로 함수는 말그대로 컨트롤 C+V효과를 동일한 효과가 있어 중복이름이 있을때 undefined behavior이 된다. 이를 방지 하기 위해 블록을 사용한다. 둘째 ; 을 강제화한다. 여러개의 함수를 define을 하게되면 ;을 포함해서 소개 더보기 커널에 do while 매크로가 있을까?[…]

리눅스 커널 매크로 함수 없이보기

리눅스 커널 코드를 보게되면 수많은 매크로 함수를 확인할수있는데 이는 소스코드를 보기어렵게 만들어주는 요소이다. 이를 해결하기위해 전처리한 코드를 보는 GCC옵션이 있다. –save-temps 라는 옵션이며 이 옵션을 설정하기 위해서는 리눅스 커널의 코드의 ~/위치에 MakeFile안에 다음과 같이 소스코드를 추가한다.

RSA 암호화 구현

필자는 수학을 못하기때문에 왜 이게 이렇게 되는지 아직두 잘 모르겠다. 그래서 이글은 stap by step으로 구현에 대해 이야기를 할것이다. RSA는 아래의 flow을 따라간다. 두개의 소수를 찾는다. 공개키를 만든다. 공개키 기반으로 개인키를 만든다. 데이터를 암호화 복호화을 해본다. 1. 두개의 소수를 찾는다. 공개키를 만들기위해서는 총 두가지의 다른 소수가 필요하다. 필자는 이키를 p와 q라고 부를거고 p를 11로 q를 소개 더보기 RSA 암호화 구현[…]

스핀락 구현시 참고할점

스핀락을 구현할때 아래와 같이 구현한다. 하지만 위 코드를 테스트시 생각외로 좋은 성능이 안 나오는걸 벤치 마크로 확인할수있다. 리누스 토바즈형님이 이에 대해 의견을 남긴글이 있는데 https://www.realworldtech.com/forum/?threadid=189711&curpostid=189723&fbclid=IwAR1aqMqWNrvY7qcOmhGKUH6m9YkCanEEVIbhEqRlZcRP1Tb4rH053yvs2PE CPU 캐시 일관성때문에 성능이 더 느리다라는 이야기이다. 이는 실제로도 그렇다 라는 점이다. 다행히 x86에서는 이 문제를 펜티엄4부터 알았고 아래의 명령어를 추가되었다. 이는 NOP 명령어를 주어서 해결한다. 아래의 글을 보면 얼마나 소개 더보기 스핀락 구현시 참고할점[…]

원과 원 충돌 체크하는 방법

원과 원의 출돌 체크는 매우 깔끔하게 처리할수 있다. 두개의 원이 있고 반지름이 각각 R1 ,R2가 있다. 여기서 충돌했을때의 그림을 보자 직관적으로 두개의 중심의 거리보다 반지름의 합보다 작은걸 알수있다. 좀더 자세히 보기위해 태그를 추가했다. 두 거리는 아래의 공식으로 쉽게 구할수 있다. 거기에 두개의 반지름의 합보다 거리의 값이 작으면 충돌이 발생했다는 것이다. 하지만 이와같은식 을 컴퓨터로 구현할려면 소개 더보기 원과 원 충돌 체크하는 방법[…]