Linux Kernel: Hướng dẫn tốt cho người mới bắt đầu [đã đóng]


52

Tôi quan tâm đến việc sửa đổi các phần bên trong kernel, áp dụng các bản vá, xử lý các trình điều khiển và mô-đun thiết bị, cho niềm vui cá nhân của riêng tôi.

Có một nguồn tài nguyên toàn diện cho hack nhân, dành cho các lập trình viên có kinh nghiệm?


7
Thật buồn cười là một câu hỏi với số lượt xem và lượt bình chọn như vậy lại bị đóng như thế nào ngoài chủ đề.
YoMismo

1
Màng cứng Lex SED lex.
Adam Matan

1
Rectificare sapientis est
YoMismo

Chắc chắn rồi. Rốt cuộc, quidquid Latine dictum ngồi altum videtur.
Adam Matan

Câu trả lời:


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

KERN_WARN_CODING_STYLE: Do not Loop unless you absolutely have to.

Sách được đề xuất cho Uninitializedvoid *i

"Đàn ông không hiểu sách cho đến khi họ có một cuộc sống nhất định, hoặc ở mức độ nào đó, không người đàn ông nào hiểu một cuốn sách sâu sắc, cho đến khi anh ta đã nhìn thấy và sống ít nhất một phần nội dung của nó". PoundEzra Pound

Một cuộc hành trình của một ngàn mã dặm phải bắt đầu bằng một bước duy nhất. Nếu bạn đang bối rối về việc bắt đầu với những cuốn sách nào sau đây, đừng lo lắng, hãy chọn bất kỳ cuốn sách nào bạn chọn. Không phải ai lang thang cũng là đi lạc. Khi tất cả các con đường cuối cùng kết nối với đường cao tốc , bạn sẽ khám phá những điều mới trong hành trình hạt nhân của mình khi các trang tiến triển mà không gặp bất kỳ ngõ cụt nào, và cuối cùng kết nối với code-set. Đọc với đầu óc tỉnh táo và ghi nhớ: Mã không phải là Văn học .

Những gì còn lại không phải là một vật hay cảm xúc hay hình ảnh hay hình ảnh tinh thần hay ký ức hay thậm chí là một ý tưởng. Đây là một chức năng. Một quá trình của một số loại. Một khía cạnh của Cuộc sống có thể được mô tả như là một chức năng của một cái gì đó "lớn hơn". Và do đó, có vẻ như nó không thực sự "tách biệt" với thứ khác. Giống như chức năng của một con dao - cắt một cái gì đó - trên thực tế, không tách rời khỏi con dao. Chức năng có thể hoặc không thể được sử dụng tại thời điểm này, nhưng nó có khả năng KHÔNG BAO GIỜ tách rời.

Solovay Strassen Thuật toán Derandomized cho Kiểm tra tính nguyên thủy :

Solovay Strassen Thuật toán Derandomized cho kiểm tra tính nguyên thủy

Đọc để không mâu thuẫn và thú nhận; cũng không tin và coi thường; cũng không tìm thấy nói chuyện và diễn ngôn; nhưng để cân nhắc và cân nhắc. Một số cuốn sách sẽ được nếm, những cuốn khác bị nuốt, và một số ít được nhai và tiêu hóa: đó là, một số cuốn sách chỉ được đọc trong các phần, những cuốn khác được đọc, nhưng không tò mò, và một số ít được đọc toàn bộ và với sự siêng năng và chú ý.

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();
        }
}

Core Linux (5 -> 1 -> 3 -> 2 -> 7 -> 4 -> 6)

Thiên nhiên không có nhân cũng không có vỏ; cô ấy là tất cả mọi thứ cùng một lúc - Johann Wolfgang von Goethe

Người đọc nên thành thạo với các khái niệm hệ điều hành ; một sự hiểu biết công bằng về các quy trình chạy dài và sự khác biệt của nó với các quy trình với các đợt thực thi ngắn; khả năng chịu lỗi trong khi đáp ứng các ràng buộc thời gian thực mềm và cứng. Trong khi đọc, điều quan trọng là phải hiểu và n/ackcác lựa chọn thiết kế được tạo bởi nguồn kernel linux trong các hệ thống con cốt lõi.

Chủ đề [và] báo hiệu [là] một dấu vết phụ thuộc vào nền tảng của sự khốn khổ, tuyệt vọng, kinh hoàng và điên rồ (~ Anthony Baxte). Điều đó được nói rằng bạn nên là một chuyên gia C tự đánh giá, trước khi đi sâu vào hạt nhân. Bạn cũng nên có kinh nghiệm tốt với Danh sách được liên kết, Ngăn xếp, Hàng đợi, Cây đỏ đen, Hàm băm, et al.

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;
}

Vẻ đẹp và nghệ thuật của nguồn Linux Kernel nằm ở mã obfuscation được sử dụng cùng với. Điều này thường được yêu cầu là để truyền đạt ý nghĩa tính toán liên quan đến hai hoặc nhiều hoạt động một cách sạch sẽ và thanh lịch. Điều này đặc biệt đúng khi viết mã cho kiến ​​trúc đa lõi.

Video bài giảng trên Real-Time Systems , công tác Scheduling , Memory nén , rào Memory , SMP

#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
  1. Phát triển hạt nhân Linux - Robert Love
  2. Hiểu về hạt nhân Linux - Daniel P. Bovet, Marco Cesati
  3. Nghệ thuật thiết kế KerneL của Linux - Yang Lixiang
  4. Kiến trúc hạt nhân Linux chuyên nghiệp - Wolfgang Mauerer
  5. Thiết kế hệ điều hành UNIX - Maurice J. Bach
  6. Hiểu trình quản lý bộ nhớ ảo Linux - Mel Gorman
  7. Linux Kernel Internals - Tigran Aivazian
  8. Linux Primer nhúng - Christopher Hallinan

Trình điều khiển thiết bị Linux (1 -> 2 -> 4 -> 3 -> 8 -> ...)

"Âm nhạc không mang bạn theo cùng. Bạn phải thực hiện nó một cách nghiêm túc bởi khả năng của bạn để thực sự chỉ tập trung vào hạt nhân nhỏ bé của cảm xúc hoặc câu chuyện". - Harry Debbie

Nhiệm vụ của bạn về cơ bản là thiết lập giao diện truyền thông tốc độ cao giữa thiết bị phần cứng và nhân phần mềm. Bạn nên đọc bảng dữ liệu / hướng dẫn tham khảo phần cứng để hiểu hành vi của thiết bị và điều khiển và trạng thái dữ liệu cũng như các kênh vật lý được cung cấp. Kiến thức về hội cho kiến ​​trúc cụ thể của bạn và kiến ​​thức công bằng về các ngôn ngữ mô tả phần cứng VLSI như VHDL hoặc Verilog sẽ giúp bạn về lâu dài.

Q : Nhưng tại sao tôi phải đọc thông số kỹ thuật phần cứng?

Trả lời : Bởi vì, "Có rất nhiều carbon và silicon mà phần mềm không thể kết nối được" - Rahul Sonnad

Tuy nhiên, những điều trên không gây ra vấn đề cho Thuật toán tính toán ( Mã trình điều khiển - xử lý nửa dưới ), vì nó có thể được mô phỏng hoàn toàn trên Máy Turing phổ dụng . Nếu kết quả tính toán đúng với miền toán học , thì chắc chắn rằng nó cũng đúng trong miền vật lý .

Bài giảng video về Trình điều khiển thiết bị Linux (Lc. 17 & 18), Giải phẫu trình điều khiển KMS nhúng , Kiểm soát pin và Cập nhật GPIO , Khung đồng hồ chung , Viết Trình điều khiển Linux thực - 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. Trình điều khiển thiết bị Linux - Jonathan Corbet, Alessandro Rubini và Greg Kroah-Hartman
  2. Trình điều khiển thiết bị Linux cần thiết - Saletrishnan Venkateswaran
  3. Viết trình điều khiển thiết bị Linux - Jerry Cooperstein
  4. Hướng dẫn lập trình mô-đun hạt nhân Linux - Peter Jay Salzman, Michael Burian, Ori Pomerantz
  5. Hướng dẫn lập trình viên Linux PCMCIA - David Hinds
  6. Cách lập trình SCSI của Linux - Heiko Eibfeldt
  7. Hướng dẫn lập trình nối tiếp cho hệ điều hành POSIX - Michael R. Sweet
  8. Trình điều khiển đồ họa Linux: Giới thiệu - Stéphane Marchesin
  9. Hướng dẫn lập trình cho trình điều khiển thiết bị USB Linux - Detlef Fliegl
  10. Mô hình thiết bị hạt nhân Linux - Patrick Mochel

Mạng hạt nhân (1 -> 2 -> 3 -> ...)

Cấm gọi nó là một gia tộc, gọi nó là một mạng lưới, gọi nó là một bộ lạc, gọi nó là một gia đình: Dù bạn gọi nó là gì, dù bạn là ai, bạn đều cần một.

Hiểu một gói đi bộ trong kernel là chìa khóa để hiểu mạng kernel. Hiểu nó là điều bắt buộc nếu chúng ta muốn hiểu nội bộ Netfilter hoặc IPSec, v.v. Hai cấu trúc quan trọng nhất của lớp mạng nhân linux là: struct sk_buffstruct net_device

static inline int sk_hashed(const struct sock *sk)
{
        return !sk_unhashed(sk);
} 
  1. Hiểu về các mạng nội bộ Linux - Christian Benvenuti
  2. Mạng hạt nhân Linux: Thực hiện và lý thuyết - Rami Rosen
  3. Lập trình mạng UNIX - W. Richard Stevens
  4. Hướng dẫn dứt khoát về lập trình mạng Linux - Keir Davis, John W. Turner, Nathan Yocom
  5. Ngăn xếp TCP / IP của Linux: Kết nối mạng cho các hệ thống nhúng - Thomas F. Herbert
  6. Lập trình ổ cắm Linux bằng ví dụ - Warren W. Gay
  7. Linux Advanced Routing & Control Control HOWTO - Bert Hubert

Gỡ lỗi hạt nhân (1 -> 4 -> 9 -> ...)

Trừ khi giao tiếp với nó, người ta nói chính xác ý nghĩa của nó, rắc rối sẽ dẫn đến kết quả. ~ Alan Turing, về máy tính

Brian W. Kernighan, trong bài viết Unix dành cho người mới bắt đầu (1979) đã nói, "Công cụ gỡ lỗi hiệu quả nhất vẫn là suy nghĩ cẩn thận, cùng với các tuyên bố in được đặt một cách thận trọng". Biết những gì cần thu thập sẽ giúp bạn có được dữ liệu phù hợp nhanh chóng để chẩn đoán nhanh. Nhà khoa học máy tính vĩ đại Edsger Dijkstra từng nói rằng thử nghiệm có thể chứng minh sự hiện diện của lỗi nhưng không phải là sự vắng mặt của chúng. Thực hành điều tra tốt nên cân bằng nhu cầu giải quyết vấn đề nhanh chóng, nhu cầu xây dựng kỹ năng của bạn và sử dụng hiệu quả các chuyên gia về vấn đề này.

Có những lúc bạn chạm đáy đá, dường như không có gì hoạt động và bạn hết tất cả các lựa chọn của mình. Sau đó, việc gỡ lỗi thực sự bắt đầu. Một lỗi có thể cung cấp sự phá vỡ mà bạn cần để giải phóng khỏi sự cố định về giải pháp không hiệu quả.

Các bài giảng video về gỡ lỗi và cấu hình hạt nhân , phân tích kết xuất lõi , gỡ lỗi đa điểm với GDB , kiểm soát các điều kiện cuộc đua đa lõi , gỡ lỗi điện tử

/* 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. Điều chỉnh hiệu năng và gỡ lỗi Linux - Steve Best
  2. Kỹ thuật gỡ lỗi ứng dụng Linux - Aurelian Melinte
  3. Gỡ lỗi với GDB: Trình gỡ lỗi cấp nguồn GNU - Roland H. Pesch
  4. Gỡ lỗi Linux nhúng - Christopher Hallinan
  5. Nghệ thuật gỡ lỗi với GDB, DDD và Eclipse - Norman S. Matloff
  6. Tại sao các chương trình thất bại: Hướng dẫn về gỡ lỗi có hệ thống - Andreas Zeller
  7. Xua đuổi phần mềm: Cẩm nang để gỡ lỗi và tối ưu hóa mã kế thừa - Bill Blunden
  8. Gỡ lỗi: Tìm hầu hết các sự cố phần mềm và phần cứng khó nắm bắt - David J. Agans
  9. Gỡ lỗi bằng cách suy nghĩ: Cách tiếp cận đa ngành - Robert Charles Metzger
  10. Tìm lỗi: Sách về các chương trình không chính xác - Adam Barr

Hệ thống tệp (1 -> 2 -> 6 -> ...)

"Tôi muốn có bộ nhớ ảo, ít nhất là nó được kết hợp với các hệ thống tập tin". - Ken Thompson

Trên hệ thống UNIX, mọi thứ đều là một tệp; nếu một cái gì đó không phải là một tập tin, nó là một quá trình, ngoại trừ các đường ống và ổ cắm được đặt tên. Trong một hệ thống tệp, một tệp được biểu thị bằng inodemột loại số sê-ri chứa thông tin về dữ liệu thực tế tạo nên tệp. Hệ thống tệp ảo Linux VFSlưu trữ thông tin trong bộ nhớ từ mỗi hệ thống tệp khi nó được gắn kết và sử dụng. Phải cẩn thận để cập nhật hệ thống tệp một cách chính xác vì dữ liệu trong các bộ đệm này được sửa đổi khi các tệp và thư mục được tạo, ghi và xóa. Điều quan trọng nhất trong số các bộ đệm này là Bộ đệm Cache, được tích hợp vào cách các hệ thống tệp riêng lẻ truy cập vào các thiết bị lưu trữ khối bên dưới của chúng.

Bài giảng video trên hệ thống lưu trữ , hệ thống tệp thân thiện với Flash

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. Hệ thống tệp Linux - Moshe Bar
  2. Hệ thống tập tin Linux - William Von Hagen
  3. Hệ thống tập tin UNIX: Tiến hóa, thiết kế và triển khai - Steve D. Pate
  4. Thiết kế hệ thống tập tin thực tế - Dominic Giampaolo
  5. Phân tích pháp y hệ thống tập tin - Brian Carrier
  6. Hệ thống phân cấp tập tin Linux - Bình Nguyên
  7. BTRFS: Hệ thống tệp B-cây Linux - Ohad Rodeh
  8. StegFS: Một hệ thống tệp Steganographic cho Linux - Andrew D. McDonald, Markus G. Kuhn

Bảo mật (1 -> 2 -> 8 -> 4 -> 3 -> ...)

"UNIX không được thiết kế để ngăn người dùng làm những điều ngu ngốc, vì điều đó cũng sẽ ngăn họ làm những điều thông minh". - Doug Gwyn

Không có kỹ thuật hoạt động nếu nó không được sử dụng. Thay đổi đạo đức với công nghệ.

" F × S = k " sản phẩm của tự do và bảo mật là một hằng số. - Luật của Niven

Mật mã hình thành cơ sở của niềm tin trực tuyến. Hacking đang khai thác các kiểm soát bảo mật hoặc trong một yếu tố kỹ thuật, vật lý hoặc dựa trên con người. Bảo vệ hạt nhân khỏi các chương trình đang chạy khác là bước đầu tiên hướng tới một hệ thống an toàn và ổn định, nhưng điều này rõ ràng là không đủ: một số mức độ bảo vệ cũng phải tồn tại giữa các ứng dụng đất người dùng khác nhau. Khai thác có thể nhắm mục tiêu các dịch vụ địa phương hoặc từ xa.

Bạn không thể hack số mệnh của mình, vũ phu ... bạn cần một cửa sau, một kênh phụ vào cuộc sống. " - Clyde Dsouza

Máy tính không giải quyết vấn đề, họ thực thi các giải pháp. Đằng sau mỗi mã thuật toán không xác định , có một tâm trí quyết tâm. - / var / log / dmesg

Các bài giảng video về Mật mã học và An ninh mạng , Không gian bảo mật , Bảo vệ chống lại các cuộc tấn công từ xa , Linux nhúng an toàn

env x='() { :;}; echo vulnerable' bash -c "echo this is a test for Shellsock"
  1. Hacking: Nghệ thuật khai thác - Jon Erickson
  2. Rootkit Arsenal: Escape và Evasion trong Dark Corners của hệ thống - Bill Blunden
  3. Hacking Exposed: Bí mật an ninh mạng - Stuart McClure, Joel Scambray, George Kurtz
  4. Hướng dẫn khai thác hạt nhân: Tấn công lõi - Enrico Perla, Massimiliano Oldani
  5. Nghệ thuật pháp y về trí nhớ - Michael Hale Ligh, Andrew Case, Jamie Levy, AAron Walters
  6. Kỹ thuật đảo ngược thực tế - Bruce Dang, Alexandre Gazet, Elias Bachaalany
  7. Phân tích phần mềm độc hại thực tế - Michael Sikorski, Andrew Honig
  8. Bảo mật tối đa cho Linux: Hướng dẫn của hacker để bảo vệ máy chủ Linux của bạn - Ẩn danh
  9. Bảo mật Linux - Craig Hunt
  10. Bảo mật Linux thế giới thực - Bob Toxen

Nguồn hạt nhân (0.11 -> 2.4 -> 2.6 -> 3.18)

"Giống như rượu vang, sự thành thạo của lập trình hạt nhân trưởng thành theo thời gian. Nhưng, không giống như rượu vang, nó trở nên ngọt ngào hơn trong quá trình này". --Lawrence Mucheka

Bạn có thể không nghĩ rằng lập trình viên là nghệ sĩ, nhưng lập trình là một nghề cực kỳ sáng tạo. Đó là sự sáng tạo dựa trên logic. Giáo dục khoa học máy tính không thể khiến bất cứ ai trở thành một lập trình viên chuyên gia, ngoài việc nghiên cứu bút vẽ và bột màu có thể khiến ai đó trở thành một họa sĩ chuyên gia. Như bạn đã biết, có một sự khác biệt giữa việc biết con đường và đi trên con đường; điều cực kỳ quan trọng là xắn tay áo lên và làm bẩn tay bạn bằng mã nguồn kernel. Cuối cùng, với kiến thức hạt nhân thu được của bạn , bất cứ nơi nào bạn đi, bạn sẽ tỏa sáng .

Lập trình viên chưa trưởng thành bắt chước; lập trình viên trưởng thành ăn cắp; các lập trình viên xấu làm mất đi những gì họ làm, và các lập trình viên giỏi biến nó thành một thứ gì đó tốt hơn, hoặc ít nhất là một cái gì đó khác biệt. Người viết mã giỏi hàn gắn hành vi trộm cắp của anh ta thành một cảm giác rất độc đáo, hoàn toàn khác biệt với cảm giác bị xé rách.

Bài giảng video về Bí quyết hạt nhân

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. Người mới bắt đầu với nguồn Linux 0.11 (dưới 20.000 dòng mã nguồn). Sau 20 năm phát triển, so với Linux 0.11, Linux đã trở nên rất lớn, phức tạp và khó học. Nhưng khái niệm thiết kế và cấu trúc chính không có thay đổi cơ bản. Học Linux 0.11 vẫn có ý nghĩa thực tiễn quan trọng.
  2. Đọc bắt buộc đối với tin tặc hạt nhân => Linux_source_dir/Documentation/*
  3. Bạn nên đăng ký và hoạt động trên ít nhất một danh sách gửi thư kernel. Bắt đầu với người mới kernel .
  4. Bạn không cần phải đọc mã nguồn đầy đủ. Khi bạn đã quen thuộc với API của kernel và cách sử dụng của API, hãy bắt đầu trực tiếp với mã nguồn của hệ thống phụ mà bạn quan tâm. Bạn cũng có thể bắt đầu bằng cách viết các mô-đun plug-n-play của riêng mình để thử nghiệm với kernel.
  5. Người viết trình điều khiển thiết bị sẽ được hưởng lợi bằng cách có phần cứng chuyên dụng của riêng họ. Bắt đầu với Raspberry Pi .

2
Cảm ơn! đó là một câu trả lời khá toàn diện. Sẽ xem xét
Adam Matan

1
Câu trả lời này thật tuyệt vời
pkqxdd

Câu trả lời tuyệt vời! Tôi cũng đã tạo một hướng dẫn mà tôi có thể quan tâm: github.com/cirosantilli/linux-kernel-module-cheat Nó chứa một thiết lập tự động cao, xây dựng nhân Linux, QEMU và hệ thống tập tin gốc cho bạn. Bao gồm thiết lập gỡ lỗi bước kernel GDB Linux.
Ciro Santilli 心 心 事件


5

Tôi đề nghị bạn nên đọc " Hạt nhân Linux trong một bản tóm tắt " của Greg Kroah-Hartman và " Tìm hiểu về hạt nhân Linux " của Robert Love. Phải đọc :)


2
kroah.com/lkn - Trực tuyến miễn phí
Joshua Enfield

@Josh Những cuốn sách này được viết cách đây 5-6 năm, chúng có còn là chủ đề không?
Alex Bolotov

Tôi không thể trả lời rằng với bất kỳ sự tin cậy hợp lý nào :( Các trách nhiệm khác đã tiêu tốn thời gian của tôi và tôi không bao giờ có mặt để đọc nó. Hy vọng rằng wzzrd nhìn thấy những bình luận này và có thể nhận xét.
Joshua Enfield

1
Vâng, những cuốn sách vẫn có liên quan. Nhiều, nhiều chi tiết đã thay đổi ngoài sự công nhận. Nhìn vào trang người mới kernel được đề cập ở trên (hoặc trang kernel của lwn.net để thảo luận chuyên sâu và tin tức mới).
vonbrand

4

Trình điều khiển thiết bị Linux là một tài nguyên tốt khác. Nó sẽ cho bạn một cách khác để đi vào hoạt động bên trong. Từ lời nói đầu:

Trên bề mặt, đây là một cuốn sách viết về trình điều khiển thiết bị cho hệ thống Linux. Đó là một mục tiêu xứng đáng, tất nhiên; dòng chảy của các sản phẩm phần cứng mới dường như sẽ không chậm lại bất cứ lúc nào và ai đó sẽ phải làm cho tất cả các tiện ích mới này hoạt động với Linux. Nhưng cuốn sách này cũng là về cách thức hoạt động của nhân Linux và cách điều chỉnh hoạt động của nó theo nhu cầu hoặc sở thích của bạn. Linux là một hệ thống mở; với cuốn sách này, chúng tôi hy vọng, nó sẽ cởi mở hơn và dễ tiếp cận hơn với cộng đồng các nhà phát triển lớn hơn.


Tôi luôn tìm thấy mục tiêu học tập hiệu quả hơn học tập trừu tượng đối với tôi. Cuốn sách LDD đã cho tôi cơ hội cắn một miếng nhỏ đủ để đạt được tiến bộ.
Larry Smithmier


2

Linux Kernel 2.4 Internals là một tài nguyên trực tuyến khác để xem xét. Nó xuất hiện để thực hiện một cách tiếp cận 'mặt đất' đẹp, bắt đầu với khởi động. Đây là TOC:

  1. Khởi động
    • 1.1 Xây dựng hình ảnh hạt nhân Linux
    • 1.2 Khởi động: Tổng quan
    • 1.3 Khởi động: BIOS POST
    • 1.4 Khởi động: khởi động và thiết lập
    • 1.5 Sử dụng LILO làm bộ tải khởi động
    • 1.6 Khởi tạo cấp cao
    • Khởi động 1.7 SMP trên x86
    • 1.8 Giải phóng dữ liệu và mã khởi tạo
    • 1.9 Xử lý dòng lệnh kernel
  2. Quy trình và quản lý ngắt
    • 2.1 Cấu trúc nhiệm vụ và bảng quy trình
    • 2.2 Tạo và kết thúc các tác vụ và luồng nhân
    • 2.3 Bộ lập lịch Linux
    • 2.4 Thực hiện danh sách liên kết Linux
    • 2.5 Hàng đợi
    • 2.6 Bộ đếm thời gian hạt nhân
    • 2.7 Nửa dưới
    • 2.8 Hàng đợi nhiệm vụ
    • 2.9 Nhiệm vụ
    • 2.10 Softirq
    • 2.11 Các cuộc gọi hệ thống được triển khai như thế nào trên Kiến trúc i386?
    • 2.12 Hoạt động nguyên tử
    • 2.13 Spinlocks, Spinlocks đọc và ghi Spinlocks đọc lớn
    • 2.14 Semaphores và đọc / viết Semaphores
    • 2.15 Hỗ trợ hạt nhân để tải các mô-đun
  3. Hệ thống tập tin ảo (VFS)
    • 3.1 Bộ nhớ cache và tương tác với Dcache
    • 3.2 Đăng ký hệ thống tập tin / hủy đăng ký
    • 3.3 Quản lý mô tả tệp
    • 3.4 Quản lý cấu trúc tệp
    • 3.5 Quản lý siêu khối và Mountpoint
    • 3.6 Ví dụ Hệ thống tệp ảo: pipefs
    • 3.7 Ví dụ về hệ thống tập tin đĩa: BFS
    • 3.8 Miền thực thi và định dạng nhị phân
  4. Bộ nhớ cache trang Linux
  5. Cơ chế IPC
    • 5.1 ngữ nghĩa
    • 5.2 Hàng đợi tin nhắn
    • 5.3 Bộ nhớ dùng chung
    • 5.4 Nguyên tắc Linux IPC

Và, để làm cho nó thậm chí còn ngọt ngào hơn, có một Phiên bản thứ ba phát triển hạt nhân Linux mới của Robert Love out và Slashdot có một đánh giá.


1

Bắt đầu với Linux Kernel Primer của Claudia Salzberg et al. Tốt để bắt đầu với người mới bắt đầu. Cuốn sách của Robert Love chắc chắn không phải là cuốn sách mà người mới bắt đầu nên bắt đầu. Cuốn sách trên là trung cấp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.