2021-01-01から1年間の記事一覧
前回 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/…
前回 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:/…
前回 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…
前回 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…
前回 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…
前回 jupiteroak.hatenablog.com 目次 ソースコードリーディングの概要 ブートローダ編 OS起動編 プロセス1実行編 ソースコードリーディングの概要(補足説明) ブートローダ編 OS起動編 プロセス1実行編 その他 ソースコードリーディングの概要 Xv6のソースコ…
目次 Xv6とは Unix v6について Xv6-riscvについて Xv6を読む際の注意点 コードリーディングで使用したツール 参考 次回 Xv6とは Xv6とは、MIT(マサチューセッツ工科大学)がUnix v6をx86CPUの仕様に基づいて再実装した教育用のオペレーティングシステムです。…
トップページ 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…
トップページ 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(&…
トップページ 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…
トップページ 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; …
トップページ 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 …
トップページ 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…
トップページ 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…
トップページ 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 …
トップページ 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…
トップページ 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"); /…
トップページ 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関数は、排他制御の…
トップページ 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…
トップページ 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…
トップページ 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…
トップページ 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…
トップページ 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--…
トップページ 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に…
トップページ 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…
トップページ 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…
トップページ 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…
トップページ 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);…
トップページ 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);…
トップページ 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…