為了使用unistd.h中的巨集,該巨集用來進行系統呼叫,
系統呼叫是通過0x80進行的,防止使用使用者棧空間。
#define __library__
#include
#include
宣告系統呼叫,採用內聯的方式。
fork系統呼叫
static inline _syscall0(int,fork)
pause系統呼叫
static inline _syscall0(int,pause)
setup系統呼叫
static inline _syscall1(int,setup,void *,bios)
sync系統呼叫
static inline _syscall0(int,sync)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static char printbuf[1024];
extern int vsprintf();
extern void init(void);
extern void blk_dev_init(void);
extern void chr_dev_init(void);
extern void hd_init(void);
extern void floppy_init(void);
extern void mem_init(long start, long end);
extern long rd_init(long mem_start, int length);
extern long kernel_mktime(struct tm * tm);
extern long startup_time;
參見setup.s中,通過bios中斷載入的系統引數。
擴充套件記憶體大小
#define ext_mem_k (*(unsigned short *)0x90002)
硬碟參數列
#define drive_info (*(struct drive_info *)0x90080)
根檔案系統的裝置號
#define orig_root_dev (*(unsigned short *)0x901fc)
讀取cmos的實時鐘
#define cmos_read(addr) ()
將bcd碼轉換成二進位製碼
#define bcd_to_bin(val) ((val)=((val)&15) + ((val)>>4)*10)
將實時鐘時間轉換成2023年1月1日0時開始的秒數
static void time_init(void)
while (time.tm_sec != cmos_read(0));
bcd_to_bin(time.tm_sec);
bcd_to_bin(time.tm_min);
bcd_to_bin(time.tm_hour);
bcd_to_bin(time.tm_mday);
bcd_to_bin(time.tm_mon);
bcd_to_bin(time.tm_year);
time.tm_mon--;
startup_time = kernel_mktime(&time);
}static long memory_end = 0;
static long buffer_memory_end = 0;
static long main_memory_start = 0;
struct drive_info drive_info;
main函式的返回型別是void,由head.s壓入棧時決定的。
void main(void)
等待init程序退出
for(;;) pause();
}定義printf函式。
static int printf(const char *fmt, ...)
static char * argv_rc = ;
static char * envp_rc = ;
static char * argv = ;
static char * envp = ;
void init(void)
父程序等待子程序結束
if (pid>0)
while (pid != wait(&i))
/* nothing */;
while (1)
if (!pid)
等待子程序結束
while (1)
if (pid == wait(&i))
break;
printf("/n/rchild %d died with code %04x/n/r",pid,i);
對快取進行重新整理
sync();
}_exit(0);
}
linux系統啟動
本文簡單介紹一下從我們按開機鍵到可以登入系統,這段時間系統和電腦硬體是怎麼一起工作的。既做為對自己知識的乙個總結整理,也可以給linux初級使用者做乙個入門介紹,高手請略過。一般來說linux的啟動可以分成三個階段 bios階段,系統引導階段,系統啟動階段。一 bios階段 bios 基本輸入輸出系...
linux系統啟動
本文簡單介紹一下從我們按開機鍵到可以登入系統,這段時間系統和電腦硬體是怎麼一起工作的。既做為對自己知識的乙個總結整理,也可以給linux初級使用者做乙個入門介紹,高手請略過。一般來說linux的啟動可以分成三個階段 bios階段,系統引導階段,系統啟動階段。一 bios階段 bios 基本輸入輸出系...
Linux系統啟動
1.系統啟動流程大概 1 啟動bios 2 mbr中的引導 bootcode 3 執行引導程式 linux中用的最多的是grub 引導程式的主要作用是用來載入核心 4 載入系統核心 5 執行init 6 runlevel init根據當前預設的執行級別來啟動相關的程式及裝置 2.bios basic...