亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

編寫和運行簡單的"Hello World"操作系統內核

2024-06-28 13:28:03
字體:
來源:轉載
供稿:網友
編寫和運行簡單的"Hello World"操作系統內核

通常編寫一個操作系統內核是一項浩大的工程。但我今天的目標是制作一個簡單的內核,用比較方便的方法在虛擬機上驗證它能夠被grub裝載和運行,并且可通過gdb進行調試,為接下去的工作創造一個基礎環境。

首先,為了方便運行和調試我們需要一個虛擬機。虛擬機有很多選擇,這里用最簡單的qemu。

先用dd創建一個文件作為虛擬盤,100MB就可以了:

$ dd if=/dev/zero of=disk.img count=204800 bs=512

然后對這個虛擬磁盤進行分區:

$ fdisk -c=dos disk.img

用命令n創建一個分區就可以了。通常情況下分區的起始扇區是2048(不帶選項-c=dos),如果用老式的msdos格式分區表(命令c),就可以選擇從63扇區開始。以前文章里提到63個扇區足夠塞下grub的核心映像,所以為了測試下grub就選擇了msdos模式。用命令w把變動寫入虛擬盤。

把這個分區虛擬成設備文件:

$ sudo losetup -o 32256 /dev/loop1 disk.img

這里指定了起始扇區的偏移量。63個扇區,每個扇區512個字節,總共是32256字節。如果你的分區起始扇區是2048,那么偏移量應該是2048 * 512字節。

格式化:

$ sudo mkfs.ext4 /dev/loop1

掛載起來,這樣就可以方便地往里面放kernel和grub需要的配置文件和模塊什么的:

$ sudo mount /dev/loop1 /mnt

安裝grub:

$ sudo grub-install --boot-directory=/mnt --modules="part_msdos" disk.img

使用qemu來啟動虛擬機(我用的是64位系統):

$ qemu-system-x86_64 -hda disk.img -m 1024 -s &

這時候應該能夠看到grub的提示符了。當然現在還沒有grub菜單也沒有kernel,我們暫時先關掉虛擬機。

接下來可以為grub建立個multiboot啟動菜單:

$ sudo vi /mnt/grub/grub.cfg

制作菜單命令:

menuentry "Hello" {  multiboot (hd0,msdos1)/kernel  boot}

確保數據寫回了虛擬盤:

$ sync

這時候如果你再打開虛擬機,應該就可以看到啟動菜單了,當然因為還沒有kernel,選擇菜單項后無法繼續,會提示kernel找不到。

下一步,我們用c語言從頭編寫個最簡單kernel程序。這個kernel沒有實現操作系統的基本功能。但是可以被grub裝載和運行。

kernel.c:

/* 在文件里嵌入一個簽名。Grub在multiboot時會尋找這個簽名 */#define GRUB_MAGIC 0x1BADB002#define GRUB_FLAGS 0x0#define GRUB_CHECKSUM (-1 * (GRUB_MAGIC + GRUB_FLAGS))struct grub_signature {    unsigned int magic;    unsigned int flags;    unsigned int checksum;};struct grub_signature gs __attribute__ ((section (".grub_sig"))) = {    GRUB_MAGIC,    GRUB_FLAGS,    GRUB_CHECKSUM};/* 顯示字符的函數。因為我們什么庫都不能用,只能直接寫屏了。0xB8000是VGA彩色字符模式的數據緩存。每個字符用兩個字節表示。前一個是Ascii碼,后一個代表顏色。 */void puts( const char *s, int color ){    volatile char *buffer = (volatile char*)0xB8000;    while( *s != 0 )  {        *buffer++ = *s++;        *buffer++ = color;    }}/* 主函數,程序入口。最后用個死循環,把代碼指針困在那里。*/void main (void) {    puts("Hello World!", 0x7);    while (1) {}}

有必要再寫個鏈接模板,確保編譯好的kernel裝載在內存地址0x100000,這里是grub代碼最后跳轉到的區域,從這里我們的kernel接過了接力棒。另外,雖然我用的虛擬機是64位的,但是我需要生成一個32位的kernel,因為做64位的kernel還需要做額外的設置工作,比如從32位保護模式打開long mode,比較麻煩。所以先暫時用32位的kernel。

kernel.ld:

OUTPUT_FORMAT("elf32-i386")ENTRY(main)SECTIONS{    .grub_sig 0x100000 : AT(0x100000)    {        *(.grub_sig)    }    .text :    {        *(.text)    }    .data :    {        *(.data)    }    .bss :    {        *(.bss)    }    /DISCARD/ :    {        *(.comment)        *(.eh_frame)    }}            

還有一個Makefile,主要是設置一些編譯選項。

Makefile:

CC = gccLD = ldCFLAGS = -std=c99 -pedantic -Wall -nostdlib -ffreestanding -m32LDFLAGS = -T kernel.ld -nostdlib -n -melf_i386OBJS = kernel.o.PHONY: allall: kernel%.o: %.c       ${CC} -c ${CFLAGS} $<kernel: $(OBJS) kernel.ld       ${LD} ${LDFLAGS} -o kernel ${OBJS}clean:       rm -f ${OBJS} kernel

編譯生成kernel并放入我們的虛擬盤里:

$ sudo cp kernel /mnt/$ sync

再次啟動虛擬機,在啟動菜單里選擇multiboot我們的kernel,應該就能看到Hello World!的字符顯示在虛擬機屏幕上了。

如果想要調試,可以運行gdb。因為我們在啟動qemu的時候使用了-s選項,所以qemu默認會打開tcp端口1234作為gdb調試端口。在gdb中可以使用target remote tcp::1234命令來連接。試試看連接,會發現cpu一直在執行0x100066處的指令。用objdump -D kernel看下kernel的匯編代碼:

0010004c <main>: 10004c:55                   push   %ebp 10004d:89 e5                mov    %esp,%ebp 10004f:83 ec 08             sub    $0x8,%esp 100052:c7 44 24 04 07 00 00 movl   $0x7,0x4(%esp) 100059:00 10005a:c7 04 24 68 00 10 00 movl   $0x100068,(%esp) 100061:e8 a6 ff ff ff       call   10000c <puts> 100066:eb fe                jmp    100066 <main+0x1a>

0x100066處的指令正好是死循環的那條jmp指令。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品综合不卡av| 日韩有码片在线观看| 中文字幕亚洲二区| 日韩在线精品一区| 国产精品白丝av嫩草影院| 欧洲午夜精品久久久| 成人免费淫片视频软件| 欧美在线视频一区二区| 97在线日本国产| 欧美高清电影在线看| 亚洲人成网站999久久久综合| 国模视频一区二区三区| 亚洲男女自偷自拍图片另类| 欧美性生交大片免费| 日本国产高清不卡| 91极品女神在线| 欧美色道久久88综合亚洲精品| 日韩av影片在线观看| 国产福利精品av综合导导航| 国产日产久久高清欧美一区| 久久精品国产精品亚洲| 久久久久久久999精品视频| www.亚洲免费视频| 精品国产一区二区三区四区在线观看| 亚洲成人黄色网| 国产精品极品美女在线观看免费| 国产97在线|亚洲| 精品久久久一区二区| 久久天堂av综合合色| 最近2019年好看中文字幕视频| 秋霞av国产精品一区| yellow中文字幕久久| 欧美国产日本在线| 韩国精品美女www爽爽爽视频| 国产精品久久久久久久久久久新郎| 最近2019年日本中文免费字幕| 欧美片一区二区三区| 97涩涩爰在线观看亚洲| 一个色综合导航| 91视频国产高清| 亚洲成人激情视频| 国产一区二区在线播放| 日韩中文字幕在线视频| 亚洲石原莉奈一区二区在线观看| 亚洲成人精品视频在线观看| 欧美激情三级免费| 欧美成人一区在线| 亚洲乱码一区二区| 欧美午夜激情视频| 国产精品一区久久久| 色中色综合影院手机版在线观看| 自拍偷拍亚洲区| 亚洲乱码一区二区| 精品一区精品二区| 久久精品视频在线播放| 日韩电影中文字幕一区| 成人免费福利在线| 欧美日韩在线免费观看| 欧美日韩不卡合集视频| 日韩美女中文字幕| 日韩精品高清视频| 国外成人在线播放| 欧美精品一区二区免费| 精品日本美女福利在线观看| 美女999久久久精品视频| 国产九九精品视频| 亚洲成人在线网| 日韩在线高清视频| 亚洲精品日韩av| 国产精品日韩在线观看| 日韩在线免费av| 日韩精品免费综合视频在线播放| 亚洲人成亚洲人成在线观看| 性欧美xxxx交| 亚洲va久久久噜噜噜久久天堂| 国产精品国内视频| 色偷偷av一区二区三区| 综合国产在线观看| 国产午夜精品美女视频明星a级| 国产精品视频一区国模私拍| 亚洲一区二区日本| 国产精品久久久久久久美男| 欧美亚洲成人xxx| 欧美一区二区三区四区在线| 欧美xxxx18国产| 日韩av在线免费看| 欧美夫妻性视频| 亚洲美女性生活视频| 91精品国产自产在线观看永久| 欧美裸体xxxx极品少妇软件| 欧美成年人视频| 91免费国产视频| 亚洲男人天堂网站| 91精品久久久久久久久不口人| 日韩免费av在线| 亚洲第一区中文字幕| 国产区精品在线观看| 国产日本欧美一区二区三区在线| 亚洲精品免费在线视频| 国产精品久久久久久久久粉嫩av| 日韩av电影在线网| 国产午夜精品理论片a级探花| 欧美第一黄网免费网站| 亚洲人成自拍网站| 97人人做人人爱| 国产美女久久精品香蕉69| 欧洲精品毛片网站| 热99精品只有里视频精品| 欧美夫妻性生活视频| 国产男女猛烈无遮挡91| 日韩久久免费视频| 影音先锋欧美在线资源| 色综合五月天导航| 美女黄色丝袜一区| 国产v综合v亚洲欧美久久| 成人午夜在线视频一区| 国产亚洲精品久久久优势| 在线激情影院一区| 一区二区欧美亚洲| 国产精品免费视频久久久| 91美女高潮出水| 91精品视频播放| 久久中文字幕国产| 午夜精品一区二区三区在线视| 日韩精品中文字幕在线观看| 亚洲欧美视频在线| 国产成人综合精品| 国产亚洲欧美日韩一区二区| 国产成人91久久精品| 色视频www在线播放国产成人| 91在线视频免费| 国产经典一区二区| 91在线观看免费高清| 日韩精品高清视频| 欧美性感美女h网站在线观看免费| 美女啪啪无遮挡免费久久网站| 国产综合香蕉五月婷在线| 国产91精品久| 国产精品亚洲视频在线观看| 久久综合国产精品台湾中文娱乐网| 中国日韩欧美久久久久久久久| 在线视频中文亚洲| 热99精品只有里视频精品| 亚洲第一区在线| 亚洲第一视频网站| 欧美日韩另类字幕中文| 日韩高清av在线| 久久福利网址导航| 一本一本久久a久久精品综合小说| 亚洲第一精品电影| 久久精品在线视频| 色婷婷综合久久久久| 国产精品久久久久久久9999| 欧美精品午夜视频| 欧美日韩中文在线| 成人精品在线视频| 久久成人这里只有精品| 亚洲va国产va天堂va久久| 日韩精品免费看| 日韩黄色高清视频| 91精品久久久久久久久久久久久| 亚洲综合一区二区不卡| 亚洲成人av片| 97在线视频免费|