15.1 Trình phiên dịch thi hành (Executable interpreters)
Bạn phải có ít nhất một trình phiên dịch thi hành gắn vào kernel cơ sở, vì để load một LKM phiên dịch thi hành (executable interpreter LKM), bạn cần phải thực thi một lệnh, và do đó, cần có chương trình để phiên dịch lệnh thực thi này.
Trình này gần như hiển nhiên là ELF, vì hầu hết các lệnh thực thi trong hệ thống Linux là ELF.
Trước khi ELF tồn tại trên Linux, dạng lệnh thực thi thông thường là a.out. Có một thời gian ngắn, các hệ thống nửa-ELF/nửa-a.out khá thông dụng. Một số vẫn còn tồn tại.
15.1.1. binfmt_aout: EI cho dạng a.out
a.out là định dạng thực thi phổ biến trong những ngày đầu của Linux và từng là định dạng duy nhất của Linux. Cho đến ngày nau, tên mặc định của các file xuất thực thi của một trình biên dịch GNU (GNU compiler) là a.out (bất kể chúng có định dạng gì).
Nếu bạn thử chạy một file thực thi a.out mà không cần EI, lệnh hệ thống
exec
sẽ không thực hiện được và báo lỗi "cannot execute binary file".Không có tham số LKM
Ví dụ:
modprobe binfmt_aout
15.1.2 binfmt_elf: EI cho định dạng ELF
ELF là định dạng thực thi thông thường trên các hệ thống Linux.
Gần như không thể nào không có EI này trong kernel cơ sở của bạn (nếu không còn lý do nào khác thì:
insmod
là một file thực thi dạng ELF!). Tuy nhiên, về lý thuyết, có thể bỏ nó ra khỏi kernel cơ sở và đưa nó vào như một LKM.Không có tham số LKM.
VD:
modeprobe binfmt_elf
15.1.3 binfmt_java: EI cho Java bytecode
Java là một ngôn ngữ lập trình hướng đối tượng khá hiện đại. Những chương trình Java truyền thống được biên dịch thành các "Java bytecode", nghĩa là cần phiên dịch bởi một trình phiên dịch Java bytecode. Điếm quan trọng đối với ngôn ngữ hướng đối tượng mới này là các file đối tượng hoàn toàn linh động: chúng có thể được chạy trên mọi hệ thống, miễn là hệ thống đó có một trình phiên dịch bytecode.
Trong khi dự tính ban đầu là trình phiên dịch bytecode sẽ chạy như một chương trình người dùng, với LKM này, bạn có thể làm cho kernel linux phiên dịch file thực thi Java như bất kỳ một file thực thi nào khác. Và vì vậy, bạn có thể chạy một chương trình biên dịch từ Java cũng như chương trình biên dịch từ C, tức là gõ tên chương trình tại dấu đợi lệnh của giao diện dòng lệnh.
Thực tế, lợi ích của ngôn ngữ bytecode trung gian vẫn chưa được chứng minh. Và thường, Java được biên dịch hẳn thành một file thực thi truyền thống như ELF. Nếu làm như vậy, bạn sẽ không cần tới
binfmt_java
.Không có tham số LKM.
VD:
modeprobe binfmt_java
15.2. Block device drivers
15.2.1. floppy: floppy disk driver
Đây là driver thiết bị cho ổ đĩa mềm. Bạn sẽ cần đến driver này để có thể truy xauất một đĩa mềm. Tài liệu về LKM này được ghi trong README.fd đặt trong
linux/drivers/block directory
.Lưu ý rằng nếu bạn boot từ đĩa mềm hay có hệ thống file root trên một đĩa mềm, bạn phải đưa driver này vào kernel cơ sở.
[ ... ]
15.2.2 loop: loop device driver
Module này cho phép bạn tổ chức một filesystem được lưu trữ dưới dạng file thông thường (trong một filesystem khác). File này được gọi là backing file.
Một ứng dụng của việc này là kiểm tra một filesystem ISO 9660 trước khi ghi chính thức lên một CD. Bạn xây dựng một filesystem trong một file thông thường 650MB. File này sẽ được đưa vào một chương trình ghi đĩa CD. Nhưng bạn có thể định nghĩa một loopback device dựatre6n file này như một backing file và sau đó tổ chức filesytem từ backing file.
Bạn cũng có thể dùng loop device để chuyển các tập hợp file qua một hệ thống mạng. Nó giống như một file .tar, chí khác là bạn không cần phải gói và mở gói. Bạn chỉ cần tổ chức lại file nguyên thủy.
Một số người dùng các loop device trên một hệ thống khi thì chạy WIndows, khi thì chạy Linux, để có thể duy trì hệ thống Linux thông qua hệ thống Windows: đặt một root filesystem vào một file trong hệ FAT để windows có thể truy xuất, sau đó tổ chức hệ thống Linux thông qua một loop device khi Linux đang chạy.
Bạn có thể giữ filesystem mã hóa hoặc nén, hoặc bất cứ cách biến đổi nào, trong một backing file. Loop device mã hóa khi bạn ghi vào, và giãi mã khi bạn truy xuất. Một chiến lược khác khá phổ biến để mã hóa và nén một filesystem là sử dụng một định dạng filesystem đã nén hoặc mã hóa, chẳng hạn như Cfs, Tcfs, Stegfs.
Một hệ thống mã hóa được dựa trên một hàm chuyển (transfer function). Có hai hàm chuyển sẵn có trong một loop module: identify (dùng cho trường hợp mã hóa thông thường: những gì bạn thấy trong loop device chính xác là những gì có trong backing file) và hàm mã hóa XOR đơn giản. Một module độc lập khác có thể bổ sung vào bất kỳ chức năng chuyển nào bằng cách gọi hàm
loop_register_transfer()
trong loop module.
No comments:
Post a Comment