乙個作業系統的實現(于淵) 前七章總結

2021-07-14 15:46:39 字數 2086 閱讀 4350

在前七章這個作業系統大概實現了使用者程序、系統任務的分層,實現了tty和鍵盤,和一些簡單的系統呼叫,具體現象是在bochs上可實現鍵盤的輸入和特殊輸入(換行),

**具體邏輯如下:

1.首先看看kernel/main.c的kernel_main.c函式

public int kernel_main()

else

strcpy(p_proc->p_name, p_task->name); // name of the process

p_proc->pid = i; // pid

p_proc->ldt_sel = selector_ldt;

memcpy(&p_proc->ldts[0], &gdt[selector_kernel_cs >> 3],

sizeof(descriptor));

p_proc->ldts[0].attr1 = da_c | privilege << 5;

memcpy(&p_proc->ldts[1], &gdt[selector_kernel_ds >> 3],

sizeof(descriptor));

p_proc->ldts[1].attr1 = da_drw | privilege << 5;

p_proc->regs.cs = (0 & sa_rpl_mask & sa_ti_mask) | sa_til | rpl;

p_proc->regs.ds = (8 & sa_rpl_mask & sa_ti_mask) | sa_til | rpl;

p_proc->regs.es = (8 & sa_rpl_mask & sa_ti_mask) | sa_til | rpl;

p_proc->regs.fs = (8 & sa_rpl_mask & sa_ti_mask) | sa_til | rpl;

p_proc->regs.ss = (8 & sa_rpl_mask & sa_ti_mask) | sa_til | rpl;

p_proc->regs.gs = (selector_kernel_gs & sa_rpl_mask) | rpl;

p_proc->regs.eip = (u32)p_task->initial_eip;

p_proc->regs.esp = (u32)p_task_stack;

p_proc->regs.eflags = eflags;

p_proc->nr_tty = 0;

p_task_stack -= p_task->stacksize;

p_proc++;

p_task++;

selector_ldt += 1 << 3;

} proc_table[0].ticks = proc_table[0].priority = 15;

proc_table[1].ticks = proc_table[1].priority = 5;

proc_table[2].ticks = proc_table[2].priority = 5;

proc_table[3].ticks = proc_table[3].priority = 5;

proc_table[1].nr_tty = 0;

proc_table[2].nr_tty = 1;

proc_table[3].nr_tty = 1;

k_reenter = 0;

ticks = 0;

p_proc_ready = proc_table;

init_clock();

init_keyboard();

restart();

while(1){}

}

這個函式在kernel/kernel.asm中實現跳轉

jmp	kernel_main
這裡也實現了從組合語言到c語言的跳轉,在這個跳轉之前,cpu都是在執行我們用彙編寫的部分。

而在kernel_main()函式裡最後一句,我們的cpu停在while迴圈。那麼接下來都是我們的cpu發生中斷,然後執行其他程式了,這裡也是作業系統一直幹的事,可以理解為他一直在等待中斷的發生。

2.接下來是中斷。。。。

乙個作業系統的實現 2

接上文 xiongjian 2010.12.22 msn cug live.cn 10 下面開始程序,首先引入幾個基本原則 1 程序表a用來儲存程序a的資訊和程序a切換時,儲存當前a執行時暫存器資訊。定義為 processproc table 1024 表示系統最多可以有1024個程序,proces...

乙個簡單的作業系統

電腦上電後,bios在自檢後會根據使用者指定的裝置啟動作業系統。假設我們指定軟盤為啟動盤,bios會把軟盤的第乙個扇區 512位元組 讀取到記憶體的0x7c00處,如果這個扇區的最後兩個位元組為0xaa55,bios會跳轉到0x7c00處開始執行。我們可以利用這樣乙個過程做乙個簡單的作業系統。我們的...

乙個作業系統的實現 freedos中edit問題

在於淵的乙個作業系統的實現第二版中,第四章開始那裡寫到 假設是x.img,然後把它作為freedos的b盤,格式化後就可以方便的往其中新增檔案了和目錄了 比如使用freedos裡面的edit.exe 可是在freedos裡面我找不到edit.exe啊。不過,格式化 盤也就是x.img那裡我也卡了好一...