CC: hai số chỉ thế kỉ,
* Có một cách khác để xác định thông tin ng−ời dùng với lệnh id
5.1 Giới thiệu về cách thức Linux quản lý thiết bị ngoại
Trong một hệ thống máy tính, CPU là thiết bị trung tâm nh−ng không phải là thiết bị điều khiển duy nhất, mỗi thiết bị vật lý đều có bộ điều khiển riêng. Bàn phím, chuột, các cổng tuần tự đ−ợc điều khiển bởi một SuperIO chip. Những ổ đĩa IDE, SCSI đ−ợc điều khiển bởi bộ điều khiển IDE, SCSI t−ơng ứng, v..v. Mỗi bộ điều khiển phần cứng đều có những thanh ghi trạng thái (CSRs) riêng và chúng khác nhau cho các thiết bị khác nhau. Các CSR dùng để khởi động, dừng và khởi sinh thiết bị, ngoài việc đ−ợc nhúng vào các ứng dụng chúng còn đ−ợc l−u trữ trong nhân Linux.
Trong phần này, chúng ta sẽ xem xét việc Linux điều khiển các thiết bị phần cứng nh− thế nào. Linux cho phép chúng ta có quyền điều khiển phần cứng của hệ thống (T−ơng tự nh− Contronl Panel của Windows). Tuy nhiên, việc truy cập và điều khiển các thiết bị phần cứng không dễ nh− trong Windows, mặc dù nó tỏ ra khá cơ động và không phải bảo trì nhiều một khi đã xác lập. Trong một số tr−ờng hợp phải biên dịch lại nhân nếu muốn bổ sung phần cứng mới vào hệ thống. Các CD-ROM, sound card bắt buộc phải làm vậy. Nh−ng modem, thiết bị chuột hoặc các ổ đĩa cứng thì có thể không cần thiết. Mỗi thiết bị ngoại vi muốn đ−ợc dùng thì cần phải có những trình điều khiển thiết bị đi kèm. Phần mềm dùng để điều khiển thiết bị gọi là device driver. Trong Linux, các device driver của nhân Linux thực chất là th− viện dùng chung, th−ờng trú trong bộ nhớ hoặc là các trình điều khiển phần cứng ở mức thấp. Tất cả các thiết bị phần cứng đều đ−ợc xem nh− là các tập tin thông th−ờng, chúng có thể đ−ợc mở, đóng, đọc, ghi bằng cách sử dụng các lời gọi hệ thống giống nh− các lời gọi hệ thống quản lý tập tin. Mỗi thiết bị đ−ợc biểu diễn nh− là một thiết bị tệp đặc biệt (device special file). Ví dụ: nh− thiết bị đĩa IDE thứ nhất trong hệ thống đ−ợc biểu diễn bởi /dev/hda. Đối với các thiết bị khối (disk) và thiết bị ký tự (character device) thì các thiết bị tệp đặc biệt của chúng đ−ợc khởi tạo bởi lệnh mknod và chúng mô tả thiết bị bằng cách sử dụng các số hiệu chính (major device number) và số hiệu nhỏ (minor device number). Thiết bị mạng cũng đ−ợc biểu diễn nh− là một tập tin thiết bị đặc biệt, nh−ng chúng đ−ợc Linux khởi tạo khi khởi sinh bộ điều khiển mạng trong hệ thống.
Các thiết bị đ−ợc điều khiển bởi một bộ điều khiển chung (driver) sẽ đ−ợc gán một số (định danh) chung gọi là số hiệu chính. Các thiết bị đó đ−ợc phân biệt thông qua một số gọi là số hiệu nhỏ. Ví dụ, mỗi phân vùng (partition) trên một đĩa cứng có một số hiệu nhỏ của mình, vậy /dev/hda2 (partition thứ hai trên đĩa cứng IDE thứ nhất) có số hiệu chính cho cả thiết bị là 3 và số hiệu nhỏ để phân biệt là 2. Linux ánh xạ một tập tin thiết bị lên một driver thiết bị nhờ sử dụng số hiệu chính của thiết bị và số hiệu của bảng hệ thống.
Linux hỗ trợ 3 loại thiết bị: Thiết bị kí tự, thiết bị khối và thiết bị mạng.
Thiết bị kí tự, t−ơng ứng với các tập tin đặc biệt trong chế độ kí tự (Character Mode): Các tập tin này t−ơng ứng với các thiết bị ngoại vi không có cấu trúc, chẳng hạn nh− các cổng song song hoặc nối tiếp mà trên đó dữ liệu có thể đ−ợc đọc và ghi theo từng byte hoặc dòng byte.
Thiết bị kiểu khối, t−ơng ứng với các tập tin đặc biệt trong chế độ khối (Block Mode): Các tập tin này t−ơng ứng với các thiết bị ngoại vi có cấu trúc dạng khối nh− ổ đĩa, có kiểu truy cập bằng cách cung cấp một số khối đọc hoặc ghi. Các thao tác nhập/xuất này đ−ợc thực hiện thông qua một vùng đệm
(Buffer Cache) và có thể truy nhập trực tiếp tới từng khối (Block) trên thiết bị.
Thiết bị mạng có thể truy cập thông qua giao diện socket BSD. Mỗi tập tin đặc biệt sẽ đ−ợc Linux mô tả theo ba thuộc tính sau:
Kiểu tập tin (khối hoặc kí tự).
Số hiệu chính của tập tin, đại diện cho trình điều khiển đang điều khiển thiết bị.
Số hiệu thứ cấp của tập tin, cho phép trình điều khiển nhận biết thiết bị vật lí mà nó sẽ hoạt động trên đó.
Thông th−ờng các tập tin thiết bị đ−ợc định vị trong th− mục /dev. Các thao tác nhập/xuất vào thiết bị đ−ợc thực hiện thông qua những lời gọi hệ thống nh− những thao tác nhập/xuất tập tin thông th−ờng. Mỗi thiết bị ngoại vi đ−ợc mở bởi lời gọi
open bằng cách chỉ định tên tập tin đặc biệt t−ơng ứng. Nhân sẽ trả về một trình mô tả nhập/ xuất t−ơng ứng với thiết bị, và tiến trình gọi có thể truy cập nó bằng các lệnh hệ thống read, write. Sau khi hoàn thành công việc thì lời gọi close sẽ đ−ợc sử dụng để tắt thiết bị. Linux th−ờng sử dụng hai bảng để l−u trữ danh sách các thiết bị hỗ trợ, đó là: blkdevs chứa các ch−ơng trình mô tả hay các thiết bị trong chế độ khối,
chrdevs dành cho các thiết bị có thể truy cập trong chế độ ký tự. Tập tin nguồn
fs./devices.c chứa các hàm quản lý các thiết bị hỗ trợ.
Các hàm register_blkdevs và register_chrdevs cho phép đăng ký các trình điều khiển thiết bị vào các bảng t−ơng ứng.
Các hàm unregister_blkdev và unregister_chrdevscó nhiệm vụ xoá một đăng ký đã có trong các bảng t−ơng ứng.
Các hàm blkdev_open và chrdev_open sẽ đảm nhiệm việc mở một thiết bị đã đ−ợc đăng ký.
Các hàm get_blkfops và get_chrfops trả về một con trỏ trỏ vào các thao tác tập tin kết hợp với một thiết bị nhờ get_blkfops, sau đó gọi lời gọirelease.
...
Ch−ơng này sẽ lần l−ợt giới thiệu đến các từng loại các thiết bị: ổ cứng, các cổng nối tiếp cùng modem, các cổng song song cùng máy in và một ít về thiết bị mạng, card sound ... Với mục đích là h−ớng dẫn phổ dụng nhất, các nội dung d−ới đây chỉ dừng lại ở mức sử dụng và ch−a đi sâu vào nghiên cứu các can thiệp thiết bị mở mức nhân.