Linux Kernel(4.14) Hacks

rousalome.egloos.com

포토로그 Kernel Crash




[라즈베리파이] 리눅스 커널: 전처리 파일 추출 dev utility

라즈베리파이3 용 커널 코드를 다운로드 받고 아래 패치를 적용하여 커널 빌드를 하면 전처리 파일을 추출할 수 있습니다.
austin.kim@LGEARND7B16:~/src/raspberry_kernel/linux$ git diff Makefile
diff --git a/Makefile b/Makefile
index 4a7e6df..313dbbe 100644
--- a/Makefile
+++ b/Makefile
@@ -395,6 +395,7 @@ KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs
                   -fno-strict-aliasing -fno-common
                   -Werror-implicit-function-declaration
                   -Wno-format-security
+                  -save-temps=obj
                   -std=gnu89
 KBUILD_CPPFLAGS := -D__KERNEL__
 KBUILD_AFLAGS_KERNEL :=

위와 같이 메이크 파일을 수정하여 커널 빌드를 완료하면 전처리 파일이 생성됩니다. 아래 명령어로 전처리 파일을 각 커널 디렉토리에서 확인할 수 있습니다.
austin.kim@LGEARND7B16:~/src/raspberry_kernel/linux$ find . -name *.i | more
./mm/.tmp_filemap.i
./mm/.tmp_dmapool.i
./mm/.tmp_highmem.i
./mm/.tmp_mmu_context.i
./mm/.tmp_slab_common.i
./mm/.tmp_readahead.i
./mm/.tmp_frontswap.i
./mm/.tmp_page-writeback.i
./mm/.tmp_list_lru.i
./mm/.tmp_mlock.i
./mm/.tmp_pagewalk.i
./mm/.tmp_page_counter.i
./mm/.tmp_gup.i
./mm/.tmp_msync.i
./mm/.tmp_shmem.i
./mm/.tmp_frame_vector.i
./mm/.tmp_page_alloc.i
./mm/.tmp_maccess.i

전처리 파일을 하나 열어보면 아래와 같이 매크로로 선언된 코드를 직접 확인할 수 있습니다.
austin.kim@LGEARND7B16:~/src/raspberry_kernel/linux$ vi ./mm/.tmp_filemap.i
 struct page *grab_cache_page_write_begin(struct address_space *mapping,
      unsigned long index, unsigned flags)
 {
  struct page *page;
  int fgp_flags = 0x00000002|0x00000008|0x00000004;

  if (flags & 0x0004)
   fgp_flags |= 0x00000010;

  page = pagecache_get_page(mapping, index, fgp_flags,
    mapping_gfp_mask(mapping));
  if (page)
   wait_for_stable_page(page);

  return page;
 }

ssize_t __generic_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
{
 struct file *file = iocb->ki_filp;
 struct address_space * mapping = file->f_mapping;
 struct inode *inode = mapping->host;
 ssize_t written = 0;
 ssize_t err;
 ssize_t status;


 (current_thread_info()->task)->backing_dev_info = inode_to_bdi(inode);
 err = file_remove_privs(file);
 if (err)
  goto out;

 err = file_update_time(file);
 if (err)
  goto out;

 if (iocb->ki_flags & (1 << 2)) {
  loff_t pos, endbyte;

이렇게 리눅스 커널 코드를 분석할 때 반드시 전처리 파일을 열어서 함께 코드 구현부를 봐야 합니다. 그래야 매크로 함수 뒷 편에 숨어 있는 실제 코드를 확인할 수 있습니다.



덧글

댓글 입력 영역