1/16/09

Linux hay GNU/Linux và cấu trúc nhân Linux

CẤU TRÚC NHÂN LINUX


Lược dịch: zxc232


Nguyên bản: Anatomy of the Linux kernel


M. Tim Jones (mtj@mtjones.com), Consultant Engineer, Emulex Corp. 06 Jun 2007



I.Tóm tắt lịch sử Linux


Linux hay GNU/Linux?


Khi thì người ta gọi “hệ điều hành Linux”, lúc lại gọi là “hệ điều hành GNU/Linux”. Lí do là vì Linux thực ra là phần nhân của hệ điều hành. Nhiều các ứng dụng khác bổ xung kết hợp với nhân Linux làm thành một hệ điều hành sử dụng được, các ứng dụng đó phần lớn là phần mềm GNU. Vì vậy nhiều người coi gọi “hệ điều hành GNU/Linux” là đúng, còn tên Linux dùng để chỉ phần nhân của hệ điều hành đó.


GNU là các phần mềm của GNU Project, được gọi là GNU packages or GNU programs. Các thành phần chính gồm: bộ dịch GNU Compiler Collection (GCC), các công cụ mã nhị phân GNU Binary Utilities (binutils), lớp vỏ bash shell, thư viện C GNU C library (glibc), và các công cụ lõi GNU Core Utilities (coreutils).


(GNU Project cũng có dự án làm phần nhân hệ điều hành nhưng chưa xong. Vì vậy hiện nay các hệ điều hành mà ta vẫn gọi là Linux dùng nhân Linux của Linus Tovarlds kết hợp với các gói phần mềm nói trên của GNU Project. Do đó gọi hệ điều hành GNU/Linux thì hợp lý hơn – lời ND)


GNU là tên tắt đệ quy của GNU's Not Unix: thiết kế phần mềm giống Unix nhưng là phần mềm tự do (free software) và không chứa mã Unix.


Tóm tắt lịch sử


Trong khi hiện nay Linux khá phổ biến thì lịch sử của nó lại khá mới. Thời kỳ bình minh của máy tính, các nhà lập trình viết chương trình cho phần cứng bằng ngôn ngữ của phần cứng đó. Do chưa có hệ điều hành nên chỉ một ứng dụng (và một user) có thể dùng một phần cứng lớn và đắt tiền tại một thời điểm. Đến 1950 mới bắt đầu có những hệ điều hành sơ khai.


Trong những năm 60, học viện Công nghệ Massachusetts (MIT) và một số công ty kết hợp xây dựng một hệ điều hành thí nghiệm gọi là Multics (Multiplexed Information and Computing Service) cho máy tính GE-645. Một trong những công ty đó, AT&T, bỏ Multics và xây dựng hệ điều hành riêng của mình vào năm 1970 gọi là hệ Unics. Cùng với Unics, ngôn ngữ lập trình C cũng được phát triển và được dùng để viết hệ điều hành sao cho nó không phụ thuộc vào kiến trúc phần cứng.


Hai mươi năm sau, Andrew Tanenbaum tạo nên một phiên bản vi nhân (microkernel) của Unix dùng để chạy trên các máy tính cá nhân nhỏ gọi là hệ MINIX (minimal UNIX). Đó là hệ điều hành nguồn mở đầu tiên tạo cảm hứng cho Linus Torvalds xây dựng nên Linux vào đầu những năm 90.



Hình 1: Lịch sử các phiên bản nhân Linux


Trục đứng là số dòng lệnh, trục ngang là thời điểm công bố. Phiên bản đầu 0.11 (tháng12/1991) có 10.239 dòng lệnh. Phiên bản 2.6.0 (tháng12/2003) có gần 6 triệu dòng lệnh.


Linux phát triển nhanh từ dự án của một người thành một dự án lập trình toàn cầu gồm hàng nghìn nhà lập trình. Một trong những quyết định quan trọng nhất của Linux là nó chấp nhận tuân theo giấy phép phần mềm nguồn mở GPL (GNU General Public License). Giấy phép đó tránh cho nhân Linux không bị khai thác thương mại và cũng cho phép nó kết hợp được với các ứng dụng của GNU Project.



II.Giới thiệu nhân Linux


Một hệ điều hành GNU/Linux có thể phân thành hai vùng: vùng người dùng (User Space) gồm các thư viện C và các phần mềm ứng dụng (soạn văn bản, …); vùng nhân (Kernel Space) gồm ba thành phần chính như hình 2.




Trên cùng là lớp các ứng dụng của người dùng (User Applications). Bên dưới là lớp các thư viện C (GNU C Library). Lớp thư viện phục vụ cho giao diện các lời gọi hệ thống tạo liên kết giữa các ứng dụng và nhân Linux. Giao diện này quan trọng vì nhân Linux và các ứng dụng chiếm các vùng địa chỉ bộ nhớ được bảo vệ khác nhau. Mỗi ứng dụng có vùng địa chỉ ảo riêng còn nhân có một vùng địa chỉ duy nhất.


Nhân Linux có thể chia thành ba lớp. Trên cùng là giao diện các lời gọi hệ thống thực hiện các chức năng cơ bản như đọc, ghi. Bên dưới là phần mã nhân hệ điều hành (kernel code) hoặc chính xác hơn là mã nhân độc lập với kiến trúc vi xử lý (processor). Các mã lệnh trong lớp này dùng chung cho mọi loại processor mà Linux hỗ trợ. Lớp dưới cùng là các mã lệnh phụ thuộc vào kiến trúc từng loại processor (x86, x86-64, …).



III. Các hệ thống con chính của nhân Linux


Hình 3 dưới đây mô tả các hệ thống con chính của nhân Linux.



Hình 3: Các hệ thống con chính của nhân Linux



III.1Nhân là gì?


Như hình 3, nhân Linux thực ra là bộ quản lý các tài nguyên. Các tài nguyên gồm: các tiến trình (process), bộ nhớ (memory) và thiết bị phần cứng. Nhân Linux quản lý các tài nguyên đó và là người điều hành việc truy cập tài nguyên đồng thời của nhiều user. (User trong bài này được hiểu theo nghĩa rộng bao gồm tất cả những gì có nhu cầu sử dụng tài nguyên hệ thống: các tiến trình, các phần mềm, v.v....)


Updated (8/2009): bản đồ nhân linux có ở đây. Nhấn vào từng mục để xem chi tiết.



III.2Giao diện lời gọi hệ thống (System call interface - SCI)


SCI thực hiện các lời gọi hệ thống từ vùng ứng dụng vào nhân Linux. Giao diện này độc lập với kiến trúc bộ vi xử lý ngay cả trong cùng một họ vi xử lý. SCI có thể thực hiện các dịch vụ gọi hàm dồn kênh và tách kênh. Các gói liên quan được cài trong thư mục ẩn ./linux/kernel và phần độc lập với kiến trúc vi xử lý nằm trong ./linux/arch.



III.3 Quản lý các tiến trình (Process management)


Quản lý tiến trình đảm bảo việc thực hiện các tiến trình. Trong vùng nhân Linux, mỗi tiến trình được gọi là một mạch lệnh (thread) và được thể hiện thành một vi xử lý ảo (gồm mã lệnh, dữ liệu, các ngăn xếp và các thanh ghi của CPU). Trong vùng ứng dụng thì chỉ dùng từ tiến trình mặc dù Linux không phân biệt hai khái niệm này (threads và processes). Nhân cung cấp một giao diện lập trình ứng dụng (API) để: tạo tiến trình mới (fork, exec hoặc các hàm POSIX), ngừng tiến trình (kill, exit) và thông tin, đồng bộ giữa các tiến trình (signal hoặc các cơ cấu POSIX).


Quản lý tiến trình còn dùng để chia sẻ CPU giữa các mạch lệnh đang hoạt động. Nhân thực hiện một thuật toán lập lịch cố định bất kể đến các mạch lệnh đang tranh chấp quyền sử dụng CPU. Lịch này cũng hỗ trợ cả chế độ đa xử lý đối xứng (Symmetric MultiProcessing – SMP). Các gói liên quan được cài trong thư mục ẩn ./linux/kernel và phần độc lập với kiến trúc vi xử lý nằm trong ./linux/arch.



III.4 Quản lý bộ nhớ (Memory management).


Một tài nguyên quan trọng khác mà nhân Linux quản lý là bộ nhớ. Để sử dụng bộ nhớ hiệu quả theo cách mà phần cứng quản lý bộ nhớ ảo, bộ nhớ được chia thành các trang (mỗi trang là 4KB đối với phần lớn loại vi xử lý). Linux có các cơ cấu quản lý lượng bộ nhớ khả dụng và các cơ cấu phần cứng để mapping giữa bộ nhớ vật lý và bộ nhớ ảo.


Việc quản lý bộ nhớ còn làm nhiều hơn là chỉ quản lý các trang 4KB. Linux dùng một sơ đồ định vị lát (slab allocator) lên trên mỗi trang. Sơ đồ này dùng trang 4KB làm cơ sở nhưng tạo một cấu trúc bên trong, theo dõi trang nào đầy, trang nào mới dùng một phần, trang nào còn trống.


Khi nhiều user sử dụng bộ nhớ, dung lượng có thể không đủ. Khi đó các trang nhớ được chuyển sang ổ cứng. Quá trình này được gọi là trao đổi (swapping) giữa bộ nhớ và ổ cứng. Các gói phần mềm liên quan đến quản lý bộ nhớ đặt trong thư mục ./linux/mm.



III.5 Hệ thống file ảo (Virtual file system)


Hệ thống file ảo (VFS) là một khía cạnh hay của nhân Linux, cung cấp một giao diện trừu tượng hoá chung cho hệ thống file. VFS tạo nên một lớp chuyển đổi giữa SCI và các hệ thống file của Linux.



Hình 4: VFS tạo nên một lớp chuyển đổi giữa user và các hệ thống file.


Nằm trên cùng của VFS là lớp các API các chức năng như mở, đóng, đọc, viết file. Dưới cùng của VFS là lớp trừu tượng hệ thống file xác định các chức năng lớp trên thực hiện như thế nào. Đó là các plug-in đối với một hệ thống file cho trước (có trên 50 plug-in như vậy). Các phần mềm liên quan đến VFS nằm trong thư mục ./linux/fs.


Bên dưới lớp file hệ thống là bộ đệm cache (buffer cache) gồm các chức năng chung cho mọi hệ thống file (không phụ thuộc vào một kiểu hệ thống file riêng biệt nào). Lớp cache này tối ưu hoá việc truy cập vào các thiết bị vật lý bằng cách giữ dữ liệu trong một thời gian ngắn (hoặc đọc trước sao cho dữ liệu luôn có khi cần). Dưới bộ đệm cache là các driver thiết bị là giao diện của các thiết bị vật lý cụ thể.



III.6 Các ngăn xếp mạng (Network stack)


Các ngăn xếp mạng được thiết kế theo một kiến trúc lớp mô phỏng theo đúng kiến trúc lớp của các giao thức. Nhắc lại rằng IP là giao thức lớp mạng lõi nằm bên dưới giao thức vận chuyển (thường là TCP). Bên trên TCP là lớp socket được gọi đến qua SCI.


Lớp socket là API chuẩn của hệ thống con network, tạo nên một giao diện cho các giao thức mạng khác nhau. Lớp socket quy định một cách quản lý kết nối và di chuyển dữ liệu chuẩn hoá giữa các điểm đầu cuối. Tài nguyên mạng nằm ở thư mục ./linux/net.



III.7 Các driver thiết bị (Device drivers)


Phần lớn mã nguồn của nhân Linux là các driver để điều khiển các thiết bị phần cứng. Cây thư mục của mã nguồn nhân Linux có một thư mục con driver trong đó có các thư mục con ứng với các thiêt bị khác nhau. Mã nguồn driver nằm ở ./linux/drivers.



III.8 Mã lệnh phụ thuộc kiến trúc vi xử lý (Architecture-dependent code)


Phần lớn Linux độc lập với kiến trúc vi xử lý, nhưng cũng có những bộ phận cần phải theo đúng từng kiến trúc cụ thể để hoạt động được và hiệu quả. Thư mục con ./linux/arch chứa các mã nguồn phụ thuộc kiến trúc đó. Ví dụ với một máy trạm tiêu biểu, thư mục đó là i386,



IV.Các đặc điểm đáng chú ý của nhân Linux


Cùng với thời gian, nhân Linux đã sử dụng bộ nhớ và CPU ngày càng hiệu quả hơn và đặc biệt ổn định. Nhưng khía cạnh thú vị nhất của Linux là tính khả chuyển (portability) mặc dù kích cỡ lớn và độ phức tạp của nó. Linux có thể dịch để chạy trên rất nhiều loại processor và nền tảng phần cứng khác nhau đáp ứng các ràng buộc kiến trúc và nhu cầu khác nhau. Một trong những ví dụ là Linux có thể chạy trên một processor có bộ phận quản lý bộ nhớ hoặc không có bộ phận đó. Cổng uClinux của Linux hỗ trợ việc không có bộ phận quản lý bộ nhớ.


Ngoài tính khả chuyển và hiệu quả, dưới đây là một vài đặc tính đáng chú ý khác của nhân Linux.


Linux, với tư cách là một hệ điều hành nguồn mở, là nơi dùng để test các giao thức mới và những đặc điểm tiên phong của các giao thức đó. Linux hỗ trợ một số lớn giao thức mạng từ TCP/IP cho đến các giao thức mạng cao tốc (trên 1 Gigabit Ethernet – 1GbE – cho đến 10GbE). Linux cũng hỗ trợ các giao thức như SCTP (Stream Control Transmission Protocol) có nhiều đặc tính tiên tiến hơn TCP.


Linux cũng là một kernel động, cho phép thêm bớt các thành phần phần mềm trong khi đang chạy. Các thành phần đó gọi là các module tải động được (dinamically loadable kernel modules) có thể được tải vào bộ nhớ khi boot (khi tìm thấy một phần cứng mới cần đến nó) hoặc tải và rút ra khỏi bộ nhớ bất kỳ lúc nào bởi user.


(Một ổ cứng đã cài Windows trên một máy, khi mang ổ cứng sang máy khác phải cài lại Windows. Ngược lại, một ổ cứng cài Linux có thể mang sang máy khác vẫn chạy tốt. Một ví dụ khác: các hệ Linux cài trên ổ USB boot được có thể cắm vào bất kỳ máy nào để chạy.).


Một đặc tính mới của Linux gần đây là nó có thể dùng làm hệ điều hành cho các hệ điều hành khác (hypervisor). Kernel Linux gần đây đã được bổ xung tính năng máy ảo từ nhân (Kernel-based Virtual Machine – KVM). Tính năng này tạo ra một giao diện mới cho vùng người dùng, cho phép các hệ điều hành khác (Linux hoặc Windows) chạy trên KVM. Yêu cầu duy nhất là processor phải hỗ trợ tập lệnh ảo hoá mới.



V.Tìm hiểu tiếp


Trên đây ta mới chỉ lướt qua các nét chính của nhân Linux. Bạn đọc có nhu cầu nên tìm hiểu thêm chi tiết hơn trong danh sách các tài liệu tham khảo cho dưới đây.


Learn:





  • The GNU site describes the GNU GPL that covers the Linux kernel and most of the useful applications provided with it. Also described is a less restrictive form of the GPL called the Lesser GPL (LGPL).




  • UNIX, MINIX and Linux are covered in Wikipedia, along with a detailed family tree of the operating systems.




  • The GNU C Library, or glibc, is the implementation of the standard C library. It's used in the GNU/Linux operating system, as well as the GNU/Hurd microkernel operating system.




  • uClinux is a port of the Linux kernel that can execute on systems that lack an MMU. This allows the Linux kernel to run on very small embedded platforms, such as the Motorola DragonBall processor used in the PalmPilot Personal Digital Assistants (PDAs).




  • "Kernel command using Linux system calls" (developerWorks, March 2007) covers the SCI, which is an important layer in the Linux kernel, with user-space support from glibc that enables function calls between user space and the kernel.




  • "Inside the Linux scheduler" (developerWorks, June 2006) explores the new O(1) scheduler introduced in Linux 2.6 that is efficient, scales with a large number of processes (threads), and takes advantage of SMP systems.




  • "Access the Linux kernel using the /proc filesystem" (developerWorks, March 2006) looks at the /proc file system, which is a virtual file system that provides a novel way for user-space applications to communicate with the kernel. This article demonstrates /proc, as well as loadable kernel modules.




  • "Server clinic: Put virtual filesystems to work" (developerWorks, April 2003) delves into the VFS layer that allows Linux to support a variety of different file systems through a common interface. This same interface is also used for other types of devices, such as sockets.




  • "Inside the Linux boot process" (developerWorks, May 2006) examines the Linux boot process, which takes care of bringing up a Linux system and is the same basic process whether you're booting from a hard disk, floppy, USB memory stick, or over the network.




  • "Linux initial RAM disk (initrd) overview" (developerWorks, July 2006) inspects the initial RAM disk, which isolates the boot process from the physical medium from which it's booting.




  • "Better networking with SCTP" (developerWorks, February 2006) covers one of the most interesting networking protocols, Stream Control Transmission Protocol, which operates like TCP but adds a number of useful features such as messaging, multi-homing, and multi-streaming. Linux, like BSD, is a great operating system if you're interested in networking protocols.




  • "Anatomy of the Linux slab allocator" (developerWorks, May 2007) covers one of the most interesting aspects of memory management in Linux, the slab allocator. This mechanism originated in SunOS, but it's found a friendly home inside the Linux kernel.




  • "Virtual Linux" (developerWorks, December 2006) shows how Linux can take advantage of processors with virtualization capabilities.




  • "Linux and symmetric multiprocessing" (developerWorks, March 2007) discusses how Linux can also take advantage of processors that offer chip-level multiprocessing.




  • "Discover the Linux Kernel Virtual Machine" (developerWorks, April 2007) covers the recent introduction of virtualization into the kernel, which turns the Linux kernel into a hypervisor for other virtualized operating systems.




  • Check out Tim's book GNU/Linux Application Programming for more information on programming Linux in user space.




  • In the developerWorks Linux zone, find more resources for Linux developers, including Linux tutorials, as well as our readers' favorite Linux articles and tutorials over the last month.




  • Stay current with developerWorks technical events and Webcasts.




Get products and technologies





  • Order the SEK for Linux, a two-DVD set containing the latest IBM trial software for Linux from DB2®, Lotus®, Rational®, Tivoli®, and WebSphere®.




  • With IBM trial software, available for download directly from developerWorks, build your next development project on Linux.




Discuss








1 comment:

Quoc Hoi said...

Cảm ơn tác gia