Android là hệ điều hành mã nguồn mở dựa trên Linux, x86 ( x86 là một loạt các kiến trúc bộ vi xử lý máy tính dựa trên CPU Intel 8086) là hệ thống mà hạt nhân linux được triển khai nhiều nhất tuy nhiên các thiết bị Android đang chạy trên tiến trình ARM (thường được gọi là Advanced RISC Machine, trước đây gọi là Acorn RISC Machine) trừ thiết bị Xolo của Intel. Xolo đi kèm với bộ vi xử lý Atom 1.6GHz x86. Quá trình khởi tạo Android có thể nói là thiết bị nhúng hoặc ARM dựa trên linux có sự khác biệt nhỏ so với phiên bản máy tính để bàn [8].
Quá trình khởi tạo của hệ điều hành Android gồm thành 6 bước khác nhau, đây chính là việc tối ưu hóa quá trình khởi tạo một hệ thống nhúng. Thiết bị Android sẽ được thực hiện theo các bước hình 2.6 dưới đây sau khi nhấn khởi động [8].
Bước 1: Boot Rom
Khi bắt đầu bấm vào nút khởi động thực thi một thiết bị Android là thực hiện một đoạn mã chương trình chứa trong Rom. Chương trình có nhiệm vụ tìm phân vùng đầu tiên của Boot Loader và tải vào trong Ram và thực hiện mã lệnh.
Bước 2: Boot Loader
BootLoader là chương trình nhỏ chạy trước khi chạy chương trình Android. BootLoader là chương trình đầu tiên chạy trên bo mạch và bộ vi xử lý. Nhà sản xuất thiết bị sử dụng các bộ nạp khởi động phổ biến như bộ nạp khởi động redboot, uboot, qi hoặc họ phát triển các bộ nạp khởi động riêng.
BootLoader thực thi theo 2 giai đoạn, giai đoạn đầu tiên có nhiệm vụ nhận biết RAM bên ngoài và tải chương trình giúp giai đoạn thứ hai. Giai đoạn thứ 2 bootloader khởi tạo và thiết lập mạng, bộ nhớ,... trong đó có yêu cầu để chạy kernel, bootloader có thể cung cấp các thông số cấu hình hoặc các đầu vào kernel cho mục đích cụ thể và tải kernel lên RAM.
Bước 3: Kernel
Tương tự như máy tính để bàn sau khi kernel được tải lên RAM, các điều khiển trong kernel được thực thi để khởi tạo các điều khiển ngắt, các điều khiển khởi tạo bộ nhớ, khởi tạo bộ nhớ đệm và scheduling (lập kế hoạch). Sau cùng trình điều khiển kernel sẽ tìm tiến trình init trong file hệ thống và thực thi nó.
Bước 4: Init process
Tiến trình Init là tiến trình đầu tiên được thực thi, chúng ta có thể nói rằng nó là tiến trình gốc của tất cả các tiến trình. Tiến trình Init có hai trách nhiệm, một là gắn kết
27
các thư mục như /sys, /dev, / proc và hai là chạy kịch bản init.rc thực chất là đoạn script mô tả các dịch vụ hệ thống, file hệ thống … được viết theo ngôn ngữ riêng.
-Tiến trình init có thể tìm thấy tại : <android source>/system/core/init
Hình 2.6: Quá trình khởi tạo Android từ nhân Linux
Bước 5: Zygote and Dalvik
Trong Java, chúng ta được biết trong mỗi trường hợp máy ảo riêng sẽ được sử dụng trong bộ nhớ cho mỗi ứng dụng riêng biệt. Còn trong ứng dụng của Android thì các ứng dụng cần được khởi động càng nhanh càng tốt, nhưng nếu HĐH Android khởi động theo các trường hợp khác nhau của máy ảo Dalvik cho các ứng dụng như Java thì nó sẽ tiêu thụ rất nhiều bộ nhớ và thời gian. Vì thế, để khắc phục được vấn đề này hệ điều hành Android đưa ra một hệ thống có tên là Zygote (hợp tử). Zygote có thể được chia sẻ mã trên máy ảo Dalvik, bộ nhớ thấp hơn và thời gian khởi động tối thiểu. Zygote là một tiến trình máy ảo bắt đầu lúc khởi động hệ thống như ở bước 5, sau đó
28
tải trước và khởi tạo các lớp thư viện lõi. Thông thường các lớp thư viện lõi là read- only và một phần của nền các tảng cốt lõi hoặc Android SDK.
Bước 6: System Server and Services
Sau khi hoàn thành các bước trên, thời gian chạy yêu cầu Zyote khởi động hệ thống các máy chủ. Các System Server có thể xem như một tiến trình. Hệ thống máy chủ giống nhau có sẵn được coi như là các System Service trong Android SDK. Hệ thống máy chủ chứa tất cả các dịch vụ hệ thống.
Zygote chia ra nhiều nhánh tiến trình mới để khởi động dịch vụ hệ thống. Ta có thể tìm mã nguồn trong lớp ZygoteInit và phương thức startSystemServer. Sau khi quá trình tải các dịch vụ Android hoàn tất. Thông báo ACTION_BOOT_COMPLETED sẽ được phát ra, người sử dụng có thể thấy thông báo này để tải các dịch vụ của người sử dụng từ các ứng dụng.