Từ 1 tới 4 trên tổng số 4 kết quả

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

  1. #1
    Ngày gia nhập
    08 2011
    Bài viết
    98

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

    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
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		bootVB.png
Lần xem:	42
Size:		71.5 KB
ID:		8621

    Tham khảo : codeproject.com/Articles/36907/How-to-develop-your-own-Boot-Loader#_Toc231383186
    Đã được chỉnh sửa lần cuối bởi lttq : 10-02-2012 lúc 12:01 AM.
    Nghe Metal và dịch thơ
    lttqstudy.wordpress.com

  2. #2
    Ngày gia nhập
    09 2011
    Bài viết
    84

    bài này hay quá nhưng tiếc là dùng nasm để dịch
    RISC better than CISC
    phamthechung0@gmail.com

  3. #3
    Ngày gia nhập
    08 2011
    Bài viết
    98

    Trích dẫn Nguyên bản được gửi bởi hardwire Xem bài viết
    bài này hay quá nhưng tiếc là dùng nasm để dịch
    Bạn dịch bằng ch trình khác cũng được mà.Nếu không được thì chỉnh sửa lại 1 tí cho phù hợp vì kiến thức nạp MBR cơ bản là thế thôi.
    Mà sao lúc bạn tên là panfider lúc thì hardwire thế.
    Nghe Metal và dịch thơ
    lttqstudy.wordpress.com

  4. #4
    Ngày gia nhập
    09 2011
    Bài viết
    84

    từ đoạn mã này lttq thử viết ra đoạn load một hoặc nhiều sector vào bộ nhớ
    rùi sau đó jump tới đoạn mã đó
    đoạn mã đó chính là kernel cho phép người dùng nhập lệnh xem ngày giờ
    bạn thử làm như vậy xem
    bạn nên xử dụng các instruction in/out để thực hiện
    RISC better than CISC
    phamthechung0@gmail.com

Các đề tài tương tự

  1. Kỹ thuật C Viết chương trình bắt gói tin trên Linux
    Gửi bởi mrarsenal10 trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 2
    Bài viết cuối: 02-02-2014, 09:08 PM
  2. Lập trình C Làm sao để viết chương trình tạo ra quá trình trong lập trình C trên Linux?
    Gửi bởi sin_vt trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 5
    Bài viết cuối: 24-11-2013, 09:47 PM
  3. Kỹ thuật C++ Đóng gói ứng dụng viết bằng Qt để cài và chạy trên Linux Ubuntu
    Gửi bởi tritue9056 trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 0
    Bài viết cuối: 28-10-2013, 11:27 AM
  4. Chương trình cắt nối file viết bằng C trên linux !
    Gửi bởi huyhva trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 6
    Bài viết cuối: 05-01-2012, 04:01 PM
  5. Bài tập C các phép tính trên phân số viết bằng C trên Linux. Mọi người sửa giúp mình với?
    Gửi bởi hxt57 trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 2
    Bài viết cuối: 05-10-2011, 06:05 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn