Apa yang mengandung pohon sumber kernel? Apakah ini terkait dengan header kernel Linux?

25

Dalam buku-buku, saya biasanya membaca referensi ke Linux Sumber Pohon di /usr/src/linuxdengan set biasa subdirektori ( arch, block, crypto, ...).

Saya mengharapkan pohon ini mengandung file-file biner yang membentuk kernel. Di sistem saya (Ubuntu 10.04) ...

  1. untuk kernel yang berbeda yang saya miliki (menggunakan unduhan perangkat lunak otomatis, tidak diinstal secara manual), saya menemukan di lokasi ini sebagai gantinya dua sub-direktori untuk setiap kernel sebagai berikut:

    /usr/src/linux-headers-2.6.32-22
    /usr/src/linux-headers-2.6.32-22-generic
    
  2. Di sub direktori saya mengharapkan file biner, antara lain. Namun, saya memeriksa cukup banyak pohon, dan sub-direktori terakhir dari sini tampaknya selalu memiliki Makefile(ketika membacanya, biasanya terdengar lebih seperti file konfigurasi daripada file instalasi), dan kadang-kadang beberapa file lain yang terisolasi (kebanyakan Kconfig).

Pertanyaan saya mungkin naif, tapi saya agak bingung. Apakah (2) apa yang seharusnya saya lihat di Kernel Source Tree; dan mengapa saya memiliki referensi eksplisit ke 'header'? Saya perlu menginstal linux-generic-headersbeberapa waktu lalu untuk beberapa perangkat lunak lain dan tidak yakin apakah ini terkait. Saya menyadari ada alasan bagus untuk makefiles (mis., Untuk menginstal modul di sub-direktori / driver), tetapi (cukup banyak) hanya makefiles?

gnometorule
sumber

Jawaban:

30

kernel-headerPaket distribusi berisi, seperti namanya, hanya file header kernel (ditambah pipa ledeng yang diperlukan) yang diperlukan untuk membangun perangkat lunak seperti modul kernel.

Anda seharusnya tidak berharap menemukan file biner sama sekali di direktori source kernel , kecuali untuk output build. (Jika Anda mengkonfigurasi dan membuat sendiri kernel, direktori source kernel juga akan berisi objek yang dikompilasi, modul, kernel yang dibangun itu sendiri dan beberapa bit dan potongan biner yang membuatnya berfungsi.)
KConfigFile adalah deskripsi opsi konfigurasi kernel (dan dependensinya) yang tersedia untuk direktori / modul tertentu.
Selain itu, itu semua (kebanyakan) kode sumber C, file header dan Makefiles. Ada beberapa skrip pembantu di sana-sini, dan sumber perakitan juga.

Paket header (yang Anda instal) hanya berisi bagian header di atas (dan tidak semua itu - hanya header "yang diekspor"), dan beberapa infrastruktur pembangunan. Jadi apa yang Anda lihat diharapkan. Paket header tidak mengandung kode sumber C (kecuali untuk beberapa bertopik dan membangun kode infrastruktur). Inti dari memiliki jenis paket ini adalah untuk menghemat ruang (dan bandwidth) - keseluruhan pohon sumber kernel Linux agak besar, dan sama sekali tidak perlu jika Anda tidak ingin mengkompilasi kernel sendiri. Paket header dibuat dan dikirimkan oleh distribusi untuk menyediakan hal-hal yang tepat yang diperlukan untuk membangun modul, tetapi tidak lebih. (Mereka tentu tidak mengandung kernel yang dikompilasi.)

Mengatasi komentar Anda: paket tajuk tidak dipindahkan di mana pun. Mereka dibuat untuk versi kernel tertentu, dikemas dalam direktori tertentu, dan hanya itu. Itu hanya satu set file. (Perhatikan bahwa paket header tidak harus memiliki versi yang sama dengan paket biner kernel stabil saat ini - paket header bersifat generik, dan dapat tertinggal di belakang kernel yang sebenarnya Anda jalankan. Namun, paket tersebut seharusnya tidak berasal dari kernel versi yang lebih baru dari kernel yang diinstal (atau target) saat ini.)

Binari kernel yang diinstal biasanya diinstal dalam /bootdirektori, bersama dengan binari bootloader dan file konfigurasi. (Ini kadang-kadang sistem file independen, tidak dipasang secara default.) Nama pasti file tergantung pada kernel dan distribusi. (Begitu juga dengan bootloader.)

Modul kernel yang diinstal berada di sub-direktori:

/lib/modules/`uname -r`/

Jadi misalnya pada sistem saya, mereka saat ini masuk

/lib/modules/3.1.4-gentoo/

Kode sumber kernel lengkap : Di Ubuntu, jika Anda ingin sumber kernel lengkap untuk membuat kernel sendiri, Anda harus menginstal mengikuti petunjuk di sini .

Anda juga bisa mendownload tarbal sumber dari kernel.orgdan membongkar suatu tempat (lakukan tidak menimpa file Ubuntu-instal jika Anda menggunakan tarbal ini, menyimpan barang-barang pribadi Anda dan hal-hal yang dikelola oleh RPM terpisah).

/usr/src/linuxadalah tempat tradisional untuk meletakkan sumber kernel, tetapi tidak ada yang menghalangi Anda untuk meletakkan sumber kernel di tempat lain. Jalur ini juga sering hanya tautan simbolis ke direktori. misalnya saya punya ini di mesin saya:

 $ ls -l /usr/src/linux
lrwxrwxrwx 1 root root 18 Dec  7 17:03 /usr/src/linux -> linux-3.1.4-gentoo

Symlink ada untuk menyederhanakan pembuatan aplikasi yang bergantung pada sumber kernel. Anda menautkan jalur itu ke kernel Anda yang sedang berjalan (atau target) sehingga Anda tidak harus menentukan versi yang tepat atau informasi jalur ketika Anda membuat modul out-of-tree. Paling tidak membantu banyak untuk distribusi berbasis sumber.

Tikar
sumber
Terima kasih banyak atas jawaban terperinci dan agak lengkap ini. Ini telah menggangguku untuk sementara waktu. Jika saya tidak memperpanjang sambutan saya, dan jika Anda menemukan waktu, dapat saya tambahkan, menindaklanjuti: (a) Saya membaca di atas bahwa dalam kasus saya (bukan kernel yang diinstal sendiri), beberapa (satu) dari sub direktori harus (mungkin) berisi kode sumber kernel C dan Assembler. Di mana itu - bukan daftar lengkap, hanya seperti dalam browsing saya mungkin 20 - 30 dari sub-direktori, saya tidak pernah menemukan satu? Saya telah mengunduh file sumber kernel dari kernel.org; Saya hanya bermaksud memahami sistem saya dengan lebih baik. (b) ...
gnometorule
... jadi di mana (secara umum) binari kernel berada ketika Anda tidak menginstal kernel sendiri, seperti dalam kasus saya? (c) Anda merujuk pada "paket header" yang saya ambil sebagai 'linux-generic-header'. Apakah pohon yang saya lihat dari paket itu? Jika ya, apakah mereka pindah ke tempat pohon sumber sebelum menginstalnya? Terima kasih banyak lagi.
gnometorule
(jika Anda menjawab, gunakan 'answer'not comment sehingga saya setidaknya dapat mendukung Anda lagi untuk bantuan Anda)
gnometorule
Diperluas sedikit. Paket header adalah untuk header. Paket sumber lengkap menyediakan kode sumber lengkap. Paket biner hanya menyediakan binari.
Mat
5
linux-sourceberisi sumber upstream, apt-get source linux-image-$(uname -r)dapatkan sumber untuk kernel dengan tambalan Ubuntu.
Lekensteyn