"실전연습으로 완성하는 리버싱"의 원본
- beginners.re/ : 무료로 pdf 를 받아볼 수 있다.
출처 : ref. 1 |
② 정보통신서비스 제공자등은 정보통신서비스를 1년의 기간 동안 이용하지 아니하는 이용자의 개인정보를 보호하기 위하여 대통령령으로 정하는 바에 따라 개인정보의 파기 등 필요한 조치를 취하여야 한다. 다만, 그 기간에 대하여 다른 법령 또는 이용자의 요청에 따라 달리 정한 경우에는 그에 따른다.
(1) c = a+b (2) f = d+e (3) h = c+f(1) 과 (2) 는 아무런 연관성이 없기 때문에 병렬로 진행해도 된다. 만약 이것을 sequential program order 로 수행한다면, (1) 이후에 (2)가 진행되고, 그 후에 (3)이 진행될 것이다.
raise_exception(); // the line below is never reached access(probe_array[data * 4096]);
access(probe_array[data * 4096]);
부분은 실제로 수행될 수 없다. 일단은 앞에 raise_exception()
에서 프로그램이 종료되기 때문이기도 하고, raise_exception()
이 없다고 해도 이부분은 OS 에서 exception 으로 처리해서 이론적으로는 접근할 수 없다.access(probe_array[data * 4096]);
코드는 dependency 가 없기 때문이다.access(probe_array[data * 4096]);
는 probe_array를 data 값에 따라 4096 byte(4kB) 간격으로 접근하게 된다. 그래서 data 의 값으로 부터 memory page 까지의 injective mapping 이 있다. 즉 2개의 값은 같은 page 로 접근이 되지 않는다. 결과적으로 만약 page의 cache line 이 cached 되면 우리는 data 의 값을 알 수 있다.간단한 정리 SLC, MLC, TLC / 플레쉬 / 플래쉬 / nand flash / 메모리 /
erase
셀에 전자를 채워넣고, 채워진 전자를 빼내는 방식을 하는 것이 우리가 흔히 아는 write, erase 가 된다.
SLC 는 cell 하나에 2의 state 만 표현하는 것이다. 즉 전자가 채워져
있으면 1로 보고, 비워져 있으면 0으로 보면 된다.
MLC 는 cell 하나에 전자가 채워진 양에 따라 4가자의 state 를 표현하게
된다. 전자가 1/3 정도 채워지면 01, 2/3 정도 채워지면 10, 3/3 채워지면
11, 비워져 있으면 00 으로 보게 된다.
TLC 는 cell 하나에서 8가지 state 를 표현한다. MLC 와 마찬 가지로 1/7
정도 채워져 있으면 001, 2/7 정도 채워져 있으면 010, … 그래서 7/7 차면,
111 이 된다.
위에서 한 이야기 처럼 SLC 보다 MLC, TLC 는 전자를 세밀하게 조절해야
한다. 그래야 하나의 cell 에서 여러가지를 표현할 수 있다. 그런데 이렇게
세밀하게 조절하면 필연적으로 간섭이 발생한다. 그래서 MLC, TLC 들은
확실히 SLC 보다 error 가 많다. 그래서 이 에러를 줄이기 위해 ECC(Error
correcting code) 를 크게 줄 수 밖에 없다. 그래서 MLC, TLC 가 SLC 의 2배
용량이 되지 못하고, 성능도 좋지 못한 이유다.
cell 에 전자를 가두고, 흘려버리기 위해 산화막을 사용하는데, 이 녀석을
전자가 계속 왔다갔다 하다 보면 전자가 이 산화막에 조금씩 쌓이게 된다.
(대충 철에 자력이 걸려서 철이 자석이 되는 것을 상상하면 된다.)
이렇게 되면 이 산화막을 통과하는 양이 줄어들거나 할 텐데, SLC 는
state 간의 전압차가 커서 어느정도 전하량이 줄어들어도 인식하는데 큰
문제가 없지만, MLC 나 TLC 는 state 간의 전압차가 크지 않아서 전압이
미세하게 틀어져도 잘못된 값으로 write / erase 될 수 있다.
그래서 MLC, TLC 의 수명이 SLC 에 비해 떨어진다.그래서 이것을 극복하기 위해 spare 영역, over provisioning 부분을 추가해 놓는다.
위 그림 설명의 GATE 가 최초에는 ‘floating gate’ 라는 이름으로 ’도체’를 사용했다. 그래서 그 안으로 (-)전자를 끌어드렸다. 이 도체 floating gate의 상태가 변하고 1, 0 을 표시하게 된다. 위 그림의 스위치 on/off 를 보면 될 것 같다.
SLC 는 이것을 채우고 비우는 것으로 1, 0 을 표시하는 것이고, MLC 는 이 floating gate 가 비어있으면 00, 1/3정도 채운것을 01, 2/3 채우면, 10, 3/3 을 채우면 11 이 된다.
그런데 공정이 미세해지면서 cell 간의 간섭을 줄이기 위해 ’부도체’로 바꿨다. ’부도체’는 말그대로 ’전자’가 흐르지 않는다. 그래서 구멍(trap)이 많은 부도체(실리콘 나이트라이드)를 이용해서 그 구멍에 전하를 저장하게 한다. (치즈를 연상하면 된다.)
이제 이것을 세로로 세운다. 위 그림(그림. 2)과 아래 그림(그림. 3)을
참고하자. 이렇게 세워서 양쪽으로 이 것을 붙이는 구조를 만들었다. 이것이
‘3D V-NAND’ 이다. 이렇게 양쪽으로 붙이게 되면서 이것을 원형으로 만들어
사용하게 됐다. 그림2
그림을 보면 짐작이 가지만 이것이 요즘
’구멍’을 얼마나 더 깊게 뚫을 수 있느냐를 이야기하는 것의 핵심일 것이다.
이 구멍을 뚫어야 control gate 안에 반도체
와
Floating Gate
를 집어넣을 수 있을테니 말이다.
[K-반도체, 도전과 응전] ①누가 한국 반도체산업을 위협하나 - 오피니언뉴스 낸드 플래시 기술의 핵심은 저장공간을 높게 쌓은 뒤 전류가 흐르는 구멍(hole)을 한 번에 뚫는 ‘싱글스택(Single stack)’ 기술이다. 삼성전자는 128단 낸드플래시에도 싱글스택을 적용했다. SK하이닉스는 128단 최초 양산시 더블 스택을 적용했다. 100층 빌딩을 지을 때 한 번에 쌓아 올리기 않고 50층씩 두개를 연이어 쌓은 셈이다. 싱글스택은 더블스택보다 회로가 간단해 속도가 빠르다. 생산공정도 간단하다. 성능은 높은데 생산비용은 덜 드는 것이다.
포브스는 마이크론의 176단 낸드 출시를 전하면서 “마이크론 관계자가 176단 낸드가 88단을 두번 쌓은 ’더블스택’이라고 언급했다”고 밝혔다. 영미권 전자 전문지 아난드테크(anandtech), 익스트림 테크(Extreme Tech), 퍼드질라(fudzilla) 등은 모두 마이크론 사의 176단 낸드플래시가 “88단을 두번 쌓은 제품”이라고 분석하며 “새로운 기술이 아니다”고 덧붙였다.
그림에는 철자가 틀렸다 |
c:\..> ffmpeg.exe -i 03.mkv -c copy 03-01.mp4
c:\> clang hello.c를 하면, a.exe 를 만들어 낸다. 우리는 이런 실행파일을 원하는 것은 아니다. clang 내부에서 쓰는 AST 자료를 사용할 것이다.
source code 가 있다면 CLang 이 preprocessor 를 실행해서 이 source code 를 parse 해서 AST(Abstract Syntax Tree) 를 만든다.[ref. 1]
c:\> clang -Xclang -ast-dump -fsyntax-only hello.c
<llvm>\tools\clang\tools\extra + CMakeLists.txt + \loop-convert + CMakeLists.txt + LoopConvert.cpp
add_llvm_external_project(clang-tools-extra extra)
add_subdirectory(loop-convert)
set(LLVM_LINK_COMPONENTS support) add_clang_executable(loop-convert LoopConvert.cpp ) target_link_libraries(loop-convert clangTooling clangBasic clangASTMatchers )
// Declares clang::SyntaxOnlyAction. #include "clang/Frontend/FrontendActions.h" #include "clang/Tooling/CommonOptionsParser.h" #include "clang/Tooling/Tooling.h" // Declares llvm::cl::extrahelp. #include "llvm/Support/CommandLine.h" using namespace clang::tooling; using namespace llvm; // Apply a custom category to all command-line options so that they are the // only ones displayed. static llvm::cl::OptionCategory MyToolCategory("my-tool options"); // CommonOptionsParser declares HelpMessage with a description of the common // command-line options related to the compilation database and input files. // It's nice to have this help message in all tools. static cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage); // A help message for this specific tool can be added afterwards. static cl::extrahelp MoreHelp("\nMore help text..."); int main(int argc, const char **argv) { CommonOptionsParser OptionsParser(argc, argv, MyToolCategory); ClangTool Tool(OptionsParser.getCompilations(), OptionsParser.getSourcePathList()); return Tool.run(newFrontendActionFactory<clang::SyntaxOnlyAction>().get()); }
f:\>c:\a\programming\llvm\llvm\build\Debug\bin\loop-convert.exe test.cpp --이러면 test.cpp 를 분석해준다.
c:\a\programming\llvm> git clone http://llvm.org/git/llvm.git c:\a\programming\llvm> cd tools c:\a\programming\llvm\tools> git clone http://llvm.org/git/clang.git
clang source 없이 llvm source 만 설정했을 때 |
clang source 를 추가했을 때 |
Canvas 2D context 를 사용한다면, 특히 WebGL profiling 을 사용한다면 비디오 adapter 를 구분할 수 있다. 일반적인 font 를 rendering 할 때 그래픽 카드 드라이버마다 다른 영향을 준다.
이렇게 만든 화면은 memory 상에 있게 되는데, 이 화면을 toDataURL() 함수를 이용해서 추출한다. toDataURL() 함수가 binary image 파일을 base64-encoding 된 문자열로 변환해서 보여준다.
그래서 이 string 을 MD5 hashing 을 할 수도 있고, PNG file 마지막에서부터 16 ~12 byte 에 있는 IDAT chunk 로 부터 CRC checksum을 추출할 수도 있다.
이것이 Canvas Fingerprint 가 된다고 한다.
// Text with lowercase/uppercase/punctuation symbols var txt = "BrowserLeaks,com <canvas> 1.0"; ctx.textBaseline = "top"; // The most common type ctx.font = "14px 'Arial'"; ctx.textBaseline = "alphabetic"; ctx.fillStyle = "#f60"; ctx.fillRect(125,1,62,20); // Some tricks for color mixing to increase the difference in rendering ctx.fillStyle = "#069"; ctx.fillText(txt, 2, 15); ctx.fillStyle = "rgba(102, 204, 0, 0.7)"; ctx.fillText(txt, 4, 17);
42 4D 3A 00 00 00 00 00 00 00 36 00 00 00 28 00 00 00 01 00 00 00 01 00 00 00 01 00 18 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00ㅁ file size
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF이렇게 된다. 이러면 가로줄 하나는 15-byte 가 된다. 그럼 4-byte로 나누어 떨어지지 않는다. 그래서bitmap 으로 저장하게 되면
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00이렇게 00(null-byte) 을 붙여서 4-byte로 나누어 떨어지게 한다.