토론:과제/LG/2013

Retired DISLab
< 토론:과제(버전 사이의 차이)
이동: 둘러보기, 찾기
(2014-05-20)
 
(한 사용자의 중간의 편집 3개 숨겨짐)
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-05-30 ====
 
*[[media: 140530_opensyscall.hwp | 140530_opensyscall(hwp)]]
 
 
== 신희영 ==
 
====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 분석]]
 

2014년 6월 10일 (화) 20:52 현재 판

개인 도구
이름공간
변수
행위
둘러보기
구성원
연구
연구실
기타
도구모음
인쇄/내보내기