Trung tâm đào tạo thiết kế vi mạch Semicon


  • ĐĂNG KÝ TÀI KHOẢN ĐỂ TRUY CẬP NHIỀU TÀI LIỆU HƠN!
  • Create an account
    *
    *
    *
    *
    *
    Fields marked with an asterisk (*) are required.
wafer.jpg

Hướng dẫn viết 1 chương trình boot đơn giản trên linux

E-mail Print PDF
Quá trình khởi động của 1 hệ thống máy tính.
Khi bật nút nguồn thì BIOS là chương trình được chạy đầu tiên.BIOS là chương trình nhúng vào ROM của máy tính.Đặc điểm là nó sẽ chạy 1 đoạn code đã biên dịch,thông thường do nhà sản xuất viết sẵn.Chủ yếu là để nạp và kiểm tra các devide hoặc hardware gọi là POST (Power-on Self-test),và gọi Master Boot Record từ 512byte ở sector đầu tiên của ổ đĩa.BIOS đọc dữ liệu trong master boot record, nạp vào RAM tại địa chỉ 7C00:0000 và chuyển quyền điều khiển cho chương trình này.

BIOS thường hỗ trợ đọc MBR từ :
1/cdrom
2/floppy
3/hard disk
...
Tùy vào lựa chọn của ta mà nó sẽ ưu tiên lấy cái nào.

MBR nằm trong phần sector đầu tiên nằm trên 1 thiết bị boot,có thể là ổ đĩa,cd ...
Từ đó sẽ nạp boot code khoảng tầm 512 byte,bao gồm MBR,partition table(tổng cộng là 510b) và 1 cái signature(2byte thường là AA55).MBR sau đó gọi bootloader tương ứng,trên linux nổi tiếng là lilo và grub.
Bootloader sẽ nạp kernel(copy hdh lên bộ nhớ thực thi(RAM chẳn hạn)) rồi hdh sẽ chạy,nạp các tiến trình ....

Cấu trúc thông dụng của MBR có thể xem tại đây.Dĩ nhiên đây là cấu trúc thông dụng của các máy tính hiện tại.MBR trên ổ đĩa khác CD khác.Nhưng nhìn chung,thì MBR có cấu trúc cũng có nét tương tự mà thôi.

Sau đây là hướng dẫn viết 1 boot loader cho 1 hệ thống nhúng đơn giản.Chương trình viết = asm trên linux,dịch bằng nasm.Ta sẽ viết 1 chương trình boot,dùng ngắt 10h để xuất ra chữ helloworld trên màn hình

C Code:
  1. BITS 16
  2. ;code vs vxl 16bit - dich bang nasm
  3. org 0x7c00
  4. ; chỉ thị giúp các instruction sinh ra được nạp vào 0x7c00 theo đúng
  5. ;địa chỉ nạp code boot
  6.  
  7. Start: jmp loader
  8. msg db "hello world", 0
  9.  
  10. Print:
  11. lodsb ;load next character
  12. or al,al ;xem al null chưa-> bật cờ để jz nhảy đến PrintDone
  13. jz PrintDone
  14. mov ah, 0eh ;tham số cho ngắt 10h
  15. int 10h ;xuất ra màn hình từng ký tự
  16. jmp Print
  17.  
  18. PrintDone:
  19. ret
  20.  
  21. loader:
  22.  
  23. xor ax,ax ;empty ax
  24. mov si,msg
  25. Call Print
  26.  
  27. xor ax,ax ; empty ax
  28. cli
  29. hlt ;clear hết các ngắt
  30.  
  31. times 510- ($-$$) db 0 ;chừa 510 byte để nạp MBR và partion table
  32.  
  33. dw 0xAA55 ;2 byte cho signature là 512,đúng như structure của 1 sector đầu tiên

Hướng dẫn test :
đầu tiên phải biên dịch dc code trên:
Mình dùng asm để dịch :
C Code:
  1. apt-get install nasm
  2. nasm -f bin -o quanrock/boot.bin quanrock/boot.asm
Sau đó dd toàn bộ dữ liệu vào image của floopy hoặc cdrom
C Code:
  1. dd qua floopy :
  2. dd if=quanrock/boot.bin of=quanrock/boot.flp
  3. dd qua cdrom
  4. dd if=quanrock/boot.bin of=dev/boot.iso


Cài virtualbox từ ubuntu software center
Sau đó new 1 OS mới
Trong phần setting thì open file img của floopy là xong

Hình ảnh khi chạy trên virtualbox của Sun

Bạn có đam mê ngành thiết kế vi mạch và bạn muốn có mức lương 1000 usd cùng lúc bạn

đang muốn tìm một Trung tâm để học vậy hãy đến với ngành vi mạch tại SEMICON

  HotLine: 0972 800 931 Ms Duyên

 

 

Related Articles

Chat Zalo