|
|
(사용자 2명의 중간의 편집 4개 숨겨짐) |
1번째 줄: |
1번째 줄: |
− | {{ambox|text=교수가 콤멘트하는 것은 형광색으로 표기}}
| + | * [[과제/LG/2013/황세영 분석자료]]로 이동 |
− | __NOTOC__
| + | * [[과제/LG/2013/김건우 분석자료]]로 이동 |
− | == 황세영 ==
| + | * [[과제/LG/2013/신희영 분석자료]]로 이동 |
| + | |
| * 관련 사이트들 | | * 관련 사이트들 |
| ** 커널 맵 : http://www.makelinux.net/kernel_map/ | | ** 커널 맵 : http://www.makelinux.net/kernel_map/ |
8번째 줄: |
9번째 줄: |
| ** 안드로이드 소스 코드 다운로드 : http://source.android.com/source/downloading.html | | ** 안드로이드 소스 코드 다운로드 : http://source.android.com/source/downloading.html |
| ** sys_open 분석 : http://flylhs83.tistory.com/61 | | ** sys_open 분석 : http://flylhs83.tistory.com/61 |
− | === 2014-03-31 ===
| |
− | {{y|날짜별로 절로 표기해야 수정하기 좋단다. 이처럼 절로 표기하거라.}}
| |
− | * [[media: 140331_컴공과세미나자료.zip | 컴공과세미나자료(zip)]]
| |
− | * [[media: 140331_리눅스커널READ부분.hwp | 리눅스커널READ부분(hwp)]] / [[media: 140331_리눅스커널READ부분.pdf | 리눅스커널READ부분(pdf)]] - {{y| PDF로 올려야 읽을 수 있다.}}
| |
− | ** 컴공과세미나자료의 '리눅스 커널 구조 분석' 자료에 나온 READ부분 함수를 모두 정리해둔 것
| |
− | ** 각 함수의 시작 바로 전 괄호는 커널에서의 위치를 나타냄
| |
− | * vfs_read (소스 테스트)
| |
− | <source lang="c">
| |
− | // Virtual File System
| |
− | // fs/read_write.c
| |
− | ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos){
| |
− | ssize_t ret;
| |
− |
| |
− | if (!(file->f_mode & FMODE_READ))
| |
− | return -EBADF;
| |
− | if (!file->f_op || (!file->f_op->read && !file->f_op->aio_read))
| |
− | return -EINVAL;
| |
− | if (unlikely(!access_ok(VERIFY_WRITE, buf, count)))
| |
− | return -EFAULT;
| |
− |
| |
− | ret = rw_verify_area(READ, file, pos, count);
| |
− | if (ret >= 0) {
| |
− | count = ret;
| |
− | if (file->f_op->read) // read에 해당하는 'ext4 파일 연산 함수 테이블'의 함수는 do_sync_read
| |
− | ret = file->f_op->read(file, buf, count, pos);
| |
− | else
| |
− | ret = do_sync_read(file, buf, count, pos);
| |
− | if (ret > 0) {
| |
− | fsnotify_access(file);
| |
− | add_rchar(current, ret);
| |
− | }
| |
− | inc_syscr(current);
| |
− | }
| |
− | return ret;
| |
− | }
| |
− | </source>
| |
− |
| |
− | === 2014-04-02 ===
| |
− | * The Virtual Filesystem (가상 파일시스템)
| |
− | ** =Virtual File Switch, VFS
| |
− | ** 리눅스는 가상 파일시스템을 사용하여 다양한 디스크 유형을 지원
| |
− | ** 커널의 서브시스템으로, 표준 유닉스 파일시스템과 관련한 모든 시스템 콜을 처리하는 커널 소프트웨어 계층
| |
− | ** 모든 파일시스템들은 VFS을 필요로 하며, VFS는 여러 종류의 파일시스템에 대해 공통 인터페이스를 제공
| |
− | ** 지원하는 모든 파일시스템을 표현할 수 있는 공통 파일 모델 도입
| |
− | *** 각각에 해당하는 특정 파일시스템을 구현할 때는 반드시 자신의 물리적인 구성을 VFS의 공통 파일 모델로 변환해야 함
| |
− | ** 예를들어 파일은 커널 메모리에서 file로 자료 구조를 표현함. file 내부에는 f_op라는 함수 포인터가 있고, 그 중 read가 있으며, 파일 시스템의 실제 함수에 대한 포인터에 해당함.
| |
− | *** 따라서 file->f_op->read(..)와 같은 형태로 모든 파일 시스템에 대한 read 함수를 호출 가능.
| |
− | ** 위와 같은 공통 파일 모델(file)은 객체 지향적인 방식을 사용했지만, 성능 향상을 위해 객체 지향 언어를 사용하지 않음.
| |
− | *** 구조체에 변수와 함수 구조체에 대한 포인터를 둠. 일반적으로 함수 구조체에 대한 포인터는 'op'로 표현
| |
− | *** 함수 구조체는 실제 구현되어 있는 함수로 연결됨.
| |
− | *** 예를들어 ext4 파일 시스템에서 file->f_op->read(..)는 실제로는 do_sync_read함수를 호출
| |
− | ** VFS는 독자적으로 저수준 프로시저를 호출하지 않고 파일 연산을 실행할 수 있음. 따라서 필요하다면 특정 파일시스템에 의존하는 '일반' 파일시스템으로 볼 수도 있음
| |
− | *** 예를들어 프로세스가 열린 파일을 닫으려 할 때는 디스크 파일을 건드리지 않고 VFS에 대응하는 파일 객체를 해제함
| |
− | * 공통 파일 모델(file)
| |
− | ** 공통 파일 모델은 수퍼블록 객체, 아이노드 객체, 파일 객체, 디엔트리 객체로 나뉨
| |
− | ** 수퍼블록 객체 : 마운트시킨 파일시스템 정보를 저장하며 file 구조체에서 필드명은 대부분 's_'로 시작.
| |
− | ** 아이노드 객체 : 특정 파일에 대한 일반 정보를 저장. 아이노드 번호는 파일시스템 내 각 파일을 유일하게 식별함. file 구조체에서 필드명은 대부분 'i_'로 시작
| |
− | ** 파일 객체 : 열린 파일과 프로세스 사이의 상호 작용과 관련한 정보를 저장. file 구조체에서 필드명은 대부분 'f_'로 시작
| |
− | ** 디엔트리 객체 : 디렉토리 항목과 대응하는 파일간 연결에 대한 정보를 저장. file 구조체에서 필드명은 'd_'로 시작
| |
− | * [[media: 140402_READ부분_위치정리.xlsx | 리눅스커널READ부분_위치정리(xlsx)]]
| |
− | ** 2014-03-31에 올린 '리눅스커널READ부분'에서 함수의 위치만 정리한 액셀 파일
| |
− | * [[media: 140402_SYSCALL_DEFINE3_분석.pdf | SYSCALL_DEFINE3_분석(pdf)]]
| |
− |
| |
− | === 2014-04-07 ===
| |
− | * [[media: 140407_커널분석.pdf | 140407_커널분석(pdf)]]
| |
− | ** vfs_read부터 generic_make_request 까지
| |
− | *** {{y| bio 구조와 requst queue의 구조 및 이들의 동작방법을 자세히 파악하는 것이 중요하다. 꼼꼼히 코드를 읽어보기 바란다.}}
| |
− |
| |
− | === 2014-04-16 ===
| |
− | * [[media: 140416_커널분석.pdf | 140416_커널분석(pdf)]]
| |
− | ** blk_init_queue부터 __blk_run_queue_uncond 까지
| |
− | * 이하 bio 구조와 request queue의 구조 및 이들의 동작방법을 파악하는 것이 중요하다고 하셔서 블록 장치의 동작 방식에 대한 정리를 추가합니다.
| |
− | ** 위의 커널분석은 이 내용을 따로 정리하기 전에 적어둔 것이라 포함되어 있지 않습니다. 다음 번에 올릴 때 이 내용도 추가해 두겠습니다.
| |
− | * 블록 장치 : 일정 크기(블록) 단위로 접근하는 장치로 대표적인 예로 하드 디스크
| |
− | ** 블록 장치는 파일 시스템에 의해 간접적으로 접근하게 되어 있으며 VFS에 의해 어떤 파일 시스템이라도 관계없이 같은 방식으로 이용
| |
− | * 블록IO의 시작 지점은 submit_bio()로, 인자로 READ or WRITE와 bio 구조체를 받음.
| |
− | ** READ : 디스크에 저장된 데이터를 메모리로 옮김, WRITE : 메모리에 저장된 데이터를 디스크로 옮김
| |
− | ** bio는 해당 연산에 대한 모든 정보를 포함하는 구조체로써, IO를 수행할 디스크 영역의 정보와 IO를 수행할 메모리 영역의 정보를 포함
| |
− | ** 현재 bio는 세그먼트를 bio_vec 구조체를 통해 저장
| |
− | *** 세그먼트는 기본적으로 페이지의 형태로 저장되므로 이에 대한 모든 정보가 포함하며 장치가 한 IO당 여러 세그먼트를 지원할 수 있으므로 이를 벡터(배열) 형태로 저장
| |
− | *** BIO 구조체 하나가 BIO_VEC 구조체를 배열로 관리하며 여러곳에 흩어진 블록들을 관리하여 IO연산을 수행 (scatter-gather I/O)
| |
− | *** [[media: bio구조체관계.jpg | bio구조체관계(jpg)]]
| |
− | **** bio구조체와 bio_vec구조체, 세그먼트의 관계 (출처 : http://blog.naver.com/kkn2988?Redirect=Log&logNo=141641230)
| |
− | ** struct bio 필드
| |
− | *** bi_sector : 디스크 상의 연관된 섹터 주소
| |
− | *** bi_next : request 큐 리스트
| |
− | *** bi_bdev : 연관된 블록 디바이스
| |
− | *** bi_flags : 상태, 명령 플래그
| |
− | *** bi_rw : 하위 비트는 읽기/쓰기, 상위 비트는 우선순위
| |
− | *** bi_vcnt : bi_io_vec 리스트 길이(개수)
| |
− | *** bi_idx : bi_io_vec의 현재 인덱스
| |
− | *** bi_phys_segments : 물리 주소를 병합한 이후의 세그먼트 개수
| |
− | *** bi_size : 남은 I/O 개수
| |
− | *** bi_seg_front_size : 합칠 수 있는 첫 세그먼트 크기
| |
− | *** bi_seg_back_size : 합칠 수 있는 마지막 세그먼트 크기
| |
− | *** bi_max_vecs : 가능한 bi_io_vec 리스트의 최대 길이
| |
− | *** bi_comp_cpu : 완료된 CPU
| |
− | *** bi_cnt : 사용 빈도수
| |
− | *** bi_io_vec : bi_io_vec 리스트
| |
− | *** bi_end_io : I/O 완료 함수포인터
| |
− | *** bi_private : 소유자의 사적인 메소드
| |
− | *** bi_destructor : 소멸자 메소드
| |
− | *** bi_inline_vecs[0] : 내부적으로 메모리 할당시 사용되는 bi_io_vec 배열
| |
− | ** struct bio_vec 필드
| |
− | *** bv_page : 해당 버퍼가 놓여있는 물리적인 페이지로의 포인터
| |
− | *** bv_len : 이 버퍼의 바이트 길이
| |
− | *** bv_offset : 페이지 내에서의 버퍼의 위치(바이트 오프셋)
| |
− | ** bio는 디스크 상에서 연속된 영역 만을 나타낼 수 있음. 따라서 접근하려는 데이터가 디스크 상에서 여러 부분으로 나뉘어 있다면 각각에 해당되는 bio가 할당되어 submit_bio()함수를 통해 각각 전달됨
| |
− | * request 구조체는 블록 디바이스의 블록 IO 요청을 정의하며, request_queue는 각각의 블록 IO 요청을 담고 있음
| |
− | * [[media: request_queue.jpg | request_queue(jpg)]]
| |
− | ** request_queue와 request 그리고 bio의 관계 (출처 : http://blog.naver.com/kkn2988?Redirect=Log&logNo=141641230)
| |
− | ※
| |
− | === 2014-04-26 ===
| |
− | * [[media: 140426_OPEN.hwp | OPEN 과정(hwp)]]
| |
− | * [[media: 140426_WRITE.hwp | WRITE 과정(hwp)]]
| |
− | * [[media: 140426_분석.pptx | 분석(pptx)]]
| |
− | === 2014-04-26 ===
| |
− | * [[media: 140427_황세영_분석.pptx | 분석(pptx)]]
| |
− | === 2014-05-02 ===
| |
− | * [[media: 140502_황세영_디바이스드라이버정리.docx | 디바이스드라이버정리(docx)]]
| |
− | === 2014-05-09 ===
| |
− | * [[media: 140509_황세영_디바이스드라이버정리.pdf | 디바이스드라이버정리(pdf)]]
| |
− | === 2014-05-12 ===
| |
− | * [[media: 140512_황세영_디바이스드라이버정리.pdf | 디바이스드라이버정리(pdf)]]
| |
− | ** 이미지에 사용 struct를 추가
| |
− | * [[SYTest]], [[plantuml test]]
| |
− | ** [[media: 포함struct리스트.txt | 포함struct리스트(txt)]]
| |
− | === 2014-05-15 ===
| |
− | * 1차 미팅
| |
− | ** [[media: 140515_황세영_IO요청_처리_과정.pptx | I/O요청 처리 과정(pptx)]]
| |
− | * 2차 미팅
| |
− | ** [[media: 140515_황세영_IO요청_처리_과정_2차.pptx | I/O요청 처리 과정_2차(pptx)]]
| |
− | *** [[bio_reqeust_requestqueue]]
| |
− | ==== 2014-05-19 ====
| |
− | *[[media: 140519_통합자료.pptx | 140519통합자료(pptx)]]
| |
− | *[[media: 140519_통합자료_축약.pptx | 140519통합자료(축약)(pptx)]]
| |
− | ==== 2014-05-20 ====
| |
− | *<del>[[media: 140520_통합자료_축약_황세영.pptx | 140520통합자료_축약, 황세영부분)(pptx)]]</del>
| |
− | *<del>[[media: 140520_통합자료_축약_황세영_김건우.pptx | 140520통합자료_축약(건우,세영 부분)(pptx)]]</del>
| |
− | *<del>[[media: 140520_통합자료_축약_황세영_김건우_v2.pptx | 140520통합자료_축약_v2(건우,세영 부분)(pptx)]]</del>
| |
− | *<del>[[media: 140520_통합자료_축약_v3.pptx | 140520통합자료_축약_v3(건우,세영,희영 전체)(pptx)]]</del>
| |
− | *[[media: 140520_통합자료_축약_v4.pptx | 140520통합자료_축약_v4(건우,세영,희영 전체)(pptx)]]
| |
− |
| |
− | == 김건우 ==
| |
− | ==== 2014-04-03 ====
| |
− | *[[media: 140402_가상파일시스템_1.pdf | 가상파일시스템_1(pdf)]]
| |
− | ==== 2014-04-05 ====
| |
− | *[[media: 140405_가상파일시스템_2.pdf | 가상파일시스템_2(pdf)]]
| |
− | *[[media: 140405_SYSCALL_DEFINE3.pdf | SYSCALL_DEFINE3(pdf)]]
| |
− | **vfs_read()호출
| |
− | *[[media: 140405_vfs_read2.0.pdf | vfs_read(pdf)]]
| |
− | **rw_verify_area()호출
| |
− | **do_sync_read()호출
| |
− |
| |
− | ==== 2014-04-06 ====
| |
− | *[[media: 140406_rw_verify_area.pdf | rw_verify_area(pdf)]]
| |
− | **Read/write를 위한 permission획득을 위한 verifying
| |
− | **Maximum number of bytes to read 를 return
| |
− | ** {{y|코드를 이해할 만 하더냐? 커널에 관한 책을 읽어보고 코드를 읽어야한다.}}
| |
− | ==== 2014-04-08 ====
| |
− | *[[media: 140408_do_sync_read1.1.pdf | do_sync_read(pdf)]]
| |
− | **generic_file_aio_read()호출
| |
− | ==== 2014-04-10 ====
| |
− | *[[media: 140410_file_read_요약.pdf | file_read_요약(pdf)]]
| |
− | **커널관련 책에서 generic_file_aio_read까지 요약
| |
− | ==== 2014-04-15 ====
| |
− | *[[media: 140415_file_aio_read.pdf | generic_file_aio_read(pdf)]]
| |
− | **do_generic_file_read()호출
| |
− | *[[media: 140415_do_generic_file_read.pdf | do_generic_file_read(pdf)]]
| |
− | **address_space_operations의 ext4_aops.readpage()호출
| |
− | *[[media: 140415_ext4_read.pdf | ext4_readpage(pdf)]]
| |
− | **ext4_read_inline_page() -> ext4_read_inline_data()호출
| |
− | **mpage_readpage()호출
| |
− | ==== 2014-04-26 ====
| |
− | *[[media: 140426_open_sys_call.pptx | open_sys_call분석(pptx)]]
| |
− | ==== 2014-04-30 ====
| |
− | * '''[[Linux kernel open system call 분석]]'''
| |
− | ==== 2014-05-02 ====
| |
− | *[[media: 140502_open_sys_call_분석.hwp | open_sys_call_분석(hwp)]]
| |
− | *[[media: 140502_open_sys_call_분석.pdf | open_sys_call_분석(pdf)]]
| |
− | ==== 2014-05-09 ====
| |
− | *[[media: 140509_open_call_flow.hwp | open_call_flow(hwp)]]
| |
− | ==== 2014-05-12 ====
| |
− | *[[media: 140512_read_call_flow.hwp | read_call_flow(hwp)]]
| |
− | * [[kw_struct_read]]
| |
− |
| |
− | ==== 2014-05-14 ====
| |
− | * [[kw_struct_write]]
| |
− | *[[media: 140512_구조체.hwp | 구조체(hwp)]]
| |
− |
| |
− | ==== 2014-05-15 ====
| |
− | * [[open_flow]]
| |
− | *[[media: 140515_open_call.hwp | 140515_open_call(hwp)]]
| |
− | ==== 2014-05-16 ====
| |
− | *[[media: 140516_open_call_발표자료_v1.1.pptx | 140516_open_call_발표자료_v1.1(pptx)]]
| |
− |
| |
− | ==== 2014-05-19 ====
| |
− | *[[media: 140519_통합자료.pptx | 140519통합자료(pptx)]]
| |
− | *[[media: 140519_통합자료_축약.pptx | 140519통합자료(축약)(pptx)]]
| |
− |
| |
− | ==== 2014-05-20 ====
| |
− | *[[media: 140520_opensyscall_발표자료.pptx | 140520_opensyscall_발표자료(pptx)]] - [[media:140520_opensyscall_발표자료_수정참고.pptx | 수정참고]]
| |
− | *[[media: 140520_opensyscall_발표자료_v2.pptx | 140520_opensyscall_발표자료_v2(pptx)]]
| |
− |
| |
− | == 신희영 ==
| |
− | ====2014년 4월 3일====
| |
− | [[media:0403_요약.pdf| 0403_책 요약]]
| |
− | [[media:0403_코드.pdf| 0403_코드 분석]]
| |
− |
| |
− | ====2014년 4월 5일====
| |
− | [[media:0405_요약.pdf| 0405_책 요약]]
| |
− | [[media:0405_코드.pdf| 0405_코드 분석]]
| |
− |
| |
− | ====2014년 4월 10일====
| |
− | [[media:0410_코드.pdf| 0410_코드 분석]]
| |
− | do_generic_file_read 함수
| |
− |
| |
− | ====2014년 4월 14일====
| |
− | [[media:0414_코드.pdf| 0414_코드 분석]]
| |
− | mpage_readpage 함수
| |
− |
| |
− | ====2014년 4월 26일====
| |
− | [[media:read .pptx| read 분석]]
| |
− | read 함수의 흐름 (User - ext4)
| |
− |
| |
− | ====2014년 4월 27일====
| |
− | [[media:0427struct.pdf| 0427_structure]]
| |
− |
| |
− |
| |
− | * {{y|분석한 전후의 소감도 기술해보거라.}}
| |
− | ====2014년 4월 29일====
| |
− | * address_space 구조체 / 14.04.29
| |
− | <source lang="c">
| |
− |
| |
− | address_space 구조체는 inode 구조체와 일대일의 관계이므로 이를 이용해 파일을 구분할 수 있다.
| |
− | 412 struct address_space {
| |
− | 413 struct inode *host; /* owner: inode, block_device */
| |
− | 414 struct radix_tree_root page_tree; '''//페이지 캐시를 관리하는 page구조체는 page_tree멤버와 연결되어 있다.''' /* radix tree of all pages */
| |
− | '''//radix_tree 는 트리 구조의 일종으로 페이지 캐시의 index를 키로 하고 있어 파일 데이터가 캐시되어 있는지 빠르게 판정할 수 있다.'''
| |
− |
| |
− | 415 spinlock_t tree_lock; /* and lock protecting it */
| |
− | 416 unsigned int i_mmap_writable;/* count VM_SHARED mappings */
| |
− | 417 struct rb_root i_mmap; /* tree of private and shared mappings */
| |
− | 418 struct list_head i_mmap_nonlinear;/*list VM_NONLINEAR mappings */
| |
− | 419 struct mutex i_mmap_mutex; /* protect tree, count, list */
| |
− | 420 /* Protected by tree_lock together with the radix tree */
| |
− | 421 unsigned long nrpages; /* number of total pages */
| |
− | 422 pgoff_t writeback_index;/* writeback starts here */
| |
− | '''423 const struct address_space_operations *a_ops; /* methods */'''
| |
− | 424 unsigned long flags; /* error bits/gfp mask */
| |
− | 425 struct backing_dev_info *backing_dev_info; /* device readahead, etc */
| |
− | 426 spinlock_t private_lock; /* for use by the address_space */
| |
− | '''427 struct list_head private_list; // private_list로 연결되는 것은 buffer_head구조체이다.''' /* ditto */
| |
− | 428 void *private_data; /* ditto */
| |
− | 429 } __attribute__((aligned(sizeof(long))));
| |
− | </source>
| |
− |
| |
− | * buffer_head 구조체 / 14.04.29
| |
− | <source lang="c">
| |
− | 53 /*
| |
− | 54 * Historically, a buffer_head was used to map a single block
| |
− | 55 * within a page, and of course as the unit of I/O through the
| |
− | 56 * filesystem and block layers. Nowadays the basic I/O unit
| |
− | 57 * is the bio, and buffer_heads are used for extracting block
| |
− | 58 * mappings (via a get_block_t call), for tracking state within
| |
− | 59 * a page (via a page_mapping) and for wrapping bio submission
| |
− | 60 * for backward compatibility reasons (e.g. submit_bh).
| |
− | 61 */
| |
− | 62 struct buffer_head {
| |
− |
| |
− | '''//buffer_head 1개로 1개의 파일블록을 관리한다.
| |
− | //page 구조체의 private멤버와 연결되어 있으므로 이 구조체의 존재 여부는 page구조체의 private멤버로 판단한다.'''
| |
− |
| |
− | 63 unsigned long b_state; // 상태 플래그 /* buffer state bitmap (see above) */
| |
− | 64 struct buffer_head *b_this_page; '''// 같은 페이지의 buffer_head 구조체 리스트''' /* circular list of page's buffers */
| |
− | 65 struct page *b_page; '''//해당 버퍼블록이 속한 page구조체를 가리킨다.''' /* the page this bh is mapped to */
| |
− | 66
| |
− | 67 sector_t b_blocknr; '''//블록 번호''' /* start block number */
| |
− | 68 size_t b_size; /* size of mapping */
| |
− | 69 char *b_data; '''// 데이터를 가리키는 포인터로 페이지 상의 포인터이다.''' /* pointer to data within the page */
| |
− | 70
| |
− | 71 struct block_device *b_bdev;
| |
− | 72 bh_end_io_t *b_end_io; /* I/O completion */
| |
− | 73 void *b_private; /* reserved for b_end_io */
| |
− | 74 struct list_head b_assoc_buffers; /* associated with another mapping */
| |
− | 75 struct address_space *b_assoc_map; '''//블록 특수파일의 address_space구조체를 저장''' /* mapping this buffer is
| |
− | 76 associated with */
| |
− | 77 atomic_t b_count; /* users using this buffer_head */
| |
− | 78 };
| |
− | </source>
| |
− |
| |
− | ====2014년 5월 9일====
| |
− | [[media: do_generic_file_read .pdf| do_generic_file_read 설명]]
| |
− |
| |
− | ====2014년 5월 12일====
| |
− | [[media: generic_file_aio_read.pdf| generic_file_aio_read설명]]
| |
− | [[generic_file_aio_read 함수]]
| |
− |
| |
− | ====2014년 5월 14일====
| |
− | [[media: datastructure.png| generic_file_aio_read data_structure 그림]]
| |
− |
| |
− |
| |
− | ====2014년 5월 16일====
| |
− | [[read(User - ext4)]]
| |
− |
| |
− | [[media:read_ext4 .pptx| read 분석]]
| |
− | [[read(User - ext4) with dataflow]]
| |
− |
| |
− | ====2014년 5월 16일====
| |
− | [[media:read_flow_ .pptx| read 분석]]
| |