สวัสดีครับ ผมลองเขียนระบบปฎิบัติการดู ใช้ภาษา C++ และ asm ครับ ผมเขียนแล้วรวมไฟล์เป็น .iso แล้วไปรันใน VMware แล้วรันไม่ผ่านครับ นี้เป็นโค้ดไฟล์ครับ
--kernel.cpp--
#include
int main() { std::cout << "Hello, world!" << std::endl; return 0; }
--Link.ld--
OUTPUT_FORMAT("binary") ENTRY(start) SECTIONS { .text 0x100000 : { code = .; _code = .; __code = .; *(.text) . = ALIGN(4096); }
.data : { __CTOR_LIST__ = .; LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) *(.ctors) LONG(0) __CTOR_END__ = .; __DTOR_LIST__ = .; LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) *(.dtors) LONG(0) __DTOR_END__ = .;
data = .; _data = .; __data = .; *(.data) . = ALIGN(4096); }
.bss : { bss = .; _bss = .; __bss = .; *(.bss) . = ALIGN(4096); }
end = .; _end = .; __end = .; } INPUT(kernel.o)
-- Loader.asm --
[BITS 32] ; protected mode
[global start] [extern _main] ; this is our C++ code [extern __main] ; this is our C support code [extern __atexit]
start: call __main call _main ; call our C++ code call __atexit
cli ; interrupts will disturb the halt hlt ; halt the CPU
ผมใช้ nasm ในการคอมไพล์ asm ส่วน C++ ใช้ Dev-C++ 5.5.3 ตัวคอมไพล์ TDM-GCC 4.7.1 32-bit ครับ (คอมที่เขียนใช้ 64 bit) ผมพลาดตรงไหนครับ ขอบคุณครับ
on
นี่เป็นไฟล์ที่รวมและคอมไพล์แล
tontan Sat, 18/01/2014 - 21:22
นี่เป็นไฟล์ที่รวมและคอมไพล์แล้วครับ
https://db.tt/5NrGVFAq
ผมไม่เคยเขียนระบบปฎิบัติการนะ
nat3738 Sat, 18/01/2014 - 23:16
ผมไม่เคยเขียนระบบปฎิบัติการนะ เลยไม่แน่ใจเท่าไร
x86 CPU เมื่อบูทเป็น 16bit real mode เสมอนิครับ ต้องค่อยๆ escalate เป็น 64-bit long mode โดยขึ้นมาเป็น protected mode แล้วถึงเป็น long mode แถมยังมีรายละเอียดยิบย่อยอีกเต็มไปหมด (เช่น A20 line ฯลฯ) แล้วถ้าผมจำไม่ผิด bios มันจะเรียกตำแหน่งที่ 0000:FFFF (ถ้าเป็นเขียนแบบ flat model 32บิท ก็ 0x0000FFFF นั่นแหละ) ขึ้นมารันทีแรก ต้องเอาโค้ดไปไว้ตรงนั้น
ส่วนการใช้ cout ซึ่งเป็น standard c++ library นั้นใช้ไม่ได้แน่นอน เพราะระบปฏิบัติการ (ทีคุณต้องเขียนนี่แหละ) จะต้องรองรับ system call ต่างๆ ที่ libc (glibc, msvc runtime, etc) จะมาเรียกใช้อีกทอดหนึ่ง
ส่วนวิธีแก้นี่ผมไม่ทราบฮะ
อ่านวิธีทำจากไหนเหรอคับ
UltimaWeapon Sun, 19/01/2014 - 03:29
อ่านวิธีทำจากไหนเหรอคับ
จากนี่ครับ
tontan Sun, 19/01/2014 - 13:40
In reply to อ่านวิธีทำจากไหนเหรอคับ by UltimaWeapon
จากนี่ครับ http://wiki.osdev.org/Getting_Started
และอีกหลายเว็บครับ จนความรู้ตีกันเองครับ =_='
ผมว่า Code
UltimaWeapon Sun, 19/01/2014 - 14:47
In reply to จากนี่ครับ by tontan
ผมว่า Code ที่เขียนมาไม่น่าจะเอามาจาก OSDev เพราะเขาไม่น่าจะสอนเขียนแบบนั้น
อันดับแรกต้องเขียน Boot loader ก่อนคับ ใช้อันที่อยู่ในหมวด Example bootsector ของหน้านี้ก็ได้ http://wiki.osdev.org/Entering_Long_Mode_Directly
ส่วนรายละเอียดที่ต้องรู้ในช่วงนี้ ลองดูใน http://wiki.osdev.org/Boot_Sequence http://wiki.osdev.org/Real_Mode http://wiki.osdev.org/Protected_Mode http://wiki.osdev.org/X86-64
พอเข้าใจ Boot loader แบบเบสิคแล้ว ลองนำมันไปไว้ใน VBR แทน MBR ดูคับ รายละเอียดลองดูในนี้ http://en.m.wikipedia.org/wiki/Volume_boot_record
ขอบคุณครับ รู้แล้วครับ
tontan Sun, 19/01/2014 - 15:46
In reply to ผมว่า Code by UltimaWeapon
ขอบคุณครับ รู้แล้วครับ ผมศึกษาโค้ดจาก http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=6718&lngWId=3 ครับ =_=
เอ่อ... ยังไม่เห็น
shikima Mon, 20/01/2014 - 21:01
เอ่อ... ยังไม่เห็น ข้อมูลที่จะลง boot sector (MBR) เลยครับ แล้วมันจะ boot ได้ไง
ผมเคยเขียนตอนเรียน แต่เป็น asm แล้วยัดลง boot sector ของ fdd ก่อน ถึงจะทำงานได้
http://en.wikipedia.org/wiki/Master_Boot_Record