我的部落格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當即進行切換。排程程式所要做的就是維護一張任務先後執行的列表,...