Khác với các máy tính đa chức năng, chẳng hạn như máy tính cá nhân, một hệ thống nhúng chỉ thực hiện một hoặc một vài chức năng nhất định, thường đi kèm với những yêu cầu cụ thể và bao g
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
Báo Cáo Môn Hệ Điều Hành
Embedded Linux System
Phan Duy, Phạm Tuấn Duy, Bùi Thanh Hùng, Phạm Xuân Sơn, Phạm Đức Nguyên,
Nguyễn Xuân Triễn, Lê Quốc Hưng, Đào Xuân Dạng
11/22/2012
Những kiến thức căn bản về hệ điều hành nhúng linux và ứng dụng của nó trong lĩnh vực công nghệ thông tin nói chung và lập trình nhúng nói riêng được nhóm sưu tầm và tổng hợp
Trang 2Nhận xét
Trang 3
Nội Dung
I GIỚI THIỆU TỔNG QUAN VỀ HỆ THỐNG NHÚNG VÀ HỆ ĐIỀU HÀNH THỜI
GIAN THỰC 4
1 Hệ thống nhúng (Embedded System) 4
a) Khái niệm 4
b) Hệ thống thời gian thực 4
c) Đặc trưng 5
d) Giao diện 5
e) Kiến trúc CPU 5
f) Thiết bị ngoại vi 6
g) Công cụ phát triển 6
2 Hệ điều hành thời gian thực (RTOS) và kernel thời gian thực 7
a) Chương trình, tác vụ và luồng 7
b) Vòng lặp kiểm soát đơn giản 8
c) Hệ thống ngắt điều khiển 9
d) Đa nhiệm tương tác 9
e) Đa nhiệm ưu tiên 9
f) Vi nhân (Microkernel) và nhân ngoại (Exokernel) 9
g) Nhân khối (monolithic kernels) 10
II PHẦN MÊM TRONG EMBEDDED LINUX 10
1 Giới thiệu Linux 10
a) Tổng quan 11
b) Điểm mạnh 12
c) Điểm yếu 13
2 Linux Kernel 14
a) Kiến trúc nhân 14
b) Đặc điểm chính của nhân Linux 20
c) File System 21
d) Device Drivers 25
Trang 4e) Cấu hình kernel 25
f) Biên Dịch và cài đặt hạt nhân cho hệ thống máy chủ 32
g) Sử dụng mô-đun hạt nhân 33
3 Toolchain 34
a) Cross compiler 34
b) Định nghĩa Toolchain và các thành phần 35
c) Thư viện C 37
d) Toolchain Options 38
e) Xây dựng một Toolchain 39
4 Bootloader 42
a) Giới thiệu Bootloader 42
b) Bootloader trên một số nền tảng phổ biến 42
c) Bootloader cho các CPUs nhúng 45
d) U-boot Bootloader 45
III PHẦN CỨNG ĐỐI VỚI EMBEDDED LINUX 52
1 Yêu cầu phần cứng 52
2 Khả năng tích hợp phần cứng 54
3 Các phần cứng tích hợp hiện nay 56
IV ỨNG DỤNG – XÂY DỰNG MỘT HỆ THỐNG NHÚNG LINUX TRÊN NỀN TẢNG ARM (TI OMAP3) 57
1 Cấu hình phần cứng 57
2 Build một Cross-compiling Toolchain 58
3 Buil Bootloader U-Boot 61
4 Build kernel Linux 64
5 Hướng phát triển của các ứng dụng Embedded Linux 66
6 Embedded Linux trong Android 67
V Tham Khảo 71
Trang 5I GIỚI THIỆU TỔNG QUAN VỀ HỆ THỐNG NHÚNG VÀ HỆ ĐIỀU HÀNH THỜI GIAN THỰC
1 Hệ thống nhúng (Embedded System)
a) Khái niệm
Hệ thống nhúng (Embedded system) là một thuật ngữ để chỉ một hệ thống có khả năng tự trị được nhúng vào trong một môi trường hay một hệ thống mẹ Đó là các hệ thống tích hợp cả phần cứng và phần mềm phục vụ các bài toán chuyên dụng trong nhiều lĩnh vực công nghiệp, tự động hoá điều khiển, quan trắc và truyền tin Đặc điểm của các
hệ thống nhúng là hoạt động ổn định và có tính năng tự động hoá cao
Hệ thống nhúng thường được thiết kế để thực hiện một chức năng chuyên biệt nào
đó Khác với các máy tính đa chức năng, chẳng hạn như máy tính cá nhân, một hệ thống nhúng chỉ thực hiện một hoặc một vài chức năng nhất định, thường đi kèm với những yêu cầu cụ thể và bao gồm một số thiết bị máy móc và phần cứng chuyên dụng mà ta không tìm thấy trong một máy tính đa năng nói chung Vì hệ thống chỉ được xây dựng cho một
số nhiệm vụ nhất định nên các nhà thiết kế có thể tối ưu hóa nó nhằm giảm thiểu kích thước và chi phí sản xuất Các hệ thống nhúng thường được sản xuất hàng loạt với số lượng lớn Hệ thống nhúng rất đa dạng, phong phú về chủng loại Đó có thể là những thiết bị cầm tay nhỏ gọn như đồng hồ kĩ thuật số và máy chơi nhạc MP3, hoặc những sản phẩm lớn như đèn giao thông, bộ kiểm soát trong nhà máy hoặc hệ thống kiểm soát các máy năng lượng hạt nhân Xét về độ phức tạp, hệ thống nhúng có thể rất đơn giản với một vi điều khiển hoặc rất phức tạp với nhiều đơn vị, các thiết bị ngoại vi và mạng lưới được nằm gọn trong một lớp vỏ máy lớn
Các thiết bị PDA hoặc máy tính cầm tay cũng có một số đặc điểm tương tự với hệ thống nhúng như các hệ điều hành hoặc vi xử lý điều khiển chúng nhưng các thiết bị này không phải là hệ thống nhúng thật sự bởi chúng là các thiết bị đa năng, cho phép sử dụng nhiều ứng dụng và kết nối đến nhiều thiết bị ngoại vi
b) Hệ thống thời gian thực
Trong lĩnh vực công nghệ thông tin, người ta nói về hệ thống thông tin thời gian thực khi hệ thống đó điều khiển một vật thể vật lý với một tốc độ phù hợp với sự tiến triển của tiến trình chủ Một ví dụ dễ hiểu (hệ thống thông tin điều khiển màn hình hiển thị giờ chính xác của các tàu điện ngầm sẽ đến và đi tại một gare nhất định) Hệ thống thông tin thời gian thực khác với những hệ thống thông tin khác bởi sự gò bó về thời gian, do đó, việc tuân thủ các nguyên tắc cũng quan trọng như độ chính xác của kết quả, nói một cách khác, hệ thống không chỉ đơn giản là đưa ra kết quả chính xác mà nó còn phải thực hiện một xử lý trong một thời gian rất ngắn Hệ thống thông tin thời gian thực ngày nay được ứng dụng trong rất nhiều lĩnh vực như: trong ngành công nghiệp sản xuất,
Trang 6kiểm soát tiến trình (trong nhà máy, hay trong viện hạt nhân, trong hệ thống hàng không, thông qua các hệ thống dẫn đường tích hợp trên máy bay và vệ tinh) Sự phát triển của hệ thống thông tin thời gian thực yêu cầu mỗi phần tử của hệ thống phải ở thời gian thực, và một hệ thống được thiết kế theo cách như vậy được gọi là hệ điều hành thời gian thực c) Đặc trưng
Hệ thống nhúng thường có một số đặc điểm chung như sau:
Các hệ thống nhúng được thiết kế để thực hiện một số nhiệm vụ chuyên dụng chứ không phải đóng vai trò là các hệ thống máy tính đa chức năng Một số hệ thống đòi hỏi ràng buộc về tính hoạt động thời gian thực để đảm bảo độ an toàn và tính ứng dụng; một số hệ thống không đòi hỏi hoặc ràng buộc chặt chẽ, cho phép đơn giản hóa
hệ thống phần cứng để giảm thiểu chi phí sản xuất
Một hệ thống nhúng thường không phải là một khối riêng biệt mà là một hệ thống phức tạp nằm trong thiết bị mà nó điều khiển
Phần mềm được viết cho các hệ thống nhúng được gọi là firmware và được lưu trữ trong các chip bộ nhớ ROM hoặc bộ nhớ flash chứ không phải là trong một ổ đĩa Phần mềm thường chạy với số tài nguyên phần cứng hạn chế: không có bàn phím, màn hình hoặc có nhưng với kích thước nhỏ, dung lượng bộ nhớ thấp Sau đây, ta sẽ đi sâu, xem xét cụ thể đặc điểm của các thành phần của hệ thống nhúng
d) Giao diện
Các hệ thống nhúng có thể không có giao diện (đối với những hệ thống đơn nhiệm) hoặc có đầy đủ giao diện giao tiếp với người dùng tương tự như các hệ điều hành trong các thiết bị để bàn Đối với các hệ thống đơn giản, thiết bị nhúng sử dụng nút bấm, đèn LED và hiển thị chữ cỡ nhỏ hoặc chỉ hiển thị số, thường đi kèm với một hệ thống menu đơn giản
Còn trong một hệ thống phức tạp hơn, một màn hình đồ họa, cảm ứng hoặc có các nút bấm ở lề màn hình cho phép thực hiện các thao tác phức tạp mà tối thiểu hóa được khoảng không gian cần sử dụng; ý nghĩa của các nút bấm có thể thay đổi theo màn hình
và các lựa chọn Các hệ thống nhúng thường có một màn hình với một nút bấm dạng cần điểu khiển (joystick button) Sự phát triển mạnh mẽ của mạng toàn cầu đã mang đến cho những nhà thiết kế hệ nhúng một lựa chọn mới là sử dụng một giao diện web thông qua việc kết nối mạng Điều này có thể giúp tránh được chi phí cho những màn hình phức tạp nhưng đồng thời vẫn cung cấp khả năng hiển thị và nhập liệu phức tạp khi cần đến, thông qua một máy tính khác Điều này là hết sức hữu dụng đối với các thiết bị điều khiển từ
xa, cài đặt vĩnh viễn Ví dụ, các router là các thiết bị đã ứng dụng tiện ích này
e) Kiến trúc CPU
Trang 7Các bộ xử lý trong hệ thống nhúng có thể được chia thành hai loại: vi xử lý và vi điều khiển Các vi điều khiển thường có các thiết bị ngoại vi được tích hợp trên chip nhằm giảm kích thước của hệ thống Có rất nhiều loại kiến trúc CPU được sử dụng trong thiết
kế hệ nhúng như ARM, MIPS, Coldfire/68k, PowerPC, x86, PIC, 8051, Atmel AVR, Renesas H8, SH, V850, FR-V, M32R, Z80, Z8 … Điều này trái ngược với các loại máy tính để bàn, thường bị hạn chế với một vài kiến trúc máy tính nhất định Các hệ thống nhúng có kích thước nhỏ và được thiết kế để hoạt động trong môi trường công nghiệp thường lựa chọn PC/104 và PC/104++ làm nền tảng Những hệ thống này thường sử dụng DOS, Linux, NetBSD hoặc các hệ điều hành nhúng thời gian thực như QNX hay VxWorks Còn các hệ thống nhúng có kích thước rất lớn thường sử dụng một cấu hình thông dụng là hệ thống on chip (System on a chip – SoC), một bảng mạch tích hợp cho một ứng dụng cụ thể (an application-specific integrated circuit – ASIC) Sau đó nhân CPU được mua và thêm vào như một phần của thiết kế chip Một chiến lược tương tự là
sử dụng FPGA (field-programmable gate array) và lập trình cho nó với những thành phần nguyên lý thiết kế bao gồm cả CPU
f) Thiết bị ngoại vi
Hệ thống nhúng giao tiếp với bên ngoài thông qua các thiết bị ngoại vi, ví dụ như:
Serial Communication Interfaces (SCI): RS-232, RS-422, RS-485
Synchronous Serial Communication Interface: I2C, JTAG, SPI, SSC và ESSI
Universal Serial Bus (USB)
Networks: Controller Area Network, LonWorks
Bộ định thời: PLL(s), Capture/Compare và Time Processing Units
Discrete IO: General Purpose Input/Output (GPIO)
g) Công cụ phát triển
Tương tự như các sản phẩm phần mềm khác, phần mềm hệ thống nhúng cũng được phát triển nhờ việc sử dụng các trình biên dịch (compilers), chương trình dịch hợp ngữ (assembler) hoặc các công cụ gỡ rối (debuggers) Tuy nhiên, các nhà thiết kế hệ thống nhúng có thể sử dụng một số công cụ chuyên dụng như:
Bộ gỡ rối mạch hoặc các chương trình mô phỏng (emulator)
Tiện ích để thêm các giá trị checksum hoặc CRC vào chương trình, giúp hệ thống nhúng có thể kiểm tra tính hợp lệ của chương trình đó
Trang 8 Đối với các hệ thống xử lý tín hiệu số, người phát triển hệ thống có thể sử dụng phần mềm workbench như MathCad hoặc Mathematica để mô phỏng các phép toán
Các trình biên dịch và trình liên kết (linker) chuyên dụng được sử dụng để tối ưu hóa một thiết bị phần cứng
Một hệ thống nhúng có thể có ngôn ngữ lập trình và công cụ thiết kế riêng của nó hoặc sử dụng và cải tiến từ một ngôn ngữ đã có sẵn
Các công cụ phần mềm có thể được tạo ra bởi các công ty phần mềm chuyên dụng về
hệ thống nhúng hoặc chuyển đổi từ các công cụ phát triển phần mềm GNU Đôi khi, các công cụ phát triển dành cho máy tính cá nhân cũng được sử dụng nếu bộ xử lý của hệ thống nhúng đó gần giống với bộ xử lý của một máy PC thông dụng
2 Hệ điều hành thời gian thực (RTOS) và kernel thời gian thực
a) Chương trình, tác vụ và luồng
Một chương trình trên một hệ thống nhúng chính là một phần mềm có khả năng thực thi độc lập và có vùng nhớ riêng của mình Nó bao gồm môi trường thực thi một chức năng cụ thể và khả năng tương tác với hệ điều hành Một chương trình có thể được bắt đầu chạy một cách độc lập hoặc có thể từ các chương trình khác Một hệ điều hành có khả năng thực thi nhiều chương trình cùng một lúc song song nhau
Tuy nhiên, khi một chương trình có khả năng tự chia ra một vài phần có khả năng thực thi song song nhau, mỗi phần đó được gọi là một luồng Một luồng chính là một phần trong chương trình và phụ thuộc về mặt chức năng so với các luồng khác nhưng lại
có khả năng hoạt động độc lập nhau Các luồng sẽ chia sẻ chung một bộ nhớ trong một chương trình Khái niệm về tác vụ và luồng có thể thay thế cho nhau Hình dưới mô tả sự khác nhau giữa chương trình và luồng
Trang 9Một phương pháp khác mà các kernel thời gian thực hay sử dụng đó chính là mô hình sắp xếp mức độ ưu tiên Trong mô hình này, mỗi luồng sẽ đi kèm với mức độ ưu tiên của
nó, lúc này, vi xử lý sẽ thiết lập đường truy cập tới luồng nào có mức độ ưu tiên cao nhất khi nó đòi hỏi được phục vụ Cũng có một vài biến thể của phương pháp này, tuy nhiên vẫn phải đảm bảo các luồng có mức độ ưu tiên thấp nhất vẫn phải có thể truy cập tới vi
xử lý một vài lần Hình dưới mô tả phương pháp cách xử lý của phương pháp này
Một ưu điểm cực kỳ quan trọng của phương pháp này đó chính là nó có khả năng tạm hoãn thực thi một luồng khi có một luồng khác với mức độ ưu tiên cao hơn cần phục vụ Quá trình lưu trữ lại các thông tin hiện thời của luồng bị tạm hoãn thực thi khi có một luồng khác với mức độ ưu tiên cao hơn cần phục vụ gọi là “context switching” Quá trình này phải được thực hiện nhanh và đơn giản để luồng bị tạm hoãn có thể thực hiện tiếp nhiệm vụ của mình một cách chính xác khi nó lấy lại đươc quyền điều khiển
Một hệ thống nhúng thời gian thực phải có khả năng đáp ứng lại các tín hiệu ngõ vào hay các sự kiện một cách nhanh nhất và chính xác nhất, đây chính là các ngắt của hệ thống Ngắt của hệ thống sẽ phải làm cho vi xử lý ngưng nhiệm vụ đang thực thi để xử lý ngắt Một ngắt sẽ được xử lý bởi ISR (interrupt service routine), nó có khả năng kích hoạt một luồng có mức độ ưu tiên cao hơn luồng đang được thực thi Lúc này, nó sẽ tạm hoãn lại luồng hiện tại để dành quyền cho luồng mới có mức độ ưu tiên cao hơn Ngắt có thể được tạo ra bởi phần mềm (ngắt mềm) hay bởi các thiết bị phần cứng (ngắt cứng)
b) Vòng lặp kiểm soát đơn giản
Theo thiết kế này, phần mềm được tổ chức thành một vòng lặp đơn giản Vòng lặp gọi đến các chương trình con, mỗi chương trình con quản lý một phần của hệ thống phần cứng hoặc phần mềm
Trang 10c) Hệ thống ngắt điều khiển
Các hệ thống nhúng thường được điểu khiển bằng các ngắt Có nghĩa là các tác vụ của hệ thống nhúng được kích hoạt bởi các loại sự kiện khác nhau Ví dụ, một ngắt có thể được sinh ra bởi một bộ định thời sau một chu kỳ được định nghĩa trước, hoặc bởi sự kiện khi cổng nối tiếp nhận được một byte nào đó
Loại kiến trúc này thường được sử dụng trong các hệ thống có bộ quản lý sự kiện đơn giản, ngắn gọn và cần độ trễ thấp Hệ thống này thường thực hiện một tác vụ đơn giản trong một vòng lặp chính Đôi khi, các tác vụ phức tạp hơn sẽ được thêm vào một cấu trúc hàng đợi trong bộ quản lý ngắt để được vòng lặp xử lý sau đó Lúc này, hệ thống gần giống với kiểu nhân đa nhiệm với các tiến trình rời rạc
d) Đa nhiệm tương tác
Một hệ thống đa nhiệm không ưu tiên cũng gần giống với kỹ thuật vòng lặp kiểm soát đơn giản ngoại trừ việc vòng lặp này được ẩn giấu thông qua một giao diện lập trình API Các nhà lập trình định nghĩa một loạt các nhiệm vụ, mỗi nhiệm vụ chạy trong một môi trường riêng của nó Khi không cần thực hiện nhiệm vụ đó thì nó gọi đến các tiến trình con tạm nghỉ (bằng cách gọi “pause”, “wait”, “yield” …)
Ưu điểm và nhược điểm của loại kiến trúc này cũng giống với kiểm vòng lặp kiểm soát đơn giản Tuy nhiên, việc thêm một phần mềm mới được thực hiện dễ dàng hơn bằng cách lập trình một tác vụ mới hoặc thêm vào hàng đợi thông dịch (queue-
interpreter)
e) Đa nhiệm ưu tiên
Ở loại kiến trúc này, hệ thống thường có một đoạn mã ở mức thấp thực hiện việc chuyển đổi giữa các tác vụ khác nhau thông qua một bộ định thời Đoạn mã này thường nằm ở mức mà hệ thống được coi là có một hệ điều hành và vì thế cũng gặp phải tất cả những phức tạp trong việc quản lý đa nhiệm
Bất kỳ tác vụ nào có thể phá hủy dữ liệu của một tác vụ khác đều cần phải được tách biệt một cách chính xác Việc truy cập tới các dữ liệu chia sẻ có thể được quản lý bằng một số kỹ thuật đồng bộ hóa như hàng đợi thông điệp (message queues), semaphores …
Vì những phức tạp nói trên nên một giải pháp thường được đưa ra đó là sử dụng một hệ điều hành thời gian thực Lúc đó, các nhà lập trình có thể tập trung vào việc phát triển các chức năng của thiết bị chứ không cần quan tâm đến các dịch vụ của hệ điều hành nữa f) Vi nhân (Microkernel) và nhân ngoại (Exokernel)
Khái niệm vi nhân (microkernel) là một bước tiếp cận gần hơn tới khái niệm hệ điều hành thời gian thực Lúc này, nhân hệ điều hành thực hiện việc cấp phát bộ nhớ và
chuyển CPU cho các luồng thực thi Còn các tiến trình người dùng sử dụng các chức
Trang 11năng chính như hệ thống file, giao diện mạng lưới,… Nói chung, kiến trúc này thường được áp dụng trong các hệ thống mà việc chuyển đổi và giao tiếp giữa các tác vụ là
nhanh
Còn nhân ngoại (exokernel) tiến hành giao tiếp hiệu quả bằng cách sử dụng các lời gọi chương trình con thông thường Phần cứng và toàn bộ phần mềm trong hệ thống luôn đáp ứng và có thể được mở rộng bởi các ứng dụng
g) Nhân khối (monolithic kernels)
Trong kiến trúc này, một nhân đầy đủ với các khả năng phức tạp được chuyển đổi để phù hợp với môi trường nhúng Điều này giúp các nhà lập trình có được một môi trường giống với hệ điều hành trong các máy để bàn như Linux hay Microsoft Windows và vì thế rất thuận lợi cho việc phát triển Tuy nhiên, nó lại đòi hỏi đáng kể các tài nguyên phần cứng làm tăng chi phí của hệ thống Một số loại nhân khối thông dụng là Embedded Linux và Windows CE Mặc dù chi phí phần cứng tăng lên nhưng loại hệ thống nhúng này đang tăng trưởng rất mạnh, đặc biệt là trong các thiết bị nhúng mạnh như Wireless router hoặc hệ thống định vị GPS Lý do của điều này là:
Hệ thống này có cổng để kết nối đến các chip nhúng thông dụng
Hệ thống cho phép sử dụng lại các đoạn mã sẵn có phổ biến như các trình điều khiển thiết bị, Web Servers, Firewalls, …
Việc phát triển hệ thống có thể được tiến hành với một tập nhiều loại đặc tính, chức năng còn sau đó lúc phân phối sản phẩm, hệ thống có thể được cấu hình để loại bỏ một số chức năng không cần thiết Điều này giúp tiết kiệm được những vùng nhớ mà các chức năng đó chiếm giữ
Hệ thống có chế độ người dùng để dễ dàng chạy các ứng dụng và gỡ rối Nhờ đó, qui trình phát triển được thực hiện dễ dàng hơn và việc lập trình có tính linh động hơn
Có nhiều hệ thống nhúng thiếu các yêu cầu chặt chẽ về tính thời gian thực của hệ thống quản lý Còn một hệ thống như Embedded Linux có tốc độ đủ nhanh để trả lời cho nhiều ứng dụng Các chức năng cần đến sự phản ứng nhanh cũng có thể được đặt vào phần cứng
II PHẦN MÊM TRONG EMBEDDED LINUX
1 Giới thiệu Linux
Khác với PC thường chạy trên nền hệ điều hành windows hoặc unix, các hệ thống nhúng có các hệ điều hành nhúng riêng của mình Các hệ điều hành dùng trong các hệ nhúng nổi trội hiện nay bao gồm Embedded linux, VxWorks, WinCE, Lynyos, BSD, Green Hills, QNX và DOS, Embeddde linux hiện đang phát triển mạnh Năm 2001 hệ điều hành này chiếm 12% thị phần các hệ điều hành nhúng thì năm 2002 chiếm 27% và
Trang 12chiếm vị trí số 1 Hiện nay 40% các nhà thiết kế các hệ nhúng cân nhắc đầu tiên sử dụng Embedded linux cho các ứng dụng mới của mình và sau đó mới đến các hệ điều hành nhúng truyền thống như VxWorks, WinCE Các đối thủ cạnh tranh của Embedded linux hiện nay là các hệ điều hành nhúng tự tạo và windows CE Sở dĩ Embedded linux có sự phát triển vượt bậc là do có sức hấp dẫn đối với các ứng dụng giá thành thấp và đòi hỏi thời gian đưa sản phẩm ra thị trường nhanh Mặt khác Linux là phần mềm mã nguồn mở nên bất kỳ ai cũng có thể hiểu và thay đổi theo ý mình Linux cũng là một hệ điều hành
có cấu trúc module và chiếm ít bộ nhớ trong khi windows không có các đặc tính ưu việt này Do thị trường của các sản phẩm nhúng tăng mạnh lên các nhà sản xuất ngày càng sử dụng các hệ điều hành nhúng để đảm bảo sản phẩm có sức cạnh tranh và Embedded linux đang là sản phẩm hệ điều hành nhúng có uy tín chiếm vị trí số 1 trong những năm tới a) Tổng quan
Linux là tên gọi của một hệ điều hành máy tính và cũng là tên hạt nhân của hệ điều hành
Nó có lẽ là một ví dụ nổi tiếng nhất của phần mềm tự do và của việc phát triển mã nguồn
mở
Phiên bản Linux đầu tiên do Linus Torvalds viết vào năm 1991, lúc ông còn là một sinh viên của Đại học Helsinki tại Phần Lan Ông làm việc một cách hăng say trong vòng 3 năm liên tục và cho ra đời phiên bản Linux 1.0 vào năm 1994 Bộ phận chủ yếu này được phát triển và tung ra trên thị trường dưới bản quyền GNU General Public License Do đó
mà bất cứ ai cũng có thể tải và xem mã nguồn của Linux
Một cách chính xác, thuật ngữ "Linux" được sử dụng để chỉ Nhân Linux, nhưng tên này được sử dụng một cách rộng rãi để miêu tả tổng thể một hệ điều hành giống Unix (còn được biết đến dưới tên GNU/Linux) được tạo ra bởi việc đóng gói nhân Linux cùng với các thư viện và công cụGNU, cũng như là các bản phân phối Linux Thực tế thì đó là tập hợp một số lượng lớn các phần mềm như máy chủ web, các ngôn ngữ lập trình, các hệ quản trị cơ sở dữ liệu, các môi trường làm việc desktop như GNOME và KDE, và các ứng dụng thích hợp cho công việc văn phòng như OpenOfficehay LibreOffice
Khởi đầu, Linux được phát triển cho dòng vi xử lý 386, hiện tại hệ điều hành này hỗ trợ một số lượng lớn các kiến trúc vi xử lý, và được sử dụng trong nhiều ứng dụng khác nhau
từ máy tính cá nhân cho tới các siêu máy tính và các thiết bị nhúng như là các máy điện thoại di động
Ban đầu, Linux được phát triển và sử dụng bởi những người say mê Tuy nhiên, hiện nay Linux đã có được sự hỗ trợ bởi các công ty lớn nhưIBM và Hewlett-Packard, đồng thời
nó cũng bắt kịp được các phiên bản Unix độc quyền và thậm chí là một thách thức đối với sự thống trị của Microsoft Windows trong một số lĩnh vực Sở dĩ Linux đạt được những thành công một cách nhanh chóng là nhờ vào các đặc tính nổi bật so với các hệ thống khác: chi phí phần cứng thấp, tốc độ cao (khi so sánh với các phiên bản Unix độc quyền) và khả năng bảo mật tốt, độ tin cậy cao (khi so sánh với Windows) cũng như là
Trang 13các đặc điểm về giá thành rẻ, không bị phụ thuộc vào nhà cung cấp Một đặc tính nổi trội của nó là được phát triển bởi một mô hình phát triển phần mềm nguồn mở hiệu quả Tuy nhiên, hiện tại số lượng phần cứng được hỗ trợ bởi Linux vẫn còn rất khiêm tốn so với Windows vì các trình điều khiển thiết bị tương thích với Windows nhiều hơn là
Linux Nhưng trong tương lai số lượng phần cứng được hỗ trợ cho Linux sẽ tăng lên
Cơ bản của HĐH có các topic:
- Scheduler và các cơ chế scheduling (dựa trên hệ số ưu tiên của process-priority)
- Virtual Memory+Paging (Bộ nhớ ảo và cơ chế paging)
- Filesystem (Standard I/O)
- Driver (Kernel space/User space)
- Interprocess communication mechanism (các cơ chế giao tiếp giữa các process)
- Interupt (interrupt từ Hardware và interrupt từ software)
b) Điểm mạnh
Trong chúng ta sẽ có rất nhiều người hỏi: "Thế Linux có gì hay ???"
Linux, ngay từ ngày đầu, được tạo ra với 1 suy nghĩ về sự kết hợp cùng Internet Vì thế Linux đã đi trước trong việc tạo ra 1 hệ thống : đa người dùng ( multi-user ), đa nhiệm ( multi-tasking ), hỗ trợ nhiều CPU cùng 1 lúc, đã và đang đóng góp cho những hệ thống trọng điểm của Internet ngày nay
Linux là 1 HĐH mạng theo đúng nghĩa của nó, các dịch vụ telnet, ssh, web, ftp,
firewall được phát triển từ bản Linux đầu tiên Cluster - cách ghép nhiều máy tính yếu thành 1 máy tính mạnh hơn đã có mặt từ nhiều năm trước Remote Control đã đi trước windows một bước dài ( dịch vụ này mới có mặt trong Windows XP) Có thể nói Linux sinh ra cho Network - Networking OS
Trong quá trình phát triển, Linux đã dần dần rủ bỏ lớp áo cứng ngắt khô khan khó sử dụng và tiến gần lại với người dùng gia đình bằng GUI ( Graphic User Interface - Giao diện đồ hoạ người sử dụng ) , quá trình install được đơn giản hoá và tạo những bước dễ dàng hơn X-window cùng các Môi Trường Đồ Hoạ ( Desktop-Enviroment ) nổi tiếng như KDE, GNOME đã giúp cho người sử dụng không còn phải khó khăn với các dòng lệnh khô khan
Về phương diện sử dụng, Linux ngày nay đã rất dễ hơn thời sơ khai Các Distributions đang đưa Linux vào với mọi người, nhưng phần cho người sử dụng Advance vẫn được giữ nguyên, bạn có thể Config Linux bằng GUI của các Desktop Enviroment cũng như có thể dùng Shell command line Linux rất uyển chuyển tùy theo người sử dụng
Linux là 1 HĐH bền vững ( Stable ), mức bền vững của Linux được chứng tỏ qua các hệ thống máy chủ chạy Linux và được mở 24/7 ( 24 giờ - 7 ngày ) ( só sánh với Windows
XP, được coi là hệ thống Windows bền vững nhất, bạn cũng phải Restart sau 2-3 tuần 1 lần ) Mức bền vững của Linux cũng được chứng tỏ qua cách quản lý thiết bị, 1 chương
Trang 14trình bị Crash trong Linux không thể kéo toàn bộ hệ thống crash theo, bạn chỉ cần tắt chương trình đó và khởi động lại nó ( đối với windows, 1 chương trình crash dễ dàng kéo theo toàn bộ hệ thống windows gục ngã )
Linux không yêu cầu 1 cấu hình máy tính cực mạnh để chạy, Linux có thể chạy được trên các CPU từ 100 MHz trở đi cũng như khoảng 300 MB ổ cứng Hệ thống tưởng như "đồ bỏ" này vẫn có thể giúp bạn tìm hiểu Linux cũng như làm thành 1 gateway hay proxy, webserver, fileserver,
Hơn hết, Linux được tao ra dưới GPL, nghĩa là Linux hoàn toàn free ( miễn phí ) Free theo 2 nghĩa: "free-beer" ( bia miễn phí ) và "freedom" ( tự do ) Free-beer: Trong thực tế, free-beer không có nghĩa là hoàn toàn free, bạn sẽ được free beer nhưng bù lại sẽ phải trả
1 cái gì đó Linux cũng thế, thực tế bạn sẽ phải tốn tiền internet để download Linux, hay phải mua CD để chứa Linux, hay phải mua từ các cửa hàng bán đĩa CD ( tất nhiên chỉ với giá của đĩa trắng + giá tiền cồng )
Freedom: đúng, khi có Linux trong tay, bạn có thể tự do mở mã nguồn của Linux, khoả sát từng dòng lệnh của Linux để học tập, cũng như bạn có quyền tự do sửa đổi Kernel hay nguồn của các phần mềm GPL để phù hợp với ý thích của bạn Tất nhiên
sẽ có 1 số qui định nhỏ, nhưng các quy định này không nằm ngoài mục đích giúp cho tên tuổi người viết đầu tiên không bị nhầm lẫn thôi Cuối cùng giá của Linux là $ 0.00 Bạn có thể copy 1 bộ Linux và gửi cho bạn mình mà không sợ bị FBI ( Female Body Inspector ) đến rờ gáy vì CopyRight, Linux chính là FBI ( For a Better Internet )
Mã nguồn mở: có thể tìm hiểu tất cả các thành phần tạo nên hệ điều hành, từ nhân hệ điều hành đến các tầng trên => giúp cho người học và làm việc với Linux nâng cao kiến thức về hệ thống rất nhiều Ví dụ như ở trường các bạn đều có học Kiến trúc máy tính, hệ điều hành, vi xử lý với rất nhiều khái niệm khác nhau thì khi làm việc và làm quen với mã của Linux các bạn sẽ hiểu rõ hơn rất nhiều
Free: các bạn có thể sử dụng để làm thương mại mà không phải lo gì, trong khi các hệ điều hành khác phải mất phí, ví như uC/OS-ii cũng được dùng rất nhiều, dùng để nghiên cứu thì thoải mái nhưng muốn làm ra sản phẩm thì phải mua bản quyền
Tính đa nền: học Linux giúp bạn có thể làm việc trên mọi nền tảng, Desktop, Mobile, các thiết bị dân dụng, công nghiệp
Cộng đồng phát triển rộng: có nhiều người cùng học tất nhiên chúng ta sẽ dễ hỏi và dễ trao đổi hơn rất nhiều
Tính phổ biến: Linux được phát triển dựa trên thiết kế của Unix nên khi đã làm Linux mình nghĩ bạn sẽ dễ dàng làm quen với một số hệ điều hành khác, ngay cả hệ điều hành trên máy Mac mình cũng sử dụng các lệnh gần giống hệt như Linux, cách tổ chức hệ thống cũng giống
c) Điểm yếu
Trang 15Đúng, chúng ta thích thế mạnh của Linux nhưng cũng không phải bỏ qua điểm yếu chết người của Linux
Tuy các Distribution đã có bước tiến dài trong việc đưa Linux xuống cho người sử dụng bình thường ( Home-User ) nhưng Linux dường như vẫn có khoảng cách xa lạ, không thân thiện như windows
Vì Linux miễn phí nên những nhà sản xuất phần cứng đôi lúc muốn giữ bí mật về phần cứng của mình, vì thế những thông tin cần thiết để viết chương trình điểu khiển thiết bị phần cứng không được thông báo Điều này dẫn tới Linux không thể hỗ trợ nhiều phần cứng như Windows Việc kiểm tra HCL ( Hardware Compatibility List - Danh sách Phần cứng tương thích ) là cực kì cần thiết trước khi cài đặt 1 hệ thống Linux, bạn có thể
có một thiết bị không hoạt động nếu bạn không chắc chắn vấn đề này ( Tới thời điểm này: hầu hết các phần cứng thiết bị PC thông thường đã được Linux hỗ trợ )
Vấn đề tiếp theo đó là Game, các game lớn hiện nay tuy đã phát triển phiên bản cho Linux, nhưng cũng chỉ dừng lại ở mức độ của Quack III Arena, The Sim, bạn vẫn sẽ phải sử dụng windows nếu bạn là Gamer
2 Linux Kernel
a) Kiến trúc nhân
Nhân là 1 phần mềm đảm trách chức vụ liên lạc giữa các chương trình ứng dụng máy tính và phần cứng Cung cấp các chứng năng như: quản lý file, quản lý bộ nhớ ảo, các thiết bị nhập xuất nhưng ổ cứng, màn hình, bàn phím, Nhưng Nhân Linux chưa phải
là 1 HĐH, vì thế nên Nhân Linux cần phải liên kết với những chương trình ứng dụng được viết bởi tổ chức GNU tạo lên 1 HĐH hoàn chỉnh: HĐH Linux Đây cũng là lý do tại sao chúng ta thấy GNU/Linux khi được nhắc đến Linux
Trang 16Tiếp theo, 1 công ty hay 1 tổ chức đứng ra đóng gói các sản phẩm này ( Nhân và Chương trình ứng dụng ) sau đó sửa chữa một số cấu hình để mang đặc trưng của công ty/ tổ chức mình và làm thêm phần cài đặt ( Installation Process ) cho bộ Linux đó,
chúng ta có : Distribution Các Distribution khác nhau ở số lượng và loại Software được đóng gói cũng như quá trình cài đặt, và các phiên bản của Nhân 1 số Distribution lớn hiện nay của Linux là : Debian, Redhat, Mandrake, SlackWare, Suse,
Khái niệm kernel ở đây nói đến những phần mềm, ứng dụng ở mức thấp (low-level)
trong hệ thống, có khả năng thay đổi linh hoạt để phù hợp với phần cứng Chúng tương tác với tất cả ứng dụng và hoạt động trong chế độ user mode, cho phép các quá trình khác – hay còn gọi là server, nhận thông tin từ các thành phần khác qua inter-process communication (IPC)
Về bản chất, có nhiều cách để xây dựng cấu trúc và biên dịch 1 bộ kernel nhất định từ đầu Nhìn chung, với hầu hết các kernel hiện nay, chúng ta có thể chia ra làm 3
loại: monolithic, microkernel, và hybrid Linux sử dụng kernel monolithic trong khi OS
X (XNU) và Windows 7 sử dụng kernel hybrid
Linux kernel cung cấp một giao diện giữa các ứng dụng người dùng, hệ thống phần cứng và tài nguyên Một vài chức năng của Linux là:
Quản lý bộ nhớ
Quản lý hệ thống file
Xử lý các lỗi và ngắt
Thực hiện các dịch vụ I/O
Cấp phát tài nguyên hệ thống cho các người dùng
Phiên bản 3.7 là nhân Linux mới nhất hiện nay
Trang 17Microkernel:
Microkernel có đầy đủ các tính năng cần thiết để quản lý bộ vi xử lý, bộ nhớ và IPC
Có rất nhiều thứ khác trong máy tính có thể được nhìn thấy, tiếp xúc và quản lý trong chế
độ người dùng Microkernel có tính linh hoạt khá cao, vì vậy bạn không phải lo lắng khi thay đổi 1 thiết bị nào đó, ví dụ như card màn hình, ổ cứng lưu trữ hoặc thậm chí là cả
hệ điều hành Microkernel với những thông số liên quan footprint rất nhỏ, tương tự với
bộ nhớ và dung lượng lưu trữ, chúng còn có tính bảo mật khá cao vì chỉ định rõ ràng những tiến trình nào hoạt động trong chế độ user mode, mà không được cấp quyền như trong chế độ giám sát - supervisor mode
Phần cứng đôi khi “khó hiểu” hơn thông qua hệ thống driver
Phần cứng hoạt động dưới mức hiệu suất thông thường vì các trình điều khiển ở trong chế độ user mode
Các tiến trình phải chờ đợi để được nhận thông tin
Các tiến trình không thể truy cập tới những ứng dụng khác mà không phải chờ đợi Monolithic Kernel:
Với Monolithic thì khác, chúng có chức năng bao quát rộng hơn so với microkernel, không chỉ tham gia quản lý bộ vi xử lý, bộ nhớ, IRC, chúng còn can thiệp vào trình điều khiển driver, tính năng điều phối file hệ thống, các giao tiếp qua lại giữa server
Monolithic tốt hơn khi truy cập tới phần cứng và đa tác vụ, bởi vì nếu 1 chương trình muốn thu thập thông tin từ bộ nhớ và các tiến trình khác, chúng cần có quyền truy cập trực tiếp và không phải chờ đợi các tác vụ khác kết thúc Nhưng đồng thời, chúng cũng là nguyên nhân gây ra sự bất ổn vì nhiều chương trình chạy trong chế độ supervisor mode hơn, chỉ cần 1 sự cố nhỏ cũng khiến cho cả hệ thống mất ổn định
Ưu điểm:
Truy cập trực tiếp đến các phần cứng
Dễ dàng xử lý các tín hiệu và liên lạc giữa nhiều thành phần với nhau
Nếu được hỗ trợ đầy đủ, hệ thống phần cứng sẽ không cần cài đặt thêm driver cũng như phần mềm khác
Trang 18 Quá trình xử lý và tương tác nhanh hơn vì không cần phải chờ đợi
Nhược điểm:
Tiêu tốn nhiều footprint cài đặt và lưu trữ
Tính bảo mật kém hơn vì tất cả đều hoạt động trong chế độ giám sát - supervisor mode
Hybrid Kernel:
Khác với 2 loại kernel trên, Hybrid có khả năng chọn lựa và quyết định những ứng dụng nào được phép chạy trong chế độ user hoặc supervisor Thông thường, những thứ như driver và file hệ thống I/O sẽ hoạt động trong chế độ user mode trong khi IPC và các gói tín hiệu từ server được giữ lại trong chế độ supervisor Tính năng này thực sự rất có ích vì chúng đảm bảo tính hiệu quả của hệ thống, phân phối và điều chỉnh công việc phù hợp, dễ quản lý
Ưu điểm:
Các nhà phát triển có thể chọn và phân loại những ứng dụng nào sẽ chạy trong chế
độ thích hợp
Sử dụng ít footprint hơn so với monolithic kernel
Có tính linh hoạt và cơ động cao nhất
Nhược điểm:
Có thể bị bỏ lại trong quá trình gây treo hệ thống tương tự như với microkernel
Các trình điều khiển thiết bị phải được quản lý bởi người dùng
Kernel Linux là phần mềm cơ bản nhất của hệ thống Linux Nó quản lý các phần cứng trống trong hệ thống
Kernel Linux xử lý hệ thống cho các chương trình và truy cập gián tiếp vào các thiết
bị phần cứng Đặc biệt, Kernel Linux có thể truy cập vào tài nguyên hệ thống mà không cần giao tiếp trực tiếp với phần cứng
Cấu hình Kernel cho phép loại bỏ những hỗ trợ không cần thiết, và ngược lại, nó có thể hỗ trợ thêm một thiết bị ngoại vi đặc biệt
Trong lĩnh vực hệ thống nhúng, Linux kernel 2.6 đã giúp Linux trở thành đối thủ cạnh tranh lớn cho nhà cung cấp RTOS như VxWorks và WinCE
Linux kernel 2.6 nhiều tính năng mới cải tiến giúp hệ điều hành tốt hơn như:
Trang 19 Tăng cường hiệu quả thời gian thực Nó có thể đáp ứng được các nhu cầu nghiêm ngặt về thời gian Ví dụ: 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
Porting dễ dàng hơn
Hỗ trợ cho các mô hình bộ nhớ lớn, hỗ trợ cho vi điều khiển
Cải tiến hệ thống lịch trình I/O
Hỗ trợ các phần cứng mới
Tạo kiến trúc phụ Nó thây đổi cấu trúc đã có thành một cấu trúc riêng
Ngoài ra, Linux kernel 2.6 hỗ trợ một số vi điều khiển không có đơn vị quản lý bộ nhớ,
hỗ trợ các bộ vi xử lý m68k Motorola, Dragonball, ColdFire, Hitachi…
Trang 20Tại sao Nhân Linux viết bằng C mà không phải là C++?
Những lý do nào về nhân Linux (nói chung cả Unix, bao gồm Solaris) được viết bằng
C mà không phải là C++ Trong khi C++ là một ngôn ngữ tốt hơn C về các khái niệm hướng đối tượng Tại sao kernel hay hầu hết các hệ thống CSDL phổ biến được viết bằng ngôn ngữ C thay vì bằng C++
Linus đã bắt đầu với với chiếc máy 386, hệ điều hành Minix, và trình biên dịch gcc
C được dùng để thay thế Assembly bởi nhiều lý do như khả năng bảo trì mã, khả năng đọc, tính hiệu quả…
Cách đây nhiều năm, những nhà phát triển kernel đã cố gắng dùng g++ để biên dịch nhân Linux và thấy rằng kernel chạy chậm hơn so với khi được biên dịch bằng gcc (nhiều người đã nghĩ rằng tốc độ sẽ là như nhau); và rồi họ chẳng muốn thực hiện điều này một lần nào nữa
Về bối cảnh lịch sử, Thompson và Ritchie đã phát triển UNIX bằng cách sử dụng một số khái niệm từ Multics và CTSS ( http://www.multicians.org/unix.html ) Bao gồm việc thực hiện hầu hết các hoạt động bằng một ngôn ngữ bậc cao hơn (Unix – C, Multics – PL/I), đặt tên các command thông thường, v.v Bạn hãy tham khảo:
http://cm.bell-labs.com/cm/cs/who/dmr/hist.html
Trang 21Trong đó mô tả sự phát triển sớm của UNIX bao gồm việc chuyển đổi từ Assembly trên PDP-7 thành C trên PDP-11 (gần cuối trang)
Xây dựng từ những cơ sở đó, UNIX từ AT&T đã mở rộng việc phân phối và được tiến hành bởi hàng ngàn người là một hệ điều hành dựa trên C Trong những năm 1970 và
1980, một sự thay thế cho việc phân phối của AT&T đã được phát triển tại UC Berkeley Xem:
http://en.wikipedia.org/wiki/Berkeley_Software_Distribution
Cho một lời giải thích ngắn liên quan tới sự phát triển của BSD Các phiên bản cuối cùng của BSD đã không sử dụng bất kỳ cơ sở mã nguồn nào của AT&T, ngoại trừ việc thực hiện chúng bằng C Cuối bài viết là danh sách một vài hậu duệ của BSD bao gồm cả SunOS (hiện nay là Solaris)
Điều đó không phải để nói rằng ứng dụng được thực hiện tốt hơn bằng ngôn ngữ hướng đối tượng như là C++ Nhưng có một số giao diện người dùng đồ họa (GUI) chẳng hạn như KDE thì được viết bằng C++ Tuy nhiên, có những ứng dụng thì phù hợp hơn với ngôn ngữ hướng thủ tục, về điểm này thì hệ điều hành cũng nằm trong loại đó
b) Đặc điểm chính của nhân Linux
Điểm mạnh chính
• Di động và hỗ trợ phần cứng.Chạy trên hầu hết tất cả kiến trúc
• Khả năng mở rộng,có khả năng chạy trên các thiết bị nhỏ cũng như các siêu máy
• Hệ modul,có thể bao gồm những gì hệ thống cần ngay cả thời gian thực thi
• Chương trình đơn giản,bạn có thể học hỏi ngay từ mã hiện tại.Cũng có rất nhiều tài nguyên trên mạng rất hữu ích cho các bạn
Lời gọi hệ thống (System Calls)
• Giao diện chính giữa hạt nhân và không gian người dùng được thiết lập các hệ thống cuộc gọi
• Giao diện hệ thống cuộc gọi được bao bọc bởi thư viện C và ứng dụng không gian người dùng không bao giờ thực hiện được cuộc gọi hệ thống trực tiếp
• Có khoảng 300 hệ thống các cuộc gọi cung cấp dịch vụ hạt nhân chính
Trang 22o Tập tin và thiết bị hoạt động, hoạt động kết nối mạng,giao tiếp giữa các quá trình, tiến trình quản lý, bản đồ bộ nhớ
o Hệ thống này khá ổn định theo thời gian:các hệ thống cuộc gọi mới chỉ được thêm vào bởi người phát triển hệ thống
Kích thước nhân Linux
• Tại sao kích thước lớn như vậy?
Bởi vì chúng bao gồm 1000 điều khiển thiết bị,nhiều giao thức kết nối mạng,hỗ trợ
nhiều kiến trúc
• Lõi của Linux là khá nhỏ
c) File System
Trong hệ điều hành Linux, những tập tin mà người sử dụng nhìn thấy được đều theo
cấu trúc cây thư mục, vớiroot nằm ở trên cùng Từ điểm này các thư mục và tập tin mới
Trang 23mọc nhánh ra lan dần xuống phía dưới Thư mục cao nhất, được ký hiệu bằng vạch /,
được gọi là root directory (thư mục gốc)
Với người sử dụng bình thường thì cây thư mục này là một dải những tập tin và thư mục nối liền nhau Trên thực tế, nhiều thư mục trong cây thư mục này nằm ở nhiều vị trí
vật lý khác nhau, trên các partition khác nhau, và thậm chí trên các ổ đĩa khác nhau Khi một trong các partition ấy được kết nối với cấu trúc cây tại một thư mục gọi là mount point (điểm kết nối, điểm lắp ráp), thì mount point này và tất cả các thư mục cấp dưới
được gọi là file system
Hệ điều hành Linux hình thành từ nhiều thư mục và tập tin khác nhau Các thư mục
có thể lập thành nhiều file system khác nhau, tùy vào cách cài đặt bạn đã chọn Nhìn chung, đa phần hệ điều hành nằm ở hai file system: root file system (file system gốc) được ký hiệu là /, và một file system khác được kết nối theo /usr (đọc là user)
Khi dùng lệnh cd / để chuyển về thư mục gốc và gọi hiển thị danh sách thư mục, bạn
sẽ thấy nhiều thư muc Những thư mục này tạo thành nội dung của root file system, đồng thời cung cấp mount point cho các file system khác
Thư mục /bin chứa các chương trình thi hành được, còn gọi là các binaries (nhị phân)
Chúng là chương trình hệ thống chủ yếu Nhiều lệnh của Linux, chẳng hạn như ls, là các chương trình nằm tại các thư mục ấy
Thư mục /sbin chứa các file nhị phân hệ thống Hầu hết các tập tin ở đây dùng để quản trị hệ thống (superuser-bin)
Thư mục /etc rất quan trọng vì chứa nhiều file cấu hình Linux Chúng giúp cho hệ thống máy bạn có "cá tính" File mật khẩu passwdnằm ở thư mục này, cũng như fstab ,
danh sách các file system cần nạp vào khi khởi động máy Ngoài ra thư mục còn chứa các script khởi động cho Linux, danh sách các host kèm địa chỉ IP, cùng với nhiều thông tin cấu hình khác
Các thư viện dùng chung được chứa trong thư mục /lib Khi dùng chung thư viện,
nhiều chương trình sẽ sử dụng lại cùng loại mã, hơn nữa khi được chứa cùng chỗ, thư viện sẽ giúp giảm thiểu kích cỡ chương trình ở khía cạnh thời gian chạy
Thư mục /dev chứa các file đặc biệt gọi là device files (file thiết bị, được hệ thống sử dụng để chạy các phần cứng Ví dụ file/dev/mouse sẽ đọc thông tin từ chuột Khi tổ chức
sử dụng phần cứng theo cách này, Linux làm cho việc tương tác với phần cứng trông giống như một phần mềm Điều này có nghĩa là trong nhiều trường hợp, bạn có thể dùng
cú pháp như khi dùng với directory của mình trên đĩa mềm, ta có thể dùng lệnh: tar -cdf /dev/fd0 tackett /dev/fd0 chỉ cho lệnh tar biết phải dùng đĩa mềm Nhiều thiết bị trong thư mục /dev được tập hợp thành nhóm logical
Bảng 1.1: Các thiết bị thường dùng chứa trong thư mục /dev
File thiết bị Description /dev/console Bàn giao tiếp hệ thống, là màn hình nối kết vật lý
với hệ thống /dev/hd*
Giao diện driver cho các ổ cứng IDE Thiết bị /dev/hda1 chỉ partition đầu tiên trên ổ cứng had
Thiết bị /dev/had chỉ toàn bộ ổ cứng hda
Trang 24/dev/sd*
Giao diện driver cho các ổ đĩa SCSI Những ổ đĩa
và partition này có cùng quy ước với thiết bị IDE /dev/hd*
/dev/fd* Driver thiết bị hỗ trợ đĩa mềm Ổ đĩa mềm đầu
tiên là /dev/fd0, ổ thứ hai là /dev/fd1
/dev/st* Driver thiết bị cho ổ cứng băng từ SCSI
/dev/tty*
Driver cung cấp nhiều loại thiết bị giao tiếp khác nhau cho user nhập liệu Sở dĩ viết tắt là tty bởi vì trước kia các terminal dạng teletype đều móc nối với hệ điều hành UNIX Với Linux, những tập tin này hỗ trợ các thiết bị giao tiếp ảo, mà bạn có thể truy cập bằng cách bấm từ cho đến Thiết bị giao tiếp ảo cho phép nhiều user đăng nhập cùng lúc
/dev/pty*
Driver hỗ trợ terminal giả, dùng cho việc đăng nhập từ xa, chẳng hạn như những phiên đăng nhập qua Telnet
/dev/ttyS*
Các cổng giao diện nối tiếp trên máy bạn File /dev/ttyS0 tương ứng COM1 của MS-DOS Nếu bạn sử dụng chuột nối tiếp, thì file /dev/mouse là một liên kết tượng trưng, nối với thiết bị ttyS tương ứng (Chuột nối kết với thiết bị này.) /dev/cua* Các thiết bị đặc biệt gọi ra ngoài dùng với modem
/dev/null
Một thiết bị rất đặc biệt, chủ yếu là một lỗ đen
Tất cả các dữ liệu ghi vào /dev/null xem như bị mất vĩnh viễn Việc này hữu ích khi bạn muốn chạy một câu lệnh và thủ tiêu stdout hoặc stderr
Và nếu /dev/null dùng làm file nhập, bạn sẽ tạo ra một file có độ dài zero
Thư mục /proc là một file system ảo, dùng để đọc thông tin từ bộ nhớ
Thư mục /tmp chứa các file tạm mà chương trình tạo ra trong khi chạy Nếu bạn biết
hệ thống máy mình có chương trình tạo ra nhiều file tạm với kích cỡ lớn, bạn nên tạo thư
mục /tmp thành một file system riêng thay vì đặt nó vào file system gốc như là một thư
mục bình thường Bởi vì với đà chất chứa các file tạm ngày càng nhiều, file system gốc
sẽ nhanh chóng bị đầy
Thư mục /home là thư mục cơ sở của các home directory cho các user Quản trị viên thường đặt /home thành file system riêng rẽ nhằm tạo nhiều khoảng trống cho user sử
dụng Ngoài ra nếu hệ thống máy bạn có nhiều user, bạn nên chia thư mục /home thành
nhiều file system khác nhau Ví dụ bạn có thể tạo ra /home/vnexperts cho các thành viên
Trang 25của nhóm điều hành của công ty và/home/admin cho quản trị viên Mỗi thư mục như thế
sẽ là một file system riêng, bên dưới có home directory riêng cho các user tương ứng
Thư mục /var lưu các file có thể thay đổi kích thước theo thời gian Nhiều file đăng nhập hệ thống (system log file) thường nằm trong thư mục này Thư mục /var/spool cùng
với các thư mục con dùng để chứa dữ liệu như tin tức hoặc thư tín mới nhận được, hoặc giả đang chờ gửi đi nơi khác
Thư mục /usr và các thư mục con rất quan trọng cho hệ thống Linux, bởi vì chứa đựng nhiều thư mục trong đó có những chương trình cần thiết nhất cho hệ thống Những
thư mục cấp dưới của /usr chứa các gói phần mềm lớn mà bạn đã cài đặt Bảng 1.2 giới thiệu một số thư mục cấp dưới của /usr Ở hầu hết mọi trường hợp thư mục /usr được
thiết lập như là một file system riêng rẽ
Bảng 1.2 Các thư mục thứ cấp quan trọng trong file system /usr
Thư mục thứ
/usr/bin Lưu nhiều file thi hành của hệ thống
/usr/etc Lưu nhiều file cấu hình hệ thống
include Lưu các file kèm theo bộ biên dịch C
/usr/g++-/usr/lib Chứa các thư viện để chương trình sử dụng
trong khi kết nối /usr/share/man
Chứa các trang thủ công cho chương trình
Bên dưới /usr/share/man là nhiều thư mục tương ứng với các đoạn trong trang man
/dev/pty*
Driver hỗ trợ terminal giả, dùng cho việc đăng nhập từ xa, chẳng hạn như những phiên đăng nhập qua Telnet
/usr/src
Chứa các thư mục mã nguồn của nhiều chương trình trên hệ thống Nếu nhận được gói phần mềm chờ cài đặt, bạn nên lưu vào /usr/src/tên-gói trước khi cài đặt
/usr/local Dành riêng cho việc thiết kế hoặc tùy chỉnh
các ứng dụng cho phù hợp với hệ thống máy
Trang 26bạn Nhìn chung, hầu hết phần mềm dùng tại chỗ được lưu trong các thư mục cấp dưới của thư mục này
d) Device Drivers
Device driver là phần mềm giao tiếp giữa phần cứng và kernel của Embedded Linux Linux device driver có thể được tích hợp vào trong kernel theo 2 phương pháp: biên dịch trực tiếp vào kernel hoặc biên dịch thành một định dạng đối tượng (object format có tập tin là device_driver.o) để kernel có thể tải lên khi có nhu cầu (sử dụng lệnh install module
“insmod device_driver.o”) Để biên dịch các tập tin của device driver cần phải xây dựng một Makefile Kết quả thu được sẽ là tập tin có phần mở rộng *.o
e) Cấu hình kernel
Cấu hình hạt nhân và xây dựng hệ thống dựa trên multiple Makeles:
Nó chỉ tương tác với Makefile chính, nó có ở thư mục đầu của cây nguồn hạt nhân
Sự tương tác diễn ra:
- Sử dụng công cụ make, cái mà phân tích cú pháp của Makefile
- Thông qua nhưng mục tiêu khác nhau, định nghĩa hành động nên làm (cấu hình, biên dịch, cài đặt, … ) Chạy make help để thấy tất cả các mục tiêu có sẵn
Hạt nhân bao gồm hàng ngàn driver thiết bị, driver file hệ thống, giao thức mạng, và những mục cấu hình khác Hàng ngàn tùy chọn có sẵn, cái được sử dụng để biên dịch một phần code nguồn hạt nhân Cấu hình hạt nhân là xử lý định nghĩa thiết đặt tùy chọn cái
mà bạn muốn hạt nhân được biên dịch Thiết đặt tùy chọn phụ thuộc vào:
- Phần cứng của bạn
- Những khả năng mà bạn muốn đưa vào hạt nhân của mình
Cấu hình được lưu trữ trong file config tại gốc của nguồn hạt nhân
- file text đơn giản, kiểu key=value
Khi những tùy chọn có những phụ thuộc, đừng bao giờ chỉnh sử bằng tay, hãy thông qua giao diện đồ họa hay văn bản
- make xconfig, make gconfig (đồ họa)
Trang 27- make menuconfig, make nconfig (text)
- Bạn có thể chuyển đổi từ cái này đến một cái khác, tất cả chúng sẽ được nạp hay lưu trong cùng file config, và biểu diễn cùng một thiết đặt tùy chọn
Để chỉnh sửa một hạt nhân trong một phân bố GNU/Linux: file cấu hình thì luôn được nằm trong /boot/, cùng với file ảnh của hạt nhân: /boot/config-3.2.0-31-generic Ảnh của hạt nhân là một file đơn, kết quả của việc liên kết tất cả các file đối tượng cái mà tương ứng với những tính năng được bật trong file cấu hình
- đó là những file được nạp vào bộ nhớ bởi bootloader
- tất cả bao gồm những tính năng có sẵn ngay khi hạt nhân bắt đầu, tại thời điểm không có file hệ thống tồn tại
Một vài tính năng có thể được biên dịch như là những mô-đun đó là những plugins(
bổ sung) mà có thể được nạp vào/ gỡ bỏ để thêm hay bỏ các tính năng của hạt nhân Mỗi mô-đun được lưu trữ trong một file riêng biệt trong file hệ thống và vì thế truy cập và file hệ thống là bắt buộc để sử dụng những mô-đun này Điều này thì không thể trong thủ tục khởi động của hạt nhân bởi vì không có hệ thống file nào có sẵn Có những loại tùy chọn khác nhau những tùy chọn bool (true, false), tristate (true, module, fasle) Tùy chọn int, để chỉ rõ giá trị integer Tùy chọn string để chỉ rõ giá trị string
Có những phụ thuộc giữa những tùy chọn trong hạt nhân Ví dụ, bật một driver mạng yêu cầu ngăn xếp mạng được kích hoạt 2 loại phụ thuộc:
- Depends on – trong trường hợp này, tùy chọn A cái mà phụ thuộc vào tùy chọn B thì không hiển thị đến khi tùy chọn B được kích hoạt
- Select – tùy chọn A phụ thuộc vào B, khi A kích hoạt thì B được kích hoạt một cách tự động
Make xconfig cho phép thấy tất cả các tùy chọn, thậm chí những cái không được chọn bởi vì những phụ thuộc bị nhỡ Trong trường hợp này, chúng được hiển thị mà xám make xconfig:
- giao diện đồ họa thông thường nhất để cấu hình hạt nhân
- chắc chắn rằng bạn đã đọc
• help -> introduction: useful options!
Trang 28- File browser: dễ dàng để nạp file cấu hình
- Giao diện tìm kiếm để tìm những thông số
- yêu cầu gói Debian / Ubuntu: libqt4-dev g++ (libqt3-mt-dev cho những hạt nhân phát hành cũ hơn)
Tìm kiếm từ khóa trong tên của các thông số Cho phép chọn hay không chọn những thông số được tìm thấy
Trang 29Những tùy chọn này được nhóm lại theo phần và được bắt đầu với CONFIG_
Make gconfig
GTK dựa trên giao diện cấu hình đồ họa
Chức năng tương tự trong xconfig
Chỉ thiếu chức năng tìm kiếm
Yêu cầu gói Debian: libglade2-dev
Trang 30- mới hơn, giống giao diện văn bản
- thân thiện người dùng hơn (ví dụ:
dễ dàng truy cập thông tin giúp
đỡ
- yêu cầu gói
Debian:libncurses-dev
Make oldconfig
- cần thiết rất thường xuyên
- có ích để nâng cấp file config từ
một bản hạt nhân cũ
- Những vấn đề cảnh báo cho các thông số cấu hình mà không tồn tại nữa trong hạt nhân mới
- yêu cầu giá trị cho thông số mới
Nếu bạn chỉnh sửa file config bằng tay, khuyến khích chạy make oldconfig sau đó Make allnoconfig
- chỉ cài đặt những thiết lập khuyến khích đến y
- đặt tất cả những thiết lập khác đến n
- rất có lợi trong hệ thống nhúng để chọn những yêu cầu tối thiểu thiết lập những chức năng và drivers
Trang 31- nhiều sự tiện lợi hơn bỏ hàng trăm tính năng từng cái 1
- tất cả những giao diện cấu hình của hạt nhân (xconfig, menuconfig, allnoconfig
….) giữ những cái đó trong config.old sao lưu
Thiết lập những tùy chọn cấu hình là kiến trúc phụ thuộc
- một vài tùy chọn cấu hình là kiến trúc rất đặt biệt
- hầu hết tùy chọn cấu hình (global kernel options, network subsystem, filesystems, most of the device drivers) thì hiện ra trong tất cả các kiến trúc
Bằng cách mặc định hệ thống hạt nhân xây dựng giả định rằng hạt nhân đang được xây dựng cho kiến trúc máy chủ
Kiến trúc không được định nghĩa bên trong cấu hình mà tại một cấp cao hơn
Chúng ta sẽ được thấy sau đây cách đè những hành vi này, để cho phép cấu hình của hạt nhân cho một kiến trúc khác
Hỗ trợ mô-đun có thể nạp
- cho phép kích hoạt hoặc vô hiệu hóa một cách hoàn toàn hỗ trợ mô-đun Nếu hệ thống của bạn không cần những mô-đun hạt nhân, tốt nhất vô hiệu hóa nó vì nó tiết kiệm khoảng không gian và bộ nhớ đáng kể
- nếu CONFIG_EXPERT được kích hoạt The block layer có thể hoàn toàn được gỡ
bỏ Những hệ thống nhúng chỉ sử dụng lưu trữ flash , nó có thể được vô hiệu hóa the block layer một cách an toàn
Loại vi xử lý và tính năng (x86) hay loại hệ thống (ARM) hay sự lựa chọn CPU (MIPS)
- cho phép vi xử lý hoặc máy cho hạt nhân phải được biên dịch
- Trên x86, liên quan sự tối ưu hóa, trên những kiến trúc khác rất quan trong , vì không phù hợp
Trang 32Tính năng của hạt nhân:
- Tickless system(hệ thống không đánh dấu), cái mà cho phép vô hiệu hóa đánh dấu thời gian thường xuyên và sử dụng những đánh dấu theo yêu cầu thay vào đó Cải thiện việc tiết kiệm năng lượng
- sự hỗ trợ định thời phận giải cao Theo mặc định, độ phân giải của bộ định thời là
độ phân giải đánh dấu Với những bộ định thời độ phân giải cao, độ phân giải thì chính xác như phần cứng đưa ra
- Quản lý năng lượng
- tùy chọn quản lý năng lượng cần cho tất cả những quản lý năng lượng liên quan đến những tính năng
• Other protocols such as DCCP, SCTP, TIPC, ATM
• Ethernet bridging, QoS, etc
Trang 33- ATA/ATAPI, hỗ trợ cho IDE disk, CD-ROM and tapes Một ngăn xếp mới tồn tại
- SCSI
• nhân SCSI, cần cho thiết bị SCSI mà còn cho USB, ổ cứng ATA, PATA
• driver điều khiển SCSI
f) Biên Dịch và cài đặt hạt nhân cho hệ thống máy chủ
Make
- Trong thư mục lõi chính
- Nhớ chạy make –j 4 nếu bạn có nhiều nhân xử lý để tăng tốc xử lý biên dịch
- Không cần chạy như quyền Root
Generates( tạo ra)
- vmlinux, the raw uncompressed kernel image, ở định dạng ELF, có ích cho mục
đích gỡ rối, nhưng không được khởi động
- arch/<arch>/boot/*Image, cuối cùng, luôn luôn được nén, ảnh của nhân được
khởi động
• bzImage cho x86, zImage cho ARM, vmImage.gz cho Blackfin
Tất cả các mô-đun nhân trải dài trên cây nguồn hạt nhân
Make install
- Cài đặt cho hệ thống máy chủ bằng cách mặc đinh, nên cần chạy quyền root Nói chung, không được sử dụng khi biên dịch cho hệ thống nhúng, và nó cài đặt hệ thống tập tin lên máy trạm
Install
- /boot/vmlinuz-<version>Nén ảnh hạt nhân Giống như là một trong
arch/<arch>/boot
- /boot/System.map-<version> Lưu trữ địa chỉ kí hiệu của hạt nhân
- /boot/config-<version> Cấu hình hạt nhân cho phiên bản này
Trang 34Thông thường, chạy lại việc cấu hình bootloader để đưa nhân mới vào tài khoản
make modules_install
- Cài đặt cho hệ thống máy chủ bằng cách mặc định, cần chạy quyền root
Cài đặt tất cả mô-đun trong /lib/modules/<version>/
- kernel/ Mô-đun ko , trong cấu trúc thư mục giống như nguồn
- modules.alias Mo-đun bí danh cho tiện ích tải mô-đun Ví dụ: alias
sound-service-?-0 snd_mixer_oss
- modules.dep Mô-đun phụ thuộc
- modules.symbols Tells which module a given symbol belongs to
g) Sử dụng mô-đun hạt nhân
Những mô-đun là nó dễ dàng để phát triển driver mà không khởi động lại: nạp, kiểm tra, gỡ bỏ , xây dựng lại, nạp Hữu ích trong việc giữa kích thước file ảnh hạt nhân tối thiểu Có ích trong việc giảm thời gian khởi động: bạn không cần nhiều thời gian cho việc khởi tạo thiết bị và tính năng của hạt nhân cái mà bạn chỉ cần sau đó Chú ý: được nạp một lần, có được toàn quyền trong hệ thống Không được bảo vệ đặt biệt Đó là tại sao chỉ tài khoản Root mới có thể nạp và gỡ bỏ mô-đun
Một vài mô-đun thì phụ thuộc và những mô-đun khác, cái mà được nạp đầu tiên Ex: mô-đun usb-storage phụ thuộc vào mô-đun scsi_mod, libusual và usbcore Sự phụ thuộc đươc mô tả trong /lib/modules/<kernel-version>/modules.dep File này được tạo khi bạn chạy make modules_install
Khi mô-đun mới được nạp, thông tin liên quan thì có sẵn trong ghi chép của hạt nhân Hạt nhân giữ những tin nhắn của nó trong bộ đệm tròn Tin nhắn ghi chép của hạt nhân thì có sẵn thông qua lệnh dmesg Tin nhắn ghi chép của hạt nhân cũng hiển thị trong dòng lệnh hệ thống Chú ý bạn có thể viết ghi chép của hạt nhân từ userspace echo
"Debug info" > /dev/kmsg
modinfo <module_name>; modinfo <module_path>.ko Lấy thông tin về mô-đun: các thông số, bản quyền, mô tả, sự phụ thuộc Rất có ích trước khi quyết định nạp hay không
Trang 35sudo insmod <module_path>.ko Cố gắng nạp được đưa ra Đường dẫn đầy đủ đến
mô – đun phải được đưa ra
Khi nạp những mô-đun lỗi, insmod thường không đưa cho bạn thông tin chi tiết Chi tiết thường ở trong ghi chép của hạt nhân
Ex:
sudo rmmod <module_name> Gỡ bỏ những mô-đun Sẽ chỉ cho phép nếu mo-đun không còn được sử dụng nữa sudo modprobe -r <module_name> Gỡ bỏ những mô-đun được đưa ra và tất cả mô-đun phụ thuộc
Tìm thông số có sẵn: modinfo snd-intel8x0m
Thông qua insmod: sudo insmod /snd-intel8x0m.ko index=-2
Thông qua modprobe Đặt thông số trong /etc/modprobe.conf hoặc trong bất cứ file nào trong /etc/modprobe.d/: options snd-intel8x0m index=-2
Thông qua dòng lệnh hạt nhân, when những driver được xây dựng trong hạt nhân snd-intel8x0m.index=-2
- snd-intel8x0m là tên của driver
- index tên thông số của driver
3 Toolchain
a) Cross compiler
Cross compiler là một trình biên dịch được sử dụng để thực thi cho hệ thống nhúng,
nó có khả năng tạo ra mã thực thi cho một nền tảng khác so với trình biên dịch được chạy
Cross compiler hỗ trợ:
Thực hiện biên dịch nhiều chương trình phức tạp trên bất cứ máy nào, bất kể phần cứng hoặc phiên bản hệ điều hành mà nó đang chạy
Trang 36 Biên dịch các công cụ cần thiết khi phát triển một nền tảng phần mềm mới, hoặc giả lập của một nền tảng tương lai
Các mô hình máy ảo cho phép đầu ra trong cùng một trình biên dịch sẽ được sử dụng trên toàn hệ thống
b) Định nghĩa Toolchain và các thành phần
Là một tập công cụ được dùng để xây dựng các ứng dụng hoặc tạo image cho một thiết bị nhúng Các toolchain còn cho phép biên dịch (compile) trên một kiến trúc cho một kiến trúc khác (như là biên dịch một image của ARM trên một máy tính cá nhân xài
hệ điều hành Linux; điều này được gọi là cross-compiling và các compile được gọi là cross-compile)
- Các tool được phát triển tích hợp sẳn trên nền GNU/ Linux được gọi là native toolchain (toolchain có sẳn)
- Toolchain này chạy và tạo mã theo kiến trúc hiện tại, thông thường là x86 (32bit)
- Đối với việc phát triển một hệ thống nhúng, sẽ là bất khả thi hoặc không thích hợp đối với việc sử dụng native toolchain
o Kết quả quá phụ thuộc vào khả năng lưu trữ và cả bộ nhớ
o Tốc độ hoạt động chậm hơn nhiều
o Trên hết là bạn có thể không muốn phải cài đặt quá nhiều các công cụ phát triển trên sản phẩm của mình
- Bởi vậy, cross-compiling toolchains được sử dụng rộng rãi hơn Chúng cho phép chạy và biên dịch trên một kiến trúc cho một kiến trúc khác