30일에 할 수 있다! OS 자작 입문(1일째) [Ubuntu16.04/NASM]

30일에 할 수 있다! OS 자작 입문(기사 일람) [Ubuntu16.04/NASM]

목적



"30일로 할 수 있다! OS 자작 입문"의 내용을 Ubuntu(Linux)로 실행하려면 책의 내용만으로는 엄격하기 때문에 조사한 결과를 메모.



실행 환경


  • 우분투 16.04 LTS
  • nasm (nask가 아닌보다 일반적인 nasm을 사용했습니다)

  • (추기:2018/05/29)
    소스 코드는 아래의 GitHub에 있습니다.
    htps : // 기주 b. 코 m / Pop jp / my Haribote S

    바이너리 파일 작성 (helloos.img)



    일부 바이너리 편집기를 설치하고 입력합니다.
    자신은 ghex를 사용했습니다.

    ghex 설치


    $ sudo apt install ghex
    ($ sudo apt-get install ghex)
    

    helloos.img


    $ touch helloos.img
    $ ghex helloos.img
    



    Insert 버튼 또는 [Edit]->[Insert Mode]를 누르면 입력할 수 있게 되므로 책에 써 있는 대로 입력해 간다. (자신은 약 1일 걸렸습니다. 아침부터 촉촉함 없이 (고정) 다음날 아침까지)
    또한 오프셋은 왼쪽 하단에 표시됩니다.

    표시



    에뮬레이터로 표시


  • 참고 사이트: 리눅스로 쓰는 OS 자작 입문 1일차 - Tsurugidake's diary
  • qemu를 설치하고 실행하십시오.
    $ sudo apt install qemu
    
    $ qemu-system-i386 helloos.img
    

    출력 결과


    Virtualbox에서 시작 (2019/02/02 추가)



    새로 만들기


  • 유형:Other
  • 버전:Other/Unknown



  • 지금은 전혀 메모리 필요 없지만, 만약 필요하게 되면 또 신규로 만들면 좋다고 생각합니다.



    가상 하드 디스크는 만들 필요가 없기 때문에 "추가하지 않는다".



    '계속'


    설정 선택


    스토리지 선택


    아래의 "+(새 스토리지 컨트롤러 추가)"에서 "플로피 컨트롤러 추가 선택"


    컨트롤러 : Floppy의 오른쪽에있는 "+"를 선택하고 "디스크 선택"에서 "helloos.img"를 선택하십시오.




    그리고는 기동하면 이하와 같이 표시됩니다.


    USB 부팅으로 PC에 표시


  • USB 부팅 - 미래 설계도
  • Akitsushima Design - "30 일 만에! OS 자작 입문」을 Linux에서 해 본다 1일째

  • 이 기사가 도움이 될 것입니다.

    그 때 USB가 sdb 무엇인지를 아래의 순서로 확인할 수 있습니다.

    USB 확인


    disk 를 검색하여 실행하여 USB가 어디에 할당되었는지 확인


    이 경우는 sdb 네요.


    어셈블러


  • OS의 동작 원리를 공부한다 | OS 자작 입문 1일째 【Linux】
  • nask에 대한 페이지
  • 리눅스로 쓰는 OS 자작 입문 1일차 - Tsurugidake's diary
  • $ vi helloos.asm
    

    helloos.asm
    ; hello-os
    ; TAB=4
    
        DB      0xeb, 0x4e, 0x90
        DB      "HELLOIPL"      ; ブートセレクタの名前を自由にかいていよい  (8Byte)
        DW      512             ; 1セクタの大きさ                           (512にしなければならない)
        DB      1               ; クラスタの大きさ                          (1セクタにしなければならない)
        DW      1               ; FATがどこから始まるか                     (普通は1セクタ目からにする)
        DB      2               ; FATの個数                                 (2にしなければならない)
        DW      224             ; ルートディレクトリ領域の大きさ            (普通は224エントリにする)
        DW      2880            ; このドライブの大きさ                      (2880セクタにしなければならない)
        DB      0xf0            ; メディアタイプ                            (0xf0にしなければならない)
        DW      9               ; FAT領域の長さ                             (9セクタにしなければならない)
        DW      18              ; 1トラックにいくつのセクタがあるか         (18にしなければならない)
        DW      2               ; ヘッドの数                                (2にしなければならない)
        DD      0               ; パーティションを使っていないのでここは必ず0
        DD      2880            ; このドライブの大きさをもう一度書く
        DB      0, 0, 0x29      ; よくわからないけどこの値にしておくといいらしい
        DD      0xffffffff      ; たぶんボリュームシリアル番号
        DB      "HELLO-OS   "   ; ディスクの名前                            (11Byte)
        DB      "FAT12   "      ; フォーマットの名前                        (8Byte)
        RESB    18              ; とりあえず18バイト開けておく
    
    ; Program Main Body
    
        DB  0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
        DB  0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
        DB  0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
        db  0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
        db  0xee, 0xf4, 0xeb, 0xfd
    
    ; Message
    
        db      0x0a, 0x0a
        db      "hello, world"
        db      0x0a
        db      0
    
        resb    0x1fe-($-$$)
    
        db      0x55, 0xaa
    
    ; ブート以外の記述
    
        db      0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
        resb    4600
        db      0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
        resb    1469432
    
    helloos.asm 를 작성한 후 다음을 실행하여 어셈블리 언어를 바이너리 데이터로 변환

    terminal(입력)
    $ nasm helloos.asm -o helloos.img
    

    terminal(출력)
    helloos.asm:22: warning: uninitialized space declared in .text section: zeroing
    helloos.asm:39: warning: uninitialized space declared in .text section: zeroing
    helloos.asm:46: warning: uninitialized space declared in .text section: zeroing
    helloos.asm:48: warning: uninitialized space declared in .text section: zeroing
    

    왠지 warning이 토해졌지만 아직 지식이 얕은 자신에게는 모르겠습니다. . .
    이해하는대로 추기하겠습니다.

    바이너리 데이터의 내용을 확인하고 싶은 분은 이하의 커멘드로 확인할 수 있습니다.* 는 같은 값이 계속되는 것을 나타냅니다.

    terminal(입력)
     $ hexdump -C helloos.img 
    

    terminal(출력)
    00000000  eb 4e 90 48 45 4c 4c 4f  49 50 4c 00 02 01 01 00  |.N.HELLOIPL.....|
    00000010  02 e0 00 40 0b f0 09 00  12 00 02 00 00 00 00 00  |...@............|
    00000020  40 0b 00 00 00 00 29 ff  ff ff ff 48 45 4c 4c 4f  |@.....)....HELLO|
    00000030  2d 4f 53 20 20 20 46 41  54 31 32 20 20 20 00 00  |-OS   FAT12   ..|
    00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    00000050  b8 00 00 8e d0 bc 00 7c  8e d8 8e c0 be 74 7c 8a  |.......|.....t|.|
    00000060  04 83 c6 01 3c 00 74 09  b4 0e bb 0f 00 cd 10 eb  |....<.t.........|
    00000070  ee f4 eb fd 0a 0a 68 65  6c 6c 6f 2c 20 77 6f 72  |......hello, wor|
    00000080  6c 64 0a 00 00 00 00 00  00 00 00 00 00 00 00 00  |ld..............|
    00000090  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
    00000200  f0 ff ff 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    00000210  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    00001400  f0 ff ff 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    00001410  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    00168000
    

    에뮬레이터로 확인합니다.
    $ qemu-system-i386 helloos.img
    

    출력 결과




    어셈블할 때 -l 옵션을 붙이면 해당하는 기계어를 표시할 수 있다.

    tenrminal(입력)
    $ nasm helloos.asm -o helloos.img -l helloos.lst
    

    참고


  • Akitsushima Design - "30 일 만에! OS 자작 입문」을 Linux에서 해 본다 1일째
  • 좋은 웹페이지 즐겨찾기