Nếu so sánh các thiết bị này với các hệ thống nhúng truyền thống thì mức độ phức tạp và khả năng đáp ứng cao hơn rất nhiều.Việc tích hợp hệ điều hành lên hệ thống nhúng làm đơn giản hóa
Trang 1KHOA CÔNG NGHỆ THÔNG TIN CHUYÊN NGHÀNH MẠNG-MÁY TÍNH
Trang 2Lời cảm ơn Đầu tiên chúng em xin gửi những lời cảm ơn sâu sắc đến Ban giám hiệu trường Đại học Kỹ Thuật Công Nghệ,Khoa Công Nghệ Thông Tin đã tận tình giảng dạy, truyền đạt cho chúng em những kiến thức quý báu Bên cạnh đó, quý thầy cô đã tạo cho chúng em những điều kiện tốt nhất trong học tập và rèn luyện nhân cách suốt những năm học vừa qua
Chúng em xin gửi những lời biết ơn đặc biệt và chân thành nhất đến thầy Th.s Huỳnh Hữu Thuận vì sự hướng dẫn tận tình cùng sự quan tâm chu đáo để chúng em có thể hoàn thành đề tài này một cách tốt đẹp
Chúng con cũng xin gửi đến bố mẹ của chúng con những tình cảm và lòng tri
ân tận đáy lòng Bố mẹ đã ở bên chúng con để động viên và giúp đỡ chúng con về mọi mặt trong những giai đoạn khó khăn khi thực hiện đề tài
Và cuối cùng xin được gửi lời cảm ơn đến tất cả các bạn bè trong và ngoài khoa
vì những sự giúp đỡ và tình cảm của các bạn trong những năm tháng nơi giảng đường đại học thân yêu
Sinh viên thực hiện Trần Quang Thuận,Phan Bá Minh
Trang 3Lời nói đầu.
Ngày nay,với sự phát triển của các linh kiện điện tử và công nghiệp sản xuất vi mạch,hệ thống Linux nhúng đã xuất hiện hầu như ở khắp mọi khía cạnh trong cuộc sống, từ các thiết bị điện tử dân dụng thông thường đến những thiết bị mạng cao cấp Nếu so sánh các thiết bị này với các hệ thống nhúng truyền thống thì mức độ phức tạp
và khả năng đáp ứng cao hơn rất nhiều.Việc tích hợp hệ điều hành lên hệ thống nhúng làm đơn giản hóa quá trình nghiên cứu và phát triển các sản phẩm, rút ngắn thời gian
và chi phí xây dựng hệ thống vì các hệ thống này được thừa hưởng những tính chất ưu việt của một hệ điều hành nói chung cũng như Linux nói riêng, như tính ổn định, nhỏ gọn, thực thi nhanh và có khả năng can thiệp sâu vào phần cứng
Hơn thế nữa, cùng với cộng đồng sử dụng Linux rộng lớn trên khắp thế giới và các phần mềm mã nguồn mở đa dạng làm cho việc phát triển hệ thống Linux nhúng trở thành một chiến lược được các công ty lựa chọn hàng đầu Nhờ phần mểm mã nguồn
mở khiến cho việc tùy biến một ứng dụng phù hợp yêu cầu trở nên dễ dàng hơn Nhận thức được tầm quan trọng này, đề tài thực hiện việc tìm hiểu Linux cho các hệ thống nhúng và các ứng dụng trên hệ thống nhúng Phần cứng đề cập đến trong đề tài là kit XUP Virtex-II Pro Development Syste Xilinx (XUPV2P) Cụ thể sẽ tiến hành việc cài đặt hệ điều hành MontaVista Linux – một gói Linux chuyên dành cho các hệ thống nhúng – lên kiến trúc vi xử lý PowerPC405 được tích hợp trên kit XUPV2P Đồng thời xây dựng các ứng dụng chạy trên hệ điều hành này Ứng dụng trọng tâm là giao tiếp truyền dữ liệu qua TCP/IP, với server là ứng dụng chạy trên hệ thống nhúng đã cài đặt
và client là ứng dụng chạy trên hệ điều hành Windows Ứng dụng cung cấp khả năng upload, download dữ liệu và có phân quyền với giao diện người dùng thân thiện
Trang 4Mục lục
Chương 1 Linux trên hệ thống nhúng 7
1.1 Khái niệm cơ bản 7
1.2 Hệ điều hành Linux nhúng (Embedded Linux) 8
1.3 Real-time Linux 9
1.4 Phân loại hệ thống Linux nhúng 9
1.4.1 Kích thước 10
1.4.2 Khả năng đáp ứng theo thời gian 11
1.4.3 Khả năng kết nối 11
1.4.4 Khả năng tương tác với người dùng 12
1.5 Kiến trúc tổng quát của một hệ thống Linux nhúng 12
1.5.1 Khối Data Acquisition 13
1.5.2 Khối Control 14
1.5.3 Khối System management 15
1.5.4 Khối User interface 16
1.6 Tổng quan về kernel của Linux/Unix 16
1.6.1 Mô hình process/kernel: 16
1.6.2 Thi hành một process 18
1.6.3 Tái thực thi các process 18
1.6.4 Không gian địa chỉ các tiến trình: 20
1.6.5 Sự đồng bộ hóa và những vùng then chốt: 21
1.6.6 Việc giao tiếp tín hiệu và liên tiến trình 22
1.6.7 Quản lí tiến trình: 23
1.6.8 Quản lý bộ nhớ 25
1.6.9 Device Drivers 28
Chương 2 Thiết kế một hệ thống Linux nhúng 30
2.1 Phần cứng hỗ trợ 30
2.1.1 Kiến trúc CPU 30U 2.1.2 Bus và các chuẩn giao tiếp 31
Trang 52.1.4 Kết nối mạng 32
2.2 Các công cụ phát triển 33
2.3 Chọn lựa và biên dịch Linux kernel 34
2.3.1 MontaVista Linux 37
2.3.2 uClinux 38
2.3.3 Cấu hình kernel 38
2.4 Xây dựng hệ thống thư mục gốc (root filesystem) 40
2.4.1 Hệ thống tập tin (File Systems) 40
2.4.2 Các thư mục trên Linux 40
Chương 3 Kit XUPV2P và gói phần mềm phát triển của Xilinx 44
3.1 Kiến trúc phần cứng của Kit XUPV2P 44
3.1.1 Tổng quan 44
3.1.2 Khối FPGA Virtex II Pro 46
3.1.3 System ACE 47
3.1.4 Ethernet adaptor 58
3.1.5 Cấu trúc MicroBlaze 69
3.1.6 PowerPC 78
3.2 Các gói phần mềm phát triển của Xilinx 85
3.2.1 Xilinx EDK 86
3.2.2 BSB Winzard (Base System Builder) 86
Chương 4 Thiết kế hệ thống nhúng dùng Linux 88
4.1 Những công cụ thực hiện 88
4.1.1 Hardware 88
4.1.2 Software 88
4.2 Kiểm tra kit XUPV2P 89
4.3 Thiết kế phần cứng cho hệ thống với Xilinx BSB 90
4.3.1 Cấu hình sử dụng bộ xử lý PowerPC 90
4.3.2 Cấu hình các thiết bị ngoại vi 93
4.3.3 Cấu hình phần mềm 96
4.4 Thiết lập môi trường biên dịch chéo 98
Trang 64.5.1 Tải kernel source và chuẩn bị driver 100
4.5.2 Cấu hình nhân 102
4.5.3 Tạo ACE file cấu hình cho FPGA và nạp ảnh kernel 105
4.5.4 Quá trình khởi động Linux trên kit XUPV2P 107
4.6 Xây dựng cấu trúc thư mục gốc cho hệ điều hành 108
Chương 5 Lập trình ứng dụng Server chạy trên hệ thống nhúng và Client trên Windows 112
5.1 Mô tả hệ thống file server của uClinux 112
5.2 Cấu trúc lập trình: 113
5.3 Lưu đồ thiết kế: 114
5.4 Chương trình File Client MP3 trên Visual C++ MFC: 115
5.4.1 Giới thiệu : 115
5.4.2 Chương trình File Client MP3: 116
5.4.3 Giao diện File Client MP3: Error! Bookmark not defined. Chương 6 Giới hạn của đề tài và hướng phát triển trong tương lai 118
6.1 Tổng kết những phần đã thực hiện 118
6.2 Giới hạn 118
6.3 Hướng phát triển trong tương lai 118
Trang 7Chương 1 Linux trên hệ thống nhúng
1.1 Khái niệm cơ bản
Linux là một từ thay thế cho nhân Linux, một hệ thống Linux hay một bản phân phối Linux (Linux distribution) Khái niệm về Linux cũng có thể hiểu đơn giản là một
hệ điều hành Chính xác thì Linux dùng để chỉ hạt nhân được Linus Tovalds phát triển
và duy trì Mã nền tảng này chỉ bao gồm hạt nhân và không có một ứng dụng kèm theo khác Hạt nhân chỉ cung cấp cho phần lõi của hệ thống khả năng quản lý phần cứng dễ dàng Nó không phải là phần mềm đầu tiên được hệ thống thực thi, vì thực chất là bootloader sẽ được thực thi trước Tuy nhiên, một khi hạt nhân được thực thi, nó sẽ không bao giờ thoát hay trao quyền điều khiển cả hệ thống cho đến khi hệ thống tắt
Nó có tác dụng điều khiển tất cả phần cứng và cung cấp những khả năng quản lý ở cấp
độ logic cao, ví dụ như các tiến trình, sockets, tập tin và các ứng dụng khác chạy trên
hệ thống
Linux cũng có thể dùng để thiết kế chuyên biệt cho một hệ thống phần cứng cùng với nhiều ứng dụng khác Một nhóm phát triển thường đề cập đến vấn đề họ sử dụng Linux trong các sản phẩm mới của họ, họ muốn nói đến không chỉ là hạt nhân Linux mà còn kèm theo các ứng dụng trên sản phẩm mới này Điều này có ý nghĩa chỉ một hệ thống Linux ngoài hạt nhân còn kèm theo một số lượng lớn các phần mềm cùng chạy với hạt nhân Thông thường là các phần mềm GNU, các thư viện C và các tập tin nhị phân của ứng dụng Cũng có thể bao gồm cả giao diện đồ họa và khả năng đáp ứng real-time
Hệ thống Linux có thể xây dựng theo tùy thích, hoặc có thể dựa vào các gói phân phối của các nhà cung cấp Nhóm phát triển nào đó có thể xây dựng một hệ thống theo ý thích của họ, và ngược lại, bạn có thể dùng các phiên bản có giao diện đổ họa và các tiện ích tiện lợi khác như gói Red Hat, Debian hay Fedora Core Những hệ thống Linux có nhiều mục đích sử dụng khác nhau, chạy những ứng dụng khác nhau
Trang 8ngoại trừ phần hạt nhân có tác dụng không hề thay đổi trên các hệ thống Các phân phối như Red Hat, Mandrake, SuSE, Debian, Slackware, Caldera, MontaVista, Embedix, BlueCat, PeeWeeLinux, và các phân phối Linux khác có thể khác nhau về kích thước, giá cả, mục đích sử dụng nhưng lại có một điểm chung nhất: cung cấp cho người dùng tập hợp file và những cách thức cài đặt để người dùng xây dựng hạt nhân cùng các ứng dụng khác trên nhiều loại phần cứng tùy theo mục đích xác định Cách thức cài đặt có thể hoàn toàn tự động hoặc từng bước chi tiết trong tài liệu được cung cấp tùy theo người dùng thông thường hay các nhà phát triển hệ thống
1.2 Hệ điều hành Linux nhúng (Embedded Linux)
Thông thường bạn sẽ sử dụng một phiên bản Linux chính thức được cung cấp bởi những hãng cung cấp phần mềm cho hệ thống của bạn Nhưng đôi khi, bạn lại muốn dùng một gói Linux được thiết kế với hạt nhân phù hợp với thiết bị đặc biệt hoặc chỉ hỗ trợ chuyên biệt cho một ứng dụng nào đó Các gói Linux cung cấp rất nhiều nhân khác nhau, ví dụ như các nhân Linux thông thường không được tối ưu và kèm các bản vá để hỗ trợ khả năng chạy các công cụ debug, chẵng hạn như công cụ debug cho nhân Điểm khác biệt chủ yếu là các nhân dùng cho hệ thống nhúng khác với dùng
cho các máy tính (workstation) hay máy phục vụ (server) ở cách cấu hình hạt nhân khi biên dịch
Thuật ngữ “hệ thống Linux nhúng” chỉ những hệ thống nhúng dựa trên nhân
Linux và bao hàm cả ý nghĩa sử dụng những thư viện đặc biệt và các công cụ người dùng cùng với hạt nhân Một gói cung cấp hệ điều hành Linux nhúng cũng có thể bao gồm cả nhóm các gói công cụ phát triển(development framework), hoặc nhóm các phần mềm được thay đổi để có thể sử dụng trên hệ thống nhúng hoặc cả hai
Nhóm các gói công cụ phát triển bao gồm các phần mềm phục vụ cho việc dễ dàng phát triển trên hệ thống nhúng Như các trình duyệt mã nguồn (source browser), các bộ biên dịch chéo, sửa lỗi, phần mềm quản lý dự án, tạo boot image…Gói công cụ
phát triển này sẽ được cài đặt trên máy host Ngược lại, đối với nhóm các phần mềm ứng dụng trên hệ thống nhúng sẽ được thực thi trên target là các hệ thống nhúng, như
các thư viện đặc biệt, các tập tin thực thi và các tập tin cấu hình, với giải pháp tổng
Trang 9quát thì nó cũng sẽ bao gồm cả công cụ tạo ra cấu trúc thư mục gốc cho hệ thống (root filesystem)
Như vậy đến đây chúng ta có 2 khái niệm host và target Host sẽ dùng để chỉ máy tính phát triển cho hệ thống nhúng, và target để chỉ các hệ thống nhúng
Hình 1-1: Khái niệm host và target
1.3 Real-time Linux
Ban đầu, real-time Linux dùng để chỉ dự án RTLinux đưa ra vào năm 1996 của Michael Barabanov dưới dự giám sát của Victor Yodaiken Dự án nhằm cung cấp khả năng đáp ứng thời gian chính xác trong môi trường Linux
Tuy nhiên, ngày nay có rất nhiều dự án cung cấp khả năng đáp ứng real-time trong môi trường hệ điều hành Linux RTAI, Kurt hay Linux/RK đều cung cấp khả năng real-time Một số dự án cải tiến khả năng real-time bằng cách thêm một hạt nhân thứ 2 vào trong hạt nhân Linux, một số khác cải thiện bằng các bản vá tối ưu hơn Các khái niệm về real-time có vẻ khó hiểu nhưng chúng ta cũng có thể hiểu đơn giản hơn,
đó là những hệ thống đảm bảo có thể hoạt động và đáp ứng gần như tức thời và có độ tin cậy cao Như các hệ thống audio stream hay các máy trong công nghiệp, đặc biệt chú trọng những đáp ứng về thời gian Chúng ta sẽ hiểu thêm khi đi vào phân loại các
hệ thống Linux nhúng
1.4 Phân loại hệ thống Linux nhúng
Những hệ thống nhúng nào có thể sử dụng Linux? Vì sao lại chọn Linux? Những vấn đề quan trọng nào phát sinh khi sử dụng Linux trên hệ thống nhúng? Hay
có bao nhiêu người thực sự dùng Linux trên hệ thống nhúng của họ? Và dùng như thế nào? Có lẽ còn rất nhiều câu hỏi khác phát sinh khi làm quen với Linux trên hệ thống nhúng Đây có lẽ là những câu hỏi khó trả lời ở thời điểm này, phần này sẽ cố gắng giúp bạn có cái nhìn tổng quát và phần nào tìm được câu trả lời
Trang 10Chúng ta có thể thấy đơn giản nhất là các thiết bị mạng thông dụng, như các router hay máy in mạng cho phép người dùng cấu hình thông qua web-base Chúng đều được tích hợp một nhân Linux để có thể thực hiện những công việc đó Nếu xem xét thì trong rất nhiều lĩnh vực đều có sự hiện diện của Linux nhúng Ở đây chúng ta
sẽ điểm qua bằng cách phân loại các hệ thống linux nhúng theo các tiêu chí: kích thước, khả năng đáp ứng thời gian, kết nối và khả năng tương tác với bên ngoài
1.4.1 Kích thước
Kích thước của các hệ thống Linux nhúng được xác định ở nhiều phương diện khác nhau Đầu tiên là kích thước thực bên ngoài đến những đơn vị kích thước của máy tính như tốc độ CPU, dung lượng RAM và lưu trữ Điều đáng chú ý ở đây là Linux không thể chạy trên các hệ thống 16-bit1, nếu so sánh với các thiết bị nhúng truyền thống thì hệ thống Linux nhúng có thể được coi là những hệ thống lớn
Đối với những hệ thống nhỏ sử dụng những CPU tốc độ thấp, với chỉ khoảng 2MB ROM và 4MB RAM Điều này không có nghĩa là Linux không thể chạy với dung lượng RAM thấp hơn, nhưng sẽ khó thực hiện Hiện tại vẫn có những phân phối Linux chỉ cần lưu trữ trên duy nhất một đĩa mềm
Những hệ thống trung bình được tích hợp các CPU có tốc độ tương đối và dùng khoảng 32MB ROM và 64MB RAM Hầu hết những sản phẩm tiêu dùng đều nằm ở kích thước này Như các máy PDA, máy chơi MP3 hay các hệ thống giải trí, thiết bị mạng Một số thiết bị còn có khả năng mở rộng lưu trữ trên các thẻ nhớ, CompactFlash card, thậm chí cả đĩa cứng thông thường
Các hệ thống lớn sử dụng bộ xử lý mạnh hoặc đa bộ xử lý, kết hợp với dung lượng RAM và dung lượng lưu trữ lớn Thông thường các hệ thống này được sử dụng trong những môi trường cần xử lý khối lượng lớn các phép tính để thực hiện các tác vụ chuyên biệt Hệ thống chuyển mạch trong thông tin thoại, hay việc giả lập bay Các hệ
1 Nói Linux không thể chạy trên hệ thống 16-bit không hoàn toàn chính xác, đã từng có dự án Embeddable Linux Kernel Subset (ELKS), chạy Linux trên các hệ thống xử lý cũ như Intel 8086 hay 268 Nhưng với sự phát triển hiện nay thì Linux trên các hệ thống cũ là giải pháp không hề khả thi.
Trang 11thống này đặt chức năng lên hàng đầu và các yếu tố kích thước, giá thành và độ phức tạp chỉ là thứ yếu
1.4.2 Khả năng đáp ứng theo thời gian
Có hai mức độ đáp ứng theo thời gian cho hệ thống nhúng: nghiêm ngặt và thông thường Đối với hệ thống đòi hỏi đáp ứng nghiêm ngặt về thời gian, nó phải phản ứng lại trong một thời gian xác định đưa ra, nếu không thì sẽ có những hậu quả nghiêm trọng xảy ra Giả sử trong một nhà máy, các công nhân giữ những vật liệu cần được cắt bằng các máy cắt tự động Vì lý do an toàn, các cảm biến quang được đặt xung quanh các lưỡi dao của máy cắt để nhận dạng màu sắc găng tay của những công nhân Khi hệ thống báo tay của người công nhân đang trong vùng nguy hiểm, lập tức các lưỡi dao phải ngừng hoạt động để bảo đảm an toàn Hệ thống này không thể làm tác vụ nào khác để giải phóng tài nguyên bộ xử lý Đây là một hệ thống đòi hỏi đáp ứng cực kỳ nghiêm ngặt về thời gian và độ tin cậy Các hệ thống audio cũng phải có đáp ứng thời gian nghiêm ngặt, những đoạn âm thanh trễ chỉ trong nhất thời có thể làm người dùng rất khó chịu Tuy nhiên hệ thống này cũng cần đáp ứng thời gian chính xác nhưng mức độ không quan trọng như ở ví dụ trên
Các hệ thống đáp ứng thời gian thông thường có rất nhiều ứng dụng nhất là trong những ứng dụng mà vấn đề thời gian không quan trọng Ví dụ như hệ thống trả lời tự động cần đến 10 giây để chuyển đổi, hay các máy PDA cũng cần một thời gian chờ để khởi động
Trang 121.4.4 Khả năng tương tác với người dùng
Mức độ tương tác với người dùng tùy theo từng hệ thống, Một số hệ thống như các máy PDA tập trung vào các tính năng giao tiếp với người sử dụng bằng các màn hình cảm ứng Trong khi các hệ thống điều khiển công nghiệp khác chỉ cần các LED hiển thị và các nút nhấn để giao tiếp với người dùng, còn có những hệ thống không hề
có giao tiếp nào cả, như một số thành phần của hệ thống tự lái trên các máy bay, chỉ đơn thuần điều khiển an toàn cho cánh mà không cần giao tiếp với phi công
Hệ thống Lĩnh vực Kích thước Đáp ứng thời
gian Kết nối
Mức độ giao tiếp với người dùng
1.5 Kiến trúc tổng quát của một hệ thống Linux nhúng
Để có thể giải thích đơn giản, chúng ta sẽ xem xét một hệ thống điều khiển các tiến trình công nghiệp Nó được thiết kế từ các máy tính kết nối mạng và tất cả đều sử dụng Linux Hình 1-2 thể hiện các khối đơn giản
Hình 1-2: Một kiến trúc ví dụ điển hình
Bên trong hệ thống, được xây dựng từ 4 thành phần khác nhau, mỗi thành phần phục vụ cho một mục đích khác nhau: Data acquition (DAQ), Control, System Management (SYSM) và User interface (UI) Kết nối bên trong giữa các thành phần sử
Trang 13dụng các giao tiếp và các giao thức rất phổ biến TCP/IP trên Ethenet Khối DAQ và Control được cài đặt trên một đường truyền riêng, các UI cũng như vậy Để có thể giao tiếp với bên ngoài, khối SYSM có một kết nối với hệ thống mạng bên ngoài Để điều khiển một tiến trình, hệ thống luôn cần biết trạng thái của các tiến trình trong các thành phần khác nhau Lấy dữ liệu để làm gì, khi có dữ liệu, hệ thống có thể biết được làm thế nào để quản lý tiến trình Mọi lệnh điều khiển đều xuất phát từ khối Control Chi tiết về những tiến trình đang được điều khiển cần phải tương tác hoặc hiển thị với người dùng, cũng phải có sự giao tiếp để vận hành những tiến trình này theo ý muốn, điều này được thực hiện từ các khối UI Để kết hợp tất cả những khối rời rạc này, tập trung chỗ chứa các dữ liệu và quản lý các interface, khối SYSM được đặt ở trung tâm đồng thời cho phép kết nối ra mạng bên ngoài Chúng ta sẽ đi sâu vào từng khối để tìm hiểu chi tiết hơn
1.5.1 Khối Data Acquisition
Thành phần đầu tiên của quá trình đo lường là các bộ chuyển đổi Các bộ chuyển đổi là những thiết bị biển đổi các hiện tượng vật lý thành một tín hiệu điện Các bộ chuyển đổi này thường đặt trực tiếp ở những nơi cần theo dõi Các tín hiệu điện sinh ra từ các bộ chuyển đổi thường được khuyếch đại, lọc và cách ly trước khi đi vào thiết bị DAQ cuối cùng.Thiết bị này thường là các DAQ card gắn vào máy tính để lấy mẫu các tín hiệu tương tự, chuyển thành các giá trị số và lưu trữ trên các bộ đệm
Dữ liệu số này có thể dùng để xác định các điều kiện hoặc thay đổi các thông số đáp ứng cho tín hiệu, phản hồi lại khi nhận được tín hiệu
Khối DAQ lưu trữ các dữ liệu nhận được trên các bộ đệm, tiến hành phân tích trên các dữ liệu này hoặc có thể chuyển đến khối SYSM Trong mọi trường hợp, những dữ liệu quan trọng sẽ được chuyển tiếp đến khối SYSM để lưu trữ và hiển thị trên các UI Nếu các dữ liệu được phân tích trong khối DAQ, khối này sẽ thông báo cho khối SYSM nếu như phát hiện những tình huống bất thường hay nguy hiểm, ngược lại khối DAQ sẽ nhận lệnh từ khối SYSM Những lệnh này có thể là việc thay đổi tần số lấy mẫu, các thông số phân tích hoặc công việc của DAQ sẽ làm gì khi phân tích dữ liệu xong Đối với khối SYSM khi được DAQ thông báo, DAQ sẽ chuyển tiếp thông báo trạng thái hoặc lỗi đến khối SYSM
Trang 14Khối DAQ thường khởi động từ flash trên khối và sử dụng RAM Vì vậy nó dễ dàng thay đổi nếu như hệ thống bị lỗi Cấu hình phần mềm bao gồm một hạt nhân được tạo riêng chỉ chạy trên một hệ thống (có thể là máy PC hay một hệ thống dùng PowerPC) Khối DAQ không có giao tiếp với bên ngoài mà chỉ liên lạc với khối SYSM DAQ cũng không phải hệ thống đa người dùng và không có giao tiếp với người dùng Khối DAQ chỉ cần thực thi một công cụ đo lường nào đó Cũng giống như gói BusyBox Địa chị IP của khối DAQ được thiết kế cố định, vì vậy khối SYSM sẽ dễ dàng kiểm tra DAQ còn hoạt động hay không
1.5.2 Khối Control
Điều khiển các tiến trình truyền thống như PLC hay những hệ thống tương tự rất mắc tiền và phải sử dụng những hệ điều hành riêng, đồng thời cũng phải có cách vận hành riêng Mặc dầu các phần cứng chuẩn công nghiệp cũng bắt đầu giảm giá thành theo xu thế công nghệ Với mục tiêu giảm giá thành những phần cứng ngày nay trên thị trường tiêu dùng, dễ dàng nhận thấy các máy PC có ưu thế được dùng để quản
lý các quy trình
Khối Control là một máy tính chuẩn công nghiệp kết nối với các phần cứng cần được điều khiển Máy tính này là một hệ thống nhúng kích cỡ trung bình với khả năng đáp ứng nghiêm ngặt về thời gian và không có tương tác người dùng giống như khối DAQ Nó cũng được nối vào phần còn lại của cả hệ thống lớn qua đường truyền Ethernet Nhiệm vụ chính của khối Control là phát ra tín hiệu điều khiển phần cứng kết nối với nó, đồng thời theo dõi hoạt động của phần cứng này để điều khiển hợp lý Các tín hiệu điều khiển xuất phát từ gốc là khối SYSM, là trung tâm đưa ra quyết định,
và SYMS sẽ quyết định dựa vào dữ liệu lấy từ khối DAQ Khối Control sẽ đưa ra lệnh cuối cùng gửi đến cho phần cứng dựa trên quyết định của SYSM và tình trạng của phần cứng Khi tác vụ điều khiển phần cứng đã hoàn thành, khối Control sẽ gửi một thông báo trạng thái ngược về khối SYSM
Khối Control cũng có thể boot từ flash và sử dụng RAM giống như DAQ, chỉ khác là nó phải sử dụng một nhân Linux có khả năng đáp ứng nghiêm ngặt về thời gian vì phải điều khiển những phần cứng phức tạp Nó cũng có IP tĩnh và có thể bao gồm gói BusyBox như DAQ
Trang 151.5.3 Khối System management
Khối SYSM quản lý sự ảnh hưởng qua lại giữa các thành phần khác trong hệ thống Khối này gồm 3 giao tiếp với khối DAQ, Control và một kết nối ra mạng lưới bên ngoài SYSM là một hệ thống nhúng lớn có đòi hỏi đáp ứng thời gian nghiêm ngặt
và không có tương tác với người dùng
Trên liên kết A (hình 1-2) SYSM nhận dữ liệu từ DAQ lưu trữ một phần dữ liệu này và chuyển tiếp các dữ liệu thích hợp đến khối UI để tương tác với người dùng Dữ liệu được lưu trữ có thể sử dụng trong tương lai, và từ các dữ liệu này tích lũy những kinh nghiệm cho hệ thống điều khiển Khối SYSM có thể nhận dữ liệu đã phân tích ở DAQ hoặc bản thân nó cũng có thể thực hiện công việc phân tích SYSM sẽ đưa ra những lệnh điều khiển khối Control dựa trên dữ liệu đã phân tích và từ đó khối Control
sẽ điều khiển phần cứng một cách chi tiết hơn SYSM thực thi những chương trình nền thực hiện các tác vụ liên lạc giữa DAQ và khối Control SYSM cũng có IP tĩnh để các khối DAQ và Control có dễ dàng liên lạc với nó
Đối với liên kết ra mạng bên ngoài, khối SYSM cung cấp giao tiếp qua HTTP
và SSH HTTP cung cấp khả năng theo dõi và cấu hình cho cả hệ thống thông qua các trình duyệt web đơn giản SSH cung cấp khả năng kết nối vào hệ thống nhúng thống từ
xa và có tính bảo mật cao để sửa lỗi và nâng cấp hệ thống Một trong những cấu hình quan trọng của SYSM là cách nó báo hiệu lỗi và không có khả năng xử lý lỗi này Ví
dụ như thông báo bằng âm thanh, hay gửi các tín hiệu đến người vận hành hệ thống hoặc đơn giản là hiển thị thông báo đến các UI SYSM có thể dùng IP tĩnh hoặc nhận
IP từ một DHCP server
Ở liên kết B (hình 1-2) SYSM có thể cung cấp địa chỉ động cho các UI, một khi
UI đã kết nối và xác nhân với SYSM, nó sẽ chuyển tiếp các thông báo, trạng thái hệ thống Người dùng có thể dựa vào đó để vận hành hệ thống
SYSM là một hệ thống nhúng lớn vì vậy nó có thể phải boot từ hard disk và có đầy đủ chức năng như một máy tính truyền thống Tuy nhiên các chức năng của nó đều rất quan trọng, cần thiết và phải đáp ứng các tác vụ song song Hơn nữa là trung tâm điều khiển nên phải hỗ trợ môi trường đa người dùng cùng các ứng dụng người dùng SYSM giống như một server hơn là các máy tính thông thường
Trang 161.5.4 Khối User interface
UI đơn giản chỉ để tương tác với người dùng để có thể đưa ra quyết định quản
lý các tiến trình UI thường là các hệ thống nhúng nhỏ với đáp ứng thời gian thông thường Hiển nhiên các khối UI này cũng có khả năng kết nối mạng Các khối UI thông thường sẽ boot từ bộ nhớ flash hay thông qua mạng UI được cấu hình sẽ nhận
IP từ các DHCP server Các UI tiện dụng thường phát triển trên dòng ARM hay MIPS
và chạy những kernel thông thường UI cũng không cần đến những công cụ người dùng, các tiện ích đồ họa phức tạp hay các thư viện
1.6 Tổng quan về kernel của Linux/Unix
Kernel cung cấp môi trường cho các ứng dụng hoạt động Kernel phải thực thi một nhóm các dịch vụ và giao tiếp tương ứng Mỗi ứng dụng sử dụng giao tiếp riêng
và tài nguyên phần cứng dành cho ứng dụng thường không ảnh hưởng trực tiếp lẫn nhau
1.6.1 Mô hình process/kernel:
Một CPU có thể hoạt động trong user mode hoặc kernel mode Một số CPU có thể có nhiều hơn 2 chế độ hoạt động Ví dụ, bộ vi xử lý Intel 80x86 có 4 trạng thái hoạt động khác nhau Nhưng tất cả các kernel chuẩn của Unix chỉ sử dụng Kernel mode và User mode
Khi thực thi một chương trình trong User Mode thì chương trình này không thể trực tiếp truy xuất những cấu trúc dữ liệu của kernel hoặc những chương trình của kernel Khi một ứng dụng chạy trong Kernel Mode thì những giới hạn này không còn nữa Mỗi loại CPU cung cấp những lệnh đặc biệt để chuyển từ User Mode sang Kernel Mode và ngược lại một chương trình chạy phần lớn thời gian ở User Mode và chỉ chuyển sang Kernel Mode khi có yêu cầu một dịch vụ được cung cấp bởi kernel Khi kernel đã đáp ứng yêu cầu đó của chương trình thì kernel lại đưa chương trình đó trở
về trạng thái User Mode
Processes là những quy trình động, có quãng thời gian tồn tại hữu hạn trong hệ thống Các tác vụ như tạo, loại trừ và đồng bộ những tiến trình đang tồn tại được ủy thác cho một nhóm thường trình trong kernel
Trang 17Bản thân kernel không phải là một process nhưng là một process manager Mô hình process/kernel cho rằng những process yêu cầu một dịch vụ kernel nào đó thì sử dụng cấu trúc lập trình đặc biệt được gọi là lời gọi hệ thống(System call) Mỗi lời gọi
hệ thống thiết lập nhóm các thông số cho biết process yêu cầu và sau đó thực thi theo lệnh CPU để chuyển từ User Mode sang Kernel Mode
Bên cạnh những tiến trình của người dùng, hệ thống Unix bao gồm một vài tiến
trình đặc quyền được gọi là kernel thread với những đặc điểm:
• Tiến trình chạy trong Kernel Mode trong không gian địa chỉ kernel
• Tiến trình không tương tác với người dùng, không cần thiết bị đầu cuối
• Tiến trình thường được tạo ra khi hệ thống khởi động và vẫn còn hoạt động cho đến khi tắt máy
Nên chú ý, trên một hệ thống đơn, chỉ có một tiến trình có thể ở trong User Mode hoặc Kernel Mode Nếu chạy trong Kernel Mode, bộ vi xử lí sẽ thực thi một số thủ tục của kernel Hình 1-3 miêu tả một ví dụ về việc chuyển trạng thái giữa User Mode và Kernel Mode Tiến trình 1 trong User Mode đưa ra một lời gọi hệ thống, sau
đó tiến trình này chuyển qua trạng thái Kernel Mode và lời gọi này được phục vụ Tiến trình này sau đó trở về trạng thái thực thi ở User Mode cho đến khi xảy ra ngắt do timer và lịch trình thực thi được kích hoạt trong trạng thái Kernel Mode Tiến trình khác được thay thế và tiến trình 2 bắt đầu thực thi trong User Model cho đến khi thiết
bị phần cứng phát ra ngắt Kết quả của ngắt này là tiến trình 2 chuyển sang Kernel Mode và phục vụ cho ngắt này
Hình 1-3: sự chuyển trạng thái giữa User Mode và Kernel Mode
Trang 181.6.2 Thi hành một process
Để kernel có thể quản lý các tiến trình, mỗi tiến trình phải được mô tả bởi bằng process descriptor (bao gồm thông tin về trạng thái hiện tại của tiến trình) Khi kernel ngừng thực thi một tiến trình thì kernel phải lưu lại nội dung hiện tại của những thanh ghi bộ xử lí khác nhau vào process descriptor bao gồm:
• Thanh ghi program counter và stack pointer
• Thanh ghi mục đích chung
• Thanh ghi float pointer
• Thanh ghi trạng thái bộ xử lí (Processor Status Word)
• Thanh ghi quản lí bộ nhớ dùng để theo dõi việc sử dụng RAM của tiến trình
Khi kernel quyết định tái thực thi một tiến trình, kernel dùng process descriptor tương ứng để nạp vào các thanh ghi CPU Giá trị lưu lại của program counter trỏ đến sau lệnh được thực hiện cuối cùng thì tiến trình trở lại thực thi từ nơi mà tiến trình bị ngưng
Khi một tiến trình tạm thời không thực thi trên CPU, nó đang đợi một số sự kiện kernel của Unix gọi từ nhiều trạng thái chờ khác Việc này kiểm soát bởi hàng đợi của process descriptor Mỗi hàng đợi tương ứng một tập tiến trình đang chờ một số
sự kiện cụ thể nào đó
1.6.3 Tái thực thi các process
Kernel của Unix có tính tái thực thi: nghĩa là trong cùng thời điểm, nhiều tiến trình có thể thực thi trong Kernel Mode Dĩ nhiên trên những hệ thống đơn vị xử lí chỉ
có một tiến trình chạy nhưng nhiều tiến trình có thể bị khóa trong Kernel Mode, đợi tài nguyên CPU hoặc hoàn thành việc nhập xuất Ví dụ như sau khi đưa ra yêu cầu đọc đĩa, kernel sẽ để bộ điều khiển đĩa xử lí nó và trở về thực thi những tiến trình khác Một ngắt thông báo cho kernel biết khi thiết bị đã đáp ứng việc đọc này vì vậy có thể trở lại thực thi tiến trình ban đầu
Một phương pháp cung cấp khả năng tái thực thi là viết những hàm chỉ có thể thay đổi các biến cục bổ và không làm thay đổi cấu trúc dữ liệu toàn cục Các hàm như
vậy được gọi là những hàm tái thực thi (Reentrant functions) Nhưng kernel thì không
Trang 19bị giới hạn như những hàm tái thực thi Thay vì vậy, kernel có thể gồm những hàm
không tái thực thi và sử dụng cơ chế khóa để chắc chắn rằng chỉ một tiến trình có thể
thi hành hàm không tái thực thi tại một thời điểm Mỗi tiến trình trong Kernel Mode
chỉ hoạt động trên bộ nhớ của nó và không thể gây trở ngại với những tiến trình khác
Nếu ngắt phần cứng xảy ra thì kernel có thể hoãn tiến trình đang chạy hiện tại cho dù tiến trình đó đang ở trong Kernel Mode Khả năng này có tính chất quan trọng
vì nó cải thiện tốc độ của bộ điều khiển thiết bị đã phát sinh ngắt Khi một thiết bị sinh ngắt, thiết bị đó đợi cho đến khi CPU trả lời Nếu kernel trả lời một cách nhanh chóng thì bộ điều khiển thiết bị có thể thực hiện những nhiệm vụ khác trong khi CPU xử lí ngắt
Kernel reentrancy ảnh hưởng lên việc tổ chức của kernel Một kernel control path chỉ rõ trình tự của tập lệnh được thực thi bởi kernel để xử lý một lời gọi hệ thống,
một ngoại lệ, hay một ngắt
Trong trường hợp đơn giản nhất, CPU thực thi một kernel control path theo tuần tự từ lệnh đầu tiên đến lệnh cuối cùng CPU thêm vào những kernel control path
khi một trong những sự kiện dưới đây xảy ra:
• Một tiến trình đang thực thi trong User Mode gọi một lời gọi hệ thống và kernel control path tương ứng xác định không thể thỏa mãn yêu cầu này ngay, sau đó nó sẽ gọi một lịch trình để chọn một tiến trình mới đưa vào
thực thi Kết quả là việc chuyển trạng thái tiến trình xảy ra Kernel
control path đầu tiên chưa hoàn thành và CPU tái thực thi những kernel control path khác Trong trường hợp này, hai control path được thực thi
với tư cách là 2 tiến trình khác nhau
• CPU phát hiện một ngoại lệ, ví dụ có truy cập đến một page không có trong RAM trong khi đang chạy một kernel control path Control path
đầu tiên bị hoãn lại và CPU bắt đầu thực thi các thủ tục thích hợp Thủ
tục này có thể định vị một page mới cho tiến trình và đọc nội dụng của
nó từ đĩa Khi thủ tục kết thúc, control path đầu tiên được gọi lại Trong trường hợp này, hai control path được thực thi với tư cách là cùng một
tiến trình
Trang 20• Ngắt phần cứng xảy ra trong khi CPU đang chạy một kernel control path với việc ngắt được cho phép Kernel control path đầu tiên chưa hoàn thành và CPU bắt đầu xử lí kernel control path khác để điều khiển ngắt
kernel control path đầu tiên gọi lại khi bộ điều khiển ngắt kết thúc
Trong trường hợp này hai kernel control path là sự thực thi của cùng một
tiến trình và tất cả thời gian thực thi đều được tính là của nó Tuy nhiên,
bộ điều khiển ngắt không cần thiết hoạt động với tư cách một tiến trình
Hình 1-4 minh họa vài ví dụ của việc chèn vào và không chèn vào kernel
control path Xem xét ba trạng thái khác nhau của CPU:
• Thực thi một tiến trình trong trạng thái User Mode (User)
• Thực thi một ngoại lệ hoặc bộ điều khiển lời gọi hệ thống (Excp)
• Thực thi bộ điều khiển ngắt (Intr)
Hình 1-4: Việc chèn kernel control path
1.6.4 Không gian địa chỉ các tiến trình:
Mỗi tiến trình chạy trong không gian địa chỉ riêng của nó Một tiến trình chạy trong trạng thái User Mode sử dụng vùng stack, dữ liệu và code riêng Khi chạy trong Kernel Mode, tiến trình lại định vị địa chỉ vùng kernel data, vùng code và sử dụng
vùng stack khác Vì kernel có tính tái thực thi, những kernel control path khác nhau –
mỗi cái liên quan đến một tiến trình khác nhau có thể được thực thi lần lượt Trong
trường hợp này, mỗi kernel control path qui cho vùng stack kernel riêng
Mỗi tiến trình khi thực thi truy cập vào không gian địa chỉ riêng, đôi khi một phần của không gian địa chỉ được chia sẻ giữa các tiến trình Trong một số trường hợp
sự chia sẻ này được yêu cầu bởi các tiến trình, một số khác thì được thực hiện tự động bởi kernel để giảm bớt việc sử dụng bộ nhớ
Trang 21Nếu nhiều user cần dùng cùng một chương trình cùng lúc thì chỉ nạp chương trình vào bộ nhớ một lần và những lệnh đó có thể được chia sẻ bởi tất cả các user nào cần nó Dữ liệu dĩ nhiên không được chia sẻ bởi vì mỗi user có những dữ liệu riêng biệt Kiểu chia sẻ không gian địa chỉ được thực hiện một cách tự động bởi kernel để tiết kiệm bộ nhớ
Những tiến trình cũng chia sẻ một phần không gian bộ nhớ là loại giao tiếp giữa các tiến trình với nhau sử dụng kĩ thuật bộ nhớ chia sẻ được giới thiệu trong System V
và được hỗ trợ bởi Linux
Cuối cùng, Linux hỗ trợ lời gọi hệ thống mmap(), là lời gọi cho phép một phần
của tập tin hay bộ nhớ trên một thiết bị được ánh xạ là một phần của không gian địa chỉ tiến trình Việc ánh xạ bộ nhớ cung cấp sự lựa chọn đọc và ghi thông thường cho việc truyền dữ liệu nếu nhiều tiến trình khác nhau cũng chia sẻ một tập tin thì không gian địa chỉ của mỗi tiến trình mà chia sẻ tập tin sẽ bao gồm việc ánh xạ bộ nhớ
1.6.5 Sự đồng bộ hóa và những vùng then chốt:
Thi hành một reentrant kernel cần thiết sự đồng bộ hóa: nếu một kernel control
path bị hoãn trong khi tác động lên cấu trúc dữ liệu của kernel thì không một kernel control path nào sẽ được cho phép tác động lên cấu trúc dữ liệu này trừ khi nó được
xác lập lại một trạng thái nhất định nào đó Nếu không thì việc ảnh hưởng của hai
control path có thể làm hỏng thông tin được lưu trữ
Ví dụ, giả sử có một biến toàn cục V chứa số mục tin có sẵn của tài nguyên hệ
thống Kernel control path A đầu tiên đọc biến và quyết định rằng chỉ có một mục tin
có sẵn tại thời điểm đó, một kernel control path B khác được kích hoạt và cũng đọc
biến này, biến này vẫn chứa giá trị 1 Do đó B giảm một giá trị V và bắt đầu sử dụng mục tin tài nguyên này Sau đó A trở lại sự thực thi; bởi vì nó đã đọc giá trị của V rồi,
A cho rằng A có thể giảm V và lấy mục tin tài nguyên mà B đã sử dụng rồi Kết quả
cuối cùng V chứa -1, và hai kernel control path đang sử dùng cùng mục tin tài nguyên
với sai sót tiềm tàng
Trong ví dụ trước, việc hỏng dữ liệu sẽ không xảy ra nếu hai control path đọc
và giảm V với quá trình hoạt động đơn lẻ, không gián đoạn Tuy nhiên kernel bao gồm rất nhiều cấu trúc dữ liệu mà không thể truy xuất chỉ bằng một hành động đơn lẻ Ví
Trang 22dụ, không thể gỡ bỏ một phần tử từ một danh sách liên kết bằng một hành động đơn lẻ, bởi vì kernel cần truy xuất ít nhất hai con trỏ cùng một lúc Bất cứ đoạn code cần phải
được hoàn thành trước tiến trình khác bắt đầu được gọi là vùng then chốt (Critical
region)
Những vấn đề xảy ra không những giữa các kernel control path mà còn giữa
các tiến trình chia sẻ dữ liệu chung Những kĩ thuật đồng bộ hóa khác nhau vẫn được chấp nhận
1.6.6 Việc giao tiếp tín hiệu và liên tiến trình
Tín hiệu Linux/Unix cung cấp cơ chế để thông báo những tiến trình của những
sự kiện trong hệ thống Mỗi sự kiện có số tín hiệu của riêng nó ví dụ như SIGTERM
Có 2 loại sự kiện hệ thống:
Thông báo bất đồng bộ: ví dụ, một người dùng có thể gửi tín hiệu ngắt SIGTERM đến một tiến trình bằng cách nhấn mã phím ngắt (thường là CTRL-C) ở thiết bị đầu cuối
Những ngoại lệ hay lỗi đồng bộ: ví dụ, kernel gửi tín hiệu SIGSEGV đến một tiến trình khi nó truy xuất vị trí bộ nhớ ở địa chỉ không hợp lệ
Chuẩn POSIX định nghĩa khoảng 20 tín hiệu khác nhau, hai trong số đó là người dùng định nghĩa và có thể được sử dụng như là cơ chế ban đầu cho việc giao tiếp và đồng bộ giữa các tiến trình trong User Mode Nhìn chung, một tiến trình phải phản ứng lại tín hiệu thu nhận bằng hai cách:
• Lờ đi tín hiệu
• Không đồng bộ thực thi một thủ tục riêng biệt (bộ điều khiển tín hiệu) Nếu tiến trình không định rõ một trong những tùy chọn này, kernel sẽ thực hiện hành động mặc định dựa trên số tín hiệu Năm hành động mặc định có thể có là:
Trang 23Xử lí tín hiệu kernel khá phức tạp vì POSIX cho phép những tiến trình ngăn tín hiệu tạm thời Hơn nữa, một vài tín hiệu như SIGKILL không thể xử lí trực tiếp bởi tiến trình và không thể phớt lờ
Chia sẻ bộ nhớ cung cấp cách nhanh nhất cho những tiến trình trao đổi và chia
sẻ dữ liệu một tiến trình bắt đầu bằng cách đưa ra một lời gọi hệ thống shmget() để tạo
bộ nhớ chia sẻ mới có kích thước theo yêu cầu Sau khi có được định danh tài nguyên
IPC, tiến trình này triệu gọi lời gọi hệ thống shmat()sẽ trả về địa chỉ bắt đầu của vùng
mới trong không gian địa chỉ tiến trình Khi tiến trình muốn gỡ bỏ bộ nhớ chia sẻ từ
không gian địa chỉ của nó, nó gọi shmdt() Sự thi hành chia sẻ bộ nhớ dựa trên việc
kernel thực thi không gian địa chỉ tiến trình như thế nào
1.6.7 Quản lí tiến trình:
Linux/Unix phân biệt rõ ràng giữa tiến trình và chương trình nó đang thực thi
Để kết thúc, lần lượt sử dụng lời gọi hệ thống fork() và exit() để tạo một tiến trình mới
và kết thúc nó, trong khi gọi exec() để nạp một chương trình mới Sau đó thực thi lời
gọi hệ thống, tiến trình trở về thực thi với một không gian địa chỉ hoàn toàn mới chứa chương trình đã nạp
Tiến trình gọi fork() là tiến trình cha (parent) trong khi tiến trình mới là tiến
trình con (child) Parent và child có thể tương tác với nhau vì cấu trúc dữ liệu mô tả mỗi tiến trình bao gồm một con trỏ chỉ đến parent và những con trỏ chỉ đến child ngay
Lời gọi hệ thống exit()kết thúc tiến trình Kernel xử lí lời gọi hệ thống bằng cách giải phóng các tài nguyên mà tiến trình làm chủ và gửi tiến trình parent một tín hiệu SIGCHLD tín hiệu này mặc định bị lờ đi
1.6.7.1 Zombie process
Làm cách nào một tiến trình parent biết thông tin kết thúc của children? Lời gọi
hệ thống wait() cho phép một tiến trình đợi cho đến khi một trong những children của
nó kết thúc, nó trả về định danh tiến trình (PID) của child đã kết thúc
Khi thực thi lời gọi hệ thống này, kernel kiểm tra một child đã kết thúc hay chưa Trạng thái tiến trình đặc biệt zombie được giới thiệu để đại diện cho những tiến trình đã kết thúc: một tiến trình còn trong trạng thái đó cho đến khi tiến trình parent
của nó thực thi một lời gọi hệ thống wait() lên nó Bộ xử lý lời gọi hệ thống trích một
Trang 24số dữ liệu về việc sử dụng tài nguyên từ những trường miêu tả tiến trình, sinh ra một
mô tả tiến trình khi dữ liệu được thu thập Nếu không có tiến trình child nào đã kết
thúc khi lời gọi hệ thống wait() được thi hành thì kernel thường đặt tiến trình trong
trạng thái chờ cho đến khi một child nào đó kết thúc
Nhiều kernel cũng thực thi lời gọi hệ thống waitpid() cho phép một tiến trình
đợi một tiến trình child cụ thể Kernel giữ thông tin trên tiến trình của child cho đến
khi parent cấp phát lời gọi wait(), nhưng giả sử tiến trình của parent kết thúc mà không gọi wait()? Thông tin quan trọng lấy ở bộ nhớ có thể được sử dụng để phục vụ cho
những tiến trình đang hoạt động Ví dụ, nhiều shell cho phép user thực hiện lệnh ở background rồi sau đó log out Tiến trình đang chạy trên shell kết thúc, nhưng children của nó vẫn tiếp tục hoạt động
Giải pháp dựa vào tiến trình hệ thống đặc biệt được gọi là init được tạo ra trong suốt việc khởi tạo hệ thống Khi một tiến trình kết thúc, kernel thay đổi con trỏ mô tả tiến trình thích hợp của tất cả children đang tồn tại của tiến trình đã kết thúc để làm chúng trở thành children của init Tiến trình này theo dõi sự thực thi của tất cả children
của nó và thông thường cấp phát lời gọi hệ thống wait(),điều đó có nghĩa là tống khứ tất cả các zombie
1.6.7.2 Nhóm tiến trình và phiên đăng nhập:
Những hệ điều hành Unix mới giới thiệu khái niệm của process group để trình bày khái niệm “job” Ví dụ, để thực thi câu lệnh
$ ls | sort | more
Shell phải hỗ trợ tiến trình nhóm như là bash, tạo một nhóm mới cho ba tiến trình tương ứng với ls, sort và more Shell đóng vai trò trên ba tiến trình như thể chúng
là những thực thể đơn lẻ Mỗi bộ mô tả tiến trình bào gồm một trường process group
ID Mỗi nhóm của các tiến trình có một group leader là tiến trình có PID trùng với process group ID Một tiến trình được tạo mới thì được chèn vào nhóm tiến trình của
parent của nó
Kernel Unix cũng giới thiệu phiên đăng nhập Một phiên đăng nhập chứa tất cả tiết trình con của tiến trình bắt đầu một phiên làm việc trên terminal Tất cả tiến trình trong một nhóm tiến trình phải cùng phiên đăng nhập Một phiên đăng nhập có nhiều nhóm tiến trình đang hoạt động cùng lúc, một trong những nhóm tiến trình này luôn
Trang 25luôn trong foreground, nghĩa là nó truy xuất terminal Những nhóm tiến trình đang hoạt động khác ở background Khi một tiến trình background cố gắng truy xuất
terminal, nó nhận một tín hiệu SIGTTIN hay SIGTTOUT Trong nhiều câu lệnh shell,
sử dụng lệnh nội trú bg và fg để đặt nhóm tiến trình hoặc là ở background hay ở
vị quản lí bộ nhớ (MMU) phần cứng Bộ nhớ ảo có rất nhiều mục đích và ưu điểm:
• Những tiến trình khác nhau có thể được thực thi đồng thời
• Có thể chạy những ứng dụng mà nhu cầu bộ nhớ lớn hơn bộ nhớ vật lí
• Tiến trình có thể chạy một chương trình mà có code chỉ được nạp một phần vào bộ nhớ
• Cho phép mỗi tiến trình truy xuất tập hợp con của bộ nhớ vật lí có sẵn
• Những tiến trình chia sẻ ảnh bộ nhớ đơn của một thư viện hay chương trình
• Có thể đặt lại vị trí cho những chương trình ở bất cứ vị trí nào trong bộ nhớ vật lý
• Người lập trình viết code độc lập với máy vì họ không cần hiểu biến nhiều về tổ chức bộ nhớ vật lý
Thành phần chính của hệ thống bộ nhớ ảo là khái niệm không gian bộ nhớ ảo Các tham chiếu bộ nhớ mà một tiến trình có thể sử dụng khác với địa chỉ bộ nhớ vật lý Khi một tiến trình sử dụng địa chỉ ảo, kernel và MMU hợp tác định vị địa chỉ vật lí của
bộ nhớ được yêu cầu
Các CPU ngày nay bao gồm cả mạch phần cứng tự động dịch địa chỉ ảo thành
địa chỉ vật lý Chia RAM thành nhiều page 4KB hay 8 KB và các page table chi tiết để
xác định rõ sự tương ứng giữa địa chỉ ảo và địa chỉ vật lý Những mạch này làm cho việc định vị bộ nhớ đơn giản hơn bởi vì mỗi yêu cầu cần một khối địa chỉ ảo liên tiếp
Trang 26nhau có thể được đáp ứng bằng cách cấp phát một nhóm page có địa chỉ vật lí không liên tục
1.6.8.2 Sử dụng bộ nhớ truy xuất ngẫu nhiên
Tất cả hệ điều hành Unix phân biệt rõ thành hai phần của RAM Vài MB dùng
để lưu trữ ảnh kernel (kernel code và cấu trúc dữ liệu tĩnh của kernel) Phần còn lại của RAM được điều khiển bởi hệ thống bộ nhớ ảo và được sử dụng theo 3 cách khả thi sau:
• Đáp ứng yêu cầu của kernel về bộ đệm, bộ mô tả và những cấu trúc dữ liệu kernel động khác
• Đáp ứng yêu cầu của tiến trình cho vùng bộ nhớ chung và cho việc ánh
• Phải nhanh, đây là thuộc tính chủ yếu, vì nó được triệu gọi bởi tất cả kernel hệ thống phụ (bao gồm bộ xử lí ngắt)
• Tối thiểu lượng bộ nhớ lãng phí
Trang 271.6.8.4 Điều khiển không gian địa chỉ ảo của tiến trình :
Không gian địa chỉ của tiến trình chứa tất cả địa chỉ bộ nhớ ảo mà tiến trình đó được phép tham chiếu Kernel thường lưu không gian địa chỉ ảo của tiến trình lên một danh sách các mô tả vùng nhớ Ví dụ, khi một tiến trình bắt đầu thực thi một số
chương trình thông qua lời gọi hệ thống giống như exec(), kernel gán cho tiến trình
một không gian địa chỉ ảo mà gồm cả vùng bộ nhớ cho:
• Code thực thi của chương trình
• Dữ liệu khởi tạo của chương trình
• Dữ liệu chưa khởi tạo của chương trình
• Program stack khởi tạo của chương trình (đó là User Mode stack) code thực thi và dữ liệu của thư viện chia sẻ
• Heap (bộ nhớ được yêu cầu linh động bởi chương trình)
Tất cả hệ điều hành Linux/Unix gần đây sử dụng cách định vị trí bộ nhớ
demand paging Với demand paging, một tiến trình có thể bắt đầu thực thi chương
trình với không có page nào của nó trong bộ nhớ vật lý Khi nó truy xuất một page
không tồn tại, MMU phát ra một ngoại lệ, bộ xử lí ngoại lệ tìm vùng bộ nhớ có liên
quan, định vị trí một page trống và khởi tạo nó với dữ liệu thích hợp Tương tự, khi tiến trình yêu cầu linh động bộ nhớ bằng cách sử dụng lời gọi hệ thống malloc() hay
brk(), kernel chỉ việc cập nhật kích thước của vùng nhớ heap của tiến trình Gán một page cho tiến trình chỉ khi nó phát ra một ngoại lệ khi cố gắng tham chiếu đến địa chỉ
bộ nhớ ảo
Không gian địa chỉ ảo cũng cho phép những cách hiệu quả khác như
Copy-On-Write Ví dụ, khi tạo một tiến trình mới, kernel chỉ việc gán page của parent cho
không gian địa chỉ của child nhưng nó đánh dấu là read only Xảy ra một ngoại lệ ngay
Trang 28khi parent hay child cố gắng sửa đổi nội dung của page Bộ xử lí ngoại lệ gán một
page mới để tiến trình tương tác và khởi tạo nó với nội dung của trang gốc
Mặt khác, bộ nhớ vật lí cũng được sử dụng như là cache cho ổ đĩa cứng và
những khối thiết bị khác Vì đĩa cứng truy xuất chậm: truy cập ổ đĩa mất nhiều milliseconds, đó là thời gian rất lớn so với thời gian truy cập RAM Do đó, những ổ đĩa này thường làm chậm khả năng thực thi của hệ thống Một trong những thứ đã được thực thi trong hệ thống Unix sớm nhất là làm chậm việc ghi lên đĩa bằng cách nạp vào RAM một tập bộ đệm ổ đĩa tương ứng với nội dung đọc từ ổ đĩa Lời gọi hệ
thống sync() thúc đẩy sự đồng bộ ổ đĩa bằng cách ghi tất cả những bộ đệm (ví dụ tất cả
bộ đệm có nội dung khác với khối tương ứng trong ổ đĩa) lên đĩa Để tránh mất dữ liệu, tất cả hệ điều hành theo dõi định kì việc ghi dữ liệu từ bộ đệm vào ổ đĩa
1.6.9 Device Drivers
Kernel tương tác với thiết bị nhập xuất là các device driver Device driver nằm
trong kernel và chứa cấu trúc dữ liệu, các chức năng để điều khiển một hay nhiều thiết
bị như ổ đĩa cứng, bàn phím, chuột, màn hình, card mạng và những thiết bị kết nối đến
SCSI bus Mỗi driver tương tác với phần còn lại của kernel (thậm chí với driver khác)
thông qua một giao tiếp riêng biệt Hướng tiếp cận này có những lợi ích sau:
• Mã đặc tả thiết bị có thể được đóng gói trong module cụ thể
• Nhà cung cấp có thể thêm thiết bị mới mà không cần biết source code
của kernel: chỉ cần biết đặc tả của interface
Kernel xem tất cả thiết bị giống nhau và truy xuất chúng thông qua cùng
interface
Có thể ghi một device driver như là một module mà có thể được linh động nạp
vào kernel mà không cần yêu cầu hệ thống khởi động lại, cũng có thể không nạp
Trang 29những module mà không còn được yêu cầu sử dụng nữa, vì vậy tối thiểu hóa kích thước ảnh kernel được lưu trữ trên RAM
Hình dưới mô tả những device driver interface với phần còn lại của kernel và
các những tiến trình Một số chương trình người dùng muốn thao tác trên thiết bị phần cứng Chương trình user đưa ra yêu cầu đến kernel, sử dụng lời gọi hệ thống tập tin có
liên quan và những tập tin về thiết bị thông thường được tìm thấy trong thư mục /dev
Tập tin thiết bị là phần cho user giao tiếp với phần cứng Mỗi tập tin thiết bị tham khảo
đến một device driver cụ thể nào đó mà được triệu gọi bởi kernel để thực hiện những
hoạt động được yêu cầu trên phần cứng
Hình 1-5: Device driver interface
Trang 30Chương 2 Thiết kế một hệ thống Linux nhúng
2.1 Phần cứng hỗ trợ
2.1.1 Kiến trúc CPU
Linux có thể chạy trên rất nhiều kiến trúc CPU khác nhau, tuy nhiên không phải kiến trúc nào cũng được sử dụng trong hệ thống nhúng, phần này chỉ giới thiệu qua những kiến trúc điển hình và các board kèm theo CPU
Dòng x86 bắt đầu từ 368 được Intel giới thiệu vào năm 1985 và bao gồm những sản phẩm nối tiếp, 486 và họ Pentium, cùng với các bộ xử lý tương thích của hãng khác như AMD hay National Semiconductor Mặc dù x86 phổ biến nhất và là nền tảng được cộng đồng Linux sử dụng, nó chỉ đại diện cho một bộ phận nhỏ của các thiết bị nhúng trên thị trường Hầu hết các nhà thiết kế đều sử dụng bộ xử lý ARM, MIPS hay PowerPC vì mức độ phức tạp và giá thành chung
ARM, viết tắt của Advanced RISC Machine, là một họ vi xử lý tiếp tục được công ty ARM Holding duy trì và phát triển Trái ngược với các công ty khác như IBM, Motorola hay Intel ARM không sản xuất CPU mà thiết kế các nhân CPU dựa trên nhân ARM cho các khách hàng của họ, thay đổi tùy theo nhu cầu cho phù hợp với ứng dụng của khách hàng Vì vậy có một đặc điểm dộc đáo là tất cả các bộ xử lý ARM đều
sử dụng chung tập lệnh, điều này giúp cho tính tương thích của các phần mềm được nâng cao
Kiến trúc PowerPC là kết quả của sự hợp tác giữa IBM, Motorola và Apple Thừa hưởng ý tưởng từ 3 hãng lớn này, đặc biệt là IBM với kiến trúc Performance Optimization With Enhanced RISC (POWER) Chip PowerPC được biết đến trong sản phẩm Apple’s Mac và còn rất nhiều các máy tính đến những hệ thống nhúng dùng PowerPC làm bộ xử lý Hệ thống TiVO phổ biến dựa trên CPU PowerPC Cũng như x86, ARM là họ xử lý được hỗ trợ đầy đủ trên hệ điều hành Linux
Trang 31Ngoài những CPU kể trên, MIPS, Hitachi SuperH hay Motorola 68000 cũng được sử dụng trong các hệ thống Linux nhúng
2.1.2 Bus và các chuẩn giao tiếp
Bus và các chuẩn giao tiếp là nền tảng để CPU có thể kết nối đến các thiết bị ngoại vi Mỗi chuẩn bus hay các chuẩn giao tiếp có tính phức tạp riêng của nó và khả năng hỗ trợ của Linux cho các chuẩn bus hay giao tiếp rất lớn Đối với các hệ thống nhúng ngày nay, hầu hết các chuẩn giao tiếp công nghiệp và thương mại đều có sử dụng trên hệ thống nhúng, nhưng đặc biệt là các chuẩn như USB, IEEE194 hay I2C vì tính ưu việt và nhỏ gọn của nó Ngoài ra những chuẩn như ISA, PCI, PCMCIA, CompactPCI, Parallel port hay SCSI cũng có thể được sử dụng trong các hệ thống nhúng
bị lưu trữ cho hệ thống nhúng, cả về kích thước và tổ chức
Trong các thuật ngử của Linux, memory technology devices (MTD) để chỉ tất cả
các thiết bị nhớ như ROM, RAM, bộ nhớ flash và M-Systems' DiskOnChip (DOC) Mỗi thiết bị có khả năng, nét đặc thù riêng và giới hạn của chúng Vì vậy để lập trình
và sử dụng các MTD trong hệ thống nhúng, người phát triển hệ thống thường dùng những công cụ và phương pháp riêng cho thiết bị đó
Trang 32Hình 2-1: Các bộ nhớ MTD
Mặc dầu chỉ có một phần nhỏ các thiết bị nhúng truyền thống sử dụng không gian lưu trữ lớn như trên một đĩa cứng IDE, nhưng hầu hết lại có nhiều hệ thống nhúng lại sử dụng các thiết bị flash tương thích ATA (AT attatchment, thường được hiểu là IDE (Integrated Drive Electronics) ATA là tên chính thức của chuẫn giao tiếp phát triển bởi 3 công ty Impromis, Western Digital và Compaq.) như CompactFlash Các thiết bị lưu trữ CompactFlash chỉ có thể truy xuất qua chuẩn ATA
Trong các hệ thống Linux nhúng có sử dụng lưu trữ trên đĩa, thông thường đĩa
sẽ lưu trữ các OS bootloader, root filesystem và có thể là một phân vùng swap Điều
đáng ngạc nhiên ở đây là không phải hệ thống nhúng cũng tương thích với các ổ đĩa ATA, nó phải được cấu hình trong lúc biên dịch nhân thì mới có thể truy xuất vào lúc khởi động hệ thống
Hệ thống Linux nhúng ít khi sử dụng chuẩn SCSI làm chuẩn giao tiếp với thiết
bị lưu trữ SCSI thường dùng trong các server nhiều hơn vì tốc độ và độ tin cậy của nó
2.1.4 Kết nối mạng
Ngày càng có nhiều hệ thống nhúng được tích hợp kết nối mạng Linux cũng hỗ trợ rất nhiều các phần cứng mạng Điển hình nhất là các chuẩn mạng Ethenet, IrDA(Infrared Data Association (IrDA) ra đời năm 1993 bởi hơn 50 công ty với mục tiêu tạo ra và đẩy mạnh sử dụng thiết bị kết nối hồng ngoại giá thành thấp.) và Bluetooth được sử dụng nhiều trên các thiết bị nhúng do khả năng đem lại của nó.Ethernet hiện
Trang 33nay là thiết bị thâm nhập nhiều nhất, tài liệu nhiều nhất và giá thành thấp nhất trong những chuẩn giao tiếp mạng khác
Hình 2-2: Các nhánh của IrDA trong Linux
Hình 2-3: Các nhánh của Linux BlueZ Bluetooth
Trang 34thành những mã lệnh nhị phân trên nền CPU khác Ví dụ như khi ta biên dịch
MontaVista trên máy host là x86 của Intel nhưng mục đích của chúng ta muốn chạy
MontaVista trên nền PowerPC thì ta sẽ cần một cross compiler để chuyển đổi những
mã lệnh chạy trên nền x86 sang mã lệnh chậy trên PowerPC Các Cross-compiler này
thường được phát triển bởi những chuyên gia rất giỏi về kiến trúc CPU bởi vì chỉ có
thể chuyển đổi một mã lệnh nhị phân từ nền CPU này sang nền CPU khác ta phải biết
kiến trúc CPU, cách định địa chỉ, các quy định về opcode, operand của cả hai CPU đó
Kèm theo đó là những công cụ cần thiết để phát triển các ứng dụng chạy trên target
bao gồm các tiện ích ở dạng nhị phân, bộ biên dịch C (gcc) và thư viện C (glibc) Việc
cầu hình và xây dựng một toolchain phức tạp và là một tiến trình độp lập đòi hỏi có
kiến thức phụ thuộc giữa các gói phần mêm và những quy luật tương ứng của chúng
Hiểu biết này là rất cần thiết, vì các phiên bãn GNU toolchain được phát triển và đưa
Bảng 2-1: Kết hợp phiên bản các gói công cụ và thư viện
2.3 Chọn lựa và biên dịch Linux kernel
Đây là những phân phối (distributions - distro) thương mại được duy trì hỗ trợ
từ những nhà cung cấp Các distro này cung cấp khả năng, giải pháp đối với hàng loạt
các kiến trúc hệ thống cho các thị trường khác nhau Từ các hệ thống thông tin liên lạc
cao cấp đến các thiết bị cầm tay, các thiết bị điều khiển thông thường…
• AMIRIX: Embedded Linux
Trang 35Có nguồn gốc từ mã nguồn mở Debian GNU/Linux, được thay đổi để hỗ trợ thêm nhiều thiết bị chuyên dụng cùng các công cụ cấu hình hệ thống Hỗ trợ small-footprint, diskless, Flash-based, đòi hỏi hệ thống headless
• Esfia: RedBlue Linux
Một distro Linux nhúng cho các giải thông tin vô tuyến, có nguồn gốc từ nhân Linux phiên bản 2.4 Nhân Linux thông thường chỉ chiếm khoảng 400KB và hỗ trợ các bộ xử lý có MMU lẫn không có
• KaeilOS (formerly Klinux)
Distro Linux cho các ứng dụng công nghiệp Bao gồm cả các thiết bị phát triển
và sửa lỗi cho các hệ thống nhúng real-time Các tài liệu chi tiết hoàn toàn được viết bởi công ty Koan Software, Bergamo, Italy
• KYZO: PizzaBox Linux
Sự kết hợp của Linux và Samba, là một distro dùng làm server phục vụ quản lý file, máy in và đĩa CD Thiết kế rất nhỏ gọn, chỉ cần 6MB Flash chạy trên xử lý 486 (hoặc mạnh hơn)
• Lineo: Embedix
Giải pháp Linux nhúng được thiết kế cho hệ thống đặc biệt về tốc độ, bộ nhớ và các thiết bị lưu trữ Hỗ trợ nhiều dòng xử lý (có và không có MMU) như X86, PowerPC, ARM, MIPS… Bao gồm cả hỗ trợ cho small-footprint, real-time
• LynuxWorks: BlueCat
Distro này đáp ứng yêu cầu của những người pháp triển hệ thống nhúng Cho phép cấu hình phù hợp với yêu cầu của hệ thống nhúng Hỗ trợ từ các thiết bị nhỏ đến những hệ thống lớn đa bộ xử lý và co tính khả dụng cao, hỗ trợ các dòng xử lý X86, PowerPC, ARM, MIPS…
Trang 36• Mizi: Linu@
Linu@ là một hệ điều hành Linux nhúng với giao diện người dùng trên Qt/Embedded Tính hiệu quả và kích thước nhỏ gọn nên rất phù hợp với các thiết bị Internet, điện thoại thông minh, hay thiết bị trợ lý số Hỗ trợ nhiều dòng xử lý như ARM, StrongARM, MIPS, x86, và MPC Hệ điều hành chỉ cần 2MB DRAM và 4MB Flash memory
• SysGo: ELinOS Embedded Linux
ElinOS dựa trên nhân Linux 2.5 vì vậy cung cấp những tính năng mới nhất như Journaling Flash File System (JFFS), Memory Technology Devices (MTD), và đặc biệt là USB Hỗ trợ các tác vụ real-time (RTAI kernel extension)
• TimeSys: Linux GPL
Distro Linux GPL hỗ trợ các board nhúng Cùng với các thư viện, tool chains, tiện ích, các kịch bản và tài liệu đi kèm, tất cả đều có giấy phép GPL Hơn nữa là các lựa chọn để cải thiện hệ thống đáp ứng real-time, chất lượng dịch vụ và hiệu suất mạng
• Tuxia: TASTE
Trang 37TASTE nhắm vào các thiết bị Internet như các webpads, set-top boxes, các máy khách nhỏ và điện thoại truyền hình Nó cũng kèm theo rất nhiều các software, driver phần cứng, nhân của Linux nhúng, các engine đồ họa, giả lập Java…
• Vitals System: vLinux
Một gói Linux cho các ứng dụng trên nền xử lý ARM vLinux cũng có thể hỗ trợ các dòng xử lý không có MMU, phù hợp với các thiết kết hạ thấp giá thành cho các sản phẩm thương mại vLinux hiện tại có thể chạy trên họ xử lý ARM, kiến trúc RISC của Samsung, tuy nhiên khả năng chạy trên các bộ xử lý khác đang được cải thiện
2.3.1 MontaVista Linux
Với hơn 2000 đối tác phát triển MontaVista Linux trên khắp thế giới trên khắp các lĩnh vực công nghiệp Không thể phủ nhận MontaVista là nhà cung cấp nền tảng
hệ điều hành Linux thương mại hàng đầu thế giới cho các thiết bị số thông minh và cơ
sở hạ tầng thông tin liên lạc Với 4 trong 5 nhà cung cấp các thiết bị mạng hàng đầu sử dụng MontaVista Linux, cũng như những nhà sản xuất điện thoại di động, điện tử tiêu dùng và viễn thông trên khắp thế giới – MontaVista là một trong những hệ điều hành được sử dụng rộng rãi nhất trong hơn 40 triệu thiết bị nhúng trên giới.MontaVista Linux được thiết kế có khả năng mở rộng, độ tin cậy cao và hiệu suất cao, khả năng real-time, đáp ứng cho các thiết bị thông minh ngày nay Hỗ trợ số lượng các kiến trúc
xử lý nhiều nhất trong các thiết bị nhúng cao cấp, bao gồm dòng x86, PowerPC, ARM,
SH và MIPS MontaVista Linux hỗ trợ hơn 60 COTS, các bo mạch phát triển và các công cụ phát triển nhanh
Một số thiết bị điển hình sử dụng MontaVista Linux có thể kể đến như các điện thoại Motorola A760 và 768i Mặc dầu sự thật Motorola là một trong những thành viên sáng lập ra hệ điều hành Simbian Chiếc A760 được tung ra vào ngày 16 tháng hai năm 2003 ở thị trường Trung Quốc Đây cũng là lần đầu tiên Linux được sử dụng trên máy điện thoại, từ đó Motorola tập trung vào nền Linux của họ, và đã công bố nền tảng trong tương lai của họ vẫn sẽ là Linux và Java Hiện nay cũng có những điện thoại của Motorola sử dụng Linux, nổi tiếng có thể kể đến Motorola RAZR2 và các dòng Motorola ROKR E2, E6
Trang 38Texas Istruments cũng đã công bố họ sẽ sử dụng MontaVista Linux phiên bản Professional là hệ điều hành được hỗ trợ trên nền tảng System-on-chip DaVinci
hỗ trợ nhiều kiến trúc xử lý, điển hình là các dòng M86k, ColdFire, ARM, Sparc, NEC v850, H8/300, ngay cả softcore CPU như Altera NIOS và Xilinx MicroBlaze Hỗ trợ thư viện uClibc cũ và các phiên bản mới hơn như uClibc-0.9.27
2.3.3 Cấu hình kernel
Cấu hình là bước đầu tiên cần làm trước khi xây dựng kernel cho target Có rất
nhiều cách và các lựa chọn khi cấu hình kernel Không xét đến các cách cầu hình hay
các lựa chọn của người dùng, kernel sẽ tạo ra file config khi hoàn tất quá trình cấu hình và sẽ tạo ra hàng loạt các liên kết và header file sử dụng trong suốt quá trình biên
dịch Ở đây chỉ trình bày sự khác nhau khi cấu hình kernel trên các hệ thống nhúng
Trong quá trình cấu hình, người dùng có khả năng lựa chọn các module sẽ
dùng trong kernel Tuy theo target mà các menu lựa chọn có thể thay đổi, một số
menu sẽ không thể dùng được trên kiến trúc CPU của hệ thống nhúng Những menu có thể dùng khi lựa chọn trên các hệ thống nhúng bao gồm:
Code maturity level options
Loadable module support
General setup
Memory technology devices
Trang 39 Block devices
Networking options
ATA/IDE/MFM/RLL support
SCSI support
Network device support
Input core support
Bảng 2-3: Phần cứng hỗ trợ với các kiến trúc CPU
Việc cấu hình phần kernel có thể thực hiện bằng các phương pháp khác nhau:
cấu hình bằng command-line bằng make config, cấu hình sử dụng các tùy chọn cũ bằng make oldconfig, cấu hình bằng các menu đơn giản bằng make menuconfig và cấu hình bằng giao diện Xwindows bằng make xconfig Việc cấu hình cũng đòi hỏi người
dùng có kiến thức về các module sẽ sử dụng trong kernel
Trang 402.4 Xây dựng hệ thống thư mục gốc (root filesystem)
2.4.1 Hệ thống tập tin (File Systems)
Mỗi hệ điều hành đều có cách tổ chức dữ liệu riêng Ở mức vật lý, đĩa cứng được định dạng thành các cung từ bao gồm sector, track, cylinder (chức năng này thường được lệnh format cấp thấp thực hiện) Tuy nhiên ở mức logic các hệ điều hành thường sắp xếp tổ chức dữ liệu theo chỉ mục và phân cấp sao cho quá trình sao lưu, tìm kiếm dữ liệu là hiệu quả và nhanh nhất, cơ chế mà mỗi hệ điều hành tổ chức lưu trữ tập tin trên đĩa được gọi là hệ thống file
Ví dụ DOS và Windows 95/98 sử dụng cơ chế bảng FAT16, FAT32 để lưu tên thư mục và tập tin Windows NT có cách tổ chức và lưu file mới hơn gọi là NTFS (NT filesystem) Linux sử dụng hệ thống EXT2(Second Extended File System) để lưu trữ
dữ liệu và tên của tập tin, thư mục EXT2 sử dụng một bảng i-node bao gồm một tập các nút để lưu thông tin và tên của tập tin, thư mục Mỗi tập tin hay thư mục đều được tham chiếu hay trỏ đến bởi một i-node Dữ liệu của tập tin được lưu vào thành từng khối liền nhau Hệ thống EXT2 bảo đảm cơ chế lưu trữ tối ưu và khiến dữ liệu trên đĩa cứng không bị phân mảnh (fragment) như trong hệ thống file sử dụng bảng FAT của DOS
2.4.2 Các thư mục trên Linux
Lần đầu tiên làm quen với Linux có lẽ bạn sẽ thấy Linux có khá nhiều thư mục, nhưng nhìn chung các thư mục này đã được chuẩn hóa và có những mục đích sử dụng nhất định Tất cả các file và thư mục được lưu trữ theo một cấu trúc hình cây duy nhất
Gốc của cây thư mục này được gọi là root và được ký hiệu bằng ký tự sổ trái /
Cơ bản một hệ thống Linux thường có các thư mục sau:
/bin Chứa các file chương trình thực thi (file nhị phân) và file khởi
động của hệ thống
/boot Các file ảnh (image file) của kernel dùng cho quá trình khởi động
thường được đặt trong thư mục này
/dev Chứa các file thiết bị Trong thế giới UNIX và Linux, các thiết bị
phần cứng được xem như là file Đĩa cứng và các phân vùng của