Thư mục melude: bao gồm danh sách các header thư viện được sử dụng dé build mã nguồn kernel, thư mục này cũng bao gồm nhiều thư mục con tương ứng với các kiên trúc cpu khác nhau Thư mục
Trang 1TRIEU MINH TUAN
CO CHE BAO MAT MA THUC THI TREN LINUX
LUAN VAN THAC SĨ KỸ THUẬT
KY THUAT MAY TINH VA TRUYEN THONG
HÀ NOT - 2014
Trang 2LOI CAM DOAN
Tôi xin cam đoan để tài nghiên cửu của tôi hoàn toàn đo tôi tự làm dưới sự hướng dẫn
số liệu, kết quả nình bày trong luận
của cô giáo Tiên sỹ Trương Thị Diệu Ianh C:
văn là hoàn toàn trung thực và chưa từng dược công bố trong bắt cứ công, trình nghiên
Trang 3LỜI CẢM ƠN
Tổ hoàn thành khóa luận này, tôi xin tỏ lòng biết on sâu sắc đến TS Trương Thị Diệu
Từnh đã tận tỉnh hướng dẫn trong suốt quá trình viết khóa luận lốt nghiệp,
'Tôi cũng xin chân thành căm ơn quý Thầy, Cô Viện Công nghệ Thông tia & Truyền thông Trường Đại học Bách Khoa Hà Nội, đặc biệt là các thảy cô trong bộ môn Truyền thông, & Mạng mày tính dä tận tính truyền đạt kiển thức trong thời gian học tập
và nghiên cứu tại đây Với vến kiến thức được tiếp thu trong quá trình học tập và
nghiên cứu không chỉ là nên tăng cho quá trình nghiên cứu khóa luận mà còn là hành
trang qui bau dé tdi bước vào đời một cách vững chắc và tự tín
Tôi cũng xin được gửi lời cảm ơn sự ủng hộ giúp đỡ nhiệt tỉnh của những, anh chị sra
trong lớp củng những người dòng nghiệp, gia dinh và bạn bè những người thân yêu của tôi, những người luôn là chỗ dựa vững chắc cho tôi, đề tôi có nỗ lực quyết tâm
hoàn thành nghiên cửu này
Cuối cùng, tôi xin kính chic Quy Thay cô, Đồng nghiệp, Gia đình đổi đảo sức khỏe và
thành công trong con đường sự nghiệp cao quý
Tôi xin trân trọng cắm ơn!
Hoe vién
Trigu Minh Tuân
Trang 4CHƯƠNG 1 - NHÂN LINUX VA CO CHE THUC THI UNG DUNG
1.1 TÔNG QUAN VỀ NHÂN LIKUX
1.1.1 Định nghĩa nhân linux
1.1.2 Thiết kê và thành phần Lime: Kernel
1
LL4 Ma nguén linux kernel
2 TIN TRINH VA FILE THUC THI TRONG LINUX, 22
1.2.1 Tiến trình
1.22 Lời sợi
1.2.3 Mã thực thì (Exeutable code)
1.2.4, File thực thi (Executable File}
1.2.5 Thư viện hd tro (Shared libraries)
1.2.6, Định dạng file thực thi
1.2.7 Quả trình thực thí một Jile
CHƯƠNG 2 - CODE SIGNING VÀ BỊNH HƯỚNG TỈCH HỢP
2.1 CODE SIGNING V4 CAC NGHIEN CTU LIEN QUAN 34
2.1.1 Định aghia code signing
2.1.2 Các nghiên ctu code signing
2.2 PHANTICH VA DINH HUGNG GTAT PHAP 46
CHUONG 3 - TICII IGP CODE SIGNING VAO NIEAN LINUX
Trang 5KẾT LUẬN
TÀI LIỆU THAM KHẢO
Trang 6DANH MỤC HÌNH VẼ
Tỉnh 1 Tiser space & Kemel space
Hình 2 Tầng trung gian giữa uscr & filesystem
Hình 3 Kernel Subsystem
Ilinh 4 Timeline of Linux kemel version
Hinh 5 The linux kemel archives website (www kernel.org)
Hình 6 Câu woe thu muc con chira mé ngudn linux kernel
Hinh 7 Cau trac thu muc linux kernel phién ban v3.x
Hình 8 Mã nguồn linux kernel sexy
Hình 9 Giao tiếp Application voi Hardware qua lời gọi hệ thông
Hình 10 Mê tả lời gọi hệ thẳng,
Hình 11 Định dạng ELE ¬—
Hình 12 Cơ chế fork-and-exec ¬—
Hình 13 Tạo tiễn trình đưới góc độ hệ thông,
11inh 14 Lung khởi tạo cấu hình thực thi mới
Hình 15 Mỏ binh ký dữ liệu ¬—
Hình 16 Mô bình xác mình chứ ký
Llinh 17 Cảnh bảo của Morilla khi cải đặt phần mễm
Hình 18 Xeode code sipning, ¬—
Trang 8PHAN MO DAU
Tiện nay, sau khi một chương trình ứng dựng được đưa ra và lưu hành trên mạng, rất
khó tránh khỏi nguy cơ bị các backercracker tấn công, chỉnh sửa, thay đổi nội dung
nhằm lợi dụng chơ các mục dich x4u như phát tán virus, cải đặt phần mỗm theo đối, botnet, đánh cắp đữ liệu cá nhân Các tình huỗng này thường xuyên gặp phải với các
nỗi dùng hệ điều hành Microsoli Windows và đã gây Huột bại nặng nễ cho cả người
dùng và doanh nghiệp trong vả ngoài nước Đặc biệt phải kể đến sự kiện đầu năm
2012, mệt nhóm hacker có tên là Sinh Tử Lệnh đã đính kèm mã độc vào bộ cải đặt
phẩn mềm gõ tiếng việt uaikey, một phần mềm khả phổ biến với cộng dồng người dùng Windows trong và ngoài nước, từ đó, lợi đựng những máy tỉnh này đi tắn công từ
chốt địch vụ các website, điễn đàn doanh nghiệp trong nước, phải kế đến đó lá vụ tắn công vào website báo điện tứ Vietnaunnet và website công ty an ninh mạng Bkav, ché
trong vòng chưa đây 12 tiếng, cả hai website đã hoàn toàn tê liệt
Rất nhiều nghiên cửu được dưa ra nhằm khắc phục tình trạng trên, trong đó cỏ giải
phap code signing, Code Signing là phương pháp “ký điện lử” vào các mã thực thí để
dâm bảo rằng các mã thực thí nảy chưa bị chỉnh sửa, thay dỗi nội dung tính từ thời điểm được ký
Code Signing đã được cài đặt trên nhiều nên tảng khác nhau như trên hệ thông định
dạng file thực thi của MierosoR Windows, NT Eramework, các ứng dung, Java,
extension của Firefox, trên cáu phiên bản nhân limux cũ (2.6.x ưở về trước) nhưng với các cập nhật nhân mới gắn đây 3.x thi vin chưa có lời giải hợp lý nào cho bai toan Code signing trén hé théng hệ điều hành nay Đây cũng có thế là một lỗ hồng để các
hacker Igi dung va khai thác trên hệ thống các hộ điển hành sử đụng phiên bản nhân
moi nay.
Trang 9Đây cũng chỉnh là lý do, tác giá lựa chọn dễ tải "Cơ chế bão mật mã thực thi trên Linuz” nhằm mục đích nghiên cứu, bổ sung co chế code sigring lên các phiên bản
nhân linux mới này từ đó hỗ trợ kiểm tra tỉnh toàn vẹn các nội dụng thực thị
Trong thời gian sáu tháng nghiên cứu và tìm hiểu vẻ mã nguắn lim kernel và các vẫn
dễ có liên quan đến tiến trình và file thuc Ohi trên hệ điều hành lnux, luận văn dã đưa
ra được định hướng tích hợp thành công cơ chế oode signing lên phiên bản linux kernel
3.10.10 trong đó, có xử lý kiểm tra các thư viện phụ thuộc có liên quan trực tiếp rong linux kernel.
Trang 10CHƯƠNG I1 - NHÂN LINUX VÀ CƠ CHE THUC THI
ỨNG DỤNG
1.1 Tổng quan về nhân linux
1.1.1 Dịnh nghĩa nhân ñnux
‘Trong lĩnh vục khoa học máy tính, đặc biệt là trong các nghiên cứu liên quan đến hệ thống, hệ điển hành, thuật ngữ nhân (kernel) dùng để chỉ phần “lõi” của bất cứ hệ thống máy tinh ndo hay nói theo cách khác là phần mềm hỗ trợ người đừng chia sẻ tải
nguyên máy tính Thuật ngũ kernel cũng có thể được biết đến như là phản quan trọng
nhất của hệ diễu hành
Nhân linux (limwx kernel) là phản nhân hệ thống hệ điển hanh Unix, duoc sit dung trên
Tất nhiều các bản phân phối lmux (Linux distribution) (ode hệ diều hành phát triển Lừ
nhân lim) Không như hệ thêng hệ điển hành Windows của Microsoft, nhên linux là mệt ví đụ nổi bội của phân mềm bự đo ma ngudén md (open source soflware)
Phiên bản nhân linux đầu tiên được phát triển vào năm 1991 bởi cậu sinh viên người
Phan Lan dang học chuyên ngành khoa học máy tỉnh trường Linus Tovards, Trong ba năm sau đó, ông tiếp tục nghiên cứu vả cho ra đời phiên bắn Linux 1,0 vào năm 1994
Thiên bản nảy được tung ra thị trường đưới bản quyền của GNU General Public License, đo đó, mã nguồn cla Linux 14 hoan toàn mở, bắt cứ øì cũng có thể lãi và xera
né
Khỏi dẫu, Linux kemel dược phát triển bởi những con người nhiệt huyết dam mê nghiên cứu Tuy nhiên với những đóng góp từ cộng đồng va ngudi ding, Linux kernel dàng ngày một phát triển và hiện nay dang thu hút sự hỗ trợ đầu tư của các công ty
9
Trang 11diện toàn hàng dâu trên thể giới như 1BM, HP (Hewlette-Packard) dông thời là một
thách thức cạnh tranh với các hệ điều hành thương mại như Windows của Microsoft
mặc dù số lượng phân cửng được hỗ trợ bởi Linux vin còn rất giới hạn sơ với các hệ điều hành này nhưng với sự ủng hộ nhiệt tỉnh từ cộng đồng, trong một tương lai không
xa, nhược diém nảy hoàn toàn có thế được khắc phục
Tlinh 1 User space & Kernel space
ác hệ điều hành hiện đại thường tách biệt không gian bộ nhỏ ão thành hai phan kernel spacc và user spacc nhằm mục dịch bão vệ các vùng nhớ khỏi các truy cập trái phép,
lỗi hệ thống Kernel space lá phần không gian bộ nhé cho phép linux kernel, module phần mỡ rộng và các module driver thiét bi thuc thi Neuoc lai, user space là phần
10
Trang 12không gian dễ chạy các phần mềm ứng dụng, thư viện và drivers duge sử dụng đễ
tương tác với kernel Khác với cáo ứng đụng trên Liser spaoe, được nạp trang những không gian địa chỉ ao, linux kernel duye nap vao kernel space trong mét khéng gian
dia chí riêng
Linux kernel c6 thé duge chia thành ba cấp Cấp cao nhất là giao điện các lời gợi hệ thống (System call interface), thực hiện các chức năng cơ bản như dọc ghi Cấp thấp hon la Kernel code, chủa các mã kemel không phạ thuộc vào kiến trúc (the arcluteclure-independent kernel code) 14 phan chung với tất cả các kiến trúc vị xử lý hỗ
trợ bởi Lánux Cấp thấp nhất là phẩn mã phụ thuộc vào kiến trúc (Architecture-
đependent kemel eode), là phần mã được việt riêng cho các kiến trúc phần cứng tương
img
Các thành phần chính của nhân linux bao gồm:
«Giao điện lời gọi hệ thông (System Call Tnterface): cung cập giao diện thực tú
các lời gọi chức năng từ User spacc xuống kernel space Thanh phan nay oé thé phục thuộc vào kiến trủc phản cứng, ngay cá khi sử dụng cùng họ vì xử lý
* Quan ly tién trinh (Process Management): thanh phân tập trung vào việc thực thì các tiền trình Trong kernel, đây dược gọi là các luồng thực tú và thể hiện cơ
chế äo hóa đặc biệt của vi xử lý (mã thực th, đữ liệu, stack và các thanh ghỉ CPU) Qua giao điện lời gọi hệ thống SCT, kernel cng ofp cée APT hé tng vide
tạo, giao tiếp, đống bộ và đừng cắc tiễn trình này Thánh phần này được sử dựng,
để chia sẽ CPL giữa các luông đang hoạt động
I
Trang 13© Quan ly bé nho (Memory Management): qua module mả phân cửng hỗ trợ dé
quản lý bộ nhớ, bộ nhớ được quản lý trong các trang (thường cỏ kích thước
4KP), bao gồm các phương tiện quản lý bộ nhở cũng như các cơ chế phần cứng
để ảnh xạ giữa bộ nhớ vật lý và bộ nhở ảo
¢ Virtual File System (VFS): cung cấp giao diễn chung để tương tác với các loại
file systems VES cung cấp một lớp trung gian giữa SCI va cac loai File System được Linux hỗ trợ
Virtual File System (VFS)
Phần trên của VFS cung cấp một giao diện các -4PI chung bao gồm các chức năng mở,
đóng, đọc ghỉ Phần đưới của LFS là sự trừu tượng các File System hay định nghĩa
cách mà các chức năng ở lớp trên thực thi Bên cạnh đỏ, buffer cache cung cdp một
tập các chức năng cho tầng hệ thông nhằm tôi tru truy' cập tới các thiết bị vật lý bằng
cách thực hiện cache đữ liệu.
Trang 14* Network Stack: dua theo một kiến trúc phân lớp theo chuẩn của các giao thức
TCPAP Trong đó, lớp TCP gino tiếp với SỚT thong qua cde socket, ede sockets sung cấp một tập các API cho cdc networking subsystem phục vụ việo quản lý
các kết nói, định hướng đữ liệu tới đích (endpoints)
® Device Drivers: 14 thành phẩn chủ yêu trong mã nguồn linux kerel, đặc lâ các
tích hợp các thiết bị hễ trợ như BlueTooth, 12C, Serial
œ© Architecture-depenđent code: đặc tả các thành phan phụ thuộc vao ha tang phan
System Call Interface (EC
Process Virtual File
‘Hinh 3 Kernel Subsystem
1.1.3 Sự phát triển của Linux Kernel
Các mốc lịch sử quan trọng:
® 1991: Linux kemel dược công bố vào ngày 25 tháng § bởi câu sinh viên 21 tuổi người Phần Lan Linus Benedict Torvards
13
Trang 151992: Linux kernel được tái cấp phép đưới giấy phép GNU GPL, ban phân phổi
linux đầu tiên được lạo
1993: Dã có hon 100 developers tham gia phát triển nhân linwx Với sự hỗ trợ
này, kemel hoàn toàn tương thích với môi trường GNU, nơi tập hợp rất nhiều
các ứng dụng tuơng tự Bần phần phối có nhất hiện may Slaekware cũng ra đời
trong năm này
1994: Trong tháng ba, Torvards tuyên bả tất oả các thành phản của nhân đã hoàn thiện: ông cho ra đời phiên bản Tảnux 1.0, phiên bản này chỉ hỗ trợ các hệ may tinh vi xứ lý đơn 1386 Cũng trong năm nảy, các cổng ty Red llat và SUSL
cũng xuất bản bản phân phổi Linux 1.0 của họ
1995: Linux duge port sang hai nén tang DEC Alpha va Sun SPARC Nhiéu năm sau đó, Linux được port sang rất nhiều các nên tảng khác
1996 : Phiên bản Linux kernel 2.0 được xuất bàn, hỗ trợ xử lý nhiều vi xử lý dang thei
1998 ; Rat nhiéu các công ty lớn như IBM, Compaq và Oracle tuyên bố hỗ trợ Linux, giao điện KIDL¿ cũng bắt đầu được phát triển
2003 : Phiên bản Linux Kernel 2.6 được xuất bân được tích hợp rất nhiều các
tỉnh năng xuới như hỗ ượ PAE, hỗ SELinux, Uscr-uode Litux vào nhánh chính
của mã nguằn kernel
2011 : Phiên bản nhân linux 3.0 được xuất bản với hơn 14 triệu đồng code
(14647033) và gần 40000 files trong project ma ngudin
Trang 16«2014: Tính đến tháng 3/2014, với đội ngũ hỗ trợ không lỏ, công đẳng phát triển
linux kernel di xudt bin phiên bản 3.14 và dang dâu hoền thiện phiên bâu Linux
kemel 3.2
Cách đánh số phiên ban linux kemel
Trong quá trình phát triển, nhân liaux có ba cách đánh số khác nhau
« Cách thử nhất được sử dụng theo định đạng « 1.0» Phiên ban đầu tiên của
kemel 1a 0.01, tiếp đó là 0.02, 0.03, 0.16, 0.11, 0.12 (GPL version), 0.95, 0.96, 0.97, 098, 0.99 và sau đó là L0
«_ Từ phiên bản L0 đến 2.6, cách đánh version theo kiểu « Á.B.C », trong đó A là phiên bản kernel, B là số phiên bán chỉnh stia lin cua kernel (major version), C
là sổ phiên bản chỉnh sửa nhỏ của kernel (minor version) Sẻ phiên bản chỉ được thay đổi khí kemel có sự thay đổi, điều chỉnh lém Đã có 3 lần thay đổi số version là 1994 (version 1.0), 1996 (version 2.0) và 2011 (version 3) Major revision được đánh số theo hệ thống quy luật even-odd system version
tương ứng với phiên bản ổn định) Minor revision được cập nhật lại mỗi khi có
ban cap nhat, fix bugs, thêm tính năng mới vào kemeL
Trang 17
ÑH Lnzit ME truc HE tne Lgdsled 2001/2814
Hinh 4 Timeline of Linux kernel version
16
Trang 181.1.4 Mã nguồn linux kernel
Đa số các bản phân phổi của linux đều đính kèm mã nguồn nhân linux trong các bộ cải
đặt của chúng Tuy nhiên đây thường chỉ là các bản kernel tại thời điểm phiên bản phân phổi này được nghiên cứu, chưa phải là phiên bản mới nhất của linux kernel
kemeLorg được biết đến là kho chứa chỉnh của mã nguồn linux kernel, nơi chứa tất cả
các phiên bản mã nguồn linux kernel., cung cấp môi trường cho các nhà phát triển
nhân, bảo trì các bản phân phôi của linux cũng lả server cung cấp những phiên bản linux kernel mới nhật cho cộng đông người dùng linux
Kemel.org hé tro nhiéu giao thire khac nhau để người dùng có thể kết nối và cập nhật
đữ liệu
"_ Giao thức HTTP (https/wvw kemeLorg/pub/)
= Giao thie truyén tai file FTP(ftp://ftp kernel org/pub/)
17
Trang 19"_ Giao thức dông bộ dữ liệu (rsync:/rsyne.kernel.org/pub/)
Mã nguồn lmux kernel dược tổ chức trong thư mục con /pub/linux/kernel:
weuples a-Feb-2014 - arte 13-Mar-2003 - zolects, 18-5ep~2012 -
sha2Sésuns acc 25-đan-2013 1
Hình 6 Cấu trúc thư mục con chữa mã nguồn Hnux kernel
được sắp xếp theo từng phiên bản, mãi phiên bản một thư mục (v1.0/, v1.1/, v1.2/,
v1.3⁄, v2.0/ ) trong mỗi thư mục là các phiên bản mã nguồn và các bản vá patch
tương ting voi phiên bân dỏ:
18
Trang 20Cé-Feb-2014 1 74H 13-Feb-2014 3 111H 1% Feb #014 2 age 19-Feb-2014 a Tay 20-Feb-2014 @ 121M 20-Feb-2014 8 B8E
30 Fcb 2011 8 74H
aa gặt
patch-3.0.6.25 33-Oe=-201- 97: 174E
'Hình 7 Cầu trúc thư mục Hmux kernel phiên bẵn x3
Mã nguễn linux kernel được nén theo định dang tar, bao gồm một tập hợp rat nhiéu file
và thư mục
19
Trang 21XE HJITIN?ZIWYPEDI313175
gERBEÊĐPñ 8 ì›3333ã3jBaA
Hình 8 Mã nguồn linux kernel
Thư mục arch: bao gồm nhieu thư mục con, mỗi thư mục con là một kiên trúc
cpu mã linux kernel hỗ trợ
Thư mục melude: bao gồm danh sách các header thư viện được sử dụng dé build
mã nguồn kernel, thư mục này cũng bao gồm nhiều thư mục con tương ứng với
các kiên trúc cpu khác nhau
Thư mục imit: Thư mục chứa mã nguồn khéi tao kernel
Thu mue mm: thu mục mã nguồn module quản lý bộ nhớ, ứng với mỗi kiên trúc CPU khác nhau, mã nguồn module nay được đặt trong các thư mục con
arch/*/mm (vi dụ: arch/i386/mm/)
Thư mục drivers: thư mục chửa mã nguồn các drivers thiết bị trong kernel
Thư mục ïpc: thư mục chửa mã nguồn module giao tiếp giữa các tiên trình trong
kernel
Thư mục modules: thư mục chứa các module đã được build (từ mã nguồn)
Thư mục fs: thư mục chứa mã nguôn các file system mả kernel hỗ trợ, bao gồm nhiều thư mục con, mỗi thư mục con tương ứng với một loại file system mà linux keel hé tro
20
Trang 22Thư mục kernel: th mục chửa mã nguồn chính của kernel, ứng với mỗi kiến trúc cpu khác nhau, mã nguồn medule này được đặt trong thư mục cơn
areh/*/kernel
Thư mục net: thư mục chửa mã nguồn các module network trong kernel
'Thư mục lib: thư mục chứa các thư việc của linux kernel, tương tự, ứng với mỗi kiến trủc CPU khác nhau, mã nguồn modnle này được đặt trong các tư mục
son tương thư mục arch: arch/*/lib/
Thư mục seripls⁄: thư mục chủa các soripls được sử dụng khi kemel được cấu hình,
Thr muc Documentation! thu nuạc chữa rât nhiều tài hiệu thông tin mô lả, cân
hinh kemel và các module
hư mục crypfo: thư mục chửa mã ngưồn các cryptographic API được sử dụng
bởi kernel
Thư mục seeurity/: thư mục chứa mã nguồn của các module bảo mật trong linux
bao gồm SE Linux (Security-Enhanced Linux), cé¢ module network hooking
'Thư mục sound/: thư mục chứa mã nguồn driver ârn thanh và các thiết bị tương,
Trang 231.2, Tiến trinh va file (hue thi trong linux
Tiền trình là thành phần chỉnh trong bắt cứ hệ điều hành da nhiệm nào, tiến trình thực thi các tác vụ trong hệ thông để giải quyết các bài toán do người dúng yêu cầu lo đỏ,
để nghiên cứn bảo mật mã thực thi, trước hết chủng ta phải nắm được tổ chức tiền trình
va cae file thye thi trong linux kemel
1.2.1 Tiên trình
Theo lý thuyết hệ điển hành trong khoa học máy tính: tiến trình được định nghĩa
iu sau:
“A process is an instance of a program in execution”
“Tiển trình là một inalance của một chương trình đang được thực thí"
Hiểu một cách dơn giân hơn, tiển trình là ánh xạ của một chương trình thực thi (dữ liệu trên ổ cứng) lên bộ nhớ Sâu hơn nữa, có thế hiểu tiên trình là một thực thể tiêu
tốn các tải nguyên hệ thống như CPU, bộ nhớ
Tiên trình ofing có quan hệ cha-eơn: một tiễn trình có cha là tiến trình thực hiện lời
gọi tạo ra nó, khi dó, tiễn trình nảy lá tiền trình con của tiền trình kia và ngược lại
hi một liền Irình được lạo, tiên trình mày đông nhất với tiến trình cha của nó Nó
nhận một bản sao logic không gian dịa chỉ nhớ tử tiến trình cha vả thực thi củng
một mã thực thi như tiến trình cha nhưng bắt dau từ cáo thục thí sau lời gọi hệ
thống tạo tiến trình (system call), Mặc dò tiến trinh cha và tiên trình cơn có †
sử dụng chung một trang nhớ dễ clrửa mã thực thì của chương trinh (program code)
nhưng mỗi tiến trinh đêu sử dụng các bản sao dữ liệu (bộ nhớ stack và heap) riêng,
nên thay đỗi từ tiễn trình con không ảnh hưởng tới tiễn trình cha và ngược lại
22
Trang 24'Trong mã nguồn của lnux kernel, tiễn trình thường, dược định nghĩa như các tasks
hoặc các threads
1.2.2 Lời gọi hệ thông (System call)
Hệ điều hành thường cung cấp cho các tiên tình chạy trong TJser Mode một lập cac interface để tương tác với các thiết bị phần cửng như PL, ỗ cứng, máy im
trằng bỏ sung vào giữa lâng ứng dụng và phần cứng thêm một lớp trung gian:
Executable
- Program Library Functions |x »| System Calls
Kernel
[zt
‘Hinh 9 Giao tiếp Application vol Hardware qua Idi gol hé thong
Các lời gọi hệ thống (syslem calls) được đội giãa ting dung va kernel, la thanh phan
“chuyén mach” tir Usermode > Kernelmode dé xit b) các tương tácvới tài nguyen
phần cứng
hò đó, các chương trình ứng đụng có tính chất portable hon, dé ding bién dich va
thực thì trên nhiều kemel khác nhau có củng chúng inlerfaces
23
Trang 25khi một tiên trinh từ LJser mode thực hiện lời gợi hệ thông, CPU dược chuyên quyền cho Kemel Mede và bắt đầu thực thị các hàm chức năng tương ứng trong nhân:
tmg (System call serviee routine), sau khi thành phần này thực biện xong, các câu hình
đữ liệu nêu trên được khôi phục từ Kernel Suack và CPU được chuyỄn tro lai User
made
1.2.3 Ma thuc thi (Excutable code)
Mã thực thi có thẻ được hiểu là mật dạng phân mềm có thế “chạy” được trong máy tinh
Hay nói các khác đó là các chuối đữ liệu được máy tính hiểu và biên địch thành các tác
vụ tính toán, thường thì chủng ta biểu đây là các mã máy (machine language)
Trong một hệ điều hành các mã thực thí thường là các chuối nhị phân nằm trong các
file thực thi (executable file) và thư viện hỗ trợ (ghared library) Khi có một thao táo
24
Trang 26kích hoạt nÏư người dùng tương tác trén giao điện quan lý, ra lệnh qua các cương,
trình shell, các znã thực thi này được nạp vào bộ nhớ và được dịch thành mã máy qua
con trổ lệnh
1.2.4 EHc thực thi (Exccutablc Fic}
File thực thủ là chương trình nằm trên ỗ cứng, chứa dây đủ thông tin cdc object code của các hàm chức năng và đũ liệu để thực thi chương trình Rất nhiều các hàm trong
Ble thực thủ được cùng cấp đưới các [ile thư viện (được link tĩnh hoặu nạp đồng khi
chương trình chạy)
Giả sử người dùng muốn thực thì một chương bình từ shell, thông gua dòng lệnh được: nhập vào, comwnand shell khởi tạo một tiền trình mới, trong đó lich hoạt lời gọi hệ
thông execveQ với đầu vào là đường dần đây đủ của chương trình Từ kernel, hàm xứ
lý chức nẵng tương ứng sụs_execve được kích hoạt, thực hiện tìm file tương ứng, kiểm
tra định dạng fủe thực thủ và cập nhật lại cầu hình thực thủ theo cấu tình được mô tả trong Je thực thì Khi lời gọi hệ thông thực thì xong, tiền trình thực thì cúc mã thực thí
được mô tả trong file thực th và thực hiện các chức năng lương ứng
1.2.5 Thư viện hỗ trợ (Shared libraries)
Như đã trình bảy ở trên, các tiến trình thực thỉ trên User mode có thể sử dụng các thư viện để thục hiện các lời gọi hệ thống xudng kernel Do dé, ngoài những mã tực tú được biên dịch trực tiếp từ mã nguồn của chương trình, chương trình còn có thể sứ
dụng các mã thục thi từ các thư viện mà chương trinh sử đựng
Có hai kiểu thư viện:
35
Trang 27« Thư viện tỉnh (static libraries): trong quá trình biên địch chương trình (có sử
dụng thư việu tĩnh), chương trình liên kết (uker) trực hiện liên kết cả các mã
thực thi của thư viện vào chương trình, điều nảy giúp cho chương trình có tính
chất đóng gới, chỉ cần một file chương trình đuy nhất có thể thực thì được, tuy nhiên sở dụng thư viện tĩnh cũng có nhược điềm là tiều tốn không gian lưu trữ của ở cửng khi nhiều chương trinh cừng sử dụng một thư viện tĩnh)
« _ Thưyiện động (shared libraries): trong quá trình biền địch chương trinh, chương trinh linker không thực hiện liên kết các mã thục thí của thư viện vào chương trinh mà chỉ đặt một tham chiếu tới tên thư viện, khi chương trình được thực thi,
thư viện sẽ được nạp lên vùng nhở của tiến trình Ưu điểm cửa dạng kiểu thư viện nảy là cung cấp cơ chẻ ảnh xạ bộ nhớ - file (le memory mapping) Khí chương trình liên kết động thực hiện liên lrết thư viện động vào tiến trình, các
mã thực thi của thư viện không bị copy vào chương trình mả chỉ thực hiện ánh:
xạ bộ nhớ phân thư viện tương ứng sang không gian bộ nhớ của tiên trình Mhờ vậy, sử đụng kiễu thư viện nay ít tấn không gian ổ cứng hơn se với thư viện tỉnh Tuy nhiên, nhược điểm của kiểu thư viện này là thời gian nạp của chương,
trinh thường chậm hơn so với các chương trình sử dụng thư vién tinh, do
chương trình phải thục tiện thêm các thao lắc nạp thư viện lên vững nhớ
1.2.6 Dinh dong file thyc thi
Môi chương bình được lưu tén 6 img dudi dang inél file thus thi (excculable file),
26
Trang 28phân tỉch cầu trúc định đạng file thực thị, kernel sẽ có được thông tin cầu hình khởi tạo tài nguyên hệ thống cho tiền trình
Dinh dang file thye thi chuẩn của Linux là định dạng HLI: (Ixeeutable and Linking, Format), duoc phat triển bởi các phòng nghiên cứu hệ thống LInix và nay được sử dụng,
rộng rỗi trong giới Unix Định đạng này là chuẩn chưng cho các file thuc thi, abject
code, thư viện chia sé (shared libraries) và các file core dumps
Trang 29* ELF header: nim ở đầu file (từ offset đầu tiên trong file) mô tả cấu trúc sắp xếp của cả file, bắt đầu với một giá tri kidu DWORD (magic number) tuong img voi
(ỚP 'T 17 *E' đừng để nhận đạng file din dang ELT
« Program header table: chita thang tin mồ tả câu hình để loader tién hành khỏi
lao Liên Irình:
* Section header table: chứa thông tin mỏ tả các sections, báng nảy bao gồm nhiều section entry, mdi section entry chira thang tin tén section, kich thước và vị trí
section trên [le và trên bộ nhớ
Dinh dang LLLF đã được sử dụng dé thay thể cho rất nhiều các định dạng thực thị cũ trong rất nhiều môi trường khác nhau, trong đó, nó thay thể cho định đạng sø.ouL và
COEF trong nhiều hệ diéu hanh nhu: Linux, Solaris, IRI, FreeBSD, NetBSD,
OpenBSD, Dragonfly BSD, Syllable, IP-UX, QNX Neutrino, MINIX Ngoài ra, định
dang này cũng dược chấp nhận trên nhiều hệ thông, hè diều hành khác nhu: OpenVMS
ban Hanium, BeOS ti phién ban 4 trở đi, Hailku, RISƠ O§ Liên cạnh đó, một vải hệ máy game consolss như PlayStation Portable, PlayStation 2, PlayStation 3, GP2X, TDreameasL, đameCuhe, Win và hệ diễu bành cho các thiết bị dì dộng như (Symbien
OS v9, Sony Ericsson, Siemens, Motorola, Bađa, Nokia, Android ) cũng sử dụng
định dang nay cho một số loại trên nên lắng Lương, ứng,
1.2.7 Quá trình thực thi một file
Hầu hết các hệ điều hành sử dụng cơ chế spawn để tạo một tiên trình mới với không, gian địa chỉ mới, cập nhật cầu hình từ Ñle thực thi và chạy những mã thục thi tương img Tuy nhién, Unix sử đụng một định hướng khác hẳn: khi một tiến trình tdồi được
28
Trang 30tạo khi một tiễn trinh dã tổn tại tạo bán sao của chỉnh nỏ Ngoại trừ process ID, tiễn trinh con nảy có cũng môi trường với tiến trình cha Quá trình nảy được gọi là farking
(phản nhánh)
Sau khi tiến trình được forking, không gian địa chỉ của tiền trình con bị ghỉ đè với đữ
liêu tiễn trình mới thông qua lời gọi hệ thống tới hàm exee
Cơ chế fork-amd-exee thực hiện chuyển những
âu lênh cũ sang những câu lệnh mới
tuy nhiễn môi trường tiên trình được thực thi vận giữ nguyên, bao gồm cau hình của các thiết bị đầu vào đâu ra, thông tin biến mỗi trường đây là cơ chế được sử dụng để tạo tiếu trình trong hệ điểu hành Linux, Tién trinh dầu tiêu init (proccss ID L) cũng tuân theo cơ chế nảy, tiên trinh này được tạo (forking) trong quả trình khởi động,
29
Trang 31trong khi không phải tiến trình init thực hiện khởi tạo tiễn trình này, Đỏ là trường hợp
tiến trình được gọi chạu ngắm (running in background) Khi 46, ngay cả khi Hến tình
cha kết thúc hoặc bị buộc phải kết thúc, tiễn trình con vẫn tiếp tục thực thí
~Xét dưới góc độ của lập trình viên:
Quá trình tac mét process trong Linux chia lam hai bude, si dung, hai ham API fork()
va exec():
30
Trang 32© Dau tién fork() được gọi đề tạo một tiến trình con, lả bản sao của task đang làm
việc (tiền trình cha) với giá trị PID (process ID) mới, giá trị PID của process géc
(gọi hàm forkQ) được cập nhật vào trường PPID của process mới
© Sau do exec() được gọi để nạp thông tim thực thi vào không gian địa chỉ mới và
tiến hành chạy các mã thực thi tương img,
Hình 13 Tạo tiến trình dưới góc độ hệ thông
Trong dé exec()/fork() dai điện chung cho các hàm chức năng tường tự trên usermode
Từ góc độ một lập trình viên, ta thây một tiên trình đơn giản được tạo thông qua các lời
gọi tới các hảm API được cung cáp bởi linux kernel, thông qua các lời gọi hệ thông các tham sỏ cầu hình tương ứng được truyền tới các hàm xử lý trong linux kernel Cụ thẻ,
ta thay hảm forkQ sẽ thực hiện truyền tham số từ usermode > kernelmode thông qua
fork() => sys forkQ >3 do forkQO, do fork() sẽ xử lý các chức năng tương ứng trong
kernel đề tiền hành khởi tạo môi trường cho tiền trình mới Tương tự, với exec(), các
31
Trang 33tham số câu hình sẽ được truyền từ usermode => kemelrmode thông qua luồng làm việc
sau:
exec() sys execve() > do_execve() > do_execve_common()
Trong d6, do_execve_common sé tién hanh nap cae cau hình thực thi mới của tiến
trinh tir filesystem lén b6 nho voi luéng lam việc như sau:
Hình 14 Luỗng khởi tạo cấu hình thực thi mới
Linux kemel định nghĩa một câu trúc linux binũnt để quản lý chung các module thực
thi được hỗ trợ (kernel module, ñle thực thi, thư viên, coredump) Mỗi khi một module thực thi muốn được nạp lên bỏ nhớ sẽ phải thông qua cầu trúc nảy đẻ ảnh xạ các cầu hình thực thi từ filesystem lên bỏ nhớ
¢ load elf bimary: được sử dụng đề ánh xạ các câu hình thực thi của file thực thì
lên bộ nhớ
3