2021-01-01から1年間の記事一覧

OS起動編② kvmalloc() (Xv6を読む~OSコードリーディング~)

前回 jupiteroak.hatenablog.com トップページ jupiteroak.hatenablog.com main.c(一部抜粋) https://github.com/mit-pdos/xv6-public/blob/master/main.c#L21 int main(void) { ... kvmalloc(); // kernel page table ...vm.c https://github.com/mit-pdos/…

OS起動編① kinit1(end, P2V(4*1024*1024)) (Xv6を読む~OSコードリーディング~)

前回 jupiteroak.hatenablog.com トップページ jupiteroak.hatenablog.com main.c(一部抜粋) https://github.com/mit-pdos/xv6-public/blob/master/main.c#L20 int main(void) { kinit1(end, P2V(4*1024*1024)); // phys page allocator ...kalloc.c https:/…

OS起動編⓪ entry.S (Xv6を読む~OSコードリーディング~)

前回 jupiteroak.hatenablog.com トップページ jupiteroak.hatenablog.com entry.s https://github.com/mit-pdos/xv6-public/blob/master/entry.S # The xv6 kernel starts executing in this file. This file is linked with # the kernel C code, so it ca…

ブートローダ編② bootmain.c (Xv6を読む~OSコードリーディング~)

前回 jupiteroak.hatenablog.com トップページ jupiteroak.hatenablog.com bootmain.c https://github.com/mit-pdos/xv6-public/blob/master/bootmain.c // Boot loader. // // Part of the boot block, along with bootasm.S, which calls bootmain(). // b…

ブートローダ編① bootasm.S (Xv6を読む~OSコードリーディング~)

前回 jupiteroak.hatenablog.com bootasm.S https://github.com/mit-pdos/xv6-public/blob/master/bootasm.S#L10 #include "asm.h" #include "memlayout.h" #include "mmu.h" # Start the first CPU: switch to 32-bit protected mode, jump into C. # The B…

Xv6を読む~OSコードリーディング~ ②概要

前回 jupiteroak.hatenablog.com 目次 ソースコードリーディングの概要 ブートローダ編 OS起動編 プロセス1実行編 ソースコードリーディングの概要(補足説明) ブートローダ編 OS起動編 プロセス1実行編 その他 ソースコードリーディングの概要 Xv6のソースコ…

Xv6を読む~OSコードリーディング~ ①はじめに

目次 Xv6とは Unix v6について Xv6-riscvについて Xv6を読む際の注意点 コードリーディングで使用したツール 参考 次回 Xv6とは Xv6とは、MIT(マサチューセッツ工科大学)がUnix v6をx86CPUの仕様に基づいて再実装した教育用のオペレーティングシステムです。…

sleeplock.c void releasesleep(struct sleeplock *lk)

トップページ jupiteroak.hatenablog.com sleeplock.c https://github.com/mit-pdos/xv6-public/blob/master/sleeplock.c#L34 void releasesleep(struct sleeplock *lk) { acquire(&lk->lk); lk->locked = 0; lk->pid = 0; wakeup(lk); release(&lk->lk); }r…

sleeplock.c int holdingsleep(struct sleeplock *lk)

トップページ jupiteroak.hatenablog.com sleeplock.c https://github.com/mit-pdos/xv6-public/blob/master/sleeplock.c#L44 int holdingsleep(struct sleeplock *lk) { int r; acquire(&lk->lk); r = lk->locked && (lk->pid == myproc()->pid); release(&…

sleeplock.c void acquiresleep(struct sleeplock *lk)

トップページ jupiteroak.hatenablog.com sleeplock.c https://github.com/mit-pdos/xv6-public/blob/master/sleeplock.c#L22 void acquiresleep(struct sleeplock *lk) { acquire(&lk->lk); while (lk->locked) { sleep(lk, &lk->lk); } lk->locked = 1; lk…

sleeplock.c void initsleeplock(struct sleeplock *lk, char *name)

トップページ jupiteroak.hatenablog.com sleeplock.c https://github.com/mit-pdos/xv6-public/blob/master/sleeplock.c#L13 void initsleeplock(struct sleeplock *lk, char *name) { initlock(&lk->lk, "sleep lock"); lk->name = name; lk->locked = 0; …

spinlock.c void getcallerpcs(void *v, uint pcs[])

トップページ jupiteroak.hatenablog.com spinlock.c https://github.com/mit-pdos/xv6-public/blob/master/spinlock.c#L71 void getcallerpcs(void *v, uint pcs[]) { uint *ebp; int i; ebp = (uint*)v - 2; for(i = 0; i < 10; i++){ if(ebp == 0 || ebp …

spinlock.c void popcli(void)

トップページ jupiteroak.hatenablog.com spinlock.c https://github.com/mit-pdos/xv6-public/blob/master/spinlock.c#L116 void popcli(void) { if(readeflags()&FL_IF) panic("popcli - interruptible"); if(--mycpu()->ncli < 0) panic("popcli"); if(my…

spinlock.c void pushcli(void)

トップページ jupiteroak.hatenablog.com spinlock.c https://github.com/mit-pdos/xv6-public/blob/master/spinlock.c#L116 void pushcli(void) { int eflags; eflags = readeflags(); cli(); if(mycpu()->ncli == 0) mycpu()->intena = eflags & FL_IF; my…

spinlock.c void release(struct spinlock *lk)

トップページ jupiteroak.hatenablog.com spinlock.c https://github.com/mit-pdos/xv6-public/blob/master/spinlock.c#L46 void release(struct spinlock *lk) { if(!holding(lk)) panic("release"); lk->pcs[0] = 0; lk->cpu = 0; // Tell the C compiler …

spinlock.c int holding(struct spinlock *lock)

トップページ jupiteroak.hatenablog.com spinlock.c https://github.com/mit-pdos/xv6-public/blob/master/spinlock.c#L89 int holding(struct spinlock *lock) { int r; pushcli(); r = lock->locked && lock->cpu == mycpu(); popcli(); return r; }holdi…

spinlock.c void acquire(struct spinlock *lk)

トップページ jupiteroak.hatenablog.com spinlock.c https://github.com/mit-pdos/xv6-public/blob/master/spinlock.c#L24 void acquire(struct spinlock *lk) { pushcli(); // disable interrupts to avoid deadlock. if(holding(lk)) panic("acquire"); /…

spinlock.c void initlock(struct spinlock *lk, char *name)

トップページ jupiteroak.hatenablog.com spinlock.c https://github.com/mit-pdos/xv6-public/blob/master/spinlock.c#L12 void initlock(struct spinlock *lk, char *name) { lk->name = name; lk->locked = 0; lk->cpu = 0; }initlock関数は、排他制御の…

ide.c static void idestart(struct buf *b)

トップページ jupiteroak.hatenablog.com ide.c https://github.com/mit-pdos/xv6-public/blob/master/ide.c#L73 static void idestart(struct buf *b) { if(b == 0) panic("idestart"); if(b->blockno >= FSSIZE) panic("incorrect blockno"); int sector_p…

ide.c void iderw(struct buf *b)

トップページ jupiteroak.hatenablog.com ide.c https://github.com/mit-pdos/xv6-public/blob/master/ide.c#L137 void iderw(struct buf *b) { struct buf **pp; if(!holdingsleep(&b->lock)) panic("iderw: buf not locked"); if((b->flags & (B_VALID|B_D…

ide.c static int idewait(int checkerr)

トップページ jupiteroak.hatenablog.com ide.c https://github.com/mit-pdos/xv6-public/blob/master/ide.c#L38 static int idewait(int checkerr) { int r; while(((r = inb(0x1f7)) & (IDE_BSY|IDE_DRDY)) != IDE_DRDY) ; if(checkerr && (r & (IDE_DF|ID…

ide.c void ideintr(void)

トップページ jupiteroak.hatenablog.com ide.c https://github.com/mit-pdos/xv6-public/blob/master/ide.c#L103 void ideintr(void) { struct buf *b; // First queued buffer is the active request. acquire(&idelock); if((b = idequeue) == 0){ releas…

bio.c void brelse(struct buf *b)

トップページ jupiteroak.hatenablog.com bio.c https://github.com/mit-pdos/xv6-public/blob/master/bio.c#L120 void brelse(struct buf *b) { if(!holdingsleep(&b->lock)) panic("brelse"); releasesleep(&b->lock); acquire(&bcache.lock); b->refcnt--…

bio.c void bwrite(struct buf *b)

トップページ jupiteroak.hatenablog.com bio.c https://github.com/mit-pdos/xv6-public/blob/master/bio.c#L109 void bwrite(struct buf *b) { if(!holdingsleep(&b->lock)) panic("bwrite"); b->flags |= B_DIRTY; iderw(b); }bwrite関数は、バッファbに…

bio.c static struct buf* bget(uint dev, uint blockno)

トップページ jupiteroak.hatenablog.com bio.c https://github.com/mit-pdos/xv6-public/blob/master/bio.c#L61 static struct buf* bget(uint dev, uint blockno) { struct buf *b; acquire(&bcache.lock); // Is the block already cached? for(b = bcach…

bio.c struct buf* bread(uint dev, uint blockno)

トップページ jupiteroak.hatenablog.com bio.c https://github.com/mit-pdos/xv6-public/blob/master/bio.c#L96 struct buf* bread(uint dev, uint blockno) { struct buf *b; b = bget(dev, blockno); if((b->flags & B_VALID) == 0) { iderw(b); } return…

log.c static void read_head(void)

トップページ jupiteroak.hatenablog.com log.c https://github.com/mit-pdos/xv6-public/blob/master/log.c#L85 static void read_head(void) { struct buf *buf = bread(log.dev, log.start); struct logheader *lh = (struct logheader *) (buf->data); i…

log.c static void write_head(void)

トップページ jupiteroak.hatenablog.com log.c https://github.com/mit-pdos/xv6-public/blob/master/log.c#L101 static void write_head(void) { struct buf *buf = bread(log.dev, log.start); struct logheader *hb = (struct logheader *) (buf->data);…

log.c static void write_log(void)

トップページ jupiteroak.hatenablog.com log.c https://github.com/mit-pdos/xv6-public/blob/master/log.c#L177 static void write_log(void) { int tail; for (tail = 0; tail < log.lh.n; tail++) { struct buf *to = bread(log.dev, log.start+tail+1);…

log.c static void install_trans(void)

トップページ jupiteroak.hatenablog.com log.c https://github.com/mit-pdos/xv6-public/blob/master/log.c#L69 static void install_trans(void) { int tail; for (tail = 0; tail < log.lh.n; tail++) { struct buf *lbuf = bread(log.dev, log.start+tai…