

Biên d‡ch nhân Linux
Tác gi£: Hoàng NgÂc Diêu

–1–
Mˆc lˆc
1TÍng quan v∑nhân Linux trên ph˜Ïng
diªn biên d‡ch l§i 3
1.1 Nhân Linux và viªc biên d‡ch l§i nhân 3
1.2 Tóm t≠t các b˜Óc biên d‡ch (dành cho nh˙ng ai thi∏u kiên nh®n) 3
2T§i sao c¶n biên d‡ch l§i nhân Linux? 5
3Cßu trúc và quy ˜Óc sËhiªu phiên b£n
cıa nhân Linux 6
4òi h‰i tËi thi∫u trong viªc biên d‡ch l§i
nhân Linux 6
4.1 òi h‰i cho nhân Linux 2.4.x 7
4.2 òi h‰i cho nhân Linux 2.6.x 8
5Xác ‡nh cßu hình (hardware) cıa máy 9
6Các b˜Óc chu©n b‡9
6.1 T§o mÎtæa m∑m khiÎng cho nhân ang dùng 9
6.2 T£i mã nguÁn 10
6.3 Ki∫m tra th¸c tính cıa mã nguÁn 11
6.4 X£nén mã nguÁn 12
6.5 Dùng "config" nào thì thích hÒp? 14
7Chønh cßu hình biên d‡ch nhân Linux 14
7.1 Thành ph¶n cıa cßu hình biên d‡ch nhân Linux 14
7.1.1 Thành ph¶n cßu hình biên d‡ch nhân Linux phiên b£n 2.4.x 14
7.1.2 Thành ph¶n cßu hình nhân Linux cho lo§t nhân 2.6.x 17
7.2 i∑u chønh cßu hình biên d‡ch nhân Linux 18
7.2.1 Các công cˆ ∫ xác l™p cßu hình 19
7.2.2 MÎt sË i∫m c¶n chú ˛trong giai o§n hình thành cßu hình
biên d‡ch nhân 20
8Các b˜Óc biên d‡ch 22
8.1 B˜Óc t§odependency, dÂn dµp và t§o nhân 22
8.2 B˜Óc t§o modules và cài modules 24
8.3 Tách rÌi mã nguÁn và hÁsÏoutput trên lo§t nhân 2.6.x 25
8.3.1 "make help", mÎt tiªn ích mÓi trên lo§t nhân 2.6.x 26

–2–
8.3.2 Tách rÌi mã nguÁn và output files 27
9Cài ∞t nhân 27
9.1 Cài ∞t vÓi "make install" 28
9.1.1 Ëi vÓi GRUB 28
9.1.2 Ëi vÓi LILO 29
9.2 Các b˜Óc cài ∞t b¨ng tay 31
9.2.1 T§o initrd 31
9.2.2 Copy nhân và System.map 32
9.2.3 Chønh cßu hình cıa bootloader config 33
10 KhiÎng l§i máy và chønh l˛n∏u g∞p
trˆc tr∞c 35
10.1 B‡treo khi khiÎng vào linux 35
10.2 B‡treo trong quá trình nhân ˜Òc load 36
11 Vá và biên d‡ch nhân 37
11.1 Các i∫m quan trÂng tr˜Óc khi vá 37
11.2 T£i, x£và vá 38

–3–
1 TÍng quan v∑nhân Linux trên ph˜Ïng diªn biên d‡ch
l§i
1.1 Nhân Linux và viªc biên d‡ch l§i nhân
Nhân Linux là mÎt "nhân hiªn§i" có tính module rßt cao. T¯kernel phiên b£n 2.6.x tr
i, có rßt nhi∑u ch˘c n´ng và mrÎng. VÓi tinh th¶n "biên d‡ch nhân", mÎt y∏u tËchính
y∏u và quan trÂng nhßt c¶n ghi nh™nó là tính phân bÎ(modularity) cıa nhân Linux.
Ëi vÓi ng˜Ìi dùng bình th˜Ìng, modularity cho phép chÂn l¸a cách biên d‡ch các drivers
cıa nhân theo d§ng modules hay theo d§ng biên d‡ch tr¸c ti∏p vào nhân. Thông th˜Ìng,
khi xác l™p cßu hình cho nhân có ba chÂn l¸a: Y, M và N.
Có nh˙ng "driver" không th∫biên d‡ch nh˜mÎt module vì nó ph£i˜Òc load and link
tr¸c ti∏p ngay khi nhân khiÎng. CÙng có nh˙ng "driver" cho phép chÂn nh˜mÎt
module và ˜Òc t£i trong khi và sau khi nhân ˜Òc khiÎng. i∫m chính y∏u c¶n n≠m
b≠t trong giÓi h§n chı ∑ "Biên d‡ch nhân Linux" là hi∫u rõ t§i sao ph£i chÂn M (cho
module), Y (cho biên d‡ch tr¸c ti∏p) và N (không dùng) các drivers này.
•Biên d‡ch tr¸c ti∏p vào kernel có nghæa là các "drivers" này dù có ˜Òc dùng hay
không v®n˜Òc t£i lên khi nhân khiÎng và tßt nhiên nó s≥chi∏m mÎt ph¶n bÎ
nhÓ. LÒii∫m chính cıa chÂn l¸a này là mÎt khi "drivers"ã˜Òc biên d‡ch vào
nhân thì không còn ph£i quan ng§i∏n tính trung th¸c cıa nhân và các driver n˙a.
Các hªthËng làm viªcòi h‰i tính b£o m™t cao không dùng modules mà biên d‡ch
thØng vào nhânkernel ∫ tránh tr˜Ìng hÒp các modules không tin c™y "b‡" cài vào
nhân lúc nào ó trong quá trình ho§tÎng cıa máy. LÒii∫m k∏ti∏p cıa chÂn l¸a
này là tính hiªu xußtxußt (rßt nh‰), khi c¶n driver thì ã có sÆn và không c¶n˘ng t£i
n˙a.
•Biên d‡ch nh˜các modules cho nhân có nghæa là chøkhi nào c¶n dùng các "drivers"
này mÓi˜Òc˘ng t£i. LÒii∫m cıa chÂn l¸a này nÍi b™tkhía c§nh x˚dˆng bÎnhÓ
và tài nguyên trên máy. VÓi l¸a chÂn này, b§n có th∫t§o nên mÎt nhân rßt nh‰và dπ
dàng di chuy∫n cho nhi∑u mˆcích khác nhau. LÒii∫m k∏ti∏p là kh£n´ng biên
d‡ch l§i chømÎt ho∞c mÎt sËmodules nào ó (c¶n c™p nh™t chØng h§n). Tßt nhiên ∫
th¸c hiªn chuyªn này thì ph£i tho£mãn tßt c£nh˙ng òi h‰i v∑tính phˆthuÎc cho hª
thËng.
1.2 Tóm t≠t các b˜Óc biên d‡ch (dành cho nh˙ng ai thi∏u kiên
nh®n)
Biên d‡ch nhân Linux rßtÏn gi£n n∏u nh˜ ã hi∫u rõ các quy trình và các b˜Óc th¸c
hiªn. Sau ây là các lªnh c¶n thi∏t, gi£ ‡nh b§nã có trÂn bÎcác công cˆc¶n thi∏t∫
biên d‡ch:

