수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1693802
  • Today | 153
  • Yesterday | 588

Unix & Linux/Kernel2007/05/04 16:09

Kprobes를 이용한 커널 디버깅

printk's를 리눅스 커널에 삽입하기
Level: Intermediate


Prasanna S. Panchamukhi
Developer, Linux Technology Center, IBM India Software Labs
2004년 8월 19일

printk를 사용하여 리눅스 커널에서 디버깅 정보를 수집하는 것은 잘 알려진 방법이다. Kprobes를 사용하면 커널을 재부팅 할 필요가 없다. 2.6 커널과 결합된 Kprobes는 printk's를 동적으로 삽입할 때 경량의, 비파괴적인 강력한 메커니즘을 제공한다. 커널 스택 트레이스, 커널 데이터 구조, 레지스터 같은 디버그 정보를 기록하는 것은 결코 쉬운 것은 아니다.
Kprobes는 중단점을 실행 커널에 삽입할 수 있도록 하는 리눅스의 단순하고 간단한 메커니즘이다. Kprobes는 어떤 커널 루틴으로도 들어 갈 수 있고 인터럽트 핸들러에서 정보를 비파괴적으로 모을 수 있는 인터페이스를 제공한다. 프로세서 레지스트리와 글로벌 데이터 구조 같은 디버깅 정보는 Kprobes를 사용하여 쉽게 수집될 수 있다.

Kprobes는 실행 커널에서 주어진 주소에 중단점 명령을 동적으로 작성하여 프로브를 삽입한다. 검사된 명령을 실행하면 중단점 오류가 된다. Kprobes는 중단점 핸들러로 들어가서 디버깅 정보를 모은다.

설치
Kprobes를 설치하려면 Kprobes 홈페이지 (참고자료)에서 최신 패치를 다운로드 한다. kprobes-2.6.8-rc1.tar.gz에 tar 파일 이름이 붙여질 것이다. tar를 풀고 이를 리눅스 커널에 적용한다:

$tar -xvzf kprobes-2.6.8-rc1.tar.gz
$cd /usr/src/linux-2.6.8-rc1
$patch -p1 < ../kprobes-2.6.8-rc1-base.patch

Kprobes는 SysRq키를 사용하는데 이는 DOS 시절에 만들어진 것이다. (참고자료) Scroll Lock키의 왼쪽으로 SysRq키를 발견하게 될 것이다; 종종 Print Screen이라는 라벨이 붙기도 한다. SysRq키를 Kprobes에서 실행하려면 kprobes-2.6.8-rc1-sysrq.patch 패치를 붙인다:

$patch -p1 < ../kprobes-2.6.8-rc1-sysrq.patch

커널을 make xconfig/ make menuconfig/ make oldconfig 로 설정하고 CONFIG_KPROBES와 CONFIG_MAGIC_SYSRQ 플러그가 작동하도록 한다. 새로운 커널을 구현하여 부팅한다. 이제 printk's를 삽입하고 간단한 Kprobes 모듈을 작성하여 동적으로 디버깅 정보를 모을 준비가 된 것이다.

Kprobes 모듈 작성하기
각 프로브에 struct kprobe kp 구조를 할당해야 할 것이다. (include/linux/kprobes.h 참조)





커널 루틴의 주소 얻기
등록하는 동안 프로브를 삽입 할 커널 루틴 주소를 지정해야 한다. 다음 메소드 중 하나를 사용하여 커널 루틴 주소를 얻는다:

System.map 파일에서 직접 주소를 얻기
예를 들어, do_fork의 주소를 받으려면, 명령행에서 $grep do_fork /usr/src/linux/System.map을 실행한다.
nm 명령어 사용하기
$nm vmlinuz |grep do_fork
/proc/kallsyms 파일에서 주소 얻기
$cat /proc/kallsyms |grep do_fork
kallsyms_lookup_name() routine 사용하기
이 루틴은 kernel/kallsyms.c 파일에서 정의되고 이를 사용하려면 CONFIG_KALLSYMS 를 실행시키면서 커널을 컴파일 해야 한다. kallsyms_lookup_name() 은 커널 루틴 이름을 스트링으로 취하고 그 커널 루틴의 주소를 리턴한다. 예를 들면, kallsyms_lookup_name("do_fork")이다.
init_module에서 프로브를 등록한다:




일단 프로브가 등록되면 모든 쉘 명령어의 실행은 do_fork으로의 호출이 된다. 그리고 콘솔에 printk's가 보일 것이다. 또는 dmesg 를 실행해서도 볼 수 있다. 끝났을 때 프로브의 등록을 해지하는 것을 기억하라:

unregister_kprobe(&kp);

다음 아웃풋은 Kprobes의 주소이다. eflags의 컨텐츠는 다음을 등록한다:

$tail -5 /var/log/messages

Jun 14 18:21:18 llm05 kernel: pre_handler: p->addr=0xc01441d0, eflags=0x202
Jun 14 18:21:18 llm05 kernel: post_handler: p->addr=0xc01441d0, eflags=0x196

오프셋
루틴의 시작 또는 함수의 오프셋에 printk's를 삽입할 수 있다. (오프셋은 명령 영역에 있어야 한다.) 다음 코드 샘플은 오프셋을 계산하는 방법이다. 우선, 객체 파일에서 머신 명령을 역어셈블하고 파일로 저장한다:

$objdump -D /usr/src/linux/kernel/fork.o > fork.dis

다음과 같이 된다:




오프셋 0x22c4에 프로브를 삽입하려면 0x22c4 - 0x22b0 = 0x14 루틴의 시작부터 관련 오프셋을 가져다가 이 오프셋을 do_fork 0xc01441d0 + 0x14의 주소에 추가한다. (do_fork의 주소를 확인하려면 $cat /proc/kallsyms | grep do_fork. 을 실행한다.)

do_fork 0x22c4 - 0x22b0 = 0x14의 관련 오프셋을 kallsyms_lookup_name("do_fork")의 아웃풋에 추가할 수도 있다; 따라서: 0x14 + kallsyms_lookup_name("do_fork");

커널 데이터 구조 덤핑하기
이제 시스템상에서 실행되는 모든 작업들의 몇몇 요소들을, 데이터 구조를 덤핑하기위해 변경했던 Kprobe post_handler를 사용하여 덤핑한다.





이 모듈은 do_fork의 오프셋에 삽입되어야 한다.




SysRq 키 실행하기
SysRq 키의 지원으로 이미 컴파일 했다. 이를 실행시켜 보자:

$echo 1 > /proc/sys/kernel/sysrq

이제 Alt+SysRq+W를 사용하여 콘솔 또는 /var/log/messages 에서 모든 삽입된 커널 프로브를 볼 수 있다.




Kprobes를 이용한 더 나은 디버깅
프로브 이벤트 핸들러는 시스템 중단점 인터럽트 핸들러에 대한 확장으로서 실행되기 때문에 시스템 장치의 의존성이 거의 없거나 아예 없다. 또한 대부분의 적대적 환경-인터럽트, 태스크 타임부터 실행불가, 콘텍스트 간 변환, SMP 실행의 코드 경로 까지-에 삽입될 수 있다. 이 모두가 시스템 퍼포먼스에 나쁜 영향을 끼치지 않는다.

Kprobes를 사용할 때의 이점은 많다. printk's는 커널을 재구현 및 재부팅 하지 않고 삽입될 수 있다. 프로세서 레지스터는 기록될 될 수 있고, 심지어 디버깅을 위해 변경될 수도 있다. 물론 시스템 파괴는 전혀 없다. 이와 유사하게 리눅스 커널 데이터 구조 역시 기록될 수 있고 비파괴적으로 변경될 수 있다. Kprobes를 사용하여 SMP 시스템 상의 경쟁 조건을 디버깅할 수 있다. 이로서 재구현과 재부팅이라는 고통에서 해방되는 것이다. 커널 디버깅이 이전보다 빠르고 쉽게 될 수 있다는 것을 경험하게 될 것이다.


http://www-903.ibm.com/developerworks/k ··· bes.html
"Kernel" 카테고리의 다른 글
  • 리눅스 커널의 이해(2): 리눅스 커널의 동작 (0)2007/05/10
  • 리눅스 커널의 이해(1) : 커널의 일반적인 역할과... (0)2007/05/10
  • Kprobes를 이용한 커널 디버깅 (0)2007/05/04
  • KernelAnalysis-HOWTO (0)2007/04/30
  • Linux x86 kernel function hooking emulation (0)2006/11/24
2007/05/04 16:09 2007/05/04 16:09
Posted by webdizen
Tags Kprobes, 커널 디버깅
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2900

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1 ... 353 354 355 356 357 358 359 360 361 ... 3009  Next»

RSS HanRSS
Blog Image
webdizen
이곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (3009)
Webdizen (141)
Life (6)
Diary (16)
Blog (9)
IDEA (2)
Travel (10)
Book (16)
Photo (7)
Movie (8)
Music (14)
Leisure Sports (10)
Funny (6)
Hardware (121)
Software (120)
Windows (5)
Unix & Linux (120)
Installation (5)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (804)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (2)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (4)
Network (66)
Web (79)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • Calculator
  • SASS
  • 인간
  • Registry
  • Paging
  • DOM
  • Conference
  • 프로필
  • 설치
  • 네트워크 라우터
  • Override
  • 교육대학
  • Email
  • SAX Filters
  • 세션빈
  • Java
  • SK Telecom
  • 스탠포드
  • 보안
  • 강원대학교

Recent Articles

  • 트위터(Twitter)의 시작!.
  • 청년 리더의 조건.
  • 애플의 타블렛 PC - 아이패드....
  • 미래의 인터페이스 - 육감 기....
  • 기초발성법 동영상 강좌.

Recent Comments

  • 학교 과제물중 쓰레드에 대하....
    장진혁 03/17
  • 관리자만 볼 수 있는 댓글입....
    비밀방문자 03/12
  • 상대방의 이야기를 열심히 경....
    DoNuts 03/03
  • Lots of students know techn....
    Bobbi35Shannon 02/25
  • 좋은글 잘 보고 갑니다..
    Und_hacker 01/08

Recent Trackbacks

  • printf,scanf를 이용한 형식....
    yundream의 프로그래밍 이야기 03/10
  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 2009
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007

Archive

  • 2010/02 (1)
  • 2010/01 (6)
  • 2009/12 (5)
  • 2009/09 (3)
  • 2009/08 (1)

Calendar

«   2010/03   »
일 월 화 수 목 금 토
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.