From a9e2c29c269292d885e61f66bf79d9a4c2d5bd72 Mon Sep 17 00:00:00 2001 From: ridethepig Date: Mon, 21 Nov 2022 23:07:57 +0800 Subject: [PATCH] before lab6 --- .vscode/c_cpp_properties.json | 3 +- .vscode/settings.json | 2 +- 2020301918-李懋良-试点班第5个报告.docx | Bin 61180 -> 0 bytes Makefile | 2 +- before_memory.png | Bin 11789 -> 0 bytes inc/elf.h | 4 +- inc/errno.h | 139 + inc/kern/exec.h | 8 + inc/kern/exit.h | 8 + inc/kern/fork.h | 9 + inc/kern/fs.h | 2 +- inc/kern/keymap.h | 6 +- inc/kern/kmalloc.h | 6 + inc/kern/pmap.h | 8 +- inc/kern/process.h | 46 +- inc/kern/sche.h | 6 + inc/kern/syscall.h | 12 +- inc/kern/trap.h | 14 +- inc/kern/wait.h | 8 + inc/mmu.h | 1 + inc/syscall.h | 7 +- inc/user/stdio.h | 5 +- inc/user/syscall.h | 11 +- inc/user/wait.h | 14 + kern.asm | 6164 ----------------------- kern/Makefrag | 15 +- kern/atrap.asm | 29 + kern/exec.c | 150 + kern/exit.c | 117 + kern/fork.c | 57 + kern/fs.c | 8 +- kern/kmalloc.c | 22 - kern/main.c | 215 +- kern/pmap.c | 172 +- kern/process.c | 106 +- kern/sche.c | 48 + kern/syscall.c | 66 +- kern/trap.c | 13 +- kern/wait.c | 39 + lab5-finish.png | Bin 26378 -> 0 bytes lab6-finish.png | Bin 0 -> 11842 bytes lib/kern/fork_ack.o | Bin 0 -> 2828 bytes {kern => lib/kern}/keyboard.c | 7 +- lib/kern/kmalloc.c | 124 + lib/kern/terminal.c | 15 +- lib/user/astart.asm | 4 +- user/snake.bin => lib/user/firework.bin | Bin 22496 -> 21000 bytes lib/user/stdio.c | 21 +- lib/user/syscall.c | 59 +- memory_in_kernel.png | Bin 17032 -> 0 bytes now_memory.png | Bin 13728 -> 0 bytes user/Makefrag | 18 +- user/delay.c | 22 - user/forkbomb.c | 47 + user/hack.c | 38 - user/initproc.c | 22 + user/shell.c | 52 + user/testfork.c | 22 + user/testkey.c | 12 - user/testpid.c | 13 - user/testwait.c | 115 + 实验五-v0.3.md | 359 -- 实验六-v0.1.md | 270 + 63 files changed, 1708 insertions(+), 7054 deletions(-) delete mode 100644 2020301918-李懋良-试点班第5个报告.docx delete mode 100644 before_memory.png create mode 100644 inc/errno.h create mode 100644 inc/kern/exec.h create mode 100644 inc/kern/exit.h create mode 100644 inc/kern/fork.h create mode 100644 inc/kern/sche.h create mode 100644 inc/kern/wait.h create mode 100644 inc/user/wait.h delete mode 100644 kern.asm create mode 100644 kern/exec.c create mode 100644 kern/exit.c create mode 100644 kern/fork.c delete mode 100644 kern/kmalloc.c create mode 100644 kern/sche.c create mode 100644 kern/wait.c delete mode 100644 lab5-finish.png create mode 100644 lab6-finish.png create mode 100644 lib/kern/fork_ack.o rename {kern => lib/kern}/keyboard.c (90%) create mode 100644 lib/kern/kmalloc.c rename user/snake.bin => lib/user/firework.bin (55%) delete mode 100644 memory_in_kernel.png delete mode 100644 now_memory.png delete mode 100644 user/delay.c create mode 100644 user/forkbomb.c delete mode 100644 user/hack.c create mode 100644 user/initproc.c create mode 100644 user/shell.c create mode 100644 user/testfork.c delete mode 100644 user/testkey.c delete mode 100644 user/testpid.c create mode 100644 user/testwait.c delete mode 100644 实验五-v0.3.md create mode 100644 实验六-v0.1.md diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 0927960..27336b4 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -6,7 +6,8 @@ "${workspaceFolder}/inc" ], "defines": [], - "cStandard": "gnu99" + "cStandard": "gnu99", + "compilerArgs": ["-m32"] } ], "version": 4 diff --git a/.vscode/settings.json b/.vscode/settings.json index 6df04d7..d264713 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,6 @@ { "editor.detectIndentation": false, - "editor.tabSize": 4, + "editor.tabSize": 8, "editor.insertSpaces": false, "files.associations": { "*.h": "c", diff --git a/2020301918-李懋良-试点班第5个报告.docx b/2020301918-李懋良-试点班第5个报告.docx deleted file mode 100644 index d407e040e18142bbcfb363d1b2d77e9c4f51df1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61180 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%0AKjO<@}02**rie4xnVM_7Rp1Qu~z>9NDNL9 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 C@__3A diff --git a/inc/elf.h b/inc/elf.h index 2f740aa..365d7f2 100644 --- a/inc/elf.h +++ b/inc/elf.h @@ -46,9 +46,7 @@ struct Secthdr { u32 sh_addralign; u32 sh_entsize; }; -typedef struct Elf Elf32_Ehdr; -typedef struct Proghdr Elf32_Phdr; -typedef struct Secthdr Elf32_Shdr; + // Values for Proghdr::p_type #define PT_LOAD 1 diff --git a/inc/errno.h b/inc/errno.h new file mode 100644 index 0000000..fc044ac --- /dev/null +++ b/inc/errno.h @@ -0,0 +1,139 @@ +#ifndef MINIOS_ERRNO_H +#define MINIOS_ERRNO_H + +#define EPERM 1 +#define ENOENT 2 +#define ESRCH 3 +#define EINTR 4 +#define EIO 5 +#define ENXIO 6 +#define E2BIG 7 +#define ENOEXEC 8 +#define EBADF 9 +#define ECHILD 10 +#define EAGAIN 11 +#define ENOMEM 12 +#define EACCES 13 +#define EFAULT 14 +#define ENOTBLK 15 +#define EBUSY 16 +#define EEXIST 17 +#define EXDEV 18 +#define ENODEV 19 +#define ENOTDIR 20 +#define EISDIR 21 +#define EINVAL 22 +#define ENFILE 23 +#define EMFILE 24 +#define ENOTTY 25 +#define ETXTBSY 26 +#define EFBIG 27 +#define ENOSPC 28 +#define ESPIPE 29 +#define EROFS 30 +#define EMLINK 31 +#define EPIPE 32 +#define EDOM 33 +#define ERANGE 34 +#define EDEADLK 35 +#define ENAMETOOLONG 36 +#define ENOLCK 37 +#define ENOSYS 38 +#define ENOTEMPTY 39 +#define ELOOP 40 +#define EWOULDBLOCK EAGAIN +#define ENOMSG 42 +#define EIDRM 43 +#define ECHRNG 44 +#define EL2NSYNC 45 +#define EL3HLT 46 +#define EL3RST 47 +#define ELNRNG 48 +#define EUNATCH 49 +#define ENOCSI 50 +#define EL2HLT 51 +#define EBADE 52 +#define EBADR 53 +#define EXFULL 54 +#define ENOANO 55 +#define EBADRQC 56 +#define EBADSLT 57 +#define EDEADLOCK EDEADLK +#define EBFONT 59 +#define ENOSTR 60 +#define ENODATA 61 +#define ETIME 62 +#define ENOSR 63 +#define ENONET 64 +#define ENOPKG 65 +#define EREMOTE 66 +#define ENOLINK 67 +#define EADV 68 +#define ESRMNT 69 +#define ECOMM 70 +#define EPROTO 71 +#define EMULTIHOP 72 +#define EDOTDOT 73 +#define EBADMSG 74 +#define EOVERFLOW 75 +#define ENOTUNIQ 76 +#define EBADFD 77 +#define EREMCHG 78 +#define ELIBACC 79 +#define ELIBBAD 80 +#define ELIBSCN 81 +#define ELIBMAX 82 +#define ELIBEXEC 83 +#define EILSEQ 84 +#define ERESTART 85 +#define ESTRPIPE 86 +#define EUSERS 87 +#define ENOTSOCK 88 +#define EDESTADDRREQ 89 +#define EMSGSIZE 90 +#define EPROTOTYPE 91 +#define ENOPROTOOPT 92 +#define EPROTONOSUPPORT 93 +#define ESOCKTNOSUPPORT 94 +#define EOPNOTSUPP 95 +#define ENOTSUP EOPNOTSUPP +#define EPFNOSUPPORT 96 +#define EAFNOSUPPORT 97 +#define EADDRINUSE 98 +#define EADDRNOTAVAIL 99 +#define ENETDOWN 100 +#define ENETUNREACH 101 +#define ENETRESET 102 +#define ECONNABORTED 103 +#define ECONNRESET 104 +#define ENOBUFS 105 +#define EISCONN 106 +#define ENOTCONN 107 +#define ESHUTDOWN 108 +#define ETOOMANYREFS 109 +#define ETIMEDOUT 110 +#define ECONNREFUSED 111 +#define EHOSTDOWN 112 +#define EHOSTUNREACH 113 +#define EALREADY 114 +#define EINPROGRESS 115 +#define ESTALE 116 +#define EUCLEAN 117 +#define ENOTNAM 118 +#define ENAVAIL 119 +#define EISNAM 120 +#define EREMOTEIO 121 +#define EDQUOT 122 +#define ENOMEDIUM 123 +#define EMEDIUMTYPE 124 +#define ECANCELED 125 +#define ENOKEY 126 +#define EKEYEXPIRED 127 +#define EKEYREVOKED 128 +#define EKEYREJECTED 129 +#define EOWNERDEAD 130 +#define ENOTRECOVERABLE 131 +#define ERFKILL 132 +#define EHWPOISON 133 + +#endif \ No newline at end of file diff --git a/inc/kern/exec.h b/inc/kern/exec.h new file mode 100644 index 0000000..a553e7e --- /dev/null +++ b/inc/kern/exec.h @@ -0,0 +1,8 @@ +#ifndef MINIOS_KERN_EXEC_H +#define MINIOS_KERN_EXEC_H + +#include + +ssize_t kern_exec(PROCESS_0 *p_proc, const char *pathname); + +#endif /* MINIOS_KERN_EXEC_H */ \ No newline at end of file diff --git a/inc/kern/exit.h b/inc/kern/exit.h new file mode 100644 index 0000000..9b1510e --- /dev/null +++ b/inc/kern/exit.h @@ -0,0 +1,8 @@ +#ifndef MINIOS_KERN_EXIT_H +#define MINIOS_KERN_EXIT_H + +#include + +ssize_t kern_exit(PROCESS_0 *p_proc, int exit_code); + +#endif /* MINIOS_KERN_EXIT_H */ \ No newline at end of file diff --git a/inc/kern/fork.h b/inc/kern/fork.h new file mode 100644 index 0000000..e146b69 --- /dev/null +++ b/inc/kern/fork.h @@ -0,0 +1,9 @@ +#ifndef MINIOS_KERN_FORK_H +#define MINIOS_KERN_FORK_H + +#include +#include + +ssize_t kern_fork(PROCESS_0 *p_father); + +#endif /* MINIOS_KERN_FORK_H */ \ No newline at end of file diff --git a/inc/kern/fs.h b/inc/kern/fs.h index cb781a7..7f508aa 100644 --- a/inc/kern/fs.h +++ b/inc/kern/fs.h @@ -6,6 +6,6 @@ ssize_t kern_read(int fd, void *buf, size_t count); ssize_t kern_write(int fd, const void *buf, size_t count); -void read_file(const char *filename, void *dst); +ssize_t read_file(const char *filename, void *dst); #endif /* MINIOS_KERN_FS_H */ \ No newline at end of file diff --git a/inc/kern/keymap.h b/inc/kern/keymap.h index c1b5ed1..490ce77 100644 --- a/inc/kern/keymap.h +++ b/inc/kern/keymap.h @@ -72,9 +72,9 @@ #define RIGHT (0x28 + FLAG_EXT) /* Right */ /* ACPI keys */ -#define POWER (0x29 + FLAG_EXT) /* Power */ -#define SLEEP (0x2A + FLAG_EXT) /* Sleep */ -#define WAKE (0x2B + FLAG_EXT) /* Wake Up */ +// #define POWER (0x29 + FLAG_EXT) /* Power */ +// #define SLEEP (0x2A + FLAG_EXT) /* Sleep */ +// #define WAKE (0x2B + FLAG_EXT) /* Wake Up */ /* Num Pad */ #define PAD_SLASH (0x2C + FLAG_EXT) /* / */ diff --git a/inc/kern/kmalloc.h b/inc/kern/kmalloc.h index 4b1dbf2..55b88ad 100644 --- a/inc/kern/kmalloc.h +++ b/inc/kern/kmalloc.h @@ -1,6 +1,12 @@ #ifndef MINIOS_KERN_KMALLOC_H #define MINIOS_KERN_KMALLOC_H +#include + +void phy_free_4k(phyaddr_t v); phyaddr_t phy_malloc_4k(void); +void kfree(void *v); +void * kmalloc(size_t n); + #endif /* MINIOS_KERN_KMALLOC_H */ \ No newline at end of file diff --git a/inc/kern/pmap.h b/inc/kern/pmap.h index 64f9149..c612d4c 100644 --- a/inc/kern/pmap.h +++ b/inc/kern/pmap.h @@ -2,7 +2,11 @@ #define MINIOS_KERN_PMAP_H #include +#include -void map_kern(phyaddr_t cr3); +void map_kern(u32 cr3, struct page_node **page_list); +void map_elf(PROCESS_0 *p_proc, void *elf_addr); +void map_stack(PROCESS_0 *p_proc); +void recycle_pages(struct page_node *page_list); -#endif \ No newline at end of file +#endif /* MINIOS_KERN_PMAP_H */ \ No newline at end of file diff --git a/inc/kern/process.h b/inc/kern/process.h index e56237f..b04f953 100644 --- a/inc/kern/process.h +++ b/inc/kern/process.h @@ -38,16 +38,49 @@ struct kern_context { u32 esp; }; +enum proc_statu {IDLE, READY, SLEEP, ZOMBIE, INITING}; + +typedef struct s_proc PROCESS_0; + +/* + * 记录进程所申请的所有物理页面,用单向链表维护 + * 对于非物理页面(页表,页目录表cr3)的那些页面,其laddr被置为-1 + * 对于物理页面,会维护物理页面对应的线性地址首地址 + */ +struct page_node { + struct page_node *nxt; + phyaddr_t paddr; + uintptr_t laddr; +}; + +/* + * 维护进程树儿子的信息,由双向链表维护 + */ +struct son_node { + struct son_node *pre; + struct son_node *nxt; + PROCESS_0 *p_son; +}; + +struct tree_node { + PROCESS_0 *p_fa; + struct son_node *sons; +}; + /* pcb */ -typedef struct s_proc { +struct s_proc { struct user_context user_regs; struct kern_context kern_regs; + u32 lock; + enum proc_statu statu; u32 pid; phyaddr_t cr3; + struct page_node *page_list; + int exit_code; int priority; int ticks; - int target_tick; -}PROCESS_0; + struct tree_node fork_tree; +}; #define KERN_STACKSIZE (8 * KB) @@ -60,7 +93,7 @@ typedef union u_proc { // kern/main.c extern PROCESS *p_proc_ready; /* pcb表 */ -#define PCB_SIZE 2 +#define PCB_SIZE 20 // kern/main.c extern PROCESS proc_table[]; @@ -71,9 +104,6 @@ void switch_kern_context( ); // 处理函数 -void schedule(void); -u32 kern_get_pid(PROCESS *p_proc); -void kern_delay_tick(PROCESS*, u32); +u32 kern_get_pid(PROCESS_0 *p_proc); -extern bool has_runnable; #endif /* MINIOS_KERN_PROCESS_H */ \ No newline at end of file diff --git a/inc/kern/sche.h b/inc/kern/sche.h new file mode 100644 index 0000000..059287f --- /dev/null +++ b/inc/kern/sche.h @@ -0,0 +1,6 @@ +#ifndef MINIOS_KERN_SCHE_H +#define MINIOS_KERN_SCHE_H + +void schedule(void); + +#endif \ No newline at end of file diff --git a/inc/kern/syscall.h b/inc/kern/syscall.h index 3496181..7ae3bdb 100644 --- a/inc/kern/syscall.h +++ b/inc/kern/syscall.h @@ -18,10 +18,18 @@ extern ssize_t (*syscall_table[])(void); ssize_t do_get_ticks(void); // kern/process.c ssize_t do_get_pid(void); +// kern/exec.c +ssize_t do_exec(const char *pathname); +// kern/exit.c +ssize_t do_exit(int status); +// kern/fork.c +ssize_t do_fork(void); +// kern/wait.c +ssize_t do_wait(int *wstatus); // kern/fs.c ssize_t do_read(int fd, void *buf, size_t count); ssize_t do_write(int fd, const void *buf, size_t count); -ssize_t do_delay_ticks(u32 ticks); -ssize_t do_mmap(int pid, void *src, void* dst, size_t length); +// 不告诉你这个实现在哪 +ssize_t do_fork_ack(void); #endif /* MINIOS_KERN_SYSCALL_H */ \ No newline at end of file diff --git a/inc/kern/trap.h b/inc/kern/trap.h index e371f17..3654018 100644 --- a/inc/kern/trap.h +++ b/inc/kern/trap.h @@ -77,10 +77,20 @@ disable_int() static inline void enable_int() { - if (init_kernel) - asm volatile("sti"); + asm volatile("sti"); } +#define DISABLE_INT() \ + { \ + u32 IF_BIT = read_eflags() & FL_IF; \ + if (IF_BIT != 0) \ + disable_int(); + +#define ENABLE_INT() \ + if (IF_BIT != 0) \ + enable_int(); \ + } + /* 系统调用实际处理函数(C接口) */ void syscall_handler(void); diff --git a/inc/kern/wait.h b/inc/kern/wait.h new file mode 100644 index 0000000..98ded1d --- /dev/null +++ b/inc/kern/wait.h @@ -0,0 +1,8 @@ +#ifndef MINIOS_KERN_WAIT_H +#define MINIOS_KERN_WAIT_H + +#include + +ssize_t kern_wait(int *wstatus); + +#endif /* MINIOS_KERN_WAIT_H */ \ No newline at end of file diff --git a/inc/mmu.h b/inc/mmu.h index 2fbd208..f44763a 100644 --- a/inc/mmu.h +++ b/inc/mmu.h @@ -69,6 +69,7 @@ // Address in page table or page directory entry #define PTE_ADDR(pte) ((phyaddr_t) (pte) & ~0xFFF) +#define PTE_FLAG(pte) ((size_t) (pte) & 0xFFF) // Control Register flags #define CR0_PE 0x00000001 // Protection Enable diff --git a/inc/syscall.h b/inc/syscall.h index d07ff57..47b02ed 100644 --- a/inc/syscall.h +++ b/inc/syscall.h @@ -6,7 +6,10 @@ #define _NR_get_pid 1 #define _NR_read 2 #define _NR_write 3 -#define _NR_delay_ticks 4 -#define _NR_mmap 5 +#define _NR_exec 4 +#define _NR_fork 5 +#define _NR_wait 6 +#define _NR_exit 7 +#define _NR_fork_ack 8 #endif /* MINIOS_SYSCALL_H */ diff --git a/inc/user/stdio.h b/inc/user/stdio.h index e0a553a..e41f0f5 100644 --- a/inc/user/stdio.h +++ b/inc/user/stdio.h @@ -9,9 +9,10 @@ // lib/user/stdio.c int printf(const char *fmt, ...); int vprintf(const char *fmt, va_list); -u8 getch(); +u8 getch(void); +u8 getchar(void); -void fflush(); +void fflush(void); #endif /* MINIOS_USER_STDIO_H */ \ No newline at end of file diff --git a/inc/user/syscall.h b/inc/user/syscall.h index 114dac6..8430234 100644 --- a/inc/user/syscall.h +++ b/inc/user/syscall.h @@ -11,11 +11,14 @@ ssize_t syscall3(size_t NR_syscall, size_t p1, size_t p2, size_t p3); ssize_t syscall4(size_t NR_syscall, size_t p1, size_t p2, size_t p3, size_t p4); ssize_t syscall5(size_t NR_syscall, size_t p1, size_t p2, size_t p3, size_t p4, size_t p5); -ssize_t get_ticks(); -ssize_t get_pid(); +ssize_t get_ticks(void); +ssize_t get_pid(void); ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count); -ssize_t delay_ticks(u32 ticks); -ssize_t lml_mmap(int pid, void* src, void* dst, size_t length); +ssize_t exec(const char *pathname); +ssize_t fork(void); +ssize_t exit(int status); +ssize_t wait(int *wstatus); +ssize_t fork_ack(void); #endif \ No newline at end of file diff --git a/inc/user/wait.h b/inc/user/wait.h new file mode 100644 index 0000000..66b5bd9 --- /dev/null +++ b/inc/user/wait.h @@ -0,0 +1,14 @@ +#ifndef MINIOS_USER_WAIT_H +#define MINIOS_USER_WAIT_H + +#define WEXITSTATUS(s) (((s) & 0xff00) >> 8) +#define WTERMSIG(s) ((s) & 0x7f) +#define WSTOPSIG(s) WEXITSTATUS(s) +#define WCOREDUMP(s) ((s) & 0x80) +#define WIFEXITED(s) (!WTERMSIG(s)) +#define WIFSTOPPED(s) ((short)((((s)&0xffff)*0x10001)>>8) > 0x7f00) +#define WIFSIGNALED(s) (((s)&0xffff)-1U < 0xffu) +#define WIFCONTINUED(s) ((s) == 0xffff) + + +#endif /* MINIOS_USER_WAIT_H */ \ No newline at end of file diff --git a/kern.asm b/kern.asm deleted file mode 100644 index aa35f21..0000000 --- a/kern.asm +++ /dev/null @@ -1,6164 +0,0 @@ - -obj/kern/kernel.dbg: file format elf32-i386 -obj/kern/kernel.dbg - - -Disassembly of section .text: - -c0200000 <_start>: -_start(): -c0200000: bc c0 89 20 c0 mov $0xc02089c0,%esp -c0200005: e8 a3 17 00 00 call c02017ad -c020000a: 0f 01 15 00 de 20 c0 lgdtl 0xc020de00 -c0200011: 66 b8 1b 00 mov $0x1b,%ax -c0200015: 8e e8 mov %eax,%gs -c0200017: 66 b8 28 00 mov $0x28,%ax -c020001b: 0f 00 d0 lldt %ax -c020001e: 66 b8 20 00 mov $0x20,%ax -c0200022: 0f 00 d8 ltr %ax -c0200025: 0f 01 1d 08 de 20 c0 lidtl 0xc020de08 -c020002c: ea f7 0a 20 c0 08 00 ljmp $0x8,$0xc0200af7 -c0200033: 66 90 xchg %ax,%ax -c0200035: 66 90 xchg %ax,%ax -c0200037: 66 90 xchg %ax,%ax -c0200039: 66 90 xchg %ax,%ax -c020003b: 66 90 xchg %ax,%ax -c020003d: 66 90 xchg %ax,%ax -c020003f: 90 nop - -c0200040 : -save(): -c0200040: 60 pusha -c0200041: 1e push %ds -c0200042: 06 push %es -c0200043: 0f a0 push %fs -c0200045: 0f a8 push %gs -c0200047: 66 8c d2 mov %ss,%dx -c020004a: 8e da mov %edx,%ds -c020004c: 8e c2 mov %edx,%es -c020004e: 89 e0 mov %esp,%eax -c0200050: f7 40 38 03 00 00 00 testl $0x3,0x38(%eax) -c0200057: 74 0c je c0200065 -c0200059: bc c0 89 20 c0 mov $0xc02089c0,%esp -c020005e: 50 push %eax -c020005f: e8 ab 0f 00 00 call c020100f -c0200064: 58 pop %eax - -c0200065 : -save.1(): -c0200065: 50 push %eax -c0200066: 68 6e 00 20 c0 push $0xc020006e -c020006b: ff 60 30 jmp *0x30(%eax) - -c020006e : -restart(): -c020006e: 5c pop %esp -c020006f: 0f a9 pop %gs -c0200071: 0f a1 pop %fs -c0200073: 07 pop %es -c0200074: 1f pop %ds -c0200075: 61 popa -c0200076: 83 c4 04 add $0x4,%esp -c0200079: cf iret - -c020007a : -int_syscall(): -c020007a: e8 c1 ff ff ff call c0200040 -c020007f: fb sti -c0200080: e8 f5 1c 00 00 call c0201d7a -c0200085: fa cli -c0200086: c3 ret -c0200087: 90 nop -c0200088: 90 nop -c0200089: 90 nop -c020008a: 90 nop -c020008b: 90 nop -c020008c: 90 nop -c020008d: 90 nop -c020008e: 90 nop -c020008f: 90 nop - -c0200090 : -hwint00(): -c0200090: e8 ab ff ff ff call c0200040 -c0200095: b0 20 mov $0x20,%al -c0200097: e6 20 out %al,$0x20 -c0200099: 6a 00 push $0x0 -c020009b: ff 15 60 74 20 c0 call *0xc0207460 -c02000a1: 59 pop %ecx -c02000a2: c3 ret -c02000a3: 90 nop -c02000a4: 90 nop -c02000a5: 90 nop -c02000a6: 90 nop -c02000a7: 90 nop -c02000a8: 90 nop -c02000a9: 90 nop -c02000aa: 90 nop -c02000ab: 90 nop -c02000ac: 90 nop -c02000ad: 90 nop -c02000ae: 90 nop -c02000af: 90 nop - -c02000b0 : -hwint01(): -c02000b0: e8 8b ff ff ff call c0200040 -c02000b5: e4 21 in $0x21,%al -c02000b7: 0c 02 or $0x2,%al -c02000b9: e6 21 out %al,$0x21 -c02000bb: b0 20 mov $0x20,%al -c02000bd: e6 20 out %al,$0x20 -c02000bf: fb sti -c02000c0: 6a 01 push $0x1 -c02000c2: ff 15 64 74 20 c0 call *0xc0207464 -c02000c8: 59 pop %ecx -c02000c9: fa cli -c02000ca: e4 21 in $0x21,%al -c02000cc: 24 fd and $0xfd,%al -c02000ce: e6 21 out %al,$0x21 -c02000d0: c3 ret -c02000d1: 90 nop -c02000d2: 90 nop -c02000d3: 90 nop -c02000d4: 90 nop -c02000d5: 90 nop -c02000d6: 90 nop -c02000d7: 90 nop -c02000d8: 90 nop -c02000d9: 90 nop -c02000da: 90 nop -c02000db: 90 nop -c02000dc: 90 nop -c02000dd: 90 nop -c02000de: 90 nop -c02000df: 90 nop - -c02000e0 : -hwint02(): -c02000e0: e8 5b ff ff ff call c0200040 -c02000e5: e4 21 in $0x21,%al -c02000e7: 0c 04 or $0x4,%al -c02000e9: e6 21 out %al,$0x21 -c02000eb: b0 20 mov $0x20,%al -c02000ed: e6 20 out %al,$0x20 -c02000ef: fb sti -c02000f0: 6a 02 push $0x2 -c02000f2: ff 15 68 74 20 c0 call *0xc0207468 -c02000f8: 59 pop %ecx -c02000f9: fa cli -c02000fa: e4 21 in $0x21,%al -c02000fc: 24 fb and $0xfb,%al -c02000fe: e6 21 out %al,$0x21 -c0200100: c3 ret -c0200101: 90 nop -c0200102: 90 nop -c0200103: 90 nop -c0200104: 90 nop -c0200105: 90 nop -c0200106: 90 nop -c0200107: 90 nop -c0200108: 90 nop -c0200109: 90 nop -c020010a: 90 nop -c020010b: 90 nop -c020010c: 90 nop -c020010d: 90 nop -c020010e: 90 nop -c020010f: 90 nop - -c0200110 : -hwint03(): -c0200110: e8 2b ff ff ff call c0200040 -c0200115: e4 21 in $0x21,%al -c0200117: 0c 08 or $0x8,%al -c0200119: e6 21 out %al,$0x21 -c020011b: b0 20 mov $0x20,%al -c020011d: e6 20 out %al,$0x20 -c020011f: fb sti -c0200120: 6a 03 push $0x3 -c0200122: ff 15 6c 74 20 c0 call *0xc020746c -c0200128: 59 pop %ecx -c0200129: fa cli -c020012a: e4 21 in $0x21,%al -c020012c: 24 f7 and $0xf7,%al -c020012e: e6 21 out %al,$0x21 -c0200130: c3 ret -c0200131: 90 nop -c0200132: 90 nop -c0200133: 90 nop -c0200134: 90 nop -c0200135: 90 nop -c0200136: 90 nop -c0200137: 90 nop -c0200138: 90 nop -c0200139: 90 nop -c020013a: 90 nop -c020013b: 90 nop -c020013c: 90 nop -c020013d: 90 nop -c020013e: 90 nop -c020013f: 90 nop - -c0200140 : -hwint04(): -c0200140: e8 fb fe ff ff call c0200040 -c0200145: e4 21 in $0x21,%al -c0200147: 0c 10 or $0x10,%al -c0200149: e6 21 out %al,$0x21 -c020014b: b0 20 mov $0x20,%al -c020014d: e6 20 out %al,$0x20 -c020014f: fb sti -c0200150: 6a 04 push $0x4 -c0200152: ff 15 70 74 20 c0 call *0xc0207470 -c0200158: 59 pop %ecx -c0200159: fa cli -c020015a: e4 21 in $0x21,%al -c020015c: 24 ef and $0xef,%al -c020015e: e6 21 out %al,$0x21 -c0200160: c3 ret -c0200161: 90 nop -c0200162: 90 nop -c0200163: 90 nop -c0200164: 90 nop -c0200165: 90 nop -c0200166: 90 nop -c0200167: 90 nop -c0200168: 90 nop -c0200169: 90 nop -c020016a: 90 nop -c020016b: 90 nop -c020016c: 90 nop -c020016d: 90 nop -c020016e: 90 nop -c020016f: 90 nop - -c0200170 : -hwint05(): -c0200170: e8 cb fe ff ff call c0200040 -c0200175: e4 21 in $0x21,%al -c0200177: 0c 20 or $0x20,%al -c0200179: e6 21 out %al,$0x21 -c020017b: b0 20 mov $0x20,%al -c020017d: e6 20 out %al,$0x20 -c020017f: fb sti -c0200180: 6a 05 push $0x5 -c0200182: ff 15 74 74 20 c0 call *0xc0207474 -c0200188: 59 pop %ecx -c0200189: fa cli -c020018a: e4 21 in $0x21,%al -c020018c: 24 df and $0xdf,%al -c020018e: e6 21 out %al,$0x21 -c0200190: c3 ret -c0200191: 90 nop -c0200192: 90 nop -c0200193: 90 nop -c0200194: 90 nop -c0200195: 90 nop -c0200196: 90 nop -c0200197: 90 nop -c0200198: 90 nop -c0200199: 90 nop -c020019a: 90 nop -c020019b: 90 nop -c020019c: 90 nop -c020019d: 90 nop -c020019e: 90 nop -c020019f: 90 nop - -c02001a0 : -hwint06(): -c02001a0: e8 9b fe ff ff call c0200040 -c02001a5: e4 21 in $0x21,%al -c02001a7: 0c 40 or $0x40,%al -c02001a9: e6 21 out %al,$0x21 -c02001ab: b0 20 mov $0x20,%al -c02001ad: e6 20 out %al,$0x20 -c02001af: fb sti -c02001b0: 6a 06 push $0x6 -c02001b2: ff 15 78 74 20 c0 call *0xc0207478 -c02001b8: 59 pop %ecx -c02001b9: fa cli -c02001ba: e4 21 in $0x21,%al -c02001bc: 24 bf and $0xbf,%al -c02001be: e6 21 out %al,$0x21 -c02001c0: c3 ret -c02001c1: 90 nop -c02001c2: 90 nop -c02001c3: 90 nop -c02001c4: 90 nop -c02001c5: 90 nop -c02001c6: 90 nop -c02001c7: 90 nop -c02001c8: 90 nop -c02001c9: 90 nop -c02001ca: 90 nop -c02001cb: 90 nop -c02001cc: 90 nop -c02001cd: 90 nop -c02001ce: 90 nop -c02001cf: 90 nop - -c02001d0 : -hwint07(): -c02001d0: e8 6b fe ff ff call c0200040 -c02001d5: e4 21 in $0x21,%al -c02001d7: 0c 80 or $0x80,%al -c02001d9: e6 21 out %al,$0x21 -c02001db: b0 20 mov $0x20,%al -c02001dd: e6 20 out %al,$0x20 -c02001df: fb sti -c02001e0: 6a 07 push $0x7 -c02001e2: ff 15 7c 74 20 c0 call *0xc020747c -c02001e8: 59 pop %ecx -c02001e9: fa cli -c02001ea: e4 21 in $0x21,%al -c02001ec: 24 7f and $0x7f,%al -c02001ee: e6 21 out %al,$0x21 -c02001f0: c3 ret -c02001f1: 90 nop -c02001f2: 90 nop -c02001f3: 90 nop -c02001f4: 90 nop -c02001f5: 90 nop -c02001f6: 90 nop -c02001f7: 90 nop -c02001f8: 90 nop -c02001f9: 90 nop -c02001fa: 90 nop -c02001fb: 90 nop -c02001fc: 90 nop -c02001fd: 90 nop -c02001fe: 90 nop -c02001ff: 90 nop - -c0200200 : -hwint08(): -c0200200: f4 hlt -c0200201: 90 nop -c0200202: 90 nop -c0200203: 90 nop -c0200204: 90 nop -c0200205: 90 nop -c0200206: 90 nop -c0200207: 90 nop -c0200208: 90 nop -c0200209: 90 nop -c020020a: 90 nop -c020020b: 90 nop -c020020c: 90 nop -c020020d: 90 nop -c020020e: 90 nop -c020020f: 90 nop - -c0200210 : -hwint09(): -c0200210: f4 hlt -c0200211: 90 nop -c0200212: 90 nop -c0200213: 90 nop -c0200214: 90 nop -c0200215: 90 nop -c0200216: 90 nop -c0200217: 90 nop -c0200218: 90 nop -c0200219: 90 nop -c020021a: 90 nop -c020021b: 90 nop -c020021c: 90 nop -c020021d: 90 nop -c020021e: 90 nop -c020021f: 90 nop - -c0200220 : -hwint10(): -c0200220: f4 hlt -c0200221: 90 nop -c0200222: 90 nop -c0200223: 90 nop -c0200224: 90 nop -c0200225: 90 nop -c0200226: 90 nop -c0200227: 90 nop -c0200228: 90 nop -c0200229: 90 nop -c020022a: 90 nop -c020022b: 90 nop -c020022c: 90 nop -c020022d: 90 nop -c020022e: 90 nop -c020022f: 90 nop - -c0200230 : -hwint11(): -c0200230: f4 hlt -c0200231: 90 nop -c0200232: 90 nop -c0200233: 90 nop -c0200234: 90 nop -c0200235: 90 nop -c0200236: 90 nop -c0200237: 90 nop -c0200238: 90 nop -c0200239: 90 nop -c020023a: 90 nop -c020023b: 90 nop -c020023c: 90 nop -c020023d: 90 nop -c020023e: 90 nop -c020023f: 90 nop - -c0200240 : -hwint12(): -c0200240: f4 hlt -c0200241: 90 nop -c0200242: 90 nop -c0200243: 90 nop -c0200244: 90 nop -c0200245: 90 nop -c0200246: 90 nop -c0200247: 90 nop -c0200248: 90 nop -c0200249: 90 nop -c020024a: 90 nop -c020024b: 90 nop -c020024c: 90 nop -c020024d: 90 nop -c020024e: 90 nop -c020024f: 90 nop - -c0200250 : -hwint13(): -c0200250: f4 hlt -c0200251: 90 nop -c0200252: 90 nop -c0200253: 90 nop -c0200254: 90 nop -c0200255: 90 nop -c0200256: 90 nop -c0200257: 90 nop -c0200258: 90 nop -c0200259: 90 nop -c020025a: 90 nop -c020025b: 90 nop -c020025c: 90 nop -c020025d: 90 nop -c020025e: 90 nop -c020025f: 90 nop - -c0200260 : -hwint14(): -c0200260: f4 hlt -c0200261: 90 nop -c0200262: 90 nop -c0200263: 90 nop -c0200264: 90 nop -c0200265: 90 nop -c0200266: 90 nop -c0200267: 90 nop -c0200268: 90 nop -c0200269: 90 nop -c020026a: 90 nop -c020026b: 90 nop -c020026c: 90 nop -c020026d: 90 nop -c020026e: 90 nop -c020026f: 90 nop - -c0200270 : -hwint15(): -c0200270: f4 hlt - -c0200271 : -divide_error(): -c0200271: 6a ff push $0xffffffff -c0200273: 6a 00 push $0x0 -c0200275: eb 4e jmp c02002c5 - -c0200277 : -single_step_exception(): -c0200277: 6a ff push $0xffffffff -c0200279: 6a 01 push $0x1 -c020027b: eb 48 jmp c02002c5 - -c020027d : -nmi(): -c020027d: 6a ff push $0xffffffff -c020027f: 6a 02 push $0x2 -c0200281: eb 42 jmp c02002c5 - -c0200283 : -breakpoint_exception(): -c0200283: 6a ff push $0xffffffff -c0200285: 6a 03 push $0x3 -c0200287: eb 3c jmp c02002c5 - -c0200289 : -overflow(): -c0200289: 6a ff push $0xffffffff -c020028b: 6a 04 push $0x4 -c020028d: eb 36 jmp c02002c5 - -c020028f : -bounds_check(): -c020028f: 6a ff push $0xffffffff -c0200291: 6a 05 push $0x5 -c0200293: eb 30 jmp c02002c5 - -c0200295 : -inval_opcode(): -c0200295: 6a ff push $0xffffffff -c0200297: 6a 06 push $0x6 -c0200299: eb 2a jmp c02002c5 - -c020029b : -copr_not_available(): -c020029b: 6a ff push $0xffffffff -c020029d: 6a 07 push $0x7 -c020029f: eb 24 jmp c02002c5 - -c02002a1 : -double_fault(): -c02002a1: 6a 08 push $0x8 -c02002a3: eb 20 jmp c02002c5 - -c02002a5 : -copr_seg_overrun(): -c02002a5: 6a ff push $0xffffffff -c02002a7: 6a 09 push $0x9 -c02002a9: eb 1a jmp c02002c5 - -c02002ab : -inval_tss(): -c02002ab: 6a 0a push $0xa -c02002ad: eb 16 jmp c02002c5 - -c02002af : -segment_not_present(): -c02002af: 6a 0b push $0xb -c02002b1: eb 12 jmp c02002c5 - -c02002b3 : -stack_exception(): -c02002b3: 6a 0c push $0xc -c02002b5: eb 0e jmp c02002c5 - -c02002b7 : -general_protection(): -c02002b7: 6a 0d push $0xd -c02002b9: eb 0a jmp c02002c5 - -c02002bb : -page_fault(): -c02002bb: 6a 0e push $0xe -c02002bd: eb 06 jmp c02002c5 - -c02002bf : -copr_error(): -c02002bf: 6a ff push $0xffffffff -c02002c1: 6a 10 push $0x10 -c02002c3: eb 00 jmp c02002c5 - -c02002c5 : -exception(): -c02002c5: e8 9d 18 00 00 call c0201b67 -c02002ca: 83 c4 08 add $0x8,%esp -c02002cd: f4 hlt -c02002ce: 66 90 xchg %ax,%ax - -c02002d0 : -switch_kern_context(): -c02002d0: 55 push %ebp -c02002d1: 89 e5 mov %esp,%ebp -c02002d3: 50 push %eax -c02002d4: 53 push %ebx -c02002d5: 8b 45 08 mov 0x8(%ebp),%eax -c02002d8: 8b 5d 0c mov 0xc(%ebp),%ebx -c02002db: e8 04 00 00 00 call c02002e4 -c02002e0: 5b pop %ebx -c02002e1: 58 pop %eax -c02002e2: 5d pop %ebp -c02002e3: c3 ret - -c02002e4 : -switch_kern_context.inner_switch(): -c02002e4: 89 60 20 mov %esp,0x20(%eax) -c02002e7: 8d 60 20 lea 0x20(%eax),%esp -c02002ea: 50 push %eax -c02002eb: 51 push %ecx -c02002ec: 52 push %edx -c02002ed: 53 push %ebx -c02002ee: 55 push %ebp -c02002ef: 56 push %esi -c02002f0: 57 push %edi -c02002f1: 9c pushf -c02002f2: 89 dc mov %ebx,%esp -c02002f4: 9d popf -c02002f5: 5f pop %edi -c02002f6: 5e pop %esi -c02002f7: 5d pop %ebp -c02002f8: 5b pop %ebx -c02002f9: 5a pop %edx -c02002fa: 59 pop %ecx -c02002fb: 58 pop %eax -c02002fc: 5c pop %esp -c02002fd: c3 ret - -c02002fe : -inb(): -/media/unix/Data/Code/2020301918-os/inc/x86.h:8 -c02002fe: 55 push %ebp -c02002ff: 89 e5 mov %esp,%ebp -c0200301: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/inc/x86.h:10 -c0200304: 8b 45 08 mov 0x8(%ebp),%eax -c0200307: 89 c2 mov %eax,%edx -c0200309: ec in (%dx),%al -c020030a: 88 45 ff mov %al,-0x1(%ebp) -/media/unix/Data/Code/2020301918-os/inc/x86.h:11 -c020030d: 0f b6 45 ff movzbl -0x1(%ebp),%eax -/media/unix/Data/Code/2020301918-os/inc/x86.h:12 -c0200311: c9 leave -c0200312: c3 ret - -c0200313 : -insl(): -/media/unix/Data/Code/2020301918-os/inc/x86.h:50 -c0200313: 55 push %ebp -c0200314: 89 e5 mov %esp,%ebp -c0200316: 57 push %edi -c0200317: 53 push %ebx -/media/unix/Data/Code/2020301918-os/inc/x86.h:51 -c0200318: 8b 55 08 mov 0x8(%ebp),%edx -c020031b: 8b 4d 0c mov 0xc(%ebp),%ecx -c020031e: 8b 45 10 mov 0x10(%ebp),%eax -c0200321: 89 cb mov %ecx,%ebx -c0200323: 89 df mov %ebx,%edi -c0200325: 89 c1 mov %eax,%ecx -c0200327: fc cld -c0200328: f2 6d repnz insl (%dx),%es:(%edi) -c020032a: 89 c8 mov %ecx,%eax -c020032c: 89 fb mov %edi,%ebx -c020032e: 89 5d 0c mov %ebx,0xc(%ebp) -c0200331: 89 45 10 mov %eax,0x10(%ebp) -/media/unix/Data/Code/2020301918-os/inc/x86.h:55 -c0200334: 90 nop -c0200335: 5b pop %ebx -c0200336: 5f pop %edi -c0200337: 5d pop %ebp -c0200338: c3 ret - -c0200339 : -outb(): -/media/unix/Data/Code/2020301918-os/inc/x86.h:59 -c0200339: 55 push %ebp -c020033a: 89 e5 mov %esp,%ebp -c020033c: 83 ec 04 sub $0x4,%esp -c020033f: 8b 45 0c mov 0xc(%ebp),%eax -c0200342: 88 45 fc mov %al,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/inc/x86.h:60 -c0200345: 0f b6 45 fc movzbl -0x4(%ebp),%eax -c0200349: 8b 55 08 mov 0x8(%ebp),%edx -c020034c: ee out %al,(%dx) -/media/unix/Data/Code/2020301918-os/inc/x86.h:61 -c020034d: 90 nop -c020034e: c9 leave -c020034f: c3 ret - -c0200350 : -kern_read(): -/media/unix/Data/Code/2020301918-os/kern/fs.c:19 -c0200350: 55 push %ebp -c0200351: 89 e5 mov %esp,%ebp -c0200353: 83 ec 18 sub $0x18,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:20 -c0200356: 83 7d 08 00 cmpl $0x0,0x8(%ebp) -c020035a: 74 16 je c0200372 -/media/unix/Data/Code/2020301918-os/kern/fs.c:20 (discriminator 1) -c020035c: 68 00 40 20 c0 push $0xc0204000 -c0200361: 68 08 40 20 c0 push $0xc0204008 -c0200366: 6a 14 push $0x14 -c0200368: 68 1d 40 20 c0 push $0xc020401d -c020036d: e8 47 0e 00 00 call c02011b9 <_panic> -/media/unix/Data/Code/2020301918-os/kern/fs.c:22 -c0200372: 8b 45 0c mov 0xc(%ebp),%eax -c0200375: 89 45 f4 mov %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:24 -c0200378: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%ebp) -c020037f: eb 26 jmp c02003a7 -/media/unix/Data/Code/2020301918-os/kern/fs.c:25 -c0200381: e8 28 05 00 00 call c02008ae -c0200386: 88 45 ef mov %al,-0x11(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:26 -c0200389: 80 7d ef ff cmpb $0xff,-0x11(%ebp) -c020038d: 75 05 jne c0200394 -/media/unix/Data/Code/2020301918-os/kern/fs.c:27 -c020038f: 8b 45 f0 mov -0x10(%ebp),%eax -c0200392: eb 1e jmp c02003b2 -/media/unix/Data/Code/2020301918-os/kern/fs.c:28 (discriminator 2) -c0200394: 8b 45 f4 mov -0xc(%ebp),%eax -c0200397: 8d 50 01 lea 0x1(%eax),%edx -c020039a: 89 55 f4 mov %edx,-0xc(%ebp) -c020039d: 0f b6 55 ef movzbl -0x11(%ebp),%edx -c02003a1: 88 10 mov %dl,(%eax) -/media/unix/Data/Code/2020301918-os/kern/fs.c:24 (discriminator 2) -c02003a3: 83 45 f0 01 addl $0x1,-0x10(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:24 (discriminator 1) -c02003a7: 8b 45 f0 mov -0x10(%ebp),%eax -c02003aa: 3b 45 10 cmp 0x10(%ebp),%eax -c02003ad: 72 d2 jb c0200381 -/media/unix/Data/Code/2020301918-os/kern/fs.c:31 -c02003af: 8b 45 10 mov 0x10(%ebp),%eax -/media/unix/Data/Code/2020301918-os/kern/fs.c:32 -c02003b2: c9 leave -c02003b3: c3 ret - -c02003b4 : -do_read(): -/media/unix/Data/Code/2020301918-os/kern/fs.c:36 -c02003b4: 55 push %ebp -c02003b5: 89 e5 mov %esp,%ebp -c02003b7: 83 ec 08 sub $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:37 -c02003ba: 81 7d 0c ff ff ff bf cmpl $0xbfffffff,0xc(%ebp) -c02003c1: 76 16 jbe c02003d9 -/media/unix/Data/Code/2020301918-os/kern/fs.c:37 (discriminator 1) -c02003c3: 68 27 40 20 c0 push $0xc0204027 -c02003c8: 68 08 40 20 c0 push $0xc0204008 -c02003cd: 6a 25 push $0x25 -c02003cf: 68 1d 40 20 c0 push $0xc020401d -c02003d4: e8 e0 0d 00 00 call c02011b9 <_panic> -/media/unix/Data/Code/2020301918-os/kern/fs.c:38 -c02003d9: 8b 55 0c mov 0xc(%ebp),%edx -c02003dc: 8b 45 10 mov 0x10(%ebp),%eax -c02003df: 01 d0 add %edx,%eax -c02003e1: 3d ff ff ff bf cmp $0xbfffffff,%eax -c02003e6: 76 16 jbe c02003fe -/media/unix/Data/Code/2020301918-os/kern/fs.c:38 (discriminator 1) -c02003e8: 68 40 40 20 c0 push $0xc0204040 -c02003ed: 68 08 40 20 c0 push $0xc0204008 -c02003f2: 6a 26 push $0x26 -c02003f4: 68 1d 40 20 c0 push $0xc020401d -c02003f9: e8 bb 0d 00 00 call c02011b9 <_panic> -/media/unix/Data/Code/2020301918-os/kern/fs.c:39 -c02003fe: 83 ec 04 sub $0x4,%esp -c0200401: ff 75 10 push 0x10(%ebp) -c0200404: ff 75 0c push 0xc(%ebp) -c0200407: ff 75 08 push 0x8(%ebp) -c020040a: e8 41 ff ff ff call c0200350 -c020040f: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:40 -c0200412: c9 leave -c0200413: c3 ret - -c0200414 : -kern_write(): -/media/unix/Data/Code/2020301918-os/kern/fs.c:49 -c0200414: 55 push %ebp -c0200415: 89 e5 mov %esp,%ebp -c0200417: 83 ec 18 sub $0x18,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:50 -c020041a: 83 7d 08 01 cmpl $0x1,0x8(%ebp) -c020041e: 74 16 je c0200436 -/media/unix/Data/Code/2020301918-os/kern/fs.c:50 (discriminator 1) -c0200420: 68 5f 40 20 c0 push $0xc020405f -c0200425: 68 08 40 20 c0 push $0xc0204008 -c020042a: 6a 32 push $0x32 -c020042c: 68 1d 40 20 c0 push $0xc020401d -c0200431: e8 83 0d 00 00 call c02011b9 <_panic> -/media/unix/Data/Code/2020301918-os/kern/fs.c:52 -c0200436: 8b 45 0c mov 0xc(%ebp),%eax -c0200439: 89 45 f4 mov %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:53 -c020043c: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%ebp) -c0200443: eb 24 jmp c0200469 -/media/unix/Data/Code/2020301918-os/kern/fs.c:54 (discriminator 3) -c0200445: 8b 45 f4 mov -0xc(%ebp),%eax -c0200448: 8d 50 01 lea 0x1(%eax),%edx -c020044b: 89 55 f4 mov %edx,-0xc(%ebp) -c020044e: 0f b6 00 movzbl (%eax),%eax -c0200451: 0f be c0 movsbl %al,%eax -c0200454: 83 ec 08 sub $0x8,%esp -c0200457: 50 push %eax -c0200458: 68 67 40 20 c0 push $0xc0204067 -c020045d: e8 75 26 00 00 call c0202ad7 -c0200462: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:53 (discriminator 3) -c0200465: 83 45 f0 01 addl $0x1,-0x10(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:53 (discriminator 1) -c0200469: 8b 45 f0 mov -0x10(%ebp),%eax -c020046c: 3b 45 10 cmp 0x10(%ebp),%eax -c020046f: 72 d4 jb c0200445 -/media/unix/Data/Code/2020301918-os/kern/fs.c:56 -c0200471: 8b 45 10 mov 0x10(%ebp),%eax -/media/unix/Data/Code/2020301918-os/kern/fs.c:57 -c0200474: c9 leave -c0200475: c3 ret - -c0200476 : -do_write(): -/media/unix/Data/Code/2020301918-os/kern/fs.c:61 -c0200476: 55 push %ebp -c0200477: 89 e5 mov %esp,%ebp -c0200479: 83 ec 08 sub $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:62 -c020047c: 81 7d 0c ff ff ff bf cmpl $0xbfffffff,0xc(%ebp) -c0200483: 76 16 jbe c020049b -/media/unix/Data/Code/2020301918-os/kern/fs.c:62 (discriminator 1) -c0200485: 68 27 40 20 c0 push $0xc0204027 -c020048a: 68 08 40 20 c0 push $0xc0204008 -c020048f: 6a 3e push $0x3e -c0200491: 68 1d 40 20 c0 push $0xc020401d -c0200496: e8 1e 0d 00 00 call c02011b9 <_panic> -/media/unix/Data/Code/2020301918-os/kern/fs.c:63 -c020049b: 8b 55 0c mov 0xc(%ebp),%edx -c020049e: 8b 45 10 mov 0x10(%ebp),%eax -c02004a1: 01 d0 add %edx,%eax -c02004a3: 3d ff ff ff bf cmp $0xbfffffff,%eax -c02004a8: 76 16 jbe c02004c0 -/media/unix/Data/Code/2020301918-os/kern/fs.c:63 (discriminator 1) -c02004aa: 68 40 40 20 c0 push $0xc0204040 -c02004af: 68 08 40 20 c0 push $0xc0204008 -c02004b4: 6a 3f push $0x3f -c02004b6: 68 1d 40 20 c0 push $0xc020401d -c02004bb: e8 f9 0c 00 00 call c02011b9 <_panic> -/media/unix/Data/Code/2020301918-os/kern/fs.c:64 -c02004c0: 83 ec 04 sub $0x4,%esp -c02004c3: ff 75 10 push 0x10(%ebp) -c02004c6: ff 75 0c push 0xc(%ebp) -c02004c9: ff 75 08 push 0x8(%ebp) -c02004cc: e8 43 ff ff ff call c0200414 -c02004d1: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:65 -c02004d4: c9 leave -c02004d5: c3 ret - -c02004d6 : -waitdisk(): -/media/unix/Data/Code/2020301918-os/kern/fs.c:71 -c02004d6: 55 push %ebp -c02004d7: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/kern/fs.c:73 -c02004d9: 90 nop -/media/unix/Data/Code/2020301918-os/kern/fs.c:73 (discriminator 1) -c02004da: 68 f7 01 00 00 push $0x1f7 -c02004df: e8 1a fe ff ff call c02002fe -c02004e4: 83 c4 04 add $0x4,%esp -c02004e7: 0f b6 c0 movzbl %al,%eax -c02004ea: 25 c0 00 00 00 and $0xc0,%eax -c02004ef: 83 f8 40 cmp $0x40,%eax -c02004f2: 75 e6 jne c02004da -/media/unix/Data/Code/2020301918-os/kern/fs.c:75 -c02004f4: 90 nop -c02004f5: 90 nop -c02004f6: c9 leave -c02004f7: c3 ret - -c02004f8 : -readsect(): -/media/unix/Data/Code/2020301918-os/kern/fs.c:79 -c02004f8: 55 push %ebp -c02004f9: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/kern/fs.c:81 -c02004fb: e8 d6 ff ff ff call c02004d6 -/media/unix/Data/Code/2020301918-os/kern/fs.c:83 -c0200500: 6a 01 push $0x1 -c0200502: 68 f2 01 00 00 push $0x1f2 -c0200507: e8 2d fe ff ff call c0200339 -c020050c: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:84 -c020050f: 8b 45 0c mov 0xc(%ebp),%eax -c0200512: 0f b6 c0 movzbl %al,%eax -c0200515: 50 push %eax -c0200516: 68 f3 01 00 00 push $0x1f3 -c020051b: e8 19 fe ff ff call c0200339 -c0200520: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:85 -c0200523: 8b 45 0c mov 0xc(%ebp),%eax -c0200526: c1 e8 08 shr $0x8,%eax -c0200529: 0f b6 c0 movzbl %al,%eax -c020052c: 50 push %eax -c020052d: 68 f4 01 00 00 push $0x1f4 -c0200532: e8 02 fe ff ff call c0200339 -c0200537: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:86 -c020053a: 8b 45 0c mov 0xc(%ebp),%eax -c020053d: c1 e8 10 shr $0x10,%eax -c0200540: 0f b6 c0 movzbl %al,%eax -c0200543: 50 push %eax -c0200544: 68 f5 01 00 00 push $0x1f5 -c0200549: e8 eb fd ff ff call c0200339 -c020054e: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:87 -c0200551: 8b 45 0c mov 0xc(%ebp),%eax -c0200554: c1 e8 18 shr $0x18,%eax -c0200557: 83 c8 e0 or $0xffffffe0,%eax -c020055a: 0f b6 c0 movzbl %al,%eax -c020055d: 50 push %eax -c020055e: 68 f6 01 00 00 push $0x1f6 -c0200563: e8 d1 fd ff ff call c0200339 -c0200568: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:88 -c020056b: 6a 20 push $0x20 -c020056d: 68 f7 01 00 00 push $0x1f7 -c0200572: e8 c2 fd ff ff call c0200339 -c0200577: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:91 -c020057a: e8 57 ff ff ff call c02004d6 -/media/unix/Data/Code/2020301918-os/kern/fs.c:94 -c020057f: 68 80 00 00 00 push $0x80 -c0200584: ff 75 08 push 0x8(%ebp) -c0200587: 68 f0 01 00 00 push $0x1f0 -c020058c: e8 82 fd ff ff call c0200313 -c0200591: 83 c4 0c add $0xc,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:95 -c0200594: 90 nop -c0200595: c9 leave -c0200596: c3 ret - -c0200597 : -get_next_clus(): -/media/unix/Data/Code/2020301918-os/kern/fs.c:107 -c0200597: 55 push %ebp -c0200598: 89 e5 mov %esp,%ebp -c020059a: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:108 -c020059d: 8b 45 08 mov 0x8(%ebp),%eax -c02005a0: c1 e0 02 shl $0x2,%eax -c02005a3: c1 e8 09 shr $0x9,%eax -c02005a6: 89 45 fc mov %eax,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:109 -c02005a9: 8b 45 08 mov 0x8(%ebp),%eax -c02005ac: c1 e0 02 shl $0x2,%eax -c02005af: 25 fc 01 00 00 and $0x1fc,%eax -c02005b4: 89 45 f8 mov %eax,-0x8(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:112 -c02005b7: 8b 15 c0 89 20 c0 mov 0xc02089c0,%edx -c02005bd: 8b 45 fc mov -0x4(%ebp),%eax -c02005c0: 01 c2 add %eax,%edx -c02005c2: a1 c8 89 20 c0 mov 0xc02089c8,%eax -c02005c7: 39 c2 cmp %eax,%edx -c02005c9: 74 29 je c02005f4 -/media/unix/Data/Code/2020301918-os/kern/fs.c:113 -c02005cb: 8b 15 c0 89 20 c0 mov 0xc02089c0,%edx -c02005d1: 8b 45 fc mov -0x4(%ebp),%eax -c02005d4: 01 d0 add %edx,%eax -c02005d6: 50 push %eax -c02005d7: 68 e0 8b 20 c0 push $0xc0208be0 -c02005dc: e8 17 ff ff ff call c02004f8 -c02005e1: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:114 -c02005e4: 8b 15 c0 89 20 c0 mov 0xc02089c0,%edx -c02005ea: 8b 45 fc mov -0x4(%ebp),%eax -c02005ed: 01 d0 add %edx,%eax -c02005ef: a3 c8 89 20 c0 mov %eax,0xc02089c8 -/media/unix/Data/Code/2020301918-os/kern/fs.c:116 -c02005f4: 8b 45 f8 mov -0x8(%ebp),%eax -c02005f7: c1 e8 02 shr $0x2,%eax -c02005fa: 8b 04 85 e0 8b 20 c0 mov -0x3fdf7420(,%eax,4),%eax -/media/unix/Data/Code/2020301918-os/kern/fs.c:117 -c0200601: c9 leave -c0200602: c3 ret - -c0200603 : -read_data_sec(): -/media/unix/Data/Code/2020301918-os/kern/fs.c:125 -c0200603: 55 push %ebp -c0200604: 89 e5 mov %esp,%ebp -c0200606: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:126 -c0200609: 83 6d 0c 02 subl $0x2,0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:127 -c020060d: 0f b6 05 ed 89 20 c0 movzbl 0xc02089ed,%eax -c0200614: 0f b6 c0 movzbl %al,%eax -c0200617: 8b 55 0c mov 0xc(%ebp),%edx -c020061a: 0f af c2 imul %edx,%eax -c020061d: 89 45 0c mov %eax,0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:128 -c0200620: a1 c4 89 20 c0 mov 0xc02089c4,%eax -c0200625: 01 45 0c add %eax,0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:130 -c0200628: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) -c020062f: eb 1f jmp c0200650 -/media/unix/Data/Code/2020301918-os/kern/fs.c:131 (discriminator 3) -c0200631: 8b 55 fc mov -0x4(%ebp),%edx -c0200634: 8b 45 0c mov 0xc(%ebp),%eax -c0200637: 01 d0 add %edx,%eax -c0200639: 50 push %eax -c020063a: ff 75 08 push 0x8(%ebp) -c020063d: e8 b6 fe ff ff call c02004f8 -c0200642: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:130 (discriminator 3) -c0200645: 83 45 fc 01 addl $0x1,-0x4(%ebp) -c0200649: 81 45 08 00 02 00 00 addl $0x200,0x8(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:130 (discriminator 1) -c0200650: 0f b6 05 ed 89 20 c0 movzbl 0xc02089ed,%eax -c0200657: 0f b6 c0 movzbl %al,%eax -c020065a: 39 45 fc cmp %eax,-0x4(%ebp) -c020065d: 7c d2 jl c0200631 -/media/unix/Data/Code/2020301918-os/kern/fs.c:132 -c020065f: 8b 45 08 mov 0x8(%ebp),%eax -/media/unix/Data/Code/2020301918-os/kern/fs.c:133 -c0200662: c9 leave -c0200663: c3 ret - -c0200664 : -read_file(): -/media/unix/Data/Code/2020301918-os/kern/fs.c:142 -c0200664: 55 push %ebp -c0200665: 89 e5 mov %esp,%ebp -c0200667: 83 ec 18 sub $0x18,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:143 -c020066a: 83 ec 0c sub $0xc,%esp -c020066d: ff 75 08 push 0x8(%ebp) -c0200670: e8 12 2a 00 00 call c0203087 -c0200675: 83 c4 10 add $0x10,%esp -c0200678: 83 f8 0b cmp $0xb,%eax -c020067b: 74 19 je c0200696 -/media/unix/Data/Code/2020301918-os/kern/fs.c:143 (discriminator 1) -c020067d: 68 6a 40 20 c0 push $0xc020406a -c0200682: 68 08 40 20 c0 push $0xc0204008 -c0200687: 68 8f 00 00 00 push $0x8f -c020068c: 68 1d 40 20 c0 push $0xc020401d -c0200691: e8 23 0b 00 00 call c02011b9 <_panic> -/media/unix/Data/Code/2020301918-os/kern/fs.c:145 -c0200696: 83 ec 08 sub $0x8,%esp -c0200699: 6a 00 push $0x0 -c020069b: 68 e0 89 20 c0 push $0xc02089e0 -c02006a0: e8 53 fe ff ff call c02004f8 -c02006a5: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/fs.c:147 -c02006a8: 0f b7 05 ee 89 20 c0 movzwl 0xc02089ee,%eax -c02006af: 0f b7 c0 movzwl %ax,%eax -c02006b2: a3 c0 89 20 c0 mov %eax,0xc02089c0 -/media/unix/Data/Code/2020301918-os/kern/fs.c:148 -c02006b7: 8b 15 04 8a 20 c0 mov 0xc0208a04,%edx -c02006bd: 0f b6 05 f0 89 20 c0 movzbl 0xc02089f0,%eax -c02006c4: 0f b6 c0 movzbl %al,%eax -c02006c7: 0f af d0 imul %eax,%edx -c02006ca: a1 c0 89 20 c0 mov 0xc02089c0,%eax -c02006cf: 01 d0 add %edx,%eax -c02006d1: a3 c4 89 20 c0 mov %eax,0xc02089c4 -/media/unix/Data/Code/2020301918-os/kern/fs.c:150 -c02006d6: a1 0c 8a 20 c0 mov 0xc0208a0c,%eax -c02006db: 89 45 f4 mov %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:151 -c02006de: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:153 -c02006e5: 0f b7 05 eb 89 20 c0 movzwl 0xc02089eb,%eax -c02006ec: 66 3d 00 02 cmp $0x200,%ax -c02006f0: 75 0f jne c0200701 -/media/unix/Data/Code/2020301918-os/kern/fs.c:153 (discriminator 2) -c02006f2: 0f b6 05 ed 89 20 c0 movzbl 0xc02089ed,%eax -c02006f9: 3c 08 cmp $0x8,%al -c02006fb: 0f 84 b9 00 00 00 je c02007ba -/media/unix/Data/Code/2020301918-os/kern/fs.c:153 (discriminator 3) -c0200701: 68 84 40 20 c0 push $0xc0204084 -c0200706: 68 08 40 20 c0 push $0xc0204008 -c020070b: 68 99 00 00 00 push $0x99 -c0200710: 68 1d 40 20 c0 push $0xc020401d -c0200715: e8 9f 0a 00 00 call c02011b9 <_panic> -/media/unix/Data/Code/2020301918-os/kern/fs.c:158 -c020071a: 83 ec 08 sub $0x8,%esp -c020071d: ff 75 f4 push -0xc(%ebp) -c0200720: 68 e0 8d 20 c0 push $0xc0208de0 -c0200725: e8 d9 fe ff ff call c0200603 -c020072a: 83 c4 10 add $0x10,%esp -c020072d: 89 45 e8 mov %eax,-0x18(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:159 -c0200730: c7 45 ec e0 8d 20 c0 movl $0xc0208de0,-0x14(%ebp) -c0200737: eb 62 jmp c020079b -/media/unix/Data/Code/2020301918-os/kern/fs.c:161 -c0200739: 8b 45 ec mov -0x14(%ebp),%eax -c020073c: 83 ec 04 sub $0x4,%esp -c020073f: 6a 0b push $0xb -c0200741: ff 75 08 push 0x8(%ebp) -c0200744: 50 push %eax -c0200745: e8 74 2a 00 00 call c02031be -c020074a: 83 c4 10 add $0x10,%esp -c020074d: 85 c0 test %eax,%eax -c020074f: 75 46 jne c0200797 -/media/unix/Data/Code/2020301918-os/kern/fs.c:162 -c0200751: 8b 45 ec mov -0x14(%ebp),%eax -c0200754: 8b 40 1c mov 0x1c(%eax),%eax -c0200757: 3d 00 00 00 01 cmp $0x1000000,%eax -c020075c: 76 19 jbe c0200777 -/media/unix/Data/Code/2020301918-os/kern/fs.c:162 (discriminator 1) -c020075e: 68 be 40 20 c0 push $0xc02040be -c0200763: 68 08 40 20 c0 push $0xc0204008 -c0200768: 68 a2 00 00 00 push $0xa2 -c020076d: 68 1d 40 20 c0 push $0xc020401d -c0200772: e8 42 0a 00 00 call c02011b9 <_panic> -/media/unix/Data/Code/2020301918-os/kern/fs.c:163 -c0200777: 8b 45 ec mov -0x14(%ebp),%eax -c020077a: 0f b7 40 14 movzwl 0x14(%eax),%eax -c020077e: 0f b7 c0 movzwl %ax,%eax -c0200781: c1 e0 10 shl $0x10,%eax -c0200784: 89 c2 mov %eax,%edx -/media/unix/Data/Code/2020301918-os/kern/fs.c:164 -c0200786: 8b 45 ec mov -0x14(%ebp),%eax -c0200789: 0f b7 40 1a movzwl 0x1a(%eax),%eax -c020078d: 0f b7 c0 movzwl %ax,%eax -/media/unix/Data/Code/2020301918-os/kern/fs.c:163 -c0200790: 09 d0 or %edx,%eax -c0200792: 89 45 f0 mov %eax,-0x10(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:165 -c0200795: eb 0c jmp c02007a3 -/media/unix/Data/Code/2020301918-os/kern/fs.c:160 -c0200797: 83 45 ec 20 addl $0x20,-0x14(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:160 (discriminator 1) -c020079b: 8b 45 ec mov -0x14(%ebp),%eax -c020079e: 3b 45 e8 cmp -0x18(%ebp),%eax -c02007a1: 72 96 jb c0200739 -/media/unix/Data/Code/2020301918-os/kern/fs.c:168 -c02007a3: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c02007a7: 75 20 jne c02007c9 -/media/unix/Data/Code/2020301918-os/kern/fs.c:170 -c02007a9: 83 ec 0c sub $0xc,%esp -c02007ac: ff 75 f4 push -0xc(%ebp) -c02007af: e8 e3 fd ff ff call c0200597 -c02007b4: 83 c4 10 add $0x10,%esp -c02007b7: 89 45 f4 mov %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:157 -c02007ba: 81 7d f4 f7 ff ff 0f cmpl $0xffffff7,-0xc(%ebp) -c02007c1: 0f 86 53 ff ff ff jbe c020071a -c02007c7: eb 01 jmp c02007ca -/media/unix/Data/Code/2020301918-os/kern/fs.c:169 -c02007c9: 90 nop -/media/unix/Data/Code/2020301918-os/kern/fs.c:173 -c02007ca: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c02007ce: 75 3c jne c020080c -/media/unix/Data/Code/2020301918-os/kern/fs.c:174 -c02007d0: ff 75 08 push 0x8(%ebp) -c02007d3: 68 dc 40 20 c0 push $0xc02040dc -c02007d8: 68 ae 00 00 00 push $0xae -c02007dd: 68 1d 40 20 c0 push $0xc020401d -c02007e2: e8 d2 09 00 00 call c02011b9 <_panic> -/media/unix/Data/Code/2020301918-os/kern/fs.c:177 -c02007e7: 83 ec 08 sub $0x8,%esp -c02007ea: ff 75 f0 push -0x10(%ebp) -c02007ed: ff 75 0c push 0xc(%ebp) -c02007f0: e8 0e fe ff ff call c0200603 -c02007f5: 83 c4 10 add $0x10,%esp -c02007f8: 89 45 0c mov %eax,0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:178 -c02007fb: 83 ec 0c sub $0xc,%esp -c02007fe: ff 75 f0 push -0x10(%ebp) -c0200801: e8 91 fd ff ff call c0200597 -c0200806: 83 c4 10 add $0x10,%esp -c0200809: 89 45 f0 mov %eax,-0x10(%ebp) -/media/unix/Data/Code/2020301918-os/kern/fs.c:176 -c020080c: 81 7d f0 f7 ff ff 0f cmpl $0xffffff7,-0x10(%ebp) -c0200813: 76 d2 jbe c02007e7 -/media/unix/Data/Code/2020301918-os/kern/fs.c:180 -c0200815: 90 nop -c0200816: 90 nop -c0200817: c9 leave -c0200818: c3 ret - -c0200819 : -xchg(): -/media/unix/Data/Code/2020301918-os/inc/x86.h:200 -c0200819: 55 push %ebp -c020081a: 89 e5 mov %esp,%ebp -c020081c: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/inc/x86.h:204 -c020081f: 8b 55 08 mov 0x8(%ebp),%edx -c0200822: 8b 45 0c mov 0xc(%ebp),%eax -c0200825: 8b 4d 08 mov 0x8(%ebp),%ecx -c0200828: f0 87 02 lock xchg %eax,(%edx) -c020082b: 89 45 fc mov %eax,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/inc/x86.h:208 -c020082e: 8b 45 fc mov -0x4(%ebp),%eax -/media/unix/Data/Code/2020301918-os/inc/x86.h:209 -c0200831: c9 leave -c0200832: c3 ret - -c0200833 : -add_keyboard_buf(): -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:27 -c0200833: 55 push %ebp -c0200834: 89 e5 mov %esp,%ebp -c0200836: 83 ec 04 sub $0x4,%esp -c0200839: 8b 45 08 mov 0x8(%ebp),%eax -c020083c: 88 45 fc mov %al,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:29 -c020083f: 90 nop -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:29 (discriminator 1) -c0200840: 6a 01 push $0x1 -c0200842: 68 00 70 20 c0 push $0xc0207000 -c0200847: e8 cd ff ff ff call c0200819 -c020084c: 83 c4 08 add $0x8,%esp -c020084f: 83 f8 01 cmp $0x1,%eax -c0200852: 74 ec je c0200840 -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:31 -c0200854: a1 0c 70 20 c0 mov 0xc020700c,%eax -c0200859: 3d 00 04 00 00 cmp $0x400,%eax -c020085e: 74 3b je c020089b -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:34 -c0200860: a1 08 70 20 c0 mov 0xc0207008,%eax -c0200865: 8d 50 01 lea 0x1(%eax),%edx -c0200868: 89 15 08 70 20 c0 mov %edx,0xc0207008 -c020086e: 0f b6 55 fc movzbl -0x4(%ebp),%edx -c0200872: 88 10 mov %dl,(%eax) -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:35 -c0200874: a1 08 70 20 c0 mov 0xc0207008,%eax -c0200879: ba 10 74 20 c0 mov $0xc0207410,%edx -c020087e: 39 d0 cmp %edx,%eax -c0200880: 75 0a jne c020088c -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:36 -c0200882: c7 05 08 70 20 c0 10 movl $0xc0207010,0xc0207008 -c0200889: 70 20 c0 -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:37 -c020088c: a1 0c 70 20 c0 mov 0xc020700c,%eax -c0200891: 83 c0 01 add $0x1,%eax -c0200894: a3 0c 70 20 c0 mov %eax,0xc020700c -c0200899: eb 01 jmp c020089c -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:32 -c020089b: 90 nop -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:40 -c020089c: 6a 00 push $0x0 -c020089e: 68 00 70 20 c0 push $0xc0207000 -c02008a3: e8 71 ff ff ff call c0200819 -c02008a8: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:41 -c02008ab: 90 nop -c02008ac: c9 leave -c02008ad: c3 ret - -c02008ae : -read_keyboard_buf(): -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:49 -c02008ae: 55 push %ebp -c02008af: 89 e5 mov %esp,%ebp -c02008b1: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:53 -c02008b4: 90 nop -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:53 (discriminator 1) -c02008b5: 6a 01 push $0x1 -c02008b7: 68 00 70 20 c0 push $0xc0207000 -c02008bc: e8 58 ff ff ff call c0200819 -c02008c1: 83 c4 08 add $0x8,%esp -c02008c4: 83 f8 01 cmp $0x1,%eax -c02008c7: 74 ec je c02008b5 -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:55 -c02008c9: a1 0c 70 20 c0 mov 0xc020700c,%eax -c02008ce: 85 c0 test %eax,%eax -c02008d0: 75 06 jne c02008d8 -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:56 -c02008d2: c6 45 ff ff movb $0xff,-0x1(%ebp) -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:57 -c02008d6: eb 39 jmp c0200911 -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:60 -c02008d8: a1 04 70 20 c0 mov 0xc0207004,%eax -c02008dd: 8d 50 01 lea 0x1(%eax),%edx -c02008e0: 89 15 04 70 20 c0 mov %edx,0xc0207004 -c02008e6: 0f b6 00 movzbl (%eax),%eax -c02008e9: 88 45 ff mov %al,-0x1(%ebp) -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:61 -c02008ec: a1 04 70 20 c0 mov 0xc0207004,%eax -c02008f1: ba 10 74 20 c0 mov $0xc0207410,%edx -c02008f6: 39 d0 cmp %edx,%eax -c02008f8: 75 0a jne c0200904 -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:62 -c02008fa: c7 05 04 70 20 c0 10 movl $0xc0207010,0xc0207004 -c0200901: 70 20 c0 -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:63 -c0200904: a1 0c 70 20 c0 mov 0xc020700c,%eax -c0200909: 83 e8 01 sub $0x1,%eax -c020090c: a3 0c 70 20 c0 mov %eax,0xc020700c -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:66 -c0200911: 6a 00 push $0x0 -c0200913: 68 00 70 20 c0 push $0xc0207000 -c0200918: e8 fc fe ff ff call c0200819 -c020091d: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:67 -c0200920: 0f b6 45 ff movzbl -0x1(%ebp),%eax -/media/unix/Data/Code/2020301918-os/kern/keyboard.c:68 -c0200924: c9 leave -c0200925: c3 ret - -c0200926 : -phy_malloc_4k(): -/media/unix/Data/Code/2020301918-os/kern/kmalloc.c:15 -c0200926: 55 push %ebp -c0200927: 89 e5 mov %esp,%ebp -c0200929: 83 ec 18 sub $0x18,%esp -/media/unix/Data/Code/2020301918-os/kern/kmalloc.c:16 -c020092c: a1 10 74 20 c0 mov 0xc0207410,%eax -c0200931: 3d ff ff ff 07 cmp $0x7ffffff,%eax -c0200936: 76 16 jbe c020094e -/media/unix/Data/Code/2020301918-os/kern/kmalloc.c:16 (discriminator 1) -c0200938: 68 00 43 20 c0 push $0xc0204300 -c020093d: 68 17 43 20 c0 push $0xc0204317 -c0200942: 6a 10 push $0x10 -c0200944: 68 2c 43 20 c0 push $0xc020432c -c0200949: e8 6b 08 00 00 call c02011b9 <_panic> -/media/unix/Data/Code/2020301918-os/kern/kmalloc.c:18 -c020094e: a1 10 74 20 c0 mov 0xc0207410,%eax -c0200953: 89 45 f4 mov %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/kmalloc.c:19 -c0200956: a1 10 74 20 c0 mov 0xc0207410,%eax -c020095b: 05 00 10 00 00 add $0x1000,%eax -c0200960: a3 10 74 20 c0 mov %eax,0xc0207410 -/media/unix/Data/Code/2020301918-os/kern/kmalloc.c:21 -c0200965: 8b 45 f4 mov -0xc(%ebp),%eax -/media/unix/Data/Code/2020301918-os/kern/kmalloc.c:22 -c0200968: c9 leave -c0200969: c3 ret - -c020096a : -lcr3(): -/media/unix/Data/Code/2020301918-os/inc/x86.h:126 -c020096a: 55 push %ebp -c020096b: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/inc/x86.h:127 -c020096d: 8b 45 08 mov 0x8(%ebp),%eax -c0200970: 0f 22 d8 mov %eax,%cr3 -/media/unix/Data/Code/2020301918-os/inc/x86.h:128 -c0200973: 90 nop -c0200974: 5d pop %ebp -c0200975: c3 ret - -c0200976 : -init_segment(): -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:107 -c0200976: 55 push %ebp -c0200977: 89 e5 mov %esp,%ebp -c0200979: 83 ec 04 sub $0x4,%esp -c020097c: 8b 45 14 mov 0x14(%ebp),%eax -c020097f: 66 89 45 fc mov %ax,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:108 -c0200983: 8b 45 10 mov 0x10(%ebp),%eax -c0200986: 89 c2 mov %eax,%edx -c0200988: 8b 45 08 mov 0x8(%ebp),%eax -c020098b: 66 89 10 mov %dx,(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:109 -c020098e: 8b 45 0c mov 0xc(%ebp),%eax -c0200991: 89 c2 mov %eax,%edx -c0200993: 8b 45 08 mov 0x8(%ebp),%eax -c0200996: 66 89 50 02 mov %dx,0x2(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:110 -c020099a: 8b 45 0c mov 0xc(%ebp),%eax -c020099d: c1 e8 10 shr $0x10,%eax -c02009a0: 89 c2 mov %eax,%edx -c02009a2: 8b 45 08 mov 0x8(%ebp),%eax -c02009a5: 88 50 04 mov %dl,0x4(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:111 -c02009a8: 0f b7 45 fc movzwl -0x4(%ebp),%eax -c02009ac: 89 c2 mov %eax,%edx -c02009ae: 8b 45 08 mov 0x8(%ebp),%eax -c02009b1: 88 50 05 mov %dl,0x5(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:112 -c02009b4: 8b 45 10 mov 0x10(%ebp),%eax -c02009b7: c1 e8 10 shr $0x10,%eax -c02009ba: 83 e0 0f and $0xf,%eax -c02009bd: 89 c2 mov %eax,%edx -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:113 -c02009bf: 0f b7 45 fc movzwl -0x4(%ebp),%eax -c02009c3: 66 c1 e8 08 shr $0x8,%ax -c02009c7: 83 e0 f0 and $0xfffffff0,%eax -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:112 -c02009ca: 09 c2 or %eax,%edx -c02009cc: 8b 45 08 mov 0x8(%ebp),%eax -c02009cf: 88 50 06 mov %dl,0x6(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:114 -c02009d2: 8b 45 0c mov 0xc(%ebp),%eax -c02009d5: c1 e8 18 shr $0x18,%eax -c02009d8: 89 c2 mov %eax,%edx -c02009da: 8b 45 08 mov 0x8(%ebp),%eax -c02009dd: 88 50 07 mov %dl,0x7(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:115 -c02009e0: 90 nop -c02009e1: c9 leave -c02009e2: c3 ret - -c02009e3 : -init_gate(): -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:119 -c02009e3: 55 push %ebp -c02009e4: 89 e5 mov %esp,%ebp -c02009e6: 83 ec 08 sub $0x8,%esp -c02009e9: 8b 55 0c mov 0xc(%ebp),%edx -c02009ec: 8b 45 14 mov 0x14(%ebp),%eax -c02009ef: 88 55 fc mov %dl,-0x4(%ebp) -c02009f2: 88 45 f8 mov %al,-0x8(%ebp) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:120 -c02009f5: 8b 45 10 mov 0x10(%ebp),%eax -c02009f8: 89 c2 mov %eax,%edx -c02009fa: 8b 45 08 mov 0x8(%ebp),%eax -c02009fd: 66 89 10 mov %dx,(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:121 -c0200a00: 8b 45 08 mov 0x8(%ebp),%eax -c0200a03: 66 c7 40 02 08 00 movw $0x8,0x2(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:122 -c0200a09: 8b 45 08 mov 0x8(%ebp),%eax -c0200a0c: c6 40 04 00 movb $0x0,0x4(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:123 -c0200a10: 0f b6 45 f8 movzbl -0x8(%ebp),%eax -c0200a14: c1 e0 05 shl $0x5,%eax -c0200a17: 89 c2 mov %eax,%edx -c0200a19: 0f b6 45 fc movzbl -0x4(%ebp),%eax -c0200a1d: 09 d0 or %edx,%eax -c0200a1f: 89 c2 mov %eax,%edx -c0200a21: 8b 45 08 mov 0x8(%ebp),%eax -c0200a24: 88 50 05 mov %dl,0x5(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:124 -c0200a27: 8b 45 10 mov 0x10(%ebp),%eax -c0200a2a: c1 e8 10 shr $0x10,%eax -c0200a2d: 89 c2 mov %eax,%edx -c0200a2f: 8b 45 08 mov 0x8(%ebp),%eax -c0200a32: 66 89 50 06 mov %dx,0x6(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:125 -c0200a36: 90 nop -c0200a37: c9 leave -c0200a38: c3 ret - -c0200a39 : -init_segment_regs(): -/media/unix/Data/Code/2020301918-os/kern/main.c:26 -c0200a39: 55 push %ebp -c0200a3a: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/kern/main.c:27 -c0200a3c: 8b 45 08 mov 0x8(%ebp),%eax -c0200a3f: c7 40 38 0f 00 00 00 movl $0xf,0x38(%eax) -/media/unix/Data/Code/2020301918-os/kern/main.c:29 -c0200a46: 8b 45 08 mov 0x8(%ebp),%eax -c0200a49: c7 40 0c 17 00 00 00 movl $0x17,0xc(%eax) -/media/unix/Data/Code/2020301918-os/kern/main.c:31 -c0200a50: 8b 45 08 mov 0x8(%ebp),%eax -c0200a53: c7 40 08 17 00 00 00 movl $0x17,0x8(%eax) -/media/unix/Data/Code/2020301918-os/kern/main.c:33 -c0200a5a: 8b 45 08 mov 0x8(%ebp),%eax -c0200a5d: c7 40 04 17 00 00 00 movl $0x17,0x4(%eax) -/media/unix/Data/Code/2020301918-os/kern/main.c:35 -c0200a64: 8b 45 08 mov 0x8(%ebp),%eax -c0200a67: c7 40 44 17 00 00 00 movl $0x17,0x44(%eax) -/media/unix/Data/Code/2020301918-os/kern/main.c:37 -c0200a6e: 8b 45 08 mov 0x8(%ebp),%eax -c0200a71: c7 00 1b 00 00 00 movl $0x1b,(%eax) -/media/unix/Data/Code/2020301918-os/kern/main.c:39 -c0200a77: 90 nop -c0200a78: 5d pop %ebp -c0200a79: c3 ret - -c0200a7a : -lml_map(): -/media/unix/Data/Code/2020301918-os/kern/main.c:42 -c0200a7a: 55 push %ebp -c0200a7b: 89 e5 mov %esp,%ebp -c0200a7d: 83 ec 18 sub $0x18,%esp -/media/unix/Data/Code/2020301918-os/kern/main.c:43 -c0200a80: 8b 45 08 mov 0x8(%ebp),%eax -c0200a83: 2d 00 00 00 40 sub $0x40000000,%eax -c0200a88: 89 45 f4 mov %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:44 -c0200a8b: 81 45 f4 00 0c 00 00 addl $0xc00,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:46 -c0200a92: 8b 45 0c mov 0xc(%ebp),%eax -c0200a95: c1 e8 16 shr $0x16,%eax -c0200a98: c1 e0 02 shl $0x2,%eax -c0200a9b: 01 45 f4 add %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:47 -c0200a9e: 8b 45 f4 mov -0xc(%ebp),%eax -c0200aa1: 8b 00 mov (%eax),%eax -c0200aa3: 83 e0 01 and $0x1,%eax -c0200aa6: 85 c0 test %eax,%eax -c0200aa8: 75 12 jne c0200abc -/media/unix/Data/Code/2020301918-os/kern/main.c:49 -c0200aaa: e8 77 fe ff ff call c0200926 -c0200aaf: 0b 45 14 or 0x14(%ebp),%eax -c0200ab2: 83 c8 01 or $0x1,%eax -c0200ab5: 89 c2 mov %eax,%edx -c0200ab7: 8b 45 f4 mov -0xc(%ebp),%eax -c0200aba: 89 10 mov %edx,(%eax) -/media/unix/Data/Code/2020301918-os/kern/main.c:51 -c0200abc: 8b 45 f4 mov -0xc(%ebp),%eax -c0200abf: 8b 00 mov (%eax),%eax -c0200ac1: 25 00 f0 ff ff and $0xfffff000,%eax -c0200ac6: 2d 00 00 00 40 sub $0x40000000,%eax -c0200acb: 89 45 f0 mov %eax,-0x10(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:53 -c0200ace: 8b 45 0c mov 0xc(%ebp),%eax -c0200ad1: c1 e8 0c shr $0xc,%eax -c0200ad4: 25 ff 03 00 00 and $0x3ff,%eax -c0200ad9: c1 e0 02 shl $0x2,%eax -c0200adc: 01 45 f0 add %eax,-0x10(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:55 -c0200adf: 8b 45 10 mov 0x10(%ebp),%eax -c0200ae2: 25 00 f0 ff ff and $0xfffff000,%eax -c0200ae7: 0b 45 14 or 0x14(%ebp),%eax -c0200aea: 83 c8 01 or $0x1,%eax -c0200aed: 89 c2 mov %eax,%edx -c0200aef: 8b 45 f0 mov -0x10(%ebp),%eax -c0200af2: 89 10 mov %edx,(%eax) -/media/unix/Data/Code/2020301918-os/kern/main.c:56 -c0200af4: 90 nop -c0200af5: c9 leave -c0200af6: c3 ret - -c0200af7 : -kernel_main(): -/media/unix/Data/Code/2020301918-os/kern/main.c:63 -c0200af7: 55 push %ebp -c0200af8: 89 e5 mov %esp,%ebp -c0200afa: 53 push %ebx -c0200afb: 83 ec 74 sub $0x74,%esp -/media/unix/Data/Code/2020301918-os/kern/main.c:64 -c0200afe: 83 ec 0c sub $0xc,%esp -c0200b01: 68 3b 43 20 c0 push $0xc020433b -c0200b06: e8 cc 1f 00 00 call c0202ad7 -c0200b0b: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/main.c:66 -c0200b0e: c7 45 f4 00 9e 20 c0 movl $0xc0209e00,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:68 -c0200b15: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%ebp) -c0200b1c: e9 ba 02 00 00 jmp c0200ddb -/media/unix/Data/Code/2020301918-os/kern/main.c:70 -c0200b21: 83 ec 0c sub $0xc,%esp -c0200b24: ff 75 f4 push -0xc(%ebp) -c0200b27: e8 0d ff ff ff call c0200a39 -c0200b2c: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/main.c:72 -c0200b2f: e8 f2 fd ff ff call c0200926 -c0200b34: 8b 55 f4 mov -0xc(%ebp),%edx -c0200b37: 89 42 70 mov %eax,0x70(%edx) -/media/unix/Data/Code/2020301918-os/kern/main.c:74 -c0200b3a: 8b 45 f4 mov -0xc(%ebp),%eax -c0200b3d: 8b 40 70 mov 0x70(%eax),%eax -c0200b40: 83 ec 0c sub $0xc,%esp -c0200b43: 50 push %eax -c0200b44: e8 ff 02 00 00 call c0200e48 -c0200b49: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/main.c:88 -c0200b4c: 8b 55 f0 mov -0x10(%ebp),%edx -c0200b4f: 89 d0 mov %edx,%eax -c0200b51: 01 c0 add %eax,%eax -c0200b53: 01 d0 add %edx,%eax -c0200b55: c1 e0 02 shl $0x2,%eax -c0200b58: 05 14 74 20 c0 add $0xc0207414,%eax -c0200b5d: 83 ec 08 sub $0x8,%esp -c0200b60: 68 00 00 00 c3 push $0xc3000000 -c0200b65: 50 push %eax -c0200b66: e8 f9 fa ff ff call c0200664 -c0200b6b: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/main.c:92 -c0200b6e: c7 45 d8 00 00 00 c3 movl $0xc3000000,-0x28(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:93 -c0200b75: 8b 45 d8 mov -0x28(%ebp),%eax -c0200b78: 8b 00 mov (%eax),%eax -c0200b7a: 3d 7f 45 4c 46 cmp $0x464c457f,%eax -c0200b7f: 74 16 je c0200b97 -/media/unix/Data/Code/2020301918-os/kern/main.c:93 (discriminator 1) -c0200b81: 68 54 43 20 c0 push $0xc0204354 -c0200b86: 68 72 43 20 c0 push $0xc0204372 -c0200b8b: 6a 5d push $0x5d -c0200b8d: 68 87 43 20 c0 push $0xc0204387 -c0200b92: e8 22 06 00 00 call c02011b9 <_panic> -/media/unix/Data/Code/2020301918-os/kern/main.c:94 -c0200b97: 8b 45 d8 mov -0x28(%ebp),%eax -c0200b9a: 89 45 d4 mov %eax,-0x2c(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:95 -c0200b9d: c7 45 ec 00 00 00 00 movl $0x0,-0x14(%ebp) -c0200ba4: e9 16 01 00 00 jmp c0200cbf -/media/unix/Data/Code/2020301918-os/kern/main.c:96 -c0200ba9: 8b 45 d4 mov -0x2c(%ebp),%eax -c0200bac: 0f b7 40 2a movzwl 0x2a(%eax),%eax -c0200bb0: 0f b7 c0 movzwl %ax,%eax -c0200bb3: 0f af 45 ec imul -0x14(%ebp),%eax -c0200bb7: 89 c2 mov %eax,%edx -c0200bb9: 8b 45 d4 mov -0x2c(%ebp),%eax -c0200bbc: 8b 40 1c mov 0x1c(%eax),%eax -c0200bbf: 01 c2 add %eax,%edx -c0200bc1: 8b 45 d8 mov -0x28(%ebp),%eax -c0200bc4: 01 d0 add %edx,%eax -c0200bc6: 89 45 c4 mov %eax,-0x3c(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:97 -c0200bc9: 8b 45 c4 mov -0x3c(%ebp),%eax -c0200bcc: 8b 00 mov (%eax),%eax -c0200bce: 83 f8 01 cmp $0x1,%eax -c0200bd1: 0f 85 e4 00 00 00 jne c0200cbb -/media/unix/Data/Code/2020301918-os/kern/main.c:98 -c0200bd7: 8b 45 c4 mov -0x3c(%ebp),%eax -c0200bda: 8b 40 08 mov 0x8(%eax),%eax -c0200bdd: 25 00 f0 ff ff and $0xfffff000,%eax -c0200be2: 89 45 c0 mov %eax,-0x40(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:99 -c0200be5: 8b 45 c4 mov -0x3c(%ebp),%eax -c0200be8: 8b 50 08 mov 0x8(%eax),%edx -c0200beb: 8b 45 c4 mov -0x3c(%ebp),%eax -c0200bee: 8b 40 14 mov 0x14(%eax),%eax -c0200bf1: 01 d0 add %edx,%eax -c0200bf3: 83 e8 01 sub $0x1,%eax -c0200bf6: 25 00 f0 ff ff and $0xfffff000,%eax -c0200bfb: 89 45 bc mov %eax,-0x44(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:101 -c0200bfe: 8b 45 bc mov -0x44(%ebp),%eax -c0200c01: 2b 45 c0 sub -0x40(%ebp),%eax -c0200c04: c1 e8 0c shr $0xc,%eax -c0200c07: 83 c0 01 add $0x1,%eax -c0200c0a: 89 45 b8 mov %eax,-0x48(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:102 -c0200c0d: c7 45 e8 00 00 00 00 movl $0x0,-0x18(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:103 -c0200c14: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) -c0200c1b: eb 2e jmp c0200c4b -/media/unix/Data/Code/2020301918-os/kern/main.c:104 (discriminator 3) -c0200c1d: e8 04 fd ff ff call c0200926 -c0200c22: 89 45 e8 mov %eax,-0x18(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:105 (discriminator 3) -c0200c25: 8b 45 e4 mov -0x1c(%ebp),%eax -c0200c28: c1 e0 0c shl $0xc,%eax -c0200c2b: 89 c2 mov %eax,%edx -c0200c2d: 8b 45 c0 mov -0x40(%ebp),%eax -c0200c30: 01 c2 add %eax,%edx -c0200c32: 8b 45 f4 mov -0xc(%ebp),%eax -c0200c35: 8b 40 70 mov 0x70(%eax),%eax -c0200c38: 6a 07 push $0x7 -c0200c3a: ff 75 e8 push -0x18(%ebp) -c0200c3d: 52 push %edx -c0200c3e: 50 push %eax -c0200c3f: e8 36 fe ff ff call c0200a7a -c0200c44: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/main.c:103 (discriminator 3) -c0200c47: 83 45 e4 01 addl $0x1,-0x1c(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:103 (discriminator 1) -c0200c4b: 8b 45 e4 mov -0x1c(%ebp),%eax -c0200c4e: 39 45 b8 cmp %eax,-0x48(%ebp) -c0200c51: 77 ca ja c0200c1d -/media/unix/Data/Code/2020301918-os/kern/main.c:107 -c0200c53: 8b 45 b8 mov -0x48(%ebp),%eax -c0200c56: 83 e8 01 sub $0x1,%eax -c0200c59: c1 e0 0c shl $0xc,%eax -c0200c5c: 89 c2 mov %eax,%edx -c0200c5e: 8b 45 e8 mov -0x18(%ebp),%eax -c0200c61: 29 d0 sub %edx,%eax -c0200c63: 89 45 b4 mov %eax,-0x4c(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:108 -c0200c66: 8b 45 c4 mov -0x3c(%ebp),%eax -c0200c69: 8b 40 10 mov 0x10(%eax),%eax -c0200c6c: 8b 55 c4 mov -0x3c(%ebp),%edx -c0200c6f: 8b 4a 04 mov 0x4(%edx),%ecx -c0200c72: 8b 55 d8 mov -0x28(%ebp),%edx -c0200c75: 01 ca add %ecx,%edx -c0200c77: 8b 4d b4 mov -0x4c(%ebp),%ecx -c0200c7a: 81 e9 00 00 00 40 sub $0x40000000,%ecx -c0200c80: 83 ec 04 sub $0x4,%esp -c0200c83: 50 push %eax -c0200c84: 52 push %edx -c0200c85: 51 push %ecx -c0200c86: e8 ba 25 00 00 call c0203245 -c0200c8b: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/main.c:109 -c0200c8e: 8b 45 c4 mov -0x3c(%ebp),%eax -c0200c91: 8b 50 14 mov 0x14(%eax),%edx -c0200c94: 8b 45 c4 mov -0x3c(%ebp),%eax -c0200c97: 8b 40 10 mov 0x10(%eax),%eax -c0200c9a: 29 c2 sub %eax,%edx -c0200c9c: 8b 45 c4 mov -0x3c(%ebp),%eax -c0200c9f: 8b 48 10 mov 0x10(%eax),%ecx -c0200ca2: 8b 45 b4 mov -0x4c(%ebp),%eax -c0200ca5: 01 c8 add %ecx,%eax -c0200ca7: 2d 00 00 00 40 sub $0x40000000,%eax -c0200cac: 83 ec 04 sub $0x4,%esp -c0200caf: 52 push %edx -c0200cb0: 6a 00 push $0x0 -c0200cb2: 50 push %eax -c0200cb3: e8 5c 25 00 00 call c0203214 -c0200cb8: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/main.c:95 (discriminator 2) -c0200cbb: 83 45 ec 01 addl $0x1,-0x14(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:95 (discriminator 1) -c0200cbf: 8b 45 d4 mov -0x2c(%ebp),%eax -c0200cc2: 0f b7 40 2c movzwl 0x2c(%eax),%eax -c0200cc6: 0f b7 c0 movzwl %ax,%eax -c0200cc9: 39 45 ec cmp %eax,-0x14(%ebp) -c0200ccc: 0f 8c d7 fe ff ff jl c0200ba9 -/media/unix/Data/Code/2020301918-os/kern/main.c:117 -c0200cd2: e8 4f fc ff ff call c0200926 -c0200cd7: 89 45 d0 mov %eax,-0x30(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:118 -c0200cda: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp) -c0200ce1: eb 09 jmp c0200cec -/media/unix/Data/Code/2020301918-os/kern/main.c:118 (discriminator 3) -c0200ce3: e8 3e fc ff ff call c0200926 -c0200ce8: 83 45 e0 01 addl $0x1,-0x20(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:118 (discriminator 1) -c0200cec: 83 7d e0 05 cmpl $0x5,-0x20(%ebp) -c0200cf0: 7e f1 jle c0200ce3 -/media/unix/Data/Code/2020301918-os/kern/main.c:119 -c0200cf2: e8 2f fc ff ff call c0200926 -c0200cf7: 89 45 cc mov %eax,-0x34(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:120 -c0200cfa: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp) -c0200d01: eb 3b jmp c0200d3e -/media/unix/Data/Code/2020301918-os/kern/main.c:121 (discriminator 3) -c0200d03: 8b 45 dc mov -0x24(%ebp),%eax -c0200d06: c1 e0 0c shl $0xc,%eax -c0200d09: 89 c2 mov %eax,%edx -c0200d0b: 8b 45 d0 mov -0x30(%ebp),%eax -c0200d0e: 8d 0c 02 lea (%edx,%eax,1),%ecx -c0200d11: b8 08 00 00 00 mov $0x8,%eax -c0200d16: 2b 45 dc sub -0x24(%ebp),%eax -c0200d19: c1 e0 0c shl $0xc,%eax -c0200d1c: 89 c3 mov %eax,%ebx -c0200d1e: b8 00 00 00 c0 mov $0xc0000000,%eax -c0200d23: 29 d8 sub %ebx,%eax -c0200d25: 89 c2 mov %eax,%edx -c0200d27: 8b 45 f4 mov -0xc(%ebp),%eax -c0200d2a: 8b 40 70 mov 0x70(%eax),%eax -c0200d2d: 6a 07 push $0x7 -c0200d2f: 51 push %ecx -c0200d30: 52 push %edx -c0200d31: 50 push %eax -c0200d32: e8 43 fd ff ff call c0200a7a -c0200d37: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/main.c:120 (discriminator 3) -c0200d3a: 83 45 dc 01 addl $0x1,-0x24(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:120 (discriminator 1) -c0200d3e: 83 7d dc 07 cmpl $0x7,-0x24(%ebp) -c0200d42: 7e bf jle c0200d03 -/media/unix/Data/Code/2020301918-os/kern/main.c:123 (discriminator 2) -c0200d44: 8b 45 f4 mov -0xc(%ebp),%eax -c0200d47: c7 40 40 00 00 00 c0 movl $0xc0000000,0x40(%eax) -/media/unix/Data/Code/2020301918-os/kern/main.c:124 (discriminator 2) -c0200d4e: 8b 45 f4 mov -0xc(%ebp),%eax -c0200d51: 8b 40 40 mov 0x40(%eax),%eax -c0200d54: 8d 50 fc lea -0x4(%eax),%edx -c0200d57: 8b 45 f4 mov -0xc(%ebp),%eax -c0200d5a: 89 50 40 mov %edx,0x40(%eax) -/media/unix/Data/Code/2020301918-os/kern/main.c:125 (discriminator 2) -c0200d5d: 8b 45 cc mov -0x34(%ebp),%eax -c0200d60: 2d 00 f0 ff 3f sub $0x3ffff000,%eax -c0200d65: 89 45 c8 mov %eax,-0x38(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:126 (discriminator 2) -c0200d68: 83 6d c8 04 subl $0x4,-0x38(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:127 (discriminator 2) -c0200d6c: 8b 45 d4 mov -0x2c(%ebp),%eax -c0200d6f: 8b 50 18 mov 0x18(%eax),%edx -c0200d72: 8b 45 c8 mov -0x38(%ebp),%eax -c0200d75: 89 10 mov %edx,(%eax) -/media/unix/Data/Code/2020301918-os/kern/main.c:129 (discriminator 2) -c0200d77: 8b 45 f4 mov -0xc(%ebp),%eax -c0200d7a: c7 40 3c 02 12 00 00 movl $0x1202,0x3c(%eax) -/media/unix/Data/Code/2020301918-os/kern/main.c:141 (discriminator 2) -c0200d81: 8b 45 f4 mov -0xc(%ebp),%eax -c0200d84: 8d 90 f8 1f 00 00 lea 0x1ff8(%eax),%edx -c0200d8a: 8b 45 f4 mov -0xc(%ebp),%eax -c0200d8d: 89 50 68 mov %edx,0x68(%eax) -/media/unix/Data/Code/2020301918-os/kern/main.c:143 (discriminator 2) -c0200d90: 8b 45 f4 mov -0xc(%ebp),%eax -c0200d93: 8b 40 68 mov 0x68(%eax),%eax -c0200d96: ba 6e 00 20 c0 mov $0xc020006e,%edx -c0200d9b: 89 10 mov %edx,(%eax) -/media/unix/Data/Code/2020301918-os/kern/main.c:145 (discriminator 2) -c0200d9d: 8b 55 f4 mov -0xc(%ebp),%edx -c0200da0: 8b 45 f4 mov -0xc(%ebp),%eax -c0200da3: 8b 40 68 mov 0x68(%eax),%eax -c0200da6: 83 c0 04 add $0x4,%eax -c0200da9: 89 10 mov %edx,(%eax) -/media/unix/Data/Code/2020301918-os/kern/main.c:148 (discriminator 2) -c0200dab: 8b 55 f0 mov -0x10(%ebp),%edx -c0200dae: 8b 45 f4 mov -0xc(%ebp),%eax -c0200db1: 89 50 6c mov %edx,0x6c(%eax) -/media/unix/Data/Code/2020301918-os/kern/main.c:152 (discriminator 2) -c0200db4: 8b 45 f0 mov -0x10(%ebp),%eax -c0200db7: 8b 14 85 2c 74 20 c0 mov -0x3fdf8bd4(,%eax,4),%edx -c0200dbe: 8b 45 f4 mov -0xc(%ebp),%eax -c0200dc1: 89 50 78 mov %edx,0x78(%eax) -c0200dc4: 8b 45 f4 mov -0xc(%ebp),%eax -c0200dc7: 8b 50 78 mov 0x78(%eax),%edx -c0200dca: 8b 45 f4 mov -0xc(%ebp),%eax -c0200dcd: 89 50 74 mov %edx,0x74(%eax) -/media/unix/Data/Code/2020301918-os/kern/main.c:68 (discriminator 2) -c0200dd0: 83 45 f0 01 addl $0x1,-0x10(%ebp) -c0200dd4: 81 45 f4 00 20 00 00 addl $0x2000,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/main.c:68 (discriminator 1) -c0200ddb: 83 7d f0 01 cmpl $0x1,-0x10(%ebp) -c0200ddf: 0f 8e 3c fd ff ff jle c0200b21 -/media/unix/Data/Code/2020301918-os/kern/main.c:155 -c0200de5: c7 05 e4 9d 20 c0 00 movl $0xc0209e00,0xc0209de4 -c0200dec: 9e 20 c0 -/media/unix/Data/Code/2020301918-os/kern/main.c:157 -c0200def: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -c0200df4: 8b 40 70 mov 0x70(%eax),%eax -c0200df7: 83 ec 0c sub $0xc,%esp -c0200dfa: 50 push %eax -c0200dfb: e8 6a fb ff ff call c020096a -c0200e00: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/main.c:158 -c0200e03: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -c0200e08: 83 c0 48 add $0x48,%eax -c0200e0b: a3 24 ee 20 c0 mov %eax,0xc020ee24 -/media/unix/Data/Code/2020301918-os/kern/main.c:160 -c0200e10: c6 05 e0 9d 20 c0 01 movb $0x1,0xc0209de0 -/media/unix/Data/Code/2020301918-os/kern/main.c:164 -c0200e17: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -c0200e1c: 83 c0 48 add $0x48,%eax -c0200e1f: 83 ec 08 sub $0x8,%esp -c0200e22: 50 push %eax -c0200e23: 8d 45 90 lea -0x70(%ebp),%eax -c0200e26: 50 push %eax -c0200e27: e8 a4 f4 ff ff call c02002d0 -c0200e2c: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/main.c:165 -c0200e2f: 68 93 43 20 c0 push $0xc0204393 -c0200e34: 68 72 43 20 c0 push $0xc0204372 -c0200e39: 68 a5 00 00 00 push $0xa5 -c0200e3e: 68 87 43 20 c0 push $0xc0204387 -c0200e43: e8 71 03 00 00 call c02011b9 <_panic> - -c0200e48 : -map_kern(): -/media/unix/Data/Code/2020301918-os/kern/pmap.c:13 -c0200e48: 55 push %ebp -c0200e49: 89 e5 mov %esp,%ebp -c0200e4b: 83 ec 28 sub $0x28,%esp -/media/unix/Data/Code/2020301918-os/kern/pmap.c:16 -c0200e4e: 8b 45 08 mov 0x8(%ebp),%eax -c0200e51: 2d 00 00 00 40 sub $0x40000000,%eax -c0200e56: 89 45 f4 mov %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/pmap.c:18 -c0200e59: 81 45 f4 00 0c 00 00 addl $0xc00,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/pmap.c:20 -c0200e60: c7 45 f0 20 00 00 00 movl $0x20,-0x10(%ebp) -/media/unix/Data/Code/2020301918-os/kern/pmap.c:22 -c0200e67: c7 45 ec 00 00 00 00 movl $0x0,-0x14(%ebp) -/media/unix/Data/Code/2020301918-os/kern/pmap.c:23 -c0200e6e: eb 74 jmp c0200ee4 -/media/unix/Data/Code/2020301918-os/kern/pmap.c:25 -c0200e70: e8 b1 fa ff ff call c0200926 -c0200e75: 89 45 e0 mov %eax,-0x20(%ebp) -/media/unix/Data/Code/2020301918-os/kern/pmap.c:27 -c0200e78: 8b 45 e0 mov -0x20(%ebp),%eax -c0200e7b: 25 ff 0f 00 00 and $0xfff,%eax -c0200e80: 85 c0 test %eax,%eax -c0200e82: 74 16 je c0200e9a -/media/unix/Data/Code/2020301918-os/kern/pmap.c:27 (discriminator 1) -c0200e84: 68 95 43 20 c0 push $0xc0204395 -c0200e89: 68 a9 43 20 c0 push $0xc02043a9 -c0200e8e: 6a 1b push $0x1b -c0200e90: 68 be 43 20 c0 push $0xc02043be -c0200e95: e8 1f 03 00 00 call c02011b9 <_panic> -/media/unix/Data/Code/2020301918-os/kern/pmap.c:29 -c0200e9a: 8b 45 f4 mov -0xc(%ebp),%eax -c0200e9d: 8d 50 04 lea 0x4(%eax),%edx -c0200ea0: 89 55 f4 mov %edx,-0xc(%ebp) -c0200ea3: 8b 55 e0 mov -0x20(%ebp),%edx -c0200ea6: 83 ca 07 or $0x7,%edx -c0200ea9: 89 10 mov %edx,(%eax) -/media/unix/Data/Code/2020301918-os/kern/pmap.c:33 -c0200eab: 8b 45 e0 mov -0x20(%ebp),%eax -c0200eae: 2d 00 00 00 40 sub $0x40000000,%eax -c0200eb3: 89 45 e8 mov %eax,-0x18(%ebp) -/media/unix/Data/Code/2020301918-os/kern/pmap.c:35 -c0200eb6: c7 45 e4 00 04 00 00 movl $0x400,-0x1c(%ebp) -/media/unix/Data/Code/2020301918-os/kern/pmap.c:36 -c0200ebd: eb 18 jmp c0200ed7 -/media/unix/Data/Code/2020301918-os/kern/pmap.c:39 -c0200ebf: 8b 45 e8 mov -0x18(%ebp),%eax -c0200ec2: 8d 50 04 lea 0x4(%eax),%edx -c0200ec5: 89 55 e8 mov %edx,-0x18(%ebp) -c0200ec8: 8b 55 ec mov -0x14(%ebp),%edx -c0200ecb: 83 ca 03 or $0x3,%edx -c0200ece: 89 10 mov %edx,(%eax) -/media/unix/Data/Code/2020301918-os/kern/pmap.c:41 -c0200ed0: 81 45 ec 00 10 00 00 addl $0x1000,-0x14(%ebp) -/media/unix/Data/Code/2020301918-os/kern/pmap.c:36 -c0200ed7: 8b 45 e4 mov -0x1c(%ebp),%eax -c0200eda: 8d 50 ff lea -0x1(%eax),%edx -c0200edd: 89 55 e4 mov %edx,-0x1c(%ebp) -c0200ee0: 85 c0 test %eax,%eax -c0200ee2: 75 db jne c0200ebf -/media/unix/Data/Code/2020301918-os/kern/pmap.c:23 -c0200ee4: 8b 45 f0 mov -0x10(%ebp),%eax -c0200ee7: 8d 50 ff lea -0x1(%eax),%edx -c0200eea: 89 55 f0 mov %edx,-0x10(%ebp) -c0200eed: 85 c0 test %eax,%eax -c0200eef: 0f 85 7b ff ff ff jne c0200e70 -/media/unix/Data/Code/2020301918-os/kern/pmap.c:45 -c0200ef5: 81 7d ec 00 00 00 08 cmpl $0x8000000,-0x14(%ebp) -c0200efc: 74 16 je c0200f14 -/media/unix/Data/Code/2020301918-os/kern/pmap.c:45 (discriminator 1) -c0200efe: 68 ca 43 20 c0 push $0xc02043ca -c0200f03: 68 a9 43 20 c0 push $0xc02043a9 -c0200f08: 6a 2d push $0x2d -c0200f0a: 68 be 43 20 c0 push $0xc02043be -c0200f0f: e8 a5 02 00 00 call c02011b9 <_panic> -/media/unix/Data/Code/2020301918-os/kern/pmap.c:46 -c0200f14: 90 nop -c0200f15: c9 leave -c0200f16: c3 ret - -c0200f17 : -lcr3(): -/media/unix/Data/Code/2020301918-os/inc/x86.h:126 -c0200f17: 55 push %ebp -c0200f18: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/inc/x86.h:127 -c0200f1a: 8b 45 08 mov 0x8(%ebp),%eax -c0200f1d: 0f 22 d8 mov %eax,%cr3 -/media/unix/Data/Code/2020301918-os/inc/x86.h:128 -c0200f20: 90 nop -c0200f21: 5d pop %ebp -c0200f22: c3 ret - -c0200f23 : -read_eflags(): -/media/unix/Data/Code/2020301918-os/inc/x86.h:162 -c0200f23: 55 push %ebp -c0200f24: 89 e5 mov %esp,%ebp -c0200f26: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/inc/x86.h:164 -c0200f29: 9c pushf -c0200f2a: 58 pop %eax -c0200f2b: 89 45 fc mov %eax,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/inc/x86.h:165 -c0200f2e: 8b 45 fc mov -0x4(%ebp),%eax -/media/unix/Data/Code/2020301918-os/inc/x86.h:166 -c0200f31: c9 leave -c0200f32: c3 ret - -c0200f33 : -disable_int(): -/media/unix/Data/Code/2020301918-os/inc/kern/trap.h:73 -c0200f33: 55 push %ebp -c0200f34: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/inc/kern/trap.h:74 -c0200f36: fa cli -/media/unix/Data/Code/2020301918-os/inc/kern/trap.h:75 -c0200f37: 90 nop -c0200f38: 5d pop %ebp -c0200f39: c3 ret - -c0200f3a : -enable_int(): -/media/unix/Data/Code/2020301918-os/inc/kern/trap.h:79 -c0200f3a: 55 push %ebp -c0200f3b: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/inc/kern/trap.h:80 -c0200f3d: 0f b6 05 e0 9d 20 c0 movzbl 0xc0209de0,%eax -c0200f44: 84 c0 test %al,%al -c0200f46: 74 01 je c0200f49 -/media/unix/Data/Code/2020301918-os/inc/kern/trap.h:81 -c0200f48: fb sti -/media/unix/Data/Code/2020301918-os/inc/kern/trap.h:82 -c0200f49: 90 nop -c0200f4a: 5d pop %ebp -c0200f4b: c3 ret - -c0200f4c : -init_segment(): -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:107 -c0200f4c: 55 push %ebp -c0200f4d: 89 e5 mov %esp,%ebp -c0200f4f: 83 ec 04 sub $0x4,%esp -c0200f52: 8b 45 14 mov 0x14(%ebp),%eax -c0200f55: 66 89 45 fc mov %ax,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:108 -c0200f59: 8b 45 10 mov 0x10(%ebp),%eax -c0200f5c: 89 c2 mov %eax,%edx -c0200f5e: 8b 45 08 mov 0x8(%ebp),%eax -c0200f61: 66 89 10 mov %dx,(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:109 -c0200f64: 8b 45 0c mov 0xc(%ebp),%eax -c0200f67: 89 c2 mov %eax,%edx -c0200f69: 8b 45 08 mov 0x8(%ebp),%eax -c0200f6c: 66 89 50 02 mov %dx,0x2(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:110 -c0200f70: 8b 45 0c mov 0xc(%ebp),%eax -c0200f73: c1 e8 10 shr $0x10,%eax -c0200f76: 89 c2 mov %eax,%edx -c0200f78: 8b 45 08 mov 0x8(%ebp),%eax -c0200f7b: 88 50 04 mov %dl,0x4(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:111 -c0200f7e: 0f b7 45 fc movzwl -0x4(%ebp),%eax -c0200f82: 89 c2 mov %eax,%edx -c0200f84: 8b 45 08 mov 0x8(%ebp),%eax -c0200f87: 88 50 05 mov %dl,0x5(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:112 -c0200f8a: 8b 45 10 mov 0x10(%ebp),%eax -c0200f8d: c1 e8 10 shr $0x10,%eax -c0200f90: 83 e0 0f and $0xf,%eax -c0200f93: 89 c2 mov %eax,%edx -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:113 -c0200f95: 0f b7 45 fc movzwl -0x4(%ebp),%eax -c0200f99: 66 c1 e8 08 shr $0x8,%ax -c0200f9d: 83 e0 f0 and $0xfffffff0,%eax -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:112 -c0200fa0: 09 c2 or %eax,%edx -c0200fa2: 8b 45 08 mov 0x8(%ebp),%eax -c0200fa5: 88 50 06 mov %dl,0x6(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:114 -c0200fa8: 8b 45 0c mov 0xc(%ebp),%eax -c0200fab: c1 e8 18 shr $0x18,%eax -c0200fae: 89 c2 mov %eax,%edx -c0200fb0: 8b 45 08 mov 0x8(%ebp),%eax -c0200fb3: 88 50 07 mov %dl,0x7(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:115 -c0200fb6: 90 nop -c0200fb7: c9 leave -c0200fb8: c3 ret - -c0200fb9 : -init_gate(): -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:119 -c0200fb9: 55 push %ebp -c0200fba: 89 e5 mov %esp,%ebp -c0200fbc: 83 ec 08 sub $0x8,%esp -c0200fbf: 8b 55 0c mov 0xc(%ebp),%edx -c0200fc2: 8b 45 14 mov 0x14(%ebp),%eax -c0200fc5: 88 55 fc mov %dl,-0x4(%ebp) -c0200fc8: 88 45 f8 mov %al,-0x8(%ebp) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:120 -c0200fcb: 8b 45 10 mov 0x10(%ebp),%eax -c0200fce: 89 c2 mov %eax,%edx -c0200fd0: 8b 45 08 mov 0x8(%ebp),%eax -c0200fd3: 66 89 10 mov %dx,(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:121 -c0200fd6: 8b 45 08 mov 0x8(%ebp),%eax -c0200fd9: 66 c7 40 02 08 00 movw $0x8,0x2(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:122 -c0200fdf: 8b 45 08 mov 0x8(%ebp),%eax -c0200fe2: c6 40 04 00 movb $0x0,0x4(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:123 -c0200fe6: 0f b6 45 f8 movzbl -0x8(%ebp),%eax -c0200fea: c1 e0 05 shl $0x5,%eax -c0200fed: 89 c2 mov %eax,%edx -c0200fef: 0f b6 45 fc movzbl -0x4(%ebp),%eax -c0200ff3: 09 d0 or %edx,%eax -c0200ff5: 89 c2 mov %eax,%edx -c0200ff7: 8b 45 08 mov 0x8(%ebp),%eax -c0200ffa: 88 50 05 mov %dl,0x5(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:124 -c0200ffd: 8b 45 10 mov 0x10(%ebp),%eax -c0201000: c1 e8 10 shr $0x10,%eax -c0201003: 89 c2 mov %eax,%edx -c0201005: 8b 45 08 mov 0x8(%ebp),%eax -c0201008: 66 89 50 06 mov %dx,0x6(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:125 -c020100c: 90 nop -c020100d: c9 leave -c020100e: c3 ret - -c020100f : -to_kern_stack(): -/media/unix/Data/Code/2020301918-os/kern/process.c:24 -c020100f: 55 push %ebp -c0201010: 89 e5 mov %esp,%ebp -c0201012: 53 push %ebx -/media/unix/Data/Code/2020301918-os/kern/process.c:30 -c0201013: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -/media/unix/Data/Code/2020301918-os/kern/process.c:25 -c0201018: bb 00 20 00 00 mov $0x2000,%ebx -c020101d: 8b 55 08 mov 0x8(%ebp),%edx -c0201020: 89 d1 mov %edx,%ecx -c0201022: 01 d8 add %ebx,%eax -c0201024: 89 c4 mov %eax,%esp -c0201026: 51 push %ecx -c0201027: ff 65 04 jmp *0x4(%ebp) -/media/unix/Data/Code/2020301918-os/kern/process.c:34 -c020102a: 90 nop -c020102b: 8b 5d fc mov -0x4(%ebp),%ebx -c020102e: c9 leave -c020102f: c3 ret - -c0201030 : -schedule(): -/media/unix/Data/Code/2020301918-os/kern/process.c:41 -c0201030: 55 push %ebp -c0201031: 89 e5 mov %esp,%ebp -c0201033: 83 ec 18 sub $0x18,%esp -/media/unix/Data/Code/2020301918-os/kern/process.c:43 -c0201036: e8 e8 fe ff ff call c0200f23 -c020103b: 25 00 02 00 00 and $0x200,%eax -c0201040: 89 45 f0 mov %eax,-0x10(%ebp) -/media/unix/Data/Code/2020301918-os/kern/process.c:45 -c0201043: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c0201047: 74 05 je c020104e -/media/unix/Data/Code/2020301918-os/kern/process.c:46 -c0201049: e8 e5 fe ff ff call c0200f33 -/media/unix/Data/Code/2020301918-os/kern/process.c:48 -c020104e: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -c0201053: 89 45 ec mov %eax,-0x14(%ebp) -/media/unix/Data/Code/2020301918-os/kern/process.c:49 -c0201056: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -c020105b: 05 00 20 00 00 add $0x2000,%eax -c0201060: 89 45 f4 mov %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/process.c:50 -c0201063: b8 00 de 20 c0 mov $0xc020de00,%eax -c0201068: 39 45 f4 cmp %eax,-0xc(%ebp) -c020106b: 72 07 jb c0201074 -/media/unix/Data/Code/2020301918-os/kern/process.c:51 -c020106d: c7 45 f4 00 9e 20 c0 movl $0xc0209e00,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/process.c:54 -c0201074: 8b 45 f4 mov -0xc(%ebp),%eax -c0201077: a3 e4 9d 20 c0 mov %eax,0xc0209de4 -/media/unix/Data/Code/2020301918-os/kern/process.c:56 -c020107c: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -c0201081: 8b 40 70 mov 0x70(%eax),%eax -c0201084: 50 push %eax -c0201085: e8 8d fe ff ff call c0200f17 -c020108a: 83 c4 04 add $0x4,%esp -/media/unix/Data/Code/2020301918-os/kern/process.c:57 -c020108d: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -c0201092: 83 c0 48 add $0x48,%eax -c0201095: a3 24 ee 20 c0 mov %eax,0xc020ee24 -/media/unix/Data/Code/2020301918-os/kern/process.c:69 -c020109a: 8b 45 f4 mov -0xc(%ebp),%eax -c020109d: 8d 50 48 lea 0x48(%eax),%edx -c02010a0: 8b 45 ec mov -0x14(%ebp),%eax -c02010a3: 83 c0 48 add $0x48,%eax -c02010a6: 83 ec 08 sub $0x8,%esp -c02010a9: 52 push %edx -c02010aa: 50 push %eax -c02010ab: e8 20 f2 ff ff call c02002d0 -c02010b0: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/process.c:90 -c02010b3: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c02010b7: 74 05 je c02010be -/media/unix/Data/Code/2020301918-os/kern/process.c:91 -c02010b9: e8 7c fe ff ff call c0200f3a -/media/unix/Data/Code/2020301918-os/kern/process.c:92 -c02010be: 90 nop -c02010bf: c9 leave -c02010c0: c3 ret - -c02010c1 : -kern_get_pid(): -/media/unix/Data/Code/2020301918-os/kern/process.c:96 -c02010c1: 55 push %ebp -c02010c2: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/kern/process.c:97 -c02010c4: 8b 45 08 mov 0x8(%ebp),%eax -c02010c7: 8b 40 6c mov 0x6c(%eax),%eax -/media/unix/Data/Code/2020301918-os/kern/process.c:98 -c02010ca: 5d pop %ebp -c02010cb: c3 ret - -c02010cc : -do_get_pid(): -/media/unix/Data/Code/2020301918-os/kern/process.c:102 -c02010cc: 55 push %ebp -c02010cd: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/kern/process.c:103 -c02010cf: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -c02010d4: 50 push %eax -c02010d5: e8 e7 ff ff ff call c02010c1 -c02010da: 83 c4 04 add $0x4,%esp -/media/unix/Data/Code/2020301918-os/kern/process.c:104 -c02010dd: c9 leave -c02010de: c3 ret - -c02010df : -outb(): -/media/unix/Data/Code/2020301918-os/inc/x86.h:59 -c02010df: 55 push %ebp -c02010e0: 89 e5 mov %esp,%ebp -c02010e2: 83 ec 04 sub $0x4,%esp -c02010e5: 8b 45 0c mov 0xc(%ebp),%eax -c02010e8: 88 45 fc mov %al,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/inc/x86.h:60 -c02010eb: 0f b6 45 fc movzbl -0x4(%ebp),%eax -c02010ef: 8b 55 08 mov 0x8(%ebp),%edx -c02010f2: ee out %al,(%dx) -/media/unix/Data/Code/2020301918-os/inc/x86.h:61 -c02010f3: 90 nop -c02010f4: c9 leave -c02010f5: c3 ret - -c02010f6 : -init_segment(): -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:107 -c02010f6: 55 push %ebp -c02010f7: 89 e5 mov %esp,%ebp -c02010f9: 83 ec 04 sub $0x4,%esp -c02010fc: 8b 45 14 mov 0x14(%ebp),%eax -c02010ff: 66 89 45 fc mov %ax,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:108 -c0201103: 8b 45 10 mov 0x10(%ebp),%eax -c0201106: 89 c2 mov %eax,%edx -c0201108: 8b 45 08 mov 0x8(%ebp),%eax -c020110b: 66 89 10 mov %dx,(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:109 -c020110e: 8b 45 0c mov 0xc(%ebp),%eax -c0201111: 89 c2 mov %eax,%edx -c0201113: 8b 45 08 mov 0x8(%ebp),%eax -c0201116: 66 89 50 02 mov %dx,0x2(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:110 -c020111a: 8b 45 0c mov 0xc(%ebp),%eax -c020111d: c1 e8 10 shr $0x10,%eax -c0201120: 89 c2 mov %eax,%edx -c0201122: 8b 45 08 mov 0x8(%ebp),%eax -c0201125: 88 50 04 mov %dl,0x4(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:111 -c0201128: 0f b7 45 fc movzwl -0x4(%ebp),%eax -c020112c: 89 c2 mov %eax,%edx -c020112e: 8b 45 08 mov 0x8(%ebp),%eax -c0201131: 88 50 05 mov %dl,0x5(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:112 -c0201134: 8b 45 10 mov 0x10(%ebp),%eax -c0201137: c1 e8 10 shr $0x10,%eax -c020113a: 83 e0 0f and $0xf,%eax -c020113d: 89 c2 mov %eax,%edx -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:113 -c020113f: 0f b7 45 fc movzwl -0x4(%ebp),%eax -c0201143: 66 c1 e8 08 shr $0x8,%ax -c0201147: 83 e0 f0 and $0xfffffff0,%eax -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:112 -c020114a: 09 c2 or %eax,%edx -c020114c: 8b 45 08 mov 0x8(%ebp),%eax -c020114f: 88 50 06 mov %dl,0x6(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:114 -c0201152: 8b 45 0c mov 0xc(%ebp),%eax -c0201155: c1 e8 18 shr $0x18,%eax -c0201158: 89 c2 mov %eax,%edx -c020115a: 8b 45 08 mov 0x8(%ebp),%eax -c020115d: 88 50 07 mov %dl,0x7(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:115 -c0201160: 90 nop -c0201161: c9 leave -c0201162: c3 ret - -c0201163 : -init_gate(): -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:119 -c0201163: 55 push %ebp -c0201164: 89 e5 mov %esp,%ebp -c0201166: 83 ec 08 sub $0x8,%esp -c0201169: 8b 55 0c mov 0xc(%ebp),%edx -c020116c: 8b 45 14 mov 0x14(%ebp),%eax -c020116f: 88 55 fc mov %dl,-0x4(%ebp) -c0201172: 88 45 f8 mov %al,-0x8(%ebp) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:120 -c0201175: 8b 45 10 mov 0x10(%ebp),%eax -c0201178: 89 c2 mov %eax,%edx -c020117a: 8b 45 08 mov 0x8(%ebp),%eax -c020117d: 66 89 10 mov %dx,(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:121 -c0201180: 8b 45 08 mov 0x8(%ebp),%eax -c0201183: 66 c7 40 02 08 00 movw $0x8,0x2(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:122 -c0201189: 8b 45 08 mov 0x8(%ebp),%eax -c020118c: c6 40 04 00 movb $0x0,0x4(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:123 -c0201190: 0f b6 45 f8 movzbl -0x8(%ebp),%eax -c0201194: c1 e0 05 shl $0x5,%eax -c0201197: 89 c2 mov %eax,%edx -c0201199: 0f b6 45 fc movzbl -0x4(%ebp),%eax -c020119d: 09 d0 or %edx,%eax -c020119f: 89 c2 mov %eax,%edx -c02011a1: 8b 45 08 mov 0x8(%ebp),%eax -c02011a4: 88 50 05 mov %dl,0x5(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:124 -c02011a7: 8b 45 10 mov 0x10(%ebp),%eax -c02011aa: c1 e8 10 shr $0x10,%eax -c02011ad: 89 c2 mov %eax,%edx -c02011af: 8b 45 08 mov 0x8(%ebp),%eax -c02011b2: 66 89 50 06 mov %dx,0x6(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:125 -c02011b6: 90 nop -c02011b7: c9 leave -c02011b8: c3 ret - -c02011b9 <_panic>: -_panic(): -/media/unix/Data/Code/2020301918-os/kern/start.c:21 -c02011b9: 55 push %ebp -c02011ba: 89 e5 mov %esp,%ebp -c02011bc: 83 ec 18 sub $0x18,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:25 -c02011bf: fa cli -/media/unix/Data/Code/2020301918-os/kern/start.c:26 -c02011c0: fc cld -/media/unix/Data/Code/2020301918-os/kern/start.c:28 -c02011c1: 8d 45 14 lea 0x14(%ebp),%eax -c02011c4: 89 45 f4 mov %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/start.c:29 -c02011c7: 83 ec 04 sub $0x4,%esp -c02011ca: ff 75 0c push 0xc(%ebp) -c02011cd: ff 75 08 push 0x8(%ebp) -c02011d0: 68 e0 43 20 c0 push $0xc02043e0 -c02011d5: e8 fd 18 00 00 call c0202ad7 -c02011da: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:30 -c02011dd: 8b 45 f4 mov -0xc(%ebp),%eax -c02011e0: 83 ec 08 sub $0x8,%esp -c02011e3: 50 push %eax -c02011e4: ff 75 10 push 0x10(%ebp) -c02011e7: e8 8f 18 00 00 call c0202a7b -c02011ec: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:31 -c02011ef: 83 ec 0c sub $0xc,%esp -c02011f2: 68 01 44 20 c0 push $0xc0204401 -c02011f7: e8 db 18 00 00 call c0202ad7 -c02011fc: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:35 (discriminator 1) -c02011ff: f4 hlt -c0201200: eb fd jmp c02011ff <_panic+0x46> - -c0201202 <_warn>: -_warn(): -/media/unix/Data/Code/2020301918-os/kern/start.c:43 -c0201202: 55 push %ebp -c0201203: 89 e5 mov %esp,%ebp -c0201205: 83 ec 18 sub $0x18,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:46 -c0201208: 8d 45 14 lea 0x14(%ebp),%eax -c020120b: 89 45 f4 mov %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/start.c:47 -c020120e: 83 ec 04 sub $0x4,%esp -c0201211: ff 75 0c push 0xc(%ebp) -c0201214: ff 75 08 push 0x8(%ebp) -c0201217: 68 08 44 20 c0 push $0xc0204408 -c020121c: e8 b6 18 00 00 call c0202ad7 -c0201221: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:48 -c0201224: 8b 45 f4 mov -0xc(%ebp),%eax -c0201227: 83 ec 08 sub $0x8,%esp -c020122a: 50 push %eax -c020122b: ff 75 10 push 0x10(%ebp) -c020122e: e8 48 18 00 00 call c0202a7b -c0201233: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:49 -c0201236: 83 ec 0c sub $0xc,%esp -c0201239: 68 01 44 20 c0 push $0xc0204401 -c020123e: e8 94 18 00 00 call c0202ad7 -c0201243: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:51 -c0201246: 90 nop -c0201247: c9 leave -c0201248: c3 ret - -c0201249 : -init_gdt(): -/media/unix/Data/Code/2020301918-os/kern/start.c:59 -c0201249: 55 push %ebp -c020124a: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/kern/start.c:60 -c020124c: 6a 00 push $0x0 -c020124e: 6a 00 push $0x0 -c0201250: 6a 00 push $0x0 -c0201252: 68 20 de 20 c0 push $0xc020de20 -c0201257: e8 9a fe ff ff call c02010f6 -c020125c: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:62 -c020125f: 68 9a c0 00 00 push $0xc09a -c0201264: 68 ff ff 0f 00 push $0xfffff -c0201269: 6a 00 push $0x0 -c020126b: 68 28 de 20 c0 push $0xc020de28 -c0201270: e8 81 fe ff ff call c02010f6 -c0201275: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:64 -c0201278: 68 92 c0 00 00 push $0xc092 -c020127d: 68 ff ff 0f 00 push $0xfffff -c0201282: 6a 00 push $0x0 -c0201284: 68 30 de 20 c0 push $0xc020de30 -c0201289: e8 68 fe ff ff call c02010f6 -c020128e: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:66 -c0201291: 68 f2 c0 00 00 push $0xc0f2 -c0201296: 6a 08 push $0x8 -c0201298: 68 00 80 0b c0 push $0xc00b8000 -c020129d: 68 38 de 20 c0 push $0xc020de38 -c02012a2: e8 4f fe ff ff call c02010f6 -c02012a7: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:68 -c02012aa: c7 05 28 ee 20 c0 10 movl $0x10,0xc020ee28 -c02012b1: 00 00 00 -/media/unix/Data/Code/2020301918-os/kern/start.c:69 -c02012b4: 66 c7 05 86 ee 20 c0 movw $0x68,0xc020ee86 -c02012bb: 68 00 -/media/unix/Data/Code/2020301918-os/kern/start.c:71 -c02012bd: b8 20 ee 20 c0 mov $0xc020ee20,%eax -c02012c2: 68 89 00 00 00 push $0x89 -c02012c7: 6a 67 push $0x67 -c02012c9: 50 push %eax -c02012ca: 68 40 de 20 c0 push $0xc020de40 -c02012cf: e8 22 fe ff ff call c02010f6 -c02012d4: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:73 -c02012d7: b8 20 e2 20 c0 mov $0xc020e220,%eax -c02012dc: 68 82 00 00 00 push $0x82 -c02012e1: 68 ff 03 00 00 push $0x3ff -c02012e6: 50 push %eax -c02012e7: 68 48 de 20 c0 push $0xc020de48 -c02012ec: e8 05 fe ff ff call c02010f6 -c02012f1: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:75 -c02012f4: b8 20 de 20 c0 mov $0xc020de20,%eax -c02012f9: a3 02 de 20 c0 mov %eax,0xc020de02 -/media/unix/Data/Code/2020301918-os/kern/start.c:76 -c02012fe: 66 c7 05 00 de 20 c0 movw $0x3ff,0xc020de00 -c0201305: ff 03 -/media/unix/Data/Code/2020301918-os/kern/start.c:77 -c0201307: 90 nop -c0201308: c9 leave -c0201309: c3 ret - -c020130a : -init_ldt(): -/media/unix/Data/Code/2020301918-os/kern/start.c:84 -c020130a: 55 push %ebp -c020130b: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/kern/start.c:85 -c020130d: 6a 00 push $0x0 -c020130f: 6a 00 push $0x0 -c0201311: 6a 00 push $0x0 -c0201313: 68 20 e2 20 c0 push $0xc020e220 -c0201318: e8 d9 fd ff ff call c02010f6 -c020131d: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:87 -c0201320: 68 fa c0 00 00 push $0xc0fa -c0201325: 68 ff ff 0f 00 push $0xfffff -c020132a: 6a 00 push $0x0 -c020132c: 68 28 e2 20 c0 push $0xc020e228 -c0201331: e8 c0 fd ff ff call c02010f6 -c0201336: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:90 -c0201339: 68 f2 c0 00 00 push $0xc0f2 -c020133e: 68 ff ff 0f 00 push $0xfffff -c0201343: 6a 00 push $0x0 -c0201345: 68 30 e2 20 c0 push $0xc020e230 -c020134a: e8 a7 fd ff ff call c02010f6 -c020134f: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:93 -c0201352: 90 nop -c0201353: c9 leave -c0201354: c3 ret - -c0201355 : -init_idt(): -/media/unix/Data/Code/2020301918-os/kern/start.c:100 -c0201355: 55 push %ebp -c0201356: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/kern/start.c:102 -c0201358: 6a 00 push $0x0 -c020135a: 68 71 02 20 c0 push $0xc0200271 -c020135f: 68 8e 00 00 00 push $0x8e -c0201364: 68 20 e6 20 c0 push $0xc020e620 -c0201369: e8 f5 fd ff ff call c0201163 -c020136e: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:104 -c0201371: b8 28 e6 20 c0 mov $0xc020e628,%eax -c0201376: 6a 00 push $0x0 -c0201378: 68 77 02 20 c0 push $0xc0200277 -c020137d: 68 8e 00 00 00 push $0x8e -c0201382: 50 push %eax -c0201383: e8 db fd ff ff call c0201163 -c0201388: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:106 -c020138b: b8 30 e6 20 c0 mov $0xc020e630,%eax -c0201390: 6a 00 push $0x0 -c0201392: 68 7d 02 20 c0 push $0xc020027d -c0201397: 68 8e 00 00 00 push $0x8e -c020139c: 50 push %eax -c020139d: e8 c1 fd ff ff call c0201163 -c02013a2: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:108 -c02013a5: b8 38 e6 20 c0 mov $0xc020e638,%eax -c02013aa: 6a 03 push $0x3 -c02013ac: 68 83 02 20 c0 push $0xc0200283 -c02013b1: 68 8e 00 00 00 push $0x8e -c02013b6: 50 push %eax -c02013b7: e8 a7 fd ff ff call c0201163 -c02013bc: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:110 -c02013bf: b8 40 e6 20 c0 mov $0xc020e640,%eax -c02013c4: 6a 03 push $0x3 -c02013c6: 68 89 02 20 c0 push $0xc0200289 -c02013cb: 68 8e 00 00 00 push $0x8e -c02013d0: 50 push %eax -c02013d1: e8 8d fd ff ff call c0201163 -c02013d6: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:112 -c02013d9: b8 48 e6 20 c0 mov $0xc020e648,%eax -c02013de: 6a 00 push $0x0 -c02013e0: 68 8f 02 20 c0 push $0xc020028f -c02013e5: 68 8e 00 00 00 push $0x8e -c02013ea: 50 push %eax -c02013eb: e8 73 fd ff ff call c0201163 -c02013f0: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:114 -c02013f3: b8 50 e6 20 c0 mov $0xc020e650,%eax -c02013f8: 6a 00 push $0x0 -c02013fa: 68 95 02 20 c0 push $0xc0200295 -c02013ff: 68 8e 00 00 00 push $0x8e -c0201404: 50 push %eax -c0201405: e8 59 fd ff ff call c0201163 -c020140a: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:116 -c020140d: b8 58 e6 20 c0 mov $0xc020e658,%eax -c0201412: 6a 00 push $0x0 -c0201414: 68 9b 02 20 c0 push $0xc020029b -c0201419: 68 8e 00 00 00 push $0x8e -c020141e: 50 push %eax -c020141f: e8 3f fd ff ff call c0201163 -c0201424: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:118 -c0201427: b8 60 e6 20 c0 mov $0xc020e660,%eax -c020142c: 6a 00 push $0x0 -c020142e: 68 a1 02 20 c0 push $0xc02002a1 -c0201433: 68 8e 00 00 00 push $0x8e -c0201438: 50 push %eax -c0201439: e8 25 fd ff ff call c0201163 -c020143e: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:120 -c0201441: b8 68 e6 20 c0 mov $0xc020e668,%eax -c0201446: 6a 00 push $0x0 -c0201448: 68 a5 02 20 c0 push $0xc02002a5 -c020144d: 68 8e 00 00 00 push $0x8e -c0201452: 50 push %eax -c0201453: e8 0b fd ff ff call c0201163 -c0201458: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:122 -c020145b: b8 70 e6 20 c0 mov $0xc020e670,%eax -c0201460: 6a 00 push $0x0 -c0201462: 68 ab 02 20 c0 push $0xc02002ab -c0201467: 68 8e 00 00 00 push $0x8e -c020146c: 50 push %eax -c020146d: e8 f1 fc ff ff call c0201163 -c0201472: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:124 -c0201475: b8 78 e6 20 c0 mov $0xc020e678,%eax -c020147a: 6a 00 push $0x0 -c020147c: 68 af 02 20 c0 push $0xc02002af -c0201481: 68 8e 00 00 00 push $0x8e -c0201486: 50 push %eax -c0201487: e8 d7 fc ff ff call c0201163 -c020148c: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:126 -c020148f: b8 80 e6 20 c0 mov $0xc020e680,%eax -c0201494: 6a 00 push $0x0 -c0201496: 68 b3 02 20 c0 push $0xc02002b3 -c020149b: 68 8e 00 00 00 push $0x8e -c02014a0: 50 push %eax -c02014a1: e8 bd fc ff ff call c0201163 -c02014a6: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:128 -c02014a9: b8 88 e6 20 c0 mov $0xc020e688,%eax -c02014ae: 6a 00 push $0x0 -c02014b0: 68 b7 02 20 c0 push $0xc02002b7 -c02014b5: 68 8e 00 00 00 push $0x8e -c02014ba: 50 push %eax -c02014bb: e8 a3 fc ff ff call c0201163 -c02014c0: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:130 -c02014c3: b8 90 e6 20 c0 mov $0xc020e690,%eax -c02014c8: 6a 00 push $0x0 -c02014ca: 68 bb 02 20 c0 push $0xc02002bb -c02014cf: 68 8e 00 00 00 push $0x8e -c02014d4: 50 push %eax -c02014d5: e8 89 fc ff ff call c0201163 -c02014da: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:132 -c02014dd: b8 a0 e6 20 c0 mov $0xc020e6a0,%eax -c02014e2: 6a 00 push $0x0 -c02014e4: 68 bf 02 20 c0 push $0xc02002bf -c02014e9: 68 8e 00 00 00 push $0x8e -c02014ee: 50 push %eax -c02014ef: e8 6f fc ff ff call c0201163 -c02014f4: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:135 -c02014f7: b8 20 e7 20 c0 mov $0xc020e720,%eax -c02014fc: 6a 00 push $0x0 -c02014fe: 68 90 00 20 c0 push $0xc0200090 -c0201503: 68 8e 00 00 00 push $0x8e -c0201508: 50 push %eax -c0201509: e8 55 fc ff ff call c0201163 -c020150e: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:137 -c0201511: b8 28 e7 20 c0 mov $0xc020e728,%eax -c0201516: 6a 00 push $0x0 -c0201518: 68 b0 00 20 c0 push $0xc02000b0 -c020151d: 68 8e 00 00 00 push $0x8e -c0201522: 50 push %eax -c0201523: e8 3b fc ff ff call c0201163 -c0201528: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:139 -c020152b: b8 30 e7 20 c0 mov $0xc020e730,%eax -c0201530: 6a 00 push $0x0 -c0201532: 68 e0 00 20 c0 push $0xc02000e0 -c0201537: 68 8e 00 00 00 push $0x8e -c020153c: 50 push %eax -c020153d: e8 21 fc ff ff call c0201163 -c0201542: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:141 -c0201545: b8 38 e7 20 c0 mov $0xc020e738,%eax -c020154a: 6a 00 push $0x0 -c020154c: 68 10 01 20 c0 push $0xc0200110 -c0201551: 68 8e 00 00 00 push $0x8e -c0201556: 50 push %eax -c0201557: e8 07 fc ff ff call c0201163 -c020155c: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:143 -c020155f: b8 40 e7 20 c0 mov $0xc020e740,%eax -c0201564: 6a 00 push $0x0 -c0201566: 68 40 01 20 c0 push $0xc0200140 -c020156b: 68 8e 00 00 00 push $0x8e -c0201570: 50 push %eax -c0201571: e8 ed fb ff ff call c0201163 -c0201576: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:145 -c0201579: b8 48 e7 20 c0 mov $0xc020e748,%eax -c020157e: 6a 00 push $0x0 -c0201580: 68 70 01 20 c0 push $0xc0200170 -c0201585: 68 8e 00 00 00 push $0x8e -c020158a: 50 push %eax -c020158b: e8 d3 fb ff ff call c0201163 -c0201590: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:147 -c0201593: b8 50 e7 20 c0 mov $0xc020e750,%eax -c0201598: 6a 00 push $0x0 -c020159a: 68 a0 01 20 c0 push $0xc02001a0 -c020159f: 68 8e 00 00 00 push $0x8e -c02015a4: 50 push %eax -c02015a5: e8 b9 fb ff ff call c0201163 -c02015aa: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:149 -c02015ad: b8 58 e7 20 c0 mov $0xc020e758,%eax -c02015b2: 6a 00 push $0x0 -c02015b4: 68 d0 01 20 c0 push $0xc02001d0 -c02015b9: 68 8e 00 00 00 push $0x8e -c02015be: 50 push %eax -c02015bf: e8 9f fb ff ff call c0201163 -c02015c4: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:151 -c02015c7: b8 60 e7 20 c0 mov $0xc020e760,%eax -c02015cc: 6a 00 push $0x0 -c02015ce: 68 00 02 20 c0 push $0xc0200200 -c02015d3: 68 8e 00 00 00 push $0x8e -c02015d8: 50 push %eax -c02015d9: e8 85 fb ff ff call c0201163 -c02015de: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:153 -c02015e1: b8 68 e7 20 c0 mov $0xc020e768,%eax -c02015e6: 6a 00 push $0x0 -c02015e8: 68 10 02 20 c0 push $0xc0200210 -c02015ed: 68 8e 00 00 00 push $0x8e -c02015f2: 50 push %eax -c02015f3: e8 6b fb ff ff call c0201163 -c02015f8: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:155 -c02015fb: b8 70 e7 20 c0 mov $0xc020e770,%eax -c0201600: 6a 00 push $0x0 -c0201602: 68 20 02 20 c0 push $0xc0200220 -c0201607: 68 8e 00 00 00 push $0x8e -c020160c: 50 push %eax -c020160d: e8 51 fb ff ff call c0201163 -c0201612: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:157 -c0201615: b8 78 e7 20 c0 mov $0xc020e778,%eax -c020161a: 6a 00 push $0x0 -c020161c: 68 30 02 20 c0 push $0xc0200230 -c0201621: 68 8e 00 00 00 push $0x8e -c0201626: 50 push %eax -c0201627: e8 37 fb ff ff call c0201163 -c020162c: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:159 -c020162f: b8 80 e7 20 c0 mov $0xc020e780,%eax -c0201634: 6a 00 push $0x0 -c0201636: 68 40 02 20 c0 push $0xc0200240 -c020163b: 68 8e 00 00 00 push $0x8e -c0201640: 50 push %eax -c0201641: e8 1d fb ff ff call c0201163 -c0201646: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:161 -c0201649: b8 88 e7 20 c0 mov $0xc020e788,%eax -c020164e: 6a 00 push $0x0 -c0201650: 68 50 02 20 c0 push $0xc0200250 -c0201655: 68 8e 00 00 00 push $0x8e -c020165a: 50 push %eax -c020165b: e8 03 fb ff ff call c0201163 -c0201660: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:163 -c0201663: b8 90 e7 20 c0 mov $0xc020e790,%eax -c0201668: 6a 00 push $0x0 -c020166a: 68 60 02 20 c0 push $0xc0200260 -c020166f: 68 8e 00 00 00 push $0x8e -c0201674: 50 push %eax -c0201675: e8 e9 fa ff ff call c0201163 -c020167a: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:165 -c020167d: b8 98 e7 20 c0 mov $0xc020e798,%eax -c0201682: 6a 00 push $0x0 -c0201684: 68 70 02 20 c0 push $0xc0200270 -c0201689: 68 8e 00 00 00 push $0x8e -c020168e: 50 push %eax -c020168f: e8 cf fa ff ff call c0201163 -c0201694: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:168 -c0201697: b8 20 ea 20 c0 mov $0xc020ea20,%eax -c020169c: 6a 03 push $0x3 -c020169e: 68 7a 00 20 c0 push $0xc020007a -c02016a3: 68 8e 00 00 00 push $0x8e -c02016a8: 50 push %eax -c02016a9: e8 b5 fa ff ff call c0201163 -c02016ae: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:171 -c02016b1: b8 20 e6 20 c0 mov $0xc020e620,%eax -c02016b6: a3 0a de 20 c0 mov %eax,0xc020de0a -/media/unix/Data/Code/2020301918-os/kern/start.c:172 -c02016bb: 66 c7 05 08 de 20 c0 movw $0x7ff,0xc020de08 -c02016c2: ff 07 -/media/unix/Data/Code/2020301918-os/kern/start.c:173 -c02016c4: 90 nop -c02016c5: c9 leave -c02016c6: c3 ret - -c02016c7 : -init_8259A(): -/media/unix/Data/Code/2020301918-os/kern/start.c:180 -c02016c7: 55 push %ebp -c02016c8: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/kern/start.c:181 -c02016ca: 6a 11 push $0x11 -c02016cc: 6a 20 push $0x20 -c02016ce: e8 0c fa ff ff call c02010df -c02016d3: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:182 -c02016d6: 6a 11 push $0x11 -c02016d8: 68 a0 00 00 00 push $0xa0 -c02016dd: e8 fd f9 ff ff call c02010df -c02016e2: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:185 -c02016e5: 6a 20 push $0x20 -c02016e7: 6a 21 push $0x21 -c02016e9: e8 f1 f9 ff ff call c02010df -c02016ee: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:187 -c02016f1: 6a 28 push $0x28 -c02016f3: 68 a1 00 00 00 push $0xa1 -c02016f8: e8 e2 f9 ff ff call c02010df -c02016fd: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:189 -c0201700: 6a 04 push $0x4 -c0201702: 6a 21 push $0x21 -c0201704: e8 d6 f9 ff ff call c02010df -c0201709: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:191 -c020170c: 6a 02 push $0x2 -c020170e: 68 a1 00 00 00 push $0xa1 -c0201713: e8 c7 f9 ff ff call c02010df -c0201718: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:193 -c020171b: 6a 01 push $0x1 -c020171d: 6a 21 push $0x21 -c020171f: e8 bb f9 ff ff call c02010df -c0201724: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:194 -c0201727: 6a 01 push $0x1 -c0201729: 68 a1 00 00 00 push $0xa1 -c020172e: e8 ac f9 ff ff call c02010df -c0201733: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:196 -c0201736: 68 ff 00 00 00 push $0xff -c020173b: 6a 21 push $0x21 -c020173d: e8 9d f9 ff ff call c02010df -c0201742: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:197 -c0201745: 68 ff 00 00 00 push $0xff -c020174a: 68 a1 00 00 00 push $0xa1 -c020174f: e8 8b f9 ff ff call c02010df -c0201754: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:198 -c0201757: 90 nop -c0201758: c9 leave -c0201759: c3 ret - -c020175a : -init_irq(): -/media/unix/Data/Code/2020301918-os/kern/start.c:202 -c020175a: 55 push %ebp -c020175b: 89 e5 mov %esp,%ebp -c020175d: 83 ec 08 sub $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:204 -c0201760: 83 ec 0c sub $0xc,%esp -c0201763: 6a 00 push $0x0 -c0201765: e8 0d 03 00 00 call c0201a77 -c020176a: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:206 -c020176d: 83 ec 08 sub $0x8,%esp -c0201770: 6a 34 push $0x34 -c0201772: 6a 43 push $0x43 -c0201774: e8 66 f9 ff ff call c02010df -c0201779: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:207 -c020177c: 83 ec 08 sub $0x8,%esp -c020177f: 68 a9 00 00 00 push $0xa9 -c0201784: 6a 40 push $0x40 -c0201786: e8 54 f9 ff ff call c02010df -c020178b: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:208 -c020178e: 83 ec 08 sub $0x8,%esp -c0201791: 6a 04 push $0x4 -c0201793: 6a 40 push $0x40 -c0201795: e8 45 f9 ff ff call c02010df -c020179a: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:210 -c020179d: 83 ec 0c sub $0xc,%esp -c02017a0: 6a 01 push $0x1 -c02017a2: e8 d0 02 00 00 call c0201a77 -c02017a7: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:211 -c02017aa: 90 nop -c02017ab: c9 leave -c02017ac: c3 ret - -c02017ad : -cstart(): -/media/unix/Data/Code/2020301918-os/kern/start.c:217 -c02017ad: 55 push %ebp -c02017ae: 89 e5 mov %esp,%ebp -c02017b0: 83 ec 08 sub $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:224 -c02017b3: 83 ec 0c sub $0xc,%esp -c02017b6: 68 2b 44 20 c0 push $0xc020442b -c02017bb: e8 17 13 00 00 call c0202ad7 -c02017c0: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:226 -c02017c3: 83 ec 0c sub $0xc,%esp -c02017c6: 68 33 44 20 c0 push $0xc0204433 -c02017cb: e8 07 13 00 00 call c0202ad7 -c02017d0: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:227 -c02017d3: e8 71 fa ff ff call c0201249 -/media/unix/Data/Code/2020301918-os/kern/start.c:228 -c02017d8: 83 ec 0c sub $0xc,%esp -c02017db: 68 43 44 20 c0 push $0xc0204443 -c02017e0: e8 f2 12 00 00 call c0202ad7 -c02017e5: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:229 -c02017e8: e8 1d fb ff ff call c020130a -/media/unix/Data/Code/2020301918-os/kern/start.c:230 -c02017ed: 83 ec 0c sub $0xc,%esp -c02017f0: 68 48 44 20 c0 push $0xc0204448 -c02017f5: e8 dd 12 00 00 call c0202ad7 -c02017fa: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:231 -c02017fd: e8 c5 fe ff ff call c02016c7 -/media/unix/Data/Code/2020301918-os/kern/start.c:232 -c0201802: 83 ec 0c sub $0xc,%esp -c0201805: 68 4f 44 20 c0 push $0xc020444f -c020180a: e8 c8 12 00 00 call c0202ad7 -c020180f: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:233 -c0201812: e8 3e fb ff ff call c0201355 -/media/unix/Data/Code/2020301918-os/kern/start.c:234 -c0201817: 83 ec 0c sub $0xc,%esp -c020181a: 68 54 44 20 c0 push $0xc0204454 -c020181f: e8 b3 12 00 00 call c0202ad7 -c0201824: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:235 -c0201827: e8 2e ff ff ff call c020175a -/media/unix/Data/Code/2020301918-os/kern/start.c:236 -c020182c: 83 ec 0c sub $0xc,%esp -c020182f: 68 58 44 20 c0 push $0xc0204458 -c0201834: e8 9e 12 00 00 call c0202ad7 -c0201839: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/start.c:237 -c020183c: 90 nop -c020183d: c9 leave -c020183e: c3 ret - -c020183f : -get_arg(): -/media/unix/Data/Code/2020301918-os/kern/syscall.c:28 -c020183f: 55 push %ebp -c0201840: 89 e5 mov %esp,%ebp -c0201842: 83 ec 08 sub $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/syscall.c:29 -c0201845: 83 7d 08 05 cmpl $0x5,0x8(%ebp) -c0201849: 77 4b ja c0201896 -c020184b: 8b 45 08 mov 0x8(%ebp),%eax -c020184e: c1 e0 02 shl $0x2,%eax -c0201851: 05 88 44 20 c0 add $0xc0204488,%eax -c0201856: 8b 00 mov (%eax),%eax -c0201858: ff e0 jmp *%eax -/media/unix/Data/Code/2020301918-os/kern/syscall.c:31 -c020185a: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -c020185f: 8b 40 20 mov 0x20(%eax),%eax -c0201862: eb 46 jmp c02018aa -/media/unix/Data/Code/2020301918-os/kern/syscall.c:33 -c0201864: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -c0201869: 8b 40 28 mov 0x28(%eax),%eax -c020186c: eb 3c jmp c02018aa -/media/unix/Data/Code/2020301918-os/kern/syscall.c:35 -c020186e: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -c0201873: 8b 40 24 mov 0x24(%eax),%eax -c0201876: eb 32 jmp c02018aa -/media/unix/Data/Code/2020301918-os/kern/syscall.c:37 -c0201878: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -c020187d: 8b 40 14 mov 0x14(%eax),%eax -c0201880: eb 28 jmp c02018aa -/media/unix/Data/Code/2020301918-os/kern/syscall.c:39 -c0201882: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -c0201887: 8b 40 10 mov 0x10(%eax),%eax -c020188a: eb 1e jmp c02018aa -/media/unix/Data/Code/2020301918-os/kern/syscall.c:41 -c020188c: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -c0201891: 8b 40 18 mov 0x18(%eax),%eax -c0201894: eb 14 jmp c02018aa -/media/unix/Data/Code/2020301918-os/kern/syscall.c:43 -c0201896: ff 75 08 push 0x8(%ebp) -c0201899: 68 60 44 20 c0 push $0xc0204460 -c020189e: 6a 2b push $0x2b -c02018a0: 68 79 44 20 c0 push $0xc0204479 -c02018a5: e8 0f f9 ff ff call c02011b9 <_panic> -/media/unix/Data/Code/2020301918-os/kern/syscall.c:45 -c02018aa: c9 leave -c02018ab: c3 ret - -c02018ac : -sys_get_ticks(): -/media/unix/Data/Code/2020301918-os/kern/syscall.c:52 -c02018ac: 55 push %ebp -c02018ad: 89 e5 mov %esp,%ebp -c02018af: 83 ec 08 sub $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/syscall.c:53 -c02018b2: e8 b6 00 00 00 call c020196d -/media/unix/Data/Code/2020301918-os/kern/syscall.c:54 -c02018b7: c9 leave -c02018b8: c3 ret - -c02018b9 : -sys_get_pid(): -/media/unix/Data/Code/2020301918-os/kern/syscall.c:62 -c02018b9: 55 push %ebp -c02018ba: 89 e5 mov %esp,%ebp -c02018bc: 83 ec 08 sub $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/syscall.c:63 -c02018bf: e8 08 f8 ff ff call c02010cc -/media/unix/Data/Code/2020301918-os/kern/syscall.c:64 -c02018c4: c9 leave -c02018c5: c3 ret - -c02018c6 : -sys_read(): -/media/unix/Data/Code/2020301918-os/kern/syscall.c:73 -c02018c6: 55 push %ebp -c02018c7: 89 e5 mov %esp,%ebp -c02018c9: 56 push %esi -c02018ca: 53 push %ebx -/media/unix/Data/Code/2020301918-os/kern/syscall.c:74 -c02018cb: 83 ec 0c sub $0xc,%esp -c02018ce: 6a 02 push $0x2 -c02018d0: e8 6a ff ff ff call c020183f -c02018d5: 83 c4 10 add $0x10,%esp -c02018d8: 89 c3 mov %eax,%ebx -c02018da: 83 ec 0c sub $0xc,%esp -c02018dd: 6a 01 push $0x1 -c02018df: e8 5b ff ff ff call c020183f -c02018e4: 83 c4 10 add $0x10,%esp -c02018e7: 89 c6 mov %eax,%esi -c02018e9: 83 ec 0c sub $0xc,%esp -c02018ec: 6a 00 push $0x0 -c02018ee: e8 4c ff ff ff call c020183f -c02018f3: 83 c4 10 add $0x10,%esp -c02018f6: 83 ec 04 sub $0x4,%esp -c02018f9: 53 push %ebx -c02018fa: 56 push %esi -c02018fb: 50 push %eax -c02018fc: e8 b3 ea ff ff call c02003b4 -c0201901: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/syscall.c:75 -c0201904: 8d 65 f8 lea -0x8(%ebp),%esp -c0201907: 5b pop %ebx -c0201908: 5e pop %esi -c0201909: 5d pop %ebp -c020190a: c3 ret - -c020190b : -sys_write(): -/media/unix/Data/Code/2020301918-os/kern/syscall.c:84 -c020190b: 55 push %ebp -c020190c: 89 e5 mov %esp,%ebp -c020190e: 56 push %esi -c020190f: 53 push %ebx -/media/unix/Data/Code/2020301918-os/kern/syscall.c:85 -c0201910: 83 ec 0c sub $0xc,%esp -c0201913: 6a 02 push $0x2 -c0201915: e8 25 ff ff ff call c020183f -c020191a: 83 c4 10 add $0x10,%esp -c020191d: 89 c3 mov %eax,%ebx -c020191f: 83 ec 0c sub $0xc,%esp -c0201922: 6a 01 push $0x1 -c0201924: e8 16 ff ff ff call c020183f -c0201929: 83 c4 10 add $0x10,%esp -c020192c: 89 c6 mov %eax,%esi -c020192e: 83 ec 0c sub $0xc,%esp -c0201931: 6a 00 push $0x0 -c0201933: e8 07 ff ff ff call c020183f -c0201938: 83 c4 10 add $0x10,%esp -c020193b: 83 ec 04 sub $0x4,%esp -c020193e: 53 push %ebx -c020193f: 56 push %esi -c0201940: 50 push %eax -c0201941: e8 30 eb ff ff call c0200476 -c0201946: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/syscall.c:86 -c0201949: 8d 65 f8 lea -0x8(%ebp),%esp -c020194c: 5b pop %ebx -c020194d: 5e pop %esi -c020194e: 5d pop %ebp -c020194f: c3 ret - -c0201950 : -timecounter_inc(): -/media/unix/Data/Code/2020301918-os/kern/time.c:13 -c0201950: 55 push %ebp -c0201951: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/kern/time.c:14 -c0201953: a1 88 ee 20 c0 mov 0xc020ee88,%eax -c0201958: 83 c0 01 add $0x1,%eax -c020195b: a3 88 ee 20 c0 mov %eax,0xc020ee88 -/media/unix/Data/Code/2020301918-os/kern/time.c:15 -c0201960: 90 nop -c0201961: 5d pop %ebp -c0201962: c3 ret - -c0201963 : -kern_get_ticks(): -/media/unix/Data/Code/2020301918-os/kern/time.c:22 -c0201963: 55 push %ebp -c0201964: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/kern/time.c:23 -c0201966: a1 88 ee 20 c0 mov 0xc020ee88,%eax -/media/unix/Data/Code/2020301918-os/kern/time.c:24 -c020196b: 5d pop %ebp -c020196c: c3 ret - -c020196d : -do_get_ticks(): -/media/unix/Data/Code/2020301918-os/kern/time.c:28 -c020196d: 55 push %ebp -c020196e: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/kern/time.c:29 -c0201970: e8 ee ff ff ff call c0201963 -/media/unix/Data/Code/2020301918-os/kern/time.c:30 -c0201975: 5d pop %ebp -c0201976: c3 ret - -c0201977 : -inb(): -/media/unix/Data/Code/2020301918-os/inc/x86.h:8 -c0201977: 55 push %ebp -c0201978: 89 e5 mov %esp,%ebp -c020197a: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/inc/x86.h:10 -c020197d: 8b 45 08 mov 0x8(%ebp),%eax -c0201980: 89 c2 mov %eax,%edx -c0201982: ec in (%dx),%al -c0201983: 88 45 ff mov %al,-0x1(%ebp) -/media/unix/Data/Code/2020301918-os/inc/x86.h:11 -c0201986: 0f b6 45 ff movzbl -0x1(%ebp),%eax -/media/unix/Data/Code/2020301918-os/inc/x86.h:12 -c020198a: c9 leave -c020198b: c3 ret - -c020198c : -outb(): -/media/unix/Data/Code/2020301918-os/inc/x86.h:59 -c020198c: 55 push %ebp -c020198d: 89 e5 mov %esp,%ebp -c020198f: 83 ec 04 sub $0x4,%esp -c0201992: 8b 45 0c mov 0xc(%ebp),%eax -c0201995: 88 45 fc mov %al,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/inc/x86.h:60 -c0201998: 0f b6 45 fc movzbl -0x4(%ebp),%eax -c020199c: 8b 55 08 mov 0x8(%ebp),%edx -c020199f: ee out %al,(%dx) -/media/unix/Data/Code/2020301918-os/inc/x86.h:61 -c02019a0: 90 nop -c02019a1: c9 leave -c02019a2: c3 ret - -c02019a3 : -rcr2(): -/media/unix/Data/Code/2020301918-os/inc/x86.h:118 -c02019a3: 55 push %ebp -c02019a4: 89 e5 mov %esp,%ebp -c02019a6: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/inc/x86.h:120 -c02019a9: 0f 20 d0 mov %cr2,%eax -c02019ac: 89 45 fc mov %eax,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/inc/x86.h:121 -c02019af: 8b 45 fc mov -0x4(%ebp),%eax -/media/unix/Data/Code/2020301918-os/inc/x86.h:122 -c02019b2: c9 leave -c02019b3: c3 ret - -c02019b4 : -init_segment(): -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:107 -c02019b4: 55 push %ebp -c02019b5: 89 e5 mov %esp,%ebp -c02019b7: 83 ec 04 sub $0x4,%esp -c02019ba: 8b 45 14 mov 0x14(%ebp),%eax -c02019bd: 66 89 45 fc mov %ax,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:108 -c02019c1: 8b 45 10 mov 0x10(%ebp),%eax -c02019c4: 89 c2 mov %eax,%edx -c02019c6: 8b 45 08 mov 0x8(%ebp),%eax -c02019c9: 66 89 10 mov %dx,(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:109 -c02019cc: 8b 45 0c mov 0xc(%ebp),%eax -c02019cf: 89 c2 mov %eax,%edx -c02019d1: 8b 45 08 mov 0x8(%ebp),%eax -c02019d4: 66 89 50 02 mov %dx,0x2(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:110 -c02019d8: 8b 45 0c mov 0xc(%ebp),%eax -c02019db: c1 e8 10 shr $0x10,%eax -c02019de: 89 c2 mov %eax,%edx -c02019e0: 8b 45 08 mov 0x8(%ebp),%eax -c02019e3: 88 50 04 mov %dl,0x4(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:111 -c02019e6: 0f b7 45 fc movzwl -0x4(%ebp),%eax -c02019ea: 89 c2 mov %eax,%edx -c02019ec: 8b 45 08 mov 0x8(%ebp),%eax -c02019ef: 88 50 05 mov %dl,0x5(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:112 -c02019f2: 8b 45 10 mov 0x10(%ebp),%eax -c02019f5: c1 e8 10 shr $0x10,%eax -c02019f8: 83 e0 0f and $0xf,%eax -c02019fb: 89 c2 mov %eax,%edx -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:113 -c02019fd: 0f b7 45 fc movzwl -0x4(%ebp),%eax -c0201a01: 66 c1 e8 08 shr $0x8,%ax -c0201a05: 83 e0 f0 and $0xfffffff0,%eax -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:112 -c0201a08: 09 c2 or %eax,%edx -c0201a0a: 8b 45 08 mov 0x8(%ebp),%eax -c0201a0d: 88 50 06 mov %dl,0x6(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:114 -c0201a10: 8b 45 0c mov 0xc(%ebp),%eax -c0201a13: c1 e8 18 shr $0x18,%eax -c0201a16: 89 c2 mov %eax,%edx -c0201a18: 8b 45 08 mov 0x8(%ebp),%eax -c0201a1b: 88 50 07 mov %dl,0x7(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:115 -c0201a1e: 90 nop -c0201a1f: c9 leave -c0201a20: c3 ret - -c0201a21 : -init_gate(): -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:119 -c0201a21: 55 push %ebp -c0201a22: 89 e5 mov %esp,%ebp -c0201a24: 83 ec 08 sub $0x8,%esp -c0201a27: 8b 55 0c mov 0xc(%ebp),%edx -c0201a2a: 8b 45 14 mov 0x14(%ebp),%eax -c0201a2d: 88 55 fc mov %dl,-0x4(%ebp) -c0201a30: 88 45 f8 mov %al,-0x8(%ebp) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:120 -c0201a33: 8b 45 10 mov 0x10(%ebp),%eax -c0201a36: 89 c2 mov %eax,%edx -c0201a38: 8b 45 08 mov 0x8(%ebp),%eax -c0201a3b: 66 89 10 mov %dx,(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:121 -c0201a3e: 8b 45 08 mov 0x8(%ebp),%eax -c0201a41: 66 c7 40 02 08 00 movw $0x8,0x2(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:122 -c0201a47: 8b 45 08 mov 0x8(%ebp),%eax -c0201a4a: c6 40 04 00 movb $0x0,0x4(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:123 -c0201a4e: 0f b6 45 f8 movzbl -0x8(%ebp),%eax -c0201a52: c1 e0 05 shl $0x5,%eax -c0201a55: 89 c2 mov %eax,%edx -c0201a57: 0f b6 45 fc movzbl -0x4(%ebp),%eax -c0201a5b: 09 d0 or %edx,%eax -c0201a5d: 89 c2 mov %eax,%edx -c0201a5f: 8b 45 08 mov 0x8(%ebp),%eax -c0201a62: 88 50 05 mov %dl,0x5(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:124 -c0201a65: 8b 45 10 mov 0x10(%ebp),%eax -c0201a68: c1 e8 10 shr $0x10,%eax -c0201a6b: 89 c2 mov %eax,%edx -c0201a6d: 8b 45 08 mov 0x8(%ebp),%eax -c0201a70: 66 89 50 06 mov %dx,0x6(%eax) -/media/unix/Data/Code/2020301918-os/inc/kern/protect.h:125 -c0201a74: 90 nop -c0201a75: c9 leave -c0201a76: c3 ret - -c0201a77 : -enable_irq(): -/media/unix/Data/Code/2020301918-os/kern/trap.c:43 -c0201a77: 55 push %ebp -c0201a78: 89 e5 mov %esp,%ebp -c0201a7a: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/trap.c:44 -c0201a7d: 8b 45 08 mov 0x8(%ebp),%eax -c0201a80: 83 e0 07 and $0x7,%eax -c0201a83: ba 01 00 00 00 mov $0x1,%edx -c0201a88: 89 c1 mov %eax,%ecx -c0201a8a: d3 e2 shl %cl,%edx -c0201a8c: 89 d0 mov %edx,%eax -c0201a8e: 88 45 ff mov %al,-0x1(%ebp) -/media/unix/Data/Code/2020301918-os/kern/trap.c:45 -c0201a91: 83 7d 08 07 cmpl $0x7,0x8(%ebp) -c0201a95: 7f 24 jg c0201abb -/media/unix/Data/Code/2020301918-os/kern/trap.c:46 -c0201a97: 6a 21 push $0x21 -c0201a99: e8 d9 fe ff ff call c0201977 -c0201a9e: 83 c4 04 add $0x4,%esp -c0201aa1: 89 c2 mov %eax,%edx -c0201aa3: 0f b6 45 ff movzbl -0x1(%ebp),%eax -c0201aa7: f7 d0 not %eax -c0201aa9: 21 d0 and %edx,%eax -c0201aab: 0f b6 c0 movzbl %al,%eax -c0201aae: 50 push %eax -c0201aaf: 6a 21 push $0x21 -c0201ab1: e8 d6 fe ff ff call c020198c -c0201ab6: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/trap.c:49 -c0201ab9: eb 28 jmp c0201ae3 -/media/unix/Data/Code/2020301918-os/kern/trap.c:48 -c0201abb: 68 a1 00 00 00 push $0xa1 -c0201ac0: e8 b2 fe ff ff call c0201977 -c0201ac5: 83 c4 04 add $0x4,%esp -c0201ac8: 89 c2 mov %eax,%edx -c0201aca: 0f b6 45 ff movzbl -0x1(%ebp),%eax -c0201ace: f7 d0 not %eax -c0201ad0: 21 d0 and %edx,%eax -c0201ad2: 0f b6 c0 movzbl %al,%eax -c0201ad5: 50 push %eax -c0201ad6: 68 a1 00 00 00 push $0xa1 -c0201adb: e8 ac fe ff ff call c020198c -c0201ae0: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/trap.c:49 -c0201ae3: 90 nop -c0201ae4: c9 leave -c0201ae5: c3 ret - -c0201ae6 : -disable_irq(): -/media/unix/Data/Code/2020301918-os/kern/trap.c:56 -c0201ae6: 55 push %ebp -c0201ae7: 89 e5 mov %esp,%ebp -c0201ae9: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/trap.c:57 -c0201aec: 8b 45 08 mov 0x8(%ebp),%eax -c0201aef: 83 e0 07 and $0x7,%eax -c0201af2: ba 01 00 00 00 mov $0x1,%edx -c0201af7: 89 c1 mov %eax,%ecx -c0201af9: d3 e2 shl %cl,%edx -c0201afb: 89 d0 mov %edx,%eax -c0201afd: 88 45 ff mov %al,-0x1(%ebp) -/media/unix/Data/Code/2020301918-os/kern/trap.c:58 -c0201b00: 83 7d 08 07 cmpl $0x7,0x8(%ebp) -c0201b04: 7f 1d jg c0201b23 -/media/unix/Data/Code/2020301918-os/kern/trap.c:59 -c0201b06: 6a 21 push $0x21 -c0201b08: e8 6a fe ff ff call c0201977 -c0201b0d: 83 c4 04 add $0x4,%esp -c0201b10: 0a 45 ff or -0x1(%ebp),%al -c0201b13: 0f b6 c0 movzbl %al,%eax -c0201b16: 50 push %eax -c0201b17: 6a 21 push $0x21 -c0201b19: e8 6e fe ff ff call c020198c -c0201b1e: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/trap.c:62 -c0201b21: eb 21 jmp c0201b44 -/media/unix/Data/Code/2020301918-os/kern/trap.c:61 -c0201b23: 68 a1 00 00 00 push $0xa1 -c0201b28: e8 4a fe ff ff call c0201977 -c0201b2d: 83 c4 04 add $0x4,%esp -c0201b30: 0a 45 ff or -0x1(%ebp),%al -c0201b33: 0f b6 c0 movzbl %al,%eax -c0201b36: 50 push %eax -c0201b37: 68 a1 00 00 00 push $0xa1 -c0201b3c: e8 4b fe ff ff call c020198c -c0201b41: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/trap.c:62 -c0201b44: 90 nop -c0201b45: c9 leave -c0201b46: c3 ret - -c0201b47 : -default_interrupt_handler(): -/media/unix/Data/Code/2020301918-os/kern/trap.c:69 -c0201b47: 55 push %ebp -c0201b48: 89 e5 mov %esp,%ebp -c0201b4a: 83 ec 08 sub $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/trap.c:70 -c0201b4d: ff 75 08 push 0x8(%ebp) -c0201b50: 68 a0 46 20 c0 push $0xc02046a0 -c0201b55: 6a 46 push $0x46 -c0201b57: 68 be 46 20 c0 push $0xc02046be -c0201b5c: e8 a1 f6 ff ff call c0201202 <_warn> -c0201b61: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/trap.c:71 -c0201b64: 90 nop -c0201b65: c9 leave -c0201b66: c3 ret - -c0201b67 : -exception_handler(): -/media/unix/Data/Code/2020301918-os/kern/trap.c:79 -c0201b67: 55 push %ebp -c0201b68: 89 e5 mov %esp,%ebp -c0201b6a: 83 ec 18 sub $0x18,%esp -/media/unix/Data/Code/2020301918-os/kern/trap.c:105 -c0201b6d: 83 7d 08 0e cmpl $0xe,0x8(%ebp) -c0201b71: 0f 85 3a 01 00 00 jne c0201cb1 -/media/unix/Data/Code/2020301918-os/kern/trap.c:106 -c0201b77: c7 45 f4 c0 ee 20 c0 movl $0xc020eec0,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/trap.c:108 -c0201b7e: 8b 45 f4 mov -0xc(%ebp),%eax -c0201b81: 2d c0 ee 20 c0 sub $0xc020eec0,%eax -c0201b86: 89 c2 mov %eax,%edx -/media/unix/Data/Code/2020301918-os/kern/trap.c:107 -c0201b88: b8 ff 00 00 00 mov $0xff,%eax -c0201b8d: 29 d0 sub %edx,%eax -c0201b8f: 83 ec 04 sub $0x4,%esp -c0201b92: 68 cc 46 20 c0 push $0xc02046cc -c0201b97: 50 push %eax -c0201b98: ff 75 f4 push -0xc(%ebp) -c0201b9b: e8 be 14 00 00 call c020305e -c0201ba0: 83 c4 10 add $0x10,%esp -c0201ba3: 01 45 f4 add %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/trap.c:111 -c0201ba6: 8b 45 f4 mov -0xc(%ebp),%eax -c0201ba9: 2d c0 ee 20 c0 sub $0xc020eec0,%eax -c0201bae: 89 c2 mov %eax,%edx -/media/unix/Data/Code/2020301918-os/kern/trap.c:110 -c0201bb0: b8 ff 00 00 00 mov $0xff,%eax -c0201bb5: 29 d0 sub %edx,%eax -c0201bb7: 83 ec 04 sub $0x4,%esp -c0201bba: 68 f4 46 20 c0 push $0xc02046f4 -c0201bbf: 50 push %eax -c0201bc0: ff 75 f4 push -0xc(%ebp) -c0201bc3: e8 96 14 00 00 call c020305e -c0201bc8: 83 c4 10 add $0x10,%esp -c0201bcb: 01 45 f4 add %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/trap.c:113 -c0201bce: 8b 45 0c mov 0xc(%ebp),%eax -c0201bd1: 83 e0 01 and $0x1,%eax -c0201bd4: 85 c0 test %eax,%eax -c0201bd6: 75 28 jne c0201c00 -/media/unix/Data/Code/2020301918-os/kern/trap.c:115 -c0201bd8: 8b 45 f4 mov -0xc(%ebp),%eax -c0201bdb: 2d c0 ee 20 c0 sub $0xc020eec0,%eax -c0201be0: 89 c2 mov %eax,%edx -/media/unix/Data/Code/2020301918-os/kern/trap.c:114 -c0201be2: b8 ff 00 00 00 mov $0xff,%eax -c0201be7: 29 d0 sub %edx,%eax -c0201be9: 83 ec 04 sub $0x4,%esp -c0201bec: 68 2c 47 20 c0 push $0xc020472c -c0201bf1: 50 push %eax -c0201bf2: ff 75 f4 push -0xc(%ebp) -c0201bf5: e8 64 14 00 00 call c020305e -c0201bfa: 83 c4 10 add $0x10,%esp -c0201bfd: 01 45 f4 add %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/trap.c:118 -c0201c00: 8b 45 0c mov 0xc(%ebp),%eax -c0201c03: 83 e0 02 and $0x2,%eax -c0201c06: 85 c0 test %eax,%eax -c0201c08: 74 2a je c0201c34 -/media/unix/Data/Code/2020301918-os/kern/trap.c:120 -c0201c0a: 8b 45 f4 mov -0xc(%ebp),%eax -c0201c0d: 2d c0 ee 20 c0 sub $0xc020eec0,%eax -c0201c12: 89 c2 mov %eax,%edx -/media/unix/Data/Code/2020301918-os/kern/trap.c:119 -c0201c14: b8 ff 00 00 00 mov $0xff,%eax -c0201c19: 29 d0 sub %edx,%eax -c0201c1b: 83 ec 04 sub $0x4,%esp -c0201c1e: 68 58 47 20 c0 push $0xc0204758 -c0201c23: 50 push %eax -c0201c24: ff 75 f4 push -0xc(%ebp) -c0201c27: e8 32 14 00 00 call c020305e -c0201c2c: 83 c4 10 add $0x10,%esp -c0201c2f: 01 45 f4 add %eax,-0xc(%ebp) -c0201c32: eb 28 jmp c0201c5c -/media/unix/Data/Code/2020301918-os/kern/trap.c:124 -c0201c34: 8b 45 f4 mov -0xc(%ebp),%eax -c0201c37: 2d c0 ee 20 c0 sub $0xc020eec0,%eax -c0201c3c: 89 c2 mov %eax,%edx -/media/unix/Data/Code/2020301918-os/kern/trap.c:123 -c0201c3e: b8 ff 00 00 00 mov $0xff,%eax -c0201c43: 29 d0 sub %edx,%eax -c0201c45: 83 ec 04 sub $0x4,%esp -c0201c48: 68 7c 47 20 c0 push $0xc020477c -c0201c4d: 50 push %eax -c0201c4e: ff 75 f4 push -0xc(%ebp) -c0201c51: e8 08 14 00 00 call c020305e -c0201c56: 83 c4 10 add $0x10,%esp -c0201c59: 01 45 f4 add %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/trap.c:127 -c0201c5c: 8b 45 0c mov 0xc(%ebp),%eax -c0201c5f: 83 e0 04 and $0x4,%eax -c0201c62: 85 c0 test %eax,%eax -c0201c64: 74 28 je c0201c8e -/media/unix/Data/Code/2020301918-os/kern/trap.c:129 -c0201c66: 8b 45 f4 mov -0xc(%ebp),%eax -c0201c69: 2d c0 ee 20 c0 sub $0xc020eec0,%eax -c0201c6e: 89 c2 mov %eax,%edx -/media/unix/Data/Code/2020301918-os/kern/trap.c:128 -c0201c70: b8 ff 00 00 00 mov $0xff,%eax -c0201c75: 29 d0 sub %edx,%eax -c0201c77: 83 ec 04 sub $0x4,%esp -c0201c7a: 68 a0 47 20 c0 push $0xc02047a0 -c0201c7f: 50 push %eax -c0201c80: ff 75 f4 push -0xc(%ebp) -c0201c83: e8 d6 13 00 00 call c020305e -c0201c88: 83 c4 10 add $0x10,%esp -c0201c8b: 01 45 f4 add %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/trap.c:132 -c0201c8e: e8 10 fd ff ff call c02019a3 -c0201c93: 83 ec 08 sub $0x8,%esp -c0201c96: 50 push %eax -c0201c97: ff 75 10 push 0x10(%ebp) -c0201c9a: ff 75 14 push 0x14(%ebp) -c0201c9d: 68 c0 ee 20 c0 push $0xc020eec0 -c0201ca2: 68 84 00 00 00 push $0x84 -c0201ca7: 68 be 46 20 c0 push $0xc02046be -c0201cac: e8 08 f5 ff ff call c02011b9 <_panic> -/media/unix/Data/Code/2020301918-os/kern/trap.c:134 -c0201cb1: 83 ec 04 sub $0x4,%esp -c0201cb4: 68 cc 47 20 c0 push $0xc02047cc -c0201cb9: 68 ff 00 00 00 push $0xff -c0201cbe: 68 c0 ee 20 c0 push $0xc020eec0 -c0201cc3: e8 96 13 00 00 call c020305e -c0201cc8: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/kern/trap.c:137 -c0201ccb: 8b 45 08 mov 0x8(%ebp),%eax -c0201cce: c1 e0 06 shl $0x6,%eax -c0201cd1: 05 a0 74 20 c0 add $0xc02074a0,%eax -c0201cd6: ff 75 0c push 0xc(%ebp) -c0201cd9: ff 75 10 push 0x10(%ebp) -c0201cdc: ff 75 14 push 0x14(%ebp) -c0201cdf: ff 75 18 push 0x18(%ebp) -c0201ce2: 50 push %eax -c0201ce3: 68 c0 ee 20 c0 push $0xc020eec0 -c0201ce8: 68 89 00 00 00 push $0x89 -c0201ced: 68 be 46 20 c0 push $0xc02046be -c0201cf2: e8 c2 f4 ff ff call c02011b9 <_panic> - -c0201cf7 : -clock_interrupt_handler(): -/media/unix/Data/Code/2020301918-os/kern/trap.c:151 -c0201cf7: 55 push %ebp -c0201cf8: 89 e5 mov %esp,%ebp -c0201cfa: 83 ec 08 sub $0x8,%esp -/media/unix/Data/Code/2020301918-os/kern/trap.c:152 -c0201cfd: e8 4e fc ff ff call c0201950 -/media/unix/Data/Code/2020301918-os/kern/trap.c:154 -c0201d02: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -c0201d07: 8b 50 78 mov 0x78(%eax),%edx -c0201d0a: 83 ea 01 sub $0x1,%edx -c0201d0d: 89 50 78 mov %edx,0x78(%eax) -c0201d10: 8b 40 78 mov 0x78(%eax),%eax -c0201d13: 85 c0 test %eax,%eax -c0201d15: 75 16 jne c0201d2d -/media/unix/Data/Code/2020301918-os/kern/trap.c:155 -c0201d17: 8b 15 e4 9d 20 c0 mov 0xc0209de4,%edx -c0201d1d: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -c0201d22: 8b 52 74 mov 0x74(%edx),%edx -c0201d25: 89 50 78 mov %edx,0x78(%eax) -/media/unix/Data/Code/2020301918-os/kern/trap.c:156 -c0201d28: e8 03 f3 ff ff call c0201030 -/media/unix/Data/Code/2020301918-os/kern/trap.c:158 -c0201d2d: 90 nop -c0201d2e: c9 leave -c0201d2f: c3 ret - -c0201d30 : -kb_interrupt_handler(): -/media/unix/Data/Code/2020301918-os/kern/trap.c:165 -c0201d30: 55 push %ebp -c0201d31: 89 e5 mov %esp,%ebp -c0201d33: 83 ec 18 sub $0x18,%esp -/media/unix/Data/Code/2020301918-os/kern/trap.c:166 -c0201d36: 6a 60 push $0x60 -c0201d38: e8 3a fc ff ff call c0201977 -c0201d3d: 83 c4 04 add $0x4,%esp -c0201d40: 88 45 f7 mov %al,-0x9(%ebp) -/media/unix/Data/Code/2020301918-os/kern/trap.c:167 -c0201d43: 0f b6 45 f7 movzbl -0x9(%ebp),%eax -c0201d47: 84 c0 test %al,%al -c0201d49: 78 2c js c0201d77 -/media/unix/Data/Code/2020301918-os/kern/trap.c:169 -c0201d4b: 0f b6 45 f7 movzbl -0x9(%ebp),%eax -c0201d4f: 8b 04 85 a0 44 20 c0 mov -0x3fdfbb60(,%eax,4),%eax -c0201d56: 88 45 f7 mov %al,-0x9(%ebp) -/media/unix/Data/Code/2020301918-os/kern/trap.c:170 -c0201d59: 80 7d f7 60 cmpb $0x60,-0x9(%ebp) -c0201d5d: 76 19 jbe c0201d78 -/media/unix/Data/Code/2020301918-os/kern/trap.c:170 (discriminator 1) -c0201d5f: 80 7d f7 7a cmpb $0x7a,-0x9(%ebp) -c0201d63: 77 13 ja c0201d78 -/media/unix/Data/Code/2020301918-os/kern/trap.c:171 -c0201d65: 0f b6 45 f7 movzbl -0x9(%ebp),%eax -c0201d69: 83 ec 0c sub $0xc,%esp -c0201d6c: 50 push %eax -c0201d6d: e8 c1 ea ff ff call c0200833 -c0201d72: 83 c4 10 add $0x10,%esp -c0201d75: eb 01 jmp c0201d78 -/media/unix/Data/Code/2020301918-os/kern/trap.c:168 -c0201d77: 90 nop -/media/unix/Data/Code/2020301918-os/kern/trap.c:172 -c0201d78: c9 leave -c0201d79: c3 ret - -c0201d7a : -syscall_handler(): -/media/unix/Data/Code/2020301918-os/kern/trap.c:179 -c0201d7a: 55 push %ebp -c0201d7b: 89 e5 mov %esp,%ebp -c0201d7d: 83 ec 18 sub $0x18,%esp -/media/unix/Data/Code/2020301918-os/kern/trap.c:180 -c0201d80: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -c0201d85: 8b 40 2c mov 0x2c(%eax),%eax -c0201d88: 89 45 f4 mov %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/kern/trap.c:181 -c0201d8b: 8b 45 f4 mov -0xc(%ebp),%eax -c0201d8e: 8b 04 85 34 74 20 c0 mov -0x3fdf8bcc(,%eax,4),%eax -c0201d95: ff d0 call *%eax -c0201d97: 89 45 f0 mov %eax,-0x10(%ebp) -/media/unix/Data/Code/2020301918-os/kern/trap.c:182 -c0201d9a: a1 e4 9d 20 c0 mov 0xc0209de4,%eax -c0201d9f: 8b 55 f0 mov -0x10(%ebp),%edx -c0201da2: 89 50 2c mov %edx,0x2c(%eax) -/media/unix/Data/Code/2020301918-os/kern/trap.c:183 -c0201da5: 90 nop -c0201da6: c9 leave -c0201da7: c3 ret - -c0201da8 : -xchg(): -/media/unix/Data/Code/2020301918-os/inc/x86.h:200 -c0201da8: 55 push %ebp -c0201da9: 89 e5 mov %esp,%ebp -c0201dab: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/inc/x86.h:204 -c0201dae: 8b 55 08 mov 0x8(%ebp),%edx -c0201db1: 8b 45 0c mov 0xc(%ebp),%eax -c0201db4: 8b 4d 08 mov 0x8(%ebp),%ecx -c0201db7: f0 87 02 lock xchg %eax,(%edx) -c0201dba: 89 45 fc mov %eax,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/inc/x86.h:208 -c0201dbd: 8b 45 fc mov -0x4(%ebp),%eax -/media/unix/Data/Code/2020301918-os/inc/x86.h:209 -c0201dc0: c9 leave -c0201dc1: c3 ret - -c0201dc2 : -write_to_terminal(): -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:13 -c0201dc2: 55 push %ebp -c0201dc3: 89 e5 mov %esp,%ebp -c0201dc5: 83 ec 08 sub $0x8,%esp -c0201dc8: 8b 55 08 mov 0x8(%ebp),%edx -c0201dcb: 8b 45 0c mov 0xc(%ebp),%eax -c0201dce: 66 89 55 fc mov %dx,-0x4(%ebp) -c0201dd2: 66 89 45 f8 mov %ax,-0x8(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:15 -c0201dd6: 0f b7 45 fc movzwl -0x4(%ebp),%eax -c0201dda: 8d 14 00 lea (%eax,%eax,1),%edx -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:14 -c0201ddd: 0f b7 45 f8 movzwl -0x8(%ebp),%eax -c0201de1: 65 66 89 02 mov %ax,%gs:(%edx) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:17 -c0201de5: 90 nop -c0201de6: c9 leave -c0201de7: c3 ret - -c0201de8 : -cursor_pos(): -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:46 -c0201de8: 55 push %ebp -c0201de9: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:47 -c0201deb: 8b 45 08 mov 0x8(%ebp),%eax -c0201dee: 0f b7 40 06 movzwl 0x6(%eax),%eax -c0201df2: 89 c2 mov %eax,%edx -c0201df4: 89 d0 mov %edx,%eax -c0201df6: c1 e0 02 shl $0x2,%eax -c0201df9: 01 d0 add %edx,%eax -c0201dfb: c1 e0 04 shl $0x4,%eax -c0201dfe: 89 c2 mov %eax,%edx -c0201e00: 8b 45 08 mov 0x8(%ebp),%eax -c0201e03: 0f b7 40 08 movzwl 0x8(%eax),%eax -c0201e07: 01 d0 add %edx,%eax -c0201e09: 83 e8 51 sub $0x51,%eax -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:48 -c0201e0c: 5d pop %ebp -c0201e0d: c3 ret - -c0201e0e : -cursor_move(): -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:52 -c0201e0e: 55 push %ebp -c0201e0f: 89 e5 mov %esp,%ebp -c0201e11: 83 ec 08 sub $0x8,%esp -c0201e14: 8b 55 08 mov 0x8(%ebp),%edx -c0201e17: 8b 45 0c mov 0xc(%ebp),%eax -c0201e1a: 66 89 55 fc mov %dx,-0x4(%ebp) -c0201e1e: 66 89 45 f8 mov %ax,-0x8(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:53 -c0201e22: 8b 45 10 mov 0x10(%ebp),%eax -c0201e25: 0f b7 40 06 movzwl 0x6(%eax),%eax -c0201e29: 89 c2 mov %eax,%edx -c0201e2b: 0f b7 45 fc movzwl -0x4(%ebp),%eax -c0201e2f: 01 d0 add %edx,%eax -c0201e31: 89 c2 mov %eax,%edx -c0201e33: 8b 45 10 mov 0x10(%ebp),%eax -c0201e36: 66 89 50 06 mov %dx,0x6(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:54 -c0201e3a: 8b 45 10 mov 0x10(%ebp),%eax -c0201e3d: 0f b7 40 06 movzwl 0x6(%eax),%eax -c0201e41: 66 85 c0 test %ax,%ax -c0201e44: 7f 09 jg c0201e4f -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:55 -c0201e46: 8b 45 10 mov 0x10(%ebp),%eax -c0201e49: 66 c7 40 06 01 00 movw $0x1,0x6(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:56 -c0201e4f: 8b 45 10 mov 0x10(%ebp),%eax -c0201e52: 0f b7 40 06 movzwl 0x6(%eax),%eax -c0201e56: 66 83 f8 19 cmp $0x19,%ax -c0201e5a: 7e 09 jle c0201e65 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:57 -c0201e5c: 8b 45 10 mov 0x10(%ebp),%eax -c0201e5f: 66 c7 40 06 19 00 movw $0x19,0x6(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:59 -c0201e65: 8b 45 10 mov 0x10(%ebp),%eax -c0201e68: 0f b7 40 08 movzwl 0x8(%eax),%eax -c0201e6c: 89 c2 mov %eax,%edx -c0201e6e: 0f b7 45 f8 movzwl -0x8(%ebp),%eax -c0201e72: 01 d0 add %edx,%eax -c0201e74: 89 c2 mov %eax,%edx -c0201e76: 8b 45 10 mov 0x10(%ebp),%eax -c0201e79: 66 89 50 08 mov %dx,0x8(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:60 -c0201e7d: 8b 45 10 mov 0x10(%ebp),%eax -c0201e80: 0f b7 40 08 movzwl 0x8(%eax),%eax -c0201e84: 66 85 c0 test %ax,%ax -c0201e87: 7f 09 jg c0201e92 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:61 -c0201e89: 8b 45 10 mov 0x10(%ebp),%eax -c0201e8c: 66 c7 40 08 01 00 movw $0x1,0x8(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:62 -c0201e92: 8b 45 10 mov 0x10(%ebp),%eax -c0201e95: 0f b7 40 08 movzwl 0x8(%eax),%eax -c0201e99: 66 83 f8 50 cmp $0x50,%ax -c0201e9d: 7e 09 jle c0201ea8 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:63 -c0201e9f: 8b 45 10 mov 0x10(%ebp),%eax -c0201ea2: 66 c7 40 08 50 00 movw $0x50,0x8(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:64 -c0201ea8: 90 nop -c0201ea9: c9 leave -c0201eaa: c3 ret - -c0201eab : -cursor_move_pre(): -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:68 -c0201eab: 55 push %ebp -c0201eac: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:69 -c0201eae: 8b 45 08 mov 0x8(%ebp),%eax -c0201eb1: 0f b7 40 08 movzwl 0x8(%eax),%eax -c0201eb5: 66 83 f8 01 cmp $0x1,%ax -c0201eb9: 75 2b jne c0201ee6 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:70 -c0201ebb: 8b 45 08 mov 0x8(%ebp),%eax -c0201ebe: 0f b7 40 06 movzwl 0x6(%eax),%eax -c0201ec2: 66 83 f8 01 cmp $0x1,%ax -c0201ec6: 7e 31 jle c0201ef9 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:71 -c0201ec8: 8b 45 08 mov 0x8(%ebp),%eax -c0201ecb: 0f b7 40 06 movzwl 0x6(%eax),%eax -c0201ecf: 83 e8 01 sub $0x1,%eax -c0201ed2: 89 c2 mov %eax,%edx -c0201ed4: 8b 45 08 mov 0x8(%ebp),%eax -c0201ed7: 66 89 50 06 mov %dx,0x6(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:72 -c0201edb: 8b 45 08 mov 0x8(%ebp),%eax -c0201ede: 66 c7 40 08 50 00 movw $0x50,0x8(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:77 -c0201ee4: eb 13 jmp c0201ef9 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:75 -c0201ee6: 8b 45 08 mov 0x8(%ebp),%eax -c0201ee9: 0f b7 40 08 movzwl 0x8(%eax),%eax -c0201eed: 83 e8 01 sub $0x1,%eax -c0201ef0: 89 c2 mov %eax,%edx -c0201ef2: 8b 45 08 mov 0x8(%ebp),%eax -c0201ef5: 66 89 50 08 mov %dx,0x8(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:77 -c0201ef9: 90 nop -c0201efa: 5d pop %ebp -c0201efb: c3 ret - -c0201efc : -cursor_move_nxt(): -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:81 -c0201efc: 55 push %ebp -c0201efd: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:82 -c0201eff: 8b 45 08 mov 0x8(%ebp),%eax -c0201f02: 0f b7 40 08 movzwl 0x8(%eax),%eax -c0201f06: 66 83 f8 50 cmp $0x50,%ax -c0201f0a: 75 2b jne c0201f37 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:83 -c0201f0c: 8b 45 08 mov 0x8(%ebp),%eax -c0201f0f: 0f b7 40 06 movzwl 0x6(%eax),%eax -c0201f13: 66 83 f8 18 cmp $0x18,%ax -c0201f17: 7f 31 jg c0201f4a -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:84 -c0201f19: 8b 45 08 mov 0x8(%ebp),%eax -c0201f1c: 0f b7 40 06 movzwl 0x6(%eax),%eax -c0201f20: 83 c0 01 add $0x1,%eax -c0201f23: 89 c2 mov %eax,%edx -c0201f25: 8b 45 08 mov 0x8(%ebp),%eax -c0201f28: 66 89 50 06 mov %dx,0x6(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:85 -c0201f2c: 8b 45 08 mov 0x8(%ebp),%eax -c0201f2f: 66 c7 40 08 01 00 movw $0x1,0x8(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:90 -c0201f35: eb 13 jmp c0201f4a -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:88 -c0201f37: 8b 45 08 mov 0x8(%ebp),%eax -c0201f3a: 0f b7 40 08 movzwl 0x8(%eax),%eax -c0201f3e: 83 c0 01 add $0x1,%eax -c0201f41: 89 c2 mov %eax,%edx -c0201f43: 8b 45 08 mov 0x8(%ebp),%eax -c0201f46: 66 89 50 08 mov %dx,0x8(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:90 -c0201f4a: 90 nop -c0201f4b: 5d pop %ebp -c0201f4c: c3 ret - -c0201f4d : -clear_screen(): -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:98 -c0201f4d: 55 push %ebp -c0201f4e: 89 e5 mov %esp,%ebp -c0201f50: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:99 -c0201f53: 66 c7 45 f8 20 0f movw $0xf20,-0x8(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:100 -c0201f59: 8b 45 08 mov 0x8(%ebp),%eax -c0201f5c: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0201f60: 66 85 c0 test %ax,%ax -c0201f63: 75 3a jne c0201f9f -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:101 -c0201f65: ff 75 08 push 0x8(%ebp) -c0201f68: e8 7b fe ff ff call c0201de8 -c0201f6d: 83 c4 04 add $0x4,%esp -c0201f70: 66 89 45 fe mov %ax,-0x2(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:102 -c0201f74: eb 1c jmp c0201f92 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:103 -c0201f76: 0f b7 55 f8 movzwl -0x8(%ebp),%edx -c0201f7a: 0f b7 45 fe movzwl -0x2(%ebp),%eax -c0201f7e: 8d 48 01 lea 0x1(%eax),%ecx -c0201f81: 66 89 4d fe mov %cx,-0x2(%ebp) -c0201f85: 0f b7 c0 movzwl %ax,%eax -c0201f88: 52 push %edx -c0201f89: 50 push %eax -c0201f8a: e8 33 fe ff ff call c0201dc2 -c0201f8f: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:102 -c0201f92: 66 81 7d fe cf 07 cmpw $0x7cf,-0x2(%ebp) -c0201f98: 76 dc jbe c0201f76 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:114 -c0201f9a: e9 8e 00 00 00 jmp c020202d -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:104 -c0201f9f: 8b 45 08 mov 0x8(%ebp),%eax -c0201fa2: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0201fa6: 66 83 f8 01 cmp $0x1,%ax -c0201faa: 75 48 jne c0201ff4 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:105 -c0201fac: ff 75 08 push 0x8(%ebp) -c0201faf: e8 34 fe ff ff call c0201de8 -c0201fb4: 83 c4 04 add $0x4,%esp -c0201fb7: 66 89 45 fc mov %ax,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:106 -c0201fbb: eb 1c jmp c0201fd9 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:107 -c0201fbd: 0f b7 55 f8 movzwl -0x8(%ebp),%edx -c0201fc1: 0f b7 45 fc movzwl -0x4(%ebp),%eax -c0201fc5: 8d 48 ff lea -0x1(%eax),%ecx -c0201fc8: 66 89 4d fc mov %cx,-0x4(%ebp) -c0201fcc: 0f b7 c0 movzwl %ax,%eax -c0201fcf: 52 push %edx -c0201fd0: 50 push %eax -c0201fd1: e8 ec fd ff ff call c0201dc2 -c0201fd6: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:106 -c0201fd9: 66 83 7d fc 00 cmpw $0x0,-0x4(%ebp) -c0201fde: 75 dd jne c0201fbd -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:108 -c0201fe0: 0f b7 55 f8 movzwl -0x8(%ebp),%edx -c0201fe4: 0f b7 45 fc movzwl -0x4(%ebp),%eax -c0201fe8: 52 push %edx -c0201fe9: 50 push %eax -c0201fea: e8 d3 fd ff ff call c0201dc2 -c0201fef: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:114 -c0201ff2: eb 39 jmp c020202d -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:109 -c0201ff4: 8b 45 08 mov 0x8(%ebp),%eax -c0201ff7: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0201ffb: 66 83 f8 02 cmp $0x2,%ax -c0201fff: 75 2c jne c020202d -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:110 -c0202001: 66 c7 45 fa 00 00 movw $0x0,-0x6(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:111 -c0202007: eb 1c jmp c0202025 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:112 -c0202009: 0f b7 55 f8 movzwl -0x8(%ebp),%edx -c020200d: 0f b7 45 fa movzwl -0x6(%ebp),%eax -c0202011: 8d 48 01 lea 0x1(%eax),%ecx -c0202014: 66 89 4d fa mov %cx,-0x6(%ebp) -c0202018: 0f b7 c0 movzwl %ax,%eax -c020201b: 52 push %edx -c020201c: 50 push %eax -c020201d: e8 a0 fd ff ff call c0201dc2 -c0202022: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:111 -c0202025: 66 81 7d fa cf 07 cmpw $0x7cf,-0x6(%ebp) -c020202b: 76 dc jbe c0202009 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:114 -c020202d: 90 nop -c020202e: c9 leave -c020202f: c3 ret - -c0202030 : -clear_line(): -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:118 -c0202030: 55 push %ebp -c0202031: 89 e5 mov %esp,%ebp -c0202033: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:119 -c0202036: 66 c7 45 f8 20 0f movw $0xf20,-0x8(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:120 -c020203c: 8b 45 08 mov 0x8(%ebp),%eax -c020203f: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202043: 66 85 c0 test %ax,%ax -c0202046: 75 5b jne c02020a3 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:121 -c0202048: ff 75 08 push 0x8(%ebp) -c020204b: e8 98 fd ff ff call c0201de8 -c0202050: 83 c4 04 add $0x4,%esp -c0202053: 66 89 45 fe mov %ax,-0x2(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:122 -c0202057: eb 1c jmp c0202075 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:123 -c0202059: 0f b7 55 f8 movzwl -0x8(%ebp),%edx -c020205d: 0f b7 45 fe movzwl -0x2(%ebp),%eax -c0202061: 8d 48 01 lea 0x1(%eax),%ecx -c0202064: 66 89 4d fe mov %cx,-0x2(%ebp) -c0202068: 0f b7 c0 movzwl %ax,%eax -c020206b: 52 push %edx -c020206c: 50 push %eax -c020206d: e8 50 fd ff ff call c0201dc2 -c0202072: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:122 -c0202075: 0f b7 4d fe movzwl -0x2(%ebp),%ecx -c0202079: 0f b7 c1 movzwl %cx,%eax -c020207c: 69 c0 cd cc 00 00 imul $0xcccd,%eax,%eax -c0202082: c1 e8 10 shr $0x10,%eax -c0202085: 89 c2 mov %eax,%edx -c0202087: 66 c1 ea 06 shr $0x6,%dx -c020208b: 89 d0 mov %edx,%eax -c020208d: c1 e0 02 shl $0x2,%eax -c0202090: 01 d0 add %edx,%eax -c0202092: c1 e0 04 shl $0x4,%eax -c0202095: 29 c1 sub %eax,%ecx -c0202097: 89 ca mov %ecx,%edx -c0202099: 66 85 d2 test %dx,%dx -c020209c: 75 bb jne c0202059 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:135 -c020209e: e9 e3 00 00 00 jmp c0202186 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:124 -c02020a3: 8b 45 08 mov 0x8(%ebp),%eax -c02020a6: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02020aa: 66 83 f8 01 cmp $0x1,%ax -c02020ae: 75 6a jne c020211a -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:125 -c02020b0: ff 75 08 push 0x8(%ebp) -c02020b3: e8 30 fd ff ff call c0201de8 -c02020b8: 83 c4 04 add $0x4,%esp -c02020bb: 66 89 45 fc mov %ax,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:126 -c02020bf: eb 1c jmp c02020dd -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:127 -c02020c1: 0f b7 55 f8 movzwl -0x8(%ebp),%edx -c02020c5: 0f b7 45 fc movzwl -0x4(%ebp),%eax -c02020c9: 8d 48 ff lea -0x1(%eax),%ecx -c02020cc: 66 89 4d fc mov %cx,-0x4(%ebp) -c02020d0: 0f b7 c0 movzwl %ax,%eax -c02020d3: 52 push %edx -c02020d4: 50 push %eax -c02020d5: e8 e8 fc ff ff call c0201dc2 -c02020da: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:126 -c02020dd: 0f b7 4d fc movzwl -0x4(%ebp),%ecx -c02020e1: 0f b7 c1 movzwl %cx,%eax -c02020e4: 69 c0 cd cc 00 00 imul $0xcccd,%eax,%eax -c02020ea: c1 e8 10 shr $0x10,%eax -c02020ed: 89 c2 mov %eax,%edx -c02020ef: 66 c1 ea 06 shr $0x6,%dx -c02020f3: 89 d0 mov %edx,%eax -c02020f5: c1 e0 02 shl $0x2,%eax -c02020f8: 01 d0 add %edx,%eax -c02020fa: c1 e0 04 shl $0x4,%eax -c02020fd: 29 c1 sub %eax,%ecx -c02020ff: 89 ca mov %ecx,%edx -c0202101: 66 85 d2 test %dx,%dx -c0202104: 75 bb jne c02020c1 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:128 -c0202106: 0f b7 55 f8 movzwl -0x8(%ebp),%edx -c020210a: 0f b7 45 fc movzwl -0x4(%ebp),%eax -c020210e: 52 push %edx -c020210f: 50 push %eax -c0202110: e8 ad fc ff ff call c0201dc2 -c0202115: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:135 -c0202118: eb 6c jmp c0202186 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:129 -c020211a: 8b 45 08 mov 0x8(%ebp),%eax -c020211d: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202121: 66 83 f8 02 cmp $0x2,%ax -c0202125: 75 5f jne c0202186 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:130 -c0202127: 8b 45 08 mov 0x8(%ebp),%eax -c020212a: 0f b7 40 06 movzwl 0x6(%eax),%eax -c020212e: 89 c2 mov %eax,%edx -c0202130: 89 d0 mov %edx,%eax -c0202132: c1 e0 02 shl $0x2,%eax -c0202135: 01 d0 add %edx,%eax -c0202137: c1 e0 04 shl $0x4,%eax -c020213a: 83 e8 50 sub $0x50,%eax -c020213d: 66 89 45 fa mov %ax,-0x6(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:132 (discriminator 1) -c0202141: 0f b7 55 f8 movzwl -0x8(%ebp),%edx -c0202145: 0f b7 45 fa movzwl -0x6(%ebp),%eax -c0202149: 8d 48 01 lea 0x1(%eax),%ecx -c020214c: 66 89 4d fa mov %cx,-0x6(%ebp) -c0202150: 0f b7 c0 movzwl %ax,%eax -c0202153: 52 push %edx -c0202154: 50 push %eax -c0202155: e8 68 fc ff ff call c0201dc2 -c020215a: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:133 (discriminator 1) -c020215d: 0f b7 4d fa movzwl -0x6(%ebp),%ecx -c0202161: 0f b7 c1 movzwl %cx,%eax -c0202164: 69 c0 cd cc 00 00 imul $0xcccd,%eax,%eax -c020216a: c1 e8 10 shr $0x10,%eax -c020216d: 89 c2 mov %eax,%edx -c020216f: 66 c1 ea 06 shr $0x6,%dx -c0202173: 89 d0 mov %edx,%eax -c0202175: c1 e0 02 shl $0x2,%eax -c0202178: 01 d0 add %edx,%eax -c020217a: c1 e0 04 shl $0x4,%eax -c020217d: 29 c1 sub %eax,%ecx -c020217f: 89 ca mov %ecx,%edx -c0202181: 66 85 d2 test %dx,%dx -c0202184: 75 bb jne c0202141 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:135 -c0202186: 90 nop -c0202187: c9 leave -c0202188: c3 ret - -c0202189 : -scroll(): -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:139 -c0202189: 55 push %ebp -c020218a: 89 e5 mov %esp,%ebp -c020218c: 83 ec 58 sub $0x58,%esp -c020218f: 8b 45 08 mov 0x8(%ebp),%eax -c0202192: 66 89 45 b4 mov %ax,-0x4c(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:140 -c0202196: 0f b7 45 b4 movzwl -0x4c(%ebp),%eax -c020219a: 66 89 45 f6 mov %ax,-0xa(%ebp) -c020219e: c7 45 f0 19 00 00 00 movl $0x19,-0x10(%ebp) -c02021a5: 0f bf 55 f6 movswl -0xa(%ebp),%edx -c02021a9: 8b 45 f0 mov -0x10(%ebp),%eax -c02021ac: 39 c2 cmp %eax,%edx -c02021ae: 0f 4e c2 cmovle %edx,%eax -c02021b1: 66 89 45 b4 mov %ax,-0x4c(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:141 -c02021b5: 0f b7 45 b4 movzwl -0x4c(%ebp),%eax -c02021b9: 66 89 45 ee mov %ax,-0x12(%ebp) -c02021bd: c7 45 e8 e7 ff ff ff movl $0xffffffe7,-0x18(%ebp) -c02021c4: 0f bf 55 ee movswl -0x12(%ebp),%edx -c02021c8: 8b 45 e8 mov -0x18(%ebp),%eax -c02021cb: 39 c2 cmp %eax,%edx -c02021cd: 0f 4d c2 cmovge %edx,%eax -c02021d0: 66 89 45 b4 mov %ax,-0x4c(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:143 -c02021d4: 66 83 7d b4 00 cmpw $0x0,-0x4c(%ebp) -c02021d9: 7e 7c jle c0202257 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:144 -c02021db: c7 45 cc 00 00 00 00 movl $0x0,-0x34(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:145 -c02021e2: 81 45 cc 00 80 0b 0c addl $0xc0b8000,-0x34(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:146 -c02021e9: 0f b7 45 b4 movzwl -0x4c(%ebp),%eax -c02021ed: 0f b7 d0 movzwl %ax,%edx -c02021f0: 89 d0 mov %edx,%eax -c02021f2: c1 e0 02 shl $0x2,%eax -c02021f5: 01 d0 add %edx,%eax -c02021f7: c1 e0 05 shl $0x5,%eax -c02021fa: 89 45 c8 mov %eax,-0x38(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:147 -c02021fd: 81 45 c8 00 80 0b 0c addl $0xc0b8000,-0x38(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:148 -c0202204: 0f bf 55 b4 movswl -0x4c(%ebp),%edx -c0202208: 89 d0 mov %edx,%eax -c020220a: c1 e0 02 shl $0x2,%eax -c020220d: 01 d0 add %edx,%eax -c020220f: c1 e0 05 shl $0x5,%eax -c0202212: 89 45 c4 mov %eax,-0x3c(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:149 -c0202215: b8 a0 0f 00 00 mov $0xfa0,%eax -c020221a: 2b 45 c4 sub -0x3c(%ebp),%eax -c020221d: 89 45 c0 mov %eax,-0x40(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:151 -c0202220: 83 ec 04 sub $0x4,%esp -c0202223: ff 75 c0 push -0x40(%ebp) -c0202226: ff 75 c8 push -0x38(%ebp) -c0202229: ff 75 cc push -0x34(%ebp) -c020222c: e8 14 10 00 00 call c0203245 -c0202231: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:153 -c0202234: 8b 55 cc mov -0x34(%ebp),%edx -c0202237: 8b 45 c0 mov -0x40(%ebp),%eax -c020223a: 01 d0 add %edx,%eax -c020223c: 89 45 bc mov %eax,-0x44(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:154 -c020223f: 83 ec 04 sub $0x4,%esp -c0202242: ff 75 c4 push -0x3c(%ebp) -c0202245: 6a 00 push $0x0 -c0202247: ff 75 bc push -0x44(%ebp) -c020224a: e8 c5 0f 00 00 call c0203214 -c020224f: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:169 -c0202252: e9 83 00 00 00 jmp c02022da -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:155 -c0202257: 66 83 7d b4 00 cmpw $0x0,-0x4c(%ebp) -c020225c: 79 7c jns c02022da -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:156 -c020225e: 0f b7 45 b4 movzwl -0x4c(%ebp),%eax -c0202262: f7 d8 neg %eax -c0202264: 66 89 45 e6 mov %ax,-0x1a(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:157 -c0202268: 0f b7 45 e6 movzwl -0x1a(%ebp),%eax -c020226c: 0f b7 d0 movzwl %ax,%edx -c020226f: 89 d0 mov %edx,%eax -c0202271: c1 e0 02 shl $0x2,%eax -c0202274: 01 d0 add %edx,%eax -c0202276: c1 e0 05 shl $0x5,%eax -c0202279: 89 45 e0 mov %eax,-0x20(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:158 -c020227c: 81 45 e0 00 80 0b 0c addl $0xc0b8000,-0x20(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:159 -c0202283: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:160 -c020228a: 81 45 dc 00 80 0b 0c addl $0xc0b8000,-0x24(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:161 -c0202291: 0f bf 55 e6 movswl -0x1a(%ebp),%edx -c0202295: 89 d0 mov %edx,%eax -c0202297: c1 e0 02 shl $0x2,%eax -c020229a: 01 d0 add %edx,%eax -c020229c: c1 e0 05 shl $0x5,%eax -c020229f: 89 45 d8 mov %eax,-0x28(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:162 -c02022a2: b8 a0 0f 00 00 mov $0xfa0,%eax -c02022a7: 2b 45 d8 sub -0x28(%ebp),%eax -c02022aa: 89 45 d4 mov %eax,-0x2c(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:164 -c02022ad: 83 ec 04 sub $0x4,%esp -c02022b0: ff 75 d4 push -0x2c(%ebp) -c02022b3: ff 75 dc push -0x24(%ebp) -c02022b6: ff 75 e0 push -0x20(%ebp) -c02022b9: e8 87 0f 00 00 call c0203245 -c02022be: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:166 -c02022c1: 8b 45 dc mov -0x24(%ebp),%eax -c02022c4: 89 45 d0 mov %eax,-0x30(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:167 -c02022c7: 83 ec 04 sub $0x4,%esp -c02022ca: ff 75 d8 push -0x28(%ebp) -c02022cd: 6a 00 push $0x0 -c02022cf: ff 75 d0 push -0x30(%ebp) -c02022d2: e8 3d 0f 00 00 call c0203214 -c02022d7: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:169 -c02022da: 90 nop -c02022db: c9 leave -c02022dc: c3 ret - -c02022dd : -param12vga_color(): -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:173 -c02022dd: 55 push %ebp -c02022de: 89 e5 mov %esp,%ebp -c02022e0: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:174 -c02022e3: 8b 45 08 mov 0x8(%ebp),%eax -c02022e6: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02022ea: 83 e0 01 and $0x1,%eax -c02022ed: 88 45 ff mov %al,-0x1(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:175 -c02022f0: 8b 45 08 mov 0x8(%ebp),%eax -c02022f3: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02022f7: 83 e0 06 and $0x6,%eax -c02022fa: 89 c2 mov %eax,%edx -c02022fc: 8b 45 08 mov 0x8(%ebp),%eax -c02022ff: 66 89 50 14 mov %dx,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:176 -c0202303: 8b 45 08 mov 0x8(%ebp),%eax -c0202306: 0f b7 50 14 movzwl 0x14(%eax),%edx -c020230a: 8b 45 08 mov 0x8(%ebp),%eax -c020230d: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202311: 66 c1 f8 02 sar $0x2,%ax -c0202315: 09 c2 or %eax,%edx -c0202317: 8b 45 08 mov 0x8(%ebp),%eax -c020231a: 66 89 50 14 mov %dx,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:177 -c020231e: 8b 45 08 mov 0x8(%ebp),%eax -c0202321: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202325: 83 e0 03 and $0x3,%eax -c0202328: 89 c2 mov %eax,%edx -c020232a: 8b 45 08 mov 0x8(%ebp),%eax -c020232d: 66 89 50 14 mov %dx,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:178 -c0202331: 8b 45 08 mov 0x8(%ebp),%eax -c0202334: 0f b7 50 14 movzwl 0x14(%eax),%edx -c0202338: 0f b6 45 ff movzbl -0x1(%ebp),%eax -c020233c: c1 e0 02 shl $0x2,%eax -c020233f: 09 c2 or %eax,%edx -c0202341: 8b 45 08 mov 0x8(%ebp),%eax -c0202344: 66 89 50 14 mov %dx,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:179 -c0202348: 90 nop -c0202349: c9 leave -c020234a: c3 ret - -c020234b : -set_color(): -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:183 -c020234b: 55 push %ebp -c020234c: 89 e5 mov %esp,%ebp -c020234e: 83 ec 08 sub $0x8,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:184 -c0202351: 8b 45 08 mov 0x8(%ebp),%eax -c0202354: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202358: 66 85 c0 test %ax,%ax -c020235b: 75 0e jne c020236b -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:185 -c020235d: 8b 45 08 mov 0x8(%ebp),%eax -c0202360: 66 c7 40 04 00 0f movw $0xf00,0x4(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:211 -c0202366: e9 1e 02 00 00 jmp c0202589 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:186 -c020236b: 8b 45 08 mov 0x8(%ebp),%eax -c020236e: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202372: 66 83 f8 01 cmp $0x1,%ax -c0202376: 75 19 jne c0202391 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:187 -c0202378: 8b 45 08 mov 0x8(%ebp),%eax -c020237b: 0f b7 40 04 movzwl 0x4(%eax),%eax -c020237f: 66 0d 00 88 or $0x8800,%ax -c0202383: 89 c2 mov %eax,%edx -c0202385: 8b 45 08 mov 0x8(%ebp),%eax -c0202388: 66 89 50 04 mov %dx,0x4(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:211 -c020238c: e9 f8 01 00 00 jmp c0202589 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:188 -c0202391: 8b 45 08 mov 0x8(%ebp),%eax -c0202394: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202398: 66 83 f8 02 cmp $0x2,%ax -c020239c: 75 19 jne c02023b7 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:189 -c020239e: 8b 45 08 mov 0x8(%ebp),%eax -c02023a1: 0f b7 40 04 movzwl 0x4(%eax),%eax -c02023a5: 66 25 00 77 and $0x7700,%ax -c02023a9: 89 c2 mov %eax,%edx -c02023ab: 8b 45 08 mov 0x8(%ebp),%eax -c02023ae: 66 89 50 04 mov %dx,0x4(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:211 -c02023b2: e9 d2 01 00 00 jmp c0202589 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:190 -c02023b7: 8b 45 08 mov 0x8(%ebp),%eax -c02023ba: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02023be: 66 83 f8 1d cmp $0x1d,%ax -c02023c2: 7e 58 jle c020241c -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:190 (discriminator 1) -c02023c4: 8b 45 08 mov 0x8(%ebp),%eax -c02023c7: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02023cb: 66 83 f8 25 cmp $0x25,%ax -c02023cf: 7f 4b jg c020241c -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:191 -c02023d1: 8b 45 08 mov 0x8(%ebp),%eax -c02023d4: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02023d8: 83 e8 1e sub $0x1e,%eax -c02023db: 89 c2 mov %eax,%edx -c02023dd: 8b 45 08 mov 0x8(%ebp),%eax -c02023e0: 66 89 50 14 mov %dx,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:192 -c02023e4: ff 75 08 push 0x8(%ebp) -c02023e7: e8 f1 fe ff ff call c02022dd -c02023ec: 83 c4 04 add $0x4,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:193 -c02023ef: 8b 45 08 mov 0x8(%ebp),%eax -c02023f2: 0f b7 40 04 movzwl 0x4(%eax),%eax -c02023f6: 80 e4 f8 and $0xf8,%ah -c02023f9: 89 c2 mov %eax,%edx -c02023fb: 8b 45 08 mov 0x8(%ebp),%eax -c02023fe: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202402: 0f b7 c0 movzwl %ax,%eax -c0202405: c1 e0 08 shl $0x8,%eax -c0202408: 66 25 00 0f and $0xf00,%ax -c020240c: 09 d0 or %edx,%eax -c020240e: 89 c2 mov %eax,%edx -c0202410: 8b 45 08 mov 0x8(%ebp),%eax -c0202413: 66 89 50 04 mov %dx,0x4(%eax) -c0202417: e9 6d 01 00 00 jmp c0202589 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:194 -c020241c: 8b 45 08 mov 0x8(%ebp),%eax -c020241f: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202423: 66 83 f8 27 cmp $0x27,%ax -c0202427: 7e 54 jle c020247d -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:194 (discriminator 1) -c0202429: 8b 45 08 mov 0x8(%ebp),%eax -c020242c: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202430: 66 83 f8 2f cmp $0x2f,%ax -c0202434: 7f 47 jg c020247d -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:195 -c0202436: 8b 45 08 mov 0x8(%ebp),%eax -c0202439: 0f b7 40 14 movzwl 0x14(%eax),%eax -c020243d: 83 e8 28 sub $0x28,%eax -c0202440: 89 c2 mov %eax,%edx -c0202442: 8b 45 08 mov 0x8(%ebp),%eax -c0202445: 66 89 50 14 mov %dx,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:196 -c0202449: ff 75 08 push 0x8(%ebp) -c020244c: e8 8c fe ff ff call c02022dd -c0202451: 83 c4 04 add $0x4,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:197 -c0202454: 8b 45 08 mov 0x8(%ebp),%eax -c0202457: 0f b7 40 04 movzwl 0x4(%eax),%eax -c020245b: 80 e4 8f and $0x8f,%ah -c020245e: 89 c2 mov %eax,%edx -c0202460: 8b 45 08 mov 0x8(%ebp),%eax -c0202463: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202467: 0f b7 c0 movzwl %ax,%eax -c020246a: c1 e0 0c shl $0xc,%eax -c020246d: 09 d0 or %edx,%eax -c020246f: 89 c2 mov %eax,%edx -c0202471: 8b 45 08 mov 0x8(%ebp),%eax -c0202474: 66 89 50 04 mov %dx,0x4(%eax) -c0202478: e9 0c 01 00 00 jmp c0202589 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:198 -c020247d: 8b 45 08 mov 0x8(%ebp),%eax -c0202480: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202484: 66 83 f8 59 cmp $0x59,%ax -c0202488: 7e 6b jle c02024f5 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:198 (discriminator 1) -c020248a: 8b 45 08 mov 0x8(%ebp),%eax -c020248d: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202491: 66 83 f8 61 cmp $0x61,%ax -c0202495: 7f 5e jg c02024f5 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:199 -c0202497: 8b 45 08 mov 0x8(%ebp),%eax -c020249a: 0f b7 40 14 movzwl 0x14(%eax),%eax -c020249e: 83 e8 5a sub $0x5a,%eax -c02024a1: 89 c2 mov %eax,%edx -c02024a3: 8b 45 08 mov 0x8(%ebp),%eax -c02024a6: 66 89 50 14 mov %dx,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:200 -c02024aa: ff 75 08 push 0x8(%ebp) -c02024ad: e8 2b fe ff ff call c02022dd -c02024b2: 83 c4 04 add $0x4,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:201 -c02024b5: 8b 45 08 mov 0x8(%ebp),%eax -c02024b8: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02024bc: 83 c8 08 or $0x8,%eax -c02024bf: 89 c2 mov %eax,%edx -c02024c1: 8b 45 08 mov 0x8(%ebp),%eax -c02024c4: 66 89 50 14 mov %dx,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:202 -c02024c8: 8b 45 08 mov 0x8(%ebp),%eax -c02024cb: 0f b7 40 04 movzwl 0x4(%eax),%eax -c02024cf: 80 e4 f0 and $0xf0,%ah -c02024d2: 89 c2 mov %eax,%edx -c02024d4: 8b 45 08 mov 0x8(%ebp),%eax -c02024d7: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02024db: 0f b7 c0 movzwl %ax,%eax -c02024de: c1 e0 08 shl $0x8,%eax -c02024e1: 66 25 00 0f and $0xf00,%ax -c02024e5: 09 d0 or %edx,%eax -c02024e7: 89 c2 mov %eax,%edx -c02024e9: 8b 45 08 mov 0x8(%ebp),%eax -c02024ec: 66 89 50 04 mov %dx,0x4(%eax) -c02024f0: e9 94 00 00 00 jmp c0202589 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:203 -c02024f5: 8b 45 08 mov 0x8(%ebp),%eax -c02024f8: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02024fc: 66 83 f8 63 cmp $0x63,%ax -c0202500: 7e 65 jle c0202567 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:203 (discriminator 1) -c0202502: 8b 45 08 mov 0x8(%ebp),%eax -c0202505: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202509: 66 83 f8 6b cmp $0x6b,%ax -c020250d: 7f 58 jg c0202567 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:204 -c020250f: 8b 45 08 mov 0x8(%ebp),%eax -c0202512: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202516: 83 e8 64 sub $0x64,%eax -c0202519: 89 c2 mov %eax,%edx -c020251b: 8b 45 08 mov 0x8(%ebp),%eax -c020251e: 66 89 50 14 mov %dx,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:205 -c0202522: ff 75 08 push 0x8(%ebp) -c0202525: e8 b3 fd ff ff call c02022dd -c020252a: 83 c4 04 add $0x4,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:206 -c020252d: 8b 45 08 mov 0x8(%ebp),%eax -c0202530: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202534: 83 c8 08 or $0x8,%eax -c0202537: 89 c2 mov %eax,%edx -c0202539: 8b 45 08 mov 0x8(%ebp),%eax -c020253c: 66 89 50 14 mov %dx,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:207 -c0202540: 8b 45 08 mov 0x8(%ebp),%eax -c0202543: 0f b7 40 04 movzwl 0x4(%eax),%eax -c0202547: 66 25 ff 0f and $0xfff,%ax -c020254b: 89 c2 mov %eax,%edx -c020254d: 8b 45 08 mov 0x8(%ebp),%eax -c0202550: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202554: 0f b7 c0 movzwl %ax,%eax -c0202557: c1 e0 0c shl $0xc,%eax -c020255a: 09 d0 or %edx,%eax -c020255c: 89 c2 mov %eax,%edx -c020255e: 8b 45 08 mov 0x8(%ebp),%eax -c0202561: 66 89 50 04 mov %dx,0x4(%eax) -c0202565: eb 22 jmp c0202589 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:209 -c0202567: 8b 45 08 mov 0x8(%ebp),%eax -c020256a: 0f b7 40 14 movzwl 0x14(%eax),%eax -c020256e: 98 cwtl -c020256f: 50 push %eax -c0202570: 68 14 48 20 c0 push $0xc0204814 -c0202575: 68 d1 00 00 00 push $0xd1 -c020257a: 68 27 48 20 c0 push $0xc0204827 -c020257f: e8 7e ec ff ff call c0201202 <_warn> -c0202584: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:211 -c0202587: eb 00 jmp c0202589 -c0202589: 90 nop -c020258a: c9 leave -c020258b: c3 ret - -c020258c : -CSI_handler(): -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:215 -c020258c: 55 push %ebp -c020258d: 89 e5 mov %esp,%ebp -c020258f: 53 push %ebx -c0202590: 83 ec 14 sub $0x14,%esp -c0202593: 8b 45 08 mov 0x8(%ebp),%eax -c0202596: 88 45 f4 mov %al,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:216 -c0202599: 8b 45 0c mov 0xc(%ebp),%eax -c020259c: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:218 -c02025a3: 0f b6 45 f4 movzbl -0xc(%ebp),%eax -c02025a7: 83 e8 41 sub $0x41,%eax -c02025aa: 83 f8 2c cmp $0x2c,%eax -c02025ad: 0f 87 47 02 00 00 ja c02027fa -c02025b3: 8b 04 85 50 48 20 c0 mov -0x3fdfb7b0(,%eax,4),%eax -c02025ba: ff e0 jmp *%eax -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:220 -c02025bc: 8b 45 0c mov 0xc(%ebp),%eax -c02025bf: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02025c3: 66 85 c0 test %ax,%ax -c02025c6: 75 09 jne c02025d1 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:221 -c02025c8: 8b 45 0c mov 0xc(%ebp),%eax -c02025cb: 66 c7 40 14 01 00 movw $0x1,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:222 -c02025d1: 8b 45 0c mov 0xc(%ebp),%eax -c02025d4: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02025d8: f7 d8 neg %eax -c02025da: 98 cwtl -c02025db: ff 75 0c push 0xc(%ebp) -c02025de: 6a 00 push $0x0 -c02025e0: 50 push %eax -c02025e1: e8 28 f8 ff ff call c0201e0e -c02025e6: 83 c4 0c add $0xc,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:223 -c02025e9: e9 29 02 00 00 jmp c0202817 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:225 -c02025ee: 8b 45 0c mov 0xc(%ebp),%eax -c02025f1: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02025f5: 66 85 c0 test %ax,%ax -c02025f8: 75 09 jne c0202603 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:226 -c02025fa: 8b 45 0c mov 0xc(%ebp),%eax -c02025fd: 66 c7 40 14 01 00 movw $0x1,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:227 -c0202603: 8b 45 0c mov 0xc(%ebp),%eax -c0202606: 0f b7 40 14 movzwl 0x14(%eax),%eax -c020260a: 98 cwtl -c020260b: ff 75 0c push 0xc(%ebp) -c020260e: 6a 00 push $0x0 -c0202610: 50 push %eax -c0202611: e8 f8 f7 ff ff call c0201e0e -c0202616: 83 c4 0c add $0xc,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:228 -c0202619: e9 f9 01 00 00 jmp c0202817 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:230 -c020261e: 8b 45 0c mov 0xc(%ebp),%eax -c0202621: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202625: 66 85 c0 test %ax,%ax -c0202628: 75 09 jne c0202633 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:231 -c020262a: 8b 45 0c mov 0xc(%ebp),%eax -c020262d: 66 c7 40 14 01 00 movw $0x1,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:232 -c0202633: 8b 45 0c mov 0xc(%ebp),%eax -c0202636: 0f b7 40 14 movzwl 0x14(%eax),%eax -c020263a: 98 cwtl -c020263b: ff 75 0c push 0xc(%ebp) -c020263e: 50 push %eax -c020263f: 6a 00 push $0x0 -c0202641: e8 c8 f7 ff ff call c0201e0e -c0202646: 83 c4 0c add $0xc,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:233 -c0202649: e9 c9 01 00 00 jmp c0202817 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:235 -c020264e: 8b 45 0c mov 0xc(%ebp),%eax -c0202651: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202655: 66 85 c0 test %ax,%ax -c0202658: 75 09 jne c0202663 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:236 -c020265a: 8b 45 0c mov 0xc(%ebp),%eax -c020265d: 66 c7 40 14 01 00 movw $0x1,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:237 -c0202663: 8b 45 0c mov 0xc(%ebp),%eax -c0202666: 0f b7 40 14 movzwl 0x14(%eax),%eax -c020266a: f7 d8 neg %eax -c020266c: 98 cwtl -c020266d: ff 75 0c push 0xc(%ebp) -c0202670: 50 push %eax -c0202671: 6a 00 push $0x0 -c0202673: e8 96 f7 ff ff call c0201e0e -c0202678: 83 c4 0c add $0xc,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:238 -c020267b: e9 97 01 00 00 jmp c0202817 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:240 -c0202680: 8b 45 0c mov 0xc(%ebp),%eax -c0202683: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202687: 66 85 c0 test %ax,%ax -c020268a: 75 09 jne c0202695 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:241 -c020268c: 8b 45 0c mov 0xc(%ebp),%eax -c020268f: 66 c7 40 14 01 00 movw $0x1,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:242 -c0202695: 8b 45 0c mov 0xc(%ebp),%eax -c0202698: 0f b7 40 08 movzwl 0x8(%eax),%eax -c020269c: 89 c2 mov %eax,%edx -c020269e: b8 01 00 00 00 mov $0x1,%eax -c02026a3: 29 d0 sub %edx,%eax -c02026a5: 0f bf d0 movswl %ax,%edx -c02026a8: 8b 45 0c mov 0xc(%ebp),%eax -c02026ab: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02026af: 98 cwtl -c02026b0: ff 75 0c push 0xc(%ebp) -c02026b3: 52 push %edx -c02026b4: 50 push %eax -c02026b5: e8 54 f7 ff ff call c0201e0e -c02026ba: 83 c4 0c add $0xc,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:243 -c02026bd: e9 55 01 00 00 jmp c0202817 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:245 -c02026c2: 8b 45 0c mov 0xc(%ebp),%eax -c02026c5: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02026c9: 66 85 c0 test %ax,%ax -c02026cc: 75 09 jne c02026d7 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:246 -c02026ce: 8b 45 0c mov 0xc(%ebp),%eax -c02026d1: 66 c7 40 14 01 00 movw $0x1,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:247 -c02026d7: 8b 45 0c mov 0xc(%ebp),%eax -c02026da: 0f b7 40 08 movzwl 0x8(%eax),%eax -c02026de: 89 c2 mov %eax,%edx -c02026e0: b8 01 00 00 00 mov $0x1,%eax -c02026e5: 29 d0 sub %edx,%eax -c02026e7: 0f bf d0 movswl %ax,%edx -c02026ea: 8b 45 0c mov 0xc(%ebp),%eax -c02026ed: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02026f1: f7 d8 neg %eax -c02026f3: 98 cwtl -c02026f4: ff 75 0c push 0xc(%ebp) -c02026f7: 52 push %edx -c02026f8: 50 push %eax -c02026f9: e8 10 f7 ff ff call c0201e0e -c02026fe: 83 c4 0c add $0xc,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:248 -c0202701: e9 11 01 00 00 jmp c0202817 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:250 -c0202706: 8b 45 0c mov 0xc(%ebp),%eax -c0202709: 0f b7 40 14 movzwl 0x14(%eax),%eax -c020270d: 66 85 c0 test %ax,%ax -c0202710: 75 09 jne c020271b -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:251 -c0202712: 8b 45 0c mov 0xc(%ebp),%eax -c0202715: 66 c7 40 14 01 00 movw $0x1,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:252 -c020271b: 8b 45 0c mov 0xc(%ebp),%eax -c020271e: 0f b7 40 16 movzwl 0x16(%eax),%eax -c0202722: 66 85 c0 test %ax,%ax -c0202725: 75 09 jne c0202730 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:253 -c0202727: 8b 45 0c mov 0xc(%ebp),%eax -c020272a: 66 c7 40 16 01 00 movw $0x1,0x16(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:255 -c0202730: 8b 45 0c mov 0xc(%ebp),%eax -c0202733: 0f b7 40 16 movzwl 0x16(%eax),%eax -c0202737: 89 c2 mov %eax,%edx -c0202739: 8b 45 0c mov 0xc(%ebp),%eax -c020273c: 0f b7 40 08 movzwl 0x8(%eax),%eax -c0202740: 89 c1 mov %eax,%ecx -c0202742: 89 d0 mov %edx,%eax -c0202744: 29 c8 sub %ecx,%eax -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:254 -c0202746: 0f bf d0 movswl %ax,%edx -c0202749: 8b 45 0c mov 0xc(%ebp),%eax -c020274c: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202750: 89 c1 mov %eax,%ecx -c0202752: 8b 45 0c mov 0xc(%ebp),%eax -c0202755: 0f b7 40 06 movzwl 0x6(%eax),%eax -c0202759: 89 c3 mov %eax,%ebx -c020275b: 89 c8 mov %ecx,%eax -c020275d: 29 d8 sub %ebx,%eax -c020275f: 98 cwtl -c0202760: ff 75 0c push 0xc(%ebp) -c0202763: 52 push %edx -c0202764: 50 push %eax -c0202765: e8 a4 f6 ff ff call c0201e0e -c020276a: 83 c4 0c add $0xc,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:256 -c020276d: e9 a5 00 00 00 jmp c0202817 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:258 -c0202772: ff 75 0c push 0xc(%ebp) -c0202775: e8 d3 f7 ff ff call c0201f4d -c020277a: 83 c4 04 add $0x4,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:259 -c020277d: e9 95 00 00 00 jmp c0202817 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:261 -c0202782: ff 75 0c push 0xc(%ebp) -c0202785: e8 a6 f8 ff ff call c0202030 -c020278a: 83 c4 04 add $0x4,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:262 -c020278d: e9 85 00 00 00 jmp c0202817 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:264 -c0202792: 8b 45 0c mov 0xc(%ebp),%eax -c0202795: 0f b7 40 14 movzwl 0x14(%eax),%eax -c0202799: 66 85 c0 test %ax,%ax -c020279c: 75 09 jne c02027a7 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:265 -c020279e: 8b 45 0c mov 0xc(%ebp),%eax -c02027a1: 66 c7 40 14 01 00 movw $0x1,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:266 -c02027a7: 8b 45 0c mov 0xc(%ebp),%eax -c02027aa: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02027ae: 98 cwtl -c02027af: 83 ec 0c sub $0xc,%esp -c02027b2: 50 push %eax -c02027b3: e8 d1 f9 ff ff call c0202189 -c02027b8: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:267 -c02027bb: eb 5a jmp c0202817 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:269 -c02027bd: 8b 45 0c mov 0xc(%ebp),%eax -c02027c0: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02027c4: 66 85 c0 test %ax,%ax -c02027c7: 75 09 jne c02027d2 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:270 -c02027c9: 8b 45 0c mov 0xc(%ebp),%eax -c02027cc: 66 c7 40 14 01 00 movw $0x1,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:271 -c02027d2: 8b 45 0c mov 0xc(%ebp),%eax -c02027d5: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02027d9: f7 d8 neg %eax -c02027db: 98 cwtl -c02027dc: 83 ec 0c sub $0xc,%esp -c02027df: 50 push %eax -c02027e0: e8 a4 f9 ff ff call c0202189 -c02027e5: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:272 -c02027e8: eb 2d jmp c0202817 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:274 -c02027ea: 83 ec 0c sub $0xc,%esp -c02027ed: ff 75 0c push 0xc(%ebp) -c02027f0: e8 56 fb ff ff call c020234b -c02027f5: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:275 -c02027f8: eb 1d jmp c0202817 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:277 -c02027fa: 0f b6 45 f4 movzbl -0xc(%ebp),%eax -c02027fe: 50 push %eax -c02027ff: 68 3b 48 20 c0 push $0xc020483b -c0202804: 68 15 01 00 00 push $0x115 -c0202809: 68 27 48 20 c0 push $0xc0204827 -c020280e: e8 ef e9 ff ff call c0201202 <_warn> -c0202813: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:278 -c0202816: 90 nop -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:280 -c0202817: 90 nop -c0202818: 8b 5d fc mov -0x4(%ebp),%ebx -c020281b: c9 leave -c020281c: c3 ret - -c020281d : -kprintfputch(): -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:284 -c020281d: 55 push %ebp -c020281e: 89 e5 mov %esp,%ebp -c0202820: 83 ec 18 sub $0x18,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:285 -c0202823: 81 65 08 ff 00 00 00 andl $0xff,0x8(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:286 -c020282a: 8b 45 0c mov 0xc(%ebp),%eax -c020282d: 8b 40 0c mov 0xc(%eax),%eax -c0202830: 8d 50 01 lea 0x1(%eax),%edx -c0202833: 8b 45 0c mov 0xc(%ebp),%eax -c0202836: 89 50 0c mov %edx,0xc(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:289 -c0202839: 8b 45 0c mov 0xc(%ebp),%eax -c020283c: 8b 40 10 mov 0x10(%eax),%eax -c020283f: 85 c0 test %eax,%eax -c0202841: 0f 85 1b 01 00 00 jne c0202962 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:290 -c0202847: 83 7d 08 1b cmpl $0x1b,0x8(%ebp) -c020284b: 0f 84 a4 00 00 00 je c02028f5 -c0202851: 83 7d 08 1b cmpl $0x1b,0x8(%ebp) -c0202855: 0f 8f ae 00 00 00 jg c0202909 -c020285b: 83 7d 08 0a cmpl $0xa,0x8(%ebp) -c020285f: 74 70 je c02028d1 -c0202861: 83 7d 08 0a cmpl $0xa,0x8(%ebp) -c0202865: 0f 8f 9e 00 00 00 jg c0202909 -c020286b: 83 7d 08 08 cmpl $0x8,0x8(%ebp) -c020286f: 74 0b je c020287c -c0202871: 83 7d 08 09 cmpl $0x9,0x8(%ebp) -c0202875: 74 15 je c020288c -c0202877: e9 8d 00 00 00 jmp c0202909 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:292 -c020287c: ff 75 0c push 0xc(%ebp) -c020287f: e8 27 f6 ff ff call c0201eab -c0202884: 83 c4 04 add $0x4,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:293 -c0202887: e9 ec 01 00 00 jmp c0202a78 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:295 -c020288c: ff 75 0c push 0xc(%ebp) -c020288f: e8 54 f5 ff ff call c0201de8 -c0202894: 83 c4 04 add $0x4,%esp -c0202897: 66 3d cf 07 cmp $0x7cf,%ax -c020289b: 0f 84 d0 01 00 00 je c0202a71 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:297 -c02028a1: eb 0b jmp c02028ae -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:298 -c02028a3: ff 75 0c push 0xc(%ebp) -c02028a6: e8 51 f6 ff ff call c0201efc -c02028ab: 83 c4 04 add $0x4,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:297 -c02028ae: 8b 45 0c mov 0xc(%ebp),%eax -c02028b1: 0f b7 40 08 movzwl 0x8(%eax),%eax -c02028b5: 89 c2 mov %eax,%edx -c02028b7: 66 c1 fa 0f sar $0xf,%dx -c02028bb: 66 c1 ea 0e shr $0xe,%dx -c02028bf: 01 d0 add %edx,%eax -c02028c1: 83 e0 03 and $0x3,%eax -c02028c4: 29 d0 sub %edx,%eax -c02028c6: 66 83 f8 01 cmp $0x1,%ax -c02028ca: 75 d7 jne c02028a3 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:299 -c02028cc: e9 a7 01 00 00 jmp c0202a78 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:301 -c02028d1: 8b 45 0c mov 0xc(%ebp),%eax -c02028d4: 0f b7 40 08 movzwl 0x8(%eax),%eax -c02028d8: 89 c2 mov %eax,%edx -c02028da: b8 01 00 00 00 mov $0x1,%eax -c02028df: 29 d0 sub %edx,%eax -c02028e1: 98 cwtl -c02028e2: ff 75 0c push 0xc(%ebp) -c02028e5: 50 push %eax -c02028e6: 6a 01 push $0x1 -c02028e8: e8 21 f5 ff ff call c0201e0e -c02028ed: 83 c4 0c add $0xc,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:302 -c02028f0: e9 83 01 00 00 jmp c0202a78 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:304 -c02028f5: 8b 45 0c mov 0xc(%ebp),%eax -c02028f8: 8b 40 10 mov 0x10(%eax),%eax -c02028fb: 8d 50 01 lea 0x1(%eax),%edx -c02028fe: 8b 45 0c mov 0xc(%ebp),%eax -c0202901: 89 50 10 mov %edx,0x10(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:305 -c0202904: e9 6f 01 00 00 jmp c0202a78 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:308 -c0202909: 8b 45 0c mov 0xc(%ebp),%eax -c020290c: 0f b7 40 06 movzwl 0x6(%eax),%eax -c0202910: 89 c2 mov %eax,%edx -c0202912: 89 d0 mov %edx,%eax -c0202914: c1 e0 02 shl $0x2,%eax -c0202917: 01 d0 add %edx,%eax -c0202919: c1 e0 04 shl $0x4,%eax -c020291c: 89 c2 mov %eax,%edx -c020291e: 8b 45 0c mov 0xc(%ebp),%eax -c0202921: 0f b7 40 08 movzwl 0x8(%eax),%eax -c0202925: 01 d0 add %edx,%eax -c0202927: 83 e8 51 sub $0x51,%eax -c020292a: 66 89 45 f6 mov %ax,-0xa(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:309 -c020292e: 8b 45 0c mov 0xc(%ebp),%eax -c0202931: 0f b7 40 04 movzwl 0x4(%eax),%eax -c0202935: 89 c2 mov %eax,%edx -c0202937: 8b 45 08 mov 0x8(%ebp),%eax -c020293a: 09 d0 or %edx,%eax -c020293c: 66 89 45 f4 mov %ax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:310 -c0202940: 0f b7 55 f4 movzwl -0xc(%ebp),%edx -c0202944: 0f b7 45 f6 movzwl -0xa(%ebp),%eax -c0202948: 52 push %edx -c0202949: 50 push %eax -c020294a: e8 73 f4 ff ff call c0201dc2 -c020294f: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:311 -c0202952: ff 75 0c push 0xc(%ebp) -c0202955: e8 a2 f5 ff ff call c0201efc -c020295a: 83 c4 04 add $0x4,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:312 -c020295d: e9 16 01 00 00 jmp c0202a78 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:315 -c0202962: 8b 45 0c mov 0xc(%ebp),%eax -c0202965: 8b 40 10 mov 0x10(%eax),%eax -c0202968: 83 f8 01 cmp $0x1,%eax -c020296b: 75 40 jne c02029ad -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:316 -c020296d: 83 7d 08 5b cmpl $0x5b,0x8(%ebp) -c0202971: 75 2b jne c020299e -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:318 -c0202973: 8b 45 0c mov 0xc(%ebp),%eax -c0202976: 8b 40 10 mov 0x10(%eax),%eax -c0202979: 8d 50 01 lea 0x1(%eax),%edx -c020297c: 8b 45 0c mov 0xc(%ebp),%eax -c020297f: 89 50 10 mov %edx,0x10(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:319 -c0202982: 8b 45 0c mov 0xc(%ebp),%eax -c0202985: 66 c7 40 16 00 00 movw $0x0,0x16(%eax) -c020298b: 8b 45 0c mov 0xc(%ebp),%eax -c020298e: 0f b7 50 16 movzwl 0x16(%eax),%edx -c0202992: 8b 45 0c mov 0xc(%ebp),%eax -c0202995: 66 89 50 14 mov %dx,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:320 -c0202999: e9 da 00 00 00 jmp c0202a78 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:322 -c020299e: 8b 45 0c mov 0xc(%ebp),%eax -c02029a1: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:323 -c02029a8: e9 cb 00 00 00 jmp c0202a78 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:326 -c02029ad: 83 7d 08 39 cmpl $0x39,0x8(%ebp) -c02029b1: 7f 08 jg c02029bb -c02029b3: 83 7d 08 30 cmpl $0x30,0x8(%ebp) -c02029b7: 7d 0a jge c02029c3 -c02029b9: eb 7d jmp c0202a38 -c02029bb: 83 7d 08 3b cmpl $0x3b,0x8(%ebp) -c02029bf: 74 66 je c0202a27 -c02029c1: eb 75 jmp c0202a38 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:337 -c02029c3: 8b 45 0c mov 0xc(%ebp),%eax -c02029c6: 8b 40 10 mov 0x10(%eax),%eax -c02029c9: 83 f8 02 cmp $0x2,%eax -c02029cc: 75 27 jne c02029f5 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:338 -c02029ce: 8b 45 0c mov 0xc(%ebp),%eax -c02029d1: 0f b7 40 14 movzwl 0x14(%eax),%eax -c02029d5: 89 c2 mov %eax,%edx -c02029d7: 89 d0 mov %edx,%eax -c02029d9: c1 e0 02 shl $0x2,%eax -c02029dc: 01 d0 add %edx,%eax -c02029de: 01 c0 add %eax,%eax -c02029e0: 89 c2 mov %eax,%edx -c02029e2: 8b 45 08 mov 0x8(%ebp),%eax -c02029e5: 01 d0 add %edx,%eax -c02029e7: 83 e8 30 sub $0x30,%eax -c02029ea: 89 c2 mov %eax,%edx -c02029ec: 8b 45 0c mov 0xc(%ebp),%eax -c02029ef: 66 89 50 14 mov %dx,0x14(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:343 -c02029f3: eb 7f jmp c0202a74 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:339 -c02029f5: 8b 45 0c mov 0xc(%ebp),%eax -c02029f8: 8b 40 10 mov 0x10(%eax),%eax -c02029fb: 83 f8 03 cmp $0x3,%eax -c02029fe: 75 74 jne c0202a74 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:340 -c0202a00: 8b 45 0c mov 0xc(%ebp),%eax -c0202a03: 0f b7 40 16 movzwl 0x16(%eax),%eax -c0202a07: 89 c2 mov %eax,%edx -c0202a09: 89 d0 mov %edx,%eax -c0202a0b: c1 e0 02 shl $0x2,%eax -c0202a0e: 01 d0 add %edx,%eax -c0202a10: 01 c0 add %eax,%eax -c0202a12: 89 c2 mov %eax,%edx -c0202a14: 8b 45 08 mov 0x8(%ebp),%eax -c0202a17: 01 d0 add %edx,%eax -c0202a19: 83 e8 30 sub $0x30,%eax -c0202a1c: 89 c2 mov %eax,%edx -c0202a1e: 8b 45 0c mov 0xc(%ebp),%eax -c0202a21: 66 89 50 16 mov %dx,0x16(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:343 -c0202a25: eb 4d jmp c0202a74 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:345 -c0202a27: 8b 45 0c mov 0xc(%ebp),%eax -c0202a2a: 8b 40 10 mov 0x10(%eax),%eax -c0202a2d: 8d 50 01 lea 0x1(%eax),%edx -c0202a30: 8b 45 0c mov 0xc(%ebp),%eax -c0202a33: 89 50 10 mov %edx,0x10(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:346 -c0202a36: eb 40 jmp c0202a78 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:348 -c0202a38: 83 7d 08 1f cmpl $0x1f,0x8(%ebp) -c0202a3c: 7e 06 jle c0202a44 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:348 (discriminator 1) -c0202a3e: 83 7d 08 7e cmpl $0x7e,0x8(%ebp) -c0202a42: 7e 0a jle c0202a4e -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:349 -c0202a44: 8b 45 0c mov 0xc(%ebp),%eax -c0202a47: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:350 -c0202a4e: 83 7d 08 3f cmpl $0x3f,0x8(%ebp) -c0202a52: 7e 23 jle c0202a77 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:350 (discriminator 1) -c0202a54: 83 7d 08 7e cmpl $0x7e,0x8(%ebp) -c0202a58: 7f 1d jg c0202a77 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:351 -c0202a5a: 8b 45 08 mov 0x8(%ebp),%eax -c0202a5d: 0f b6 c0 movzbl %al,%eax -c0202a60: 83 ec 08 sub $0x8,%esp -c0202a63: ff 75 0c push 0xc(%ebp) -c0202a66: 50 push %eax -c0202a67: e8 20 fb ff ff call c020258c -c0202a6c: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:352 -c0202a6f: eb 06 jmp c0202a77 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:296 -c0202a71: 90 nop -c0202a72: eb 04 jmp c0202a78 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:343 -c0202a74: 90 nop -c0202a75: eb 01 jmp c0202a78 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:352 -c0202a77: 90 nop -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:355 -c0202a78: 90 nop -c0202a79: c9 leave -c0202a7a: c3 ret - -c0202a7b : -vkprintf(): -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:359 -c0202a7b: 55 push %ebp -c0202a7c: 89 e5 mov %esp,%ebp -c0202a7e: 83 ec 18 sub $0x18,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:360 -c0202a81: 90 nop -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:360 (discriminator 1) -c0202a82: 6a 01 push $0x1 -c0202a84: 68 a0 79 20 c0 push $0xc02079a0 -c0202a89: e8 1a f3 ff ff call c0201da8 -c0202a8e: 83 c4 08 add $0x8,%esp -c0202a91: 83 f8 01 cmp $0x1,%eax -c0202a94: 74 ec je c0202a82 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:362 -c0202a96: c7 05 ac 79 20 c0 00 movl $0x0,0xc02079ac -c0202a9d: 00 00 00 -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:363 -c0202aa0: ff 75 0c push 0xc(%ebp) -c0202aa3: ff 75 08 push 0x8(%ebp) -c0202aa6: 68 a0 79 20 c0 push $0xc02079a0 -c0202aab: 68 1d 28 20 c0 push $0xc020281d -c0202ab0: e8 92 01 00 00 call c0202c47 -c0202ab5: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:365 -c0202ab8: a1 ac 79 20 c0 mov 0xc02079ac,%eax -c0202abd: 89 45 f4 mov %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:366 -c0202ac0: 83 ec 08 sub $0x8,%esp -c0202ac3: 6a 00 push $0x0 -c0202ac5: 68 a0 79 20 c0 push $0xc02079a0 -c0202aca: e8 d9 f2 ff ff call c0201da8 -c0202acf: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:368 -c0202ad2: 8b 45 f4 mov -0xc(%ebp),%eax -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:369 -c0202ad5: c9 leave -c0202ad6: c3 ret - -c0202ad7 : -kprintf(): -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:420 -c0202ad7: 55 push %ebp -c0202ad8: 89 e5 mov %esp,%ebp -c0202ada: 83 ec 18 sub $0x18,%esp -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:424 -c0202add: 8d 45 0c lea 0xc(%ebp),%eax -c0202ae0: 89 45 f0 mov %eax,-0x10(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:425 -c0202ae3: 8b 45 f0 mov -0x10(%ebp),%eax -c0202ae6: 83 ec 08 sub $0x8,%esp -c0202ae9: 50 push %eax -c0202aea: ff 75 08 push 0x8(%ebp) -c0202aed: e8 89 ff ff ff call c0202a7b -c0202af2: 83 c4 10 add $0x10,%esp -c0202af5: 89 45 f4 mov %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:428 -c0202af8: 8b 45 f4 mov -0xc(%ebp),%eax -/media/unix/Data/Code/2020301918-os/lib/kern/terminal.c:429 -c0202afb: c9 leave -c0202afc: c3 ret - -c0202afd : -printnum(): -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:19 -c0202afd: 55 push %ebp -c0202afe: 89 e5 mov %esp,%ebp -c0202b00: 53 push %ebx -c0202b01: 83 ec 14 sub $0x14,%esp -c0202b04: 8b 45 10 mov 0x10(%ebp),%eax -c0202b07: 89 45 f0 mov %eax,-0x10(%ebp) -c0202b0a: 8b 45 14 mov 0x14(%ebp),%eax -c0202b0d: 89 45 f4 mov %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:21 -c0202b10: 8b 45 18 mov 0x18(%ebp),%eax -c0202b13: ba 00 00 00 00 mov $0x0,%edx -c0202b18: 8b 4d f4 mov -0xc(%ebp),%ecx -c0202b1b: 39 45 f0 cmp %eax,-0x10(%ebp) -c0202b1e: 19 d1 sbb %edx,%ecx -c0202b20: 72 4b jb c0202b6d -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:22 -c0202b22: 8b 45 1c mov 0x1c(%ebp),%eax -c0202b25: 8d 58 ff lea -0x1(%eax),%ebx -c0202b28: 8b 45 18 mov 0x18(%ebp),%eax -c0202b2b: ba 00 00 00 00 mov $0x0,%edx -c0202b30: 52 push %edx -c0202b31: 50 push %eax -c0202b32: ff 75 f4 push -0xc(%ebp) -c0202b35: ff 75 f0 push -0x10(%ebp) -c0202b38: e8 93 07 00 00 call c02032d0 <__udivdi3> -c0202b3d: 83 c4 10 add $0x10,%esp -c0202b40: 83 ec 04 sub $0x4,%esp -c0202b43: ff 75 20 push 0x20(%ebp) -c0202b46: 53 push %ebx -c0202b47: ff 75 18 push 0x18(%ebp) -c0202b4a: 52 push %edx -c0202b4b: 50 push %eax -c0202b4c: ff 75 0c push 0xc(%ebp) -c0202b4f: ff 75 08 push 0x8(%ebp) -c0202b52: e8 a6 ff ff ff call c0202afd -c0202b57: 83 c4 20 add $0x20,%esp -c0202b5a: eb 1b jmp c0202b77 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:26 -c0202b5c: 83 ec 08 sub $0x8,%esp -c0202b5f: ff 75 0c push 0xc(%ebp) -c0202b62: ff 75 20 push 0x20(%ebp) -c0202b65: 8b 45 08 mov 0x8(%ebp),%eax -c0202b68: ff d0 call *%eax -c0202b6a: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:25 -c0202b6d: 83 6d 1c 01 subl $0x1,0x1c(%ebp) -c0202b71: 83 7d 1c 00 cmpl $0x0,0x1c(%ebp) -c0202b75: 7f e5 jg c0202b5c -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:30 -c0202b77: 8b 4d 18 mov 0x18(%ebp),%ecx -c0202b7a: bb 00 00 00 00 mov $0x0,%ebx -c0202b7f: 8b 45 f0 mov -0x10(%ebp),%eax -c0202b82: 8b 55 f4 mov -0xc(%ebp),%edx -c0202b85: 53 push %ebx -c0202b86: 51 push %ecx -c0202b87: 52 push %edx -c0202b88: 50 push %eax -c0202b89: e8 62 08 00 00 call c02033f0 <__umoddi3> -c0202b8e: 83 c4 10 add $0x10,%esp -c0202b91: 05 04 49 20 c0 add $0xc0204904,%eax -c0202b96: 0f b6 00 movzbl (%eax),%eax -c0202b99: 0f be c0 movsbl %al,%eax -c0202b9c: 83 ec 08 sub $0x8,%esp -c0202b9f: ff 75 0c push 0xc(%ebp) -c0202ba2: 50 push %eax -c0202ba3: 8b 45 08 mov 0x8(%ebp),%eax -c0202ba6: ff d0 call *%eax -c0202ba8: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:31 -c0202bab: 90 nop -c0202bac: 8b 5d fc mov -0x4(%ebp),%ebx -c0202baf: c9 leave -c0202bb0: c3 ret - -c0202bb1 : -getuint(): -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:37 -c0202bb1: 55 push %ebp -c0202bb2: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:38 -c0202bb4: 83 7d 0c 01 cmpl $0x1,0xc(%ebp) -c0202bb8: 7e 14 jle c0202bce -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:39 -c0202bba: 8b 45 08 mov 0x8(%ebp),%eax -c0202bbd: 8b 00 mov (%eax),%eax -c0202bbf: 8d 48 08 lea 0x8(%eax),%ecx -c0202bc2: 8b 55 08 mov 0x8(%ebp),%edx -c0202bc5: 89 0a mov %ecx,(%edx) -c0202bc7: 8b 50 04 mov 0x4(%eax),%edx -c0202bca: 8b 00 mov (%eax),%eax -c0202bcc: eb 30 jmp c0202bfe -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:40 -c0202bce: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) -c0202bd2: 74 16 je c0202bea -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:41 -c0202bd4: 8b 45 08 mov 0x8(%ebp),%eax -c0202bd7: 8b 00 mov (%eax),%eax -c0202bd9: 8d 48 04 lea 0x4(%eax),%ecx -c0202bdc: 8b 55 08 mov 0x8(%ebp),%edx -c0202bdf: 89 0a mov %ecx,(%edx) -c0202be1: 8b 00 mov (%eax),%eax -c0202be3: ba 00 00 00 00 mov $0x0,%edx -c0202be8: eb 14 jmp c0202bfe -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:43 -c0202bea: 8b 45 08 mov 0x8(%ebp),%eax -c0202bed: 8b 00 mov (%eax),%eax -c0202bef: 8d 48 04 lea 0x4(%eax),%ecx -c0202bf2: 8b 55 08 mov 0x8(%ebp),%edx -c0202bf5: 89 0a mov %ecx,(%edx) -c0202bf7: 8b 00 mov (%eax),%eax -c0202bf9: ba 00 00 00 00 mov $0x0,%edx -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:44 -c0202bfe: 5d pop %ebp -c0202bff: c3 ret - -c0202c00 : -getint(): -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:50 -c0202c00: 55 push %ebp -c0202c01: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:51 -c0202c03: 83 7d 0c 01 cmpl $0x1,0xc(%ebp) -c0202c07: 7e 14 jle c0202c1d -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:52 -c0202c09: 8b 45 08 mov 0x8(%ebp),%eax -c0202c0c: 8b 00 mov (%eax),%eax -c0202c0e: 8d 48 08 lea 0x8(%eax),%ecx -c0202c11: 8b 55 08 mov 0x8(%ebp),%edx -c0202c14: 89 0a mov %ecx,(%edx) -c0202c16: 8b 50 04 mov 0x4(%eax),%edx -c0202c19: 8b 00 mov (%eax),%eax -c0202c1b: eb 28 jmp c0202c45 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:53 -c0202c1d: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) -c0202c21: 74 12 je c0202c35 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:54 -c0202c23: 8b 45 08 mov 0x8(%ebp),%eax -c0202c26: 8b 00 mov (%eax),%eax -c0202c28: 8d 48 04 lea 0x4(%eax),%ecx -c0202c2b: 8b 55 08 mov 0x8(%ebp),%edx -c0202c2e: 89 0a mov %ecx,(%edx) -c0202c30: 8b 00 mov (%eax),%eax -c0202c32: 99 cltd -c0202c33: eb 10 jmp c0202c45 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:56 -c0202c35: 8b 45 08 mov 0x8(%ebp),%eax -c0202c38: 8b 00 mov (%eax),%eax -c0202c3a: 8d 48 04 lea 0x4(%eax),%ecx -c0202c3d: 8b 55 08 mov 0x8(%ebp),%edx -c0202c40: 89 0a mov %ecx,(%edx) -c0202c42: 8b 00 mov (%eax),%eax -c0202c44: 99 cltd -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:57 -c0202c45: 5d pop %ebp -c0202c46: c3 ret - -c0202c47 : -vprintfmt(): -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:64 -c0202c47: 55 push %ebp -c0202c48: 89 e5 mov %esp,%ebp -c0202c4a: 56 push %esi -c0202c4b: 53 push %ebx -c0202c4c: 83 ec 20 sub $0x20,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:72 -c0202c4f: eb 17 jmp c0202c68 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:73 -c0202c51: 85 db test %ebx,%ebx -c0202c53: 0f 84 4d 03 00 00 je c0202fa6 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:75 -c0202c59: 83 ec 08 sub $0x8,%esp -c0202c5c: ff 75 0c push 0xc(%ebp) -c0202c5f: 53 push %ebx -c0202c60: 8b 45 08 mov 0x8(%ebp),%eax -c0202c63: ff d0 call *%eax -c0202c65: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:72 -c0202c68: 8b 45 10 mov 0x10(%ebp),%eax -c0202c6b: 8d 50 01 lea 0x1(%eax),%edx -c0202c6e: 89 55 10 mov %edx,0x10(%ebp) -c0202c71: 0f b6 00 movzbl (%eax),%eax -c0202c74: 0f b6 d8 movzbl %al,%ebx -c0202c77: 83 fb 25 cmp $0x25,%ebx -c0202c7a: 75 d5 jne c0202c51 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:79 -c0202c7c: c6 45 db 20 movb $0x20,-0x25(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:80 -c0202c80: c7 45 e4 ff ff ff ff movl $0xffffffff,-0x1c(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:81 -c0202c87: c7 45 e0 ff ff ff ff movl $0xffffffff,-0x20(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:82 -c0202c8e: c7 45 e8 00 00 00 00 movl $0x0,-0x18(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:83 -c0202c95: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:85 -c0202c9c: 8b 45 10 mov 0x10(%ebp),%eax -c0202c9f: 8d 50 01 lea 0x1(%eax),%edx -c0202ca2: 89 55 10 mov %edx,0x10(%ebp) -c0202ca5: 0f b6 00 movzbl (%eax),%eax -c0202ca8: 0f b6 d8 movzbl %al,%ebx -c0202cab: 8d 43 dd lea -0x23(%ebx),%eax -c0202cae: 83 f8 55 cmp $0x55,%eax -c0202cb1: 0f 87 c2 02 00 00 ja c0202f79 -c0202cb7: 8b 04 85 1c 49 20 c0 mov -0x3fdfb6e4(,%eax,4),%eax -c0202cbe: ff e0 jmp *%eax -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:89 -c0202cc0: c6 45 db 2d movb $0x2d,-0x25(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:90 -c0202cc4: eb d6 jmp c0202c9c -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:94 -c0202cc6: c6 45 db 30 movb $0x30,-0x25(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:95 -c0202cca: eb d0 jmp c0202c9c -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:107 -c0202ccc: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:108 -c0202cd3: 8b 55 e0 mov -0x20(%ebp),%edx -c0202cd6: 89 d0 mov %edx,%eax -c0202cd8: c1 e0 02 shl $0x2,%eax -c0202cdb: 01 d0 add %edx,%eax -c0202cdd: 01 c0 add %eax,%eax -c0202cdf: 01 d8 add %ebx,%eax -c0202ce1: 83 e8 30 sub $0x30,%eax -c0202ce4: 89 45 e0 mov %eax,-0x20(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:109 -c0202ce7: 8b 45 10 mov 0x10(%ebp),%eax -c0202cea: 0f b6 00 movzbl (%eax),%eax -c0202ced: 0f be d8 movsbl %al,%ebx -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:110 -c0202cf0: 83 fb 2f cmp $0x2f,%ebx -c0202cf3: 7e 39 jle c0202d2e -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:110 (discriminator 1) -c0202cf5: 83 fb 39 cmp $0x39,%ebx -c0202cf8: 7f 34 jg c0202d2e -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:107 -c0202cfa: 83 45 10 01 addl $0x1,0x10(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:108 -c0202cfe: eb d3 jmp c0202cd3 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:116 -c0202d00: 8b 45 14 mov 0x14(%ebp),%eax -c0202d03: 8d 50 04 lea 0x4(%eax),%edx -c0202d06: 89 55 14 mov %edx,0x14(%ebp) -c0202d09: 8b 00 mov (%eax),%eax -c0202d0b: 89 45 e0 mov %eax,-0x20(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:117 -c0202d0e: eb 1f jmp c0202d2f -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:120 -c0202d10: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) -c0202d14: 79 86 jns c0202c9c -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:121 -c0202d16: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:122 -c0202d1d: e9 7a ff ff ff jmp c0202c9c -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:125 -c0202d22: c7 45 dc 01 00 00 00 movl $0x1,-0x24(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:126 -c0202d29: e9 6e ff ff ff jmp c0202c9c -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:113 -c0202d2e: 90 nop -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:129 -c0202d2f: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) -c0202d33: 0f 89 63 ff ff ff jns c0202c9c -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:130 -c0202d39: 8b 45 e0 mov -0x20(%ebp),%eax -c0202d3c: 89 45 e4 mov %eax,-0x1c(%ebp) -c0202d3f: c7 45 e0 ff ff ff ff movl $0xffffffff,-0x20(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:131 -c0202d46: e9 51 ff ff ff jmp c0202c9c -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:135 -c0202d4b: 83 45 e8 01 addl $0x1,-0x18(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:136 -c0202d4f: e9 48 ff ff ff jmp c0202c9c -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:140 -c0202d54: 8b 45 14 mov 0x14(%ebp),%eax -c0202d57: 8d 50 04 lea 0x4(%eax),%edx -c0202d5a: 89 55 14 mov %edx,0x14(%ebp) -c0202d5d: 8b 00 mov (%eax),%eax -c0202d5f: 83 ec 08 sub $0x8,%esp -c0202d62: ff 75 0c push 0xc(%ebp) -c0202d65: 50 push %eax -c0202d66: 8b 45 08 mov 0x8(%ebp),%eax -c0202d69: ff d0 call *%eax -c0202d6b: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:141 -c0202d6e: e9 2e 02 00 00 jmp c0202fa1 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:145 -c0202d73: 8b 45 14 mov 0x14(%ebp),%eax -c0202d76: 8d 50 04 lea 0x4(%eax),%edx -c0202d79: 89 55 14 mov %edx,0x14(%ebp) -c0202d7c: 8b 30 mov (%eax),%esi -c0202d7e: 85 f6 test %esi,%esi -c0202d80: 75 05 jne c0202d87 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:146 -c0202d82: be 15 49 20 c0 mov $0xc0204915,%esi -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:147 -c0202d87: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) -c0202d8b: 7e 6f jle c0202dfc -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:147 (discriminator 1) -c0202d8d: 80 7d db 2d cmpb $0x2d,-0x25(%ebp) -c0202d91: 74 69 je c0202dfc -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:148 -c0202d93: 8b 45 e0 mov -0x20(%ebp),%eax -c0202d96: 83 ec 08 sub $0x8,%esp -c0202d99: 50 push %eax -c0202d9a: 56 push %esi -c0202d9b: e8 0d 03 00 00 call c02030ad -c0202da0: 83 c4 10 add $0x10,%esp -c0202da3: 29 45 e4 sub %eax,-0x1c(%ebp) -c0202da6: eb 17 jmp c0202dbf -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:149 (discriminator 3) -c0202da8: 0f be 45 db movsbl -0x25(%ebp),%eax -c0202dac: 83 ec 08 sub $0x8,%esp -c0202daf: ff 75 0c push 0xc(%ebp) -c0202db2: 50 push %eax -c0202db3: 8b 45 08 mov 0x8(%ebp),%eax -c0202db6: ff d0 call *%eax -c0202db8: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:148 (discriminator 3) -c0202dbb: 83 6d e4 01 subl $0x1,-0x1c(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:148 (discriminator 1) -c0202dbf: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) -c0202dc3: 7f e3 jg c0202da8 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:150 -c0202dc5: eb 35 jmp c0202dfc -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:151 -c0202dc7: 83 7d dc 00 cmpl $0x0,-0x24(%ebp) -c0202dcb: 74 1c je c0202de9 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:151 (discriminator 1) -c0202dcd: 83 fb 1f cmp $0x1f,%ebx -c0202dd0: 7e 05 jle c0202dd7 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:151 (discriminator 2) -c0202dd2: 83 fb 7e cmp $0x7e,%ebx -c0202dd5: 7e 12 jle c0202de9 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:152 -c0202dd7: 83 ec 08 sub $0x8,%esp -c0202dda: ff 75 0c push 0xc(%ebp) -c0202ddd: 6a 3f push $0x3f -c0202ddf: 8b 45 08 mov 0x8(%ebp),%eax -c0202de2: ff d0 call *%eax -c0202de4: 83 c4 10 add $0x10,%esp -c0202de7: eb 0f jmp c0202df8 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:154 -c0202de9: 83 ec 08 sub $0x8,%esp -c0202dec: ff 75 0c push 0xc(%ebp) -c0202def: 53 push %ebx -c0202df0: 8b 45 08 mov 0x8(%ebp),%eax -c0202df3: ff d0 call *%eax -c0202df5: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:150 -c0202df8: 83 6d e4 01 subl $0x1,-0x1c(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:150 (discriminator 1) -c0202dfc: 89 f0 mov %esi,%eax -c0202dfe: 8d 70 01 lea 0x1(%eax),%esi -c0202e01: 0f b6 00 movzbl (%eax),%eax -c0202e04: 0f be d8 movsbl %al,%ebx -c0202e07: 85 db test %ebx,%ebx -c0202e09: 74 26 je c0202e31 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:150 (discriminator 2) -c0202e0b: 83 7d e0 00 cmpl $0x0,-0x20(%ebp) -c0202e0f: 78 b6 js c0202dc7 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:150 (discriminator 3) -c0202e11: 83 6d e0 01 subl $0x1,-0x20(%ebp) -c0202e15: 83 7d e0 00 cmpl $0x0,-0x20(%ebp) -c0202e19: 79 ac jns c0202dc7 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:155 -c0202e1b: eb 14 jmp c0202e31 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:156 (discriminator 2) -c0202e1d: 83 ec 08 sub $0x8,%esp -c0202e20: ff 75 0c push 0xc(%ebp) -c0202e23: 6a 20 push $0x20 -c0202e25: 8b 45 08 mov 0x8(%ebp),%eax -c0202e28: ff d0 call *%eax -c0202e2a: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:155 (discriminator 2) -c0202e2d: 83 6d e4 01 subl $0x1,-0x1c(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:155 (discriminator 1) -c0202e31: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) -c0202e35: 7f e6 jg c0202e1d -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:157 -c0202e37: e9 65 01 00 00 jmp c0202fa1 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:161 -c0202e3c: 83 ec 08 sub $0x8,%esp -c0202e3f: ff 75 e8 push -0x18(%ebp) -c0202e42: 8d 45 14 lea 0x14(%ebp),%eax -c0202e45: 50 push %eax -c0202e46: e8 b5 fd ff ff call c0202c00 -c0202e4b: 83 c4 10 add $0x10,%esp -c0202e4e: 89 45 f0 mov %eax,-0x10(%ebp) -c0202e51: 89 55 f4 mov %edx,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:162 -c0202e54: 8b 45 f0 mov -0x10(%ebp),%eax -c0202e57: 8b 55 f4 mov -0xc(%ebp),%edx -c0202e5a: 85 d2 test %edx,%edx -c0202e5c: 79 23 jns c0202e81 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:163 -c0202e5e: 83 ec 08 sub $0x8,%esp -c0202e61: ff 75 0c push 0xc(%ebp) -c0202e64: 6a 2d push $0x2d -c0202e66: 8b 45 08 mov 0x8(%ebp),%eax -c0202e69: ff d0 call *%eax -c0202e6b: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:164 -c0202e6e: 8b 45 f0 mov -0x10(%ebp),%eax -c0202e71: 8b 55 f4 mov -0xc(%ebp),%edx -c0202e74: f7 d8 neg %eax -c0202e76: 83 d2 00 adc $0x0,%edx -c0202e79: f7 da neg %edx -c0202e7b: 89 45 f0 mov %eax,-0x10(%ebp) -c0202e7e: 89 55 f4 mov %edx,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:166 -c0202e81: c7 45 ec 0a 00 00 00 movl $0xa,-0x14(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:167 -c0202e88: e9 b6 00 00 00 jmp c0202f43 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:171 -c0202e8d: 83 ec 08 sub $0x8,%esp -c0202e90: ff 75 e8 push -0x18(%ebp) -c0202e93: 8d 45 14 lea 0x14(%ebp),%eax -c0202e96: 50 push %eax -c0202e97: e8 15 fd ff ff call c0202bb1 -c0202e9c: 83 c4 10 add $0x10,%esp -c0202e9f: 89 45 f0 mov %eax,-0x10(%ebp) -c0202ea2: 89 55 f4 mov %edx,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:172 -c0202ea5: c7 45 ec 0a 00 00 00 movl $0xa,-0x14(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:173 -c0202eac: e9 92 00 00 00 jmp c0202f43 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:178 -c0202eb1: 83 ec 08 sub $0x8,%esp -c0202eb4: ff 75 0c push 0xc(%ebp) -c0202eb7: 6a 58 push $0x58 -c0202eb9: 8b 45 08 mov 0x8(%ebp),%eax -c0202ebc: ff d0 call *%eax -c0202ebe: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:179 -c0202ec1: 83 ec 08 sub $0x8,%esp -c0202ec4: ff 75 0c push 0xc(%ebp) -c0202ec7: 6a 58 push $0x58 -c0202ec9: 8b 45 08 mov 0x8(%ebp),%eax -c0202ecc: ff d0 call *%eax -c0202ece: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:180 -c0202ed1: 83 ec 08 sub $0x8,%esp -c0202ed4: ff 75 0c push 0xc(%ebp) -c0202ed7: 6a 58 push $0x58 -c0202ed9: 8b 45 08 mov 0x8(%ebp),%eax -c0202edc: ff d0 call *%eax -c0202ede: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:181 -c0202ee1: e9 bb 00 00 00 jmp c0202fa1 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:185 -c0202ee6: 83 ec 08 sub $0x8,%esp -c0202ee9: ff 75 0c push 0xc(%ebp) -c0202eec: 6a 30 push $0x30 -c0202eee: 8b 45 08 mov 0x8(%ebp),%eax -c0202ef1: ff d0 call *%eax -c0202ef3: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:186 -c0202ef6: 83 ec 08 sub $0x8,%esp -c0202ef9: ff 75 0c push 0xc(%ebp) -c0202efc: 6a 78 push $0x78 -c0202efe: 8b 45 08 mov 0x8(%ebp),%eax -c0202f01: ff d0 call *%eax -c0202f03: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:188 -c0202f06: 8b 45 14 mov 0x14(%ebp),%eax -c0202f09: 8d 50 04 lea 0x4(%eax),%edx -c0202f0c: 89 55 14 mov %edx,0x14(%ebp) -c0202f0f: 8b 00 mov (%eax),%eax -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:187 -c0202f11: 89 45 f0 mov %eax,-0x10(%ebp) -c0202f14: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:189 -c0202f1b: c7 45 ec 10 00 00 00 movl $0x10,-0x14(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:190 -c0202f22: eb 1f jmp c0202f43 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:194 -c0202f24: 83 ec 08 sub $0x8,%esp -c0202f27: ff 75 e8 push -0x18(%ebp) -c0202f2a: 8d 45 14 lea 0x14(%ebp),%eax -c0202f2d: 50 push %eax -c0202f2e: e8 7e fc ff ff call c0202bb1 -c0202f33: 83 c4 10 add $0x10,%esp -c0202f36: 89 45 f0 mov %eax,-0x10(%ebp) -c0202f39: 89 55 f4 mov %edx,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:195 -c0202f3c: c7 45 ec 10 00 00 00 movl $0x10,-0x14(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:197 -c0202f43: 0f be 55 db movsbl -0x25(%ebp),%edx -c0202f47: 8b 45 ec mov -0x14(%ebp),%eax -c0202f4a: 83 ec 04 sub $0x4,%esp -c0202f4d: 52 push %edx -c0202f4e: ff 75 e4 push -0x1c(%ebp) -c0202f51: 50 push %eax -c0202f52: ff 75 f4 push -0xc(%ebp) -c0202f55: ff 75 f0 push -0x10(%ebp) -c0202f58: ff 75 0c push 0xc(%ebp) -c0202f5b: ff 75 08 push 0x8(%ebp) -c0202f5e: e8 9a fb ff ff call c0202afd -c0202f63: 83 c4 20 add $0x20,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:198 -c0202f66: eb 39 jmp c0202fa1 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:202 -c0202f68: 83 ec 08 sub $0x8,%esp -c0202f6b: ff 75 0c push 0xc(%ebp) -c0202f6e: 53 push %ebx -c0202f6f: 8b 45 08 mov 0x8(%ebp),%eax -c0202f72: ff d0 call *%eax -c0202f74: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:203 -c0202f77: eb 28 jmp c0202fa1 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:207 -c0202f79: 83 ec 08 sub $0x8,%esp -c0202f7c: ff 75 0c push 0xc(%ebp) -c0202f7f: 6a 25 push $0x25 -c0202f81: 8b 45 08 mov 0x8(%ebp),%eax -c0202f84: ff d0 call *%eax -c0202f86: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:208 -c0202f89: 83 6d 10 01 subl $0x1,0x10(%ebp) -c0202f8d: eb 04 jmp c0202f93 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:208 (discriminator 3) -c0202f8f: 83 6d 10 01 subl $0x1,0x10(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:208 (discriminator 1) -c0202f93: 8b 45 10 mov 0x10(%ebp),%eax -c0202f96: 83 e8 01 sub $0x1,%eax -c0202f99: 0f b6 00 movzbl (%eax),%eax -c0202f9c: 3c 25 cmp $0x25,%al -c0202f9e: 75 ef jne c0202f8f -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:210 -c0202fa0: 90 nop -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:72 (discriminator 1) -c0202fa1: e9 c2 fc ff ff jmp c0202c68 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:74 -c0202fa6: 90 nop -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:213 -c0202fa7: 8d 65 f8 lea -0x8(%ebp),%esp -c0202faa: 5b pop %ebx -c0202fab: 5e pop %esi -c0202fac: 5d pop %ebp -c0202fad: c3 ret - -c0202fae : -printfmt(): -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:217 -c0202fae: 55 push %ebp -c0202faf: 89 e5 mov %esp,%ebp -c0202fb1: 83 ec 18 sub $0x18,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:220 -c0202fb4: 8d 45 14 lea 0x14(%ebp),%eax -c0202fb7: 89 45 f4 mov %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:221 -c0202fba: 8b 45 f4 mov -0xc(%ebp),%eax -c0202fbd: 50 push %eax -c0202fbe: ff 75 10 push 0x10(%ebp) -c0202fc1: ff 75 0c push 0xc(%ebp) -c0202fc4: ff 75 08 push 0x8(%ebp) -c0202fc7: e8 7b fc ff ff call c0202c47 -c0202fcc: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:223 -c0202fcf: 90 nop -c0202fd0: c9 leave -c0202fd1: c3 ret - -c0202fd2 : -sprintputch(): -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:233 -c0202fd2: 55 push %ebp -c0202fd3: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:234 -c0202fd5: 8b 45 0c mov 0xc(%ebp),%eax -c0202fd8: 8b 40 08 mov 0x8(%eax),%eax -c0202fdb: 8d 50 01 lea 0x1(%eax),%edx -c0202fde: 8b 45 0c mov 0xc(%ebp),%eax -c0202fe1: 89 50 08 mov %edx,0x8(%eax) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:235 -c0202fe4: 8b 45 0c mov 0xc(%ebp),%eax -c0202fe7: 8b 10 mov (%eax),%edx -c0202fe9: 8b 45 0c mov 0xc(%ebp),%eax -c0202fec: 8b 40 04 mov 0x4(%eax),%eax -c0202fef: 39 c2 cmp %eax,%edx -c0202ff1: 73 12 jae c0203005 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:236 -c0202ff3: 8b 45 0c mov 0xc(%ebp),%eax -c0202ff6: 8b 00 mov (%eax),%eax -c0202ff8: 8d 48 01 lea 0x1(%eax),%ecx -c0202ffb: 8b 55 0c mov 0xc(%ebp),%edx -c0202ffe: 89 0a mov %ecx,(%edx) -c0203000: 8b 55 08 mov 0x8(%ebp),%edx -c0203003: 88 10 mov %dl,(%eax) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:237 -c0203005: 90 nop -c0203006: 5d pop %ebp -c0203007: c3 ret - -c0203008 : -vsnprintf(): -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:241 -c0203008: 55 push %ebp -c0203009: 89 e5 mov %esp,%ebp -c020300b: 83 ec 18 sub $0x18,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:242 -c020300e: 8b 45 08 mov 0x8(%ebp),%eax -c0203011: 89 45 ec mov %eax,-0x14(%ebp) -c0203014: 8b 45 0c mov 0xc(%ebp),%eax -c0203017: 8d 50 ff lea -0x1(%eax),%edx -c020301a: 8b 45 08 mov 0x8(%ebp),%eax -c020301d: 01 d0 add %edx,%eax -c020301f: 89 45 f0 mov %eax,-0x10(%ebp) -c0203022: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:244 -c0203029: 83 7d 08 00 cmpl $0x0,0x8(%ebp) -c020302d: 74 06 je c0203035 -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:244 (discriminator 1) -c020302f: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) -c0203033: 7f 07 jg c020303c -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:245 -c0203035: b8 ff ff ff ff mov $0xffffffff,%eax -c020303a: eb 20 jmp c020305c -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:248 -c020303c: ff 75 14 push 0x14(%ebp) -c020303f: ff 75 10 push 0x10(%ebp) -c0203042: 8d 45 ec lea -0x14(%ebp),%eax -c0203045: 50 push %eax -c0203046: 68 d2 2f 20 c0 push $0xc0202fd2 -c020304b: e8 f7 fb ff ff call c0202c47 -c0203050: 83 c4 10 add $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:251 -c0203053: 8b 45 ec mov -0x14(%ebp),%eax -c0203056: c6 00 00 movb $0x0,(%eax) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:253 -c0203059: 8b 45 f4 mov -0xc(%ebp),%eax -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:254 (discriminator 1) -c020305c: c9 leave -c020305d: c3 ret - -c020305e : -snprintf(): -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:258 -c020305e: 55 push %ebp -c020305f: 89 e5 mov %esp,%ebp -c0203061: 83 ec 18 sub $0x18,%esp -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:262 -c0203064: 8d 45 14 lea 0x14(%ebp),%eax -c0203067: 89 45 f0 mov %eax,-0x10(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:263 -c020306a: 8b 45 f0 mov -0x10(%ebp),%eax -c020306d: 50 push %eax -c020306e: ff 75 10 push 0x10(%ebp) -c0203071: ff 75 0c push 0xc(%ebp) -c0203074: ff 75 08 push 0x8(%ebp) -c0203077: e8 8c ff ff ff call c0203008 -c020307c: 83 c4 10 add $0x10,%esp -c020307f: 89 45 f4 mov %eax,-0xc(%ebp) -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:266 -c0203082: 8b 45 f4 mov -0xc(%ebp),%eax -/media/unix/Data/Code/2020301918-os/lib/printfmt.c:267 -c0203085: c9 leave -c0203086: c3 ret - -c0203087 : -strlen(): -/media/unix/Data/Code/2020301918-os/lib/string.c:5 -c0203087: 55 push %ebp -c0203088: 89 e5 mov %esp,%ebp -c020308a: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/string.c:8 -c020308d: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) -c0203094: eb 08 jmp c020309e -/media/unix/Data/Code/2020301918-os/lib/string.c:9 (discriminator 3) -c0203096: 83 45 fc 01 addl $0x1,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/lib/string.c:8 (discriminator 3) -c020309a: 83 45 08 01 addl $0x1,0x8(%ebp) -/media/unix/Data/Code/2020301918-os/lib/string.c:8 (discriminator 1) -c020309e: 8b 45 08 mov 0x8(%ebp),%eax -c02030a1: 0f b6 00 movzbl (%eax),%eax -c02030a4: 84 c0 test %al,%al -c02030a6: 75 ee jne c0203096 -/media/unix/Data/Code/2020301918-os/lib/string.c:10 -c02030a8: 8b 45 fc mov -0x4(%ebp),%eax -/media/unix/Data/Code/2020301918-os/lib/string.c:11 -c02030ab: c9 leave -c02030ac: c3 ret - -c02030ad : -strnlen(): -/media/unix/Data/Code/2020301918-os/lib/string.c:15 -c02030ad: 55 push %ebp -c02030ae: 89 e5 mov %esp,%ebp -c02030b0: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/string.c:18 -c02030b3: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) -c02030ba: eb 0c jmp c02030c8 -/media/unix/Data/Code/2020301918-os/lib/string.c:19 (discriminator 4) -c02030bc: 83 45 fc 01 addl $0x1,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/lib/string.c:18 (discriminator 4) -c02030c0: 83 45 08 01 addl $0x1,0x8(%ebp) -c02030c4: 83 6d 0c 01 subl $0x1,0xc(%ebp) -/media/unix/Data/Code/2020301918-os/lib/string.c:18 (discriminator 1) -c02030c8: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) -c02030cc: 74 0a je c02030d8 -/media/unix/Data/Code/2020301918-os/lib/string.c:18 (discriminator 3) -c02030ce: 8b 45 08 mov 0x8(%ebp),%eax -c02030d1: 0f b6 00 movzbl (%eax),%eax -c02030d4: 84 c0 test %al,%al -c02030d6: 75 e4 jne c02030bc -/media/unix/Data/Code/2020301918-os/lib/string.c:20 -c02030d8: 8b 45 fc mov -0x4(%ebp),%eax -/media/unix/Data/Code/2020301918-os/lib/string.c:21 -c02030db: c9 leave -c02030dc: c3 ret - -c02030dd : -strcpy(): -/media/unix/Data/Code/2020301918-os/lib/string.c:25 -c02030dd: 55 push %ebp -c02030de: 89 e5 mov %esp,%ebp -c02030e0: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/string.c:28 -c02030e3: 8b 45 08 mov 0x8(%ebp),%eax -c02030e6: 89 45 fc mov %eax,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/lib/string.c:29 -c02030e9: 90 nop -/media/unix/Data/Code/2020301918-os/lib/string.c:29 (discriminator 1) -c02030ea: 8b 55 0c mov 0xc(%ebp),%edx -c02030ed: 8d 42 01 lea 0x1(%edx),%eax -c02030f0: 89 45 0c mov %eax,0xc(%ebp) -c02030f3: 8b 45 08 mov 0x8(%ebp),%eax -c02030f6: 8d 48 01 lea 0x1(%eax),%ecx -c02030f9: 89 4d 08 mov %ecx,0x8(%ebp) -c02030fc: 0f b6 12 movzbl (%edx),%edx -c02030ff: 88 10 mov %dl,(%eax) -c0203101: 0f b6 00 movzbl (%eax),%eax -c0203104: 84 c0 test %al,%al -c0203106: 75 e2 jne c02030ea -/media/unix/Data/Code/2020301918-os/lib/string.c:31 -c0203108: 8b 45 fc mov -0x4(%ebp),%eax -/media/unix/Data/Code/2020301918-os/lib/string.c:32 -c020310b: c9 leave -c020310c: c3 ret - -c020310d : -strcat(): -/media/unix/Data/Code/2020301918-os/lib/string.c:36 -c020310d: 55 push %ebp -c020310e: 89 e5 mov %esp,%ebp -c0203110: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/string.c:37 -c0203113: ff 75 08 push 0x8(%ebp) -c0203116: e8 6c ff ff ff call c0203087 -c020311b: 83 c4 04 add $0x4,%esp -c020311e: 89 45 fc mov %eax,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/lib/string.c:38 -c0203121: 8b 55 fc mov -0x4(%ebp),%edx -c0203124: 8b 45 08 mov 0x8(%ebp),%eax -c0203127: 01 d0 add %edx,%eax -c0203129: ff 75 0c push 0xc(%ebp) -c020312c: 50 push %eax -c020312d: e8 ab ff ff ff call c02030dd -c0203132: 83 c4 08 add $0x8,%esp -/media/unix/Data/Code/2020301918-os/lib/string.c:39 -c0203135: 8b 45 08 mov 0x8(%ebp),%eax -/media/unix/Data/Code/2020301918-os/lib/string.c:40 -c0203138: c9 leave -c0203139: c3 ret - -c020313a : -strncpy(): -/media/unix/Data/Code/2020301918-os/lib/string.c:43 -c020313a: 55 push %ebp -c020313b: 89 e5 mov %esp,%ebp -c020313d: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/string.c:47 -c0203140: 8b 45 08 mov 0x8(%ebp),%eax -c0203143: 89 45 f8 mov %eax,-0x8(%ebp) -/media/unix/Data/Code/2020301918-os/lib/string.c:48 -c0203146: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) -c020314d: eb 23 jmp c0203172 -/media/unix/Data/Code/2020301918-os/lib/string.c:49 -c020314f: 8b 45 08 mov 0x8(%ebp),%eax -c0203152: 8d 50 01 lea 0x1(%eax),%edx -c0203155: 89 55 08 mov %edx,0x8(%ebp) -c0203158: 8b 55 0c mov 0xc(%ebp),%edx -c020315b: 0f b6 12 movzbl (%edx),%edx -c020315e: 88 10 mov %dl,(%eax) -/media/unix/Data/Code/2020301918-os/lib/string.c:51 -c0203160: 8b 45 0c mov 0xc(%ebp),%eax -c0203163: 0f b6 00 movzbl (%eax),%eax -c0203166: 84 c0 test %al,%al -c0203168: 74 04 je c020316e -/media/unix/Data/Code/2020301918-os/lib/string.c:52 -c020316a: 83 45 0c 01 addl $0x1,0xc(%ebp) -/media/unix/Data/Code/2020301918-os/lib/string.c:48 (discriminator 2) -c020316e: 83 45 fc 01 addl $0x1,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/lib/string.c:48 (discriminator 1) -c0203172: 8b 45 fc mov -0x4(%ebp),%eax -c0203175: 3b 45 10 cmp 0x10(%ebp),%eax -c0203178: 72 d5 jb c020314f -/media/unix/Data/Code/2020301918-os/lib/string.c:54 -c020317a: 8b 45 f8 mov -0x8(%ebp),%eax -/media/unix/Data/Code/2020301918-os/lib/string.c:55 -c020317d: c9 leave -c020317e: c3 ret - -c020317f : -strcmp(): -/media/unix/Data/Code/2020301918-os/lib/string.c:59 -c020317f: 55 push %ebp -c0203180: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/lib/string.c:60 -c0203182: eb 08 jmp c020318c -/media/unix/Data/Code/2020301918-os/lib/string.c:61 -c0203184: 83 45 08 01 addl $0x1,0x8(%ebp) -c0203188: 83 45 0c 01 addl $0x1,0xc(%ebp) -/media/unix/Data/Code/2020301918-os/lib/string.c:60 -c020318c: 8b 45 08 mov 0x8(%ebp),%eax -c020318f: 0f b6 00 movzbl (%eax),%eax -c0203192: 84 c0 test %al,%al -c0203194: 74 10 je c02031a6 -/media/unix/Data/Code/2020301918-os/lib/string.c:60 (discriminator 1) -c0203196: 8b 45 08 mov 0x8(%ebp),%eax -c0203199: 0f b6 10 movzbl (%eax),%edx -c020319c: 8b 45 0c mov 0xc(%ebp),%eax -c020319f: 0f b6 00 movzbl (%eax),%eax -c02031a2: 38 c2 cmp %al,%dl -c02031a4: 74 de je c0203184 -/media/unix/Data/Code/2020301918-os/lib/string.c:62 -c02031a6: 8b 45 08 mov 0x8(%ebp),%eax -c02031a9: 0f b6 00 movzbl (%eax),%eax -c02031ac: 0f b6 d0 movzbl %al,%edx -c02031af: 8b 45 0c mov 0xc(%ebp),%eax -c02031b2: 0f b6 00 movzbl (%eax),%eax -c02031b5: 0f b6 c8 movzbl %al,%ecx -c02031b8: 89 d0 mov %edx,%eax -c02031ba: 29 c8 sub %ecx,%eax -/media/unix/Data/Code/2020301918-os/lib/string.c:63 -c02031bc: 5d pop %ebp -c02031bd: c3 ret - -c02031be : -strncmp(): -/media/unix/Data/Code/2020301918-os/lib/string.c:67 -c02031be: 55 push %ebp -c02031bf: 89 e5 mov %esp,%ebp -/media/unix/Data/Code/2020301918-os/lib/string.c:68 -c02031c1: eb 0c jmp c02031cf -/media/unix/Data/Code/2020301918-os/lib/string.c:69 -c02031c3: 83 6d 10 01 subl $0x1,0x10(%ebp) -c02031c7: 83 45 08 01 addl $0x1,0x8(%ebp) -c02031cb: 83 45 0c 01 addl $0x1,0xc(%ebp) -/media/unix/Data/Code/2020301918-os/lib/string.c:68 -c02031cf: 83 7d 10 00 cmpl $0x0,0x10(%ebp) -c02031d3: 74 1a je c02031ef -/media/unix/Data/Code/2020301918-os/lib/string.c:68 (discriminator 1) -c02031d5: 8b 45 08 mov 0x8(%ebp),%eax -c02031d8: 0f b6 00 movzbl (%eax),%eax -c02031db: 84 c0 test %al,%al -c02031dd: 74 10 je c02031ef -/media/unix/Data/Code/2020301918-os/lib/string.c:68 (discriminator 2) -c02031df: 8b 45 08 mov 0x8(%ebp),%eax -c02031e2: 0f b6 10 movzbl (%eax),%edx -c02031e5: 8b 45 0c mov 0xc(%ebp),%eax -c02031e8: 0f b6 00 movzbl (%eax),%eax -c02031eb: 38 c2 cmp %al,%dl -c02031ed: 74 d4 je c02031c3 -/media/unix/Data/Code/2020301918-os/lib/string.c:70 -c02031ef: 83 7d 10 00 cmpl $0x0,0x10(%ebp) -c02031f3: 75 07 jne c02031fc -/media/unix/Data/Code/2020301918-os/lib/string.c:71 -c02031f5: b8 00 00 00 00 mov $0x0,%eax -c02031fa: eb 16 jmp c0203212 -/media/unix/Data/Code/2020301918-os/lib/string.c:73 -c02031fc: 8b 45 08 mov 0x8(%ebp),%eax -c02031ff: 0f b6 00 movzbl (%eax),%eax -c0203202: 0f b6 d0 movzbl %al,%edx -c0203205: 8b 45 0c mov 0xc(%ebp),%eax -c0203208: 0f b6 00 movzbl (%eax),%eax -c020320b: 0f b6 c8 movzbl %al,%ecx -c020320e: 89 d0 mov %edx,%eax -c0203210: 29 c8 sub %ecx,%eax -/media/unix/Data/Code/2020301918-os/lib/string.c:74 -c0203212: 5d pop %ebp -c0203213: c3 ret - -c0203214 : -memset(): -/media/unix/Data/Code/2020301918-os/lib/string.c:78 -c0203214: 55 push %ebp -c0203215: 89 e5 mov %esp,%ebp -c0203217: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/string.c:82 -c020321a: 8b 45 08 mov 0x8(%ebp),%eax -c020321d: 89 45 fc mov %eax,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/lib/string.c:83 -c0203220: 8b 45 10 mov 0x10(%ebp),%eax -c0203223: 89 45 f8 mov %eax,-0x8(%ebp) -/media/unix/Data/Code/2020301918-os/lib/string.c:84 -c0203226: eb 0e jmp c0203236 -/media/unix/Data/Code/2020301918-os/lib/string.c:85 -c0203228: 8b 45 fc mov -0x4(%ebp),%eax -c020322b: 8d 50 01 lea 0x1(%eax),%edx -c020322e: 89 55 fc mov %edx,-0x4(%ebp) -c0203231: 8b 55 0c mov 0xc(%ebp),%edx -c0203234: 88 10 mov %dl,(%eax) -/media/unix/Data/Code/2020301918-os/lib/string.c:84 -c0203236: 83 6d f8 01 subl $0x1,-0x8(%ebp) -c020323a: 83 7d f8 00 cmpl $0x0,-0x8(%ebp) -c020323e: 79 e8 jns c0203228 -/media/unix/Data/Code/2020301918-os/lib/string.c:87 -c0203240: 8b 45 08 mov 0x8(%ebp),%eax -/media/unix/Data/Code/2020301918-os/lib/string.c:88 -c0203243: c9 leave -c0203244: c3 ret - -c0203245 : -memcpy(): -/media/unix/Data/Code/2020301918-os/lib/string.c:92 -c0203245: 55 push %ebp -c0203246: 89 e5 mov %esp,%ebp -c0203248: 83 ec 10 sub $0x10,%esp -/media/unix/Data/Code/2020301918-os/lib/string.c:96 -c020324b: 8b 45 0c mov 0xc(%ebp),%eax -c020324e: 89 45 fc mov %eax,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/lib/string.c:97 -c0203251: 8b 45 08 mov 0x8(%ebp),%eax -c0203254: 89 45 f8 mov %eax,-0x8(%ebp) -/media/unix/Data/Code/2020301918-os/lib/string.c:99 -c0203257: 8b 45 fc mov -0x4(%ebp),%eax -c020325a: 3b 45 f8 cmp -0x8(%ebp),%eax -c020325d: 73 54 jae c02032b3 -/media/unix/Data/Code/2020301918-os/lib/string.c:99 (discriminator 1) -c020325f: 8b 55 fc mov -0x4(%ebp),%edx -c0203262: 8b 45 10 mov 0x10(%ebp),%eax -c0203265: 01 d0 add %edx,%eax -c0203267: 39 45 f8 cmp %eax,-0x8(%ebp) -c020326a: 73 47 jae c02032b3 -/media/unix/Data/Code/2020301918-os/lib/string.c:100 -c020326c: 8b 45 10 mov 0x10(%ebp),%eax -c020326f: 01 45 fc add %eax,-0x4(%ebp) -/media/unix/Data/Code/2020301918-os/lib/string.c:101 -c0203272: 8b 45 10 mov 0x10(%ebp),%eax -c0203275: 01 45 f8 add %eax,-0x8(%ebp) -/media/unix/Data/Code/2020301918-os/lib/string.c:102 -c0203278: eb 13 jmp c020328d -/media/unix/Data/Code/2020301918-os/lib/string.c:103 -c020327a: 83 6d fc 01 subl $0x1,-0x4(%ebp) -c020327e: 83 6d f8 01 subl $0x1,-0x8(%ebp) -c0203282: 8b 45 fc mov -0x4(%ebp),%eax -c0203285: 0f b6 10 movzbl (%eax),%edx -c0203288: 8b 45 f8 mov -0x8(%ebp),%eax -c020328b: 88 10 mov %dl,(%eax) -/media/unix/Data/Code/2020301918-os/lib/string.c:102 -c020328d: 8b 45 10 mov 0x10(%ebp),%eax -c0203290: 8d 50 ff lea -0x1(%eax),%edx -c0203293: 89 55 10 mov %edx,0x10(%ebp) -c0203296: 85 c0 test %eax,%eax -c0203298: 75 e0 jne c020327a -/media/unix/Data/Code/2020301918-os/lib/string.c:99 -c020329a: eb 24 jmp c02032c0 -/media/unix/Data/Code/2020301918-os/lib/string.c:106 -c020329c: 8b 55 fc mov -0x4(%ebp),%edx -c020329f: 8d 42 01 lea 0x1(%edx),%eax -c02032a2: 89 45 fc mov %eax,-0x4(%ebp) -c02032a5: 8b 45 f8 mov -0x8(%ebp),%eax -c02032a8: 8d 48 01 lea 0x1(%eax),%ecx -c02032ab: 89 4d f8 mov %ecx,-0x8(%ebp) -c02032ae: 0f b6 12 movzbl (%edx),%edx -c02032b1: 88 10 mov %dl,(%eax) -/media/unix/Data/Code/2020301918-os/lib/string.c:105 -c02032b3: 8b 45 10 mov 0x10(%ebp),%eax -c02032b6: 8d 50 ff lea -0x1(%eax),%edx -c02032b9: 89 55 10 mov %edx,0x10(%ebp) -c02032bc: 85 c0 test %eax,%eax -c02032be: 75 dc jne c020329c -/media/unix/Data/Code/2020301918-os/lib/string.c:109 -c02032c0: 8b 45 08 mov 0x8(%ebp),%eax -/media/unix/Data/Code/2020301918-os/lib/string.c:110 -c02032c3: c9 leave -c02032c4: c3 ret -c02032c5: 66 90 xchg %ax,%ax -c02032c7: 66 90 xchg %ax,%ax -c02032c9: 66 90 xchg %ax,%ax -c02032cb: 66 90 xchg %ax,%ax -c02032cd: 66 90 xchg %ax,%ax -c02032cf: 90 nop - -c02032d0 <__udivdi3>: -__udivdi3(): -c02032d0: f3 0f 1e fb endbr32 -c02032d4: 55 push %ebp -c02032d5: 57 push %edi -c02032d6: 56 push %esi -c02032d7: 53 push %ebx -c02032d8: 83 ec 1c sub $0x1c,%esp -c02032db: 8b 44 24 3c mov 0x3c(%esp),%eax -c02032df: 8b 6c 24 30 mov 0x30(%esp),%ebp -c02032e3: 8b 74 24 34 mov 0x34(%esp),%esi -c02032e7: 8b 5c 24 38 mov 0x38(%esp),%ebx -c02032eb: 85 c0 test %eax,%eax -c02032ed: 75 19 jne c0203308 <__udivdi3+0x38> -c02032ef: 39 f3 cmp %esi,%ebx -c02032f1: 76 4d jbe c0203340 <__udivdi3+0x70> -c02032f3: 31 ff xor %edi,%edi -c02032f5: 89 e8 mov %ebp,%eax -c02032f7: 89 f2 mov %esi,%edx -c02032f9: f7 f3 div %ebx -c02032fb: 89 fa mov %edi,%edx -c02032fd: 83 c4 1c add $0x1c,%esp -c0203300: 5b pop %ebx -c0203301: 5e pop %esi -c0203302: 5f pop %edi -c0203303: 5d pop %ebp -c0203304: c3 ret -c0203305: 8d 76 00 lea 0x0(%esi),%esi -c0203308: 39 f0 cmp %esi,%eax -c020330a: 76 14 jbe c0203320 <__udivdi3+0x50> -c020330c: 31 ff xor %edi,%edi -c020330e: 31 c0 xor %eax,%eax -c0203310: 89 fa mov %edi,%edx -c0203312: 83 c4 1c add $0x1c,%esp -c0203315: 5b pop %ebx -c0203316: 5e pop %esi -c0203317: 5f pop %edi -c0203318: 5d pop %ebp -c0203319: c3 ret -c020331a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi -c0203320: 0f bd f8 bsr %eax,%edi -c0203323: 83 f7 1f xor $0x1f,%edi -c0203326: 75 48 jne c0203370 <__udivdi3+0xa0> -c0203328: 39 f0 cmp %esi,%eax -c020332a: 72 06 jb c0203332 <__udivdi3+0x62> -c020332c: 31 c0 xor %eax,%eax -c020332e: 39 eb cmp %ebp,%ebx -c0203330: 77 de ja c0203310 <__udivdi3+0x40> -c0203332: b8 01 00 00 00 mov $0x1,%eax -c0203337: eb d7 jmp c0203310 <__udivdi3+0x40> -c0203339: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi -c0203340: 89 d9 mov %ebx,%ecx -c0203342: 85 db test %ebx,%ebx -c0203344: 75 0b jne c0203351 <__udivdi3+0x81> -c0203346: b8 01 00 00 00 mov $0x1,%eax -c020334b: 31 d2 xor %edx,%edx -c020334d: f7 f3 div %ebx -c020334f: 89 c1 mov %eax,%ecx -c0203351: 31 d2 xor %edx,%edx -c0203353: 89 f0 mov %esi,%eax -c0203355: f7 f1 div %ecx -c0203357: 89 c6 mov %eax,%esi -c0203359: 89 e8 mov %ebp,%eax -c020335b: 89 f7 mov %esi,%edi -c020335d: f7 f1 div %ecx -c020335f: 89 fa mov %edi,%edx -c0203361: 83 c4 1c add $0x1c,%esp -c0203364: 5b pop %ebx -c0203365: 5e pop %esi -c0203366: 5f pop %edi -c0203367: 5d pop %ebp -c0203368: c3 ret -c0203369: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi -c0203370: 89 f9 mov %edi,%ecx -c0203372: ba 20 00 00 00 mov $0x20,%edx -c0203377: 29 fa sub %edi,%edx -c0203379: d3 e0 shl %cl,%eax -c020337b: 89 44 24 08 mov %eax,0x8(%esp) -c020337f: 89 d1 mov %edx,%ecx -c0203381: 89 d8 mov %ebx,%eax -c0203383: d3 e8 shr %cl,%eax -c0203385: 8b 4c 24 08 mov 0x8(%esp),%ecx -c0203389: 09 c1 or %eax,%ecx -c020338b: 89 f0 mov %esi,%eax -c020338d: 89 4c 24 08 mov %ecx,0x8(%esp) -c0203391: 89 f9 mov %edi,%ecx -c0203393: d3 e3 shl %cl,%ebx -c0203395: 89 d1 mov %edx,%ecx -c0203397: d3 e8 shr %cl,%eax -c0203399: 89 f9 mov %edi,%ecx -c020339b: 89 5c 24 0c mov %ebx,0xc(%esp) -c020339f: 89 eb mov %ebp,%ebx -c02033a1: d3 e6 shl %cl,%esi -c02033a3: 89 d1 mov %edx,%ecx -c02033a5: d3 eb shr %cl,%ebx -c02033a7: 09 f3 or %esi,%ebx -c02033a9: 89 c6 mov %eax,%esi -c02033ab: 89 f2 mov %esi,%edx -c02033ad: 89 d8 mov %ebx,%eax -c02033af: f7 74 24 08 divl 0x8(%esp) -c02033b3: 89 d6 mov %edx,%esi -c02033b5: 89 c3 mov %eax,%ebx -c02033b7: f7 64 24 0c mull 0xc(%esp) -c02033bb: 39 d6 cmp %edx,%esi -c02033bd: 72 19 jb c02033d8 <__udivdi3+0x108> -c02033bf: 89 f9 mov %edi,%ecx -c02033c1: d3 e5 shl %cl,%ebp -c02033c3: 39 c5 cmp %eax,%ebp -c02033c5: 73 04 jae c02033cb <__udivdi3+0xfb> -c02033c7: 39 d6 cmp %edx,%esi -c02033c9: 74 0d je c02033d8 <__udivdi3+0x108> -c02033cb: 89 d8 mov %ebx,%eax -c02033cd: 31 ff xor %edi,%edi -c02033cf: e9 3c ff ff ff jmp c0203310 <__udivdi3+0x40> -c02033d4: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi -c02033d8: 8d 43 ff lea -0x1(%ebx),%eax -c02033db: 31 ff xor %edi,%edi -c02033dd: e9 2e ff ff ff jmp c0203310 <__udivdi3+0x40> -c02033e2: 66 90 xchg %ax,%ax -c02033e4: 66 90 xchg %ax,%ax -c02033e6: 66 90 xchg %ax,%ax -c02033e8: 66 90 xchg %ax,%ax -c02033ea: 66 90 xchg %ax,%ax -c02033ec: 66 90 xchg %ax,%ax -c02033ee: 66 90 xchg %ax,%ax - -c02033f0 <__umoddi3>: -__umoddi3(): -c02033f0: f3 0f 1e fb endbr32 -c02033f4: 55 push %ebp -c02033f5: 57 push %edi -c02033f6: 56 push %esi -c02033f7: 53 push %ebx -c02033f8: 83 ec 1c sub $0x1c,%esp -c02033fb: 8b 74 24 30 mov 0x30(%esp),%esi -c02033ff: 8b 5c 24 34 mov 0x34(%esp),%ebx -c0203403: 8b 7c 24 3c mov 0x3c(%esp),%edi -c0203407: 8b 6c 24 38 mov 0x38(%esp),%ebp -c020340b: 89 f0 mov %esi,%eax -c020340d: 89 da mov %ebx,%edx -c020340f: 85 ff test %edi,%edi -c0203411: 75 15 jne c0203428 <__umoddi3+0x38> -c0203413: 39 dd cmp %ebx,%ebp -c0203415: 76 39 jbe c0203450 <__umoddi3+0x60> -c0203417: f7 f5 div %ebp -c0203419: 89 d0 mov %edx,%eax -c020341b: 31 d2 xor %edx,%edx -c020341d: 83 c4 1c add $0x1c,%esp -c0203420: 5b pop %ebx -c0203421: 5e pop %esi -c0203422: 5f pop %edi -c0203423: 5d pop %ebp -c0203424: c3 ret -c0203425: 8d 76 00 lea 0x0(%esi),%esi -c0203428: 39 df cmp %ebx,%edi -c020342a: 77 f1 ja c020341d <__umoddi3+0x2d> -c020342c: 0f bd cf bsr %edi,%ecx -c020342f: 83 f1 1f xor $0x1f,%ecx -c0203432: 89 4c 24 04 mov %ecx,0x4(%esp) -c0203436: 75 40 jne c0203478 <__umoddi3+0x88> -c0203438: 39 df cmp %ebx,%edi -c020343a: 72 04 jb c0203440 <__umoddi3+0x50> -c020343c: 39 f5 cmp %esi,%ebp -c020343e: 77 dd ja c020341d <__umoddi3+0x2d> -c0203440: 89 da mov %ebx,%edx -c0203442: 89 f0 mov %esi,%eax -c0203444: 29 e8 sub %ebp,%eax -c0203446: 19 fa sbb %edi,%edx -c0203448: eb d3 jmp c020341d <__umoddi3+0x2d> -c020344a: 8d b6 00 00 00 00 lea 0x0(%esi),%esi -c0203450: 89 e9 mov %ebp,%ecx -c0203452: 85 ed test %ebp,%ebp -c0203454: 75 0b jne c0203461 <__umoddi3+0x71> -c0203456: b8 01 00 00 00 mov $0x1,%eax -c020345b: 31 d2 xor %edx,%edx -c020345d: f7 f5 div %ebp -c020345f: 89 c1 mov %eax,%ecx -c0203461: 89 d8 mov %ebx,%eax -c0203463: 31 d2 xor %edx,%edx -c0203465: f7 f1 div %ecx -c0203467: 89 f0 mov %esi,%eax -c0203469: f7 f1 div %ecx -c020346b: 89 d0 mov %edx,%eax -c020346d: 31 d2 xor %edx,%edx -c020346f: eb ac jmp c020341d <__umoddi3+0x2d> -c0203471: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi -c0203478: 8b 44 24 04 mov 0x4(%esp),%eax -c020347c: ba 20 00 00 00 mov $0x20,%edx -c0203481: 29 c2 sub %eax,%edx -c0203483: 89 c1 mov %eax,%ecx -c0203485: 89 e8 mov %ebp,%eax -c0203487: d3 e7 shl %cl,%edi -c0203489: 89 d1 mov %edx,%ecx -c020348b: 89 54 24 0c mov %edx,0xc(%esp) -c020348f: d3 e8 shr %cl,%eax -c0203491: 89 c1 mov %eax,%ecx -c0203493: 8b 44 24 04 mov 0x4(%esp),%eax -c0203497: 09 f9 or %edi,%ecx -c0203499: 89 df mov %ebx,%edi -c020349b: 89 4c 24 08 mov %ecx,0x8(%esp) -c020349f: 89 c1 mov %eax,%ecx -c02034a1: d3 e5 shl %cl,%ebp -c02034a3: 89 d1 mov %edx,%ecx -c02034a5: d3 ef shr %cl,%edi -c02034a7: 89 c1 mov %eax,%ecx -c02034a9: 89 f0 mov %esi,%eax -c02034ab: d3 e3 shl %cl,%ebx -c02034ad: 89 d1 mov %edx,%ecx -c02034af: 89 fa mov %edi,%edx -c02034b1: d3 e8 shr %cl,%eax -c02034b3: 0f b6 4c 24 04 movzbl 0x4(%esp),%ecx -c02034b8: 09 d8 or %ebx,%eax -c02034ba: f7 74 24 08 divl 0x8(%esp) -c02034be: 89 d3 mov %edx,%ebx -c02034c0: d3 e6 shl %cl,%esi -c02034c2: f7 e5 mul %ebp -c02034c4: 89 c7 mov %eax,%edi -c02034c6: 89 d1 mov %edx,%ecx -c02034c8: 39 d3 cmp %edx,%ebx -c02034ca: 72 06 jb c02034d2 <__umoddi3+0xe2> -c02034cc: 75 0e jne c02034dc <__umoddi3+0xec> -c02034ce: 39 c6 cmp %eax,%esi -c02034d0: 73 0a jae c02034dc <__umoddi3+0xec> -c02034d2: 29 e8 sub %ebp,%eax -c02034d4: 1b 54 24 08 sbb 0x8(%esp),%edx -c02034d8: 89 d1 mov %edx,%ecx -c02034da: 89 c7 mov %eax,%edi -c02034dc: 89 f5 mov %esi,%ebp -c02034de: 8b 74 24 04 mov 0x4(%esp),%esi -c02034e2: 29 fd sub %edi,%ebp -c02034e4: 19 cb sbb %ecx,%ebx -c02034e6: 0f b6 4c 24 0c movzbl 0xc(%esp),%ecx -c02034eb: 89 d8 mov %ebx,%eax -c02034ed: d3 e0 shl %cl,%eax -c02034ef: 89 f1 mov %esi,%ecx -c02034f1: d3 ed shr %cl,%ebp -c02034f3: d3 eb shr %cl,%ebx -c02034f5: 09 e8 or %ebp,%eax -c02034f7: 89 da mov %ebx,%edx -c02034f9: 83 c4 1c add $0x1c,%esp -c02034fc: 5b pop %ebx -c02034fd: 5e pop %esi -c02034fe: 5f pop %edi -c02034ff: 5d pop %ebp -c0203500: c3 ret diff --git a/kern/Makefrag b/kern/Makefrag index 0151a0a..2232f35 100644 --- a/kern/Makefrag +++ b/kern/Makefrag @@ -9,23 +9,34 @@ KERN_ENTRY_ADDR := 0xC0200000 KERN_SRCFILES:= kern/astart.asm \ kern/atrap.asm \ kern/aswitch.asm \ + kern/exec.c \ + kern/exit.c \ + kern/fork.c \ + kern/fork_ack.c \ kern/fs.c \ - kern/keyboard.c \ - kern/kmalloc.c \ kern/main.c \ kern/pmap.c \ kern/process.c \ + kern/sche.c \ kern/start.c \ kern/syscall.c \ kern/time.c \ kern/trap.c \ + kern/wait.c \ lib/kern/terminal.c \ + lib/kern/keyboard.c \ + lib/kern/kmalloc.c \ lib/printfmt.c \ lib/string.c KERN_OBJFILES := $(patsubst %.c, $(OBJDIR)/%.o, $(KERN_SRCFILES)) KERN_OBJFILES := $(patsubst %.asm, $(OBJDIR)/%.o, $(KERN_OBJFILES)) +$(OBJDIR)/kern/fork_ack.o: lib/kern/fork_ack.o + @echo + cp $< + @mkdir -p $(@D) + @cp $< $(@D) + $(OBJDIR)/kern/%.o: kern/%.c $(OBJDIR)/.vars.CFLAGS @echo + cc $< @mkdir -p $(@D) diff --git a/kern/atrap.asm b/kern/atrap.asm index 912c18b..d6cd77e 100644 --- a/kern/atrap.asm +++ b/kern/atrap.asm @@ -230,6 +230,35 @@ general_protection: push 13 ; vector_no = D jmp exception page_fault: + push eax + mov eax, [esp + 4] + mov [StackTop - 1024], eax + pop eax + pushad ; `. + push ds ; | + push es ; | 保存原寄存器值 + push fs ; | + push gs ; / + mov dx, ss + mov ds, dx + mov es, dx + + mov eax, esp + test dword [eax + CSREG - P_STACKBASE], 3 + jz .1 ; 根据段寄存器的状态信息判断是否发生内核重入 + mov esp, StackTop ; 如果没有发生内核重入就意味着要到用户栈了,先将esp移入临时内核栈 + push eax ; 传入进程表首地址信息 + call to_kern_stack ; 这个函数之后esp变为进程内核栈 + pop eax ; 恢复进程表首地址信息(这个是restart第一句话要用的) +.1: + mov ecx, [eax + EFLAGSREG - P_STACKBASE] + push ecx + mov ecx, [eax + CSREG - P_STACKBASE] + push ecx + mov ecx, [eax + EIPREG - P_STACKBASE] + push ecx + mov ebx, [StackTop - 1024] + push ebx push 14 ; vector_no = E jmp exception copr_error: diff --git a/kern/exec.c b/kern/exec.c new file mode 100644 index 0000000..aa291a3 --- /dev/null +++ b/kern/exec.c @@ -0,0 +1,150 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +static inline void +init_segment_regs(PROCESS_0 *p_proc) +{ + p_proc->user_regs.cs = (SELECTOR_FLAT_C & SA_RPL_MASK & SA_TI_MASK) + | SA_TIL | RPL_USER; + p_proc->user_regs.ds = (SELECTOR_FLAT_RW & SA_RPL_MASK & SA_TI_MASK) + | SA_TIL | RPL_USER; + p_proc->user_regs.es = (SELECTOR_FLAT_RW & SA_RPL_MASK & SA_TI_MASK) + | SA_TIL | RPL_USER; + p_proc->user_regs.fs = (SELECTOR_FLAT_RW & SA_RPL_MASK & SA_TI_MASK) + | SA_TIL | RPL_USER; + p_proc->user_regs.ss = (SELECTOR_FLAT_RW & SA_RPL_MASK & SA_TI_MASK) + | SA_TIL | RPL_USER; + p_proc->user_regs.gs = (SELECTOR_VIDEO & SA_RPL_MASK & SA_TI_MASK) + | RPL_USER; +} + +static inline void +init_pagetbl(PROCESS_0 *p_proc) +{ + phyaddr_t new_cr3 = phy_malloc_4k(); + memset((void *)K_PHY2LIN(new_cr3), 0, PGSIZE); + struct page_node *new_page_list = kmalloc(sizeof(struct page_node)); + new_page_list->nxt = NULL; + new_page_list->paddr = new_cr3; + new_page_list->laddr = -1; + map_kern(new_cr3, &new_page_list); + // 这里需要特别注意的是,替换用户页表这种危险行为 + // 无论如何都是要关中断的,不允许中间有任何调度 + // 否则很有可能换到一半,啪,一个中断进来调度了 + // 调度回来时要加载cr3,然后惊喜地发现page fault了 + struct page_node *old_page_list; + DISABLE_INT(); + old_page_list = p_proc->page_list; + p_proc->cr3 = new_cr3; + p_proc->page_list = new_page_list; + lcr3(p_proc->cr3); + ENABLE_INT(); + // 最后记得回收进程页面资源 + recycle_pages(old_page_list); +} + +ssize_t +kern_exec(PROCESS_0 *p_proc, const char *pathname) +{ + ssize_t ret = 0; + // 路径名的地址必须在内核中的地址 + // 因为exec会回收用户程序的页表 + // 这会导致程序中的地址发生缺页触发page fault + assert((uintptr_t)pathname >= K_PHY2LIN(0)); + + // 进来先给自己上个锁 + while (xchg(&p_proc->lock, 1) == 1) + schedule(); + + if ((ret = read_file(pathname, (void *)K_PHY2LIN(48 * MB))) < 0) + goto free; + + // 这里有一个特判,如果不是elf文件会返回ENOEXEC + if (*(uintptr_t *)K_PHY2LIN(48 * MB) != ELF_MAGIC) { + ret = -ENOEXEC; + goto free; + } + + assert(p_proc->statu == READY); + + // 初始化用户寄存器 + memset(&p_proc->user_regs, 0, sizeof(p_proc->user_regs)); + init_segment_regs(p_proc); + p_proc->user_regs.eflags = 0x1202; /* IF=1, IOPL=1 */ + // 初始化页表 + init_pagetbl(p_proc); + // 将elf加载到文件指定的地址 + map_elf(p_proc, (void *)K_PHY2LIN(48 * MB)); + // 初始化用户栈空间 + map_stack(p_proc); +free: + // 最后记得释放锁 + xchg(&p_proc->lock, 0); + return ret; +} + +/* + * 将src路径名转换为段目录项名到dst + * 如果不能转换会返回-ENOENT + */ +static inline ssize_t +translate_pathname(char *dst, const char *src) +{ + assert(strlen(dst) == 11); + + char *st = (char *)src; + char *ed = st + strlen(st); + char *dot = ed; + for (char *c = st ; *c ; c++) { + if (*c == '.') + dot = c; + } + + if (dot - st > 8) + return -ENOENT; + memcpy(dst, st, dot - st); + + if (ed - dot - 1 > 3) + return -ENOENT; + memcpy(dst + 8, dot + 1, ed == dot ? 0 : ed - dot - 1); + + for (char *c = dst ; *c ; c++) { + if ('a' <= *c && *c <= 'z') + *c += 'A' - 'a'; + } + + return 0; +} + +ssize_t +do_exec(const char *pathname) +{ + ssize_t ret = 0; + char *name_cpy; + + // 原来路径名转短目录项名的工作可以交给do_exec来做 + name_cpy = kmalloc(12); + memset(name_cpy, ' ', 11); + name_cpy[11] = '\0'; + // 当然如果转文件名失败了会返回-ENOENT + if ((ret = translate_pathname(name_cpy, pathname)) < 0) + goto free; + + ret = kern_exec(&p_proc_ready->pcb, name_cpy); +free: + if (name_cpy) + kfree(name_cpy); + return ret; +} diff --git a/kern/exit.c b/kern/exit.c new file mode 100644 index 0000000..0754d67 --- /dev/null +++ b/kern/exit.c @@ -0,0 +1,117 @@ +#include +#include + +#include +#include +#include +#include +#include +#include + +static void +awake_father_and_become_zombie(PROCESS_0 *p_proc) +{ + PROCESS_0 *p_fa; + // 由于我们已经协商了上锁的顺序,上锁顺序是从父亲到儿子 + // 但是这里我们必须锁了自己才能知道父进程是谁 + // 所以这里我们换了一种做法,不再一个劲的等锁 + // 如果父进程上锁失败,就直接将自己的锁释放拱手让人 + // 这样做有个好处,要么两个锁同时被上掉,要么两个锁同时被释放 + // 这也是一个非常有趣的实现方法 + // 而真实情况是将大锁拆小锁,不可能一个pcb就一个大锁保着,这样又浪费效率又难写 + while (1) { + if (xchg(&p_proc->lock, 1) == 1) + goto loop; + p_fa = p_proc->fork_tree.p_fa; + if (xchg(&p_fa->lock, 1) == 1) + goto free; + break; +free: + xchg(&p_proc->lock, 0); +loop: + schedule(); + } + // 这两句assert防止其他奇奇怪怪的状态出现 + assert(p_proc->statu == READY); + assert(p_fa->statu == READY || p_fa->statu == SLEEP); + p_proc->statu = ZOMBIE; + p_fa->statu = READY; + + xchg(&p_fa->lock, 0); + xchg(&p_proc->lock, 0); +} + +static void +transfer_orphans(PROCESS_0 *p_proc) +{ + PROCESS_0 *p_init = &proc_table[0].pcb; + // 上锁顺序为:初始进程->当前进程->子进程 + while (xchg(&p_init->lock, 1) == 1) + schedule(); + while (xchg(&p_proc->lock, 1) == 1) + schedule(); + + for (struct son_node *p = p_proc->fork_tree.sons ; p ;) { + PROCESS_0 *p_son = p->p_son; + struct son_node *p_nxt = p->nxt; + // 上子进程的锁,因为需要修改子进程的父进程信息(移到初始进程下) + while (xchg(&p_son->lock, 1) == 1) + schedule(); + // 将子进程的进程树信息做修改 + // 将节点node移到初始进程的链表头处 + p_son->fork_tree.p_fa = p_init; + // 确保这个是双向链表头 + assert(p->pre == NULL); + // 接下来就是一坨又臭又长的链表操作部分 + if (p->nxt != NULL) + p->nxt->pre = p->pre; + p->nxt = p_init->fork_tree.sons; + if (p->nxt != NULL) + p->nxt->pre = p; + p_init->fork_tree.sons = p; + // 最后释放子进程的锁 + xchg(&p_son->lock, 0); + p = p_nxt; + } + // 在移交完后当前进程的子进程信息会被清空 + p_proc->fork_tree.sons = NULL; + // 初始进程可能在休眠,而且子进程可能是僵尸进程,需要将初始进程唤醒 + // 初始进程会一直调用wait系统调用回收僵尸子进程 + assert(p_init->statu == READY || p_init->statu == SLEEP); + p_init->statu = READY; +free: + xchg(&p_proc->lock, 0); + xchg(&p_init->lock, 0); +} + +ssize_t +kern_exit(PROCESS_0 *p_proc, int exit_code) +{ + // 托孤,将所有子进程转移到初始进程下 + transfer_orphans(p_proc); + + // 上锁修改exit code + while (xchg(&p_proc->lock, 1) == 1) + schedule(); + p_proc->exit_code = exit_code; + xchg(&p_proc->lock, 0); + + // 下面两个操作会修改进程的状态, + // 这是非常危险的,最好用开关中断保护上 + DISABLE_INT(); + // 这个函数干了两件事,唤醒父进程,将自己状态置为僵尸进程 + // 关中断就相当于两件事同时干了 + awake_father_and_become_zombie(p_proc); + // 在触发了调度之后这个进程在被回收之前永远无法被调度到 + schedule(); + + ENABLE_INT(); + panic("exit failed!"); +} + +ssize_t +do_exit(int status) +{ + // 为什么这个参数这么奇怪?你可能需要读读手册 + return kern_exit(&p_proc_ready->pcb, (status & 0xFF) << 8); +} \ No newline at end of file diff --git a/kern/fork.c b/kern/fork.c new file mode 100644 index 0000000..1a39172 --- /dev/null +++ b/kern/fork.c @@ -0,0 +1,57 @@ +#include + +#include +#include + +ssize_t +kern_fork(PROCESS_0 *p_fa) +{ + // 这可能是你第一次实现一个比较完整的功能,你可能会比较畏惧 + // 但是放心,别怕,先别想自己要实现一个这么大的东西而毫无思路 + // 这样你在焦虑的同时也在浪费时间,就跟你在实验五中被页表折磨一样 + // 人在触碰到未知的时候总是害怕的,这是天性,所以请你先冷静下来 + // fork系统调用会一步步引导你写出来,不会让你本科造火箭的 + panic("Unimplement! CALM DOWN!"); + + // 推荐是边写边想,而不是想一车然后写,这样非常容易计划赶不上变化 + + // fork的第一步你需要找一个空闲(IDLE)的进程作为你要fork的子进程 + panic("Unimplement! find a idle process"); + + // 再之后你需要做的是好好阅读一下pcb的数据结构,搞明白结构体中每个成员的语义 + // 别光扫一遍,要搞明白这个成员到底在哪里被用到了,具体是怎么用的 + // 可能exec和exit系统调用的代码能够帮助你对pcb的理解,不先理解好pcb你fork是无从下手的 + panic("Unimplement! read pcb"); + + // 在阅读完pcb之后终于可以开始fork工作了 + // 本质上相当于将父进程的pcb内容复制到子进程pcb中 + // 但是你需要想清楚,哪些应该复制到子进程,哪些不应该复制,哪些应该子进程自己初始化 + // 其中有三个难点 + // 1. 子进程"fork"的返回值怎么处理?(需要你对系统调用整个过程都掌握比较清楚,如果非常清晰这个问题不会很大) + // 2. 子进程内存如何复制?(别傻乎乎地复制父进程的cr3,本质上相当于与父进程共享同一块内存, + // 而共享内存肯定不符合fork的语义,这样一个进程写内存某块地方会影响到另一个进程,这个东西需要你自己思考如何复制父进程的内存) + // 3. 在fork结束后,肯定会调度到子进程,那么你怎么保证子进程能够正常进入用户态? + // (你肯定会觉得这个问题问的莫名其妙的,只能说你如果遇到那一块问题了就会体会到这个问题的重要性, + // 这需要你对调度整个过程都掌握比较清楚) + panic("Unimplement! copy pcb?"); + + // 别忘了维护进程树,将这对父子进程关系添加进去 + panic("Unimplement! maintain process tree"); + + // 最后你需要将子进程的状态置为READY,说明fork已经好了,子进程准备就绪了 + panic("Unimplement! change status to READY"); + + // 在你写完fork代码时先别急着运行跑,先要对自己来个灵魂拷问 + // 1. 上锁上了吗?所有临界情况都考虑到了吗?(永远要相信有各种奇奇怪怪的并发问题) + // 2. 所有错误情况都判断到了吗?错误情况怎么处理?(RTFM->`man 2 fork`) + // 3. 你写的代码真的符合fork语义吗? + panic("Unimplement! soul torture"); + + return 0; +} + +ssize_t +do_fork(void) +{ + return kern_fork(&p_proc_ready->pcb); +} \ No newline at end of file diff --git a/kern/fs.c b/kern/fs.c index a0f9970..f85edda 100644 --- a/kern/fs.c +++ b/kern/fs.c @@ -1,6 +1,7 @@ #include +#include #include -#include +#include #include #include @@ -137,7 +138,7 @@ read_data_sec(void *dst, u32 current_clus) * filename要求是短目录项名(11个字节) * dst推荐是3GB + 48MB */ -void +ssize_t read_file(const char *filename, void *dst) { assert(strlen(filename) == 11); @@ -171,10 +172,11 @@ read_file(const char *filename, void *dst) } if (file_clus == 0) - panic("file can't found! filename: %s", filename); + return -ENOENT; // 读入文件 while (file_clus < 0x0FFFFFF8) { dst = read_data_sec(dst, file_clus); file_clus = get_next_clus(file_clus); } + return 0; } \ No newline at end of file diff --git a/kern/kmalloc.c b/kern/kmalloc.c deleted file mode 100644 index 33d2c3b..0000000 --- a/kern/kmalloc.c +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include - -#include -#include - -static phyaddr_t malloc_4k_p = 64 * MB; - -/* - * 分配物理内存,每次分配4kb,一页 - * 分配的物理内存区间为64MB~128MB - */ -phyaddr_t -phy_malloc_4k(void) -{ - assert(malloc_4k_p < 128 * MB); - - phyaddr_t addr = malloc_4k_p; - malloc_4k_p += PGSIZE; - - return addr; -} \ No newline at end of file diff --git a/kern/main.c b/kern/main.c index aacf410..d0f3df4 100644 --- a/kern/main.c +++ b/kern/main.c @@ -1,18 +1,11 @@ #include -#include -#include -#include #include -#include -#include -#include #include -#include -#include -#include -#include #include +#include +#include +#include // 标志着内核是否处理完成 bool init_kernel; @@ -20,36 +13,7 @@ bool init_kernel; // 指向当前进程pcb的指针 PROCESS *p_proc_ready; // pcb表 -PROCESS proc_table[PCB_SIZE]; - -static inline void -init_segment_regs(PROCESS *p_proc) -{ - p_proc->pcb.user_regs.cs = (SELECTOR_FLAT_C & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | RPL_USER; - p_proc->pcb.user_regs.ds = (SELECTOR_FLAT_RW & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | RPL_USER; - p_proc->pcb.user_regs.es = (SELECTOR_FLAT_RW & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | RPL_USER; - p_proc->pcb.user_regs.fs = (SELECTOR_FLAT_RW & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | RPL_USER; - p_proc->pcb.user_regs.ss = (SELECTOR_FLAT_RW & SA_RPL_MASK & SA_TI_MASK) | SA_TIL | RPL_USER; - p_proc->pcb.user_regs.gs = (SELECTOR_VIDEO & SA_RPL_MASK & SA_TI_MASK) | RPL_USER; -} - -static inline void -lml_map(phyaddr_t cr3, uintptr_t vaddr, phyaddr_t paddr, u32 flags) -{ - uintptr_t *pde_ptr = (uintptr_t *)K_PHY2LIN(cr3); - // get pdx item, pde_ptr + PDX(vaddr) - pde_ptr += PDX(vaddr); - if (!(*pde_ptr & PTE_P)) - { - // pdx ot exists, allocate a page and assign to pde - *pde_ptr = phy_malloc_4k() | PTE_P | flags; - } - uintptr_t *ptx_ptr = (uintptr_t *)K_PHY2LIN(*pde_ptr & (~0xfff)); - // get ptx item - ptx_ptr += PTX(vaddr); - // assume paddr is allocated, just set it to paddr[31:12] | FLAGS - *ptx_ptr = (paddr & (~0xfff)) | PTE_P | flags; -} +PROCESS proc_table[PCB_SIZE]; /* * 内核的main函数 @@ -59,158 +23,33 @@ void kernel_main(void) { kprintf("---start kernel main---\n"); - PROCESS *p_proc = proc_table; - - for (int i = 0; i < PCB_SIZE; i++, p_proc++) - { - // 初始化进程段寄存器 - init_segment_regs(p_proc); - // 为进程分配cr3物理内存 - p_proc->pcb.cr3 = phy_malloc_4k(); - // 将3GB~3GB+128MB的线性地址映射到0~128MB的物理地址 - map_kern(p_proc->pcb.cr3); - // 在map_kern之后,就内核程序对应的页表已经被映射了 - // 就可以直接lcr3,于此同时执行流不会触发page fault - // 如果不先map_kern,执行流会发现执行的代码的线性地址不存在爆出Page Fault - // 当然选不选择看个人的想法,评价是都行,各有各的优缺点 - // lcr3(p_proc->pcb.cr3); - - static char filename[PCB_SIZE][12] = { - // "TESTPID BIN", - // "TESTKEY BIN", - // "DELAY BIN", - // "DELAY BIN", - // "DELAY BIN", - "SNAKE BIN", - "HACK BIN", - }; - // 从磁盘中将文件读出,需要注意的是要满足短目录项的文件名长度11, - // 前八个为文件名,后三个为后缀名,跟BootLoader做法一致 - // 推荐将文件加载到3GB + 48MB处,应用程序保证不会有16MB那么大 - read_file(filename[i], (void *)K_PHY2LIN(48 * MB)); - // 现在你就需要将从磁盘中读出的ELF文件解析到用户进程的地址空间中 - // panic("unimplement! load elf file"); - // ---------------------------- load elf -------------------------------------- - void *elf_start = (void *)K_PHY2LIN(48 * MB); - assert(*(u32 *)elf_start == ELF_MAGIC); - Elf32_Ehdr *ehdr = (Elf32_Ehdr *)elf_start; - for (int i = 0; i < ehdr->e_phnum; ++i) - { - Elf32_Phdr *phdr = elf_start + i * ehdr->e_phentsize + ehdr->e_phoff; - if (phdr->p_type == PT_LOAD) - { - u32 vpage_fst = phdr->p_va & (~0xfff); // clear low 12 bit, start of the first pg - u32 vpage_lst = (phdr->p_va + phdr->p_memsz - 1) & (~0xfff); // start of the last pg - // in fact, we allocate 4k aligned vpage to every segment; - // its ok because elf32 segment align is 0x1000 - u32 page_num = ((vpage_lst - vpage_fst) >> 12) + 1; - phyaddr_t newpage = 0; // useless initialization - for (int j = 0; j < page_num; ++j) - { - newpage = phy_malloc_4k(); - lml_map(p_proc->pcb.cr3, vpage_fst + (j << 12), newpage, PTE_P | PTE_W | PTE_U); - } - phyaddr_t page_start = newpage - (page_num - 1) * 4 * KB; - memcpy((void *)K_PHY2LIN(page_start), (void *)(elf_start + phdr->p_offset), phdr->p_filesz); - memset((void *)K_PHY2LIN(page_start) + phdr->p_filesz, 0, phdr->p_memsz - phdr->p_filesz); - } - } - - // 上一个实验中,我们开栈是用内核中的一个数组临时充当栈 - // 但是现在就不行了,用户是无法访问内核的地址空间(3GB ~ 3GB + 128MB) - // 需要你自行处理给用户分配用户栈。 - // ---------------------------- alloc user stack ------------------------------ - phyaddr_t ustack_low = phy_malloc_4k(); - for (int i = 0; i < 6; ++i) - phy_malloc_4k(); - phyaddr_t ustack_high = phy_malloc_4k(); // alloc 8 pages, 32KB stack for each program - for (int i = 0; i < 8; ++i) - { - lml_map(p_proc->pcb.cr3, (3 * GB - (8 - i) * PGSIZE), ustack_low + i * PGSIZE, PTE_P | PTE_W | PTE_U); - } - p_proc->pcb.user_regs.esp = 3 * GB; // high to low stack - p_proc->pcb.user_regs.eip = ehdr->e_entry; // refer to restart: - // 初始化用户寄存器 - p_proc->pcb.user_regs.eflags = 0x1202; /* IF=1, IOPL=1 */ - - // panic("unimplement! init user stack and esp"); - // 接下来初始化内核寄存器, - // 为什么需要初始化内核寄存器原因是加入了系统调用后 - // 非常有可能出现系统调用执行过程中插入其余中断的情况, - // 如果跟之前一样所有进程共享一个内核栈会发生不可想象的结果, - // 为了避免这种情况,就需要给每个进程分配一个进程栈。 - // 当触发时钟中断发生调度的时候,不再是简单的切换p_proc_ready, - // 而是需要将内核栈进行切换,而且需要切换执行流到另一个进程的内核栈。 - // 所以需要一个地方存放当前进程的寄存器上下文,这是一个富有技巧性的活,深入研究会觉得很妙, - // 如果需要深入了解,去查看kern/process.c中的schedule函数了解切换细节。 - p_proc->pcb.kern_regs.esp = (u32)(p_proc + 1) - 8; - // 保证切换内核栈后执行流进入的是restart函数。 - *(u32 *)(p_proc->pcb.kern_regs.esp + 0) = (u32)restart; - // 这里是因为restart要用`pop esp`确认esp该往哪里跳。 - *(u32 *)(p_proc->pcb.kern_regs.esp + 4) = (u32)&p_proc->pcb; - - // 初始化其余量 - p_proc->pcb.pid = i; - static int priority_table[PCB_SIZE] = {1, 1}; - // priority 预计给每个进程分配的时间片 - // ticks 进程剩余的进程片 - p_proc->pcb.priority = p_proc->pcb.ticks = priority_table[i]; - p_proc->pcb.target_tick = 0; - } - p_proc_ready = proc_table; - // 切换进程页表和tss - lcr3(p_proc_ready->pcb.cr3); - tss.esp0 = (u32)(&p_proc_ready->pcb.user_regs + 1); + + PROCESS_0 *p_proc = &p_proc_ready->pcb; + p_proc->statu = READY; + // kern regs + p_proc->kern_regs.esp = (u32)(p_proc_ready + 1) - 8; + // 保证切换内核栈后执行流进入的是restart函数。 + *(u32 *)(p_proc->kern_regs.esp + 0) = (u32)restart; + // 这里是因为restart要用`pop esp`确认esp该往哪里跳。 + *(u32 *)(p_proc->kern_regs.esp + 4) = (u32)p_proc; + // 初始化进程树 + p_proc->fork_tree.p_fa = NULL; + p_proc->fork_tree.sons = NULL; + // 初始化ticks + p_proc->priority = p_proc->ticks = 1; + // 在实现了exec系统调用后main函数的负担就少了 + // 只需要调用一个函数接口就能实现进程的加载 + if (do_exec("initproc.bin") < 0) + panic("init process failed"); + // 切换tss + tss.esp0 = (u32)(&p_proc->user_regs + 1); + lcr3(p_proc->cr3); init_kernel = true; - + // 开个无用的kern_context存当前执行流的寄存器上下文(之后就没用了,直接放在临时变量中) struct kern_context idle; - switch_kern_context(&idle, &p_proc_ready->pcb.kern_regs); + switch_kern_context(&idle, &p_proc->kern_regs); assert(0); -} - -static inline void -sys_mmap(phyaddr_t cr3_src, phyaddr_t cr3_dst, uintptr_t va_src, uintptr_t va_dst) -{ - uintptr_t *pde_ptr_src = (uintptr_t *)K_PHY2LIN(cr3_src); - uintptr_t *pde_ptr_dst = (uintptr_t *)K_PHY2LIN(cr3_dst); - // its quite okay, kernel space is mapped to all processes - pde_ptr_src += PDX(va_src); - pde_ptr_dst += PDX(va_dst); - assert((*pde_ptr_dst & PTE_P) && (*pde_ptr_src & PTE_P)); - // it is not a map procedure, so pde should be present - uintptr_t *pte_ptr_src = (uintptr_t *)K_PHY2LIN(*pde_ptr_src & (~0xfff)); - uintptr_t *pte_ptr_dst = (uintptr_t *)K_PHY2LIN(*pde_ptr_dst & (~0xfff)); - pte_ptr_src += PTX(va_src); - pte_ptr_dst += PTX(va_dst); - assert((*pte_ptr_dst & PTE_P) && (*pte_ptr_src & PTE_P)); - // make should page table entry also exists - *pte_ptr_dst = *pte_ptr_src; - // simple assign src to dst, no need to recycle, though should be -} - -#define PG_MASK 0x0fff // 12bit mask - -ssize_t do_mmap(int pid, void *src, void *dst, size_t length) -{ - if ((length & PG_MASK) || ((u32)src & PG_MASK) || ((u32)dst & PG_MASK)) - { - // make sure src,dst,len are 4K aligned - assert(0); - return -1; - } - if (pid > PCB_SIZE) - { - assert(0); - return -1; - } - disable_int(); - for (int off = 0; off < length; off += PGSIZE) - { - sys_mmap(proc_table[pid].pcb.cr3, p_proc_ready->pcb.cr3, (uintptr_t)src + off, (uintptr_t)dst + off); - } - enable_int(); - return 0; } \ No newline at end of file diff --git a/kern/pmap.c b/kern/pmap.c index d1d5946..3fa477a 100644 --- a/kern/pmap.c +++ b/kern/pmap.c @@ -1,46 +1,154 @@ #include +#include +#include #include #include #include +/* + * 申请一个新的物理页,并更新page_list页面信息 + * 返回新申请的物理页面的物理地址 + */ +static phyaddr_t +alloc_phy_page(struct page_node **page_list) +{ + phyaddr_t paddr = phy_malloc_4k(); + + struct page_node *new_node = kmalloc(sizeof(struct page_node)); + new_node->nxt = *page_list; + new_node->paddr = paddr; + new_node->laddr = -1; + *page_list = new_node; + + return paddr; +} + +/* + * MINIOS中比较通用的页表映射函数 + * 它将laddr处的虚拟页面映射到物理地址为paddr(如果paddr为-1则会自动申请一个新的物理页面)的物理页面 + * 并将pte_flag置位到页表项(页目录项标志位默认为PTE_P | PTE_W | PTE_U) + * 这个函数中所有新申请到的页面信息会存放到page_list这个链表中 + */ +static void +lin_mapping_phy(u32 cr3, + struct page_node **page_list, + uintptr_t laddr, + phyaddr_t paddr, + u32 pte_flag) +{ + assert(PGOFF(laddr) == 0); + + uintptr_t *pde_ptr = (uintptr_t *)K_PHY2LIN(cr3); + + if ((pde_ptr[PDX(laddr)] & PTE_P) == 0) { + phyaddr_t pte_phy = alloc_phy_page(page_list); + memset((void *)K_PHY2LIN(pte_phy), 0, PGSIZE); + pde_ptr[PDX(laddr)] = pte_phy | PTE_P | PTE_W | PTE_U; + } + + phyaddr_t pte_phy = PTE_ADDR(pde_ptr[PDX(laddr)]); + uintptr_t *pte_ptr = (uintptr_t *)K_PHY2LIN(pte_phy); + + phyaddr_t page_phy; + if (paddr == (phyaddr_t)-1) { + if ((pte_ptr[PTX(laddr)] & PTE_P) != 0) + return; + page_phy = alloc_phy_page(page_list); + (*page_list)->laddr = laddr; + + } else { + if ((pte_ptr[PTX(laddr)] & PTE_P) != 0) + warn("this page was mapped before, laddr: %x", laddr); + assert(PGOFF(paddr) == 0); + page_phy = paddr; + } + pte_ptr[PTX(laddr)] = page_phy | pte_flag; +} + /* * 初始化进程页表的内核部分 * 将3GB ~ 3GB + 128MB的线性地址映射到0 ~ 128MB的物理地址 */ void -map_kern(phyaddr_t cr3) +map_kern(u32 cr3, struct page_node **page_list) { - // 初始化pde(页目录表) - // 由于cr3是物理地址,需要进行一步转化转化到线性地址才能访存 - uintptr_t *pde_ptr = (uintptr_t *)K_PHY2LIN(cr3); - // 基地址在3GB处 - pde_ptr += PDX(3 * GB); - // 一个页目录项映射4MB的内存,计算需要初始化的页目录项数目 - int pde_num = (128 * MB) / (4 * MB); - // 被映射的物理地址 - phyaddr_t phy_addr = 0; - while (pde_num--) { - // 对于每一个页目录项申请一页用于页表 - phyaddr_t pte_phy = phy_malloc_4k(); - // 保证申请出来的物理地址是4k对齐的 - assert(PGOFF(pte_phy) == 0); - // 初始化页目录项,权限是存在(P)|写(W)|用户能够访问(U) - *pde_ptr++ = pte_phy | PTE_P | PTE_W | PTE_U; - - // 接下来对新申请的页表初始化页表项 - // 由于申请的pte_phy是物理地址,需要进行一步转化转化到线性地址才能访存 - uintptr_t *pte_ptr = (uintptr_t *)K_PHY2LIN(pte_phy); - // 初始化页表的所有页表项 - int pte_num = NPTENTRIES; - while (pte_num--) { - // 初始化页表项,权限是存在(P)|写(W),用户不能访问 - // 直接线性映射物理页 - *pte_ptr++ = phy_addr | PTE_P | PTE_W; - // 换下一个物理页 - phy_addr += PGSIZE; - } + for (phyaddr_t paddr = 0 ; paddr < 128 * MB ; paddr += PGSIZE) { + lin_mapping_phy(cr3, + page_list, + K_PHY2LIN(paddr), + paddr, + PTE_P | PTE_W | PTE_U); + } +} + +/* + * 根据elf文件信息将数据搬迁到指定位置 + * 中间包含了对页表的映射,eip的置位 + * 这也是你们做实验五中最折磨的代码,可以看这份学习一下 + */ +void +map_elf(PROCESS_0 *p_proc, void *elf_addr) +{ + assert(p_proc->lock != 0); + + struct Elf *eh = (struct Elf *)elf_addr; + + struct Proghdr *ph = (struct Proghdr *)(elf_addr + eh->e_phoff); + for (int i = 0 ; i < eh->e_phnum ; i++, ph++) { + if (ph->p_type != PT_LOAD) + continue; + uintptr_t st = ROUNDDOWN(ph->p_va, PGSIZE); + uintptr_t en = ROUNDUP(st + ph->p_memsz, PGSIZE); + for (uintptr_t laddr = st ; laddr < en ; laddr += PGSIZE) { + u32 pte_flag = PTE_P | PTE_U; + if ((ph->p_flags & ELF_PROG_FLAG_WRITE) != 0) + pte_flag |= PTE_W; + lin_mapping_phy(p_proc->cr3, + &p_proc->page_list, + laddr, + (phyaddr_t)-1, + pte_flag); + } + memcpy( (void *)ph->p_va, + (const void *)eh + ph->p_offset, + ph->p_filesz); + memset( (void *)ph->p_va + ph->p_filesz, + 0, + ph->p_memsz - ph->p_filesz); + } + + p_proc->user_regs.eip = eh->e_entry; +} + +/* + * 将用户栈映射到用户能够访问到的最后一个页面 + * (0xbffff000~0xc0000000) + * 并将esp寄存器放置好 + */ +void +map_stack(PROCESS_0 *p_proc) +{ + assert(p_proc->lock != 0); + + lin_mapping_phy(p_proc->cr3, + &p_proc->page_list, + K_PHY2LIN(-PGSIZE), + (phyaddr_t)-1, + PTE_P | PTE_W | PTE_U); + + p_proc->user_regs.esp = K_PHY2LIN(0); +} + +/* + * 根据page_list回收所有的页面(包括回收页面节点) + */ +void +recycle_pages(struct page_node *page_list) +{ + for (struct page_node *prevp, *p = page_list ; p ;) { + phy_free_4k(p->paddr); + prevp = p, p = p->nxt; + kfree(prevp); } - // 经常assert是个好习惯 - assert(phy_addr == 128 * MB); } \ No newline at end of file diff --git a/kern/process.c b/kern/process.c index d3ad1d1..4da194d 100644 --- a/kern/process.c +++ b/kern/process.c @@ -1,14 +1,8 @@ -#include -#include -#include #include -#include -#include #include -#include +#include #include -#include /* * 这个函数是写给汇编函数用, @@ -34,100 +28,20 @@ to_kern_stack(u32 ret_esp) ); } -/* - * 调度函数 - */ -bool has_runnable = true; -void -schedule(void) -{ - // 获取当前的eflags的中断位 - u32 IF_BIT = read_eflags() & FL_IF; - // 如果中断没关,一定!一定!一定!要关中断保证当前执行流操作的原子性 - if (IF_BIT != 0) - disable_int(); -// kprintf("sched\n"); - PROCESS *p_cur_proc = p_proc_ready; - PROCESS *p_next_proc = p_proc_ready; - has_runnable = false; -_again: - do { - p_next_proc = p_next_proc + 1; - if (p_next_proc >= proc_table + PCB_SIZE) { - p_next_proc = proc_table; - } - if (p_next_proc->pcb.target_tick == 0 || p_next_proc->pcb.target_tick <= kern_get_ticks()) { - p_next_proc->pcb.target_tick = 0; - has_runnable = true; - break; - } - } while(p_next_proc != p_proc_ready); - if (!has_runnable) { - enable_int(); // remember to enable int, or it'll die here - asm volatile("hlt"); // hlt will wake up when int comes - IF_BIT = read_eflags() & FL_IF; - if (IF_BIT != 0) disable_int(); // retry with int disabled - goto _again; - } - p_proc_ready = p_next_proc; - // 切换进程页表和tss - lcr3(p_proc_ready->pcb.cr3); - tss.esp0 = (u32)(&p_proc_ready->pcb.user_regs + 1); - - // 调度函数最精髓的部分,非常的有意思。 - // 对于目前的os来说,eax,ebx,ecx,edx,esi,edi,esp,ebp,eflags这九个寄存器就可以表达当前执行流的上下文了, - // 所以这个函数干了个什么事呢,它先将当前的esp保存到kern_regs中保存当前的栈信息, - // 之后将esp移到当前kern_context栈顶然后按顺序依次将eax,ecx,edx,ebx,ebp,esi,edi,eflags压栈, - // 这样就把当前进程寄存器上下文都保存下来了,再之后esp移到目标kern_context栈底, - // 再依次恢复eflags,edi,esi,ebp,ebx,edx,ecx,eax, - // 最后一步恢复esp,这个esp本身被push时保留的是进程栈中的esp,这样就完成了执行流的切换。 - // 从当前进程的角度上这就很有意思,相当于执行流进入了一个函数之后突然就被送往其他次元了,而且当前次元的时间静止了。 - // 然后再之后突然又回来了,还是之前的那些寄存器信息,感觉这个函数啥都没干。 - // 由于涉及到一大堆跟执行流切换相关的操作,所以一定!一定!一定!要关中断。 - switch_kern_context( - &p_cur_proc->pcb.kern_regs, - &p_next_proc->pcb.kern_regs); - // 在传送回之后需要做的第一件事就是忘掉所有的全局变量的缓存 - // 防止编译器优化导致某些变量被优化掉,比如说某个全局变量a - // 你拿eax去获取a的值,在发生调度之后a的值发生变化,下面用到了a - // 然后编译器想都不想就直接用eax接着用了,一个bug就这么来了 - - // 这玩意学术名词叫内存屏障,这还只是单核,如果多核就更加恐怖了, - // 你会看到内存屏障遍地插,这也是为什么os难的一部分原因,跟缓存斗,跟硬件斗,跟编译器斗,跟并发斗,其乐无穷。 - // 要敬佩那些写系统软件的人,斗都要斗麻了的。 - asm volatile ("":::"memory"); - - // 这里可能你会比较疑惑为什么还要开中断, - // 这个时候你需要要以单线程的思路去想, - // 上面的switch_kern_context在执行后执行流就交给了其他进程了, - // 但是其他进程总是会通过调度调度回来,对于当前这个进程来说, - // 它相当于突然被送到其他次元了,包还掉在地上(关中断),而且那个次元的时间就静止了(The World!) - // 当在其他次元兜兜转转回来了之后,还得把包捡回来(开中断)。 - // 不用去关心其他次元是怎么干的,但是对于这个次元来说还是得捡包的。 - // 如果每个次元都遵守这个规则,就可以保证执行不会出问题。 - if (IF_BIT != 0) - enable_int(); -} - u32 -kern_get_pid(PROCESS *p_proc) +kern_get_pid(PROCESS_0 *p_proc) { - return p_proc->pcb.pid; + u32 ret = 0; + while (xchg(&p_proc->lock, 1) == 1) + schedule(); + ret = p_proc->pid; +free: + xchg(&p_proc->lock, 0); + return ret; } ssize_t do_get_pid(void) { - return (ssize_t)kern_get_pid(p_proc_ready); + return (ssize_t)kern_get_pid(&p_proc_ready->pcb); } - -void kern_delay_ticks(PROCESS *p_proc, u32 target_tick) { - p_proc->pcb.target_tick = target_tick; -} - -ssize_t -do_delay_ticks(u32 ticks) { - kern_delay_ticks(p_proc_ready, kern_get_ticks() + ticks); - schedule(); - return 0; -} \ No newline at end of file diff --git a/kern/sche.c b/kern/sche.c new file mode 100644 index 0000000..2f7c45c --- /dev/null +++ b/kern/sche.c @@ -0,0 +1,48 @@ +#include + +#include +#include +#include + +/* + * 调度函数 + */ +void +schedule(void) +{ + // 如果中断没关,一定!一定!一定!要关中断保证当前执行流操作的原子性 + DISABLE_INT(); + PROCESS *p_cur_proc = p_proc_ready; + PROCESS *p_next_proc = p_proc_ready; + + asm volatile ("":::"memory"); + + static bool in_sche; + if (in_sche) + goto free; + in_sche = true; + + do { + if (++p_next_proc >= proc_table + PCB_SIZE) + p_next_proc = proc_table; + if (p_cur_proc == p_next_proc && + p_next_proc->pcb.statu != READY) { + asm volatile("sti\n\thlt\n\tcli":::"memory"); + } + } while (p_next_proc->pcb.statu != READY); + + p_proc_ready = p_next_proc; + // 切换进程页表和tss + lcr3(p_proc_ready->pcb.cr3); + tss.esp0 = (u32)(&p_proc_ready->pcb.user_regs + 1); + + in_sche = false; + + switch_kern_context( + &p_cur_proc->pcb.kern_regs, + &p_next_proc->pcb.kern_regs); + + asm volatile ("":::"memory"); +free: + ENABLE_INT(); +} \ No newline at end of file diff --git a/kern/syscall.c b/kern/syscall.c index 3906d32..efbf733 100644 --- a/kern/syscall.c +++ b/kern/syscall.c @@ -9,16 +9,22 @@ static ssize_t sys_get_ticks(void); static ssize_t sys_get_pid(void); static ssize_t sys_read(void); static ssize_t sys_write(void); -static ssize_t sys_delay_ticks(void); -static ssize_t sys_mmap(void); +static ssize_t sys_exec(void); +static ssize_t sys_fork(void); +static ssize_t sys_wait(void); +static ssize_t sys_exit(void); +static ssize_t sys_fork_ack(void); ssize_t (*syscall_table[])(void) = { [_NR_get_ticks] sys_get_ticks, [_NR_get_pid] sys_get_pid, [_NR_read] sys_read, [_NR_write] sys_write, -[_NR_delay_ticks] sys_delay_ticks, -[_NR_mmap] sys_mmap, +[_NR_exec] sys_exec, +[_NR_fork] sys_fork, +[_NR_wait] sys_wait, +[_NR_exit] sys_exit, +[_NR_fork_ack] sys_fork_ack, }; /* @@ -89,17 +95,53 @@ sys_write(void) return do_write(get_arg(0), (const void *)get_arg(1), get_arg(2)); } +/* + * ssize_t exec(const char *pathname) + * 在进程中启动另一个程序执行的方法,加载为pathname对应的ELF文件 + */ static ssize_t -sys_delay_ticks(void) { - return do_delay_ticks(get_arg(0)); +sys_exec(void) +{ + return do_exec((const void *)get_arg(0)); } -/* - * ssize_t do_mmap(int pid, void *src, void* dst, size_t length); - * 将pid号进程的线性地址[src, src + length)中的页面共享到该进程的线性地址[dst, dst + length) +/* + * ssize_t fork(void) + * 复制一个一模一样的进程 */ - static ssize_t -sys_mmap(void) { - return do_mmap(get_arg(0), (void*)get_arg(1), (void*)get_arg(2), get_arg(3)); +sys_fork(void) +{ + return do_fork(); +} + +/* + * ssize_t wait(int *wstatus) + * 等待子进程exit,回收子进程资源,wstatus接收子进程的返回码 + */ +static ssize_t +sys_wait(void) +{ + return do_wait((int *)get_arg(0)); +} + +/* + * ssize_t exit(int status) + * 进程退出的方法,将status作为返回码传递给父进程 + */ +static ssize_t +sys_exit(void) +{ + return do_exit(get_arg(0)); +} + +/* + * ssize_t fork_ack(void) + * forkbomb.c所用,用于检测成功fork的次数 + * 内部实现被封装不公开 + */ +static ssize_t +sys_fork_ack(void) +{ + return do_fork_ack(); } \ No newline at end of file diff --git a/kern/trap.c b/kern/trap.c index ee3c6ed..4ac1540 100644 --- a/kern/trap.c +++ b/kern/trap.c @@ -1,11 +1,11 @@ #include -#include #include #include #include #include #include +#include #include #include #include @@ -150,11 +150,6 @@ void clock_interrupt_handler(int irq) { timecounter_inc(); - if (!has_runnable) return; - // maybe do nothing would be better, try to avoid recursive call to schedule - // because we must be in a schedule when runnable is false - // we just need a clock int to wake up it - // 当一个函数的时间片全用完时 if (--p_proc_ready->pcb.ticks == 0) { p_proc_ready->pcb.ticks = p_proc_ready->pcb.priority; @@ -168,12 +163,14 @@ clock_interrupt_handler(int irq) void kb_interrupt_handler(int irq) { - u8 ch = inb(0x60); + u32 ch = (u32)inb(0x60); if ((ch & 0x80) != 0) return; ch = keymap[ch]; - if ('a' <= ch && ch <= 'z') + if (0x20 <= ch && ch <= 0x7e) add_keyboard_buf(ch); + if (ch == ENTER) + add_keyboard_buf('\n'); } /* diff --git a/kern/wait.c b/kern/wait.c new file mode 100644 index 0000000..16fd9bf --- /dev/null +++ b/kern/wait.c @@ -0,0 +1,39 @@ +#include +#include + +#include +#include + +ssize_t +kern_wait(int *wstatus) +{ + // 相比于fork来说,wait的实现简单很多 + // 语义实现比较清晰,没有fork那么多难点要处理,所以这里并不会给大家太多引导 + // 需要大家自己思考wait怎么实现。 + + // 在实现之前你必须得读一遍文档`man 2 wait` + // 了解到wait大概要做什么 + panic("Unimplement! Read The F**king Manual"); + + // 当然读文档是一方面,最重要的还是代码实现 + // wait系统调用与exit系统调用关系密切,所以在实现wait之前需要先读一遍exit为好 + // 可能读完exit的代码你可能知道wait该具体做什么了 + panic("Unimplement! Read The F**king Source Code"); + + // 接下来就是你自己的实现了,我们在设计的时候这段代码不会有太大问题 + // 在实现完后你任然要对自己来个灵魂拷问 + // 1. 上锁上了吗?所有临界情况都考虑到了吗?(永远要相信有各种奇奇怪怪的并发问题) + // 2. 所有错误情况都判断到了吗?错误情况怎么处理?(RTFM->`man 2 wait`) + // 3. 是否所有的资源都正确回收了? + // 4. 你写的代码真的符合wait语义吗? + panic("Unimplement! soul torture"); + return 0; +} + +ssize_t +do_wait(int *wstatus) +{ + assert((uintptr_t)wstatus < KERNBASE); + assert((uintptr_t)wstatus + sizeof(wstatus) < KERNBASE); + return kern_wait(wstatus); +} \ No newline at end of file diff --git a/lab5-finish.png b/lab5-finish.png deleted file mode 100644 index dcccf6978934a821bbd240dfc0d977058dc874ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26378 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 ChzTkH literal 0 HcmV?d00001 diff --git a/lib/kern/fork_ack.o b/lib/kern/fork_ack.o new file mode 100644 index 0000000000000000000000000000000000000000..296508e55dbf70f224b81caa6a0d0e02f48d177d GIT binary patch literal 2828 zcma)8UuauZ7(X{@wX5yc%}tR>7r|mj-8BtEm(4-9d7RT(rm#8fMogRAwX{vcO~U@L zb%QuGL}3rU2z$^+!H0@ND()e&jJG_3*8J+JNy0Y>W1cy+Ip^tHI2LEV|5a`zX1p21vGtg(4{My+~Bz~fhs1(=F{ zU;*A+&m!@FqX0)qKiHwC#^&hT5%5*?{gsmLTNCJ#>d;eheShq>xA@vpx&k%)rMwkj zDthwVN3DK`i@IFWlSO^Gq%X&H8T&1JeVjZn@OB_YdNbk0UMlHJaXo?93BNbUA79=Z z;z##iU1=*-?7zB0kN?;H=T}OaH~Sxt>-n+UoG!RW>Br>Ru8N++M%29xB|Z1ko#y%s zK!pcY74)1{I5YR;*j+EW(v{(4taJq0oJTp#jsGkzPJmX^OQ*iUiD(S^OTE;Vil|I7n{`spHL6C{gNV*3La1IDQ4ttXBBUMl%%gsGOtKqQ z|Dfv}A9aW9-odm|d-v?w9%(<=n@{KRk+{9pj&AA9d#H0P7PX^W?as|U&(-o~HDT0a z?Cn0teV56FG1g;HtW)nQ>vV&)v8k@^6SUx2a2%8te(YM^a6YuVxqkmuMEJf}#rJs7 zzh}wM4nB>slK(V(ypDhHi_lU({A-96IQK=2^;qOu=$e0@U!T-U^5~1keb&|9IPN6` z)C^6VYa@OJ+N_m0C}DK&c_G+0%j@V;MA++O5I?pAV1@k-)VQ#cM^>1yTBTlwZF;c| zGrU%d_Sd<88GdgWPA$X3z@~Ssr(7qQN;v()$zxfS8q6kphn>V=I;Wg;&CKTe`kZVw z(a&?%8QZo^4LNSwgNbC{kQ&Ok$mmxYceF2&W17k&Jiy{7RcbWhoN)T6S;EWVJ}k6j zA9QH7QtuGs`~E<5zxap5e@gg|h5uCe&xQX^cwR%+D+_;J_#49C7Ca}oN{o5eq7_`v zQ_#$BB?jLid{p?If_Do(B)CVgEBLtJlHd!1za~cA?}h(S_$k5H19-v29`5Qr@(Y|j(^ z*J?jE4 zp!J?GZcuD0Q*WEtjHg^h+>5^HeKL+?muQc~$8TlKs5yi?_m>czSE53Tg{x{(*ME_+6iz* T%s%*g5sVwaB(4d9HgW#~>?1fX literal 0 HcmV?d00001 diff --git a/kern/keyboard.c b/lib/kern/keyboard.c similarity index 90% rename from kern/keyboard.c rename to lib/kern/keyboard.c index 634436d..5493284 100644 --- a/kern/keyboard.c +++ b/lib/kern/keyboard.c @@ -3,6 +3,7 @@ #include #include +#include #define KB_INBUF_SIZE 1024 @@ -26,7 +27,8 @@ void add_keyboard_buf(u8 ch) { // 上个自旋锁,保证线程安全(不建议用中断)计组课上讲过,相信大家的记忆力 - while (xchg(&kb_input.lock, 1) == 1); + while (xchg(&kb_input.lock, 1) == 1) + schedule(); if (kb_input.count == KB_INBUF_SIZE) goto free; @@ -50,7 +52,8 @@ read_keyboard_buf(void) u8 res; // 上个自旋锁,保证线程安全(不建议用中断)计组课上讲过,相信大家的记忆力 - while (xchg(&kb_input.lock, 1) == 1); + while (xchg(&kb_input.lock, 1) == 1) + schedule(); if (kb_input.count == 0) { res = -1; diff --git a/lib/kern/kmalloc.c b/lib/kern/kmalloc.c new file mode 100644 index 0000000..e3d0b99 --- /dev/null +++ b/lib/kern/kmalloc.c @@ -0,0 +1,124 @@ +#include +#include +#include + +#include +#include +#include +#include + +static u32 phy_malloc_4k_lock; +static phyaddr_t phy_malloc_4k_p = 96 * MB; + +/* + * 释放物理页面,这里并没有为你实现好free_4k的代码, + * 你需要自己实现一个数据结构用于维护释放的页面, + * 需要有回收资源的意识,这是一个系统必须有的功能。 + */ +void +phy_free_4k(phyaddr_t paddr) +{ + assert(paddr % PGSIZE == 0); +} +/* + * 分配物理页面,每次分配4kb,一页 + * 分配的物理内存区间为96MB~128MB + */ +phyaddr_t +phy_malloc_4k(void) +{ + while(xchg(&phy_malloc_4k_lock, 1) == 1) + schedule(); + + assert(phy_malloc_4k_p < 128 * MB); + phyaddr_t paddr = phy_malloc_4k_p; + phy_malloc_4k_p += PGSIZE; +free: + xchg(&phy_malloc_4k_lock, 0); + return paddr; +} + +struct kmalloc_header { + struct kmalloc_header *ptr; + size_t size; +}; + +static struct kmalloc_header *freePtr; +static u32 malloc_lock; + +/* + * 释放kmalloc申请的内存 + */ +void +kfree(void *v) +{ + struct kmalloc_header *bp, *p; + bp = (struct kmalloc_header*)v - 1; + + while(xchg(&malloc_lock, 1) == 1) + schedule(); + + for (p = freePtr; !(bp > p && bp < p->ptr); p = p->ptr) { + if (p >= p->ptr && (bp > p || bp < p->ptr)) { + break; + } + } + if (bp + bp->size == p->ptr) { + bp->size += p->ptr->size; + bp->ptr = p->ptr->ptr; + } else { + bp->ptr = p->ptr; + } + if (p + p->size == bp) { + p->size += bp->size; + p->ptr = bp->ptr; + } else { + p->ptr = bp; + } + freePtr = p; +free: + xchg(&malloc_lock, 0); +} + +/* + * 分配内存,大小为n字节。 + * 分配物理内存区间为64MB~96MB + */ +void * +kmalloc(size_t n) +{ + struct kmalloc_header *p, *prevP; + size_t nUnits; + void *ret; + + while(xchg(&malloc_lock, 1) == 1) + schedule(); + + nUnits = (n + sizeof(struct kmalloc_header) - 1) + / sizeof(struct kmalloc_header) + 1; + if ((prevP = freePtr) == 0) { + freePtr = prevP = (void *)K_PHY2LIN(64 * MB); + freePtr->ptr = freePtr; + freePtr->size = (32 * MB) / sizeof(struct kmalloc_header); + } + for (p = prevP->ptr ; ; prevP = p, p = p->ptr) { + if (p->size >= nUnits) { + if (p->size == nUnits) { + prevP->ptr = p->ptr; + } else { + p->size -= nUnits; + p += p->size; + p->size = nUnits; + } + freePtr = prevP; + ret = (void*)(p + 1); + goto free; + } + if (p == freePtr) { + panic("malloc failed!"); + } + } +free: + xchg(&malloc_lock, 0); + return ret; +} diff --git a/lib/kern/terminal.c b/lib/kern/terminal.c index 5cc4896..df045d6 100644 --- a/lib/kern/terminal.c +++ b/lib/kern/terminal.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -17,8 +18,6 @@ write_to_terminal(u16 disp_pos, u16 content) } struct kprintfbuf { - // 锁 - u32 lock; // 通用 u16 color; i16 cursor_row; @@ -357,13 +356,13 @@ kprintfputch(int ch, struct kprintfbuf *b) int vkprintf(const char *fmt, va_list ap) { - while (xchg(&TTY.lock, 1) == 1); + int rc; - TTY.cnt = 0; - vprintfmt((void*)kprintfputch, &TTY, fmt, ap); - - int rc = TTY.cnt; - xchg(&TTY.lock, 0); + DISABLE_INT(); + TTY.cnt = 0; + vprintfmt((void*)kprintfputch, &TTY, fmt, ap); + rc = TTY.cnt; + ENABLE_INT(); return rc; } diff --git a/lib/user/astart.asm b/lib/user/astart.asm index 888cecf..2c29ced 100644 --- a/lib/user/astart.asm +++ b/lib/user/astart.asm @@ -1,8 +1,10 @@ [section .text] extern main +extern exit global _start _start: ; 第一条指令 call main - jmp $ \ No newline at end of file + push eax + call exit \ No newline at end of file diff --git a/user/snake.bin b/lib/user/firework.bin similarity index 55% rename from user/snake.bin rename to lib/user/firework.bin index 30d31278b52bfbcd32a57c1d8d701491a46e5a37..03d425609c8f3cee22a8cfde118c6cde8899ae04 100644 GIT binary patch literal 21000 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 aIrfgxxF;-rFrP;GD#$%+T+@kU==0xuA*vVv literal 22496 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 diff --git a/lib/user/stdio.c b/lib/user/stdio.c index 7b46ccb..edfc412 100644 --- a/lib/user/stdio.c +++ b/lib/user/stdio.c @@ -21,8 +21,8 @@ printfputch(int ch, struct printfbuf *b) { b->cnt++; *b->buf_p++ = (char)ch; - if (b->buf_p == b->buf + PRINTFBUF_SIZE) { - write(STDOUT, b->buf, sizeof(b->buf)); + if (ch == '\n' || b->buf_p == b->buf + PRINTFBUF_SIZE) { + write(STDOUT, b->buf, b->buf_p - b->buf); b->buf_p = b->buf; } } @@ -61,11 +61,16 @@ printf(const char *fmt, ...) * 将printf的缓冲区全写出去 */ void -fflush() +fflush(void) { struct printfbuf *b = &printfb; + + while (xchg(&b->lock, 1) == 1); + write(STDOUT, b->buf, b->buf_p - b->buf); b->buf_p = b->buf; + + xchg(&b->lock, 0); } @@ -82,7 +87,7 @@ static struct getchbuf getchb = { }; u8 -getch() +getch(void) { struct getchbuf *b = &getchb; @@ -98,5 +103,13 @@ getch() xchg(&b->lock, 0); + return rc; +} + +u8 +getchar(void) +{ + u8 rc = -1; + while ((rc = getch()) == (u8)-1); return rc; } \ No newline at end of file diff --git a/lib/user/syscall.c b/lib/user/syscall.c index e698dfd..029ee23 100644 --- a/lib/user/syscall.c +++ b/lib/user/syscall.c @@ -1,21 +1,5 @@ #include -// 第一个冒号区间:汇编命令 -// 第二个冒号区间:输出操作符扩展 -// "=a" 这条命令结束后将eax寄存器的值赋给ret变量 -// 第三个冒号区间:输入操作符扩展 -// "a" 将变量赋给eax寄存器 -// "b" 将变量赋给ebx寄存器 -// "c" 将变量赋给ecx寄存器 -// "d" 将变量赋给edx寄存器 -// "S" 将变量赋给esi寄存器 -// "D" 将变量赋给edi寄存器 -// 第四个冒号区间:指令约束,当汇编指令会修改相关操作时需要修改 -// 最主要是防被gcc编译器优化 -// "a/b/c/d/S/D" 提醒编译器这些寄存器的值会在汇编指令执行中被修改 -// "cc" 提醒编译器eflags寄存器的值在汇编指令执行中会被修改 -// "memory" 提醒编译器内存中的数据在汇编指令执行中会被修改 - ssize_t syscall0(size_t NR_syscall) { @@ -38,7 +22,8 @@ syscall1(size_t NR_syscall, size_t p1) : "cc", "memory"); return ret; } -ssize_t syscall2(size_t NR_syscall, size_t p1, size_t p2) +ssize_t +syscall2(size_t NR_syscall, size_t p1, size_t p2) { ssize_t ret; asm volatile("int $0x80" @@ -49,7 +34,8 @@ ssize_t syscall2(size_t NR_syscall, size_t p1, size_t p2) : "cc", "memory"); return ret; } -ssize_t syscall3(size_t NR_syscall, size_t p1, size_t p2, size_t p3) +ssize_t +syscall3(size_t NR_syscall, size_t p1, size_t p2, size_t p3) { ssize_t ret; asm volatile("int $0x80" @@ -61,7 +47,8 @@ ssize_t syscall3(size_t NR_syscall, size_t p1, size_t p2, size_t p3) : "cc", "memory"); return ret; } -ssize_t syscall4(size_t NR_syscall, size_t p1, size_t p2, +ssize_t +syscall4(size_t NR_syscall, size_t p1, size_t p2, size_t p3, size_t p4) { ssize_t ret; @@ -75,7 +62,8 @@ ssize_t syscall4(size_t NR_syscall, size_t p1, size_t p2, : "cc", "memory"); return ret; } -ssize_t syscall5(size_t NR_syscall, size_t p1, size_t p2, +ssize_t +syscall5(size_t NR_syscall, size_t p1, size_t p2, size_t p3, size_t p4, size_t p5) { ssize_t ret; @@ -92,13 +80,13 @@ ssize_t syscall5(size_t NR_syscall, size_t p1, size_t p2, } ssize_t -get_ticks() +get_ticks(void) { return syscall0(_NR_get_ticks); } ssize_t -get_pid() +get_pid(void) { return syscall0(_NR_get_pid); } @@ -116,12 +104,31 @@ write(int fd, const void *buf, size_t count) } ssize_t -delay_ticks(u32 ticks) +exec(const char *pathname) { - return syscall1(_NR_delay_ticks, ticks); + return syscall1(_NR_exec, (size_t)pathname); } -ssize_t lml_mmap(int pid, void* src, void* dst, size_t length) +ssize_t +fork(void) { - return syscall4(_NR_mmap, pid, (size_t)src, (size_t)dst, length); + return syscall0(_NR_fork); +} + +ssize_t +exit(int status) +{ + return syscall1(_NR_exit, status); +} + +ssize_t +wait(int *wstatus) +{ + return syscall1(_NR_wait, (size_t)wstatus); +} + +ssize_t +fork_ack(void) +{ + return syscall0(_NR_fork_ack); } \ No newline at end of file diff --git a/memory_in_kernel.png b/memory_in_kernel.png deleted file mode 100644 index 69121660aaaef356e15d7e0f2f086afb5d24e235..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17032 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 $(OBJDIR)/.snakemd5 - @md5sum $< | awk '{print $$1}' | cmp -s $(OBJDIR)/.snakemd5 || (echo 'you are a cheater!!!'; exit 1;) +$(OBJDIR)/user/firework.bin: lib/user/firework.bin @mkdir -p $(@D) @cp $< $(@D) diff --git a/user/delay.c b/user/delay.c deleted file mode 100644 index ec34cef..0000000 --- a/user/delay.c +++ /dev/null @@ -1,22 +0,0 @@ -#include - -#include -#include - -int main() -{ - int pid = get_pid(); - int target_ticks = (pid + 1) * 1000; - - while(1) { - printf("\x1b[%dmI'm %d!\x1b[0m", 90 + pid + 1, pid); - fflush(); - int before_ticks = get_ticks(); - delay_ticks(target_ticks); - int after_ticks = get_ticks(); - - int real_ticks = after_ticks - before_ticks; - int delta_ticks = real_ticks - target_ticks; - assert(-5 <= delta_ticks && delta_ticks <= 5); - } -} \ No newline at end of file diff --git a/user/forkbomb.c b/user/forkbomb.c new file mode 100644 index 0000000..3e9a51a --- /dev/null +++ b/user/forkbomb.c @@ -0,0 +1,47 @@ +#include +#include + +static size_t random_seed; +static size_t rand() { return (((random_seed = random_seed * 214013L + 2531011L) >> 16) & 0x7fff);} + +void bomb_salve(void) +{ + fork_ack(); + + random_seed = get_ticks() & 0x7fff; + + for (int i = 0 ; i < get_pid() ; i++) + rand(); + + for (int i = 0 ; i < (rand() & 0xf) ; i++) { + int pid = fork(); + if (pid == 0) + bomb_salve(); + for (int i = 0 ; i < rand() ; i++) + ; // do nothing + } + + if (rand() % 2 == 1) { + while (wait(NULL) >= 0); + } + exit(0); +} + +void bomb_master(void) +{ + random_seed = get_ticks() & 0x7fff; + while (1) { + int pid = fork(); + if (pid == 0) + bomb_salve(); + for (int i = 0 ; i < rand() ; i++) + ; // do nothing + while (wait(NULL) >= 0); + } +} + +int main() +{ + bomb_master(); +} + diff --git a/user/hack.c b/user/hack.c deleted file mode 100644 index 6a9611f..0000000 --- a/user/hack.c +++ /dev/null @@ -1,38 +0,0 @@ -#include -#include -#include - -#define PID_SNAKE 0 -#define PAGE_SIZE 4096 -#define DATA_SEG_SIZE (4 * PAGE_SIZE) - -typedef struct Food { - char hint[16]; - int x; - int y; - int score; -} Food; - -char __attribute__((aligned(0x1000))) snake_seg_data[DATA_SEG_SIZE]; -// this attribute is necessary to make the pointer 4K aligned -int main() -{ - Food* food = NULL; - lml_mmap(PID_SNAKE, (void*)0x0804d000, (void*)snake_seg_data, DATA_SEG_SIZE); - // data segment: - // Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align - // LOAD 0x004000 0x0804d000 0x0804d000 0x0163c 0x12500 RW 0x1000 - // 'This is a food' starts @ file offset 0x542c, while .data starts @ 0x4000 - // so, offset is 0x142c - food = (Food*)(snake_seg_data + 0x142c); - // printf("%s\n", food->hint); - while (1) { - // printf("%d %d", food->x, food->y); - if (food->x <= 0) food->x = 1; - if (food->y <= 0) food->y = 1; - if (food->x >= 70) food->x = 69; - if (food->y >= 25) food->y = 24; - // according to some trial, XMAX(right veritcal line border)=69, YMAX(low edge of screen)=24 - } - return 0; -} \ No newline at end of file diff --git a/user/initproc.c b/user/initproc.c new file mode 100644 index 0000000..ee61274 --- /dev/null +++ b/user/initproc.c @@ -0,0 +1,22 @@ +#include + +#include +#include + +int main() +{ + ssize_t pid = fork(); + + if (pid == 0) { + int ret = exec("shell.bin"); + panic("exec failed! errno: %d", ret); + } + + if (pid < 0) + panic("init process fork failed errno: %d", pid); + + int wstatus; + while (1) { + pid = wait(&wstatus); + } +} \ No newline at end of file diff --git a/user/shell.c b/user/shell.c new file mode 100644 index 0000000..d1c27f4 --- /dev/null +++ b/user/shell.c @@ -0,0 +1,52 @@ +#include +#include + +#include +#include +#include + + +int main() { + int childStatus = 0; + while (1) { + printf("\x1b[32mMINIOS\x1b[0m$ "); + fflush(); + + int cntInput = 0; + char input[512] = {0}; + while (1) { + char c = getchar(); + printf("%c",c); + fflush(); + if (c != '\n') { + input[cntInput++] = c; + } else { + input[cntInput++] = '\0'; + break; + } + } + + if (strcmp(input, "?") == 0) { + printf("%d\n",WEXITSTATUS(childStatus)); + continue; + } + + int ForkRetVal = fork(); + if (ForkRetVal < 0) { + printf("fork failed!\n"); + continue; + } + if (ForkRetVal == 0) { + exec(input); + printf("exec failed!\n"); + exit(1); + } + + int wait_pid; + wait_pid = wait(&childStatus); + if ((wait_pid = wait(&childStatus)) >= 0) { + // do nothing + } + } + return 0; +} diff --git a/user/testfork.c b/user/testfork.c new file mode 100644 index 0000000..23c2b0c --- /dev/null +++ b/user/testfork.c @@ -0,0 +1,22 @@ +#include +#include + +int main() +{ + int pid = fork(); + if (pid) { + while (1) { + printf("I'm fa, son pid = %d", pid); + fflush(); + for (int i = 0 ; i < (int)1e8 ; i++) + ;//do nothing + } + } else { + while (1) { + printf("I'm son"); + fflush(); + for (int i = 0 ; i < (int)1e8 ; i++) + ;//do nothing + } + } +} \ No newline at end of file diff --git a/user/testkey.c b/user/testkey.c deleted file mode 100644 index e1dbacd..0000000 --- a/user/testkey.c +++ /dev/null @@ -1,12 +0,0 @@ -#include - -int main() -{ - while(1) { - u8 ch = getch(); - if (ch == 255) - continue; - printf("%c", ch); - fflush(); - } -} \ No newline at end of file diff --git a/user/testpid.c b/user/testpid.c deleted file mode 100644 index ab6b052..0000000 --- a/user/testpid.c +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include - -int main() -{ - while (1) { - printf("pid: %d!", get_pid()); - fflush(); - for (int i = 0 ; i < (int)1e8 ; i++) - ;//do nothing - } - return 0; -} \ No newline at end of file diff --git a/user/testwait.c b/user/testwait.c new file mode 100644 index 0000000..a788b6e --- /dev/null +++ b/user/testwait.c @@ -0,0 +1,115 @@ +#include +#include + +#include +#include +#include + +void test_fork_wait1(void) +{ + ssize_t pid = fork(); + + assert(pid >= 0); + + if (pid == 0) + exit(114); + + int wstatus; + assert(pid == wait(&wstatus)); + + assert(WEXITSTATUS(wstatus) == 114); + + printf("\x1b[92mtest_fork_wait1 passed!\x1b[0m\n"); +} + +void test_fork_wait2(void) +{ + ssize_t pid = fork(); + + assert(pid >= 0); + + if (pid == 0) + exit(514); + + assert(pid == wait(NULL)); + + printf("\x1b[92mtest_fork_wait2 passed!\x1b[0m\n"); +} + +void test_empty_wait(void) +{ + assert(wait(NULL) == -ECHILD); + + printf("\x1b[92mtest_empty_wait passed!\x1b[0m\n"); +} + +void test_fork_limit(void) +{ + int xor_sum = 0; + + for (int i = 1 ; i <= 17 ; i++) { + ssize_t pid = fork(); + + assert(pid >= 0); + + if (pid == 0) + exit(0); + + xor_sum ^= pid; + } + + assert(fork() == -EAGAIN); + + int wait_cnt = 0, wait_pid; + while ((wait_pid = wait(NULL)) >= 0) + wait_cnt++, xor_sum ^= wait_pid; + + assert(wait_cnt == 17); + assert(xor_sum == 0); + + printf("\x1b[92mtest_fork_limit passed!\x1b[0m\n"); +} + +void test_wait_is_sleeping(void) +{ + ssize_t rt_pid = get_pid(); + + for (int i = 1 ; i <= 17 ; i++) { + ssize_t pid = fork(); + + assert(pid >= 0); + + if (pid > 0) { + int wstatus; + assert(pid == wait(&wstatus)); + assert(WEXITSTATUS(wstatus) == 42); + if (get_pid() != rt_pid) + exit(42); + break; + } + } + + if (get_pid() != rt_pid) { + ssize_t la_ticks = get_ticks(); + + for (int i = 1 ; i <= (int)5e6 ; i++) { + ssize_t now_ticks = get_ticks(); + assert(now_ticks - la_ticks <= 2); + la_ticks = now_ticks; + } + + exit(42); + } + + printf("\x1b[92mtest_wait_is_sleeping passed!\x1b[0m\n"); +} + +int main() +{ + test_fork_wait1(); + test_fork_wait2(); + test_empty_wait(); + test_fork_limit(); + test_wait_is_sleeping(); + printf("\x1b[92mall tests passed!\x1b[0m\n"); +} \ No newline at end of file diff --git a/实验五-v0.3.md b/实验五-v0.3.md deleted file mode 100644 index a5cc059..0000000 --- a/实验五-v0.3.md +++ /dev/null @@ -1,359 +0,0 @@ -
- 实验五 系统调用、页表 -
- -
- 谷建华 -
- -
- 2022-10-28 v0.3 -
- -#### 实验目的 - -1. 学习用户态执行系统调用到内核态处理的整个过程. -2. 学习页表,理解如何从线性地址经过页表映射到物理地址实现进程间的内存资源隔离. -3. 学习页表项相关位的功能,如何维护页表数据结构. - -#### 实验预习内容 - -1. 系统调用规范. -2. 页表数据结构. -3. 页表项的组成. - -#### 实验内容 - -1. 补全`main.c`中的代码,为每个用户进程加载在磁盘中的ELF程序文件到用户地址空间. - (1) `main.c`中用户态的程序加载方式由原先加载kernel中的函数变成加载用户ELF文件的方式,你需要添加相应代码实现用户态程序加载功能. - (2) 我们将文件系统读取函数`read_file`准备好,给定短目录项名和加载的地址该函数会将指定文件加载到地址中. - (3) 我们将内核段地址映射函数`map_kern`准备好,它会将`3GB + 0MB ~ 3GB + 128MB`的线性地址(内存分布模型见实验参考最后一节)映射到`0MB ~ 128MB`的物理地址,供大家学习页表的初始化过程. - (4) `phy_malloc_4k`是一个非常简单的内存分配函数,它会分配物理地址`64MB ~ 128MB`区间的的内存,每次分配4KB,一个页面大小(暂时可以不用考虑内存回收的情况,只需要光分配就行了). - (5) 你需要做的是将用户ELF文件从文件系统中读取,并解析ELF文件将程序段正确加载到每个进程中的地址空间,使得能够运行用户态程序.我们准备了两个用户测例文件`testpid.bin`和`testkey.bin`,第一个测试`get_pid`系统调用,第二个测试键盘输入,**需要验证两个程序能够并发地执行**. - (6) 如果你在实现中遇到了`Page Fault`,那么基本上意味着你加载错了,这个时候请根据报错的`eip`信息(pc程序计数器)然后对ELF文件进行反汇编将触发错误的指令找到,必要的时候需要通过`gdb`一条汇编一条汇编地执行直到找到问题.跟页表打交道非常容易出现这种问题,请耐心调试. -2. 添加`delay_ticks`系统调用. - (1) `delay_ticks`的系统调用的C语言语义如下: - ```C - // 进程休眠ticks个时钟中断 - // 系统调用默认返回0 - ssize_t delay_ticks(u32 ticks); - ``` - (2) `delay_ticks`的系统调用号自行定义,你需要写在内核`kern/syscall.c`和用户`lib/user/syscall.c`的两部分的接口. - (3) 在`user/delay.c`存放着测试该系统调用的代码,而`delay_ticks`函数被注释掉了(我们并没有给出函数接口),你需要在实现对应接口后取消注释测试用户程序`delay.bin`. - (4) 你需要开三个用户进程同时执行`delay.bin`,这三个用户进程的pid号分别为`0,1,2`,`delay.bin`会获取进程pid号来给出休眠的时长.预计效果图如下: - - ![](./lab5-finish.png) - - (5) 你需要注意一个边界情况:当三个进程都休眠了,你怎么解决?谁接替执行流?或是干脆休眠核让执行流干脆不执行直到下个中断? -3. (自我提高内容,自己想做就做,不用写进报告,**禁止内卷**)添加`mmap`系统调用对贪吃蛇程序`snake.bin`进行数据注入. - (1) 你还记得实验四的贪吃蛇吗?还是这个程序,不过这次这个程序抽风了,它的食物出现在了地图外,那岂不是永远无法游玩了?不过好在天无绝人之路,善良的设计者设计食物结构体结构如下: - ```c - struct Food { - char hint[16]; - int x; - int y; - int score; - }; - - struct Food food = { - .hint = "This is a food", - //... - }; - ``` - food的值会放在elf的data段中,相信根据elf文件的信息和上面的初始化内容你能够找到food在内存中的地址. - (2) 编写`mmap`系统调用,其C语言语义如下(非官方语义,也可以自行设计其他语义解释): - ```c - // 将pid号进程的线性地址[src, src + length)中的页面共享到该进程的线性地址[dst, dst + length) - // src,length和dst需要4096对齐 - // 由于是自行实现的,没有过多的要求. - ssize_t mmap(int pid, void *src, size_t length, void *dst); - ``` - 自行写一个hack程序,在`main.c`中创建两个用户进程`snake.bin`和自己的hack程序,hack程序通过调用`mmap`系统调用跟`snake.bin`的部分内存共享,然后hack程序修改`food`的数据让食物回到地图内(每帧会重新绘制地图).这样就可以重新游玩贪吃蛇. - -#### 实验总结 - -1. 系统调用的入口参数是如何传入内核的?返回值又是如何返回给进程的? -2. 时钟中断和系统调用对IDT的初始化有什么不同? -3. 该实验中初始化内核页表和用户页表有啥区别? - -#### 实验参考 - -##### 系统调用 - -在上一个实验中,我们可以调用`kprintf`函数实现输出的功能,我们仅仅实现了一个“虚假”的用户态,虽然段寄存器的权限在用户态,但是我们依然能够调用kernel中的函数,但是这么做有一个弊端,用户态下能够轻易调用内核的函数,这是我们所不希望的,所以我们通过页表将进程资源隔离,通过页表给用户进程戴上一个VR眼镜,这样用户进程在执行的时候就看不到内核的函数. - -但是`printf`是需要向终端输出字符的,但是终端显示被内核所掌控,这个时候用户就需要使用系统调用向内核请求服务.简单理解就是用户做不了的需要向内核申请服务. - -系统调用类似函数调用,不过它是跨越权限的,系统调用也有它的一套规范,这套规范可以阅读`man syscall`手册查看,下面是调用规范的部分截取. - -``` -Architecture calling conventions - Every architecture has its own way of invoking and passing arguments to - the kernel. The details for various architectures are listed in the - two tables below. - - The first table lists the instruction used to transition to kernel mode - (which might not be the fastest or best way to transition to the ker‐ - nel, so you might have to refer to vdso(7)), the register used to indi‐ - cate the system call number, the register(s) used to return the system - call result, and the register used to signal an error. - - Arch/ABI Instruction System Ret Ret Error Notes - call # val val2 - ─────────────────────────────────────────────────────────────────── - alpha callsys v0 v0 a4 a3 1, 6 - arc trap0 r8 r0 - - - arm/OABI swi NR - a1 - - 2 - arm/EABI swi 0x0 r7 r0 r1 - - arm64 svc #0 x8 x0 x1 - - blackfin excpt 0x0 P0 R0 - - - i386 int $0x80 eax eax edx - -``` - -###### 系统调用汇编命令 - -看最后一行,我们可以获悉linux对i386架构是调用`int $0x80`汇编指令进行系统调用,调用这条指令后就可以直接进内核态进行系统调用处理. - -在之前的学习中,我们知道`int`的命令实际上是触发中断,后面跟着的数字是中断号,所以在i386架构中,系统调用本质上跟中断类似,不过不是由硬件触发是由用户自己调用触发.如果愿意,我们可以修改系统调用的中断号,只要不发生冲突就行. - -```c -// 在start.c中系统调用初始化 -// INT_VECTOR_SYSCALL值可以任意,这次的实验用的是linux的0x80 -init_gate(idt + INT_VECTOR_SYSCALL, DA_386IGate, - int_syscall, PRIVILEGE_USER); -``` - -###### 系统调用号 - -但是要知道内核可不只有一种功能,如何获悉用户想要哪种功能就看下一列`System call #`,可以知道内核是根据`eax`寄存器的值获悉用户需要哪种功能,这个值就叫系统调用号. - -系统调用号可以有很多种规范,相同的系统调用号在不同的规范下内核会实现不同的功能,我们的实验用是自创教学用的规范,专业标准的是叫POSIX(可移植操作系统接口)规范,它的一部分是对于系统调用号对应的功能进行定义,这样只要遵循的相同的系统调用规范就能让一个相同的用户程序在不同的操作系统上运行.在`man syscalls`手册中有写到:linux的系统调用号在64位机器上系统调用号在`/usr/include/asm/unistd_64.h`文件中,数了数有四百多个,量可以说是相当大了. - -###### 系统调用其余参数 - -系统调用可不光有一个系统调用号,它还可以附带一些参数,我们继续在`man syscall`中阅读可以看到这么一段: - -``` -The second table shows the registers used to pass the system call argu‐ -ments. - - Arch/ABI arg1 arg2 arg3 arg4 arg5 arg6 arg7 Notes - ────────────────────────────────────────────────────────────── - alpha a0 a1 a2 a3 a4 a5 - - arc r0 r1 r2 r3 r4 r5 - - arm/OABI a1 a2 a3 a4 v1 v2 v3 - arm/EABI r0 r1 r2 r3 r4 r5 r6 - arm64 x0 x1 x2 x3 x4 x5 - - blackfin R0 R1 R2 R3 R4 R5 - - i386 ebx ecx edx esi edi ebp - -``` - -看最后一行,可以知道系统调用是由`ebx`, `ecx`, `edx`, `esi`, `edi`, `ebp`这六个寄存器传递参数.不像正常的函数调用传参靠栈,而是靠寄存器传递参数,而且最多只能传递6个,如果要传递复杂的结构可以考虑传入结构体指针的方式解决. - -虽然上面的规范如此,但是没有定死,我们完全可以将`ebx`作为系统调用号,`eax`作为参数,不过这么做有点吃饱了撑着不去兼容规范. - -###### 系统调用返回值以及错误码 - -再看第一张表的`Retval`,可以获悉到系统调用也是可以有返回值的,返回值一般放在`eax`寄存器,当`eax`寄存器放不下的时候会将第二部分放`edx`,但是这种情况比较罕见,所以暂且不用去理会. - -系统调用的返回值与普通函数的返回值中不太一样的一点是它会返回错误号,错误号是一类特殊的返回值,当用户请求的系统调用正确时会返回0或系统调用规定的值,但有错误(常见的比如文件路径不存在,用户越权写系统文件)时系统调用会返回错误号,错误号值的范围从-1,-2,-3...以此类推,大概有一百来个.通过错误号,用户可以知道自己调用系统调用触发了什么问题,可以阅读`man errno`手册可以获得错误号对应的语义.在终端中输入错误命令或在平常C语言代码中调用`perror`函数输出的都是根据上一个系统调用的错误码信息输出相应的字符串. - -``` -$ ls -cstat cstat.c -$ stat 114514 -stat: cannot stat '114514': No such file or directory -$ cat cstat.c -// 你如果要问我怎么知道要引入这些头文件的,直接man翻手册啊 -// 正经人谁背的住那么多头文件,不如直接翻手册 -#include -#include -#include -#include - -int main() -{ - struct stat statbuf; - stat("1919810", &statbuf); - perror(""); -} -$ ./cstat -No such file or directory -``` - -就如上面的例子,两个都是访问的不存在的文件,获取到的错误码信息为ENOENT,具体值在POSIX中值被规定成了2,相当于系统调用返回-2,它的语义就是`No such file or directory`,所以两个命令都输出了这句话. - -由于错误码有限多个,所以同一个错误码在不同系统调用中有不同的语义,你如果会去翻系统调用的手册的时候会经常发现ERRORS这一栏,这里定义了一系列可能出现的问题以及会返回的对应错误码. - -###### 如何获取程序用到的系统调用 - -当你在终端中输入一行命令后发现它报错了,你肯定会很疑惑它为什么会这么报错,这个时候一种可行的做法就是使用`strace`命令,它会截获用户程序对应的系统调用. - -```shell -$ strace stat ./114514 -# strace 输出的东西太多,就截取跟114514相关的 -execve("/usr/bin/stat", ["stat", "./114514"], 0x7ffc75313828 /* 66 vars */) = 0 -lstat("./114514", 0x7ffca6294210) = -1 ENOENT (No such file or directory) -write(2, "cannot stat './114514'", 22) = 22 -``` - -根据strace的结果可以知道哪些系统调用发生了异常,上面可以知道`lstat`这个系统调用发生了异常,返回了ENOENT,用户程序可以通过其系统调用了解其实际干了什么,这也是一种猜测用户行为debug的一种方式. - -###### MINIOS系统调用处理逻辑 - -对于我们实验的代码,系统调用分成三步处理: - -+ `sys_*` 第一层处理函数,获取系统调用中需要的寄存器参数丢给下一层处理 -+ `do_*` 第二层处理函数,会将参数做一些转换和边界判断丢给下一层处理. -+ `kern_*` 第三层处理函数,也是实际处理函数,因为学生开发总是稀里糊涂的乱用处理函数,规定在内核中如果只能调用`kern_*`处理语义相同的功能. - -这三层在代码中可以体现,整个中断的处理流程跟时钟中断非常类似,还要简单. - -```nasm -; atrap.asm中的系统调用处理函数 -; 相比于硬件中断这段代码可太简单了 -int_syscall: - call save - sti - call syscall_handler - cli - ret -``` - -进内核态后先保存用户程序上下文(寄存器),然后调用`syscall_handler`函数进行处理,处理完毕后返回用户态,就这么简单. - -`syscall_handler`仅仅是根据系统调用号判断该用什么处理函数. - -```c -static ssize_t sys_get_ticks(void); -static ssize_t sys_get_pid(void); -static ssize_t sys_read(void); -static ssize_t sys_write(void); -// 这是种有趣的写法,举个例子 -// 这种写法钦定了syscall_table的第_NR_get_ticks项与sys_get_ticks函数绑定 -ssize_t (*syscall_table[])(void) = { -[_NR_get_ticks] sys_get_ticks, -[_NR_get_pid] sys_get_pid, -[_NR_read] sys_read, -[_NR_write] sys_write, -}; - -/* - * 系统调用处理函数 - */ -void -syscall_handler() -{ - int syscall_id = p_proc_ready->pcb.user_reg.eax; - ssize_t ret = (*syscall_table[syscall_id])(); - // 将用户态的寄存器值修改,在返回用户态时返回值就自然被写到了eax上 - p_proc_ready->pcb.regs.eax = ret; -} -``` - -##### 页表 - -在实验三,我们实际上已经引入了页表用于扩展地址空间,将由实模式的段偏移寻址模式变为页表寻址增加寻址能力,但是页表映射是恒等映射,让你们觉得好像内存哪里都能访问. - -###### 线性地址和物理地址 - -我们平时写的程序访问地址都是访问线性地址,线性地址是不用关心物理内存的约束,也就是意味着我们内存128MB的虚拟机,你可以尝试访问1GB处的线性地址,如果换成物理地址,你只能访问128MB以内的地址. - -我们访问线性地址,实际上也是在访问内存中的某处的物理地址,通过页表这个数据结构将线性地址转化为物理地址,就仿佛带了个VR眼镜,你觉得你能够看到某处线性地址,但是它实际上被VR眼镜转化到某一物理地址去了,同理你带不同的VR眼镜,相同的线性地址被解析成了不同的物理地址,每个进程能够访问到的物理内存地址范围互不相同,除非通过特殊手段,一个进程是不能访问到另一个进程的地址空间,这样就实现了进程资源之间的地址空间隔离. - -###### VR眼镜(cr3) - -在i386架构采用三级页表模式:页目录、页表和物理页(这个下文会慢慢解释),cr3中存放了页目录的地址.而这个cr3寄存器,它的意义就如上文提到的VR眼镜,每一个进程会维护一个cr3的值,代表进程的地址空间,每当进程发生调度的时候,新的进程会使用`lcr3`函数将cr3寄存器值更新,相当于将cr3的值mov过去,具体见执行代码,相当于换VR眼镜的过程. - -###### 线性地址转换到物理地址 - -好了,到了最麻烦的一部分,这一小节逻辑可以说是非常绕,根据经验,页表这一部分相当容易出现理论觉得懂了看代码觉得这不简单但是实操发现自己还是啥都不懂的情况,为了能够让大家顺利做实验,我们会写的尽量详细,写代码的时候建议多读几遍这一小节. - -线性地址一共有32位,硬件工程师将这32位划分成了三个部分: - -``` -A linear address 'la' has a three-part structure as follows: - -+--------10------+-------10-------+---------12----------+ -| Page Directory | Page Table | Offset within Page | -| Index | Index | | -+----------------+----------------+---------------------+ - \--- PDX(la) --/ \--- PTX(la) --/ \---- PGOFF(la) ----/ - \---------- PGNUM(la) ----------/ -``` - -硬件工程师规定一个页面的大小为4kb,4096bytes.将一个$ 2^{32} $的区间划分成$ 2^{20} $个页面,通过32位的高10位和中10位确定线性地址对应是哪一个**物理页面**,然后根据低12位确认在页面中的偏移从而确定线性地址对应的**实际物理地址**,对线性地址内存的修改最终会映射到对物理内存的修改. - -接下来要研究怎么根据高10位和中10位确认线性地址对应的是哪个物理页面.上文中的cr3寄存器就在这派上了用场,这个寄存器里面存着的值语义是一个**物理页面**的首地址,相当于对物理内存按照4kb为一块进行划分,其中任意一块的**首地址**(物理地址,低12位为0)可以成为一个合法的cr3值,cr3寄存器的值的意义如下,其中高20位就能表达物理页面的首地址,低12位全部保留为0. - -``` -+-----------20-----------+-----12-----+ -| Physical Address of | all 0 | -| Page | | -+------------------------+------------+ -``` - -一个页面4kb大,对于32位机器来说一个指针的大小为4字节,一个页面一共能够存放$ 2^{10} $个指向下一个物理页面的“指针”,高十位和中十位两个10位的数据,分别是页目录表和页表的下标,所以以高10位作为偏移量能够在cr3对应的物理页面找到指向(假设为)物理页面1首地址的“指针”,然后再以中10位作为偏移量在物理页面1找到指向(假设为)物理页面2首地址的“指针”,物理页面2就是线性地址对应的物理页面.cr3对应的物理页面官方命名为**页目录表**,物理页面1官方命名为**页表**.如果你对字典树(Trie树)这个数据结构比较熟悉的话,你就会发现这就是一个字符集大小为$ 2^{10} $的字典树. - -指向下一物理页面的“指针”在页目录表中被命名为**页目录项**在页表中被命名为**页表项**,线性地址的高10位又称**页目录索引**,中10位又称**页表索引**.不过觉得页目录项和页表项区分开来非常别扭,它们的结构和功能都完全一致,所以我觉得可以统称为**页表项**. - -由于物理页面的首地址的**低12位全是0**,所以硬件工程师将低12位重新利用起来.所以一个页表项的组成如下: - -``` -+-----------20-----------+-----12-----+ -| Physical Address of | Flag bit | -| Page | | -+------------------------+------------+ -``` - -页表项的高20位就能表示下一个物理页面的物理地址首地址,低12位是页表项的标志位,我们写实验的时候只需要关心这几位: - -+ `#define PTE_P 0x001` 存在位(第0位),标志着这一页表项指向的物理页面是否存在,如果没有被置位就视为不存在. -+ `#define PTE_W 0x002` 读写位(第1位),标志着这一页是否可写,如果被置位意味着是读写的,如果没有被置位意味着是只读的. -+ `#define PTE_U 0x004` 用户位(第2位),标志着这一页的权限段,如果被置位意味着是用户和内核都是可以访问的,如果没有被置位意味着只有内核有权限能够访问. - -最后梳理一下,线性地址转化为物理地址的过程: - -1. 根据cr3寄存器找到页目录表. -2. 根据线性地址的高10位找到对应的页目录项. -3. 根据页目录项的标志位判断是否有该页,做权限的检测等,如果非法就直接触发页面异常`Page Fault`. -4. 如果合法,根据页目录项找到页表. -5. 根据线性地址的中10位找到对应的页表项. -6. 根据页表项的标志位判断是否有该页,做权限的检测等,如果非法就直接触发页面异常`Page Fault`. -7. 如果合法,根据页表项找到物理页. -8. 根据线性地址的低12位找到对应的偏移,至此一次访存完成. - -可以看到其实页表本质是经过多次`找页表-找页表项`的循环,对于32位指令集架构是重复了2次,对于64位指令集架构就没32位那么漂亮了,它转换一个线性地址可能要重复3次、4次. - -###### tlb缓存(科普) - -根据上面的流程,实际上为了完成线性地址一次访存,需要访存物理内存三次,这会极大增大运行时的开销,所以硬件工程师将页表信息缓存下来,这在大家的计组课上讲过叫快表tlb,下次访问相同物理页时会使用tlb的信息加速访存. - -tlb加速了访存,但是于此同时增大的维护难度,会出现你修改了内存中的页表项后尝试访问页表项对应的线性地址发现修改的内容没有起作用的情况.这个时候就需要将页表进行刷新保证下次访存不会出问题. - -刷新命令其实很简单: - -```nasm -mov eax, cr3 -mov cr3, eax -``` - -相当于对cr3做一次重载硬件就会重新刷新tlb信息. - -###### MINIOS内存模型 - -之前我们实验的内存模型是恒等映射的. - -![](./before_memory.png) - -在这个实验由于用户地址空间隔离的需要,需要将内核程序迁移到`3GB ~ 3GB + 128MB`处运行,所以在很多方面如果需要访问物理内存地址需要访问**物理地址 + 3GB**的线性地址,低3GB用于给用户程序用. - -![](./now_memory.png) - -针对这次实验,内核的内存模型如下: - -![](memory_in_kernel.png) - -+ 3GB \~ ?: 内核程序使用(会随着开发动态变化,一般不会很大,顶天3MB). -+ 3GB + 48MB \~ 3GB + 64MB: `read_file`函数将文件从磁盘读出后会将文件数据加载在此处. -+ 3GB + 64MB \~ 3GB + 128MB:这段内存是空闲的,可以用于分配给用户进程,`phy_malloc_4k`会使用此段内存用于分配页面,相当于分配`64MB ~ 128MB`的物理内存. \ No newline at end of file diff --git a/实验六-v0.1.md b/实验六-v0.1.md new file mode 100644 index 0000000..c22865f --- /dev/null +++ b/实验六-v0.1.md @@ -0,0 +1,270 @@ +
+ 实验六 fork和进程树 +
+ +
+ 谷建华 +
+ +
+ 2022-11-14 v0.1 +
+ +#### 实验目的 + +1. 学习fork进程复制的原理和实现细节. +2. 学习进程树以理解进程间父子关系. +3. 学习简单的并发控制,内存资源管理. + +#### 实验预习内容 + +1. fork、wait、exit系统调用基本语义和相互依赖关系. +2. 进程树结构. +3. 并发控制,理解互斥锁,关中断对内核执行流的影响. + +#### 实验内容 + +1. 编写fork系统调用. + (1) 编写fork系统调用,使调用者能够复制进程. + (2) 在fork基本语义的实现的同时,需要考虑一种边界情况,当内核pcb资源满了(这次实验内核pcb资源只有20个)无法再分配时如何处理?这个需要你自行阅读手册`man 2 fork`(这个2什么意思可以看手册的手册`man man`,它会告诉你答案)了解怎么处理这个细节. + (3) exec系统调用已经由我们实现好了,修改`main.c`中的`do_exec`函数调用参数变为`"testfork.bin"`,测试fork是否如预期复制了进程,复制出的两个进程并发着运行. +2. 编写wait系统调用. + (1) 编写wait系统调用,使调用者在调用时会遍历它的所有子进程,如果有僵尸子进程则将其回收,将子进程状态返回,否则该进程变成睡眠状态直到有子进程exit将其唤醒. + (2) 你在写wait基本语义的同时,需要考虑一种边界情况,当调用者进程没有子进程时如何处理?这个需要你自行阅读手册`man 2 wait`了解怎么处理这个细节. + (3) exit系统调用已经由我们实现好了,修改`main.c`中的`do_exec`函数调用参数变为`"initproc.bin"`,这是OS的初始进程,它会fork出一个新进程并exec成`"shell.bin"`执行shell程序后永远不停地执行wait系统,shell大家做课内实验的时候已经实现了,现在你需要以内核的视角实现以支持shell的系统调用. + (4) `testwait.bin`是一个用于检测你实现的fork、wait的功能正确性的用户程序,你可以通过shell调用它,如果不爆panic则你实现的功能全通过. +3. fork炸弹测试 + (1) 如果光实现功能,那还算简单,但是实际上操作系统很大的难点不在于实现**出**功能,而是实现**对**功能,能够经受系统中运行的各种复杂环境的考验,并发控制和资源管理对一个操作系统尤为重要. + (2) `forkbomb.bin`是一个用于测试fork、wait和exit的程序,里面会不断随机调用fork、wait和exit系统调用达成fork炸弹的目的,你需要成功运行fork系统调用20000(两万)次(内核pcb的数量**必须**为20个),内核中会有一段专门的程序检测fork的次数.测试通过的效果图如下: + ![](lab6-finish.png) + (3) (自我提高内容,自己想做就做,不用写进报告,**禁止内卷**)上面的两万次还算小打小闹,检验内核程序基本的并发控制和资源管理,而这次需要你成功运行fork系统调用2000000(两百万)次,预计耗时若干小时,这基本上能将你实现的系统调用的并发问题都暴露出来,虽然关中断很有效,但是希望你在做这个实验的时候能尽量少关,尽可能将你的并发问题暴露出来,如果你通过了这个测试就能看到我们准备的小彩蛋. + +#### 实验总结 + +1. 进程树算是相当经典的描述进程关系的框架,但是如果不允许用进程树这个框架,意味着没有父子进程关系,你会怎么去设计进程的创建与销毁?(开放性答案,不要觉得自己做法低级,放心大胆往上写,任何言之有理的答案都行) +2. 在这次实验的时候你遇到了什么离谱的并发bug?(可以写没有,如果没有,那么恭喜你,你是一个严谨的人,你考虑问题非常周全) + +#### 实验指导 + +##### fork-状态机模型 + +经过前几个实验的实践,我们从一个内核的视角看向用户程序可以逐渐隐约感觉到用户程序是一个状态机.具体什么意思,可以看回pcb中存储的用户寄存器. + +```c +struct user_context { + u32 gs; + u32 fs; + u32 es; + u32 ds; + u32 edi; + u32 esi; + u32 ebp; + u32 kernel_esp; + u32 ebx; + u32 edx; + u32 ecx; + u32 eax; + u32 retaddr; + u32 eip; + u32 cs; + u32 eflags; + u32 esp; + u32 ss; +}; +``` + +`cs,ds,es,fs,gs,ss,eax,ebx,ecx,edx,esi,edi,ebp,esi,eip,eflags`这些用户寄存器就可以描述用户当前的运行状态,再结合用户程序的页表(pcb中的cr3变量),也就是用户程序能够访问的内存.这些对于一个用户程序来说就是它能够**直接**控制的所有信息.其余信息需要通过系统调用向内核申请服务获悉. + +用户程序在执行的时候pc执行的汇编命令可以先简单抽象为三种形式: + +1. 修改寄存器 +2. 修改内存 +3. 系统调用等其余指令 + +也就是说如果不考虑第三种形式(下面都暂时不考虑),仅考虑用户程序由前两种形式的汇编指令组成,给用户进程指定的用户寄存器信息和内存,这个用户进程的执行过程可以**唯一确定**. + +举个简单的例子,假设一个人要涂一面墙(内存),人手里有把刷子(寄存器),人可以进行下面两个操作之一(汇编指令): + +1. 将刷子的颜色调成指定颜色 +2. 往墙上某个区域用刷子涂上颜色,墙上原有的部分的颜色会被覆盖 + +假设给人固定好初始的刷子颜色、墙面颜色(颜色可能五花八门)和操作序列,那么每一次操作后墙面颜色和刷子颜色是可以**唯一确定**的.可以通过数学归纳法证明经过若干次操作后墙面颜色和刷子颜色我们也是可以**唯一确定**的. + +所以对于一个用户进程,可以将它的寄存器信息和内存信息抽象成用户程序的状态,而汇编指令就是一个映射方法,它将用户程序从一个状态映射到另一个状态.只要给定初始寄存器信息和内存信息,并确定执行流(汇编指令序列),那么执行流中任意一环的程序状态我们都是可以**唯一确定**的,这就是**状态机模型**. + +接下来回到第三种形式的汇编指令`系统调用等其余指令`,第三种形式指令本质上也是对用户寄存器和内存修改的指令,系统调用根据pcb中的信息反馈给用户,由于pcb对用户是不可见的,所以在用户视角下这个指令是不可预测的,意味着在用户视角下这条指令会发生什么是不可唯一确定的.而当我们将视角从用户移到内核,甚至硬件(某些指令是跟硬件交互的),当我们知道的信息越多,用户指令执行后的状态总是可以**唯一确定**的. + +##### fork-状态机复制 + +在讲完状态机模型后fork就比较好理解了,我们根据状态机模型可知,如果给定确定的寄存器信息和内存信息,用户程序的执行状态是可以唯一确定的(假设没有系统调用这种对用户程序来说**不可唯一确定**的指令). + +fork本质上就是对**状态机的复制**,当用户进程fork的时候,内核会新创建一个pcb,将当前进程的所有状态机信息原封不动地复制一份,也就是将当前进程的用户寄存器和内存原封不动复制一份给新的进程. + +在复制完状态机信息后产生了两个进程,这两个进程的内存信息和寄存器信息**完全一样**,所以之后的执行流,用户程序状态机也会**完全一致**(直到第一次遇到系统调用这种指令),这样就通过一个进程fork出两个进程. + +##### fork-进程树 + +fork能够一模一样复制一份进程的状态机,但是实际上这终究是两个独立的进程,调用fork系统调用的进程被称为父进程,在fork中新创建的进程称为子进程.这样除了初始进程(pid号为0),每个进程都有它的父进程,从数据结构的视角下进程之间的父子关系能够构成一个以0号进程为根的进程树. + +这样进程每次执行fork后,该进程在进程树上会新增一个儿子节点,这个儿子节点指向的进程是fork新被创建的进程. + +##### fork-父子进程返回值 + +这属于是大家在做上课就已经需要搞明白的东西,为了能够区分fork完后进程是父进程还是子进程,从它的返回值判断,如果返回值为0,则执行流获悉它是子进程,否则返回值为子进程的pid号,执行流获悉它是父进程. + +##### exit + +上面提到的进程树不只是用于描述进程之间的关系,与之关系密切的是exit和wait系统调用,相信大家在课内实验写简易shell的时候用到了fork,exec,wait这三个系统调用,然后还有一个系统调用exit被隐式调用了,被隐藏在了main函数中的返回值中. + +##### exit-用户程序执行的终点 + +我们先随便编写一个`hello_world`程序,然后通过`strace`命令查看执行所用到的系统调用. + +``` +$ ls +hello_world hello_world.c +$ cat ./hello_world.c +#include + +int main() +{ + puts("hello world!"); + return 114; +} +$ strace ./hello_world +... # 太长了就不展示上面的了 +write(1, "hello world!\n", 13hello world! +) = 13 +exit_group(114) = ? ++++ exited with 114 +++ +``` + +可以看到用户程序在执行完exit(exit_group系统调用与线程相关,但这次实验没有线程的概念,所以可以简单理解为exit)后用户程序就停止运行了,而main中的返回值114也写入到exit系统调用的参数中了. + +##### exit-程序的第一条指令和最后一条指令 + +在我们初学编程的时候肯定会有一个潜意识就是程序的第一条指令在main函数,这对初学者来说肯定是这样的,也很符合我们的直觉,觉得第一条指令在main函数. + +不过这只是编译器给我们的错觉,实际上在进入main函数之前和结束main函数跳出之后程序实际上还是做了很多事的,在进入main函数之前会初始化很多东西,在结束了main函数跳出之后程序需要将很多在缓冲区的数据及时推送到内核,最后调用exit系统调用结束程序的执行. + +在MINIOS中,用户程序的开始并不在main函数,由于`ld`工具默认`_start`是elf文件运行的程序入口,所以在`lib/user/astart.asm`存放着真正的用户程序入口,就是简单的调用了main,等main函数退出后eax寄存器存放着的是main函数的返回值,将eax作为参数调用exit函数结束程序的运行.虽然这个`_start`函数非常简单,但是还是能够作为一个例子证明main函数并不是程序运行的入口. + +```nasm +[section .text] + +extern main +extern exit +global _start + +_start: ; 第一条指令 + call main + push eax + call exit +``` + +##### exit-具体语义 + +通过实例可以发现exit系统调用实际上是一个进程的终止,通过翻阅linux手册`man 2 _exit`(这个2什么意思可以看手册的手册`man man`,它会告诉你答案).里面有三段话能够帮助我们理解exit系统调用的具体语义. + +``` +The function _exit() terminates the calling process "immediately". Any +open file descriptors belonging to the process are closed. Any chil‐ +dren of the process are inherited by init(1) (or by the nearest "sub‐ +reaper" process as defined through the use of the prctl(2) +PR_SET_CHILD_SUBREAPER operation). The process's parent is sent a +SIGCHLD signal. + +The value status & 0xFF is returned to the parent process as the +process's exit status, and can be collected using one of the wait(2) +family of calls. + +These functions do not return. +``` + +从这段话中可以知道实现exit系统调用需要注意的事情: + ++ exit没有返回值,执行完后进程结束它的生命周期. ++ 如果有子进程还未被回收,这些子进程全部会被转移到初始进程下成为初始进程的子进程.(否则这个进程退出后这些子进程的父进程就不见了,这个肯定是不允许的,而初始进程肯定是活着的,交给它刚刚好) ++ 父进程会收到一个SIGCHLD信号(信号这个实验不谈,可以简单理解为唤醒父进程). ++ exit中的参数会取其低8位(这是很多博客不会讲到的,只有查手册才能搞明白具体的语义)作为返回参数传递给父进程. ++ 父进程需要调用wait这类的系统调用获取该进程的exit参数. + +通过这些信息可以提炼出exit这个系统调用需要做的事: + ++ 变成僵尸进程,状态置为ZOMBIE(进程的生命周期已经结束了,它已经是个将死之"人"了,但是没有被父进程回收.所以就成了僵尸,不能运行但是就占着一部分资源). ++ 将所有子进程的父进程变成初始进程(学术名词叫托孤,还是挺有诗意的). ++ 处理exit参数. ++ 将部分资源回收(某些资源回收需要父进程完成). ++ 唤醒父进程. + +##### wait + +理解wait最重要的是需要先理解exit,wait这个系统调用的语义就如它的英文语义一样,就一个字:“等”.这个系统调用实际上就是在等待任意子进程exit,如果有子进程状态是ZOMBIE就回收子进程资源返回子进程状态.如果当前没有子进程可以回收,就进入SLEEP状态等待子进程exit唤醒该进程. + +如果你顺着上面的指导和exit的语义思考可以得出对wait系统调用的实现的一个模糊的映像,可以知道它大概需要做什么,但是可能一些实现细节不是很清楚.不过在这次不能一步步全部引导你什么地方要做什么,这次需要你自己去查手册`man 2 wait`去仔细阅读理解wait这个系统调用的具体语义设计出一个符合语义的系统调用程序,要学会查手册,不是全部读一遍跟背诵默写一样,而是挑你需要的看,大概需要看50~60行英文. + +##### 并发 + +指导的最后一个部分交给并发部分,并发这玩意在上课的前几节讲概念的时候你们会感觉还好,并发就是一段时间内同时做几件事.但是真正遇到并发问题的时候你们就不会这么想了,并发能够带来非常多的问题,可以说是很多是让你摸不着头脑的问题. + +因为MINIOS内核态允许中断,所以很多时候在执行内核程序时会发生调度,这会导致多个内核进程在一个时间段同时执行的并发场景,这会导致一些非常诡异的并发问题. + +讲一个实验设计中的例子,还记得实验五中`phy_malloc_4k`这个函数吗?在设计初期为了防止多个内核进程同时访问这个函数上了一个锁保证分配不会因为并发问题打架: + +```c +phyaddr_t +phy_malloc_4k(void) +{ + assert(phy_malloc_4k_p < 128 * MB); + while(xchg(&phy_malloc_4k_lock, 1) == 1) + schedule(); + + phyaddr_t addr = phy_malloc_4k_p; + phy_malloc_4k_p += PGSIZE; +free: + xchg(&phy_malloc_4k_lock, 0); + return addr; +} +``` + +但是在测试的时候发生了一件诡异的事,这个函数分配了一个128MB~128MB+4KB的物理页面出去然后内核在用的时候触发了page fault.在设计的时候挠了半天头,想不明白怎么能分配这么一个离谱的页面. + +在仔细想了想之后搞明白了出问题的原因,第一个进程在争取到锁之后在`phy_malloc_4k_p += PGSIZE;`这句执行之前触发了调度,然后第二个进程在调用这个函数的时候成功躲过了assert语句的判断.调度回第一个进程把`phy_malloc_4k_p`更新,相当于第二个进程在执行assert语句的时候拿的是变量的旧值,没有拿新值判断,这个时候`phy_malloc_4k_p`的值可能是128MB,所以导致能够分配128MB~128MB+4KB这么一个离谱的物理页面. + +所以正确的做法是将这个assert函数移到锁的临界区内,保证在临界区内值的判断是正确的. + +```c +phyaddr_t +phy_malloc_4k(void) +{ + while(xchg(&phy_malloc_4k_lock, 1) == 1) + schedule(); + assert(phy_malloc_4k_p < 128 * MB); + + phyaddr_t addr = phy_malloc_4k_p; + phy_malloc_4k_p += PGSIZE; +free: + xchg(&phy_malloc_4k_lock, 0); + return addr; +} +``` + +##### 并发-一把大锁保平安 + +在并发面前,很多事情非常难以预料,我们人脑计算能力是非常渺小的,无法考虑那么全面.能够做的只能一把大锁保平安,简单来说,如果一个执行流需要访问/修改某一公共资源时,就需要给公共资源加上一个锁使用`xchg`原子指令进行上互斥锁进入临界区,防止公共资源同时被其他执行流访问/修改的情况. + +##### 并发-多把大锁保平安? + +在实际实践的时候,执行流可能需要访问多个公共资源,比如exit就需要访问三个pcb的锁,fork和wait需要访问两个pcb的锁,这就意味我们可能要上多把锁. + +如果上一把互斥锁那还好处理,执行流要么进入临界区要么没进去,如果上多把锁就又涉及到上锁这个行为本身的并发问题,考虑一个情况: + +两个执行流,第一个要先给a上锁再给b上锁,第二个要先给b上锁再给a上锁,然后一个可能的情况就是第一个执行流给a上完锁之后马上发生了调度,然后调度到第二个执行流,第二个执行流给b上完锁了发现a被上锁了于是就在等,然后调度回第一个执行流,第一个执行流发现b被上了锁,于是也在等.于是这两个执行流等到天荒地老也没等到对面释放锁. + +对于这个问题的解决有一种办法,就是协商好上锁顺序,如果两个执行流都按照ab或ba的上锁顺序就能保证至少一个执行流能够运作,当一个执行流执行完释放完锁后另一个执行流再上锁. + +##### 并发-实验六的上锁顺序 + +对于此次实验来说,需要上多把锁的场景有fork,exit和wait,这些场景都需要对进程pcb上锁,所以这里需要协商规范一下上锁顺序. + +上锁规范是以进程树的0号进程为根,上锁顺序从根到叶子,就是说对于一个进程如果它,它祖宗,它儿子都需要被上锁,那么上锁顺序必须为祖宗->该节点->儿子.这种上锁方式能够保证上锁的节点在进程树中是深度递增的,无论什么情况都能保证至少一个执行流能够正常运行,不过这里暂且不证明. \ No newline at end of file