在系統有了命令列視窗後,我們可以直接在視窗內輸入命令,啟動應用程式。當通過命令列載入執行使用者開發的程式時,命令行會被『冷凍』,這是因為被啟動的程式與命令列屬於同一程序,cpu要把執行的許可權交給應用程式,命令列視窗得不到執行的機會,因此看上去像宕機一樣。
這造成的乙個問題是,命令列視窗一次只能載入乙個應用程式,然後必須等到程式執行結束後,cpu控制權交還給命令列視窗時,它才有機會啟動另乙個應用程式。我們可以把命令列視窗的程式啟動機制進行修改,使得應用程式執行後,控制台仍然能獲取cpu的執行許可權,但這麼改動難度不小,為了簡單起見,我們把系統更改為能同時執行多個命令列視窗,每個視窗能各自載入應用程式,這樣我們就能實現多個應用程式同時並行。
我們現在核心的c語言部分做**更改,在write_vga_desktop.c中,先增加兩個變數:
static
struct task *task_cons[2];
我們先定義乙個全域性變數,這個陣列將用來儲存控制台程序,我們暫時先同時開啟兩個控制台程序。在cmain主函式中做如下修改:
void cmain(void)
sheet_slide(shtctl, sht_cons[1], 56, 6);
sheet_slide(shtctl, sht_cons[0], 8, 2);
sheet_updown(shtctl, sht_cons[1], 1);
sheet_updown(shtctl, sht_cons[0], 2);
....
}
這裡,我們同時啟動兩個命令列視窗程序,sht_cons[2]這個變數用來儲存命令列視窗的視窗圖層,接下來的sheet_slide,和sheet_updown用來調整命令列視窗的位置。
我們接著需要對建立控制台程序的函式launch_console做相應修改:
struct sheet* launch_console(int i)
該函式相比於原來變動,一是增加了輸入引數i,它用來標記當前是第幾個控制台程序,在建立程序物件後,在指定它的堆疊指標時,我們從記憶體分配了64k的記憶體塊:
task_console->tss.esp =memman_alloc_4k(memman, 64 * 1024) + 64 * 1024 - 12;
以前的實現沒有這麼做,因此是乙個bug.建立好程序物件後,把它存入控制台程序陣列,接著使用task_run載入程序。由於我們原先設計時只有乙個控制台程序,因此很多有關控制台的控制資訊都存在乙個全域性變數g_console中,現在我們要建立多個控制台,於是使用全域性變數就不合適了。因此我們需要把console的結構體定義放入到任務物件結構體task中,所以我們把struct console 的定義轉移到global_define.h,然後在mutli_task.h中修改task結構體的定義:
struct task ;
#define max_tasks 10
#define max_tasks_lv 10
#define max_tasklevels 10
#define task_gdt0 7
#define size_of_task 256
我們除了在task結構體中增加了控制台物件console外,還增加了乙個buffer指標ptaskbuffer, 它的作用一會我們會提到。我們的目的是為了建立多個控制台視窗,通過控制台啟動多個使用者程式,啟動使用者程式的控制台命令是hlt,實現該命令的函式是cmd_hlt,因此我們也需要對此函式做相應改動:
void cmd_hlt()
//new memory
char *q = (char *) memman_alloc_4k(memman, 64*1024);
set_segmdesc(gdt + mem_seg, 64 * 1024 - 1,(int) q ,0x4092 + 0x60);
task->tss.esp0 = 0;
io_sti();
io_cli();
memman_free_4k(memman, (unsigned int) q, 64 * 1024);
task->ptaskbuffer = 0;
io_sti();
}
在函式裡,我們動態建立了buffer物件,這個物件是用來載入使用者開發的程式**的,當函式呼叫file_loadfile載入使用者程式**資料後,這些資訊會儲存在buffer物件,這個buffer物件會儲存在task物件的ptaskbuffer成員變數。
這裡需要注意的是,我們要啟動兩個程序執行同一分使用者程式**,因此**需要對應不同的段描述符:
int code_seg = 21;
int mem_seg = 22;
if (task == task_cons[0])
上面**片段的作用是,如果當前是第乙個控制台程序,那麼使用者應用程式對應的**段和資料段描述符分別是23,24,如果是第2個控制台程序,那麼應用程式**對應的**段和資料段描述符就分別是21,22.
由於我們把全域性變數g_console替換成每個程序task中的console變數,因此**中所有用到g_console的地方都要替換成task->console。
完成上面**改動,載入系統執行後,效果如下:
通過執行效果,我們可以看到,系統執行起來兩個控制台視窗,並在每個視窗內執行hlt命令,於是又分別執行了兩個相同的使用者程式,這一來,整個系統就有5個程序在同時執行。我們雖說現在只有兩個控制台視窗,只要稍加修改,系統就能建立任意多個控制台視窗。
Cent OS下配置多tomcat同時執行
核心思想 放在不同的目錄下,修改埠及環境變數 1 配置profile vi etc profile2 加入以下 tomcat路徑要配置自己實際的tomcat安裝目錄 first tomcat catalina base usr local tomcat catalina home usr local...
Qt 多軟體同時執行 IP繫結問題
最近一直使用qt開發一些配合裝置除錯用的軟體,從中遇到一些問題,簡單記錄一下。背景 在同一臺筆記本上,同時執行3個基於qt開發的軟體,這三個軟體之間通過udp組播或單播進行通訊 場景一 將3個軟體 a b c 需要繫結的ip設定在同乙個網絡卡上,繫結同乙個埠號 由於存在a軟體傳送組播,b軟體需要接收...
執行自己開發的作業系統
第一步 安裝作業系統redhat9.0 詳細的安裝作業系統步驟在這裡就不多說了,需要幫助的朋友可以參考安裝文件。選擇redhat的目的有兩個 一是用的人比較多,出了問題在網路中可以很輕鬆的找到解決辦法,節約很多時間。二是安裝軟體比較方便,資源相對也比較多。在安裝過程中需要注意的是,選擇完全安裝,因為...