scuter писал(а):
а дайте пожалюйста образ мем детекторы
Алгоритм определения объема доступной памяти что-ли?
По теме. Приведу код который получился в итоге
Переключение задачКод:
void switch_task(void)
{
if (multi_task)
{
/* Выключаем прерывания */
asm volatile ("cli");
/* Запоминаем указатель стека текущего потока */
asm volatile ("mov %%esp, %0":"=a"(current_thread->state.esp));
/* Идем по кольцевой очереди в поисках активного потока */
do
{
current_thread = (thread_t*) current_thread->list_item.next;
current_proc = (process_t*) current_proc->list_item.next;
} while ( (current_thread->suspend) || (current_proc->suspend) );
/* Устанавливаем каталог страниц для нового процесса */
asm volatile ("mov %0, %%cr3"::"a"(current_proc->page_dir));
/* Устанавливаем указатель стека новой задачи */
asm volatile ("mov %0, %%esp"::"a"(current_thread->state.esp));
/* Снова разрешаем прерывания */
asm volatile ("sti");
}
}
Создание нового потокаКод:
thread_t* create_thread(process_t* proc,
void* entry_point,
size_t stack_size,
bool kernel,
bool suspend)
{
void* stack = NULL;
/* Запрещаем прерывания */
asm volatile ("cli");
/* Выделяем память под описатель потока */
thread_t* tmp_thread = (thread_t*) kmalloc(sizeof(thread_t));
/* Зануляем память описателя */
memset(tmp_thread, 0, sizeof(thread_t));
/* Инициализируем поток */
tmp_thread->id = next_thread_id++;
tmp_thread->list_item.list = NULL;
tmp_thread->process = proc;
tmp_thread->stack_size = stack_size;
tmp_thread->suspend = suspend;/* */
tmp_thread->state.eip = (u32int) entry_point;
/* Выделяем память под стек потока */
stack = kmalloc(stack_size);
/* Инициализируем указатель стека */
tmp_thread->state.esp = (u32int) stack + stack_size - 16;
/* Ставим поток в очередь */
list_add(&thread_list, &tmp_thread->list_item);
/* Наращиваем счетчик потоков текущего процесса */
proc->threads_count++;
/* Заполняем стек потока */
u32int eflags;
asm volatile ("pushf; pop %0":"=r"(eflags));
/* Создаем указатель на стековый кадр для удобного заполнения */
u32int* esp = (u32int*) (stack + stack_size);
esp[0] = eflags;
esp[-1] = 0x1;
esp[-2] = 0x2;
esp[-3] = (u32int) entry_point;
/* Включаем прерывания */
asm volatile ("sti");
/* Возвращаем указатель на поток для последующего управления им */
return tmp_thread;
}
Собственно сами
функции потоковКод:
void task01(void)
{
while (1)
{
print_text_XY(0, 10, "I'm task #1");
print_dec_XY(13, 10, count01);
count01++;
}
}
void task02(void)
{
while (1)
{
print_text_XY(0, 11, "I'm task #2");
print_dec_XY(13, 11, count02);
count02 += 2;
}
}
void task03(void)
{
while (1)
{
print_text_XY(0, 12, "I'm task #3");
print_dec_XY(13, 12, count03);
count03 += 3;
}
}
Инициализация планировщика и main() изменений не претерпели