Cara terbaik untuk masuk ke pemrograman Kernel?

8

Tidak begitu banyak bertanya buku apa (walaupun jika Anda tahu ada panduan / tutorial yang akan membantu) tetapi apa cara terbaik untuk mulai melakukan pemrograman kernel dan apakah ada distribusi tertentu yang akan lebih baik untuk dipelajari?

Saya sebagian besar tertarik pada bagian Device Drivers, tetapi saya ingin belajar bagaimana Kernel diatur juga (Modul dan semacamnya) Saya memiliki sekitar 4-5 tahun Pengalaman dengan C / C ++ tetapi sebagian besar pengetahuan dari College (jadi itu adalah tidak suka pengalaman kerja 4-5 tahun, jika Anda tahu maksud saya)

Jeff Schaller
sumber
4
Untuk memulainya, itu dieja kernel dengan e.
Caleb
Ya saya perhatikan bahwa ketika saya memakai tag lol.
4
Lain kali luangkan waktu untuk memperbaikinya. Ini cara yang baik untuk menghormati komunitas di sini yang meluangkan waktu untuk membantu Anda. Juga jika Anda ingin kode untuk kernel, Anda harus teliti tentang perincian seperti itu!
Caleb
@ Caleb, akan lakukan!
Terima kasih telah mengajukan pertanyaan ini, saya selalu bertanya-tanya pada diri sendiri
Mike Pennington

Jawaban:

11

Pertama:

Untuk tahap bayi, menulis berbagai variasi pada modul "hello world", dan driver perangkat keras virtual, adalah cara terbaik untuk memulai (perangkat keras nyata memperkenalkan masalah dunia nyata yang paling dihadapi ketika Anda memiliki lebih banyak ide tentang apa yang Anda lakukan).

"Linux Device Drivers" adalah buku yang sangat bagus dan layak dimulai dengan: http://lwn.net/Kernel/LDD3/

LDD (dulu, setidaknya) melakukan latihan di mana Anda menulis driver virtual, misalnya disk RAM, dan perangkat jaringan virtual.

Kedua:

berlangganan https://lkml.org/ atau ke milis sub-sistem tempat Anda akan meretas. Bersembunyi sebentar, memindai thread, membaca ulasan kode (membalas tambalan) untuk melihat hal-hal seperti apa yang dilakukan orang tersandung atau mengambil.

Lihat apakah Anda dapat memperoleh perangkat keras (murah) untuk perangkat yang belum didukung, atau belum didukung dengan baik. Kandidat yang baik adalah NIC USB murah atau sejenisnya, periferal USB murah. Sesuatu dengan driver yang ketinggalan zaman, atau out-of-tree, mungkin ditulis vendor, mungkin untuk 2.4.x, sangat ideal, karena Anda dapat mulai dengan sesuatu yang berfungsi (sort-of), dan secara bertahap menyesuaikan / menulis ulang itu, menguji saat Anda pergi. Upaya driver pertama saya adalah untuk NIC USB Davicom DM9601. Ada driver kernel 2.4-series vendor-tertulis yang saya perlahan beradaptasi dengan 2.6. (Catatan: driver di jalur utama bukan driver saya, pada akhirnya orang lain menulis satu dari awal).

Cara lain yang baik adalah dengan melihat situs Kernel Newbies, khususnya "pembersih kernel" todo: http://kernelnewbies.org/KernelJanitors/Todo Ini adalah daftar tugas yang harus dapat ditangani oleh seorang pemula.

jmtd
sumber
4
Jawaban yang bagus untuk Linux, hanya kehilangan satu sumber daya: LXR untuk menelusuri sumber kernel.
Gilles 'SANGAT berhenti menjadi jahat'
8

Ada banyak kernel yang ada.

Linuxbukan satu-satunya game di luar sana, tapi itu yang paling banyak digunakan. Beberapa orang merekomendasikan minixkernel untuk memahami konsep sistem operasi. Saya akan menggunakan Linux 2.6.x series karena ini adalah yang paling umum dan tidak akan sia-sia untuk sesuatu (hampir) tidak ada yang menggunakan. Solaris, XNU (Mac), FreeBSD dan Dragonfly sangat menonjol. 1

Temukan sesuatu yang super sederhana (port serial, usb, dll.) Dan buat itu melakukan sesuatu yang lain. Untuk tantangan tambahan, cobalah menulis modul kernel untuk sesuatu yang belum memilikinya. (Pastikan untuk google tersangka oleh pci sudo lspci -nndan / atau usb id sudo lsusbterlebih dahulu.)

Pembaruan: Jangan lakukan ini secara langsung pada sistem utama Anda, gunakan mesin virtual (VM) (komputer dalam komputer) seperti yang disebutkan. VirtualBox dapat menyediakan ini dan gratis. Juga, saya tidak ingin itu tampak luar biasa, tetapi coba snapshot VM sehingga Anda dapat kembali jika ada sesuatu yang merusak VM itu sendiri.

Pembaruan 2 : Catatan tentang Git (DVCSes inc. Mercurial, fossil, bazaar, darcs) adalah ide yang bagus, kebanyakan untuk kode dan file kecil, file penting. Cobalah untuk tidak menggunakan Git untuk membuat cadangan musik, video, dan semacamnya kecuali Anda mengetahui implikasinya. ;)

dhchdhd
sumber
6

Temukan modul atau driver yang ingin Anda modifikasi atau mulai dengan modul dunia null / hello world dan buatlah dari sana. Secara khusus bekerja dengan modul karena itu akan memungkinkan Anda untuk memuat, membongkar, mengkompilasi ulang dan memuat kembali kode ke kernel yang sedang berjalan. Kemudian Anda bisa masuk ke bit inti, tetapi pada dasarnya modul memiliki semua jenis dan Anda dapat melakukan hampir apa pun yang Anda suka.

Kedua, gunakan VM. Setup mesin tamu di bawah VirtualBox atau lebih dari VM dan lakukan pengujian kernel Anda di sana untuk sementara waktu. Dengan begitu Anda tidak akan membunuh sistem utama Anda ketika Anda memecahkan sesuatu, dan memulai kembali, mundur ke snapshot yang berfungsi, dll sangat mudah.

Ketiga, pelajari git.

Caleb
sumber
1

Seseorang sudah menyebutkan buku "Linux Device Drivers" - ini adalah sumber yang bagus, dan saya sangat merekomendasikannya juga.

Meskipun pertanyaan menyebutkan pencetusnya tidak menanyakan buku secara khusus, edisi terbaru dari buku "Memahami Kernel Linux" ( http://oreilly.com/catalog/9780596005658/ ) sangat berharga dalam mempelajari kernel Linux secara umum , dan juga berisi bagian tentang driver perangkat Linux.

HASIL PERUSAHAAN
sumber