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
안녕하세요. Ch21를 코드 작성을 마치고 실제 컴퓨터에서 구동하는 테스트중에 General Protection Exception이 발생하게 됐습니다. 그리고 이 문제가 이 GitHub 코드에도 똑같이 발생할 문제인 것 같아 글을 올립니다.
Ch21의 kCreateTask 함수를 보면 모든 process의 멤버중 하나인 stChildThreadList를 초기화합니다. 하지만 딱 하나 초기화가 되지 않은채 실행되는 task가 하나 있는데요. 바로 kernel process입니다. 단순히 이 커널 프로세스의 thread를 생성하지 않으면 아무 문제없이 운영체제가 잘 작동합니다. 하지만 문제는 kIdleTask 함수가 이 커널 프로세스의 thread로 작동하면서 발생합니다.
이 커널 process는 kInitializeSchedule 함수안에서 생성되는데 stChildThreadList가 초기화 되지가 않습니다. 초기화가 안된 stChildThreadList 안의 멤버들은 의도되지 않는 숫자가 들어가 있는 상태에서 kCreateTask 함수가 kIdleTask의 qwID를 부모 process (kernel process)의 list에 연결할 떄 존재하지 않는 메모리 참조가 일어나면서 general protection exception이 발생되는걸 확인했습니다.
좀 더 쉽게 눈으로 확인하기 위해서 비디오를 남깁니다. 그리고 원래 코드와 바뀐 코드도 함께 올렸습니다. 수고하세요.
Original Code (02.Kernel64/Source/Task.c)
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;
}
Modified Code
voidkInitializeScheduler(void) {
// 이 함수의 윗부분을 생략했습니다.pstTask->qwParentProcessID=pstTask->stLink.qwID;
pstTask->pvMemoryAddress= (void*) 0x100000;
pstTask->qwMemorySize=0x500000;
pstTask->pvStackAddress= (void*) 0x600000;
pstTask->qwStackSize=0x100000;
// 바뀐 부분kInitializeList(&(pstTask->stChildThreadList));
// initialize variables that help to calculate processor loadgs_stScheduler.qwSpendProcessorTimeinIdleTask=0;
gs_stScheduler.qwProcessorLoad=0;
}
(근데 시간 나시면 mint64OS 사이트에 올린 제 질문들 좀 확인해줄 수 있나요? linuxer라는 닉네임으로 활동하고 있습니다. FreeBoard와 QnA 게시판에 한 4개정도 올렸습니다. 바쁘지 않을 때 천천히 확인해주세요.)
The text was updated successfully, but these errors were encountered:
안녕하세요. Ch21를 코드 작성을 마치고 실제 컴퓨터에서 구동하는 테스트중에 General Protection Exception이 발생하게 됐습니다. 그리고 이 문제가 이 GitHub 코드에도 똑같이 발생할 문제인 것 같아 글을 올립니다.
Ch21의 kCreateTask 함수를 보면 모든 process의 멤버중 하나인 stChildThreadList를 초기화합니다. 하지만 딱 하나 초기화가 되지 않은채 실행되는 task가 하나 있는데요. 바로 kernel process입니다. 단순히 이 커널 프로세스의 thread를 생성하지 않으면 아무 문제없이 운영체제가 잘 작동합니다. 하지만 문제는 kIdleTask 함수가 이 커널 프로세스의 thread로 작동하면서 발생합니다.
이 커널 process는 kInitializeSchedule 함수안에서 생성되는데 stChildThreadList가 초기화 되지가 않습니다. 초기화가 안된 stChildThreadList 안의 멤버들은 의도되지 않는 숫자가 들어가 있는 상태에서 kCreateTask 함수가 kIdleTask의 qwID를 부모 process (kernel process)의 list에 연결할 떄 존재하지 않는 메모리 참조가 일어나면서 general protection exception이 발생되는걸 확인했습니다.
좀 더 쉽게 눈으로 확인하기 위해서 비디오를 남깁니다. 그리고 원래 코드와 바뀐 코드도 함께 올렸습니다. 수고하세요.
Original Code (02.Kernel64/Source/Task.c)
Modified Code
(근데 시간 나시면 mint64OS 사이트에 올린 제 질문들 좀 확인해줄 수 있나요? linuxer라는 닉네임으로 활동하고 있습니다. FreeBoard와 QnA 게시판에 한 4개정도 올렸습니다. 바쁘지 않을 때 천천히 확인해주세요.)
The text was updated successfully, but these errors were encountered: