linux系統啟動main c分析

2021-04-20 02:39:12 字數 2576 閱讀 3947

為了使用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...