Có 3 thành phần chính trong một hệ thống Embedded Linux, đó là bootloader, kernel và root filesystem. Chương trình mã nguồn được viết xong, thứ tự tiếp theo là biên dịch (compile), sau đó sẽ được download các file kết quả lên một flash memory.
51
Hình 3-4: Sơ đồ bộ nhớ trên board HDR3 sử dụng MPC860 và Embedded Linux 3.2.1.1 Bootloader
Trong một hệ thống embedded, không tồn tại firmware giống như CMOS của PC. Vì vậy để khởi động một hệ thống embedded, chúng ta phải xây dựng bootloader. Bootloader là một phần rất quan trọng trong hệ thống embedded. Chức năng của bootloader như sau:
Copy kernel từ flash memory đến RAM và thực thi kernel Khởi tạo phần cứng
Bootloader cũng bao gồm chức năng ghi data đến flash memory (download kernel hoặc ram disk image đến flash memory bằng serial port hoặc network hardware)
52 Cung cấp giao tiếp để gửi lệnh đến target board hoặc nhận về trạng thái của target board
Vivi là bootloader được hãng MIZI research, Inc. (Korea) xây dựng riêng cho dòng xử lý ARM.
u-boot cũng là bootloader được xử dụng rộng rãi trong các hệ thống Embedded Linux (u-boot được xây dựng cho ARM hoặc u-boot được xây dựng cho PPC860)
Khi xây dựng u-boot cần phải viết chương trình khởi tạo, đọc/ghi flash memory, điều khiển các tín hiệu dùng để download file cấu hình cho FPGA (nếu dùng Xilinx FPGA trên board), cấu hình các thanh ghi cho MCU, … Thông thường, để xây dựng bootloader, người ta thường dùng các thư viện có sẵn, sau đó sửa đổi lại để phù hợp với hardware của target board.
Nếu là một board mới hoàn toàn (tức là vừa được lắp ráp xong và chưa có u-boot trong flash memory) cần phải dùng thiết bị BDM (Background Debug Mode) hoặc JTAG debugger để download bootloader tới flash memory. Trình điều khiển thiết bị BDM (JTAG debugger) có thể chạy trong Windows hoặc Linux nhưng thường trình điều khiển chạy trong Windows được ưa chuộng hơn. Thiết bị này thường được bán kèm target board. Một trong các thiết bị được ưa chuộng là DBI2000 (High-speed BDM and JTAG interfaces) của hãng Abatron
3.2.1.2 Kernel
Kernel là thành phần chính của hệ điều hành Linux, quản lý các tác vụ (task management), quản lý bộ nhớ (memory management), I/O (I/O management), timer (timer management), giao tiếp với các API (application programming interface…
53
Hình 3-5: Cấu trúc của hệ điều hành Linux
Trong hệ thống Embedded Linux, việc cấu hình kernel được thực hiện bằng cách dùng lệnh “make menuconfig”. Sau đó lựa chọn các module cần thiết cho kernel bởi hệ thống menu. Sau khi đã cấu hình kernel, thực hiện việc build kernel bằng lệnh “make zImage” (đối với ARM9) hoặc “make uImaze” (đối với MPC860). File cuối cùng nhận được sẽ là zImage hoặc uImage. File này sẽ được download tới flash memory.
54
Hình 3-6: Cấu hình kernel 3.2.1.3 Root Filesystem
Linux cung cấp nhiều loại filesystem hơn bất kỳ hệ điều hành nào. Filesystem được tách riêng thành 3 lớp cơ bản, bao gồm:
Filesystem được được đặt trên thiết bị nối trực tiếp đến hardware của hệ thống embedded (ví dụ như đĩa cứng, thẻ nhớ, v.v…)
Netword file system dùng protocol tiêu chuẩn như là NFS
Filesystem đặc biệt nằm trong bộ nhớ được biết đến như là initial RAM disk Root filesystem phải chứa mọi thứ cần thiết để hỗ trợ hệ điều hành Linux. Cấu trúc thư mục của root filesystem như sau:
/proc Proc filesystem.
/etc System configuration file /sbin System binaries
/bin Basic binaries /lib Shared Libraries /mnt Mount point
55 /usr Additional utilities và applications
Và một số thư mục khác như là: /dev /home /lost+found /opt /root /tmp
Có nhiều dạng initial RAM disk (initrd): Cramfs (Compressed ROM file system), Cramfs được thiết kế nhỏ gọn, dung lượng không vượt quá 256MB. JFFS (Journalling Flash File System), …Quá trình xây dựng một ram disk image ngay từ đầu tương đối phức tạp. Do vậy người ta thường dùng các thư viện có sẵn (được cho dưới dạng file nén, ví dụ: initrd.gz), sau đó giải nén, chép thêm các device driver và ứng dụng vào, thêm hoặc sửa đổi một số file, thư mục cần thiết. Cuối cùng, dùng các công cụ để nén và chuyển file nén thành dạng image để download tới flash memory.