Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 90 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
90
Dung lượng
2,02 MB
Nội dung
ĐẠI HỌC QUỐC GIA TP HCM TRƯỜNG ĐẠI HỌC BÁCH KHOA NGUYỄN PHAN THIỆN BÁCH NGHIÊN CỨU VÀ HIỆN THỰC BAREBOX BOOT LOADER TRÊN NỀN TẢNG x86 Chuyên ngành: Khoa học máy tính số: 604801 LUẬN VĂN THẠC SĨ TP HỒ CHÍ MINH, tháng năm 2012 CƠNG TRÌNH ĐƯỢC HOÀN THÀNH TẠI TRƯỜNG ĐẠI HỌC BÁCH KHOA –ĐHQG -HCM Cán hướng dẫn khoa học: TS Đinh Đức Anh Vũ (Ghi rõ họ, tên, học hàm, học vị chữ ký) Cán chấm nhận xét 1: TS Vũ Đức Lung (Ghi rõ họ, tên, học hàm, học vị chữ ký) Cán chấm nhận xét 2: TS Nguyễn Đức Thái (Ghi rõ họ, tên, học hàm, học vị chữ ký) Luận văn thạc sĩ bảo vệ Trường Đại học Bách Khoa, ĐHQG Tp HCM ngày 18 tháng năm 2012 Thành phần Hội đồng đánh giá luận văn thạc sĩ gồm: (Ghi rõ họ, tên, học hàm, học vị Hội đồng chấm bảo vệ luận văn thạc sĩ) TS Trần Ngọc Thịnh (CT) TS Vũ Đức Lung (PB1) TS Nguyễn Đức Thái (PB2) TS Đinh Đức Anh Vũ (UV) TS Hoàng Trang (TK) Xác nhận Chủ tịch Hội đồng đánh giá LV Trưởng Khoa quản lý chuyên ngành sau luận văn sửa chữa (nếu có) CHỦ TỊCH HỘI ĐỒNG TRƯỞNG KHOA………… Trang ii ĐẠI HỌC QUỐC GIA TP.HCM CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM TRƯỜNG ĐẠI HỌC BÁCH KHOA Độc lập - Tự - Hạnh phúc NHIỆM VỤ LUẬN VĂN THẠC SĨ Họ tên học viên: Nguyễn Phan Thiện Bách MSHV: 09070421 Ngày, tháng, năm sinh: 20/04/1986……………………Nơi sinh: Tp Hồ Chí Minh Chuyên ngành: Khoa học máy tính Mã số: 604801 I TÊN ĐỀ TÀI: Nghiên cứu thực Barebox boot loader tảng x86 II NHIỆM VỤ VÀ NỘI DUNG: - Tìm hiểu qui trình khởi động Linux OS - Nghiên cứu tổng quan boot loader (Uboot, Redboot, LILO, ) - Đề xuất ý tưởng xây dựng boot loader - Thiết kế thực boot loader - Kiểm tra đánh giá III NGÀY GIAO NHIỆM VỤ : 06/02/2012 IV NGÀY HOÀN THÀNH NHIỆM VỤ: 30/06/2012 V CÁN BỘ HƯỚNG DẪN (Ghi rõ học hàm, học vị, họ, tên): TS Đinh Đức Anh Vũ Tp HCM, ngày tháng năm 2012 CÁN BỘ HƯỚNG DẪN CHỦ NHIỆM BỘ MÔN ĐÀO TẠO (Họ tên chữ ký) (Họ tên chữ ký) TRƯỞNG KHOA….……… (Họ tên chữ ký) Ghi chú: Học viên phải đóng tờ nhiệm vụ vào trang tập thuyết minh LV Trang iii LỜI CẢM ƠN Đầu tiên, em xin cảm ơn thầy Đinh Đức Anh Vũ đ tận tình hướng dẫn em suốt thời gian làm luận văn vừa qua Em cảm ơn thầy, cô khoa Khoa học & kĩ thuật máy tính, trường đại học Bách khoa - đại học quốc gia tp.Hồ Chí Minh đ hướng dẫn, giúp đỡ em thực luận văn Cuối cùng, em cảm ơn anh, chị , bạn học lớp đ tận tình giúp đỡ, bảo kinh nghiệm để em thực tốt luận văn Tháng năm 2012 Học viên Thiện Bách Trang iv TÓM TẮT Boot loader (chương trình nạp khởi động) chương trình phần mềm chạy sau hệ thống khởi động Nó nạp lên nhớ BIOS (đối với PC) askRO (đối với hệ thống nhúng) Nhiệm vụ boot loader chuẩn bị môi trường cần thiết cho hệ điều hành khởi động Để nghiên cứu boot loader, đối tượng lựa chọn boot loader mã nguồn mở Linux dễ dàng lấy mã nguồn tài liệu liên quan đến việc phát triển boot loader Barebox boot loader hỗ trợ nhiều tảng khác với nhiều tính Có cấu trúc giống nhân Linux với mơ hình trình điều khiển (driver) lấy từ Linux hệ thống file, điều đ làm cho đ quen thuộc với lập trình Linux dễ tìm hiểu phát triển Barebox Luận văn trình bày việc tìm hiểu cấu trúc Barebox thực phiên Barebox cho tảng x86, qua cung cấp phiên Barebox chạy máy tính mà người sử dụng để nghiên cứu Kết quả, với phần lớn cơng việc cần làm viết trình điều khiển thiết bị mới, phiên Barebox chạy x86 đ hồn thành boot Linux từ ổ USB Trang v ABSTRACT Boot loader is the first software runs after system power on It is loaded onto memory by BIOS (on PC) or MaskROM (on embedded system) Its main task is environment preparation for OS boot up To investigate about boot loader, the open source boot loader for Linux were chosen because their release packets and materials related to boot loader development could be gotten easily Barebox is a open source boot loader supporting multi-platform with special features Like Linux kernel, Barebox has diver model borrowed form Linux and has file system so it’s easy to understand and develop with developers who have worked with Linux kernel This thesis includes the investigation of Barbox structure and process of porting Barebox to x86 to provide a version of Barebox run on PC that can be used for investigation As a result, new version of Barebox on x86 can boot Linux from USB flash drive, although the main task is just creating new driver Trang vi LỜI CAM ĐOAN CỦA TÁC GIẢ LUẬN VĂN Tôi xin cam đoan cơng trình nghiên cứu tơi, có hỗ trợ từ giáo viên hướng dẫn tiến sĩ Đinh Đức Anh Vũ Các nội dung nghiên cứu kết đề tài trung thực chưa công bố cơng trình nghiên cứu trước Nếu phát có gian lận tơi xin hoàn toàn chịu trách nhiệm trước hội đồng, kết luận văn Tháng năm 2012 Học viên Thiện Bách Trang vii MỤC LỤC LỜI CẢM ƠN iv TÓM TẮT v ABSTRACT vi LỜI CAM ĐOAN CỦA TÁC GIẢ LUẬN VĂN vii MỤC LỤC viii DANH MỤC CÁC TỪ VIẾT TẮT xi DANH MỤC BẢNG BIỂU xii DANH MỤC HÌNH ẢNH xiii CHƯƠNG TỔNG QUAN VỀ ĐỀ TÀI 1.1 Hình thành vấn đề 1.2 Lý chọn đề tài 1.3 Phạm vi nghiên cứu 1.4 Đối tượng nghiên cứu 1.5 Mục tiêu đề tài 1.6 Ý nghĩa đề tài 1.7 Kết cấu đề tài CHƯƠNG CƠ SỞ LÝ THUYẾT 2.1 Tổng quan boot loader 2.2 Cơ sở lý thuyết 2.3 Các kết nghiên cứu liên quan 2.4 ô hình đánh giá 10 2.5 Quy trình phương pháp nghiên cứu 10 CHƯƠNG HIỆN THỰC VÀ THỰC NGHIỆM 11 3.1 Tổng quan Barebox boot loader 11 3.1.1 Giới thiệu Barebox boot loader 11 Trang viii 3.1.2 Những tính bật Barebox: 12 3.1.3 Các thành phần Barebox 14 3.1.4 Quá trình khởi tạo Barebox 16 3.1.5 Các lệnh Barebox 19 3.1.6 Biên dịch Barebox 24 3.2 Hiện thực Barebox tảng x86 25 3.2.1 Quá trình thực thi Barebox tảng x86 25 3.2.2 Thực trạng Barebox tảng x86 30 3.2.3 Sửa lỗi biên dịch cho Barebox 31 3.2.4 Thêm cấu hình Barebox tảng x86 35 3.2.5 Hiện thực trình điều khiển để tương tác với Barebox thơng qua hình bàn phím 40 3.2.6 Sửa lỗi cho trình điều khiển ổ đĩa 43 3.2.7 Chỉnh sửa lại công cụ ghi Barebox lên ổ đĩa 45 3.3 Kiểm thử Barebox tảng x86 47 3.3.1 Cấu hình phần cứng để chạy Barebox 47 3.3.2 Kiểm thử cho trình điều khiển hình bàn phím 47 3.3.3 Kiểm thử cho trình điều khiển ổ đĩa 47 3.3.4 Kiểm thử cho lệnh Barebox 48 3.3.5 Kiểm thử boot Linux ổ đĩa USB 48 CHƯƠNG KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 49 TÀI LIỆU THAM KHẢO 50 PHỤ LỤC 52 A Mã nguồn board myPC: tập tin generic.c 52 B Mã nguồn trình điều khiển serial_pc_console 53 C Mã nguồn tập tin /barebox-XXX/scripts/setupmbr/setupmbrBK.c 61 D Quá trình khởi tạo Barebox tảng ARM 67 a- Hàm reset() 67 Trang ix b- Hàm board_init_lowlevel_return () 69 c- Hàm do_bootm () 71 d- Hàm map_image () 72 e- Hàm do_bootm_linux () 73 f- Hàm start_linux () 75 LÝ LỊCH TRÍCH NGANG 76 Trang x } rc = check_for_valid_mbr(barebox_image, sb.st_size); if (rc != 0) { fprintf(stderr, signature\n"); "barebox image seems not valid: Bad MBR goto on_error_hd; } /* * the persistant environment storage is in front of the main * barebox image To handle both, we need more space in front of the * the first partition */ required_size = sb.st_size + pers_sector_count * SECTOR_SIZE; /* the hd image will be modified */ hd_image = mmap(NULL, required_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_hd, 0); if (hd_image == MAP_FAILED) { perror("mmap"); rc = -1; goto on_error_hd; } /* check for space */ rc = check_for_space(hd_image, required_size); if (rc != 0) goto on_error_space; /* embed linux image into the disk drive image */ memcpy(hd_image + SECTOR_SIZE*2, linux_image, sl.st_size); /* embed barebox's boot code into the disk drive image */ memcpy(hd_image, barebox_image, OFFSET_OF_PARTITION_TABLE); Trang 62 /* * embed the barebox main image into the disk drive image, * but keep the persistant environment storage untouched * (if defined), e.g store the main image behind this special area */ memcpy(hd_image + ((pers_sector_count + 1) * SECTOR_SIZE), barebox_image + SECTOR_SIZE, sb.st_size - SECTOR_SIZE); /* now, prepare this hard disk image for BIOS based booting */ embed = hd_image + PATCH_AREA; indirect = hd_image + ((pers_sector_count + 1) * SECTOR_SIZE); /* * Fill the embedded DAPS to let the basic boot code find the * indirect sector at runtime */ #ifdef DEBUG printf("Debug: Fill in embedded DAPS\n"); #endif rc = fill_daps(embed, 1, INDIRECT_AREA, INDIRECT_SEGMENT, + pers_sector_count); if (rc != 0) goto on_error_space; debugout(embed, 1); #ifdef DEBUG printf("Debug: Fill in indirect sector\n"); #endif /* * fill the indirect sector with the remaining DAPS to load the * whole barebox image at runtime */ rc = barebox_linear_image(indirect, sb.st_size, pers_sector_count); if (rc != 0) goto on_error_space; /* Trang 63 * TODO: Replace the fixed LBA starting number by a calculated one, * to support barebox as a chained loader in a different start * sector than the MBR */ rc = store_pers_env_info(embed, 1, pers_sector_count); if (rc != 0) goto on_error_space; on_error_space: munmap(hd_image, required_size); on_error_hd: munmap((void*)barebox_image, sb.st_size); munmap((void*)linux_image, sl.st_size); return rc; } int main(int argc, char *argv[]) { int rc = 0, c; char *barebox_image_filename *linux_image_filename = NULL; = NULL, *hd_image_filename = NULL, int fd_barebox_image = 0, fd_hd_image = 0, fd_linux_image = 0; long barebox_pers_size = -1; if (argc == 1) { print_usage(argv[0]); exit(0); } /* handle command line options first */ while (1) { c = getopt(argc, argv, "l:m:d:s:hv"); if (c == -1) break; switch (c) { Trang 64 case 's': barebox_pers_size = strtol(optarg, NULL, 0); break; case 'm': barebox_image_filename = strdup(optarg); break; case 'd': hd_image_filename = strdup(optarg); break; case 'l': linux_image_filename = strdup(optarg); break; case 'h': print_usage(argv[0]); rc = 0; goto on_error; case 'v': printf("setupmbr for u-boot-v%s\n", UTS_RELEASE); printf("Send 'barebox@lists.infradead.org'\n"); bug reports to rc = 0; goto on_error; } } if (barebox_image_filename == NULL) { print_usage(argv[0]); rc = -1; goto on_error; } fd_barebox_image = open(barebox_image_filename, O_RDONLY); if (fd_barebox_image == -1) { fprintf(stderr, "Cannot open '%s' for reading\n", barebox_image_filename); rc = -1; goto on_error; } Trang 65 fd_hd_image = open(hd_image_filename, O_RDWR); if (fd_hd_image == -1) { fprintf(stderr, "Cannot open '%s'\n", hd_image_filename); rc = -1; goto on_error; } fd_linux_image = open(linux_image_filename, O_RDWR); if (fd_hd_image == -1) { fprintf(stderr, "Cannot open '%s'\n", linux_image_filename); rc = -1; goto on_error; } if (barebox_pers_size < 0) barebox_pers_size = 0; rc = barebox_overlay_mbr(fd_barebox_image, fd_linux_image, barebox_pers_size); fd_hd_image, on_error: if (fd_barebox_image != -1) close(fd_barebox_image); if (fd_hd_image != -1) close(fd_hd_image); if (barebox_image_filename != NULL) free(barebox_image_filename); if (hd_image_filename != NULL) free(hd_image_filename); return rc; } Trang 66 D Quá trình khởi tạo Barebox tảng ARM a- Hàm reset() Hàm reset() file \barebox-XXX\arch\arm\cpu\start.c hàm chạy barebox.bin nạp set the cpu to SVC32 mode arch_init_lowlevel() mmu_cache_flush disable MMU stuff and caches board_init_lowlevel() board_init_lowlevel_return() Option Hình 4.1 Hàm reset() Trang 67 Hàm arch_init_lowlevel() hàm board_init_lowlevel() hàm dành cho người phát triển thực, có khơng tùy theo cấu hình hệ thống Nếu tảng ARM mà CPU SoC ARM chuẩn, người phát triển cần thực hàm arch_init_lowlevel() để cấu hình CPU cho (như cấu hình cho cache, ) Hàm board_init_lowlevel() hàm để kích hoạt mô đun phần cứng hệ thống (như GPIO, CPG, RA ) đảm bảo cho mô đun sau hoạt động Tuy nhiên driver dành cho mô đun khởi tạo hết cấu hình hay chương trình chạy trước Barebox đ làm cơng việc ta khơng cần thực hàm board_init_lowlevel() Để boot hệ điều hành sau này, CPU ARM cần phải chế độ supervisor phải vơ hiệu hóa cache, thêm với chương trình boot loader ta cần dùng địa vật lý đủ nên ta tắt MMU Tất bước Barebox làm sẵn hàm reset() Trang 68 b- Hàm board_init_lowlevel_return () Setup the stack relocate to link address if necessary call start_barebox with its absolute address Hình 4.2 Hàm board_init_lowlevel_return() Vì Barebox sử dụng địa vật lý hàm liên kết với địa tuyệt đối Khi nạp lên nhớ, địa hàm trỏ Barebox lúc khơng cịn lúc biên dịch, điều làm cho hoạt động Barebox bị sai Để khắc phục vấn đề này, Barebox có chế để dời tồn nội dung đ nạp sang vị trí đ định lúc biên dịch, vị trí đánh dấu địa bắt đầu có tên TEXT_BASE người phát triển Barebox định trước biên dịch Khi Barebox phát địa hàm reset() - địa bắt đầu Barebox sau nạp- khơng địa TEXT_BASE, dời tồn nội dung sang địa với địa bắt đầu TEXT_BASE trình gọi “relocate to link address” Hình minh họa cho trình này: Trang 69 Hình 4.3 Minh họa cho trình tái xếp nhớ Barebox Cũng boot loader khác, trình boot Linux Barebox đơn giản nạp nhân Linux (Linux kernel) vào nhớ, chạy Linux kernel Barebox cung cấp sẵn tính boot nhân Linux loại uImage, tính thực tập tin barebox-XXX\commands\bootm.c Trang 70 Hàm bắt đầu để boot uImahe do_bootm(): c- Hàm do_bootm () Collect options from registered handlers Get image data map_image() disable_interrupts loop through the registered handlers if (image_get_os(os_header) == handler->image_type) handler->bootm(&data); Report error: Release memory by call: unmap_image() Hình 4.4 Hàm do_bootm() Ở hình trên, gọi hàm handler->bootm(&data) rồi, thành cơng Linux boot khơng thể chạy dịng lệnh hàm do_bootm () Do đó, ta đặt việc xử lý lỗi sau gọi hàm handler->bootm(&data) (nh n “Report error”) Chi tiết hàm gọi hàm do_bootm() thể phần Trang 71 d- Hàm map_image () Đây hàm quan trọng trình boot, hàm kiểm tra đắn ảnh uImage lấy nội dung Linux kernel (hay zImage) Get file descriptor: fd =open(filename, O_RDONLY) Get header of uImage read(fd, header, image_get_header_size()) [image_get_magic(header) != IH_MAGIC] Get checksum of header: checksum = image_get_hcrc(header) Processing error crc32(0, (uchar *)header, image_get_header_size()) != checksum Get data of uImage read(fd, handle->data, len) crc32 (0, handle->data, len) != image_get_dcrc(header) close(fd) return handle Hình 4.5 Hàm map_image() Trang 72 e- Hàm do_bootm_linux () Tùy vào loại tảng CPU mà có thực hàm bootm khác Với loại ARM CPU hàm bootm do_bootm_linux() thực tập tin \bareboxXXX\arch\arm\lib\bootm.c Việc gán hàm do_bootm_linux() cho handler->bootm thực tập tin sau: static struct image_handler handler = { cmdline_options = "a:R:", cmdline_parse = image_handle_cmdline_parse, help_string = " -a use architecture number \n" " -R use system revison \n", bootm = do_bootm_linux, image_type = IH_OS_LINUX, }; Trang 73 Hiện thực hàm do_bootm_linux() sau: Declare: void (*theKernel)(int zero, int arch, void *params) theKernel = (void *)image_get_ep(os_header); relocate_image(data->os, (void *)image_get_load(os_header)) Get checksum of header: checksum = image_get_hcrc(header) Return -1 data->initrd start_linux(theKernel, 0, data) Hình 4.6 Hàm do_bootm_linux() Trang 74 f- Hàm start_linux () Declare: void (*kernel)(int zero, int arch, void *params) = adr; setup_tags(data, swap) shutdown_barebox() Jump to Linux kernel kernel(0, armlinux_architecture, armlinux_bootparams) Hình 4.7 Hàm start_linux() Khi gọi hàm kernel(0, armlinux_architecture, armlinux_bootparams), làm việc sau đây: Gán ghi r0 = Gán ghi r1 = armlinux_architecture (là số integer, tham khảo tron tập tin \barebox-XXX\arch\arm\tools\mach-types) Gán ghi r2 = địa chứa thông số dành cho Linux kernel Gán ghi pc = giá trị adr Trang 75 LÝ LỊCH TRÍCH NGANG Họ tên học viên: Nguyễn Phan Thiện Bách Ngày, tháng, năm sinh: 20/04/1986 Nơi sinh: Hồ Chí Minh Địa liên lạc: 158A25 Lê Lợi, phường 3, quận Gò Vấp, Hồ Chí Minh Q TRÌNH ĐÀO TẠO (Bắt đầu từ Đại học đến nay) Từ năm 2004 đến 2009: Sinh viên khoa Khoa học kỹ thuật máy tính, trường đại học Bách Khoa - đại học quốc gia Tp Hồ Chí Minh Từ năm 2009 đến nay: Học viên cao học khoa Khoa học máy tính, trường đại học Bách Khoa - đại học quốc gia Tp Hồ Chí Minh Q TRÌNH CƠNG TÁC (Bắt đầu từ làm đến nay) Từ năm 2009 đến nay: Kỹ sư phần mềm công ty Renesas Việt Nam Trang 76 ... Linux chạy tảng x86 đ có sẵn Do luận văn tập trung vào đề tài nghiên cứu thực Barebox tảng x86 1.3 Phạm vi nghiên cứu Đề tài giới thiệu Barebox phương pháp tạo boot loader cho tảng x86 dựa Barebox. .. tạo Barebox 16 3.1.5 Các lệnh Barebox 19 3.1.6 Biên dịch Barebox 24 3.2 Hiện thực Barebox tảng x86 25 3.2.1 Quá trình thực thi Barebox tảng x86 25 3.2.2 Thực. .. Mơ hình đánh giá Trong boot loader trên, Barebox chương trình nên có nhiều việc cần thực để hoàn thành cho tảng x86 Barebox hỗ trợ nhiều tảng, nên việc nghiên cứu Barebox x86 tạo tiền đề kiến thức