Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,3 +95,11 @@ Goals of this lab:
* Understand how to mount a file system and look up a file across file systems.
* Understand how special file works.

### Lab 8: Virtual File System
In previous lab, files were stored in memory, which is volatile. In this lab, you’ll implement FAT32 that stores data in SD card.

Goals of this lab:

* Understand how to interact with SD card.
* Implement FAT32 file system.
* Understand memory cache for slow storage mediums.
1 change: 1 addition & 0 deletions lab3/test/a
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

11 changes: 11 additions & 0 deletions lab8/create_cpio.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/bin/sh

# Go to rootfs folder
# Select all files and put into archives
# '-o, --create' Run in copy-out mode
# '-H FORMAT' archive format,
# newc: SVR4 portable format

cd rootfs
find . | cpio -o -H newc > ../initramfs.cpio
cd ..
Binary file added lab8/initramfs.cpio
Binary file not shown.
Binary file added lab8/kernel/bcm2710-rpi-3-b-plus.dtb
Binary file not shown.
1 change: 1 addition & 0 deletions lab8/kernel/build/boot_s.d
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
build/boot_s.o: src/boot.S include/mmu.h include/stddef.h
Binary file added lab8/kernel/build/boot_s.o
Binary file not shown.
2 changes: 2 additions & 0 deletions lab8/kernel/build/cpio_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
build/cpio_c.o: src/cpio.c include/cpio.h include/dtb.h include/string.h \
include/stddef.h
Binary file added lab8/kernel/build/cpio_c.o
Binary file not shown.
6 changes: 6 additions & 0 deletions lab8/kernel/build/dev_framebuffer_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
build/dev_framebuffer_c.o: src/dev_framebuffer.c include/vfs.h \
include/stddef.h include/dev_framebuffer.h include/vfs.h include/uart1.h \
include/memory.h include/bcm2837/rpi_mmu.h include/list.h \
include/stddef.h include/mbox.h include/string.h include/exception.h \
include/bcm2837/rpi_irq.h include/bcm2837/rpi_base.h \
include/bcm2837/rpi_mmu.h
Binary file added lab8/kernel/build/dev_framebuffer_c.o
Binary file not shown.
3 changes: 3 additions & 0 deletions lab8/kernel/build/dev_uart_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
build/dev_uart_c.o: src/dev_uart.c include/vfs.h include/stddef.h \
include/dev_uart.h include/vfs.h include/uart1.h include/memory.h \
include/bcm2837/rpi_mmu.h include/list.h include/stddef.h
Binary file added lab8/kernel/build/dev_uart_c.o
Binary file not shown.
4 changes: 4 additions & 0 deletions lab8/kernel/build/dtb_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
build/dtb_c.o: src/dtb.c include/bcm2837/rpi_mmu.h include/dtb.h \
include/uart1.h include/string.h include/stddef.h include/cpio.h \
include/memory.h include/bcm2837/rpi_mmu.h include/list.h \
include/stddef.h
Binary file added lab8/kernel/build/dtb_c.o
Binary file not shown.
1 change: 1 addition & 0 deletions lab8/kernel/build/entry_s.d
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
build/entry_s.o: src/entry.S
Binary file added lab8/kernel/build/entry_s.o
Binary file not shown.
6 changes: 6 additions & 0 deletions lab8/kernel/build/exception_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
build/exception_c.o: src/exception.c include/bcm2837/rpi_uart1.h \
include/bcm2837/rpi_base.h include/bcm2837/rpi_mmu.h include/uart1.h \
include/exception.h include/bcm2837/rpi_irq.h include/timer.h \
include/list.h include/stddef.h include/irqtask.h include/syscall.h \
include/exception.h include/stddef.h include/sched.h include/vfs.h \
include/signal.h include/mmu.h include/sched.h
Binary file added lab8/kernel/build/exception_c.o
Binary file not shown.
6 changes: 6 additions & 0 deletions lab8/kernel/build/fat32_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
build/fat32_c.o: src/fat32.c include/fat32.h include/list.h \
include/stddef.h include/vfs.h include/stddef.h include/memory.h \
include/bcm2837/rpi_mmu.h include/sdhost.h include/string.h \
include/list.h include/uart1.h include/exception.h \
include/bcm2837/rpi_irq.h include/bcm2837/rpi_base.h \
include/bcm2837/rpi_mmu.h
Binary file added lab8/kernel/build/fat32_c.o
Binary file not shown.
4 changes: 4 additions & 0 deletions lab8/kernel/build/initramfs_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
build/initramfs_c.o: src/initramfs.c include/initramfs.h include/stddef.h \
include/vfs.h include/vfs.h include/string.h include/memory.h \
include/bcm2837/rpi_mmu.h include/list.h include/stddef.h include/cpio.h \
include/uart1.h
Binary file added lab8/kernel/build/initramfs_c.o
Binary file not shown.
4 changes: 4 additions & 0 deletions lab8/kernel/build/irqtask_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
build/irqtask_c.o: src/irqtask.c include/irqtask.h include/list.h \
include/stddef.h include/exception.h include/bcm2837/rpi_irq.h \
include/bcm2837/rpi_base.h include/bcm2837/rpi_mmu.h include/memory.h \
include/bcm2837/rpi_mmu.h include/uart1.h
Binary file added lab8/kernel/build/irqtask_c.o
Binary file not shown.
Binary file added lab8/kernel/build/kernel8.elf
Binary file not shown.
6 changes: 6 additions & 0 deletions lab8/kernel/build/main_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
build/main_c.o: src/main.c include/uart1.h include/shell.h include/dtb.h \
include/memory.h include/bcm2837/rpi_mmu.h include/list.h \
include/stddef.h include/exception.h include/bcm2837/rpi_irq.h \
include/bcm2837/rpi_base.h include/bcm2837/rpi_mmu.h include/irqtask.h \
include/timer.h include/sched.h include/vfs.h include/stddef.h \
include/vfs.h
Binary file added lab8/kernel/build/main_c.o
Binary file not shown.
2 changes: 2 additions & 0 deletions lab8/kernel/build/mbox_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
build/mbox_c.o: src/mbox.c include/bcm2837/rpi_mbox.h \
include/bcm2837/rpi_base.h include/bcm2837/rpi_mmu.h include/mbox.h
Binary file added lab8/kernel/build/mbox_c.o
Binary file not shown.
5 changes: 5 additions & 0 deletions lab8/kernel/build/memory_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
build/memory_c.o: src/memory.c include/memory.h include/bcm2837/rpi_mmu.h \
include/list.h include/stddef.h include/list.h include/uart1.h \
include/exception.h include/bcm2837/rpi_irq.h include/bcm2837/rpi_base.h \
include/bcm2837/rpi_mmu.h include/dtb.h include/cpio.h include/mmu.h \
include/stddef.h include/sched.h include/vfs.h include/exception.h
Binary file added lab8/kernel/build/memory_c.o
Binary file not shown.
5 changes: 5 additions & 0 deletions lab8/kernel/build/mmu_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
build/mmu_c.o: src/mmu.c include/bcm2837/rpi_mmu.h include/mmu.h \
include/stddef.h include/sched.h include/list.h include/stddef.h \
include/vfs.h include/exception.h include/bcm2837/rpi_irq.h \
include/bcm2837/rpi_base.h include/bcm2837/rpi_mmu.h include/memory.h \
include/bcm2837/rpi_mmu.h include/string.h include/uart1.h
Binary file added lab8/kernel/build/mmu_c.o
Binary file not shown.
6 changes: 6 additions & 0 deletions lab8/kernel/build/sched_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
build/sched_c.o: src/sched.c include/sched.h include/list.h \
include/stddef.h include/vfs.h include/stddef.h include/exception.h \
include/bcm2837/rpi_irq.h include/bcm2837/rpi_base.h \
include/bcm2837/rpi_mmu.h include/memory.h include/bcm2837/rpi_mmu.h \
include/timer.h include/uart1.h include/signal.h include/exception.h \
include/mmu.h include/sched.h include/string.h
Binary file added lab8/kernel/build/sched_c.o
Binary file not shown.
1 change: 1 addition & 0 deletions lab8/kernel/build/sched_s.d
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
build/sched_s.o: src/sched.S
Binary file added lab8/kernel/build/sched_s.o
Binary file not shown.
1 change: 1 addition & 0 deletions lab8/kernel/build/sdhost_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
build/sdhost_c.o: src/sdhost.c
Binary file added lab8/kernel/build/sdhost_c.o
Binary file not shown.
5 changes: 5 additions & 0 deletions lab8/kernel/build/shell_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
build/shell_c.o: src/shell.c include/stddef.h include/shell.h \
include/uart1.h include/mbox.h include/power.h include/bcm2837/rpi_mmu.h \
include/cpio.h include/string.h include/stddef.h include/dtb.h \
include/memory.h include/list.h include/timer.h include/sched.h \
include/vfs.h
Binary file added lab8/kernel/build/shell_c.o
Binary file not shown.
5 changes: 5 additions & 0 deletions lab8/kernel/build/signal_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
build/signal_c.o: src/signal.c include/signal.h include/exception.h \
include/bcm2837/rpi_irq.h include/bcm2837/rpi_base.h \
include/bcm2837/rpi_mmu.h include/sched.h include/list.h \
include/stddef.h include/vfs.h include/stddef.h include/syscall.h \
include/memory.h include/bcm2837/rpi_mmu.h include/mmu.h include/sched.h
Binary file added lab8/kernel/build/signal_c.o
Binary file not shown.
2 changes: 2 additions & 0 deletions lab8/kernel/build/string_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
build/string_c.o: src/string.c include/string.h include/stddef.h \
include/stddef.h
Binary file added lab8/kernel/build/string_c.o
Binary file not shown.
7 changes: 7 additions & 0 deletions lab8/kernel/build/syscall_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
build/syscall_c.o: src/syscall.c include/syscall.h include/exception.h \
include/bcm2837/rpi_irq.h include/bcm2837/rpi_base.h \
include/bcm2837/rpi_mmu.h include/stddef.h include/cpio.h \
include/sched.h include/list.h include/stddef.h include/vfs.h \
include/uart1.h include/exception.h include/memory.h \
include/bcm2837/rpi_mmu.h include/mbox.h include/signal.h include/mmu.h \
include/sched.h include/string.h include/dev_framebuffer.h
Binary file added lab8/kernel/build/syscall_c.o
Binary file not shown.
5 changes: 5 additions & 0 deletions lab8/kernel/build/timer_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
build/timer_c.o: src/timer.c include/timer.h include/list.h \
include/stddef.h include/uart1.h include/memory.h \
include/bcm2837/rpi_mmu.h include/string.h include/stddef.h \
include/exception.h include/bcm2837/rpi_irq.h include/bcm2837/rpi_base.h \
include/bcm2837/rpi_mmu.h
Binary file added lab8/kernel/build/timer_c.o
Binary file not shown.
4 changes: 4 additions & 0 deletions lab8/kernel/build/tmpfs_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
build/tmpfs_c.o: src/tmpfs.c include/tmpfs.h include/stddef.h \
include/vfs.h include/vfs.h include/string.h include/memory.h \
include/bcm2837/rpi_mmu.h include/list.h include/stddef.h \
include/uart1.h
Binary file added lab8/kernel/build/tmpfs_c.o
Binary file not shown.
5 changes: 5 additions & 0 deletions lab8/kernel/build/uart1_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
build/uart1_c.o: src/uart1.c include/bcm2837/rpi_gpio.h \
include/bcm2837/rpi_base.h include/bcm2837/rpi_mmu.h \
include/bcm2837/rpi_uart1.h include/bcm2837/rpi_irq.h include/uart1.h \
include/exception.h include/bcm2837/rpi_irq.h include/string.h \
include/stddef.h
Binary file added lab8/kernel/build/uart1_c.o
Binary file not shown.
5 changes: 5 additions & 0 deletions lab8/kernel/build/vfs_c.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
build/vfs_c.o: src/vfs.c include/vfs.h include/stddef.h include/tmpfs.h \
include/vfs.h include/memory.h include/bcm2837/rpi_mmu.h include/list.h \
include/stddef.h include/string.h include/uart1.h include/initramfs.h \
include/dev_uart.h include/dev_framebuffer.h include/sdhost.h \
include/fat32.h
Binary file added lab8/kernel/build/vfs_c.o
Binary file not shown.
41 changes: 41 additions & 0 deletions lab8/kernel/include/cpio.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#ifndef _CPIO_H_
#define _CPIO_H_

/*
cpio format : https://manpages.ubuntu.com/manpages/bionic/en/man5/cpio.5.html
We are using "newc" format
header, file path, file data, header ......
header + file path (padding 4 bytes)
file data (padding 4 bytes) (max size 4gb)
*/

#define CPIO_NEWC_HEADER_MAGIC "070701" // big endian constant, to check whether it is big endian or little endian

extern void* CPIO_DEFAULT_START;
extern void* CPIO_DEFAULT_END;

// Using newc archive format
struct cpio_newc_header
{
char c_magic[6]; // fixed, "070701".
char c_ino[8];
char c_mode[8];
char c_uid[8];
char c_gid[8];
char c_nlink[8];
char c_mtime[8];
char c_filesize[8];
char c_devmajor[8];
char c_devminor[8];
char c_rdevmajor[8];
char c_rdevminor[8];
char c_namesize[8];
char c_check[8];
};

/* write pathname, data, next header into corresponding parameter*/
int cpio_newc_parse_header(struct cpio_newc_header *this_header_pointer,
char **pathname, unsigned int *filesize, char **data,
struct cpio_newc_header **next_header_pointer);

#endif /* _CPIO_H_ */
24 changes: 24 additions & 0 deletions lab8/kernel/include/dev_framebuffer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#ifndef _DEV_FRAMEBUFFER_H_
#define _DEV_FRAMEBUFFER_H_

#include "stddef.h"
#include "vfs.h"

struct framebuffer_info
{
unsigned int width;
unsigned int height;
unsigned int pitch;
unsigned int isrgb;
};

int init_dev_framebuffer();

int dev_framebuffer_write(struct file *file, const void *buf, size_t len);
int dev_framebuffer_read(struct file *file, void *buf, size_t len);
int dev_framebuffer_open(struct vnode *file_node, struct file **target);
int dev_framebuffer_close(struct file *file);
long dev_framebuffer_lseek64(struct file *file, long offset, int whence);
int dev_framebuffer_op_deny();

#endif
15 changes: 15 additions & 0 deletions lab8/kernel/include/dev_uart.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#ifndef _DEV_UART_H_
#define _DEV_UART_H_

#include "stddef.h"
#include "vfs.h"

int init_dev_uart();

int dev_uart_write(struct file *file, const void *buf, size_t len);
int dev_uart_read(struct file *file, void *buf, size_t len);
int dev_uart_open(struct vnode *file_node, struct file **target);
int dev_uart_close(struct file *file);
int dev_uart_op_deny();

#endif
28 changes: 28 additions & 0 deletions lab8/kernel/include/dtb.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#ifndef _DTB_H_
#define _DTB_H_

#define uint32_t unsigned int
#define uint64_t unsigned long long

// manipulate device tree with dtb file format
// linux kernel fdt.h
#define FDT_BEGIN_NODE 0x00000001
#define FDT_END_NODE 0x00000002
#define FDT_PROP 0x00000003
#define FDT_NOP 0x00000004
#define FDT_END 0x00000009

extern char* dtb_ptr;

typedef void (*dtb_callback)(uint32_t node_type, char *name, void *value, uint32_t name_size);

uint32_t uint32_endian_big2lttle(uint32_t data);
uint64_t uint64_endian_big2lttle(uint64_t data);

void traverse_device_tree(void *base, dtb_callback callback); //traverse dtb tree
void dtb_callback_show_tree(uint32_t node_type, char *name, void *value, uint32_t name_size);
void dtb_callback_initramfs(uint32_t node_type, char *name, void *value, uint32_t name_size);

void dtb_find_and_store_reserved_memory();

#endif
81 changes: 81 additions & 0 deletions lab8/kernel/include/exception.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
#ifndef _EXCEPTION_H_
#define _EXCEPTION_H_

#include "bcm2837/rpi_irq.h"

#define CORE0_INTERRUPT_SOURCE ((volatile unsigned int *)(PHYS_TO_VIRT(0x40000060)))

#define IRQ_PENDING_1_AUX_INT (1<<29)
#define INTERRUPT_SOURCE_GPU (1<<8)
#define INTERRUPT_SOURCE_CNTPNSIRQ (1<<1)

typedef struct trapframe
{
unsigned long x0;
unsigned long x1;
unsigned long x2;
unsigned long x3;
unsigned long x4;
unsigned long x5;
unsigned long x6;
unsigned long x7;
unsigned long x8;
unsigned long x9;
unsigned long x10;
unsigned long x11;
unsigned long x12;
unsigned long x13;
unsigned long x14;
unsigned long x15;
unsigned long x16;
unsigned long x17;
unsigned long x18;
unsigned long x19;
unsigned long x20;
unsigned long x21;
unsigned long x22;
unsigned long x23;
unsigned long x24;
unsigned long x25;
unsigned long x26;
unsigned long x27;
unsigned long x28;
unsigned long x29;
unsigned long x30;
unsigned long spsr_el1;
unsigned long elr_el1;
unsigned long sp_el0;
} trapframe_t;

#define MEMFAIL_DATA_ABORT_LOWER 0b100100 // esr_el1
#define MEMFAIL_INST_ABORT_LOWER 0b100000 // EC, bits [31:26]

#define TF_LEVEL0 0b000100 // iss IFSC, bits [5:0]
#define TF_LEVEL1 0b000101
#define TF_LEVEL2 0b000110
#define TF_LEVEL3 0b000111

typedef struct{
unsigned int iss : 25, // Instruction specific syndrome
il : 1, // Instruction length bit
ec : 6; // Exception class
} esr_el1_t;

void sync_64_router(trapframe_t *tpf);
void irq_router(trapframe_t *tpf);
void invalid_exception_router();

static inline void el1_interrupt_enable()
{
__asm__ __volatile__("msr daifclr, 0xf");
}

static inline void el1_interrupt_disable()
{
__asm__ __volatile__("msr daifset, 0xf");
}

void lock();
void unlock();

#endif /* _EXCEPTION_H_ */
Loading