You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
안녕하세요. 챕터 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
voidkInitializeScheduler( 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
voidkInitializeScheduler(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 loadgs_stScheduler.qwSpendProcessorTimeinIdleTask=0;
gs_stScheduler.qwProcessorLoad=0;
}
The text was updated successfully, but these errors were encountered:
ybjeon01
changed the title
kernel process의 bFPUUsed field가 초기화안됨으로써 실제 PC에서 GP exception 발생하는 문제
kernel process의 bFPUUsed field가 초기화안됨으로써 실제 PC에서 소수점 계산 중 GP exception 발생하는 문제
Jul 16, 2021
안녕하세요. 챕터 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
Suggested Code
The text was updated successfully, but these errors were encountered: