從零實現乙個作業系統 day7

2021-10-05 10:43:30 字數 2908 閱讀 3029

我的部落格startcraft

因為在核心中,大部分的c標準庫函式無法使用,字串操作的函式又比較常用,所有自己實現一些

#ifndef include_string_h_

#define include_string_h_

#include

"types.h"

void

memcpy

(uint8_t *dest,

const uint8_t *src, uint32_t len)

;void

memset

(void

*dest, uint8_t val, uint32_t len)

;void

bzero

(void

*dest, uint32_t len)

;int

strcmp

(const

char

*str1,

const

char

*str2)

;char

*strcpy

(char

*dest,

const

char

*src)

;char

*strcat

(char

*dest,

const

char

*src)

;int

strlen

(const

char

*src)

;#endif

// include_string_h_

#include

"string.h"

void

memcpy

(uint8_t *dest,

const uint8_t *src, uint32_t len)

}void

memset

(void

*dest, uint8_t val, uint32_t len)

void

bzero

(void

*dest, uint32_t len)

intstrcmp

(const

char

*str1,

const

char

*str2)

}char

*strcpy

(char

*dest,

const

char

*src)

*dest=

'\0'

;return dest;

}char

*strcat

(char

*dest,

const

char

*src)

while

(*src)

*dest=

'\0'

;return dest;

}int

strlen

(const

char

*src)

return len;

}

現在我們來嘗試一下實現printf函式

首先是函式宣告

#include

"console.h"

#include

"vargs.h"

// 核心的列印函式

void

printk

(const

char

*format,..

.);// 核心的列印函式帶顏色

void

printk_color

(real_color_t back, real_color_t fore,

const

char

*format,..

.);

參數列的三個點代表的就是任意個數的實參,然後就是如何在沒有形參名的情況下獲取到實參

注意到上面的**包含了另乙個標頭檔案,內容如下

#ifndef include_vargs_h_

#define include_vargs_h_

typedef __builtin_va_list va_list;

#define va_start(ap, last) (__builtin_va_start(ap, last))

#define va_arg(ap, type) (__builtin_va_arg(ap, type))

#define va_end(ap)

#endif

// include_vargs_h_

這個裡面定義的一些巨集是用於取得printk函式呼叫時的所有引數 ,__builtin_va_list這些是gcc內部實現的

當然也可以自己實現,一般定義為巨集,如

#define va_list char*

#define __va_rounded_size(type) (((sizeof (type) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))

#define va_start(ap, lastarg) (ap = ((char *) &(lastarg) + __va_rounded_size (lastarg)))

#define va_arg(ap, type) (ap += __va_rounded_size (type),*((type *) \

(ap - __va_rounded_size (type))))

#define va_end(ap) ( ap = (va_list)0 )

來分析一下這些巨集都幹了什麼,

從零實現乙個作業系統 day1

我的部落格 startcraft.cn 從這次春招中的碰壁和各種感悟,深刻體會到自己基礎知識的不足,從零實現乙個作業系統可以幫助自己更好得了解作業系統的知識。自己很早之前就開始有寫乙個微型作業系統的想法,之前也實踐過,但弄了幾天就放棄了,發現自己的毅力太差了,其實就是太懶了,寫blog的目的也有敦促...

從零實現乙個作業系統 day2

我的部落格 startcraft.cn 今天主要是對作業系統的啟動進行學習,因為都是理論的部分,這篇部落格就當學習的筆記了 首先在按下電源鍵後計算機首先讀取寫在rom中的bios basic input output system 基本輸入輸出系統 然後bios程式會進行硬體自檢,若硬體出問題發出相...

(7)從1開始寫乙個作業系統

時間片輪轉排程是一種最古老,最簡單,最公平且使用最廣的演算法。每個任務被分配乙個時間段,稱作它的時間片,即該任務允許執行的時間。如果在時間片結束時程序還在執行,則cpu將被剝奪並分配給另乙個任務。如果任務在時間片結束前阻塞或結束,則cpu當即進行切換。排程程式所要做的就是維護一張任務先後執行的列表,...