[완료] 왜 동작하지도 못하는 printk 를 사용했을까요?

inamind의 이미지

안녕하세요.
arm 에서 linux kernel을 개발하고 있습니다.

void __init create_mapping(struct map_desc *md)
{

...
printk(KERN_WARNING "BUG: map for 0x%08lx at 0x%08lx can not "
"be mapped using pages, ignoring.\n",
__pfn_to_phys(md->pfn), addr);

...
}

위와 같은 구문이 있는데요. 사실 이 함수가 호출되는 위치는 거의가 메모리가 mapping 이 되지도 않은 시점입니다.
따라서 printk 를 사실상 동작하지 못하게 되는데요.
이런 함수들을 memory mapping 전에 곳곳에서 사용하고 있네요.
왠만하면 serial device 에 direct 로 write 하는 함수를 사용했어야 맞을것 같은데요.
메모리 맵핑전에 printk를 동작시키는 숨겨진 feature 가 있는가요?

tj의 이미지

earlyprintk

inamind의 이미지

/*
* Architectures can override it:
*/
void asmlinkage __attribute__((weak)) early_printk(const char *fmt, ...)
{
}

요로코롬 비어 있군요..;;

planetarium의 이미지

Architectures can override it: 이라고 쓰여있잖습니까; arm용은 따로 구현되어 있네요. x86용도 있구요.

arch/arm/kernel/early_printk.c

asmlinkage void early_printk(const char *fmt, ...)
{
	char buf[512];
	int n;
	va_list ap;
 
	va_start(ap, fmt);
	n = vscnprintf(buf, sizeof(buf), fmt, ap);
	early_write(buf, n);
	va_end(ap);
}
inamind의 이미지

제가 32 커널을 쓰고 있어서 비어있었던 거네요.
답변 감사합니다.