bigsys-gnu / mvcc-os

KhronOS, a scalable operating systems based on sv6 (MIT) with MV-RLU (multi-version concurrency control mechanism)
Other
1 stars 0 forks source link

Run sv6 on x86-native #26

Closed kjhnet closed 9 months ago

kjhnet commented 3 years ago
kjhnet commented 3 years ago
kjhnet commented 2 years ago

It'll probably take some debugging to get Sv6 to boot on real hardware again. I'd suggest taking a look at some of the early commits for Ward after it forked off Sv6. For instance, you'll probably want to pull in 46378311 and some of the subsequent commits. It would probably also be easiest to start by running inside QEMU+KVM and only move to actual hardware once that is stable.

gitrvy2 commented 2 years ago
* Sv6 real hardware에 부팅하는 한가지 방안

  * Ward 저자가 제안하는 아래 방법 참조
  * @gitrvy2 건표씨 아래 내용 참고하여 진행을 해봅시다 (필요한 내용 민균, 창희 도움)

It'll probably take some debugging to get Sv6 to boot on real hardware again. I'd suggest taking a look at some of the early commits for Ward after it forked off Sv6. For instance, you'll probably want to pull in 46378311 and some of the subsequent commits. It would probably also be easiest to start by running inside QEMU+KVM and only move to actual hardware once that is stable.

원문 링크같은게 있나요?

kjhnet commented 2 years ago
* Sv6 real hardware에 부팅하는 한가지 방안

  * Ward 저자가 제안하는 아래 방법 참조
  * @gitrvy2 건표씨 아래 내용 참고하여 진행을 해봅시다 (필요한 내용 민균, 창희 도움)

It'll probably take some debugging to get Sv6 to boot on real hardware again. I'd suggest taking a look at some of the early commits for Ward after it forked off Sv6. For instance, you'll probably want to pull in 46378311 and some of the subsequent commits. It would probably also be easiest to start by running inside QEMU+KVM and only move to actual hardware once that is stable.

원문 링크같은게 있나요?

email 내용 복사중 링크가 빠졌네요. 46378311 해당 링크는 아래에요.
https://github.com/mit-pdos/ward/commit/46378311e870d33515731c032e7cb4521ae488fc

kjhnet commented 2 years ago

Can you describe what problems you are running into when booting sv6 or ScaleFS on your machine? I recall that we had to tweak sv6/ScaleFS to work well on the PDOS lab machines back when we wrote the paper (and all those fixes were merged upstream), so it's likely that you may need to find and fix any underlying issues preventing boot-up on your particular platform too.

It has been a while since I looked into ScaleFS, and unfortunately I don't think I have the resources to debug the issue from my end.

Hi @Frans, @Nickolai, Hope you are doing great!

Would you happen to know if any current PDOS students are working on sv6 or ScaleFS, and might be able to help out Jaeho?

gitrvy2 commented 2 years ago

제가 시도했을때는 여러번 make하면 되는 현상은 없고 그냥 make가 잘 됩니다.

추가적으로 scalefs HW make 할때 몇가지 주의사항이 있습니다.

  1. target HW의 Core수 Socket 수를 build시 맞춰야 함
  2. journal 파일은 core수에 맞춰 입력되어야 함

    ex in makefile) else ifeq ($(HW),mvcc) JOURNALS = $(foreach num, $(shell seq 0 $(shell dc -e "${NCPU} 1 - p")), sv6journal${num}) FSEXTRA += ${JOURNALS} FSEXTRA += testfile1 README

  3. param.h에 HW 정의 시 특정 bench (mapbench, countbench) 코드에 해당 CPU의 제조사(AMD/Intel)를 명시해야 함

    ex in param.h

    elif defined(HW_mvcc)

    define DEBUG 0

    define NCPU 8 // maximum number of CPUs

    define NSOCKET 1

    define PERFSIZE (128<<20ull)

ex in countbench.cc) // XXX(Austin) Do this right. Put these in a proper PMC library.

if defined(HW_tom)

define PERF_amd

elif defined(HW_josmp) || defined(HW_ben) || defined(HW_mvcc)

define PERF_intel

endif

kjhnet commented 2 years ago

제가 시도했을때는 여러번 make하면 되는 현상은 없고 그냥 make가 잘 됩니다.

추가적으로 scalefs HW make 할때 몇가지 주의사항이 있습니다.

  1. target HW의 Core수 Socket 수를 build시 맞춰야 함
  2. journal 파일은 core수에 맞춰 입력되어야 함

ex in makefile) else ifeq ($(HW),mvcc) JOURNALS = $(foreach num, $(shell seq 0 $(shell dc -e "${NCPU} 1 - p")), sv6journal${num}) FSEXTRA += ${JOURNALS} FSEXTRA += testfile1 README

  1. param.h에 HW 정의 시 특정 bench (mapbench, countbench) 코드에 해당 CPU의 제조사(AMD/Intel)를 명시해야 함

ex in param.h

elif defined(HW_mvcc)

define DEBUG 0

define NCPU 8 // maximum number of CPUs

define NSOCKET 1

define PERFSIZE (128<<20ull)

ex in countbench.cc) // XXX(Austin) Do this right. Put these in a proper PMC library.

if defined(HW_tom)

define PERF_amd

elif defined(HW_josmp) || defined(HW_ben) || defined(HW_mvcc)

define PERF_intel

endif

첫번째 make 에서 lseek: Bad file descriptor 오류로 fs.img 생성 오류가 있고 두번째 make 실행에서 오류 없이 생성은 되네요.

kjhnet commented 2 years ago
## Sv6
menuentry "Sv6" {
        set kernel='/boot/kernel'
        echo "Loading ${kernel}"
        multiboot ${kernel}
        echo "After multiboot"
}

(2) copy the kernel.elf image file from scalefs to /boot/kernel

kjhnet commented 2 years ago
bigsys-gnu commented 2 years ago
gitrvy2 commented 2 years ago
* Scalefs native 머신에서 부팅 문제점

  * @gitrvy2 현재 상태가 코어수를 증가할때 부팅이 안되는 거죠? 코어수 몇개까지 되는거에요. 현재 상황 간략히 업데이트 부탁이요.

코어수는 저널만 잘 넣어주면 상관없이 잘 되는것 같구요 16코어머신에서 ACPI 초기화할때 문제가 납니다.

bigsys-gnu commented 2 years ago
* Scalefs native 머신에서 부팅 문제점

  * @gitrvy2 현재 상태가 코어수를 증가할때 부팅이 안되는 거죠? 코어수 몇개까지 되는거에요. 현재 상황 간략히 업데이트 부탁이요.

코어수는 저널만 잘 넣어주면 상관없이 잘 되는것 같구요 16코어머신에서 ACPI 초기화할때 문제가 납니다.

현재 최대 몇 코어까지 부팅이 가능해요?

gitrvy2 commented 2 years ago
* Scalefs native 머신에서 부팅 문제점

  * @gitrvy2 현재 상태가 코어수를 증가할때 부팅이 안되는 거죠? 코어수 몇개까지 되는거에요. 현재 상황 간략히 업데이트 부탁이요.

코어수는 저널만 잘 넣어주면 상관없이 잘 되는것 같구요 16코어머신에서 ACPI 초기화할때 문제가 납니다.

현재 최대 몇 코어까지 부팅이 가능해요?

컴퓨터가 2개만 시험해봐서 아직 4코어까지만 확인됬습니다.

bigsys-gnu commented 2 years ago
gitrvy2 commented 2 years ago

현재까지 확인한 문제와 시도해 볼만안 해결방안을 공유합니다.

일단 kernel/main.cc의 cmain()에서 수행되는 부팅 순서로 설명하겠습니다.

  1. initpercpu()
    • 현재 112core 머신에서 발생하는 문제입니다. sv6와 scalefs 둘다 발생합니다. 단톡방에 있는 영상이 이문제입니다.
    • 이 함수에서 코어당 메모리를 node에 있는 CPU들에게 할당하는데 node2의 첫번째 CPU인 cpu28에서 문제가 발생합니다.
    • 참고) Node0 (cpu 0-27, 56-83), Node1,3 (cpu 없음), Node2(cpu 28-55, 84-111)
    • qemu의 경우 Socket이 1개인데도 Node2개가 잡히는것으로 보아 첫번째는 물리코어(node0, cpu 0,2,4,6,~), 두번째는 논리코어(node1, cpu 1,3,5,7~)를 잡는것 같습니다.
    • 포인터연산하는 할당위치만 잘 잡으면 오류 해결할 수도 있을 것 같은데 저말고 다른사람이 시도할 사람 있을까요...
    • grub에서 sv6 e로 수정해서 scalefs112r3으로 부팅하면 확인 가능합니다.
    • 캐시라인이 param에 정의되어있는데 이건 원인이 아니니까 볼필요 없을듯 합니다.. (확인함)
    • 112코어 머신에서 NCPU를 줄이고 시도도 해보았는데, 안쓰는 코어가 있다면서 부팅이 안됩니다.
  2. initacpi()
    • 16코어 머신에서 scalefs 부팅 시 발생하던 문제입니다.
    • 이 함수에서는 acpi를 초기화 하는데 AcpiInitializeObjects() -> AcpiNsInitializeDevices() -> AcpiNsWalkNamespace(2개 중 아래것, 콜백 AcpiNsInitOneDevice인 경우)에서 무한루프가 발생합니다.
    • 4코어 머신에서는 문제가 발생하지 않았고, 112코어는 여기까지 진행하지 못했습니다.
    • sv6는 16코어 머신에서 부팅이 된다고 들은것 같은데, 완전히 같은 프로시저로 실행되는데 왜 그런지 모르겠습니다...
  3. initdisk()
    • 맨 처음 발견한 문제로 4코어 머신에서 발생하던 오류이지만, 해결되었습니다.
    • 메모리에 가상 ide 파일시스템 올릴때 나는 문제로 CPU 몇개에서는 안된다 이런 이야기가 나왔던게 다 이 오류입니다.
    • make할때 저널만 잘 넣어주면 문제없이 실행됩니다.
    • 이 문제는 사실 QEMU때부터 있던 문제고, 해결방법 나온지도 오래됬기 때문에 이 문제랑 다른문제들이랑 혼동하면 초점이 흐려지니까 주의해야할 듯 합니다..

결론

  1. 16코어 머신에서 acpi 관련 문제가 발생했는데 해결하지 못함. sv6가 되는거로 보아 완전히 해결불가능한 문제는 아님.
  2. 112코어 머신에서는 cpu ordering 문제로 부팅이 불가능함, 메모리 할당 소스를 고치면 가능해 보임.
  3. 위 문제를 해결하더라도 112코어 머신에서 acpi 관련 문제가 발생할 수도 있음. (하지만 발생 안하길 바라고 있음..)
gitrvy2 commented 2 years ago

20개짜리 머신에서 scalefs, sv6 부팅되었습니다. scalefs는 PS2 키보드로 연결했고, 커맨드라인에 입력하면 트랜잭션 관련 메시지가 나오면서 처리가 안되서, 엔터 대신에 컨트롤 엔터를 눌러야 합니다.

MadPlayer commented 2 years ago
  1. initpercpu()
  • 현재 112core 머신에서 발생하는 문제입니다. sv6와 scalefs 둘다 발생합니다. 단톡방에 있는 영상이 이문제입니다.
  • 이 함수에서 코어당 메모리를 node에 있는 CPU들에게 할당하는데 node2의 첫번째 CPU인 cpu28에서 문제가 발생합니다.
  • 참고) Node0 (cpu 0-27, 56-83), Node1,3 (cpu 없음), Node2(cpu 28-55, 84-111)
  • qemu의 경우 Socket이 1개인데도 Node2개가 잡히는것으로 보아 첫번째는 물리코어(node0, cpu 0,2,4,6,~), 두번째는 논리코어(node1, cpu 1,3,5,7~)를 잡는것 같습니다.
  • 포인터연산하는 할당위치만 잘 잡으면 오류 해결할 수도 있을 것 같은데 저말고 다른사람이 시도할 사람 있을까요...
  • grub에서 sv6 e로 수정해서 scalefs112r3으로 부팅하면 확인 가능합니다.
  • 캐시라인이 param에 정의되어있는데 이건 원인이 아니니까 볼필요 없을듯 합니다.. (확인함)
  • 112코어 머신에서 NCPU를 줄이고 시도도 해보았는데, 안쓰는 코어가 있다면서 부팅이 안됩니다.

확인해본 결과 qemu 실행 옵션에 numa node 2개 있는 것으로 설정한 것을 발견했습니다. 112 core 마더보드에 쓰지 않는 socket이 2개가 추가로 있거나 bios 옵션이 잘못된 것으로 보입니다.

https://github.com/bigsys-gnu/mvcc-os/blob/1fa3c36b99bd22e783a04828e492bdc6c6ddd834/os/sv6/scalefs/Makefile#L229-L235

bigsys-gnu commented 2 years ago
  1. initpercpu()
  • 현재 112core 머신에서 발생하는 문제입니다. sv6와 scalefs 둘다 발생합니다. 단톡방에 있는 영상이 이문제입니다.
  • 이 함수에서 코어당 메모리를 node에 있는 CPU들에게 할당하는데 node2의 첫번째 CPU인 cpu28에서 문제가 발생합니다.
  • 참고) Node0 (cpu 0-27, 56-83), Node1,3 (cpu 없음), Node2(cpu 28-55, 84-111)
  • qemu의 경우 Socket이 1개인데도 Node2개가 잡히는것으로 보아 첫번째는 물리코어(node0, cpu 0,2,4,6,~), 두번째는 논리코어(node1, cpu 1,3,5,7~)를 잡는것 같습니다.
  • 포인터연산하는 할당위치만 잘 잡으면 오류 해결할 수도 있을 것 같은데 저말고 다른사람이 시도할 사람 있을까요...
  • grub에서 sv6 e로 수정해서 scalefs112r3으로 부팅하면 확인 가능합니다.
  • 캐시라인이 param에 정의되어있는데 이건 원인이 아니니까 볼필요 없을듯 합니다.. (확인함)
  • 112코어 머신에서 NCPU를 줄이고 시도도 해보았는데, 안쓰는 코어가 있다면서 부팅이 안됩니다.

확인해본 결과 qemu 실행 옵션에 numa node 2개 있는 것으로 설정한 것을 발견했습니다. 112 core 마더보드에 쓰지 않는 socket이 2개가 추가로 있거나 bios 옵션이 잘못된 것으로 보입니다.

https://github.com/bigsys-gnu/mvcc-os/blob/1fa3c36b99bd22e783a04828e492bdc6c6ddd834/os/sv6/scalefs/Makefile#L229-L235

해당 부분을 수정해서 시도를 해봐야 알겠네요?

MadPlayer commented 2 years ago

해당 부분을 수정해서 시도를 해봐야 알겠네요?

일단 bios를 한번 더 확인해보겠습니다.

bigsys-gnu commented 2 years ago