1. 발생 배경
새로운 서버에 NOVA를 Mount 하기 위한 사전 작업을 하던 도중 발생한 오류이다.
위의 그림처럼 "memmap=64G!0G"라는 GRUB command line 명령어를 추가하였다. 이는 memory의 0G부터 64G를 이후 pmem을 emulate 하기 위해 reserve 하라는 명령어이다. 여기서 0G부터 시작하는 게 오류의 원인이 되었던 것 같다.
"Real mode trampoline was not allocate"
이 오류를 이해하기 위해서는 "real mode"와 "trampoline" 두가지를 이해해야 된다.
우선 real mode(real address mode)란 x86 compatible CPU에서 사용하는 운영 모드이다. 주소가 실제 메모리 위치에 대응한다는 점에서 real mode라는 이름을 가지게 되었다. 20-bit segmented memory address space를 사용하며 memory protection, multitasking, code priviege level 등을 지원하지 않는다. 현재 x86 CPU들은 하위 호환을 위해 startup시에만 이 모드로 boot 되지만 이후 Protection을 위해 'long mode'로 변경된다고 한다. 쉽게 정리해, 현재 사용은 하지 않지만 하위 호환을 위해 restart시에 잠시 지나가는 Mode라고 이해가 된다.
Trampoline은 (방방 뛰는 그 트램폴린) 컴퓨터 프로그래밍 상에서 몇 가지 의미를 지니는데 여기서는 Interrupt service Routine, I/O routine 등에 대한 위치를 저장하고 있는 메모리 공간을 뜻한다. 이름의 유례는 잠깐 들렸다가 바로 redirect 되어 다른 코드로 옮겨가기 때문에 trampoline이다. Wikipedia에 의하면 CPU가 다양한 vector들의 위치를 빠르게 알기 위해 정해진 위치에 정보를 저장하는 데 사용하거나, SMP 환경에서 boot시에 bootstrap processor가 OS를 configure를 하고, 완료되면 다른 processor들에게 특적 trampoline code를 방문하여 initialize를 하는 데 사용한다고 한다. (trampoline이 사용되는 경우는 매우 많아서 이 의미로 사용된 것인지 불확실하다)
정리하자면, boot시에 real mode를 거치게 되는데, real mode시에도 trampoline code를 설정하고 이를 boot시에 사용하는 것 같다. 하지만 memmap을 0G부터 하여 주소 값이 실제 메모리에 대응되는 real mode시에 allocate를 할 수 없어 오류가 발생한게 아닐까 싶다. 즉, memmap을 하면 안되는 영역이 존재한다고 결론을 내릴 수 있다.
2. 해결 방법
Boot 과정에서 넘어가지 않았기 때문에 기존에 grub configure file을 수정했던 방법을 그대로 사용할 수 없었다(vi /etc/default/grub). 따라서 reboot시 grub option을 수정하였다.
1) boot시에 BIOS가 끝나면 "shift"를 꾹 누르고 있는다.
2) advanced options for Ubuntu를 선택한다.
3) 원하는 linux kernel image를 선택하고 'e'를 눌러 boot option을 수정한다.
이때 "memmap=64G!0G"를 "memmap=64G! 32G"로 수정하였다.
4) ctrl-x를 눌러 boot를 resume한다.
5) 이후 /etc/default/grub에서 option을 수정한다(수정하지 않으면 매번 reboot시 오류 발생)
3. 마무리
Grub 메뉴에서 "GRUB_TIMEOUT_STYLE=hidden"을 사용하는 경우가 많다. 이럴 경우 grub menu가 뜨기 전에 timeout을 count 하기 때문에 grub menu가 뜨기 전에 kernel panic이 발생할 수 있다. 이런 경우 'shift'를 눌러서 바로 grub menu에 들어갈 수 있고, 'e'를 통해 각각의 boot option을 수정할 수 있다.
'실험실 (커널 오류)' 카테고리의 다른 글
[kernel] Opening files inside the Kernelspace (0) | 2021.08.01 |
---|---|
[kernel panic] unable to handle kernel paging request at ~~ (0) | 2021.07.21 |
[NOVA] write path - offset, pos 추적 (7/20) (0) | 2021.07.20 |
[kernel build error] VFS: Unable to mount root fs on unknown-block(0,0) (0) | 2021.07.19 |
[NOVA] system call argument 추가 오류(2) (0) | 2021.07.19 |