網易雲課堂linux核心分析(二)

2021-09-19 10:17:00 字數 2198 閱讀 9967

老師已經為我們搭好了實驗的環境——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名學習者了,就是不知道他...