문제

lLinux 커널 프로그래밍을 배우고 싶습니다.

그 출발점은 무엇입니까?목표로 삼을 수 있는 더 간단한 문제는 무엇입니까?

도움이 되었습니까?

해결책

Linux 커널 프로그래밍에 대한 Robert Love의 책을 보관하십시오. 매우 간결하고 따르기 쉽습니다.

그 후 또는 그와 함께, 당신은 "Linux 커널 이해"를보고 싶을 수도 있지만 초기 단계에서는 권장하지 않을 것입니다.

또한, Linux 커널 프로그래밍 안내서. 커널 모듈을 프로그래밍하여 많은 것을 배울 수 있으므로 그 안내서가 도움이 될 것입니다. 그렇습니다. 많은 정보를 얻으려면 커널 소스 Tarball의 '문서'하위 디렉토리를 참조하십시오.

다른 팁

**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 Derandomized Algorithm for Primality Test

모순되거나 논쟁하지 않도록 읽으십시오.믿고 당연하게 여기지도 않습니다.대화나 대화를 찾을 수도 없습니다.하지만 무게를 재고 고려해보세요.어떤 책은 맛보아야 하고, 어떤 책은 삼켜야 하며, 어떤 책은 씹어서 소화해야 합니다.즉, 어떤 책은 부분적으로만 읽어야 하고, 어떤 책은 호기심을 갖고 읽어야 하며, 어떤 책은 전체를 부지런히 주의 깊게 읽어야 합니다.

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 커널 소스가 선택한 디자인입니다.

스레드 [및] 신호 [는] 비참함, 절망, 공포 및 광기의 플랫폼 의존적 흔적입니다(~Anthony Baxte).즉, 커널을 시작하기 전에 자체 평가하는 C 전문가가 되어야 합니다.또한 Linked Lists, Stacks, Queues, Red Blacks Trees, Hash Functions 등에 대한 좋은 경험이 있어야 합니다.

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 커널 소스의 아름다움과 예술은 함께 사용된 의도적인 코드 난독화에 있습니다.이는 두 개 이상의 작업과 관련된 계산적 의미를 깨끗하고 우아한 방식으로 전달하기 위해 종종 필요합니다.이는 멀티 코어 아키텍처용 코드를 작성할 때 특히 그렇습니다.

영상강의 실시간 시스템, 작업 스케줄링, 메모리 압축, 메모리 장벽, SMP

#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
  1. 리눅스 커널 개발 - 로버트 러브
  2. 리눅스 커널 이해 - 다니엘 P.보베, 마르코 체사티
  3. Linux KerneL 디자인의 예술 - 양 리샹
  4. 전문 Linux 커널 아키텍처 - 볼프강 마우어러
  5. UNIX 운영 체제 설계 - 모리스 J.바흐
  6. Linux 가상 메모리 관리자 이해 - 멜 고먼
  7. Linux 커널 내부 - 티그란 아이바지안
  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. 리눅스 장치 드라이버 - 조나단 코벳, 알레산드로 루비니, 그렉 크로아-하트만
  2. 필수 Linux 장치 드라이버 - 스리크리슈난 벤카테스와란
  3. Linux 장치 드라이버 작성 - 제리 쿠퍼스타인
  4. Linux 커널 모듈 프로그래밍 가이드 - 피터 제이 잘츠만, 마이클 뷰리안, 오리 포메란츠
  5. Linux PCMCIA 프로그래머 가이드 - 데이비드 하인즈
  6. Linux SCSI 프로그래밍 방법 - 하이코 아이브펠트
  7. POSIX 운영 체제용 직렬 프로그래밍 가이드 - 마이클 R.달콤한
  8. Linux 그래픽 드라이버:소개 - 스테판 마르케생
  9. Linux USB 장치 드라이버용 프로그래밍 가이드 - 데틀레프 플리글
  10. Linux 커널 장치 모델 - 패트릭 모첼

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

“클랜이라 부르고, 네트워크라 부르고, 부족이라 부르고, 가족이라 부르세요.당신이 그것을 부르는 것이 무엇이든, 당신이 누구든, 당신은 하나가 필요합니다.” - 제인 하워드

커널의 패킷 워크스루를 이해하는 것은 커널 네트워킹을 이해하는 열쇠입니다.Netfilter 또는 IPSec 내부 등을 이해하려면 이를 이해하는 것이 필수입니다.리눅스 커널 네트워크 계층의 가장 중요한 두 가지 구조는 다음과 같습니다. 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 소켓 프로그래밍 - 워렌 W.게이
  7. Linux 고급 라우팅 및 트래픽 제어 방법 - 버트 휴버트

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

그것과 의사소통을 할 때 자신이 의미하는 바를 정확히 말하지 않으면 문제가 발생할 수밖에 없습니다.~Alan Turing, 컴퓨터에 관하여

브라이언 W.Kernighan은 Unix for Beginners(1979) 논문에서 "가장 효과적인 디버깅 도구는 신중하게 배치된 인쇄 문과 함께 신중하게 생각하는 것"이라고 말했습니다.무엇을 수집해야 하는지 알면 빠른 진단을 위해 올바른 데이터를 빠르게 얻는 데 도움이 됩니다.위대한 컴퓨터 과학자 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를 사용한 디버깅 기술 - 노먼 S.마틀로프
  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. Linux 파일 시스템 - 모세 바
  2. Linux 파일 시스템 - 윌리엄 폰 하겐
  3. UNIX 파일 시스템:진화, 설계 및 구현 - 스티브 D.머리
  4. 실용적인 파일 시스템 설계 - 도미니크 지암파올로
  5. 파일 시스템 포렌식 분석 - 브라이언 캐리어
  6. Linux 파일 시스템 계층 - 빈 응우옌
  7. BTRFS:Linux B-트리 파일 시스템 - 오하드 로데
  8. 스테그FS: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. 루트킷 무기고:시스템의 어두운 구석에서의 탈출과 회피 - 빌 블런든
  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. 장치 드라이버 작성자는 자신만의 전용 하드웨어를 보유함으로써 이점을 얻을 수 있습니다.다음으로 시작 라즈베리 파이.

체크 아웃 Linux 커널 관리자 프로젝트

``우리는 Linux 커널 소스 코드를 살펴보고 코드 검토를 수행하고, 인재되지 않은 코드를 수정하고, 다른 정리 및 API 변환을 수행합니다. 커널 해킹을 시작하는 것이 좋습니다. ''

나는 "CHERE C"라고 말해야 할 것이다. :)

이 무료 온라인 책을 사용해보십시오.

Linux 커널 모듈 프로그래밍 안내서 http://www.linuxhq.com/guides/lkmpg/mpg.html

kernelnewbies.org를 확인하고 KernelNewbies 메일 링리스트를 구독하고 irc.oftc.org #kernelnewbies에 도착하십시오.

일부 리소스 :

  • 책 : Robert Love, Linux 커널 개발, 3 판
  • 책 : Corbet, Rubini, Linux 장치 드라이버, 3 판 (무료 버전 여기)
  • 책 : 간단히 둔 Linux 커널 (무료 버전 여기)
  • 무료 자료 자유 전자
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top