Skip to content

algorithm and 디버깅을 통해 배우는 리눅스 커널의 구조와 원리

leetcode - 1296(Remove Nth Node From End of List)

 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// Remove Nth Node From End of List
// time duration: about 30 minutes
// 핵심은 n 개 전의 item을 지우는 것이기 때문에 dealy를 주고 지우는 것

#include<stdio.h>

// Definition for singly-linked list.
struct ListNode {
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* ptr1=head;
        ListNode* ptr2=head;
        for(int i=0; i<n; ++i)
        {
            ptr1 = ptr1->next;
        }
        if(ptr1!=nullptr)
        {
            while(ptr1->next!=nullptr)
            {
                ptr1=ptr1->next;
                ptr2=ptr2->next;
            }
            if(ptr2->next==nullptr)
            {
                head = head->next;
                return head;
            }else
            {
                ptr2->next = ptr2->next->next;
                return head;
            }
        }else
        {
            head = head->next;
            return head;
        }
    }
};

디버깅을 통해 배우는 리눅스 커널의 구조와 원리

  • 2장

  • 커널 빌드(리눅스에서 소스코드 받아서 빌드 하면 됨)

  • 리눅스 커널의 소스 구조

    • arch

    • arm: 32비트 계열 ARM 아키텍처 코드가 있으며, 라즈비안도 이 하부 디렉터리 코드를 실행합니다.

    • arm64: 64비트 계열 ARM 아키텍처 코드가 있습니다.
    • x86: 폴더 이름과 같이 인텔 x86 아키텍처 코드가 있습니다.

    • include

    • Documentation: 커널 기술 문서가 있는 폴더. 커널 개발자를 대상으로 작성된 문서이기에 꽤 어려움

    • kernel

    • irq: 인터럽트 관련 코드

    • sched: 스케줄링 코드
    • power: 커널 파워 매니지먼트 코드
    • locking: 커널 동기화 관련 코드
    • printk: 커널 콘솔 관련 코드
    • trace: trace관련 코드

    위 디렉터리들에는 아키텍처와 무관한 커널 공통 코드가 있으며, 아키텍처별로 동작하는 커널 코드는 arch/*kernel/에 있습니다.

    • mm: memory management의 약자로 가상 메모리 및 페이징 관련 코드가 들어 있습니다.

    • 아키텍처별로 동작하는 메로리 관리 코드는 arch/*/mm 아래에 있습니다.

    • drivers: 모든 시스템의 디바이스 드라이버 코드가 있습니다. 하부 디렉터리에 드라이버 종류별 소스가 들어 있습니다.

    • fs: 모든 파일 시스템 코드가 담긴 폴더입니다.

    • lib: lib 디렉터리에는 커널에서 제공하는 라이브러리 코드가 있습니다. 아키텍처에 종속적인 라이브러리 코드는 arch/*/lib/에 있습니다.

  • 주요 바이너리 유틸리티

    • objdump: 라이브러리나 ELF 형식의 파일을 어셈블리어로 출력
    • 헤더정보 확인: objectdump -x vmlinux
    • 어셈블리 코드를 출력: objectdump -d vmlinux
    • map파일을 열어보면, 심벌별 주소를 확인 가능.
    • objdump --start-address=[시작주소] --stop-address=[끝주소] -d vmlinux
    • as: 어셈블러
    • ld: 링커
    • addr2line: 주소를 파일과 라인으로 출력
    • nm: 오브텍트 파일의 심벌을 출력
    • readelf: ELF 파일의 내용을 출력