Linux 커널: 좋은 초보자를 위한 튜토리얼 [닫기]

Linux 커널: 좋은 초보자를 위한 튜토리얼 [닫기]

나는 개인적인 즐거움을 위해 커널 내부 수정, 패치 적용, 장치 드라이버 및 모듈 작업에 관심이 있습니다.

숙련된 프로그래머를 위한 커널 해킹에 대한 포괄적인 리소스가 있습니까?

답변1

**TODO** +editPic: Linux Kernel Developer -> (Ring Layer 0)
         +addSection: Kernel Virtualization Engine

KERN_WARN_CODING_STYLE: Do not Loop unless you absolutely have to.

추천도서초기화되지 않음void *i

"사람은 어느 정도 인생을 살아본 후에야 책을 이해할 수 있고, 적어도 책의 일부라도 보고 경험하기 전에는 심오한 책을 이해할 수 없다." ——에즈라 파운드

천명의 여정코드 마일리지한 단계부터 시작해야 합니다. 다음 중 어떤 책부터 시작해야 할지 혼란스럽다면 걱정하지 말고 마음에 드는 책을 선택하세요. 방황하는 사람이 모두 길을 잃은 것은 아닙니다. ~처럼모든 길은 결국 고속도로로 연결된다, 페이지를 진행하면서 막다른 골목에 부딪치지 않고 핵심으로 향하는 여정에서 새로운 것을 탐색하고 궁극적으로 code-set읽고 기억하면서 머리를 맑게 유지하세요.코드는 문학이 아니다.

남는 것은 사물, 감정, 이미지, 정신적 그림, 기억, 심지어 아이디어도 아닙니다. 그것은 기능입니다. 일종의 과정. "더 큰" 것의 기능으로 설명할 수 있는 삶의 한 측면. 그래서 그것은 다른 어떤 것과도 "분리"되어 있지 않은 것 같습니다. 칼의 기능(뭔가를 자르는 것)이 실제로 칼 자체와 별개가 아닌 것처럼. 이 기능은 현재 사용 중일 수도 있고 사용되지 않을 수도 있지만 분리되지 않을 수도 있습니다.

Solovay Strassen 소수성 테스트 비무작위화 알고리즘:

Solovay Strassen 소수성 테스트 비무작위화 알고리즘

독서는 반박하고 반박하는 것이 아니며, 믿고 받아들이는 것도 아니고, 대화와 말을 찾는 것도 아닙니다. 어떤 책은 맛봐야 하고, 어떤 책은 삼켜야 하고, 어떤 책은 씹어서 소화해야 한다. 즉, 어떤 책은 부분적으로 읽어야 하고, 어떤 책은 호기심 없이 읽어야 하고, 어떤 책은 호기심 없이 읽어야 한다. . 다 읽어보세요. , 부지런하고 집중하십시오.

static void tasklet_hi_action(struct softirq_action *a)
{
        struct tasklet_struct *list;

        local_irq_disable();
        list = __this_cpu_read(tasklet_hi_vec.head);
        __this_cpu_write(tasklet_hi_vec.head, NULL);
        __this_cpu_write(tasklet_hi_vec.tail, this_cpu_ptr(&tasklet_hi_vec.head));
        local_irq_enable();

        while (list) {
                struct tasklet_struct *t = list;

                list = list->next;

                if (tasklet_trylock(t)) {
                        if (!atomic_read(&t->count)) {
                                if (!test_and_clear_bit(TASKLET_STATE_SCHED,
                                                        &t->state))
                                        BUG();
                                t->func(t->data);
                                tasklet_unlock(t);
                                continue;
                        }
                        tasklet_unlock(t);
                }

                local_irq_disable();
                t->next = NULL;
                *__this_cpu_read(tasklet_hi_vec.tail) = t;
                __this_cpu_write(tasklet_hi_vec.tail, &(t->next));
                __raise_softirq_irqoff(HI_SOFTIRQ);
                local_irq_enable();
        }
}

코어리눅스(5 -> 1 -> 3 -> 2 -> 7 -> 4 -> 6)

"자연에는 핵심도 껍질도 없습니다. 자연은 동시에 모든 것입니다." - 요한 볼프강 폰 괴테

독자들은 다음 사항에 익숙해야 합니다.운영 체제 개념;장기 실행 프로세스와 단기간에 실행되는 프로세스와의 차이점을 공정하게 이해합니다. 내결함성은 소프트 및 하드 실시간 제약 조건을 모두 충족합니다. 읽으면서 n/ack핵심 하위 시스템에서 Linux 커널 소스 코드가 선택한 디자인을 이해하는 것이 중요합니다.

Thread [and] Signal은 플랫폼에 의존하는 고통, 절망, 공포, 광기의 길입니다(~Anthony Baxter). 그렇긴 하지만, 커널에 뛰어들기 전에 당신은 스스로 평가할 수 있는 C 전문가가 되어야 합니다. 또한 연결된 목록, 스택, 큐, 레드-블랙 트리, 해시 함수 등에 대한 좋은 경험이 있어야 합니다.

volatile int i;
int main(void)
{
    int c;
    for (i=0; i<3; i++) {
        c = i&&&i;
        printf("%d\n", c);    /* find c */
    }
    return 0;
}

Linux 커널 소스 코드의 아름다움과 예술은 사용된 의도적인 코드 난독화에 있습니다. 이는 둘 이상의 작업이 포함된 계산의 의미를 깔끔하고 우아한 방식으로 전달하기 위해 필요한 경우가 많습니다. 이는 멀티 코어 아키텍처용 코드를 작성할 때 특히 그렇습니다.

영상강의실시간 시스템에서,작업 예약,메모리 압축,메모리 장벽,계면활성제

#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
  1. 리눅스 커널 개발-로버트 러브
  2. Linux 커널에 대해 알아보기-다니엘 P. 보비, 마르코 세사티
  3. Linux 커널 디자인의 예술-양 리샹
  4. 전문 Linux 커널 아키텍처-볼프강 마우러
  5. UNIX 운영 체제의 설계-모리스 J. 바흐
  6. Linux 가상 메모리 관리자 이해-멜 고먼
  7. 리눅스 커널 내부 구조-티그란 아바지안
  8. 임베디드 리눅스 시작하기-크리스토퍼 할리난

리눅스 장치 드라이버(1 -> 2 -> 4 -> 3 -> 8 -> ...)

"음악은 당신과 동행하지 않습니다. 당신은 그것을 동반하는 능력에 엄격히 의존해야 하고 감정이나 이야기의 작은 핵심에 정말로 집중해야 합니다." ——데비 해리

당신의 임무는 기본적으로 하드웨어 장치와 소프트웨어 커널 사이에 고속 통신 인터페이스를 구축하는 것입니다. 장치의 동작과 장치의 제어 및 데이터 상태는 물론 제공된 물리적 채널을 이해하려면 하드웨어 참조 데이터시트/설명서를 읽어야 합니다. 장기적으로 특정 아키텍처에 대한 어셈블리 지식을 갖고 VHDL 또는 Verilog와 같은 VLSI 하드웨어 설명 언어를 이해하는 데 도움이 됩니다.

묻다: 그런데 왜 하드웨어 스펙을 읽어야 하나요?

: “소프트웨어는 탄소와 실리콘 사이의 격차를 메울 수 없기 때문입니다” - Rahul Sonnad

그러나 위의 사항은 문제가 되지 않습니다.계산 알고리즘(드라이버 코드-하반신 치료)에 있을 수 있기 때문입니다.만능 튜링 기계. 계산 결과가 다음과 같은 경우수학 분야, 그것은 확실하다물리적 도메인.

영상강의Linux 장치 드라이버의 경우(유인물 17 및 18),내장된 KMS 드라이버 분석,핀 제어 및 GPIO 업데이트,범용 시계 프레임워크,실제 Linux 드라이버 작성 - Greg KH

static irqreturn_t phy_interrupt(int irq, void *phy_dat)
{
         struct phy_device *phydev = phy_dat;

         if (PHY_HALTED == phydev->state)
                 return IRQ_NONE;                /* It can't be ours.  */

         /* The MDIO bus is not allowed to be written in interrupt
          * context, so we need to disable the irq here.  A work
          * queue will write the PHY to disable and clear the
          * interrupt, and then reenable the irq line.
          */
         disable_irq_nosync(irq);
         atomic_inc(&phydev->irq_disable);

         queue_work(system_power_efficient_wq, &phydev->phy_queue);

         return IRQ_HANDLED;
}
  1. 리눅스 장치 드라이버-조나단 코베트(Jonathan Corbett), 알레산드로 루비니(Alessandro Roubini), 그렉 크로우하트만(Greg Crow-Hartman)
  2. 기본 Linux 장치 드라이버-스리크리슈난 벤카테스와란
  3. Linux 장치 드라이버 작성-제리 쿠퍼스타인
  4. Linux 커널 모듈 프로그래밍 가이드-피터 제이 잘츠만, 마이클 브리앙, 오리 포메란츠
  5. Linux PCMCIA 프로그래머 가이드-데이비드 하인즈
  6. Linux SCSI 프로그래밍 가이드-하이코 에버펠트
  7. POSIX 운영 체제 직렬 프로그래밍 가이드-마이클 스위트
  8. Linux 그래픽 드라이버: 소개-스티븐 마치슨
  9. Linux USB 장치 드라이버 프로그래밍 가이드-데틀레프 플리글
  10. Linux 커널 장치 모델-패트릭 모첼

커널 네트워크(1 -> 2 -> 3 -> ...)

"클랜이라 부르든, 네트워크라 부르든, 부족이라 부르든, 가족이라 부르든 간에, 당신이 누구라고 부르든 간에 하나가 필요합니다." - 제인 하워드

커널의 패킷 통과를 이해하는 것은 커널 네트워킹을 이해하는 데 중요합니다. Netfilter나 IPSec 내부 등을 이해하려면 이를 이해해야 합니다. Linux 커널 네트워크 계층의 가장 중요한 두 가지 구조는 다음 struct sk_buff과 같습니다.struct net_device

static inline int sk_hashed(const struct sock *sk)
{
        return !sk_unhashed(sk);
} 
  1. Linux 네트워크의 내부 구조 이해-크리스티안 벤베누티
  2. Linux 커널 네트워킹: 구현 및 이론-라미 로젠
  3. UNIX 네트워크 프로그래밍-W. 리처드 스티븐스
  4. Linux 네트워크 프로그래밍에 대한 확실한 가이드-카일 데이비스, 존 W. 터너, 네이선 요컴
  5. Linux TCP/IP 스택: 임베디드 시스템 네트워킹-토마스 F. 허버트
  6. Linux 소켓 프로그래밍 예제-워렌 게이
  7. Linux 고급 라우팅 및 트래픽 제어 방법-버트 휴버트

커널 디버깅(1 -> 4 -> 9 -> ...)

사람들이 컴퓨터와 의사소통을 할 때 자신의 의사를 정확하게 표현할 수 없다면 문제가 발생할 수밖에 없습니다. ~Alan Turing, 컴퓨터에 대하여

Brian W. Kernighan은 "초보자를 위한 Unix"(1979)에서 "가장 효과적인 디버깅 도구는 print 문을 신중하게 배치하는 것과 함께 신중하게 생각하는 것입니다."라고 말했습니다. 무엇을 수집할지 알면 빠른 진단을 위해 올바른 데이터를 빠르게 얻는 데 도움이 됩니다. 위대한 컴퓨터 과학자 Edsger Dijkstra는 테스트를 통해 오류가 있음을 증명할 수 있지만 오류가 없음을 증명할 수는 없다고 말한 적이 있습니다. 좋은 조사 관행은 문제를 신속하게 해결해야 하는 필요성, 기술을 개발해야 하는 필요성, 해당 분야 전문가의 효과적인 활용 사이에서 균형을 이루어야 합니다.

때때로 당신이 바닥에 부딪혔을 때 아무것도 작동하지 않는 것처럼 보이고 모든 옵션이 사라집니다. 그런 다음 실제 디버깅이 시작됩니다. 실수는 효과가 없는 솔루션에 집착하는 데 필요한 휴식을 제공할 수 있습니다.

영상강의커널 디버깅 및 분석 정보,코어 덤프 분석,GDB를 사용한 멀티코어 디버깅,멀티코어 경쟁 조건 제어,전자 제품 디버깅

/* Buggy Code -- Stack frame problem
 * If you require information, do not free memory containing the information
 */
char *initialize() {
  char string[80];
  char* ptr = string;
  return ptr;
}

int main() {
  char *myval = initialize();
  do_something_with(myval);
}
/*  “When debugging, novices insert corrective code; experts remove defective code.”
 *     – Richard Pattis
#if DEBUG
 printk("The above can be considered as Development and Review in Industrial Practises");
#endif
 */
  1. Linux 디버깅 및 성능 튜닝-스티브 베스트
  2. Linux 애플리케이션 디버깅 기술-아우렐리안 멜린트
  3. GDB를 사용한 디버깅: GNU 소스 레벨 디버거-롤랜드 H. 페시
  4. 임베디드 Linux 디버깅-크리스토퍼 할리난
  5. GDB, DDD 및 Eclipse를 사용한 디버깅 기술-노먼 매틀로프
  6. 프로그램이 실패하는 이유: 시스템 디버깅 가이드-안드레아스 젤러
  7. 소프트웨어 엑소시즘: 레거시 코드 디버깅 및 최적화를 위한 핸드북-빌 브렌든
  8. 디버깅: 가장 파악하기 어려운 소프트웨어 및 하드웨어 문제 찾기-데이비드 J. 아르간스
  9. 마인드 디버깅: 다학제적 접근 방식-로버트 찰스 메츠거
  10. 버그 찾기: 나쁜 프로그램에 관한 책-아담 바

파일 시스템(1 -> 2 -> 6 -> ...)

"적어도 파일 시스템과 통합되어 있기 때문에 가상 메모리를 원합니다." ——켄 톰슨

UNIX 시스템에서는 모든 것이 파일입니다. 파일이 아닌 경우 명명된 파이프와 소켓을 제외하고는 프로세스입니다. 파일 시스템에서 파일은 inode파일을 구성하는 실제 데이터에 대한 정보가 포함된 시퀀스 번호로 표시됩니다. Linux 가상 파일 시스템은 VFS마운트되고 사용되는 각 파일 시스템에 대한 정보를 메모리에 캐시합니다. 파일 및 디렉터리가 생성, 기록 및 삭제될 때 이러한 캐시의 데이터가 수정되므로 파일 시스템을 올바르게 업데이트하려면 세심한 주의를 기울여야 합니다. 이러한 캐시 중 가장 중요한 것은 버퍼 캐시로, 이는 각 파일 시스템이 기본 블록 저장 장치에 액세스하는 방식에 통합되어 있습니다.

영상강의스토리지 시스템 정보,플래시 친화적인 파일 시스템

long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
{
        struct open_flags op;
        int fd = build_open_flags(flags, mode, &op);
        struct filename *tmp;

        if (fd)
                return fd;

        tmp = getname(filename);
        if (IS_ERR(tmp))
                return PTR_ERR(tmp);

        fd = get_unused_fd_flags(flags);
        if (fd >= 0) {
                struct file *f = do_filp_open(dfd, tmp, &op);
                if (IS_ERR(f)) {
                        put_unused_fd(fd);
                        fd = PTR_ERR(f);
                } else {
                        fsnotify_open(f);
                        fd_install(fd, f);
                }
        }
        putname(tmp);
        return fd;
}

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
{
        if (force_o_largefile())
                flags |= O_LARGEFILE;

        return do_sys_open(AT_FDCWD, filename, flags, mode);
}
  1. 리눅스 파일 시스템-모세 바
  2. 리눅스 파일 시스템-빌헬름 폰 하겐
  3. UNIX 파일 시스템: 발전, 설계 및 구현-스티브 D. 페이트
  4. 실용적인 파일 시스템 설계-도미니크 지암파올로
  5. 파일 시스템 포렌식 분석-브라이언 캐리어
  6. Linux 파일 시스템 계층 구조-빈 응우옌
  7. BTRFS: Linux B-트리 파일 시스템-오하드 로드
  8. StegFS: Linux용 스테가노그래픽 파일 시스템-앤드루 D. 맥도날드, 마커스 G. 쿤

안전(1 -> 2 -> 8 -> 4 -> 3 -> ...)

"UNIX는 사용자가 어리석은 일을 하는 것을 방지하도록 설계되지 않았습니다. 왜냐하면 그렇게 하면 사용자가 현명한 일을 하는 것도 방지할 수 있기 때문입니다." — 더그 그윈

어떤 기술도 사용하지 않으면 효과적이지 않습니다. 기술이 변화함에 따라 도덕도 변화합니다.

"F × S = k"자유와 안전의 산물은 불변이다. - 니벤의 법칙

암호화는 온라인 신뢰의 기초를 형성합니다. 해킹은 기술적, 물리적 또는 인적 요소를 사용하여 보안 통제를 이용하는 것입니다. 실행 중인 다른 프로그램으로부터 커널을 보호하는 것은 안전하고 안정적인 시스템을 향한 첫 번째 단계이지만 이것만으로는 충분하지 않습니다. 서로 다른 사용자 공간 애플리케이션 간에 일정 수준의 보호도 존재해야 합니다. 익스플로잇은 로컬 또는 원격 서비스를 표적으로 삼을 수 있습니다.

"무차별적인 힘으로 운명을 해킹할 수는 없습니다. 백도어, 삶으로 통하는 통로가 필요합니다." ——클라이드 두수자

컴퓨터는 문제를 해결하는 것이 아니라 솔루션을 구현합니다. 모든 뒤에불확실성알고리즘 코드에는결정하다정신. --/var/log/dmesg

영상강의암호화 및 네트워크 보안,보안 네임스페이스,원격 공격으로부터 보호,보안 임베디드 Linux

env x='() { :;}; echo vulnerable' bash -c "echo this is a test for Shellsock"
  1. 해킹: 착취의 기술-존 에릭슨
  2. Rootkit Armory: 시스템의 어두운 구석에서 벗어나 탈출하세요- 빌 브렌든
  3. 노출된 해커: 사이버 보안 비밀-스튜어트 맥클루어, 조엘 스캠브레이, 조지 커츠
  4. 커널 악용 가이드: 코어 공격-엔리코 페라, 마시밀리아노 오르다니
  5. 메모리 포렌식의 예술-마이클 헤일레이, 앤드류 키스, 제이미 레비, 앨런 월터스
  6. 실용적인 리버스 엔지니어링-브루스 당, 알렉상드르 가제, 엘리아스 바찰알라니
  7. 실용적인 악성코드 분석-마이클 시코르스키, 앤드루 호니그
  8. 최대 Linux 보안: Linux 서버 보안을 위한 해커 가이드-익명의
  9. 리눅스 보안-크레이그 헌터
  10. 실제 Linux 보안-밥 토켈슨

커널 소스 코드(0.11 -> 2.4 -> 2.6 -> 3.18)

"와인과 마찬가지로 커널 프로그래밍의 숙달도 시간이 지남에 따라 성숙해집니다. 그러나 와인과 달리 그 과정에서 더욱 달콤해집니다." ——로렌스 무체카

프로그래머를 예술가로 생각하지 않을 수도 있지만 프로그래밍은 매우 창의적인 직업입니다. 이것이 논리에 기초한 창의성이다. 브러시와 페인트에 대해 배운다고 해서 누구나 전문 화가가 될 수 없는 것처럼 컴퓨터 과학 교육을 한다고 해서 누구든 전문 프로그래머가 될 수는 없습니다. 이미 알고 있듯이 길을 아는 것과 길을 걷는 것은 다릅니다. 소매를 걷어붙이고 커널 소스 코드에 손을 대는 것이 중요합니다. 마지막으로 여기에서 얻은 커널을 사용하십시오.지식, 어디를 가든지 그럴 것입니다.빛나는.

미숙한 프로그래머는 모방하고, 나쁜 프로그래머는 자신이 얻은 것을 파괴하고, 좋은 프로그래머는 그것을 더 나은 것으로 바꾸거나 적어도 다른 것으로 바꿉니다. 훌륭한 프로그래머는 자신의 절도를 찢어진 느낌과는 전혀 다른 독특한 전반적인 느낌으로 결합시킵니다.

영상강의커널 레시피 정보

linux-0.11
├── boot
│   ├── bootsect.s      head.s      setup.s
├── fs
│   ├── bitmap.c    block_dev.c buffer.c        char_dev.c  exec.c
│   ├── fcntl.c     file_dev.c  file_table.c    inode.c     ioctl.c
│   ├── namei.c     open.c      pipe.c          read_write.c
│   ├── stat.c      super.c     truncate.c
├── include
│   ├── a.out.h     const.h     ctype.h     errno.h     fcntl.h
│   ├── signal.h    stdarg.h    stddef.h    string.h    termios.h
│   ├── time.h      unistd.h    utime.h
│   ├── asm
│   │   ├── io.h    memory.h    segment.h   system.h
│   ├── linux
│   │   ├── config.h    fdreg.h fs.h    hdreg.h     head.h
│   │   ├── kernel.h    mm.h    sched.h sys.h       tty.h
│   ├── sys
│   │   ├── stat.h      times.h types.h utsname.h   wait.h
├── init
│   └── main.c
├── kernel
│   ├── asm.s       exit.c      fork.c      mktime.c    panic.c
│   ├── printk.c    sched.c     signal.c    sys.c       system_calls.s
│   ├── traps.c     vsprintf.c
│   ├── blk_drv
│   │   ├── blk.h   floppy.c    hd.c    ll_rw_blk.c     ramdisk.c
│   ├── chr_drv
│   │   ├── console.c   keyboard.S  rs_io.s
│   │   ├── serial.c    tty_io.c    tty_ioctl.c
│   ├── math
│   │   ├── math_emulate.c
├── lib
│   ├── close.c  ctype.c  dup.c     errno.c  execve.c  _exit.c
│   ├── malloc.c open.c   setsid.c  string.c wait.c    write.c
├── Makefile
├── mm
│   ├── memory.c page.s
└── tools
    └── build.c
  1. 초보자부터리눅스 0.11 소스 코드(소스 코드는 20,000줄 미만). 20년의 개발 끝에 Linux 0.11과 비교하면 Linux는 매우 크고 복잡하며 배우기 어려워졌습니다. 하지만 디자인 컨셉과 주요 구조는 근본적으로 바뀌지 않았습니다. Linux 0.11을 배우는 것은 여전히 ​​중요한 실무적 의미를 갖습니다.
  2. 커널 해커들이 꼭 읽어야 할 책 =>Linux_source_dir/Documentation/*
  3. 최소한 하나의 커널 메일링 리스트에 가입하고 활동해야 합니다. 에서 시작하다커널의 새로운 기능.
  4. 전체 소스 코드를 읽을 필요는 없습니다. 커널 API와 사용법에 익숙해지면 관심 있는 하위 시스템의 소스 코드에서 직접 시작할 수 있습니다. 자신만의 플러그 앤 플레이 모듈을 작성하여 커널 실험을 시작할 수도 있습니다.
  5. 장치 드라이버 작성자는 자신만의 전용 하드웨어를 보유함으로써 이점을 얻을 수 있습니다. 에서 시작하다라즈베리 파이.

답변2

Linux 커널의 새로운 기능훌륭한 자원입니다.

답변3

"를 읽어 보시기 바랍니다.리눅스 커널에 대한 간략한 소개" 그렉 크로하-하트만(Greg Kroah-Hartman) 및 "Linux 커널에 대해 알아보기” 로버트 러브(Robert Love)의 필독서입니다. :)

답변4

보다Linux 문서화 프로젝트. 특히 "Linux 커널 모듈 가이드"입니다.

관련 정보