老師已經為我們搭好了實驗的環境——linux3.9.4下乙個極其迷你的系統。我們不用去關心別的東西,只需要知道這個迷你系統從my_start_kernel
函式開始,系統時鐘中斷會執行my_timer_handler
函式。剩下的留給我們自己發揮。同時,實驗要寫的**已經給出,所以完成這個實驗的難度不大。實驗的關鍵是理解所給的**為什麼要這麼寫,也就是理解程式如何切換。
mypcb.h
定義程序的屬性和資訊。
#define max_task_num 10 //這個系統最多十個程序
#define kernel_stack_size 1024*8 //每個程序的棧的大小
//程序的各種狀態
#define my_running 1
#define my_sleep 2
#define my_dead 3
//用於程序排程時,儲存它棧位址和**位址
struct thread
;typedef struct pcb
tpcb;
void my_schedule(void);
總的來說my_start_kernel
就是建立各個程序,並且進入0號程序。
#include "mypcb.h" //pcb結構資訊
tpcb my_task[max_task_num]; //建立若干個pcb。也就是建立若干個任務
tpcb *my_current = null; //用來表示當前任務的指標。
//是否要進行程式切換的標記。1為需要,0相反。
//這個變數由my_timer_handler和my_process修改
extern volatile int my_need_sched;
//建立的程序都執行這個函式
void my_process(void)} }
}//迷你系統從這個函式開始執行。
void __init my_start_kernel(void)
/* going to switch to task 0! */
printk(kern_notice "main going to switch to task 0\n");
//好緊張,要開始切換了。
my_current = &my_task[0];
asm volatile(
"movl %1, %%esp\n\t" //將esp和ebp設定為任務0的棧
"movl %1, %%ebp\n\t"
"pushl %0\n\t" //不能直接修改eip,所以先將任務0的位址入棧
"ret\n\t" //再通過ret賦值給eip
::"c"(my_task[0].thread.ip), "d"(my_task[0].thread.sp));}
myinterupt.c
實現了時鐘中斷處理和程式排程。
//記錄時鐘中斷了多少次
volatile unsigned long time_count = 0;
volatile int my_need_sched = 0;
//當前程序的pcb
extern tpcb *my_current;
/* * called by timer interrupt.
*///每次時鐘中斷都會執行它
void my_timer_handler(void)
printk(kern_notice "task %d is going to task %d\n", my_current->pid, next->pid);
my_current = next;
if (next->state == my_running)
else if (next->state == my_sleep)
}
程序從0到9,又從9到0迴圈執行。
了解了程序如何進行初始化和切換:實質就是暫存器和棧的切換。
問題:切換不需要儲存當前的eax等通用暫存器嗎?
網易雲課堂 Linux核心分析(四)
參見實驗報告 api和系統呼叫 系統呼叫通過軟中斷向核心發出乙個明確的請求 庫再用這些封裝例程定義出給使用者的api 不是每個api都對應乙個特定的系統呼叫 乙個單獨的api可能呼叫了幾個係用呼叫 不同的api可能呼叫同乙個系統呼叫 返回值 用呼叫程式及服務例程 傳參 核心實現了很多不同的系統呼叫,...
網易雲課堂學習 rocketmq入門
rocketmq是什麼 是由阿里捐贈給apache的一款分布式 佇列模型的開源訊息中介軟體,經歷了雙十一的洗禮。rocketmq的發展史 rocketmq的特性 rocketmq 基本概念 producer 訊息生產者,負責生產訊息,一般有業務系統負責生產訊息。consumer 訊息消費者,負責消費...
聊一聊 網易雲課堂
首先說明,這不是廣告,知識我個人的一點感受而已 若干天之前註冊了網易雲課堂,並填寫 郵寄申請講師的材料。若干天之後的今天,終於收到通知,我通過了講師認證,給我名字上加了個大大的 v 以及 petshop4.0原始碼解讀 教程通過了審核,正式發布了。下班之前看了看,竟然已經有6名學習者了,就是不知道他...