Linux內(nèi)核分析 lab2 計(jì)算機(jī)運(yùn)行原理 總結(jié)

鄭卓彬 + 原創(chuàng)作品轉(zhuǎn)載請(qǐng)注明出處 + 《Linux內(nèi)核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000

前言:

該實(shí)驗(yàn)泽裳,主要是老師讓我們理解內(nèi)核中進(jìn)程切換的原理瞒斩。

內(nèi)容:



代碼解析:

mypch.h


#define MAX_TASK_NUM? ? ? ? 4

#define KERNEL_STACK_SIZE? 1024*2?

/* CPU-specific state of this task */

struct Thread {

unsigned long ip;

unsigned long sp;

};

typedef struct PCB{

int pid;

volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */

unsigned long stack[KERNEL_STACK_SIZE];

/* CPU-specific state of this task */

struct Thread thread;

unsigned long task_entry;

struct PCB *next;

}tPCB;

void my_schedule(void);


解析:該頭文件主要定義了如下兩個(gè)結(jié)構(gòu)

1、Thread : 線程涮总,里面就定義了 ip胸囱、sp兩個(gè)屬性,分別用來(lái)存儲(chǔ)線程切換時(shí)的eip和esp的值妹卿,在下回調(diào)度該進(jìn)程時(shí)可以用該線程回推出進(jìn)程的上下文旺矾。

2、PCB:進(jìn)程管理塊夺克,里面存儲(chǔ)了狀態(tài)變量箕宙、進(jìn)程棧、管理的進(jìn)程铺纽、下一個(gè)調(diào)度的pcb的指針柬帕。


mymain.c


#include

#include

#include

#include

#include

#include "mypcb.h"

tPCB task[MAX_TASK_NUM];

tPCB * my_current_task = NULL;

volatile int my_need_sched = 0;

void my_process(void);

void __init my_start_kernel(void)

{

int pid = 0;

int i;

/* Initialize process 0*/

task[pid].pid = pid;

task[pid].state = 0;/* -1 unrunnable, 0 runnable, >0 stopped */

task[pid].task_entry = task[pid].thread.ip = (unsigned long)my_process;

task[pid].thread.sp = (unsigned long)&task[pid].stack[KERNEL_STACK_SIZE-1];

task[pid].next = &task[pid];

/*fork more process */

for(i=1;i

{

memcpy(&task[i],&task[0],sizeof(tPCB));

task[i].pid = i;

task[i].thread.sp = (unsigned long)&task[i].stack[KERNEL_STACK_SIZE-1];

*((unsigned long *)task[i].thread.sp - 1) = task[i].thread.sp;

task[i].thread.sp -= 1;

task[i].next = task[i-1].next;

task[i-1].next = &task[i];

}

/* start process 0 by task[0] */

pid = 0;

my_current_task = &task[pid];

asm volatile(

"movl %1,%%esp\n\t" /* set task[pid].thread.sp to esp */

"pushl %1\n\t" ? ? ? ? /* push ebp */

"pushl %0\n\t" ? ? ? ? /* push task[pid].thread.ip */

"ret\n\t" ? ? ? ? ? ? /* pop task[pid].thread.ip to eip */

"popl %%ebp\n\t"

:

: "c" (task[pid].thread.ip),"d" (task[pid].thread.sp) /* input c or d mean %ecx/%edx*/

);

}

void my_process(void)

{

int i = 0;

while(1)

{

i++;

if(i%10000000 == 0)

{

printk(KERN_NOTICE "this is process %d -\n",my_current_task->pid);

if(my_need_sched == 1)

{

my_need_sched = 0;

my_schedule();

}

printk(KERN_NOTICE "this is process %d +\n",my_current_task->pid);

}

}

}


解析:

1、__init my_start_kernel ?方法是內(nèi)核啟動(dòng)后會(huì)執(zhí)行的方法:

? ? 在方法里我們定義了4個(gè)線程,并使他們形成一個(gè)環(huán)陷寝,內(nèi)核一開始就調(diào)用進(jìn)程0.之后進(jìn)程0執(zhí)行my_process方法锅很,

2、my_process 方法是每個(gè)進(jìn)程會(huì)執(zhí)行的函數(shù):

? ? 在該方法里凤跑,會(huì)一直反復(fù)循環(huán)爆安,每循環(huán)100000000次,就會(huì)檢查進(jìn)程的狀態(tài)仔引,如果狀態(tài)值等于1則會(huì)執(zhí)行進(jìn)程的調(diào)度扔仓,然后下一個(gè)進(jìn)程進(jìn)入執(zhí)行。


myinterrupt.c


#include

#include

#include

#include

#include

#include "mypcb.h"

extern tPCB task[MAX_TASK_NUM];

extern tPCB * my_current_task;

extern volatile int my_need_sched;

volatile int time_count = 0;

void my_schedule(void)

{

tPCB * next;

tPCB * prev;

if(my_current_task == NULL

|| my_current_task->next == NULL)

{

return;

}

printk(KERN_NOTICE ">>>my_schedule<<<\n");

/* schedule */

next = my_current_task->next;

prev = my_current_task;

if(next->state == 0)/* -1 unrunnable, 0 runnable, >0 stopped */

{

my_current_task = next;

printk(KERN_NOTICE ">>>switch %d to %d<<<\n",prev->pid,next->pid);

/* switch to next process */

asm volatile(

"pushl %%ebp\n\t" ? ? /* save ebp */

"movl %%esp,%0\n\t" /* save esp */

"movl %2,%%esp\n\t"? ? /* restore? esp */

"movl $1f,%1\n\t"? ? ? /* save eip */

"pushl %3\n\t"

"ret\n\t" ? ? ? ? ? ? /* restore? eip */

"1:\t"? ? ? ? ? ? ? ? ? /* next process start here */

"popl %%ebp\n\t"

: "=m" (prev->thread.sp),"=m" (prev->thread.ip)

: "m" (next->thread.sp),"m" (next->thread.ip)

);

}

return;

}


解析:該調(diào)度咖耘,使用了匯編代碼翘簇,在匯編代碼中,將下個(gè)進(jìn)程的sp和ip放入了cpu的esp和eip中儿倒,讓cpu去該進(jìn)程的ip取指版保,并將棧頂寄存器esp指向了該線程的棧頂。


運(yùn)行結(jié)果:



總結(jié):

進(jìn)程的切換第一步:就是當(dāng)前進(jìn)程上下文夫否,在本文中就是sp和ip值彻犁。

第二步:將下一個(gè)進(jìn)程的上下文提取到cpu中。在本文就是將sp和ip的值分別取到esp和eip中慷吊。

第三步:cpu直接執(zhí)行eip地址的指令袖裕。這樣進(jìn)程就完成了切換曹抬。

所以溉瓶,操作系統(tǒng)就是一直運(yùn)行著的,對(duì)進(jìn)程進(jìn)行調(diào)度谤民,資源進(jìn)行管理堰酿,文件管理的連接軟件和硬件的程序。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末张足,一起剝皮案震驚了整個(gè)濱河市触创,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌为牍,老刑警劉巖哼绑,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異碉咆,居然都是意外死亡抖韩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門疫铜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)茂浮,“玉大人,你說(shuō)我怎么就攤上這事∠浚” “怎么了顽馋?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)幌羞。 經(jīng)常有香客問(wèn)我寸谜,道長(zhǎng),這世上最難降的妖魔是什么属桦? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任程帕,我火速辦了婚禮,結(jié)果婚禮上地啰,老公的妹妹穿的比我還像新娘愁拭。我一直安慰自己,他們只是感情好亏吝,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布岭埠。 她就那樣靜靜地躺著,像睡著了一般蔚鸥。 火紅的嫁衣襯著肌膚如雪惜论。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天止喷,我揣著相機(jī)與錄音馆类,去河邊找鬼。 笑死弹谁,一個(gè)胖子當(dāng)著我的面吹牛乾巧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播预愤,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼沟于,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了植康?” 一聲冷哼從身側(cè)響起旷太,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎销睁,沒(méi)想到半個(gè)月后供璧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冻记,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年睡毒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片檩赢。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吕嘀,死狀恐怖违寞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情偶房,我是刑警寧澤趁曼,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站棕洋,受9級(jí)特大地震影響挡闰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掰盘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一摄悯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧愧捕,春花似錦奢驯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至邮偎,卻和暖如春管跺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背禾进。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工豁跑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泻云。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓艇拍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親壶愤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子淑倾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 又來(lái)到了一個(gè)老生常談的問(wèn)題馏鹤,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢征椒? 今天就這個(gè)問(wèn)題開始,來(lái)談?wù)劜?..
    tangsl閱讀 4,098評(píng)論 0 23
  • 如果你看完書中的所有例子湃累,你很可能已經(jīng)做完你的實(shí)驗(yàn)和在已經(jīng)越獄的iPhone上的研究勃救。因?yàn)楹驮S多人一樣,幾乎所有的...
    fishmai0閱讀 15,881評(píng)論 2 42
  • 午后獨(dú)步閑游 于河畔長(zhǎng)椅上小憩 不知不覺(jué)閉上眼睛 暖陽(yáng)照得全身既柔軟又溫暖 真羨慕那些貓 只可惜我沒(méi)有它們一身的毛...
    安靜的復(fù)蘇918閱讀 148評(píng)論 0 0
  • 《紅樓夢(mèng)》中晕讲,正面寫到的青年夫婦,就是鳳姐和賈鏈。 恍若神仙妃子的鳳姐瓢省,騎著銀鞍白馬弄息,彩轡珠纓的賈鏈,一對(duì)少爺少奶...
    玉樓人醉閱讀 398評(píng)論 1 4
  • 天兒真好勤婚,我在車?yán)锎抵照{(diào)哼著小曲兒摹量,吃完了入夏第一根雪糕。從舌尖到胸腔溜到小腹馒胆,一團(tuán)團(tuán)綿綿的涼氣回旋而下缨称,心中很...
    z紫暄z閱讀 199評(píng)論 0 0