Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

kernel process의 bFPUUsed field가 초기화안됨으로써 실제 PC에서 소수점 계산 중 GP exception 발생하는 문제 #9

Open
ybjeon01 opened this issue Jul 16, 2021 · 3 comments
Assignees
Labels

Comments

@ybjeon01
Copy link

안녕하세요. 챕터 22를 공부하다가 발견한 문제입니다. 지난번에 올린 이슈와 비슷한 양상을 보이는 문제로 kernel process의 bFPUUsed field를 초기화하면 해결이 됩니다.

문제를 좀 더 설명하자면, bFPUUsed 변수가 0이 아닌 임의의 숫자가 들어있을 경우 생기는데요. Task가 FPU instruction를 처음 실행하더라도 bFPUUsed변수가 0이 아니라서 FPU 초기화를 하지 않습니다. fxrstor 명령어를 통해 아직 제대로된 데이터가 들어있지 않는 TCB FPU context를 FPU에 넣어버리더라고요. 이 과정에 건드리면 안되는 register를 건드리면서 GP exception이 발생하는 걸 확인했습니다.

링크에 따르면 fxrstor 명령어가 FPU register인 MXCSR에 예약된 bits를 설정하면 GP exception이 발생한다고 명시되어있습니다.

Original Code

void kInitializeScheduler( void )
{
    // 함수의 윗부분을 생략했습니다.
    
    pstTask->qwParentProcessID = pstTask->stLink.qwID;
    pstTask->pvMemoryAddress = ( void* ) 0x100000;
    pstTask->qwMemorySize = 0x500000;
    pstTask->pvStackAddress = ( void* ) 0x600000;
    pstTask->qwStackSize = 0x100000;
    
    // 프로세서 사용률을 계산하는데 사용하는 자료구조 초기화
    gs_vstScheduler[ bCurrentAPICID ].qwSpendProcessorTimeInIdleTask = 0;
    gs_vstScheduler[ bCurrentAPICID ].qwProcessorLoad = 0;
    
    // FPU를 사용한 태스크 ID를 유효하지 않은 값으로 초기화
    gs_vstScheduler[ bCurrentAPICID ].qwLastFPUUsedTaskID = TASK_INVALIDID;
}

Suggested Code

void kInitializeScheduler(void) {
    // 이 함수의 윗부분을 생략했습니다.

    pstTask->qwParentProcessID = pstTask->stLink.qwID;
    pstTask->pvMemoryAddress = (void *) 0x100000;
    pstTask->qwMemorySize = 0x500000;
    
    pstTask->pvStackAddress = (void *) 0x600000;
    pstTask->qwStackSize = 0x100000;

    // 바뀐 부분
    pstTask->bFPUUsed = FALSE;

    // initialize variables that help to calculate processor load
    gs_stScheduler.qwSpendProcessorTimeinIdleTask = 0;
    gs_stScheduler.qwProcessorLoad = 0;
}
@ybjeon01 ybjeon01 changed the title kernel process의 bFPUUsed field가 초기화안됨으로써 실제 PC에서 GP exception 발생하는 문제 kernel process의 bFPUUsed field가 초기화안됨으로써 실제 PC에서 소수점 계산 중 GP exception 발생하는 문제 Jul 16, 2021
@kkamagui
Copy link
Owner

안녕하세요 @ybjeon01 님,
제보 주셔서 감사합니다.

상황을 보아하니, 예전 QEMU에서는 기본적으로 메모리가 0으로 초기화되어서 시작되던 부분이 버전이 바뀌면서 메모리가 초기화 되지 않고 더미값으로 남아 았는 상황이 아닌가 싶네요.

이런 상황이라면 앞으로도 많이 나올 것 같은데... 쿨럭..;;;
앞으로도 잘 부탁드립니다. ^^;;;

그럼 즐거운 OS 프로그래밍하세요 ^^)-b

@kkamagui kkamagui self-assigned this Jul 18, 2021
@kkamagui kkamagui added the bug label Jul 18, 2021
@ybjeon01
Copy link
Author

ybjeon01 commented Jul 18, 2021

다행스럽게 QEMU에서 위와 같은 문제가 발생하지 않습니다. 최신버전에서도 메모리는 0으로 초기화 되어있거든요. 지금까지 제가 쓴 이슈들 대부분은 실제 PC상에서 발생하는 문제들입니다.

제가 오히려 배우면서 버그찾고 기여하는게 더 의미있고 재미있는 것 같아요. 저도 앞으로 잘 부탁드립니다

@kkamagui
Copy link
Owner

앗! 실제 PC에서 시험 중이시군요! 굉장히 번거로우실텐데... 열정이 대단하시군요!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants