Tìm hiểu nhân của hệ điều hành Linux
Nhân (kernel) c a Linux g m 5 ti u h th ng chính: ồ ệ ố ủ ể
1. B phân th i cho ti n trình (Process Scheduler-SCHED): ộ ờ ế
ỉ ạ ệ ự ơ ứ ế ề ơ ả ộ i m t t v c b n PC v n là m t h th ng x lý đ n t c là ch có 1 l nh th c thi t ử ề c nh v y? B ng cách ộ ằ ề ượ ươ ư ậ ậ ả ữ ư ng trình ch y cùng m t lúc. Làm sao chúng làm đ ự ạ ệ ơ ồ ẽ ạ ng trình th t nhanh làm cho chúng ta có c m giác các ể ng trình ch y cùng lúc v i nhau. Ví d b n v a đánh Winword v a ch i Winamp thì th t ra ừ ậ ươ ệ i v.v Vi c ệ ể ạ
ư ệ ẫ ơ ả ậ ự ể ả ậ l p đa nhi m. Interrupt 1Ch th c ch t đ ấ ượ ộ ứ ự ệ ộ ọ ẽ ệ ộ ầ ể ử ắ ế ng nó ch y song song v i ch ặ ị ệ ư t 1 ch ươ ế ế ẽ ọ ạ ưở t m t ch ộ ả ụ ậ ớ ồ ậ ng trình ping pong g m 1 hay nhi u trái tim ch y va đ p ẫ ủ ạ ệ ề ệ ắ ạ ề ử ụ ế ề ể ủ ủ ư ể ể ố Nh b n bi ẫ ư ạ ộ ệ ố th i đi m. Tuy nhiên các h đi u hành đa nhi m(multi-task) nh Windows, Linux v.v đ u cho ệ ề ệ ể ờ phép nhi u ch ạ chuy n quy n th c thi qua l i gi a các ch ươ ạ ề ch ụ ạ ừ ớ SCHED s ch y Winword 5,10 l nh xong chuy n qua Winamp 5,10 l nh r i chuy n l ể này c c kì nhanh nên b n không có c m giác gì. ạ ự ể H đi u hành MSDOS ngày x a th t s là h đi u hành đ n nhi m, tuy nhiên b n v n có th ạ ệ ề ệ ề c Timer IRQ (6 b y ng t 1Ch (hook interrupt) đ gi ệ ắ ẩ hay 8 gì quên m t r i) g i. Timer IRQ là m t ng t c ng t c là tín hi u do b phát xung g i t ở ớ i ắ ứ ấ ồ CPU. M c đ nh là 1/13 giây 1 l n b phát xung này g i 1 tín hi u IRQ đ n CPU. Khi đó CPU s ở ạ ng ng l nh đang thi hành chuy n qua x lý ng t. Timer IRQ sau đó s g i ng t 1Ch. N u b n ắ ng trình con hook int 1Ch, thì b n s có c m t vi ươ ng ạ ẽ ớ ng trình ch y trình chính (th t ra 1/13s nó m i ch y 1 l n). ng d ng cái này tôi có vi ạ ươ ế ầ Ứ ạ banner trong màn hình DOS, hay ch ạ ề ươ vào các c nh c a màn hình, trong khi v n ch y DOS. Các h đi u hành đa nhi m sau này đ u x d ng nguyên t c này đ làm SCHED. Tuy nhiên 1/13s thì không đ nhanh đ switch qua nhi u ti n trình nh ng xài hàm c a BIOS ta có th tăng t c cho SCHED 1/100s 1 l n ch ng h n. ầ ẳ ạ
2. B qu n lý b nh (Memory Manager-MM): ộ ớ ộ ả
1
ỉ ướ c (conventional memory) c a PC ch có 640K thôi. Do ch ủ ỉ ươ A0000 tr lên) dùng đ ánh x (map) ừ i FFFFF, mà vùng nh cao (High memory t ớ ng trình BIOS ch qu n ả ạ ạ ể c (Low memory) là ượ ở t b ngo i vi khác, vùng nh còn xài đ ế ị ổ ố ỏ ằ ở ớ ạ ẽ ế ấ ồ ế ạ ạ ể ể ạ ổ ủ ch đ b o v (protect mode) c a ệ c c p cho 4G ờ ủ i còn có 1 page 64K trong vùng nh cao. Tuy nhiên b n có th thay đ i ánh x đ truy xu t ấ nh v y. ộ ớ ả ư ệ ượ ấ ạ ừ ư ủ ánh x t ng page c a ả ả ấ đ c ánh x đ y đ (ánh x h t l y gì cho ờ ượ ạ ỉ ị ồ ạ ầ ủ ỉ ạ ế ấ ọ ầ ớ ư ặ ấ ạ ặ physical memory. B nh qui ớ ộ lý đ c t ượ ớ BIOS, Video card memory và các thi ắ ạ 9FFFF tr xu ng. Dùng calculator đ i 9FFFF ra decimal b n s có đúng 640K :)). Ch c b n t ừ ng c nhiên h i r ng cây RAM 512M mua h t $70 c a tôi bi n đâu m t r i??? Hihihi nó bây gi ạ teo l ớ h t 512M. RAM card màn hình cũng t ng t ươ ế ự ư ậ Ở ế ộ ả CPU 32bít đ a ra khái ni m virtual memory (b nh o). Lúc này m i process đ ỗ 1 table mô t 00000000-FFFFFFFF. Nh ng kernel s gi virtual memory t ẽ ữ ừ virtual memory v i physical memory. Physical memory bây gi bao g m c RAM và swap disk ờ ớ space. T t nhiên là 4G virtual memory không bao gi m y process khác ch y). Ph n l n m c dù có đánh đ a ch , nh ng ch khi b n đ c ho c ghi lên đó thì kernel m i allocate t ớ ừ
3. H th ng file o (Virtual File System – VFS) ệ ố ả
ỉ ấ ấ ả Linux t t l p theo h ệ ố t c là th i trang thì ta có th nói ở ế ậ ệ ề ấ ả t c là file. Ý ấ ấ ả ướ ề ư ể Unix và các h đi u hành sau này đi u thi ể H th ng này không ch cung c p truy xu t đ n h th ng file trên harddisk mà còn cho t t c các ấ ế thi ờ ừ ng đ y. Đ ng t ưở quên là trong DOS b n dùng copy xxx con đ in file xxx ra màn hình. Khi đó “con “ là filehandler cho thi ệ ố t b ngo i vi. N u nh Triump t ạ ế ế ị ng này b t ngu n t ồ ừ ắ ạ t b xu t chu n (console). ẩ ế ị ấ
4. Giao di n m ng (Network Interface-NET). ệ ạ
Linux d ng s n TCP/IP trong kernel. Do DOS không có cái này nên tác gi ự ẵ ả ư ch a hi u rõ l m. ể ắ
5. B truy n thông n i b (Inter-process communication IPC) ộ ộ ộ ề
ệ ố ươ ữ ệ ề ế Cung c p các ph ấ s cùng nhau tìm hi u sau. ẽ ng ti n truy n thông gi a các ti n trình trong cùng h th ng Linux. Chúng ta ể
ữ ệ ấ ệ ề ữ ệ ờ
ộ ữ ệ ạ ộ ộ ữ ệ ể ỉ ư ế ọ ỗ ế ụ ụ ỏ ị ủ ữ ệ ủ ả Các c u trúc d li u h th ng. ệ ố H đi u hành Linux ho t đ ng nh vào các d li u này ạ ộ 1. Task list (Danh sách tác v ) ụ SCHED l u 1 b d li u cho m i ti n trình đang ho t đ ng. Các b d li u này làm thành 1 danh sách liên k t g i là danh sách tác v . SCHED còn có 1 con tr current đ ch tác v nào đang active. Theo tôi nghĩ thì các d li u này ph i có các giá tr c a các thanh ghi c a process đó ngay lúc nó b switch. Khi m t ti n trình đ c active tr ph i SCHED s khôi ph c các giá tr này. ẽ ộ ế ượ ụ ả ở ị ị
i thích ư ả b nh v t lý cho b nh o 4G c a m i ti n trình. ớ ả ỗ ế ớ ậ ở ộ ạ ộ ớ trên MM c n 1 ánh x t ầ ạ ừ ộ ấ ể ỉ ủ ụ ể ấ ả ừ 2. Memory map(Ánh x b nh ) Nh gi Ngoài ra còn các thông tin đ ch cách l y và thay cho t ng trang c th . T t c các thông tin này ch a trong memory map và memory map đ c ch a trong trong task list. ượ ứ ứ
ể ấ ạ ng h p đĩa c ng và đĩa m m là các sector, cyclinder và head. 3. I-nodes VFS dùng i-nodes đ đ nh v các file. C u trúc d li u i-nodes dùng đ ánh x các file block thành ữ ệ các đ a ch v t lý ề ể ị tr ở ườ ị ợ ỉ ậ ứ ị
4. Data connection Mô t ả network connection đang m ở
task list. M i 1 process có m t con tr ch t ấ ồ ừ ắ i danh sách các i-node c a các file đang m cho riêng ỏ ỉ ớ i ỗ ủ ề ỏ ỉ ớ i danh sách các data connection cho t ộ ở t c các network connection ỏ ỉ ớ ấ ả T t c các c u trúc d li u này đ u b t ngu n t ữ ệ ấ ả c u trúc memory map, 1 con tr ch t ấ process đó, và 1 con tr ch t đang m . ở
2
**************************
ế ệ ậ C u trúc c a SCHED ủ ấ Bây gi ai cũng bi gian x d ng CPU cho t ủ ệ ề t c các process , process bình th ng cũng nh các ti u h th ng. ờ ử ụ t đây là b ph n trung tâm c a h đi u hành. Nó ch u trách nhi m chia s th i ẽ ờ ườ ộ ấ ả ệ ố ị ư ể
c chia thành 4 module ượ ch u trách nhi m phân x xem process nào đ ệ ử ờ ố ộ ậ ợ ậ ề ợ ụ ạ ộ ơ ở ủ ậ ị ề ấ ng h p 1 process l ườ ệ ố ề ờ
module này g m các code assembly ph ế ụ ồ ộ ạ ụ ỗ ộ ậ ừ ế ậ ể ể ờ ọ ở ộ module ph thu c ụ MM đ thi ế t c resume. Nên nh module ph thu c ki n trúc s khác ẽ ử ượ ụ ế ộ m i lo i CPU ( 386, apha, v.v) nh ng module đ c l p ki n trúc thì không đ i kĩ thu t này ớ ộ ậ ở ỗ ư ế ậ ổ t nó là abstract ng s bi ạ ướ ẽ ế . G m các hàm mà user có th dùng đ t ớ ng tác v i ể ươ ể SCHED đ 1. Module lu t đ nh th i (scheduling policy): ượ c ị ờ quy n truy xu t CPU. H th ng ho t đ ng có thông su t hay không nh vào b lu t này, tránh ệ ố i d ng s h c a đi u lu t mà chi m th i gian h th ng qua nhi u làm tr ế các process khác b đóng băng (freeze) ị 2. Module ph thu c ki n trúc (architeture-specific): ộ thu c vào m i lo i CPU dùng đ suspend hay assume process. ể module g i các hàm t 3. Module đ c l p ki n trúc (architeture-independent): ọ ki n trúc và module lu t đ switch gi a các process đ ng th i nó còn g i các hàm ồ ế l p virtual memory cho các process đ ậ nhau ỉ ng đ i t ai l p trình h ố ượ ậ 4. Module hàm g i h th ng (system call) ọ ệ ố SCHED. Ai l p trình Linux và Unix s quen v i các system call này. ồ ớ ẽ ậ
ấ ữ ệ ể c public. Các b n có th dùng nó đ phân tích ể ữ ệ ượ ể ạ C u trúc d li u ữ ệ Task list: ch a d li u đ đ suspend và resume 1 process. Ngoài ra còn có các d li u dùng đ ứ ữ ệ ủ ể th ng kê tr ng thái h th ng. Các d li u này đ ệ ố ạ ố h th ng đang ch y ệ ố ạ
ấ ớ ả ệ ế ấ ộ ể ớ ậ ạ ử ộ ớ ộ ớ ả ữ ừ c ng cho phép PC dùng b nh RAM còn tr ng. C u trúc MM MM ch u trách nhi m đi u khi n ti n trình truy xu t tài nguyên b nh . B n thân CPU cũng có ể ị m t h th ng qu n lý b nh v t lý mà cho phép ánh x gi a b nh process v i b nh v t lý. ộ ộ ệ ố ớ ậ ẽ MM ph i l u tr ánh x này cho t ng process. Thêm vào đó MM còn cho phép swap; nó s di ả ư ạ chuy n nh ng trang b nh không dùng xu ng ố ộ ữ ổ ứ ể ớ ố ộ ớ
ộ ế ủ ệ ố ớ ủ ả ọ ộ ụ ộ ậ ế ị ớ ả ừ ế ạ ộ ế ế ả ẽ ổ MM có 3 module 1. Module ph thu c ki n trúc: code g i các l nh c a h th ng qu n lý b nh c a CPU ệ 2. Module đ c l p ki n trúc: ánh x cho t ng process và swap b nh o. Nó cũng quy t đ nh xem ph i remove trang nào , load trang nào. Các l p trình viên Linux không thi t k 1 module ậ policy riêng vì policy cho MM s không thay đ i. 3. System call cho phép các process tác đ ng lên MM bao g m xin c p phát vùng nh ớ ấ ồ ộ
C u trúc VFS ấ
t c các thi ấ ấ ả ế ị ị t b ph n c ng. Ngoài ra VFS còn ch u ầ ứ VFS thi trách nhi m load các ch t k đ th ng nh t cách truy xu t t ấ ế ế ể ố ng trình th c thi. ươ ệ ự
3
Modules 1. Các module thi t b đi u ki n, m i m t ph n c ng s có 1 module thi ế ị ề ầ ứ ẽ ể ộ ỗ ế ị ề t b đi u ki n riêng, cái ể
ng g i là driver. Linux cũng nh các h đi u hành khác cho phép thêm vào 1 driver m i. ọ ư ườ ệ ề ớ t b . Cái này là abstract cho t t c các driver ế ị ộ ậ ấ ả ỗ ệ ố có nhi u h th ng fiel khác nhau, m i h th ng ệ ố ự ế ề ộ ể ộ ậ ạ ấ ả t c các driver. Ai l p trình driver cho DOS thì có l ấ ả ạ ữ nh ch này t ớ ổ ụ ư ẽ ữ ệ ỗ ầ ề
này th 2. Module giao di n đ c l p thi ệ 3. Các module h th ng file logic: Trên th c t ệ ố file có m t module đi u khi n riêng. ề 4. Module đ c l p h th ng file: Cái này là abstract không nh ng cho các lo i file system mà còn ệ ố t c các driver qui v 2 cho t ề ậ lo i lo i block m i l n đ c hay ghi đ u đi theo block d li u ví d nh ng disk và lo i kí t ự ỗ m i ạ ọ ạ l n đ c và ghi 1 kí t ự ư ầ 5. Cu i cùng là system call các hàm g i h th ng cho VFS nh máy in bàn phím v.v ọ ệ ố ọ ố
C u trúc NET ấ
ệ ố ế ấ ằ ạ ạ ớ t m ng thì r t nhi u ề ấ t c cho phép nh ng ph n khác có th truy xu t ầ ấ ả ứ ể ữ c s d ng t b và giao th c đ NET cho phép Linux connect v i các h th ng khác b ng m ng. Ai cũng bi lo i thi ế ị ạ qua m ng mà không quan tâm đ n các thi ạ t b và giao th c m ng. NET abstract t ạ ế ị ứ ượ ử ụ ề
t b ế ị t c các thi ấ ả ộ ậ ứ ạ ứ ộ ậ ạ ạ NET có 5 module t b m ng, m i module cho m i lo i thi 1. Các Driver cho thi ỗ ạ ỗ ế ị ạ t b m ng t b : abstract t 2. Module đ c l p thi ế ị ạ ế ị 3. Các Module giao th c m ng: m i module cho m i lo i giao th c truy n ỗ ề ạ ỗ ứ 4. Module đ c l p giao th c m ng: abstract cho t t c các module giao th c m ng và các driver. ứ ấ ả 5. System call
đây ta ch phân tích cho h th ng máy tính PC i386 còn các lo i khác thì ệ ố ạ ỉ ở ộ Ở
ở ộ ế ị ọ ọ ộ ươ ầ ng trình này đ c ti p ph n ọ ế c nén t b boot lên b nh ớ ế ị ng trình bootsector, ch ượ
Booting (kh i đ ng) không bi t :) ế c kh i đ ng máy tính Có 6 b ướ t b boot ng trình BIOS ch n thi 1. Ch ươ 2. Ch ng trình BIOS đ c bootsector t thi ươ ừ 3. Quy n đi u khi n chuy n qua cho ch ể ề ề ươ ể ng trình gi setup , các ch i nén và kernel image đã đ ươ ả i nén c gi 4. Kernel s đ trong protected mode ở ả ẽ ượ 5. Kh i đ ng m c th p b i assembly code ứ ở ộ ở ấ 6. Kh i đ ng m c cao cho C code ứ ở ộ
ủ ướ ế ị ế ế ầ ở ộ ủ ạ ạ ạ ạ ậ ấ t k đ u tiên c a máy tính – máy Turing, máy tính là 1 thi ẳ ươ t b cho phép ch y đúng ng trình calculator. Các máy ươ ạ ế ng trình b ng tay vào ch y k t thúc r i l ậ ệ i n p ồ ạ ạ ạ ươ ữ ạ ng trình thôi. Tuy nhiên ch ứ ạ ỉ ươ ề ề ớ ữ ằ ấ ng trình này có kh năng n p nh ng ch ả ơ ồ ế ệ ở ộ ạ ậ
4
ng trình kh i đ ng là n p cho đ c ch ở ộ ươ ươ ạ ng trình l p vô t n (infinite loop) nó ch l nh c a user đ n p các ch B c 1: BIOS POST (Kh i đ ng c a BIOS) Theo b n thi ả ng trình thôi. Các máy tinh Casio ch ng h n cũng ch y 1 ch 1 ch ươ tinh ch y băng gi y cũng v y b n n p ch ạ ạ ng trình khác. B n thân máy PC Pent4 hi n đ i nh t cũng v y cũng ch cho phép ch y đúng ch ả ươ ạ 1 ch ớ ng trình khác l n ươ h n ph c t p (khác v i vi c n p tay nh h i x a) h n r i chuy n quy n đi u khi n cho chúng ể ể ư ồ ư ơ ệ ạ đ ti p t c nh ng dòng l nh th c thi không ng ng cho đ n khi t t máy tính. Ch ng trình ban ắ ừ ệ ươ ự ể ế ụ c g i là ch đ u này đ ắ i ta n p nó vào con BIOS và g n ng trình kh i đ ng, đ thu n ti n ng ượ ọ ườ ể ươ ầ chung vào h th ng PC. ệ ố M c đích c a ch ủ ch ậ ng trình h đi u hành (OS). OS s là ẽ ể ạ ng trình ng d ng , ứ ệ ề ươ ụ ươ ượ ủ ờ ệ ụ ậ
ụ kh năng ch ch y đ ng trình ng ng trình ng d ng k t thúc thì quy n th c th tr v cho OS ... OS l ứ ng trình khác. V y t ườ ự ề ỉ ạ ượ ế ậ ừ ả ươ ờ i ti p t c ch ạ ế ụ i ta đã phát minh đ ng nh ng ch ng trình khác giúp cho máy ị ả ề c 1 ch ữ ạ ự ộ ươ ng trình cho phép n p t ươ ơ
khi các ch ươ đ n p ch ươ ể ạ ra h đi u hành là 1 ch ệ ề tính có kh năng to l n h n. ớ ả BIOS -----> OS --------> Application ...................|____________|
ồ ậ ộ ạ ố ộ ủ t b trong ộ ồ ệ ồ ồ ẽ ạ ệ ị ồ c g i vào bus báo cho các thi ượ ở ế ị
ng #RESET c a CPU on, CPU kh i đ ng real mode(8086) ồ ờ ườ ở ộ ủ ở
t b ch y (giá tr RAM ch y vèo vèo trên màn hình) ạ ươ ị i 0 ng trình ki m tra thi ể ượ c kh i đ ng t ở ộ ng trình BIOS Bootstrap Loader ch y qua int 0x19 %dl=ds hi u đĩa kh i đ ng. ố ệ ổ ở ộ ạ i track 0 sector 1 (boot sector) lên đ a ch 0x7C00 ụ a. Khi b t đi n, B ngu n s ch y b t o xung (đ ng h nh p - t c đ Hetz c a memboard ph c thu c vào đ ng h này), và tín hi u POWERGOOD đ ộ PC. b. Đ ng th i đ c. Các thanh ghi %ds=%es=%fs=%gs=0, %cs=0xFFFF, %ip=FFF0 d. Ch ế ị ạ e. B ng interrupt đ ả ạ f. Ch ươ ng trình này t Ch ươ ả ị ỉ
K t lu n:
ế
ậ
c xây d ng theo các khái ni m h đi u hành thông th ng thôi, tuy nhiên ộ ư ượ ườ ệ ớ ướ c. ớ ệ ố i khác nhau cùng làm vi c trên các ph n khác nhau mà h th ng ệ ề ề ớ ệ ề ầ H t nh ng Linux đ ự các programmer c a Linux c g ng phân chia thành nhi u l p, L p sau là abstract cho l p tr ủ ố ắ Cách này cho phép nhi u ng ườ v n đ m b o tính th ng nh t và n đ nh. ấ ố ẩ ả ả ổ ị
Conceptual Architecture of the Linux Kernel ị ầ ủ ế ừ ứ ẽ ệ ấ các ph n sau. Không th y ai đ c và có ý ki n ch ng l mình nói đúng h t hixhixhix, t ế ở ẽ ế ế ấ ầ ẳ ọ Okê ph n này ch y u d ch t http://plg.uwaterloo.ca/~itbowman/CS746G/a1/. T c là c u trúc khái ni m. Chúng ta s đi sâu vào chi ti ph n này h i khó đây. ơ ầ
kĩ thu t v c u trúc máy tính , tôi không ti n gi ữ ừ ậ ề ấ ệ ả ẽ ố ấ i thích c n k vì s t n r t ẽ ặ Giài thích: đây là nh ng t Ở nhi u th i gian. ờ ề
ề ư ữ ệ ừ c a ữ ệ ữ ọ t 1 đo n trên 1 đ đĩa không đ c hay ghi 1 bit hay 1 byte d li u mà là 1 ỗ ng tròn g i là cung (sector). M i ế ườ ạ ọ c 512 bytes. ng l u tr đ ư tròn to t ượ ị ướ ổ ầ ng. Sector đ u c BIOS ẽ ượ ủ i lên khi boot. Toàn b ch Bootsector và ph n setupĐĩa c ng và đĩa m m l u tr ghi d li u thành t ng rãnh (track) là ứ ầ nh ng vòng tròn đ ng tâm. Đ u t ầ ừ ủ ổ ồ ữ đo n trên 1 track, h c hình h c ai cũng bi ọ ọ ạ sector th ữ ượ ườ c đ nh v b ng 1 l Track đ u tiên còn g i là track 0 trên đĩa m m đ ị ằ ề ọ ầ tiên sector 1 c a track 0 (đánh s h i b kì nh ng ph i nh ) g i là bootsector vì nó s đ ả ớ ọ ư ố ơ ị ng trình kh i đ ng m m 512bytes n m trong sector này. t ề ở ộ ả ộ ươ ằ
5
site www.kernel.org kho ng 34M không thôi ừ ả c. ượ ặ t b ng ngôn ng assembly cho Linux ế ằ ữ Bây gi hãy download source code linux kernel 2.4 t ờ đĩa cài đ t Linux cũng đ chép t ừ M file: arch/i386/boot/bootsect.S. Đây là source code vi ở bootsector .
ủ ư ả ừ ị i đó. Ch này ch a hi u ý đ nh c a ng ị ổ ớ ể ủ ế ủ ở ầ ồ i lên 0x7C0:0 đ n ví trí cu i ố ườ ậ i l p ư đây các programmer Linux chú thích khá kĩ (không nh các source code c a Vietnam :)). v trí kh i đ u mà BIOS POST t ớ vùng nh 0x7C00 nhanh chóng s ẽ ớ ậ ẽ ướ ở ộ ng trình t ươ ủ i lên sau. ả ữ ủ ả ớ ủ ổ ầ ứ ố ả ộ ả ề ế ộ ọ ừ i kho ng gi a c a segment 0x9000 dĩa m i (disk parameters table). Ph n c ng c a ố ằ ặ ị ạ ố ạ ả ượ ể ượ ế ộ ọ ướ ồ
s khác; trích t đĩa giá tr th c t chú thích c a ng ừ ư ị ự ế ẽ ườ ậ
ố ứ ầ ế ồ ớ ầ ư ế ủ ấ ủ ổ ấ
i sector 18, ch ng l Linux l ầ ả i ị đĩa. 36 ầ ự ọ ư ng dùng. 15 là 1.2M đĩa to nh bánh tráng và 9 là 760K cũng to nh i hi u nó ể ư i t ị ỗ ạ ư ỉ ế ẽ ạ ẳ track 0 thì coi nh v t. ư ứ ở ẽ các sector ti p theo bootsector s đ c t ươ ng trình setup c a Linux n m ằ ở ủ ầ ố i lên ngay sau ấ ẽ ượ ả ọ ế ặ ị ỗ ầ
d ng nén(compressed kernel image) s đ ng trình system v trí i c t ẽ ượ ả ở ị ở ạ ươ ặ ị ướ ị c m c đ nh là 0x7F00 tính theo đ n v 16-bytes = c 640K. ơ ớ ướ t quá b nh qui ộ ệ i offset 0x220 ch u trách nhi m ị ẽ ượ ạ ằ ể ộ ầ i kernel vào b nh cao. ộ i setup và system, ch ng trình setup s đ c th c hi n t i segment ẽ ượ ệ ạ ươ ự ả Ở 1. Chép 512 bytes bootsector t cùng c a vùng nh qui c 0x9000:0, r i jmp t trình vì ch ng trình kh i đ ng c a DOS không làm v y. Có l ươ b chép đè b i các ch ở ị c kh i đ ng t 2. Stack đ ạ ỏ ộ ượ ụ đĩa ho t đ ng ph 3. Kh i t o b ng tham s ạ ộ ố ổ ả ở ạ thu c b ng tham s này. M c đ nh có b ng tham s n m trong BIOS, tuy nhiên nhi u BIOS ch ỉ ề i ch đ đ c nhi u sector cũng lúc đ tăng set ch đ đ c t ng sector. Linux programmer set l i đo n stack (stack ch y ng i HĐH. B ng tham s này đ t c đ t c lên c chép v ngay d ạ ề ố ộ ả ọ nên b o đ m không đ ng hàng) g m 12 bytes. Bytes 0x4 là d li u ch a s sector maxium đ c ứ ố ữ ệ ụ ả ả ư ậ đĩa 2.88M, set cao nh v y cùng 1 lúc đ c patch thành 36 – 36 là s sector trong 1 track c a ủ ổ ượ ố nh ng tuy lo i i l p trình “high doesn’t ủ ạ ổ hurt but low does”. 4. Tính toán s sector trên 1 track. H i xa x a đây là ph n nh c đ u v i các bác vi t bootvirus. ư G n nh không có cách chính xác cái này v i cái xác đ nh FAT12 và FAT16. Tuy nhiên cách gi ớ quy t c a m y tay Linux programmer này cũng hay. L n l a đ c các sector cao nh t c a là 2.88M. 18 là 1.44M th ườ v y nh ch có 1 m t thôi. Có đi u n u đĩa 1.44M b l ặ ậ ề là 1.2M sao :), mà k h ng b t c sector nào ấ ứ ệ ỏ Lúc này Linux s in dòng ch : “Loading” lên màn hình ử 5. Ch bootsector: 0x90200. S sector cho ph n setup m c đ nh là 4. M i l n đ c 1 track nó in d u ch m ấ ra màn hình. 6. Ti p theo ch ế 0x10000 - ch a 64K low memory. Kích th ừ 508K. Linux còn có ch đ big-kernel khi này kernel image s v Khi đó trong code c a ph n setup có hàm bootsect_kludge n m t ủ t ớ ả 7. K t thúc quá trình t ế 0x9020
t b ng ngôn ng assembly cho Linux setup. ở ữ ế ằ ỉ ầ c t ể ượ ả ở
i cho đ . N u v n không đ ẩ ủ i b i các loader khác nhau bootsect.S ch là loader chu n c a ượ ả ầ ủ c t i đ y đ i “loader sai. c nó đành báo l i l ả ạ ủ ế ẽ ố ắ ở ầ ẫ ượ ỗ
c b nh . Nh ng ta đã đ c p b nh cao c a máy tính (t 640K tr lên) ướ ộ ư ủ ừ ớ ộ ớ ở ầ ể ể ố i 64M. ấ ạ ỉ ướ ế ộ ồ ế ể ằ
6
ủ ả ằ M file: arch/i386/boot/setup.S. Đây là source code vi 1. Ph n setup này có th đ Linux thôi ngoài ra còn còn LILO hay Loadin v.v. M đ u setup check xem nó có đ không. Nên không nó s c g ng t Pó tay ...” 2. Ki m tra kích th ề ậ ể khá ph c t p. Linux dùng 3 cách khác nhau đ detect. Cách đ u tiên là E820h, dùng hàm ax=E820, ể ứ ạ int 15h đ ki m tra. N u th t b i dùng hàm ax=E801h, int 15h. Cu i cùng là dùng cách ax=8800h, ế int 15h đây là cách c đi n ch cho memory d ổ ể 3. Ti p theo setup g i hàm video n m trong file video.S đây là code assembly đ detect ch đ đ ọ ho ạ 4. L y disk parameter table c a harddisks. Các b ng này n m trong BIOS, trong quá trình BIOS ấ ả t b hay là b n set tay trong b ng BIOS. Sau quá trình BIOS POST, v trí c a các b ng detect thi ế ị ủ ạ ả ị
i 0:(4 * 41h) cho hd0 và 0:(4 * 46h) cho hd1. c đ t t ượ ặ ạ ằ ộ t ế này đ 5. Check MCA bus b ng hàm c0h c a int 15h ủ 6. Check con chu t PS/2 dùng int 11h 7. Check APM bios: cách này không bi t l p protected mode. Chuy n t 8. Thi real mode sang protected mode ể ừ ế ậ
i th i kì CPU 8086. 8086 bao ờ ậ ể ị ở ạ
k t qu các phép tính toán h c. ườ ọ
ườ ườ ệ ng l u gi ả ư ữ ế ng dùng đ đ nh v [bx+??] ị ể ị ng dùng ch a s đ m trong các l nh loop rep ứ ố ế ng ch a d li u trong phép tinh toán h c ơ ở ế ữ ệ ứ ữ ệ ườ ỉ ụ ị ọ ỉ ồ ỉ ị ỏ
ử ậ ấ
Protected mode. Th t khó đ đ nh nghĩa protected mode là cái gì. Chúng ta quay tr l g m các thanh ghi 16 bít (2 bytes). ồ AX: Accumulate – thanh ghi tích lũy vì ax th BX: Base – thanh ghi c s vì bx th CX: Count – thanh ghi đ m vì cx th DX: Data – thanh ghi d li u vì dx th SI,DI: source index, destination index-thanh ghi ch m c đ a ch ngu n và đ a ch đích SP: stack pointer: thanh ghi con tr stack IP: intruction pointer: thanh ghi con tr l nh ỏ ệ BP: base pointer: thanh ghi con tr c s dùng đ nh stack frame trong c u trúc ngôn ng b c cao. ị ỏ ơ ở CS: code segment: thanh ghi đo n l nh ạ ệ DS: data segment: thanh ghi đo n d li u ạ ữ ệ ES: extra segment: thanh ghi đo n d li u ạ ữ ệ SS: stack segment: thanh ghi đo n stack ạ
ị ộ ặ ể
ắ ỉ ữ ệ ỉ ữ ệ
Đ xác đ nh 1 v trí trong b nh c n 2 c p thanh ghi seg và index: ị ớ ầ CS:IP con tr đ n code s p thi hành ỏ ế DS:SI: con tr đ a ch d li u ngu n ỏ ị ồ ES:DI: con tr đ a ch d li u đích ỏ ị SS:SP: con tr stack ỏ SS:BP: con tr stack frame ỏ
ệ ẽ ế ộ ớ ế ạ ổ t các đâu trên b nh là code, data hay stack. N u CS=DS thì code cũng là ạ ự c t ượ ả ng trình bình th do đ c thi hành hay thay đ i code, ả vùng nh 0x40000, b ng ở ớ ỉ ng nào. Rõ ràng 8086 ch ọ i lên ườ ủ ươ 8086 s không phân bi data mà data cũng là code. Ngoài ra không có h n ch gì, b n t t c trong memory. v d kernel c a DOS đ d li u cũng t ữ ệ ị ụ ấ ả Interupt 0x0, đ u có th thay đ i b i b t c 1 ch ổ ở ấ ứ ể ề i dùng. thích h p cho h th ng 1 ng ệ ố ườ ợ
ắ ầ ừ ồ 80286 CPU 16 bít protected mode r i 80386 CPU 32 bít protected mode. T t c các ấ ả i ta g i là dòng ọ ườ ề ế ế B t đ u t dòng CPU Intel sau này cho đ n Pent IV đ u chung ki n trúc protected nên ng i386.
c b o v ch t ch vi c truy xu t đ ộ ầ c ph n ấ ượ ẽ ệ c xác đ nh b i 1 thanh ghi segment selector 16 bít và ể ớ ị ượ ả ị ệ ặ ở ỉ ượ
7
ủ ự ế ở ổ ở i xác đ nh 1 segment descriptor (mô t ả ồ . R i ả ạ ch đ protected mode, b nh máy tính đ Ở ế ộ c ng CPU ki m soát. Lúc này 1 đ a ch đ ứ ch m c 32 bít.. Có 6 thanh ghi segment selector cs,ss,ds,es,gs,fs.Đi m khác c a thanh ghi segment ỉ ụ 8086 selector và thanh ghi segment thanh ghi segment selector l ị ạ giá tr trong segment descriptor m i giúp chúng ta xác đ nh b nh v t lý. ể ch thanh ghi segment xác đ nh tr c ti p vùng nh còn ớ ị đo n) trong b ng mô t ả ớ ậ ớ ộ ị ị
ả ộ c mô t ỏ ớ ộ ả c chia nh thành nhi u đo n. Cách th c chia b nh đ ạ ế ệ ứ ớ ế ớ ượ ứ trong 1 ề ề ượ cách th c chia đĩa). Có 2 lo i b ng mô t ả ầ ứ (N u b n không hình dung đ ả ả ả ả ộ ả ượ ị ỗ ả ứ ượ ấ ả ẽ ớ ỗ ạ ỉ ầ ỉ ủ cách phân chia riêng cho process đó -t ằ
ỗ ồ ả ớ ủ c mô t ỉ . Bao g m: ả ạ ỉ ộ ạ ượ ị b i 8 bytes trong b ng mô t ả ở ầ ẳ ị ờ ạ ướ c đo n 0 là tính theo byte, 1 là tính theo 4096 bytes c đo n n u G=0 thì đo n có size=1bytes-1Mbyte(2^20) n u G=1 thì ế ế ạ ng ờ ạ ườ ạ ệ ạ ặ ỉ t ch có trong GDT ẽ ọ ể ỉ ơ ữ ệ ứ ố ạ ư ệ ặ ụ ồ ủ ấ c truy xu t đo n này. CPU i386 cho 4 m c quy n 0 là cao nh t ị ủ ỉ ấ ấ ượ ứ ề ề ấ ạ ng v i kernel. Còn 3 là User Application. N u DPL cho 1 segment là 0 thì user ng đ ươ ế ể ạ ạ
c set trong 1 thanh ghi segment selector thì CPU s tìm 8 bytes mô t ẽ ộ ộ ủ ể ậ ầ ị ỉ ệ ng xuyên. M i thanh ghi segment selector có 16 bít trong đó: ỗ ỉ ụ ờ ạ ậ ỉ ứ ừ ụ ầ ớ ệ ứ ỉ ữ ằ ớ ơ ứ ấ ể ạ ư ậ ạ ớ b nh : B ng mô t ớ ả B nh máy tính đ ượ ộ c thì hãy nh đ n vi c chia đĩa c ng thành nhi u đĩa b ng mô t ạ ả - GDT(Global logic c n b ng partion , b ng này mô t ạ ả ớ Descriptior Table) và LDT(Local Descriptor Table). Ch có 1 b ng GDT đ c build trong b nh c ch a trong thanh ghi gdtr c a CPU. M i process s có 1 b ng LDT và v trí c a b ng này đ ủ ả ề t nhiên cho vùng nh mà nó có quy n riêng c a nó mô t ủ ẽ i ldtr thì s có thôi. Đ a ch LDT n m trong thanh ghi ldtr. M i khi swap process ta ch c n load l ị phân vùng b nh cho process đó ... ớ M i m t đo n đ ộ 1. 32 bít Base: là đ a ch ph ng c a byte đ u tiên c a đo n trong vùng nh 4G ủ 2. C G 1 bít: là các đ nh kích th ạ ướ 3. 20 bít Limit: là kích th ạ đo n có size=4K-4G 4. C S 1 bít: S=0: đo n kernel, S=1: đo n bình th 5. 4 bít Type: có các type sau đây: Code, Data, Task State đây là đo n đ c bi dùng đ ch n i ch a các d li u liên quan các task. Khi SCHED mu n swap task s đ c trong đây là ph c h i các giá tr c a task. Local Descriptor Table đây cũng là đo n đ t bi t chuyên ch a các LDT c a các task và ch có trong GDT. 6. 2 bít DPL: Quy n th p nh t đ t ớ ươ application không th truy xu t vào đo n này. ấ i không dùng. 7. Các bít còn l Các thanh ghi segment selector (cs,ds,ss,es,gs,fs) ả ươ t M i khi 1 giá tr đ ng ị ượ ỗ ng c a selector t i vào thanh ghi n i b . Vì v y vi c chuy n đ a ch không c n truy xu t GDT ấ ả ứ hay LDT 1 cách th ườ 1. 13 bít ch m c:ch 1 m c trong GDT hay LDT ỉ ụ 2. C 1 bit TI : 0: đo n này trong GDT, 1: đo n này trong LDT ạ 3. 2 bít RPL: T 0-3 ch m c yêu c u truy c p đo n này ch có tác d ng v i CS Theo tài li u Intel ạ thì khi 1 process set thanh ghi CS thì RPL có th n p v i nh ng m c th p h n hay b ng m c mà ể ạ process có quy n. Theo tôi hi u thì nh v y 1 process kernel có th ch y 1 đo n code v i quy n ề th p h n ví d set RPL=3 ch ng h n. ề ụ ể ẳ ấ ạ ơ
ư ủ ạ ng trình 32bít th ỉ ụ t c các đo n =0 h t. ạ ươ ế ườ ụ ầ ị ủ ng set base c a t ườ ậ ố ủ ấ ả ế ủ ả ẽ ả i đa là 2^13 –1 = luôn toàn là s 0, vì v y n u 1 segment selector =0 thì nó s invalid. ả t ả ố ố V y 1 đ a ch s là Base c a đo n đó + giá tr c a thanh ghi ch m c (ebx,esi,edi v.v) nh ng theo ỉ ẽ ị ậ tôi th ng th y các ch ấ M c đ u tiên c a b ng mô t Do 1 segment selector có 13 bít ch m c nên s segment trong b ng mô t ỉ ụ 8191.
8
ế ế ộ ự ạ ạ ề ự ứ ạ ủ ả ậ ề ữ ố ế ứ ơ ỉ ạ ủ ng thích v i các ki n trúc CPU khác n a. T t c các phân đo n c a ả ớ ấ ả ề ấ Linux Protected Mode. N u b n choáng v s ph c t p c a ch đ protected mode (th c ra còn nhi u n a), thì may m n ắ cho b n cho tôi và cho c l p trình viên Linux là không ai mà implement h t. Gi ng Windows, Linux cũng làm protected mode đ n gi n thôi ch có 2 m c 0 cho Kernel và 3 cho User Application. V n đ là t Linux dùng GDT không c n LDT. Có duy nh t 1 b ng GDT bao g m: ươ ầ ữ ồ ế ấ ả
ể ứ ủ c). DPL=0 Kernel mode only. ượ ể c). DPL=0 ứ ữ ệ ượ t c user proccess. Base=0. ấ ả
t c user process. Base=0. ấ ả ứ
9
ể đây: Base lúc này s là đ a ch c a b ng ghi process đó. ỉ ủ ả ẽ ẽ ở ỗ ị ỗ ỗ t. GDT có t vi ạ ẽ ể ỉ ằ ụ ừ ả ự ế ư ậ ụ ể 1. Null 2. Kernel Code Segment: Ch a code c a kernel. Base=0. Limit=0xFFFF. G=1. S=1. Type=A có th đ c và thi hành (không modify đ ọ 3. Kernel Data Segment: Ch a d li u kernel. Base=0. Limit=0xFFFF.G=1.S=1. Type=2 có th đ c và ghi (không thi hành đ ọ 4. User Code Segment: Ch a code segment cho t ứ Limit=0xFFFF.G=1.S=1. Type=A. DPL=3 5. User Data Segment: Ch a data segment cho t Limit=0xFFFF.G=1.S=1. Type=2. DPL=3 6. Default null LDT 7. Ngoài ra còn 4 segment cho APM (advenced power mangement) , 4 segment đ dành. 8. M i process s có 1 TSS Segment G=0. Limit=236 v y m i đo n s có 236 bytes. DPL=0 kernel only. M i process có 1 LDT ậ segment. Default là null đ ch r ng không dùng LDT. Ai thích dùng thì ph i t ố i đa 2^13 là 8192 m c. Tr 14 m c system là còn 8178 /2= 4089 process. Nh v y Linux không th có h n 4089 proccess. ơ