บทช่วยสอนการเขียนโปรแกรมขั้นสูงของ Linux {Development} <br /> ตอนที่ 1 Linux Kernel ตอนที่ 2 คู่มือการเขียนโปรแกรมโมดูลเคอร์เนล Linux ตอนที่ 3 คู่มือโปรแกรมเมอร์ Linux ตอนที่ 4 โครงสร้างระบบแนวคิดเคอร์เนล Linux ตอนที่ 5 โครงสร้างระบบเฉพาะเคอร์เนล Linux
สารบัญบทนำเกี่ยวกับคำนำของเรย์มอนด์
กลุ่มวิศวกรรมเอกสาร Linux "ประกาศ"
คำนำของผู้แปล ส่วนที่ 1 คำนำเคอร์เนล Linux
บทที่ 1 พื้นฐานฮาร์ดแวร์และซอฟต์แวร์เบื้องต้น 6
1.1 พื้นฐานฮาร์ดแวร์ 6
1.1.1 ซีพียู 7
1.1.2 หน่วยความจำ 8
1.1.3 รถโดยสารประจำทาง 8
1.1.4 ตัวควบคุมและอุปกรณ์ต่อพ่วง 8
1.1.5 พื้นที่ที่อยู่ 9
1.1.6 นาฬิกา 9
1.2 พื้นฐานซอฟต์แวร์ 9
1.2.1 ภาษาคอมพิวเตอร์ 9
1.2.2 ระบบปฏิบัติการคืออะไร 11
1.2.3 โครงสร้างข้อมูลเคอร์เนล 13
บทที่ 2 การจัดการหน่วยความจำ 15
2.1 โมเดลนามธรรมหน่วยความจำเสมือน 15
2.1.1 คำขอเพจ 17
2.1.2 การแลกเปลี่ยน 17
2.1.3 หน่วยความจำเสมือนที่ใช้ร่วมกัน 18
2.1.4 โหมดการกำหนดแอดเดรสทางกายภาพและโหมดการกำหนดแอดเดรสเสมือน 18
2.1.5 การควบคุมการเข้าถึง 18
2.2 การแคช 19
2.3 ตารางหน้าลินุกซ์ 20
2.4 การจัดสรรหน้าและการรีไซเคิล 21
2.4.1 การจัดสรรหน้า 22
2.4.2 การรีไซเคิลหน้า 22
2.5 การทำแผนที่หน่วยความจำ 22
2.6 ขอเพจ 23
2.7 แคชเพจ Linux 24
2.8 การสลับหน้าและการลบออก 25
2.8.1 การลดขนาดบัฟเฟอร์และแคชหน้า 25
2.8.2 การสลับหน้าหน่วยความจำที่ใช้ร่วมกันของ System V 26
2.8.3 การเปลี่ยนและเลิกใช้งานหน้า 27
2.9 สลับแคช 27
2.10 เปลี่ยนหน้า 28
บทที่ 3 กระบวนการ 29
3.1 กระบวนการลินุกซ์ 29
3.2 ตัวระบุ 31
3.3 กำหนดการ 32
3.4 เอกสารประกอบ 34
3.5 หน่วยความจำเสมือน 35
3.6 การสร้างกระบวนการ 36
3.7 เวลาและตัวจับเวลา 37
3.8 การรันโปรแกรม 38
3.8.1 เอลฟ์ 39
3.8.2 ไฟล์สคริปต์ 40
บทที่ 4 กลไกการสื่อสารระหว่างกระบวนการ 41
4.1 กลไกการส่งสัญญาณ 41
4.2 ท่อ 42
4.3 ซ็อกเก็ต 44
4.3.1 กลไกการสื่อสารระหว่างกระบวนการของระบบ V 44
4.3.2 คิวข้อความ 44
4.3.3 สัญญาณ 45
4.3.4 พื้นที่เก็บข้อมูลที่ใช้ร่วมกัน 47
บทที่ 5 PCI 49
5.1 พื้นที่ที่อยู่ PCI 49
5.2 ส่วนหัวการกำหนดค่า PCI 50
5.3 PCI I/O และพื้นที่ที่อยู่หน่วยเก็บข้อมูล 51
5.4 บริดจ์ PCI-ISA 51
5.5 บริดจ์ PCI-PCI 51
5.5.1 บริดจ์ PCI-PCI: PCI I/O และที่อยู่อุปกรณ์จัดเก็บข้อมูล
หน้าต่างสู่อวกาศ 51
5.5.2 บริดจ์ PCI-PCI: วงจรการกำหนดค่า PCI และ PCI
รถโดยสารประจำทางหมายเลข 52
5.6 การเริ่มต้น Linux PCI 53
5.6.1 โครงสร้างข้อมูล PCI เคอร์เนล Linux 53
5.6.2 ไดรเวอร์อุปกรณ์ PCI 53
5.6.3 ฟังก์ชั่น PCI BIOS 56
5.6.4 กระบวนการแก้ไข PCI 57
บทที่ 6 การจัดการขัดจังหวะและไดรเวอร์อุปกรณ์ 60
6.1 การขัดจังหวะและการขัดจังหวะการจัดการ 60
6.1.1 ตัวควบคุมอินเทอร์รัปต์แบบตั้งโปรแกรมได้ 61
6.1.2 เริ่มต้นโครงสร้างข้อมูลการประมวลผลขัดจังหวะ 61
6.1.3 การขัดจังหวะการจัดการ 62
6.2 ไดรเวอร์อุปกรณ์ 63
6.2.1 การทดสอบและการหยุดชะงัก 64
6.2.2 การเข้าถึงหน่วยความจำโดยตรง (DMA) 65
6.2.3 หน่วยความจำ 66
6.2.4 การเชื่อมต่อระหว่างไดรเวอร์อุปกรณ์และเคอร์เนล 66
6.2.5 ฮาร์ดดิสก์ 69
6.2.6 อุปกรณ์เครือข่าย 74
บทที่ 7 ระบบไฟล์ 77
7.1 ระบบไฟล์ขยายที่สอง EXT2 78
7.1.1 โหนดไอโหนดของระบบ EXT2 79
7.1.2 ซุปเปอร์บล็อกในระบบ EXT2 80
7.1.3 ตัวอธิบายกลุ่มสำหรับระบบ EXT2 80
7.1.4 ไดเร็กทอรีของระบบ EXT2 81
7.1.5 การค้นหาไฟล์ในระบบไฟล์ EXT2 81
7.1.6 การเปลี่ยนไฟล์ในระบบไฟล์ EXT2
ขนาด 82
7.2 ระบบไฟล์เสมือน 83
7.2.1 ซูเปอร์บล็อกของระบบไฟล์ VFS 84
7.2.2 โหนดไอโหนดของระบบไฟล์ VFS 84
7.2.3 การลงทะเบียนระบบไฟล์ 85
7.2.4 การประกอบระบบไฟล์ 85
7.2.5 การค้นหาไฟล์ในระบบไฟล์เสมือน 87
7.2.6 การถอนการติดตั้งระบบไฟล์ 87
7.2.7 แคชไอโหนดของระบบไฟล์ VFS 87
7.2.8 การแคชไดเรกทอรี 88
7.3 แคชบัฟเฟอร์ 88
7.3.1 bdflush เคอร์เนลเดมอน 90
7.3.2 กระบวนการอัพเดต 90
7.4 /proc ระบบไฟล์ 91
7.5 ไฟล์อุปกรณ์พิเศษ 91
บทที่ 8 เครือข่าย 92
8.1 ภาพรวมของเครือข่าย TCP/IP 92
8.2 ลำดับชั้นเครือข่าย TCP/IP ใน Linux 95
8.3 อินเตอร์เฟซซ็อกเก็ต BSD 96
8.4 ชั้นซ็อกเก็ตของ INET 97
8.4.1 การสร้างซ็อกเก็ต BSD 98
8.4.2 ที่อยู่การเชื่อมโยงสำหรับ INET BSD Socket 99
8.4.3 การสร้างการเชื่อมต่อซ็อกเก็ต INET BSD 99
8.4.4 การฟังซ็อกเก็ต INET BSD 100
8.4.5 การยอมรับคำขอเชื่อมต่อ 100
8.5 เลเยอร์ IP 100
8.5.1 บัฟเฟอร์ซ็อกเก็ต 100
8.5.2 การรับข้อความ IP 101
8.5.3 การส่งแพ็กเก็ต IP 102
8.5.4 การแบ่งปันข้อมูล 102
8.6 โปรโตคอลการแก้ไขที่อยู่ 103
8.7 การกำหนดเส้นทาง IP 104
บทที่ 9 กลไกเคอร์เนลและโมดูล 107
9.1 กลไกเคอร์เนล 107
9.1.1 การควบคุมครึ่งล่าง 107
9.1.2 คิวงาน 108
9.1.3 ตัวจับเวลา 109
9.1.4 รอคิว 110
9.1.5 ล็อคการหมุน 110
9.1.6 เซมาฟอร์ 110
9.2 โมดูล 111
9.2.1 การโหลดโมดูล 112
9.2.2 การถอนการติดตั้งโมดูล 113
บทที่ 10 โปรเซสเซอร์ 115
10.1X86 115
10.2 แขน 115
10.3 โปรเซสเซอร์อัลฟ่า AXP 115
บทที่ 11 ซอร์สโค้ดเคอร์เนล Linux 117
11.1 วิธีรับซอร์สโค้ดเคอร์เนล Linux 117
11.2 การจัดเรียงซอร์สโค้ดเคอร์เนล 117
11.3 จะเริ่มต้นที่ไหน 118
บทที่ 12 โครงสร้างข้อมูล Linux 120
ภาคผนวก A เว็บที่เป็นประโยชน์และไซต์ FTP 138
ภาคผนวก ข อภิธานศัพท์ 139
ส่วนที่ 2 คู่มือการเขียนโปรแกรมโมดูลเคอร์เนล Linux คำนำบทที่ 1 สวัสดีชาวโลก 145
1.1 Makefiles ของโมดูลเคอร์เนล 146
1.2 โมดูลเคอร์เนลหลายไฟล์ 147
บทที่ 2 ไฟล์อุปกรณ์ตัวละคร 149
บทที่ 3 /proc ระบบไฟล์ 158
บทที่ 4 การใช้ /proc สำหรับอินพุต 162
บทที่ 5 การใช้ไฟล์อุปกรณ์สำหรับอินพุต 170
บทที่ 6 พารามิเตอร์การเริ่มต้น 182
บทที่ 7 การเรียกระบบ 185
บทที่ 8 การจัดการการปิดกั้น 190
บทที่ 9 การเปลี่ยนงานพิมพ์ 199
บทที่ 10 การจัดตารางงาน 202
บทที่ 11 ผู้จัดการขัดจังหวะ 207
บทที่ 12 การประมวลผลหลายตัวแบบสมมาตร 211
บทที่ 13 ข้อผิดพลาดทั่วไป 212
ภาคผนวก A ความแตกต่างระหว่าง 2.0 และ 2.2 213
ภาคผนวก B แหล่งข้อมูลอื่นๆ 214
ภาคผนวก C ให้การประเมินของคุณ 215
ส่วนที่ 3 คู่มือโปรแกรมเมอร์ Linux บทที่ 1 ระบบปฏิบัติการ Linux 219
บทที่ 2 เคอร์เนลลินุกซ์ 220
บทที่ 3 แพ็คเกจ Linux libc 221
บทที่ 4 การเรียกระบบ 222
บทที่ 5 “มีดกองทัพสวิส”: ioctl 223
บทที่ 6 การสื่อสารระหว่างกระบวนการ Linux 224
6.1 บทนำ 224
6.2 ฮาล์ฟดูเพล็กซ์ไปป์ Unix 224
6.2.1 แนวคิดพื้นฐาน 224
6.2.2 การสร้างไปป์ไลน์ในภาษา C 225
6.2.3 วิธีง่ายๆ 229
6.2.4 การทำงานของอะตอมบนท่อ 233
6.2.5 มีหลายสิ่งที่ควรทราบเกี่ยวกับท่อฮาล์ฟดูเพล็กซ์
ฉบับที่ 233
6.3 เนมไปป์ 234
6.3.1 แนวคิดพื้นฐาน 234
6.3.2 การสร้าง FIFO 234
6.3.3 การดำเนินการ FIFO 235
6.3.4 การบล็อกการดำเนินการใน FIFO 236
6.3.5 สัญญาณ SIGPIPE 237
6.4 ระบบ V IPC 237
6.4.1 แนวคิดพื้นฐาน 237
6.4.2 คิวข้อความ 239
6.4.3 สัญญาณ 251
6.4.4 semtool: การดำเนินการเซมาฟอร์แบบโต้ตอบ
โปรแกรม 260
6.4.5 หน่วยความจำที่ใช้ร่วมกัน 267
บทที่ 7 การเขียนโปรแกรมเสียง 274
7.1 การเขียนโปรแกรมลำโพงภายใน 274
7.2 การเขียนโปรแกรมการ์ดเสียง 274
บทที่ 8 กราฟิกหน่วยอักขระ 276
8.1 ฟังก์ชัน I/O ใน libc 277
8.1.1 เอาต์พุตที่จัดรูปแบบ 277
8.1.2 อินพุตที่จัดรูปแบบ 278
8.2 ไลบรารีเทอมแคป 278
8.2.1 คำนำ 278
8.2.2 การรับคำอธิบายเทอร์มินัล 279
8.2.3 ดูคำอธิบายเทอร์มินัล 279
8.2.4 ความสามารถของ termcap 280
8.3 ความรู้เบื้องต้นเกี่ยวกับ Ncurses 280
8.4 การเริ่มต้น 282
8.5 วินโดว์ 283
8.6 เอาท์พุต 284
8.6.1 เอาต์พุตที่จัดรูปแบบ 285
8.6.2 การแทรกอักขระ/บรรทัด 286
8.6.3 ลบตัวอักษร/บรรทัด 286
8.6.4 กล่องและเส้น 287
8.6.5 อักขระพื้นหลัง 287
8.7 อินพุต 288
8.8 ตัวเลือก 289
8.8.1 ตัวเลือกเอาต์พุต 289
8.8.2 ตัวเลือกอินพุต 290
8.8.3 คุณสมบัติเทอร์มินัล 291
8.8.4 การใช้ตัวเลือก 291
8.9 อัพเดตเทอร์มินัล 292
8.10 คุณสมบัติและสีวิดีโอ 293
8.11 เคอร์เซอร์และพิกัดหน้าจอ 294
8.12 โรลลิ่ง 294
8.13 ปุ่มกด 295
8.14 ซอฟต์แท็ก 295
8.15 เบ็ดเตล็ด 295
8.16 การเข้าถึงระดับต่ำ 296
8.17 ถ่ายโอนข้อมูลหน้าจอ 296
8.18 การจำลอง Termcap 296
8.19 ฟังก์ชัน Terminfo 296
8.20 ฟังก์ชั่นการดีบัก 297
8.21 ความสามารถของ Terminfo 297
8.21.1 ความสามารถบูลีน 297
8.21.2 ความสามารถเชิงตัวเลข 298
8.21.3 ความสามารถของสตริง 299
8.22 [N]ภาพรวมฟังก์ชัน Curses 306
บทที่ 9 การเขียนโปรแกรมพอร์ต I/O 307
9.1 การเขียนโปรแกรมเมาส์ 307
9.2 การเขียนโปรแกรมโมเด็ม 308
9.3 การเขียนโปรแกรมเครื่องพิมพ์ 308
9.4 การเขียนโปรแกรมจอยสติ๊ก 308
บทที่ 10 การย้ายแอปพลิเคชันไปยัง Linux 309
10.1 บทนำ 309
10.2 การประมวลผลสัญญาณ 309
10.2.1 ภายใต้ SVR4, BSD และ POSIX.1
สัญญาณ 310
10.2.2 ตัวเลือกสัญญาณ Linux 310
10.2.3 สัญญาณภายใต้ Linux 310
10.2.4 สัญญาณที่รองรับโดย Linux 311
10.3 เทอร์มินัล I/O 311
10.4 ประมวลผลข้อมูลและการควบคุม 311
กระบวนการ 10.4.1 kvm 312
10.4.2 ระบบไฟล์ ptrace และ /proc 312
10.4.3 การควบคุมกระบวนการภายใต้ Linux 312
10.5 การรวบรวมแบบมีเงื่อนไขแบบพกพา 313
10.6 คำแนะนำเพิ่มเติม 314
ภาคผนวกระบบตัวอักษรโทร 315
ส่วนที่ 4 สรุปโครงสร้างระบบแนวคิดเคอร์เนล Linux 323
คำนำ 324
บทที่ 1 โครงสร้างระบบ 325
1.1 ภาพรวมระบบ 325
1.2 เป้าหมายของเคอร์เนล 325
1.3 ภาพรวมของโครงสร้างเคอร์เนล 325
1.4 รองรับนักพัฒนาหลายคน 327
1.5 โครงสร้างข้อมูลระบบ 328
1.5.1 รายการงาน 328
1.5.2 การทำแผนที่หน่วยความจำ 328
1.5.3 โหนดดัชนี 328
1.5.4 การเชื่อมต่อข้อมูล 329
บทที่ 2 โครงสร้างระบบของระบบย่อย 330
2.1 โครงสร้างระบบตัวกำหนดเวลากระบวนการ 330
2.1.1 ประตู 330
2.1.2 โมดูล 330
2.1.3 การแสดงออกข้อมูล 331
2.1.4 การขึ้นต่อกัน การไหลของข้อมูล และโฟลว์การควบคุม 331
2.2 โครงสร้างระบบตัวจัดการหน่วยความจำ 331
2.2.1 ประตู 331
2.2.2 โมดูล 331
2.2.3 การแสดงข้อมูล 331
2.2.4 การไหลของข้อมูล โฟลว์การควบคุม และการขึ้นต่อกัน 332
2.3 โครงสร้างระบบระบบไฟล์เสมือน 333
2.3.1 ประตู 333
2.3.2 โมดูล 333
2.3.3 การแสดงข้อมูล 333
2.3.4 การไหลของข้อมูล โฟลว์การควบคุม และการขึ้นต่อกัน 334
2.4 โครงสร้างระบบอินเทอร์เฟซเครือข่าย 334
2.4.1 ประตู 334
2.4.2 โมดูล 334
2.4.3 การแสดงข้อมูล 335
2.4.4 การไหลของข้อมูล โฟลว์การควบคุม และการขึ้นต่อกัน 335
2.5 โครงสร้างระบบการสื่อสารระหว่างกระบวนการ 335
บทที่ 3 บทสรุป 336
ภาคผนวก A คำจำกัดความของข้อกำหนด 337
ภาคผนวก B อ้างอิง 338
ส่วนที่ 5 สรุปโครงสร้างระบบเฉพาะของเคอร์เนล Linux 341
บทที่ 1 คำนำ 342
1.1 เป้าหมาย 342
1.2 ความรู้เบื้องต้นเกี่ยวกับ Linux 342
1.3 ความรู้พื้นฐานเกี่ยวกับโครงสร้างระบบซอฟต์แวร์ 342
1.4 วิธีการและแนวทาง 343
1.5 ผู้อ่านที่ตั้งใจหนังสือเล่มนี้ 344
1.6 การจัดบทของส่วนนี้ 344
บทที่ 2 โครงสร้างระบบ 345
บทที่ 3 โครงสร้างระบบย่อย 346
3.1 ตัวกำหนดกระบวนการ 346
3.1.1 ประตู 346
3.1.2 อินเทอร์เฟซภายนอก 346
3.1.3 คำอธิบายระบบย่อย 346
3.1.4 โครงสร้างข้อมูล 347
3.1.5 โครงสร้างระบบย่อย 348
3.1.6 การพึ่งพาระบบย่อย 348
3.2 ตัวจัดการหน่วยความจำ 348
3.2.1 ประตู 348
3.2.2 อินเทอร์เฟซภายนอก 349
3.2.3 คำอธิบายระบบย่อย 349
3.2.4 โครงสร้างข้อมูล 350
3.2.5 โครงสร้างระบบย่อย 350
3.2.6 การพึ่งพาระบบย่อย 351
3.3 ระบบไฟล์เสมือน 352
3.3.1 ประตู 352
3.3.2 อินเทอร์เฟซภายนอก 352
3.3.3 คำอธิบายระบบย่อย 353
3.3.4 ไดรเวอร์อุปกรณ์ 353
3.3.5 ระบบไฟล์ลอจิคัล 354
3.3.6 โมดูล 354
3.3.7 โครงสร้างข้อมูล 355
3.3.8 โครงสร้างระบบย่อย 355
3.3.9 การพึ่งพาระบบย่อย 355
3.4 การสื่อสารระหว่างกระบวนการ 355
3.4.1 ประตู 355
3.4.2 อินเทอร์เฟซภายนอก 357
3.4.3 คำอธิบายระบบย่อย 357
3.4.4 โครงสร้างข้อมูล 358
3.4.5 โครงสร้างระบบย่อย 359
3.4.6 การพึ่งพาระบบย่อย 359
3.5 อินเทอร์เฟซเครือข่าย 360
3.5.1 ประตู 360
3.5.2 อินเทอร์เฟซภายนอก 361
3.5.3 คำอธิบายระบบย่อย 361
3.5.4 โครงสร้างข้อมูล 362
3.5.5 โครงสร้างระบบย่อย 363
3.5.6 การพึ่งพาระบบย่อย 363
บทที่ 4 บทสรุป 365
ภาคผนวก A คำจำกัดความของข้อกำหนด 366
ภาคผนวก B อ้างอิง 368
ส่วนที่หกภาคผนวกภาคผนวก A ใบอนุญาตการคัดลอกโครงการเอกสาร Linux 372
ภาคผนวก B GNU ใบอนุญาตสาธารณะทั่วไป 374
ขยาย