From 5844c8df9ba84564d2ae853f22e9ddf9ba162a54 Mon Sep 17 00:00:00 2001 From: wwf2023 <1092923610@qq.com> Date: Tue, 26 Nov 2024 17:58:56 +0800 Subject: [PATCH 1/2] add a --- a | 1 + 1 file changed, 1 insertion(+) diff --git a/a b/a index e69de29b..63fc8131 100644 --- a/a +++ b/a @@ -0,0 +1 @@ +xxxx -- Gitee From f7a3bd3ca967e86c79d03c91384c0bdc836a79b8 Mon Sep 17 00:00:00 2001 From: wwf2023 <1092923610@qq.com> Date: Mon, 2 Dec 2024 20:55:34 +0800 Subject: [PATCH 2/2] lab4 --- labcodes/lab4/bin/bootblock | Bin 512 -> 512 bytes labcodes/lab4/bin/kernel | Bin 196456 -> 196296 bytes labcodes/lab4/bin/sign | Bin 24928 -> 23304 bytes labcodes/lab4/bin/swap.img | Bin 134217728 -> 134217728 bytes labcodes/lab4/bin/ucore.img | Bin 5120000 -> 5120000 bytes labcodes/lab4/kern/init/init.c | 1 + labcodes/lab4/kern/mm/vmm.c | 11 +- labcodes/lab4/kern/process/proc.c | 2 +- labcodes/lab4/kern/schedule/sched.c | 22 + labcodes/lab4/obj/boot/bootasm.o | Bin 2316 -> 2268 bytes labcodes/lab4/obj/boot/bootmain.o | Bin 5572 -> 3984 bytes labcodes/lab4/obj/bootblock.asm | 220 +- labcodes/lab4/obj/bootblock.o | Bin 5876 -> 4408 bytes labcodes/lab4/obj/bootblock.out | Bin 446 -> 446 bytes labcodes/lab4/obj/kern/debug/kdebug.o | Bin 11520 -> 7700 bytes labcodes/lab4/obj/kern/debug/kmonitor.o | Bin 8840 -> 5856 bytes labcodes/lab4/obj/kern/debug/panic.o | Bin 5212 -> 2704 bytes labcodes/lab4/obj/kern/driver/clock.o | Bin 4404 -> 1824 bytes labcodes/lab4/obj/kern/driver/console.o | Bin 19256 -> 14804 bytes labcodes/lab4/obj/kern/driver/ide.o | Bin 14204 -> 10408 bytes labcodes/lab4/obj/kern/driver/intr.o | Bin 3416 -> 1448 bytes labcodes/lab4/obj/kern/driver/picirq.o | Bin 4844 -> 3140 bytes labcodes/lab4/obj/kern/fs/swapfs.o | Bin 8580 -> 4128 bytes labcodes/lab4/obj/kern/init/entry.o | Bin 25704 -> 25640 bytes labcodes/lab4/obj/kern/init/init.o | Bin 11332 -> 5008 bytes labcodes/lab4/obj/kern/libs/readline.o | Bin 3988 -> 2136 bytes labcodes/lab4/obj/kern/libs/stdio.o | Bin 4780 -> 2932 bytes labcodes/lab4/obj/kern/mm/default_pmm.o | Bin 22212 -> 18952 bytes labcodes/lab4/obj/kern/mm/kmalloc.o | Bin 15324 -> 11516 bytes labcodes/lab4/obj/kern/mm/pmm.o | Bin 33032 -> 30420 bytes labcodes/lab4/obj/kern/mm/swap.o | Bin 19388 -> 15632 bytes labcodes/lab4/obj/kern/mm/swap_fifo.o | Bin 12272 -> 8456 bytes labcodes/lab4/obj/kern/mm/vmm.d | 2 +- labcodes/lab4/obj/kern/mm/vmm.o | Bin 20800 -> 16480 bytes labcodes/lab4/obj/kern/process/entry.o | Bin 928 -> 864 bytes labcodes/lab4/obj/kern/process/proc.o | Bin 21868 -> 17608 bytes labcodes/lab4/obj/kern/process/switch.o | Bin 1184 -> 1120 bytes labcodes/lab4/obj/kern/schedule/sched.o | Bin 8656 -> 5116 bytes labcodes/lab4/obj/kern/trap/trap.o | Bin 16560 -> 11968 bytes labcodes/lab4/obj/kern/trap/trapentry.o | Bin 1312 -> 1248 bytes labcodes/lab4/obj/kern/trap/vectors.o | Bin 30424 -> 30360 bytes labcodes/lab4/obj/kernel.asm | 31268 +++++++++++----------- labcodes/lab4/obj/kernel.sym | 1138 +- labcodes/lab4/obj/libs/hash.o | Bin 3156 -> 1320 bytes labcodes/lab4/obj/libs/printfmt.o | Bin 10884 -> 9372 bytes labcodes/lab4/obj/libs/rand.o | Bin 3912 -> 2180 bytes labcodes/lab4/obj/libs/string.o | Bin 9236 -> 7536 bytes labcodes/lab4/obj/sign/tools/sign.o | Bin 20136 -> 17456 bytes labcodes/lab4/tools/gdbinit | 4 +- 49 files changed, 16321 insertions(+), 16347 deletions(-) diff --git a/labcodes/lab4/bin/bootblock b/labcodes/lab4/bin/bootblock index 40f63c1c8bb0874605091a60424d9ce59ee6bb12..b04b04f58b3af9b64903fdd9b677a794735388c2 100644 GIT binary patch delta 88 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 AeEKBA0NGc?0vf)Dw1Q#mX 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

  • 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 Pso14nN~B#1E>!#%QP8kj diff --git a/labcodes/lab4/bin/swap.img b/labcodes/lab4/bin/swap.img index 52e65dd21c3fc2924229516cb140503b22ee21fb..bf651b8e69916869c89e167a24aae9aa54814b68 100644 GIT binary patch delta 8046 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 z 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 zfH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB z1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(D zF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU z7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8( zfH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB z1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(D zF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU z7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8( zfH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB1IBX8(fH7bU7z4(DF<=ZB z1IBb*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM L7%*VKfPotbqO=$@ literal 5120000 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 z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIYR zf7qb|0RR9103iR@Mo4hrz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)9MBFO3jhEB01WcC9>$(R z$bbO@1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r K3>YwAU>pc9>ONus diff --git a/labcodes/lab4/kern/init/init.c b/labcodes/lab4/kern/init/init.c index c58bfc3a..e6fad960 100644 --- a/labcodes/lab4/kern/init/init.c +++ b/labcodes/lab4/kern/init/init.c @@ -39,6 +39,7 @@ kern_init(void) { idt_init(); // init interrupt descriptor table初始化中断描述符表 vmm_init(); // init virtual memory management 初始化虚拟内存管理 + proc_init(); // init process table ide_init(); // init ide devices初始化IDE设备 diff --git a/labcodes/lab4/kern/mm/vmm.c b/labcodes/lab4/kern/mm/vmm.c index ab1a5808..5068210a 100644 --- a/labcodes/lab4/kern/mm/vmm.c +++ b/labcodes/lab4/kern/mm/vmm.c @@ -7,6 +7,7 @@ #include #include #include +#include /* vmm design include two parts: mm_struct (mm) & vma_struct (vma) @@ -230,10 +231,12 @@ mm_destroy(struct mm_struct *mm) { // 从列表中删除当前虚拟内存区域的项 list_del(le); // 释放虚拟内存区域结构的内存 - kfree(le2vma(le, list_link),sizeof(struct vma_struct)); //kfree vma + kfree(le2vma(le, list_link)); + //kfree(le2vma(le, list_link), sizeof(struct vma_struct)); //kfree vma } // 释放内存管理结构本身的内存 - kfree(mm, sizeof(struct mm_struct)); //kfree mm + kfree(mm); //kfree mm + //kfree(mm, sizeof(struct mm_struct)); //kfree mm // 将指针设置为NULL,表示该结构已被销毁 mm=NULL; } @@ -267,7 +270,7 @@ check_vmm(void) { // 检查页面故障处理的正确性 check_pgfault(); // 确保在检查过程中免费页面数量未发生变化,表明内存管理操作是正确的 - //assert(nr_free_pages_store == nr_free_pages()); + // assert(nr_free_pages_store == nr_free_pages()); // 如果所有检查都通过,输出成功信息 cprintf("check_vmm() succeeded.\n"); } @@ -341,7 +344,7 @@ check_vma_struct(void) { mm_destroy(mm);// 销毁 mm 结构 // 确保释放的页面数量与初始记录一致 - //assert(nr_free_pages_store == nr_free_pages()); + // assert(nr_free_pages_store == nr_free_pages()); // 输出成功信息 cprintf("check_vma_struct() succeeded!\n"); } diff --git a/labcodes/lab4/kern/process/proc.c b/labcodes/lab4/kern/process/proc.c index 8c733e0c..602e0adb 100644 --- a/labcodes/lab4/kern/process/proc.c +++ b/labcodes/lab4/kern/process/proc.c @@ -451,7 +451,7 @@ do_fork(uint32_t clone_flags, uintptr_t stack, struct trapframe *tf) { proc->pid = get_pid(); //将新进程插入到进程列表 hash_proc(proc); - list_add(&proc_init, &(proc->list_link)); + list_add(&proc_list, &(proc->list_link)); nr_process ++; } diff --git a/labcodes/lab4/kern/schedule/sched.c b/labcodes/lab4/kern/schedule/sched.c index 8c8c1a8e..ce267783 100644 --- a/labcodes/lab4/kern/schedule/sched.c +++ b/labcodes/lab4/kern/schedule/sched.c @@ -10,32 +10,54 @@ wakeup_proc(struct proc_struct *proc) { proc->state = PROC_RUNNABLE; } + +/** + * schedule是操作系统中的调度函数,用于选择下一个要执行的进程并进行上下文切换。 + * 该函数首先检查当前进程是否需要重新调度,然后在进程列表中查找处于可运行状态的进程。 + * 如果找到可运行的进程,则选择该进程作为下一个要执行的进程,并进行上下文切换。 + * 如果没有找到可运行的进程,则选择空闲进程作为下一个要执行的进程。 + * 最后,恢复中断状态并退出调度函数。 + */ void schedule(void) { + // 保存中断状态标志 bool intr_flag; + // 定义指向进程列表项的指针 list_entry_t *le, *last; + // 定义下一个要执行的进程指针,并初始化为NULL struct proc_struct *next = NULL; + // 保存当前中断状态,并禁止中断 local_intr_save(intr_flag); { + // 标记当前进程不需要重新调度 current->need_resched = 0; + // 确定进程列表的最后一个元素 last = (current == idleproc) ? &proc_list : &(current->list_link); + // 从最后一个元素开始遍历进程列表 le = last; do { + // 如果不是进程列表的末尾,则继续查找下一个可运行的进程 if ((le = list_next(le)) != &proc_list) { + // 获取当前列表项对应的进程结构体 next = le2proc(le, list_link); + // 如果进程处于可运行状态,则停止查找 if (next->state == PROC_RUNNABLE) { break; } } } while (le != last); + // 如果没有找到可运行的进程,则选择空闲进程作为下一个要执行的进程 if (next == NULL || next->state != PROC_RUNNABLE) { next = idleproc; } + // 增加下一个要执行的进程的运行次数 next->runs ++; + // 如果下一个要执行的进程不是当前进程,则进行上下文切换 if (next != current) { proc_run(next); } } + // 恢复中断状态 local_intr_restore(intr_flag); } diff --git a/labcodes/lab4/obj/boot/bootasm.o b/labcodes/lab4/obj/boot/bootasm.o index 8f8a448c0f997893757f9c6a96de6cb78775ba73..7b1911f5c2049a66aab2b810c8e93993b657831f 100644 GIT binary patch delta 111 zcmeAXx+6G2f$0z1MkO|8G4Bk^e79n~Vg~(^+yedNWC(w<9kbKq3Cs^BPhdI8DagRk z#=yY9B(yn+Rf~yHWO6UNKcmUyyX@tRHj_g+f;kNs85p>LDg-BQIVQ)moZ=K=U}ytMFo|w9V%1_|beSB>?$4Mqc`bW6W6oq%j$qCNMg|5h bpbC-6jU3X98z#@?P-lGtG|PQ*AcrsjOiUc@ diff --git a/labcodes/lab4/obj/boot/bootmain.o b/labcodes/lab4/obj/boot/bootmain.o index 64af7b5485295bcbc822af93d8632b9cd908fc6a..3a99b75e24b4ea24223abc9fefacc213f54c34bb 100644 GIT binary patch literal 3984 zcmd^CU5pb|6h2*cbx{@&(QE|Gs;G>XvNLU`?Uuz|*@f~O{uWkIOSheFE8BL`nc_ke zmVjs>C>kGpFhSy*i3y1h;`#z1{OA+W_(F^!1jrH)RzTqat>@f1b34d`zI&28=eyti z?wxzj{h2%4dzUTr`F!A-4<gWyhdwR#O?(H2P zy-D@Qng#w{;Hd)tA#m%gDU;4#J=9h`b5%A|z4grqc4l-O6?d)|YQ5t-PCx^|}pZ3z~NxYumf@{N6P;pTTM{HW{Cn&mU|>l^|-TM`2H`Rz01)b{O8T)w0(v|3yuZ z4Z`(CfJull)Frf;nC1xt@B;c-jJwc}FkXhfi}9O`srD|$)b>Z1Mlg|mj%kDd+ES|wf#GbCOD zPar;tX&0s^B_9>|2j-uZ{3@v9eo&A<$C`lDM1kO(^E zy1=c>FO_@(2tUpIO3CX$ILQ1O$tQsDeCF3mJ_3YSFuz{%2_XD3^RG%i0)+F-CncW% z!Z!08B_9RCyO>W)J^_S3U_K}LD0uNE4_`ohfb}KGC!mg_P(l6+)(lIH0)$7I-zNF_ zK=?TG`y}5FUc6uO8vu77{Dk@u=5Bj%3vL3Jk074KnnfP|(uBI^)5bdf(u1j5kBFMn zKo3R=Un7ioY=Utbnk3%n*%xVe(8JgFNE#lJ{GexFl;A1JoA8{(C9#Gn+XE&zXR3qi z>$VIrskZ=6Enz)ShAxRMSRnBh=<{G&GpBIuyNKgK(q2ws_DAHq(9?J?GQJNn*%9${ z9%s>6oX?=2M(qrgN_HWYF9y;A&h_L6(`hZ4E)~rDkdX;M*+^w9W3VGTyWOuUo#F|b zOZiNP%{bMu5|Jj#g5nucI?G6flz4kQq{TupJ)*_JaY&acMO&zY3Y4;0%aFNBzG$0v zIcbY#H3f(WYMe)TrD){`i$a&%!5wz zpoMV)WDwK2R9Qq(SHKNu#8F3-_#90QMMBY_9*V{#jKt-t=~(DYy)l%{Wy&3EF&9-j zt*~Y!3#q|;x&w)z;>U*;Hj}8aXS!RrVmLVb7^&X3i+uca;Qnx1?ApP%Ah> ze=w{$taXoG=P_D2uRh8nv~reRE@p<^hC=P)#c?ppr9pR!RNS0aP%~vv-6=AYyce+> z$YJbp-pu6Y6pv09VK9@XOTEfGPOwqxiI(aF+f1g0a7%M_ z4mPe)T#u^G>lmW~82z%{CYP?eTva?IJiFY?b%>RLXV3E#PCPP9#$MJ`kRBoDXhEQ9aW8@Ow++AU_kUkPor%XK%8nF;n?x z><_a)&3=qMU5`oE%D$a_g8fGJ!|eC7Kf?Yz`#bEX<429!%aO-8eT<3nKeKPc{x@Kr z?sDWIU~MVbsR8tM+3~a^1hS1`8v>b>or1uCWkH~9457>srv^|40sPz*aEC&mSh9`4 zq7{8}P>|l_XpLMlTTT@We9eC~x;tZN!2KT6-9UVIxdAF8dlD02`i7G&bPJrUC?iOB zj%G~%rfWxyw}}L1&SK2mejpTUh~}UE8M-i$wc)}#g`Vz3q@hIb(=oa4LdF2B&dh%w=|M|Wt#G__<2)a4u~o^BWVG3On}7>UhUXg2$0_&FvrE6TQ0IsLQ${^ser26Q!-w literal 5572 zcmd^DZH!!18GdI!a54SBT4I$dODxjS?R4&)uRA*+UAo&Y*dnDaRw&HQ&fMJ@n6J#8 zDcuI4SfDNi5(SNa#1x4iKTI&1P!~{`<`>}+&hnrZP^rwL`b&?^-{M-RQ-53l2m3bEvIEPG579Q@0mNc zJ#u2-nSs|XKt4BiX72crzg>OfB0AAy&yGaq#ujp&Gr@y%Z=YFn_~s3r3-j+`=#|LX z`SY+(k1d=%Ft#xNKJbxK0}6kj@HGnmL*Z3xmM=MZ_Laf8x6c|ka~FQK7op5AK=JSQ zYKvnFj~}BRqSN2naqoQ(npu`!`}5omztL)9)Ny1(hNe zPt4QPi;Ht7rq3Os=N1>I&z=4d;h^oO-whBg0V;7&XshwLSs|h?!0r`1Vc~{_U$pQW z7XHA(E3nvJ^tpK!e$>K0weasP{2vQ{79s9cUWmpmJZ0gpTlhr_zh>dLEPTPj*Y~Af%ZfH1nkm~hQ?F)+rqCf{2kQATj^TEZ=+8byp=v>;p+|FMmHF|gKh$T zN&F8P-Xq386Mntnqr~_(!lw*BPK=KWzsc}vV*HlyI{Q%?SC#mS@ON5z#^;6KX83Vp z{Gsr78$Lsfm!Xhcw+X|KEBr~}?=^ge7)OP_-|*waI4S%ChWCi^sPF~Dj}zlB3qNgm zk8E7A_=kY=qOTc#oVwVf0Q`fZ*=00QV!TKAM-2Z(V*I4=2MoW1Z2X+z@1ySme+PPf zZh2^wCfTSqN=3ra7d%NQx8NdOZSW+1X}bJ!gC}XF!A0v#&RFNLL7y|4rn>KPca$3B zTD)iBoWU)^?}TcjsMLtTEzIxon+=|&uUWVV{3EGVPekjtk`MTE@Ec%ptD>WVuL91LDJbjHo5#P4P5RH#l}s?O&Tg5!EB#&jr3vuK@@BRx2%-6>TjRAsbEC2~fpN!WL4FgvO}OD~*#qr3984#}K`Fm>9S-U} zcBGo@IBh%LttPv=ni7}xETg(~CaO`tSg94N5|^v1CJEENjzuB@7AB&s zbkZWly3EEyt)at3ab8%Qa7B!r3D;u3hQ*G6O)6?FsE45*WQ_&$Lp3Z@pDg-`La0+H9;pT8Gx!8Vn8h-FyF16qzp?suVKVK`%REj($ z!(K4K&qFl~1;Q(|VAY1R!AY}jQs_BO4ighmOdHCkF|$3}RLdhGoCl7H7buo1bwekU zA-&6Q1(il!R(8^Q?RvX4tI4bz2GlG!rV)~g(RGs{i917=OsQP`{B*T26KJL9Nj_z+ zIR(q0MP!8IydTF<;nT)G7 zbJT1#X7mQ&yaoxkX=gmMq( zT4I)-b#(a$*!~s%KOEA}Aj6xah*k}nb)j zFdIw8;_IA_>N$_P@mM?=bD|+n)Q86(ey8SV#?5z5@SF8v=J+{EKMO|o+)a^31|ruj z>FfI@o|pK&g5SNleV@NZmJK}FbKBDX+xGW9)i=Jczvr2wBgaPG7Eo6Jm zQ?c&zTU@vGstVbC{Ztupy?DarI_cb2@Opah@H{D(f}wa8>mvwz5+Am|6#J&wArzna zQL#J4w#7ap_GPiZ7W)UWXT);x*$=;`vrUTKBDN&<1+j<3o)CLV>?$0N2#UHAsk5J* zVh52&5BhhBrC2aqYZs>6&b z6stGdehjB^9R$UPq(4*d#BeKY`mOeCINdMjr(1;@KmPyE?K&v=MCe^i0;_ib@t{x3 z4WdISRU6j>(%0Ra(8ueBx?XtbO1e14^c=05L=ZX-lvx# zYA-{l?*&Y7eBAhdH=d()hoLL;fHbY+cWOJ|lgO8s=6v}|)cM-JK-1cf5uJeL|5+( + 7c85: e8 a1 00 00 00 call 7d2b 00007c8a : @@ -171,187 +171,191 @@ readseg(uintptr_t va, uint32_t count, uint32_t offset) { 7c8c: 55 push %ebp 7c8d: 89 e5 mov %esp,%ebp 7c8f: 57 push %edi - 7c90: 56 push %esi - 7c91: 89 c6 mov %eax,%esi - 7c93: 53 push %ebx uintptr_t end_va = va + count; //计算结束虚拟地址 end_va - 7c94: 01 d0 add %edx,%eax -readseg(uintptr_t va, uint32_t count, uint32_t offset) { - 7c96: 83 ec 08 sub $0x8,%esp -static inline void invlpg(void *addr) __attribute__((always_inline)); - -static inline uint8_t -inb(uint16_t port) { - uint8_t data; - asm volatile ("inb %1, %0" : "=a" (data) : "d" (port) : "memory"); - 7c99: bb f7 01 00 00 mov $0x1f7,%ebx - uintptr_t end_va = va + count; //计算结束虚拟地址 end_va - 7c9e: 89 45 ec mov %eax,-0x14(%ebp) + 7c90: 8d 3c 10 lea (%eax,%edx,1),%edi // round down to sector boundary 将虚拟地址 va 调整到扇区边界,确保从正确的地址读取数据。 va -= offset % SECTSIZE; - 7ca1: 89 c8 mov %ecx,%eax + 7c93: 89 ca mov %ecx,%edx +readseg(uintptr_t va, uint32_t count, uint32_t offset) { + 7c95: 56 push %esi + va -= offset % SECTSIZE; + 7c96: 81 e2 ff 01 00 00 and $0x1ff,%edx // translate from bytes to sectors; kernel starts at sector 1 //将偏移量 offset 转换为扇区号 secno,因为内核镜像从第二个扇区(编号为1)开始存储。 uint32_t secno = (offset / SECTSIZE) + 1; - 7ca3: c1 e9 09 shr $0x9,%ecx + 7c9c: c1 e9 09 shr $0x9,%ecx va -= offset % SECTSIZE; - 7ca6: 25 ff 01 00 00 and $0x1ff,%eax - 7cab: 29 c6 sub %eax,%esi + 7c9f: 29 d0 sub %edx,%eax +readseg(uintptr_t va, uint32_t count, uint32_t offset) { + 7ca1: 53 push %ebx + va -= offset % SECTSIZE; + 7ca2: 89 c6 mov %eax,%esi + uint32_t secno = (offset / SECTSIZE) + 1; + 7ca4: 8d 41 01 lea 0x1(%ecx),%eax +readseg(uintptr_t va, uint32_t count, uint32_t offset) { + 7ca7: 83 ec 08 sub $0x8,%esp + uintptr_t end_va = va + count; //计算结束虚拟地址 end_va + 7caa: 89 7d ec mov %edi,-0x14(%ebp) +static inline void invlpg(void *addr) __attribute__((always_inline)); + +static inline uint8_t +inb(uint16_t port) { + uint8_t data; + asm volatile ("inb %1, %0" : "=a" (data) : "d" (port) : "memory"); + 7cad: bb f7 01 00 00 mov $0x1f7,%ebx uint32_t secno = (offset / SECTSIZE) + 1; - 7cad: 8d 41 01 lea 0x1(%ecx),%eax - 7cb0: 89 45 f0 mov %eax,-0x10(%ebp) + 7cb2: 89 45 f0 mov %eax,-0x10(%ebp) // If this is too slow, we could read lots of sectors at a time. // We'd write more to memory than asked, but it doesn't matter -- // we load in increasing order. //循环读取数据,直到读取到结束虚拟地址 end_va。 //每次调用 readsect() 读取一个扇区的数据到指定的虚拟地址。 for (; va < end_va; va += SECTSIZE, secno ++) { - 7cb3: 3b 75 ec cmp -0x14(%ebp),%esi - 7cb6: 73 6a jae 7d22 - 7cb8: 89 da mov %ebx,%edx - 7cba: ec in (%dx),%al + 7cb5: 3b 75 ec cmp -0x14(%ebp),%esi + 7cb8: 73 6a jae 7d24 + 7cba: 89 da mov %ebx,%edx + 7cbc: ec in (%dx),%al while ((inb(0x1F7) & 0xC0) != 0x40) - 7cbb: 24 c0 and $0xc0,%al - 7cbd: 3c 40 cmp $0x40,%al - 7cbf: 75 f7 jne 7cb8 + 7cbd: 24 c0 and $0xc0,%al + 7cbf: 3c 40 cmp $0x40,%al + 7cc1: 75 f7 jne 7cba : "memory", "cc"); } static inline void outb(uint16_t port, uint8_t data) { asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); - 7cc1: ba f2 01 00 00 mov $0x1f2,%edx - 7cc6: b0 01 mov $0x1,%al - 7cc8: ee out %al,(%dx) - 7cc9: ba f3 01 00 00 mov $0x1f3,%edx - 7cce: 8a 45 f0 mov -0x10(%ebp),%al - 7cd1: ee out %al,(%dx) + 7cc3: ba f2 01 00 00 mov $0x1f2,%edx + 7cc8: b0 01 mov $0x1,%al + 7cca: ee out %al,(%dx) + 7ccb: ba f3 01 00 00 mov $0x1f3,%edx + 7cd0: 8a 45 f0 mov -0x10(%ebp),%al + 7cd3: ee out %al,(%dx) outb(0x1F4, (secno >> 8) & 0xFF); - 7cd2: 8b 45 f0 mov -0x10(%ebp),%eax - 7cd5: ba f4 01 00 00 mov $0x1f4,%edx - 7cda: c1 e8 08 shr $0x8,%eax - 7cdd: ee out %al,(%dx) + 7cd4: 8b 45 f0 mov -0x10(%ebp),%eax + 7cd7: ba f4 01 00 00 mov $0x1f4,%edx + 7cdc: c1 e8 08 shr $0x8,%eax + 7cdf: ee out %al,(%dx) outb(0x1F5, (secno >> 16) & 0xFF); - 7cde: 8b 45 f0 mov -0x10(%ebp),%eax - 7ce1: ba f5 01 00 00 mov $0x1f5,%edx - 7ce6: c1 e8 10 shr $0x10,%eax - 7ce9: ee out %al,(%dx) + 7ce0: 8b 45 f0 mov -0x10(%ebp),%eax + 7ce3: ba f5 01 00 00 mov $0x1f5,%edx + 7ce8: c1 e8 10 shr $0x10,%eax + 7ceb: ee out %al,(%dx) outb(0x1F6, ((secno >> 24) & 0xF) | 0xE0); - 7cea: 8b 45 f0 mov -0x10(%ebp),%eax - 7ced: ba f6 01 00 00 mov $0x1f6,%edx - 7cf2: c1 e8 18 shr $0x18,%eax - 7cf5: 24 0f and $0xf,%al - 7cf7: 0c e0 or $0xe0,%al - 7cf9: ee out %al,(%dx) - 7cfa: b0 20 mov $0x20,%al - 7cfc: 89 da mov %ebx,%edx - 7cfe: ee out %al,(%dx) + 7cec: 8b 45 f0 mov -0x10(%ebp),%eax + 7cef: ba f6 01 00 00 mov $0x1f6,%edx + 7cf4: c1 e8 18 shr $0x18,%eax + 7cf7: 24 0f and $0xf,%al + 7cf9: 0c e0 or $0xe0,%al + 7cfb: ee out %al,(%dx) + 7cfc: b0 20 mov $0x20,%al + 7cfe: 89 da mov %ebx,%edx + 7d00: ee out %al,(%dx) asm volatile ("inb %1, %0" : "=a" (data) : "d" (port) : "memory"); - 7cff: 89 da mov %ebx,%edx - 7d01: ec in (%dx),%al + 7d01: 89 da mov %ebx,%edx + 7d03: ec in (%dx),%al while ((inb(0x1F7) & 0xC0) != 0x40) - 7d02: 24 c0 and $0xc0,%al - 7d04: 3c 40 cmp $0x40,%al - 7d06: 75 f7 jne 7cff + 7d04: 24 c0 and $0xc0,%al + 7d06: 3c 40 cmp $0x40,%al + 7d08: 75 f7 jne 7d01 asm volatile ( - 7d08: 89 f7 mov %esi,%edi - 7d0a: b9 80 00 00 00 mov $0x80,%ecx - 7d0f: ba f0 01 00 00 mov $0x1f0,%edx - 7d14: fc cld - 7d15: f2 6d repnz insl (%dx),%es:(%edi) + 7d0a: 89 f7 mov %esi,%edi + 7d0c: b9 80 00 00 00 mov $0x80,%ecx + 7d11: ba f0 01 00 00 mov $0x1f0,%edx + 7d16: fc cld + 7d17: f2 6d repnz insl (%dx),%es:(%edi) for (; va < end_va; va += SECTSIZE, secno ++) { - 7d17: ff 45 f0 incl -0x10(%ebp) - 7d1a: 81 c6 00 02 00 00 add $0x200,%esi - 7d20: eb 91 jmp 7cb3 + 7d19: ff 45 f0 incl -0x10(%ebp) + 7d1c: 81 c6 00 02 00 00 add $0x200,%esi + 7d22: eb 91 jmp 7cb5 readsect((void *)va, secno); } } - 7d22: 58 pop %eax - 7d23: 5a pop %edx - 7d24: 5b pop %ebx - 7d25: 5e pop %esi - 7d26: 5f pop %edi - 7d27: 5d pop %ebp - 7d28: c3 ret + 7d24: 58 pop %eax + 7d25: 5a pop %edx + 7d26: 5b pop %ebx + 7d27: 5e pop %esi + 7d28: 5f pop %edi + 7d29: 5d pop %ebp + 7d2a: c3 ret -00007d29 : +00007d2b : /* bootmain - the entry of bootloader */ //bootmain() 函数是引导加载程序的入口点。 void bootmain(void) { - 7d29: f3 0f 1e fb endbr32 - 7d2d: 55 push %ebp + 7d2b: 55 push %ebp // read the 1st page off disk //从磁盘读取前8个扇区(4096字节)到 ELFHDR 指向的内存地址,准备解析ELF头。 readseg((uintptr_t)ELFHDR, SECTSIZE * 8, 0); - 7d2e: 31 c9 xor %ecx,%ecx + 7d2c: 31 c9 xor %ecx,%ecx bootmain(void) { - 7d30: 89 e5 mov %esp,%ebp + 7d2e: 89 e5 mov %esp,%ebp readseg((uintptr_t)ELFHDR, SECTSIZE * 8, 0); - 7d32: ba 00 10 00 00 mov $0x1000,%edx + 7d30: ba 00 10 00 00 mov $0x1000,%edx bootmain(void) { - 7d37: 56 push %esi + 7d35: 56 push %esi readseg((uintptr_t)ELFHDR, SECTSIZE * 8, 0); - 7d38: b8 00 00 01 00 mov $0x10000,%eax + 7d36: b8 00 00 01 00 mov $0x10000,%eax bootmain(void) { - 7d3d: 53 push %ebx + 7d3b: 53 push %ebx readseg((uintptr_t)ELFHDR, SECTSIZE * 8, 0); - 7d3e: e8 49 ff ff ff call 7c8c + 7d3c: e8 4b ff ff ff call 7c8c // is this a valid ELF? //检查读取的ELF头部的魔数(magic number)是否有效。如果无效,跳转到 bad 标签处理。 if (ELFHDR->e_magic != ELF_MAGIC) { - 7d43: 81 3d 00 00 01 00 7f cmpl $0x464c457f,0x10000 - 7d4a: 45 4c 46 - 7d4d: 75 3f jne 7d8e + 7d41: 81 3d 00 00 01 00 7f cmpl $0x464c457f,0x10000 + 7d48: 45 4c 46 + 7d4b: 75 3f jne 7d8c //定义指针 ph 和 eph,分别指向程序头和程序头的结束位置。 struct proghdr *ph, *eph; // load each program segment (ignores ph flags) //将程序头的起始地址设置为 ELFHDR 中的 e_phoff 偏移,并计算结束位置 eph。 ph = (struct proghdr *)((uintptr_t)ELFHDR + ELFHDR->e_phoff); - 7d4f: a1 1c 00 01 00 mov 0x1001c,%eax + 7d4d: a1 1c 00 01 00 mov 0x1001c,%eax eph = ph + ELFHDR->e_phnum; - 7d54: 0f b7 35 2c 00 01 00 movzwl 0x1002c,%esi + 7d52: 0f b7 35 2c 00 01 00 movzwl 0x1002c,%esi ph = (struct proghdr *)((uintptr_t)ELFHDR + ELFHDR->e_phoff); - 7d5b: 8d 98 00 00 01 00 lea 0x10000(%eax),%ebx + 7d59: 8d 98 00 00 01 00 lea 0x10000(%eax),%ebx eph = ph + ELFHDR->e_phnum; - 7d61: c1 e6 05 shl $0x5,%esi - 7d64: 01 de add %ebx,%esi + 7d5f: c1 e6 05 shl $0x5,%esi + 7d62: 01 de add %ebx,%esi //循环读取每个程序段的数据,调用 readseg() 将内核程序段加载到内存指定地址。 for (; ph < eph; ph ++) { - 7d66: 39 f3 cmp %esi,%ebx - 7d68: 73 18 jae 7d82 + 7d64: 39 f3 cmp %esi,%ebx + 7d66: 73 18 jae 7d80 readseg(ph->p_va & 0xFFFFFF, ph->p_memsz, ph->p_offset); - 7d6a: 8b 43 08 mov 0x8(%ebx),%eax + 7d68: 8b 43 08 mov 0x8(%ebx),%eax for (; ph < eph; ph ++) { - 7d6d: 83 c3 20 add $0x20,%ebx + 7d6b: 83 c3 20 add $0x20,%ebx readseg(ph->p_va & 0xFFFFFF, ph->p_memsz, ph->p_offset); - 7d70: 8b 4b e4 mov -0x1c(%ebx),%ecx - 7d73: 8b 53 f4 mov -0xc(%ebx),%edx - 7d76: 25 ff ff ff 00 and $0xffffff,%eax - 7d7b: e8 0c ff ff ff call 7c8c - 7d80: eb e4 jmp 7d66 + 7d6e: 8b 4b e4 mov -0x1c(%ebx),%ecx + 7d71: 8b 53 f4 mov -0xc(%ebx),%edx + 7d74: 25 ff ff ff 00 and $0xffffff,%eax + 7d79: e8 0e ff ff ff call 7c8c + 7d7e: eb e4 jmp 7d64 } // call the entry point from the ELF header // note: does not return //从ELF头部获取内核的入口点,调用该入口函数,注意此调用不会返回。 ((void (*)(void))(ELFHDR->e_entry & 0xFFFFFF))(); - 7d82: a1 18 00 01 00 mov 0x10018,%eax - 7d87: 25 ff ff ff 00 and $0xffffff,%eax - 7d8c: ff d0 call *%eax + 7d80: a1 18 00 01 00 mov 0x10018,%eax + 7d85: 25 ff ff ff 00 and $0xffffff,%eax + 7d8a: ff d0 call *%eax } static inline void outw(uint16_t port, uint16_t data) { asm volatile ("outw %0, %1" :: "a" (data), "d" (port) : "memory"); - 7d8e: ba 00 8a ff ff mov $0xffff8a00,%edx - 7d93: 89 d0 mov %edx,%eax - 7d95: 66 ef out %ax,(%dx) - 7d97: b8 00 8e ff ff mov $0xffff8e00,%eax - 7d9c: 66 ef out %ax,(%dx) - 7d9e: eb fe jmp 7d9e + 7d8c: ba 00 8a ff ff mov $0xffff8a00,%edx + 7d91: 89 d0 mov %edx,%eax + 7d93: 66 ef out %ax,(%dx) + 7d95: b8 00 8e ff ff mov $0xffff8e00,%eax + 7d9a: 66 ef out %ax,(%dx) + 7d9c: eb fe jmp 7d9c diff --git a/labcodes/lab4/obj/bootblock.o b/labcodes/lab4/obj/bootblock.o index 18e8e5058556bf66778777bc8e8d2188dfa9156a..23a8eeb064084d2830271d44071f788e41ab6512 100755 GIT binary patch literal 4408 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 XIBmK={ta7q8+sc5|A=c5O0D}J&aW6m literal 5876 zcma)AYiwM_6+X5@>d+L2D1m#AXN1s+S2}LrS?ZeU&bla5mJ)2sz|F=YC)x`M4~`K$b%LY5ZmwEJ2N{a zLh4z~&Uemyb7tnux%bY!kM!NWqNSyUq_k2SdD??SQ5f^r`7KcjP%AB@t7(SU?y?yi zE-#`3mrp>QhO+*Yn@4qpaQiHj_dYPD#{W7#HGbmt{Eu7f?;ZN%>AXPyI6YW6Hl0Sf zZ^3x=H`7K76M-|p&(C4YIh5~ z_8xEP`25tHV@C&CPV7C`e)wIi zVyy4n*zqH8%(%G$C3y6S?v}B>3+ehf=f1I5&MlZ)y1f4G;|@Nlab<qPa$ zH`#vV^i?gdr7k=34)nC|eJOC@uGbF?ymK?U(V3a}Kl}Q#^T6^9jT4i!ztI>wQFwcT z#v6^o+h;$-oIC-a=-V%oS3mVKT~FVCh#N3n$S>)4*igpaW+SB60zb}8oEMN@nycaK zsYTi6Q>(%^&@_c_r0EKOhT0WgKvye#GtE@^7P>~^g)~dyAk9{|ljbPAnC2=RqIn93 zX}-b+-KcPsZc;c#w<;W`MG7ZrvBD{eDBMLUh0}Dq!b_=J;bqjL@NKkG;pKFf!rin+ z;X7zR;U3zo@G9D>@LjY+;kzlT@M^LYUQb1ZH&I#P&2+!QTgXv(E7cX=M!OW=PJ0yI zL0?fgL!$~0(pMGE(|+IpawCsKKL{KKUW&qUJIW{nNC{<>0c0=ACxH2fnC9|nF5>%DXb(J{^bHx0j~;kIebaX+o$u!j3Iyj{b#hWBas84dqJ!@t)s zZ^;k%4{{QAp7Xu9nVtO@&cdsF&cUw}MSw@SBjjh(o0xU!)51My0d&r#I`DE}P-#@) zR^TTD#x{G>ODhH9d(7^un3UvU5?cY`QRWutqOE0Y^@u&n| zk9(yrY@e^;&nmp0KBw>&x)oTCJE8n1sT1}93XgkO*@LtMy5t{G_I`@N9zbFKpOigL zE1*mMUzEMyi-hFAqU>>6qw)W)?EP3-)BkJAo}djH|DVd#G4-$Dn#XX&LaH10#-?eq=c?;s}^pbjejpkOdRM@W57dTEeA z6*z~}m&Ai~jlwzVP@hRZg^hJfMWGZYUTD~wRt#FN&DeO?U z!ZrBvrI#GKQ{g?dRl_-88N+e4c08M4|0x!_95rrR^rFCgEwfB{|Nh@eRJ(+pN6n{_ zJ9~P%0t+_|)hlj2kP1aZ;l)PX(~O7Ba3~xN8A0Dpw8SmjOLDml>sIdCv@_(;P_^nV z;lHd?4h=Nba<)_nIFl9|X_Acr>CR&%d{#oTyoLPFYLY%9iPfY`GZIOd z;Yd6gizX7WWH_0=(k8>bT3pGMvCjC8AzM4F-a|X69oHk={RT!yeMS6%m!az~9QodRr z8nOJ$5gUT0BsY00*W1NjpxrQ;kXgZQBc|V5?16ObH^!rWqX@rr?KjFjHbgYpaa?!2 z+v{w~Xo`7B&!Sa^PR**<%9YC55iu`QMola@Bbvp`Oc^ZcTr|tMnaz0lbK6-h<^5?P zT)5E8Sdd0aL(Y=CRd7N@zD!5ZZt#WZU5A8hPG&gzMknUNU4m5CjF+BSyAk)$`T7<>b2VS!i;koVcCO zjFie`Q%TU&_*aWArbVkfH(vpL1jTGPq|HXU_J|dovm}zCo+2K--yCm2P zI#?O7y1>BnvNhD+hI55X({57G3?q$>ks!KtrsC-7?y|(WmDS2}=&8Tn0ouO%rd26*Yg^}#ABbmvhSWl6o z&Q{DTVtTQ%GIr6bxOzh*?$69FR_ZdYkr<-Qt8hNbj*I0vIy)&A=M){cR>|)cV@AW? zm}#XHd7|_Y>57hUN3vZ0J8nEx-TFf`6(G-RGUH z)B&qX>o%;tC$oBOZ(pWopzlsi?PaxRLpZapFSB+H4Xo~7N66?b4seD9CSMFgxII|q zYHbfWZnoxTJQEVD;!>ehDLF-98P2=?%83)BOZV3v`{2Ugad=EAm%-z2g;L~LT>Dp~-!e5D^MsMFr+FwmE?-Oh&ZGMq#6>p= Vn-uAfzd!1{`FQ#1mn77Z_g~XTK+pgH diff --git a/labcodes/lab4/obj/bootblock.out b/labcodes/lab4/obj/bootblock.out index e6ffe0c5784d2d67e0a91f02154a0beaad57f71a..4bbb6755d2289c820b5c874c4ecdfe0a93460849 100755 GIT binary patch delta 88 zcmV-e0H^=H1HJ>0hAg1~008U$Rf*+SjXV&E%2t8m{{a91!RZMp&{K)VjX?o}>0hAN)`008U$Rf*+SR*A+_0nmf&2)p+I0044RBP|701sekwyq4T2v}nRtT1rBxaY*=K>93A0Q~DLRwm(+a&vvY}xFF-3HUtrd*1B}ip(9RH8)ssZsc|Nbv8JT|bKiY8ml!&| zGjH$joO|xaIrrn;m+Um|TIz5($W9K*q)~}z|8%RwE3&ziN4Zp!e1CVpGiBtYC}|9* zj6BYV&KQGi^T9d%q-vlZa-@@8C;vIqkv>0^H2PCUf6^G}%N)6TAY}~rjNxrFQ#Aw0 zw4>9JKG~g->`EEgj&$y^s;t~&ofXE^*0(LQ?bo7a6*}sRqYEC}IMq^B*%ijL&DZgu z&}g1rrRu7-@u_IOef0>2&*lTm;X7}HY5u+JFEedP9$k&)fo2dOnz_-$A0 zTO{2dX2;+(Vp3rY?|^H=|HHKlVw}UtynV_34W~pr*FklL14s;2S&Fh1o(rfRa2 zt1)JnP31xv`7_3VCG}fbFJ~#E*Jt!^o`igP?lF3>GcoZ5Tp9V`g$%CPW7!PMGX_r% zWrR9kIDGgpBGHYxNc!{h&iM0lf-q?}x*=w_8$HOfQpR91E5G;S|BN7dJ$pJ^Ws~dB zBos;GQVRCQMXiy1(a1%skxN=5N4b$2RJd5twX-c{TuOFb5w}4{It5pI=NbJKUGZ60 zHRyL>{p2K9XOC~edX#d|QdM~_Lzo$uhKorf-FE}4Wl%AEs4@Jsu+2sYvMMop_IMb9 zOV#A0R%E-*@_I#!IhvDx;bhu!@`C2%A5k$?gJ#okayGKhJDGdDYJzMstM58%in6iT zQ^p0%#|2Tlr=n}yH=r1&Hg?T|2NM-nFATQ+cHBa2oIRb1AF1}M$F~}tf?Ka@Ag3VD zp3dz{F&Egl7y51#p`6;j+96^#6-}^Sbc%W3e#^LR@=>s$BXQ~k!b)nNOgod6KM@Ks z89X^$3f=5+biQ$PYsS%Sv~{AZLP&JYNG6v3KK|X)nY+B}z; zqS~=^#ooxaR|?{ag~j`bs~xec^@Zhr?VFye>A_y&Loctr{nBOLPJ@oKd-Fz&K`i+S zV{qHM?FVdq`gN>^8XTk9u5|Kbss?-XQu3~RSre3#T$^wA#)q(okUhxV{g}cmaa<3} zSnk_!isV_}PcI^l9M&LV6C-^Y&jLY29FTm;cOu^WpFOAyL6eo5n#8o#A+kH-JjcoN*O+vKMGv`qHEyqqRTiFt~~ zH!5C1wap zEsEDEKmD|h9@F%XEB+QerTE))Nb$Y&qQ-yFxJ&VRvR+F(=JoW3(r=)@D6XY<6xY!| z6xY)SidT?$FG2QGBMm8i6J6Fg6LZMPk0?w~yon|$4%1}C&2)ptH)(vc#xpg}*SJjM zMT(=eMDZqC3BFCPB|iR(BoBd0B@cpm%$@v$v|Q@@p|6oVpxMl_%%~f=9TVo&=xYP) z^TC{A;11-xzjjFG{dEYu3puA?<|wo5r>&fcBzr z*U}-nRnvb(@iR0}<0_4-HD0Fp7j(DAbsC$BpQVi&Z&Lg`B@`c~t%{G(1B!n|DaA+W zhl+nq2Q~hs#=p_{xZ>mVs^Sy$zQ%ouU#1T=&cZt7WIh9*lH3bEBDn|rJIUSP*Ck&9pO<_Qd`a>JaIfSvn8(@4 zKQeVApNsNAJo&Z~xu4!ulAr#jorm3Yy)5z5-|05R?-5`3Ir;G>8$I88sLoPD-$P-I z`R>EXPw$KKYGT&t7;Xi3pp4IOPJVUbGyjYDla3SfbPK^B(oDslkw@_$S>NGoKS(~M z|CknPT&3}H#e>@UJcyfumAIXI6@NnCRs1PM6c35}9gBYYO!!j(zji_9`C@%1{~(py zdfaAXlJ)naJ^pUkcHrUEjpyfhw!%Ii`AgT}2g$E)2F&D`V5z|l2fqh7`6d0nsVTU_9FEfl}BIT{L9CM;&Vcx4L&k89!W z$mY8iw#8XnNinlA6paMJW;R2#oUyqq{IiSf^yhJ6HR7}t5&!Qyv0HlG~@NGam(l+ z3hbQQ!*xqbO6H@sx4ghzit3wd!>uM8m%0i{z1+2rLXm_BCA?|{wu**_2C@3eBXxsWxWKQL$y@E|pdoDaD(jv4rz;?P1gu<^f_f!cUHM zWJ{pAHc{VX#$`z&)@lZtrC{e`HH9J#(SR9hsa$Hcq0JK;f7W@OsExxM?I#P#w{_dl>qN|5r3W+OuwZajk{DM z7IIfvv&F_<7d1pw*s#-TMa<=9bC2C^a>H;<1mJsCc(9*qgJNCqF@lB69a&_J1i`7_ z*bw8%kwaO~8rc|$-WOR!Yg)|uP;J=BKA2%=d`oj(G#sy-NKU62NyN4|oyBc)ip$%a zb6c9W#9cz4FxwL2>4UY2+VS*}pc83KJG9d3(QGs8TXCL+O=q*&97T@}(P%;pywW)* zxU!nNbUNjT7gah73+<)~3$3y_@ya`7FJErGkW$neC)Ct`TJe>GDixyAG-jh*1`I^j? zj>%bzPfx+S!3lL09xms*#Hh{eOx=dx4{fmDk6hVgJZhVWcJ`tu2k#JmuZ`MtC>tKj zi+K25$L}U(v&u5za{gv{4dvp!XOFk~G(6%8S0;AJPFeJkcn8`t|3x2B6p4MyfUKuX z+)ns=&>jny&w^~n;d;o$S_S^Q&R56Cca4$1Ge)-W60GL>oAKB&WVq2t|VO9I;Oqsu!E0L0m5ap-3n}ChtTtdEXJvwy_6~lt;He z-3wP7SPxN|KgRhNh@Rvem(HJYj!WiqoMRDuiu-=XB%=FKhwD9rCu1_vBP>tB-{PeH zNvVIDWn8eHm--`8e~e{J%&Su0CH3c6zK-a;)W0qD??`<&=ji9MEYHOH=Kg1Mj)h)= zoX1ru^@pVVoRoQgJK#fs%%8wM<%{7(_{x{U_3+h!i~WB1%65aCV}nhD&n!DpF9W$> z=1nqxSmsA%o|ZWk;Q+;9hCC6o@+O;NX1GYqSCN>nqPlpTide}@iYwrzmxw_XwaRf> zY{n5xMUiO2ELygzrcg|zRmW@!hyxw{{=aD^3^A?hn}+Y!;@&D7;4)79UBTZORd_gc zVzUn*N7zMugj;-{%#pHv55A0;>&b3!9+U_-{!?hBtJ(2*>^i~{^E3nVfaNI?_lqeL zXNx|*qc>Y)vOr_q7BHW=yk4XK%oFie%30Dl5TkSIkPJ zXKu9Cl_gnaT)q~M-8Pq{VW%g%jMoyg-7nkqYKC^dLFjaU2jDM{f&E2zl)rjgP}7N< q5Em%1eZ-t|dwF=cEj=zn_yhY{=ix_S*OC7jWgo$_(mhvSR|y0c(L){|~wbJwti#VhG**7V@j``!1Y zXUEz0&XL~l-Fx4C_uY^8|LgzPeeqj2xm+&N%|-Q88xh^UT5|lNYon#qLO*Z5_WhpW zw+~FYtMR5P4aaAy@fPkc9FI@4+&e$OSG5P^3$BUb@uUB~!Zq>6h2i*AH9j>QKYy-% z_O|oY`1xpjX8($6&-vjA*O+VK=w#jScs1VWnrME0LqqfPW0Cl>$`7U3J(pwV1}t>W z!4hoW0@JD+8YA&*_AF(iptMC#*>Fi&XBpIwY@dbsEPj3qws6jxe;zB&#;>WyXQJ^7 z%@3`fot-^!&oot<#lH2#b2qB(&+x{uY4{`(pSc%XoB3b1c2d|mGu-m zyO0=cXfUYJpr*?ux7yPdK*x6s&RZ89b{IUzTB(%R%Jm{{$B+6ioO zCAy0@+5EzWMM`DExur5hjY#)u{3POWQp`RR8Q=e#AS^H&b+i8da^%v?ROR~%GEq7Q z$I6cz{TmmSs)gXXOA4qEwCHf&vk9?4>7G1ywQ%LKk?k(wvt>}hbg?Mne$U4i)X9gz z`qA>S7vWa2D&?Bv4XsN+65-(RFdwv)3(%qq&~`3B+pTG0u?~#rve|kh{=@uzaIAUD z_|XeXIHXwUel1+9-!DvUL9j-UzM?)Fb+*8_NG`4=p7^YucrK@E_T2Jn&l%JcAAKz& zBd34GB{l7O^?{bz_%zZ!5})4x*2p1EpZIIeh$+t1H`iXW>x`|G9<#!NR|^@P`n1 ztv_ht9t)Q(e8|F21AkH3_I-E8_QqyI4Y77{m37{{oeW(<9R>Tuq0 zi_rirw(t^z@1kadbF|dpLHe+Tms|K+3$L_rn}wqm-e_=vHXD2weG>R_%)*;2yw%`u(Wfk&v2fPlr>J1zios9Q zUW1R&y#_x^Uo!YR^m_(>mkt^H9DU8g-?Q)w7Jk{_7wD+LFVZ^}e%Iia=;s!0tdq`- z(Mxot!Q-^d;FsxYgI^)H!Q*s;g*yyBMji`qvM}F+aEsAj(KZYBS-9WAyDdCq;R6OA zr!QN0#KOOC;cr>^+ZKM-;8*E63m>=eYZg9X@ZZv#7XFdJC+IB;|JcH341RbDtHONN`4m12 zyh-6Rz&jM41inMz)4*AUPXU(|J_$Ue@B}d1JjP$DO`=~7dme<0J|~$Kqqn#dErzQR z-(Pc!(Ij0hA@GlBwZZ>FHyZpC>wG&y8ACrqMGIF9ep{SZhb)|$u&r|p;gM2Ic zmoCE>T8w@rfxzUd#m?n|sAw_VCGd5vRjtL>VrGo-mui#fKZsAK(yz$Se}g)$crCwc zv0|_fPO%NUQ|aDHe`g=iGjC`x?;$&wKDN>Oinv@7cIf|D!c``ucRPjY?jmsC{AJK6qxI%TH# z6fC(ONSlAepLO~Yl@I*;7-CCWH3Q4JumJ%D8 zvzxG#2xB)9uh-`bdAoeUaKIl51;Sn7=*2Yc4xvRaW_B8p>LPkUXP{6j8?L8Ive8F7 zeBMwn9OZAQlyVoT^XRB~SYa>_@WE@!xh7m56)*H~g*Pl?W^~o$ROCDeU02i_fT~Qc zkW}fRVuXeK;8Lnk>CL5O=BR*x6=s&$xy@Ix0N>+ffy5?O>+{OlDh67yWCs0`sobws zOQw#oM|qPK2W`cB#bmGcrm{glrBc*!!Nfu!X0zQ^g{} z0v7bOv!o}eM6oVYyQHik%SDkdEbQ|tVMIo*#d-}D5dqaNM1y`Mib#MMmTCPW3 zVkb^Hl`UX#JxG@NG1`;FE*uVaKqNqbL%tfWg#*MP?(EC=t>Z5U3&P;wy1~H;M*Ych zTDc@7b`tJSB?_5L!V^ezb&EhszkuvGiU6m;PEfGCreT8tCY78$9wp`rt@SZUx`A_o z_v~kqp5^zi_3$`V%&AF!7|)cV9>XjivrRrv!V}bV;VYb1>3(BBcI|{65z>q72btq) z)8#fa!|SUl7tsP^zU3gzu^i)hmV+|Ka*UB+2~VV^98va1K~L_{dk!EQnPT}afV^T- zs#ondz@7r3Uyl)L9*a%EFgx4*wFT)uLqm+DW6~)@3!8O%HO(&%4CxiUwjUu^lY5Ope)vxjovgAZ;Hj-* zXz-GjV=+V|5E2E5MN~)-d&w|<>JuB}=ot?w*?^J_!b{SpT-RcH5al_?%_ug>fb%3H zWn@G1LK4!l@Tio{XxUJgUP{>zRODWlimgOoDIgm@0H7%&uQosmj`*IGp&HkXH!6wl_LdpHgV}7_JU~A&J(OHWAf93$ZJWH z$f^)<7{LBaDLKf8L4+?3PAFK;B%l`|;;rC}M}b5^GlAfOVGm|>l4;j^Rpc`X6JV~Q zIkLL;eJb)995Tw~TwQZyb&>m2%OJ~ZGg}Xl93GUbwtCZ~@Fgz01T-E^rVO0_J0kcS4EqRu-pOX1~iNR#K zZ-7%vh?h&1bOLvCVxW8DS`q(E3n&(T=M{ap^At|Ty{Fs@h}eqUZ#ti1)q0HEJu&3_ zQQkN1U$q2CIUP7Q*uuF?Mfo3O19P=dQpv)_67H-Me8(niWaHV-l595Ct?7suTr9mM zCa^sAlF93o@ZqjE$-mTnI0RIW-#*sQW{mj98_#T~-%-9SrIRV)zKl4lIAdjXDO2Ep zzTNVG(YDa~N`7~~@cI0Ww6locM#-F;_mR%IoqdD7g`Cs9gxv0QzFgYpc6aSv)fL|B zZYvJ#bJ_*HoZeerh@MK8lMB)FDL2|YJ+xJ>nBJT2s~|?Xw0kf;Sip*zLZK|Y*zI1G z+PaaKbi0+sH+H)_I<%^e4#`{PbgxQ5*jckGg(otbZ@#(P-PY4v$(JkcNT9-gsR55v_&o(bTG_mBec%bOY+9>CL? zkAlV@Zu}mE;#W2vtlRj3%j$1&y#g8LtyesL{#WB)U$6O}1$jRfdIY`U*FD5+p?g2b zSHUQL236yK!|mO|ZrMKLhy$_~QALwr`{4^Ax+82TmY1(9guPD$Sq! z4>0x%Z>ZMlF+)ECV_($G`NtT`H`0e8u5G=TuV+i0^@JC%R;w4$sS)Z$r0lVNLMCbT zbU9rQ$hNTWuYx^YHF5l7jp(L%WBojm$;`iF9zQ>Cya!_)JJx@29)D!sSicuyGVA~P zJpSQ%V~)9wJ?nn~V;xH#*Pa3L(N;U@abnAZfXv~;#{!;@?cDY8jfsu%&7atoNa$gF zTg(i0?%FYr%@iqtqcfAur_@=ZPdn-p1)32*Sn+T!Tc$Lh3Y6wEfN<8%KL;;5j3|k% zxE2xdyCd!&=boQUa}P&7#r;yEXSv6V?^zUQ9UiO>qi$IKA@p@9fJbL_k*xe*2iE^jivANtKg&JVS%kV`{uStX{SNN& z&hsWkk16_}sPS`Z%;$*nzUljxoLfCfcag>|0T!v=sAGI`W{1U z^a;f4^0lN3AKSh=+oi2+A5uYFb9g;|m#xw*S6;1NID>Zh9X$ QLgvU#VBLdS2)&m3A7c}=rvLx| diff --git a/labcodes/lab4/obj/kern/debug/kmonitor.o b/labcodes/lab4/obj/kern/debug/kmonitor.o index 89c17c86b4b9c172282c0dabd232c4d3719b8187..c017d8b574656587ef3fa54b8fb2a3eefa687c2e 100644 GIT binary patch literal 5856 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 A8~^|S literal 8840 zcmb7JeTQ2`%7uKi<7tZojhc zyQM`+53WVev$4^{glI@3O*96j35Y1h9D<-m5+aH62P%JPgcOn*?+*;<`Fm#OnVsud zl}X;6-#qi1XP$YUd1l|8Jve^r)=(%UxP(NH=(dD-_Da>0kkx=#FU}W#Uw6g(6LWu= zeP`h1@kNrKTr)r3cVtIsZldocA%NFCBMvPDmn*dHXA5(={@#~+`)9y?>w~4GrNaxI zR}9UYJ+Qd0bK%S2oCgAUhnY7&z9`i$9=VWYP`xJfa}1mdpX^y0?=vdC@?T~Oe)smh znDQue{ptm6`t7stl#h&`AhSqYZ~t2Zpv;Y*nmuqzbXGr0bGk z4K0LTeg4hxS;UwZbGP>Q(rCS=_%cc#QO?6OvkSfR+fE(XwKTtN4Mz0Qv~wH!mwtQl z<4faEZ=nx8%{p&?f)qgfd9;R_CTKq&e6*ugV4DO zp_H2DFv)>M5uBucx#~r-``v$0EcS&@zIODeagG(&YnCmjmlo8wOazH?gVc%{*Yb?r zl|3hyVX5!yF78ZH(rXGilFDX0F^Pou9O^w9tNr>N@#S-cSOZyEgk{f0e11}M;;3gd zzRSWL3m>=eD;9p=!k1vO8MLWfYvDr{e$v9fw{Q>4nvo-g7_{(q3r|^i*22dv{Je$# zXyJca__ChvTw@mAW#N4me$>L>2Yy)F`4bDjWN}`%@H-X`_jc#K#KI#M&RKZ3g_{;W zY~gQN_-PCO+QMY+x3$fGf}HJt_Y54HzY5vR{ELBSw4T>3eCq73+#Y-7>h9PWFpquP z!Z!bl*r3e$EAS_%6J_ICA^H^*Bf!UiY2S}&O#7Nj&Ws?uSzsDja$*ZkX2w^G3oN|B z;4MNQ=NP+1Y_jBo79O$i^#%`%trou3U`OmQ*p+!n&74SzdyPCPdu{;Gw)ZsA8Q{Di?<#0i6=;)e#0iDwMXiXQ`Shi_+4FXFJIt_AwgRyN>0AithcH)uN)QCMlco(#D?O7*R*Ao9d_c0bRy%X5}B-l>8vPC z721;OD5^73sr9a4 zClxz+Iy;|-32`SQZA>Xrib%uptl-WFtCOs>Vx^fS7qVx@jlorZUMy zI-ShKGTD_fc8Ao$lbMx{Ds`hgp+D7Z2c|b3Q{AYu!>*G~WwP`Mm5R4QU7Vv9CxxkG z(uLQwb4|G7I$o&Z3MZptW^{FVI&yJ@E|ztYP*tfl3wnF#7-6CWdPTX}Db_r-b96w^ zm7y-Va=Ty00{wA^2>Gp~)^*fq9RpUZI#UVNsol@2RVT+duDwZ$Q?}xLawO*)cyBzkKUT|J_Ys(yV7Ax1?Y@5^dm$GedvszYW!Cgo+Cpjo;)uKP* z2jyxrI;9$Aui^t2o6Q=?4rQfGN`bAN$x|qtAs9yE2Svvc!W<&HgT#!dG!;gWG^V&l ztSrFhA+qaeGQyXTPo=_!|dvjsMQDG$GTeWYIR zfH_$Ryt3z)#&!-Qi0Wr1%lT%dl8-0zu`#*8Avh|Ph1mDCAfD0^%*Ha;8A=kV?eC3i znwuVSNfhjFd0Lc!$D}H5V^V6DTQ!y>ha8f$xSduEvdN9-<0+PB$Oa^}H)-t0BK?eC z#@g#E?1#8m@I70umcbp4+f|OmWU}Zu-ExR{y$P}$?b9rWWSQk?OKV2E$`cv*0P@0K zUUL#LB#Gs_BmyVZ7xj9RdcH|+Clx_13XX9S+>wIqSrHWcX+J=8Wn{5Y{CF%8_^_ri zJtnso;_5nCh&;cAP|M8)i5B|4lqCm;QkXeKyjG!Ht~MqSUc`EEC?ofU8ZTwooI|52 zGoE?K{N)N9tsqW5l$v3I6q1H`itX}!!yJWmwhgXU;lx;XsV!xs!EqA2vMPe17Um?` zGOtoA(6*%%8*(xk<`(v8nd`6xUdhN1BkirSk!8$0MV2M7sf<^7?gT=vg+*gf0{&xW zRnMG^cV{s&c!_yLgXfcJnSkApAoi-m_^BipNYOJM(&0;LZVFyfKBc^t!&6AlWo|~Y zsSY?#b(9S^eOgG;%!Nl4x5C_XjHl8zWHc8q4VtS00(;XgPo=q|%%v=md!SYhSeD|s zcyIEiO(Qmn&D>0k=c+dA$SS$8j5-6d>QoHch1Ljt;9zWZ{HeAFvvv+3(~v%{gJ#|< zb6jNfq{wHHN**awamEHi_8@vBYhstvv=FK+QAFN3lqQ<#nJuQ1K{Cx=j3dg-G@Dj$ zdL%yVue1wwN_?E9usod#DtV|tIA|%zdn7{^GUIeg4)RuobDZ7i=qOk6CYY2l%eb89 zu8wjA2a0wtWzsS(C$y`hT*;dacp(bFGiJrIx)=}IN6daG4WfWS+5rwWyA(i zz>9?+cN!EcYT}JTeMhU4S$?f4Il@g5uXGwE$;4}hWa7o50tRBLwwclIkKGQri#Ln{ z{djS)fpv}7LF<_{y+iz{Jd?;O!=pyKUI?nqMx;<|b^?s_B4oT*iwa|m*wMy|YQ(fjD_#Xk z(-Ca}8Lvl+ow+#i9nI(4rR_>qBnVP9lZc`&+KOf;q&&HEZ`O=R;Xf3v)9 zxx=f$LN5|Dt;r+u$8<#h!oKP%Fn8jmFS40dx;X-?BZZXSWDA46`u z;fAruz(ldr2s)9`Xd)ULj(21${-6_!#uCx^ppwIPy?E&U;Ve8iZl9pr`UR5V8rl5z z58eM+5qh96blIBT-Y?+}o$fIC9+U3k#Q3>=hr`#eJuCdwFF=uZY;;#feRLOP`g5~A z;U`}B6p?8B9y|f`(cOaKgzuI*sDB2}>*$yFYi5o+O#dfc|Y~ z=ttMGf@w_Y6@ObY4S?nU!cm*N(=9#Hdv<%3^eIXD@zDQxAJyIDlQ1Ngp=SS3+b%uk z#!^Xpj5coL;>#*M;%uu$_VG=h68GSCXCol{ay{m|8g2F+wKHh5uc*!U%cOzsr1)-( z+ua*P)qgiSIF>ZtBcd)ezQYaF)PC@^_L0-t=ETB16Q{B|TJ=dO_^^_IPafGY87ust zU7Bi(Qj0RVBAfM=Q7xocejUn;7HzLk#*4kDJB(7rlew>mxVwYBAtcSUsKe`pyvw9^ zh1wSg@wo2)uI}$eh(p*m>rsbsX}4Lo_fU;-9?3E8A>DpNw~y%d*L3@Fs>FveAjQ+Rc{N4)!ZG-c+8q0xbIf%9WrYOeR|s!17L2 z52rpVbT+KQa~&QkPh1ZFqNaOa;`HL7c+vkv)P~z-IR^jrYfM!{<4ve-eYGouysIaD zG?w*^0Fz$U_agM!h3%uWf-&_I?@h#!#!?}Dw2x?g_PkG9^I|)gc`1i@PC#)SUt;wC zF&CceMhFPASuyP6i?|bVnwQFLct{+h2Flit2{ELg{G>j5?$osu;-d|oU0C%Lgjk-L zHvo_FfD6xi5CR&*_8kT94JM&x-WPyvzkC3{kgXICI@yUwzO;3rDQegl#~?)dNG|aR elP=qTYp`D)gNzHWgZ`7Wc|+Kcb4)_bynh2#t-?|O diff --git a/labcodes/lab4/obj/kern/debug/panic.o b/labcodes/lab4/obj/kern/debug/panic.o index 4791b78341c018be20ae656663c86a7abb8e887f..b96eab54e3e8c064ff8fbc46dcf963bc98851cd9 100644 GIT binary patch literal 2704 zcma)8&2Jl35T6Y$n2@hl1xka!f&}6w+1QTrft^T%*omO1g0>M7P&sRRlbHA;T5r;V zP>BSUhyo}_Bsir10yi!wQi*cl0{0$rK|*RTR5>Dr-|y{vTQ^b>BaP=bA8+Qpx3jbU zBLD83Wm#g#k|*S$CejlPJZU8cq({1CVe8K??+@Ij<<{Q%M+c{fxaiyb*{%H1cD`dP z*B9N+Mk$`gYth^B7=j7!OKQC{D z_?%n}@p<_m#Jy4qakqRD;+U+4_!U_Lz6;(2AK{Tc&=^9|o|Y7c;G1B!m${Q};9b~w z54{@m9$wd&_dv?YKmZiJ&~o-cVLT}(L*ett$*@cYX4pr-A}QqDgycTy+T)L=L&&$m zS;UyV(Up@Fg`%8{;%zWEt@cc<4E}>)&8b&Pc1c!UuRcw#SShVIp2{&6 z7iTSlmE$V?gh?YCPN7<920Iz&POdv%JriuCwd~_6n5?`HUYc8NIZHCGF4C>W)K$eC zKi1#O^p`X3F_5%N(|1a%G2g>)5u9l^@!UnFzI<|p%+JndVgn1s^}4?vOD65KofuB8 zD>ZpDm9i7*xHijKK2MPK*=4alk6OJQk;vERjdQSZ29VgxGSd~k)%I2=XI>1cjDHMfrNdc$|^`AZAK>cWFH?n)uJc@+Mi#BU3Z6V7G!iJFOe zJ$)qh8^5P-f=R#P9(Ex4Wn&EcmfwPYt($p!$|QiDWYj@m#+$e(9IdaB!Q78o11OA3 z3>=S8cB=WWdevuq;Y lA!HYr|3jFs2h3cp_p%751DheUKfar-aX+H2XM!M2+`oRge1QM} literal 5212 zcma)AU5r~t6+YhG!V=PClO|A_QY@OFb>ek=|Lkj#3FGy_#QjvfX!~;L!J2P{xCkX*Y zx<220=ggUN&dk_z{rQcLpDYv#B&|S;H184pV4v3bO03d8TA{z}ecgjy0o#fvvgQ7 z(B3av;0FXN<(q}eVwAgh^R0OVcbKj!PX7CJmw)z>aiuc(^h+l9vvhQs=pAs=&K3tzMFUoE^J_1Z?CTWI0uEc`tS|H8umwD5xnaa(yIdf37p z3xCeS&s+E>7XGz`|7PKXi*x_Jg&(tUV&Sh__&dN~G_if(;$OD#s}}yFh3{IL&wIax z9Sfhb@L3Bd7T&S&6$}5!!W`naOq@RlFEPJr;osfC-X6P%gCJwyW8tH~+s6NE7PiOQ z_zQ0*`hcRQjO|H3G%1VPvrPMdNRj{XprN*G|q96_)KtHr}t9^`3mCPhP;li0tmXwAEx~l zl56)X*hs!_n7laOw+!Zd|7Gwz-&L@>tPUL*H%qjauDp1jg@e)`7MTZnbW=5rX4}D#n^NsEW?Oo*&b$%Fp&=}^(M2`t^lkC=W^=PvO z;#ezdzE+y@i)*cvHFiuj*>TNwd_fI%rJ5!#@ocnGx;(1&xI5g6MkX#-s%8>y8?}kd zm12o=qn6m*dA)RO=O@FS4h!YNL34u=jfR~Rr?a0{HmNh2jG%Y;AgXgn*v(;^tM8N% z3lAyL%pws18+s+SbZW*F^D{qWL`we^vAQits zU51++0^>KplA#bS8m1^QeuA5i@h&dm=SO!>^5(?J@8id}Ipq$HpxLpb;aGF9?{8(I zrU)tW{)UsMqGa6sPd;!k{>NZM#G5}J<&mhsG*?v76{Dw zn@oL`@o!Vo?hVrjcMFoQZL{zBOxZga)2S*IP~d~WEIH=F+lU&F3s_{1Z2>PKj~f1Q z!+*x~yQaU%5=l*2;(v%|S)zd7hGc)=xt7fL6g3VDtn_=!!fZlHd1Po;8vx>C;-udnrJ<)`djfB=Hp2gS8&qSRKZPuFrHPW$z&QQ+0)uhyxG=^fmr_E z_C6S5#R;WSjn_fFhnPO=xbYt3bMYZO+)ktBmm&E)vJJ|jPR0?_N7+={D-KLwy2sGR zYf^stR-j-X(gdr0AtWT*@jJY{L$Muy7gh1t@x6}tnB(~P#IYUE*Tf^S0n!Lc{vSu0 z#CHM&V=S#|-@smY#9$U;$NQ8q&&BO^*p)R@pRD8Ow2_L$#|j5#HSyO2$GOS8Y{%b^ z(l`%ppT)yt#I6jxj1{Jd-Bak>bvb}D!r#R_J=aa@V*3J3FTmiFAaP{WzXWWDk}6+z b{r&`l2)s1*!;SwEwC&0uE-H=w5W9Z^&%lvC diff --git a/labcodes/lab4/obj/kern/driver/clock.o b/labcodes/lab4/obj/kern/driver/clock.o index 17da8afcbd466e7d425533d036210c423e570899..621e9a16d966fcd3554e8567fa51fcae9eeb6ffb 100644 GIT binary patch delta 844 zcmYjPO=uHA6n;D1tqINUY)G_})OK4WWHkx-E0$oygrE%;ycG0ODkeeK%2t|<2N4@V z4}zfK;Y}eTcn~i_Z(bBpFP^*!MLhMS;6)GO!8em-*$3~v@B8-6H#6+)E{=>xR&u0* zjEbxoFoDBxxf{R#WBolzij=2eABHdIb}Y#NE>a)(*bU*G5PlfK&j}x)6!C^~Ab=lD zSdi!w)w`5tps$2*3uXX>JwOvy0<$KxAQxJ&9N-qz34fs!rj0<)gz!;V4fJDhA;4Ma z_*isD;P$nx_9p(FNY8jqd$U(PlPP42c8zLD*0Np0XKJd`b8dDwys9TZL*H?|>)y66 zlx!)KOFl0XcYDrdx7)F3P%f(2S$!1CVFWGQo%jw7&{5W-Xu2{@h@`YTn zf2r?!{o?IXDPO4A)>sB?#Zn6voqLv2guF!Eh}>fhU1J?xt$#3792yB+=mOQ#|b z9gl)aJx-PT+`)DIe4|NBp-<;Tp8!~+&L+oifgJ!y3Y`I55nTg#;PdZ(pH=XW-osnQ zaojbMii35Yz&*o^?va^ALpuI8=9Q;d{JPs|Olgao+;Dm5JEdH&y@+qm)1EtGF l2am3`bCq;6yH#e26XCu`MK9*?h06UQgKu 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 W2MJODv0eMv?@{#2dw!4t-hTqys%QiN literal 19256 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 Cd}$~E diff --git a/labcodes/lab4/obj/kern/driver/ide.o b/labcodes/lab4/obj/kern/driver/ide.o index 12b2bc28e6cbc93b7a2a2e427c5714c91363dacb..ff1525f333f8d9f6f585ebfa29a2c7dd9ee8d1c5 100644 GIT binary patch literal 10408 zcmeHNeQ;D&mOq^YjT%j6CZ#iqvyBE!Fvd>E7YT8Q^wUH@Q3&EH#w6V_T_ovDcZaW$ znP3x5SIbUDr*uCojgB=s>ZnsXV$}vVKuDqkY*e(+MU56rL1-Bk85Wft_IK_(@Af57 z4r}c{Tf4V-eSY`c-#z!-d(S=ZBmB&ocZ192BB!`0m6A20+-Y`8u@bqIMVV9=+ZRn_ z$F20{n3d>_TZ!nvxtSXVQ2Q!#gY{KxOQOg6GV^u524dEUxOHM`7rJ*3biNy1lR=U1 zKocFC(mfD4_l=V%2PeJ3)?$3K&p zJj7b-*xUOta6GM>RTzI9y76IeP8!!^X*v6Eg?Z*}9!tx~${2$~ur(gta!%%kcba2$ zZ}nJj!qGROeCtr}#Ln4v=W#u~okP}+1o%6^-+4NJ?_bnlN&Y*q_>NkRx6$kEbpx5} z_F{3Jad@5C$rsVDdmyuWM75n^sxIykvj*39_y6a~lQC;x*y`^>=Xl*W}>) z_DO8>i6d>Xk=WOAVkr|F(pAIZSPHsE2O2Xs&{V=^VViTX1sU87nLgK+X=_-f<=g|Y|AboE z(`FhS$cR~cl)2KFwR_mwmCK#11b*pYF(PgK0$1GH?b;Hb4_d-ClKJ{~d$QtnyScK3 z+iTFiNAyuE0pAjp)~?WCyiRo(McgoL!O2)%0*jF8=rdoZS?0UCyjGD=W&bKd& zCKlM;2iLC2?t=9dSHh1$_Ty3*7(A07_MZ2GZ0`A!TsQW7?V1eU`4w39jJTEU8m$5$ zYq^RS&H-lMz6pKVg$c*~h}LCpNbAP>aSlKLTSs6>=YaWNpFA124o3$N!JMStAF|#f zoX7Vtm-i1Le`VWg;Yf4~7@QV9?6E!ofurF=CS+(rs!jN~$NC6_k3jfX5jO8n*PJw) z^I4DeDL9{k^O1DvON5Xl*v_kTYpGkw&_S#VBr)_9L~ z0DTUi&$!A#M|6HVG-Q45M%(9TJ9Mab*gA?Op@U1D6>$ zR#wc~K5UJ2p-a4OG(LZO+!~pXShmNkk=~Q@v)5W#eAJ_BvZ?cF1bZCD1{X;5F8&`3 zpnf>>Z3AfIguXghlJ|?V3!scI|1SlQ=PUx~tN-|K1klHPXA0uZ^hIpxUkRYQmu|(T znT11^$a1;PCBi@QaonN&0M{&q@QeZ}k16y^;4aa>1j%h&KE>6=03{5gT?!HP82EAE z9MQjP=syAOgPybHA;B5I=fRaONT+zo>p-9z=t8M6=B$4)`0F4q)B17)&&2JMXo_(1 zH0K5~@wJA&Oye4=G;puM*B~tzSy~w8F(p_s}mOcoT)ecJ z`ZQiczc=u(#y_Kj2L6+Q)8M;pr;9Gscr9fc_%e;}r^^kTYhaIo`Apb0@23(2R~fj* zz;iWTOY;qUtH#}Qhk^Or*!CYFpMl#9{9^;(r*RK;8JOeFw&SNaHNK7BGVr?^KSX01 zucw5@e@DlGKf~1pW5;mz4+$QhkO#gNJ->`xo@(>=f>S8?Fz}BAj{(mYya)Ji1@8uK z7R-63UGOeop349(CqIkCY*C7*#odYS8Gl!6$Af^aI!S#H&miIzoAM4UkCiQ@TY5j4c($SwX_6yk8p}L z=XttAbDpPq12+O668_DakNchG;C=`ErEr#L&I`0gb6zlV^$V2D)i2O`gY$C(KVslV zfiHmFby%kRwf!1;RU72u17^N{AeNWX(VSM*P4eGP3j`fdlFA)Mzl=Ox;qIWN;L zjbEYn4g9&ruhJL5me~1B+qsU;MQ-E5&vI7+FA&a2&3Tz}H0Ncy%D@F0zfQ#(|BgyE z-ausxgnlC@^wSiBlgtSljhwL2$O#*boUqBr37d?Zu!)j6 zVG|{D!hn$zwyK=4A3k$jP2v{;lr!aoFNBk+IfF({7*si7(mA%BX_|9-PRJ6DM{~9r zIboa130DZ`M$I`rCtM?(TQz6M$O%J6P8cH22|p74GR;3dC)^~QPR$uMa>B5Y6NZU% z!d=4ux#pjq6YdqxKWNT~krPIYoG@bKgb^brj8HNsj8HNsj1cF9Rbqduwtsp~SSOqv zn)9a036F~Y6RkfzCp;yb1Df*(BPVP(a>5QHC+whPP8d}=;Z?D7r94dVJ4-SrEKxaO zlW=Bh&UPawY&UYkc1q@ica5B|)5ra)0PrTXSzyQ&D|Wu&pD|>h~2;Q%gg8yT3JDu`t(@ zUzk_b5P~eqtFlF*4fuG}GTW;%_Nu5v`BYvR_D90pSZ+6#bE7f6{24{~ zR~ZhhRue1F%P%cvMO)D4S5uj3dR6RUx61PJXO@Cgj_K)%VNFA7W@ULvr8C>|Jmva| zhCrk~xT4{B=jC8LFO1b|PzhDd|-r2qpMZ1uO_8)=bBGD_?1cvLHg)wex%_Ush@ zb^O<>@KZf-2-rnLJ_|&&Jr)z{?UPejf&fEUbVNdqrqtHVC~_2-+Bc8OL0FI3hwUBa z;8H8=_=zU0v#P$?|!@Ltr&3V+wbWAuAXuPu?Bofg2{YGA-^45dMSm2 zOz1m1U|G(PK4d<*@8@Is2uA`|Pu1IR`^jw{r?R(Jlyj%|Qi2G`H zt=Fo@b@QV7In@iQudkg~yQtP$nCG76_N*-Oc=Fs+s@xuG2#5WlNFdnmZf@WkXN7xe z_zWo&M%`1nvCz|*D;Xs(-+k58@Kpup+vmhRtI9pUdP)7w3#~Z|-P5MI7gx`#^|A}f zr64~3suSm)rD)#Tg>#c!yX9)PI&qGrB!%e4Iddx9xpj@5?U7D*VPQdWf#;gSPE{@Z zX;D#ur#Mg4SRdzIz_t1|a^08ix-26tjlYk((KZ8bj^fn+ zC4o5;&n#I|@%AN;qUt@&gkt9@L#RHyY!gWscct&&{0lDftg(;kTMp0FM3ZVM>j)wLC zI(39_<7uXjKvTWHy`izyZ*;fsd!~YKTB@$^Hma6Phj5L$aJjI@kFdn@E`y6)=fA%P#eWEcZRX{OtP$BNvRCA5BKL|+$K1GIxyZXj z_KO@7d0gaV>?!koB6~!7u*WWZ^vs5D%AUx(M0SaMM&yXd<028CuDb@rre$^?e@lIHsG-e| zanH8=4TuOI!j`MTIZVBON}b!dT!stVM6+>mdHf2*8yc~6sz1VC<;|&5M@Xsi3&et1 z9DAHQxyj-6p)zI=-GbR4rw^-`SA%_Uay5^OZB~C9F#X$mCAi`rJ~63m&*N3#a>fLt z{g=SLV+?g?tT}?Qt*Rt`i1&NJEO=Zlb8&GW4_8n=#)9VCQ2lZnUyDR4C4SC#JII#K zxGktMcE-(civog+Gp-NVobNg;Jo~`=f#ag*YubXEGN#}MN`$mpf3}x}i*1?fl7anQ Y51muk4j2A=u*rK3g?*IS* literal 14204 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

    9Fc>5)51$u)Jg zv?Nv61Gp<$zT!Wl;PA;6wXrxc5s1!wBIILoHrbp@XJlsW7njO} zqoA_bmh5QFEtE`QCC1$4H_LUl+i97M;Uh3>H>Q@Os(@qaAFshv9YeRXYAW2Rfmfsf z6sU|kQ73Q?W_v zW@m9Gl}mn2XJ<3buCwvC>i?b1k^0YYHlBAE9V+fD$`x0fUtu0YxKB9FudLu5k@H;O zX^1*8T$j&_&73}G`izFz4f7hDxs{%CJ>DgLueZ`O;X;p>;@NC6lS`#LJS}m4pf%Mq zDf=Z4yJku`pTsD1v?DDzJ%(W?G!+EADTC`#Ar3J2Aa)C$fIBlswA^QHznNvL#jZIx0xh_v_b+Fny+1I6V zzT5oXYHzUGSLy2U=&l48KfmYK6yLwRk-x0!XB}Q~ns<6dH(yCbx0V*2Syocgi|4KU z9*-|h3;4%5sdUAd87Gb%)A$l7>RXj*QpWE}O?myD#XTj(zaR7B^v%;1)3vh@lmvJ) zAPx6sm%#1x;(8e6>YadYYq48ifwD(&y^nH!S7GWqs;#iy7IXPKjPvonWjJ>w_lvok zbiY6wmN0CSO6X(tu0$(_e@)N6<3SfvvGTH=FIC^Mv8EJP5q|l-38&q-iom!1I|dp% z71OuuEL!{ah&<0|Ar-6Hwe#{ITU5n#0$l*ibIJ2{3fj}}rkTQhyg)U#`#X<^&D~jHstj@aGvi@c!sP`JL+KI9>B5+7mgz;%V!2WXzh%5q)@3d zgJ()D)R}6IB|GAHSZGyu@0zxPZ;C2!Zh0zK2+HUht;AJ?jqndFu{mx;7dd}O(cT=335!$KN@yJP!V4c@9hPCqjC)jQ~OX#~qE*F`H zWV??^{%Mi@B43j79g^QClHUOqVeI^E2iq-`ag1jP-E|_nMXGV(`+@=P7s~gFEJIz+ zdqvI@xkTg^k^H`uc|XO*DuUli@oioaI+0_EkH6+)>u~w4BG-r<5V==m8MYMjrir{> z%; zS1!~jlWeQbC70x=noqS<-IUEzH7oG|Lsf`3feKaHEytUocHDrex+9%SR^#q78N}ur zB;VT6Ro$6McjBIVlWQiqFs2?(qAOoJodYJeEMYmS#Boi%vywcQaXJ$hmWc8L=Yu|? zdK6+BRDCQ%6{{yn9?Mmw2RVRSN!z;sIxf<@eq?rAJda@RkFLWi=B>fp=m^d2V(F-F z67Bxo>IYByhb6D>Fx=i$T)Is_x*i`f@pscY>9%G`Eq%Jt4S|e97hf@L=)Y>vJ{*`>RUlBTq&ZlTaUX8<)A|%ap1`Sjj0wz##*VeR9!r;p0YCt z{YH|;z0ez$$7fgU?qP})Zu{XdqalBvA?wX%W4_e#Mo}`FuU754U0JSf zaUPh%{8f!&5AXF8*8?VTid_>W!8j4ycN14^Z#Wb?4tk)aWY+^tY}|u>5P=pAlE7ZS z+FAyovz>B-ZhI?s`vKPaU*k8#KBixYNFA}dk6OU=ctP_Hz8y{YgLfJ^d;Bk61stPI z2?zceZuWte3coP+{V04DPJ63+$?uIEI@eo)n>7(i3F7=;7&B{KK!GvWr+q-eHH>kL zenq3He`7IYCcT9kV{A*=cO*A-OyK@#tYy!^&9cut2kYh>SuK=h1Hzj?_JZdlkMlSu ad)`;zEudzMI<({PEN=$MmKsSPhW8uZ9iKb^ literal 3416 zcmb7HO^6&t6t2l^bk$^&m$6W_zcrdwP1dBQ9q1a|nVV0TE=FneN>kc6NH~ z=?S|bYLJK#6oOt2hzAioc@>0+=qX@M>cN``UPTc!f_|@ldY-!pYC&y%_1^bhy;rY# zs`k|rXHJ$%C1G1hl*MEQ=>uBht6@&;6EotMeUIKg|K^XkuU&ib3xoe4tnH48&D}yw zgCC1s%IYxw9#cq&Cox_&_#DFnhOaaH6~n(Wd;p7G#++J%;g=cyh~Zld|H<%U2=TJ= zBE%_%+YDb~_&UR%GW;#WzcGBMJn`=_e3s#t7=DN04}o7Zv3bT!#^nE{8#KnBBR&^^+Won4#rRz8R&6xKe7omBSbb$DLtbMJ(@*rtF$IAtB$djX>rE}7cO?;8 zC&{fRwY8~%b*zGr?wh!z z-8GYN%cxCc(r%V@Zqzn5IoU5A+l90j>#(q0_|Rm%BKp0~Xkjx9oHY&OWMu^0Nz*>4 zlD6)|Q)1VcoxLQFR>RD?j%n&uW_y*`c(kv(b1D3V@_{1#Fa z2U1^A1K&_l6bM7@wveJ2kTw-{m}iDdM;cKFn#|;so2)h}IIb5HOQz(IHbNT?2UbYQ zL5P%xqhuVXaWd*Io||)Ndq%-9ZuNT`i(u3%Rb(4PkaXIkghcQJN!624M9F5YWYDH# zdlHduE5IFoDV0Us8~qOxaq9T-#o4*@o$(+a&o&+3sm;4%HFIB)HK*n~Zbi!lt{XwW z`uI5)r=C4eua6rf!&N8_p;IeeJS$3s8drn#)+Bf*LOX$clYv_ zU}zn^T}XE)J=yUFmqnWrKmS!s0JgoXFh_)}l~tq@L0R2Sd~R<&Eh~%rCrY5Q+JT9v zZ0=PnDdXm&cNsOxG@VG{Wh7 zW`4tr-t?<>7(2r(9VS`6rOlJI)=JjiNU;2WZuEww+Ul2z5I(Sa7Z?w= z?nexd&K$KfdMN%{-cd-X7XQYpfn#mR3HkdTduQXYXTAzKosK1RYCev}5=N9koeJX7 zdI7p!6Hv@yLhp6k>{?GlK$zC2_CAbh4ckaZ{j?da{3b2Jn)UZQWc02>=&BLVes?6G z_^74mWMg?hfk(EsS>8GXJl`Do?uU%>rLV%~%Y8vCmSA)X<6d<7*M@jxN51&J?1z&h UklAMQH~<0XT>)>)k}z7{-xA0f1poj5 diff --git a/labcodes/lab4/obj/kern/driver/picirq.o b/labcodes/lab4/obj/kern/driver/picirq.o index a2caebd3a44619e22e2afa42c224cfbd1b3a3fdc..ace5347e92cc594c1b60313b8f6615275b5e4439 100644 GIT binary patch literal 3140 zcma)8Z){Ul6hGYxP6CuaQ;Z|hMZ`72+uFT#e+mhITIf?k%y7yFNom)PR<>@oZ)6gK zOO(h09~R>WqJ9`5(Jv-`FkyyZfDk3jKn4m1A|%W}0Lu(SP#|pn&VBdZJ&g&T^!EJj z@BHq$=bpa4_uh-GU+eLBNSTMqX=+APdeVuQ!qt$EW>ee1)%Q!4dtwzG1F_PcSgGRx z2lw;WuA_D{7~jF89VcQBs%dxZzV9H$aNC3NLEmt!bnJSCZ}_MapV*K1Bg7veJ~2Kx zI8fSrTqO4*`5`W2_pu+x21fV&IqEwy>KmTMTkNYI-G>wd-o@98larHEi=rn)oR?wq zk!t!rc5)KgPa^xs_#n8``@x-J?i9Gwf;;O6cV;fQGvLk&?mVwO=LdHV+9-GO5;jV??cQ#z~Fk>q7-*wiyFaA$2nQk z!~$59o)Wl9@*5mltewIZy#aoS)NIn41;jW4z8}7XOLQ&pVj15AJOs?=>XRB7LjGqJ z1g@g#a>lsQg=;ikNOiz_UHLf_B|kf1QK}YsK7)qO_@(CKdbcQ9^t_9o>Xp+U4sqXB zYmG&(XdI{4HMS_Bah%@L*rKAwapLQOjraY~fg=A$8e8irNyfe@doctU^rp7*g{3cY(vwkqr^`;J;O&CrvkDb5oraz1v&l#&?IangVv!6c zi*i9S1t}T0Cv;`jEOHqlW?c4e^N|FuOB;u!k*V*-o&lT5%d zHh$Lf>)}cawo&wfpGPw>Si`?RD0)H8(F$R6&8w?{zX2zGBE^k=Gb=Qf68gH;m)JmaSso!Y)F6bgxHAqh*rCsMyI@FbNPk?SNP|A^f7@$}xaKVQ0O z-_+3T-l?U1Q%keIq2Lfd9$oBCfQcMloIN_VvQhR-eH1y2>&W!V^8Uz?sio)M8HyZP z4E&c4!G96{i|}7s-oO9YpKSO+gnx#~?0N2`GkZ@Q_}7WZA5KJ$T*XNaY&>xQLG}*b z{?7dB>Z&^|e^ezX(f_n|zX~n%o?#(c`H^IH7xHAXAz0G)UgFBmqJhT@~p@bdR;%cuCdrwGrHsIQ4?$4ER@V6b@bMRvheiHZ*y~e{1{}%_p;ou7n9vbY=yTQRp2Y=ncB?tE$ z{7VP_*1^v>m?=J?^ZYA#lk@3M(X7S!xI^pjbZ`dvcFo@ld=Pj@_w#bSMk0B+!S?cU zqkPF~Zd7ND-Mri+UxB?Jaee{okwnW&!NEnzft%49b4K%WvpTO2YJP_r8I0}YqI?hh zBUk7oC`a zW>_nz->Bl8gobPXo%V3;w^>}2J1xGlCUjB1&1#DBO^XZiU5krSvA7@&i;ME0#RYpN z@=}z24*!_NMftVG1$olqqC9PJL7ug^C`TDR;^NN|1esSU4FZ< zsoJhR;I}tfa%ZLDl`75oR;}(=qf%>hC%YrDvH0kgwlcYKFP_XKvx#&vo3k*JlgeDV zt)yNc^+t2CT-<}F-fZj~Hh~g>H!=FDfqIQjZD+%;+9AncNRk1Q-b8XDo$)48I_?$f zRG?0MQe7$`g}9ehIi>?qnxgS|PKh3U5hhd zI+aSGYPz^~yW)DkU{MM$8|;~l)z|5ri(~6zIWL7!v-M_K9}m4pm?#OaRGYn-x*wbz zy&-UA=~63q{dzCpk9!o9wlQqN3r6cbFo6SSIvF^1`Az7+Y4$j-tI5D=H}GyX*fZ7C zd6~%CYf5Lc%KMete7Uak@=VqAf=k-1GxJQbOmOWsxq1D11-U)YtW|@wP%hkPUTRe8 zwVBSQsz2L_&dE%(S%*K)8&Tbdg43KWvHI~bP2797rr#6=`=ijT*H&ey`fB`kl(;w?;fxs*`S2OZD3PB*dxF zF)Tct12a?Z_@odN%vi$9T~j1rPT4eN-~Q@af4K+ zg%12q9{=-u^|SmcRxmZE@*8E|K-=_8$ZnDoq3ZOi#EkE=BFjBnw@wa^OwaTh-QMs- zG#QPJ$9t+5|A`li#*)$aXu$I~X%N>nxbSl$_k3fTkFJa4@Ti9;oS=ms-XWnM4TaWU zGdQ>hzbUtZ=EYXx$JCmkM+d%k?NtN!KM#rWZPvbw>u)Nz^79#nzs=kE8)e3a^Pxb& zLH(wG(iAZ$=kb2fZK8{Q+sc%lm$*BOG}UCY2_Z<>tv1+5ND z*hVw`FMh($O7>e=KHu*Eh4ExI0?WFwHaB3t1gxnA`~BZ+b4=~|bPuM&!O5}5L~cQ> z5K6F~77JX^eLg?4|2)Fe|B|-c;}8lH!$p2GEp!E1T#swJsO{gh{g1Z87!z89H#XV` z-hpZ1`zKX4jA66puqt*`@nC8@*_&-E8^o?nA+Ff37s!F3*XjTNnK6$^P#FE)|ECZ`Ye@b2i0BVv=U0O3Qe5=FILP zGqdBIvztxOy0rjp6}=E z$wn*s!h7E5{r%qW@0^)$%zpk%DwPsTDH)a>O=Nwa_LP-4DhK6&)YtxU^Fiu2XGgNX z-uTC!=iY(o#rMXXEzh+WW?S)YyLy``YaG&DrgZ&C#{lt?#qO^z7E) zQJB`;%;+!N%m{6e={99L^C-mT2S`N7IPl51>cjA|Q{}yJYv~BHi_AhcyN3U)^(SLD zHiv%zySx&YLW84h{2a%rk8J#PWUapa;@7t&+N&ozUEgMtBeuzBSsue2rc4ZTv%bCY z-Y`6)oCl&u)-Gkz$-(a#^AG?0AIBW~zsA&idRE4VMeaw1mJH!3@(B0|g+z`)W(=N( zTs1gK;BO}IcM_N@x(X)!1iTLB8vF*l3MPFQO{^*ee*(V;eBIb7TzNXyT)Bi3smYbP zJOH?b_zdL7z;}SxA=SBobmbX5HM#O7xi5j4OLFDQ!kycTC19OTlYv(uNfqFA$eo%# z&5B%UCu+9k@r3=U7|+W^VAs^##<99!@D?z`Zh>uYw}BboKn(jKg}~P#Ur-u*=B{aS zWi-wuJ`~&c$wM(dAf*KUOah;Z@j*EQd_6Jl_kh=7>oht+;ryF&nC4A-1Qd`?4!FU0sk=>z}CjKwvi>lWDV<85HZZz0C6TN;OD9X9rV z$YAzQa^+zS6dp_TITqJ+WlS6sMZDAJSfbA{H7>(k`MB!y6Buh1`iJ$&_!jtWoLLF4 zc>Q*mZ^~tV&^z7^kH?1jX0z02E_VAt$8Y7O@6G$Ae!o|3A1&mH*%>@b>N%mFW%ZoQ z&J5s~%+?CEa%s9eJ$0fqJy{dvHKJ;yG9?VI`9>>cWhv-I{b*ne6WTCQGI|+$FAU~; ze#=3iDlwT=%~bm+Hpg3Z|xdI_xzQ}I86IBy|3Nw@qV|PUogAqsZGRMvoo`f+I4wZ`-<3GRa)^7c8b({4w?xX_+Co|VcL2Lxxqz!u!=ZY z&~}Z?OugLpbm6@8BYV1#gnky=?a)`tveVF&K@j=>cCfpaWLGk-%h^+|d(mln9oz}$ zN)RpJR4#j+pyl*E=dnViv$AW!*`m`9ognNz9y#8!7j(S2j-S8(-gU5*lCyGVSak*A z^5p5$Rp)4ZZmAb7ImKeWoG*+Qmy}w3zEsK=%2{JZpZuT4sZM@G}>Z{fZl zfsIV!cS}y~AGtB~*?oJy@Gc^>kKbYX)LY8>pWc@~_3r+(1N*aJzK^~Lj`N2u=m3}; z@GAHP@LBLq%$d7lehAmE!2GW7#4O$w^Gmo+qVN9{!_*`pG^VutUA?QVfxjs2*NgKT zf=+4YN6CQt-fkDnHO5c5;Q`;8Cs9Je#)hg_Q@W!oBD{z=P2>ve2x;vj*(x5 z9Qvr9^Uz+ASB?D*BY$lCKcmFQ_8r>s3;b_J4q=^G?*Stpf@Hl4UW08qL0LTg(X#U zrk=)rai09c#F#V~M?fAkI+jY&rY&G}tMZOA{=dbsADhDxtoI6%aO@OuT(lwuaI(KQ zVLT5T`@<26`>O)mF#%--PX4#CWXC!U12MOc^g5corlERrToT`xjN|yEPoasNhU!Tl z`I3>!h{riLn;^!J7Qn=I-1CUrq{EOMw*@^p-w!Zf_Q3h#s>Sn7)`D3oINuJ8IM!+n hS??g2wGzu9&!EVUV6$ZV<8SC>Tn+;cY!IZ4`xoO;!HNI? literal 8580 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 MVBCi-2(`ui7mT&DBLDyZ diff --git a/labcodes/lab4/obj/kern/init/entry.o b/labcodes/lab4/obj/kern/init/entry.o index 130bd6c8e99777bf0f5be88ff2b2322c8ee4aaa1..7f9c411f5b7fec353d17dbff232bf0bf7e6ddefe 100644 GIT binary patch delta 166 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 diff --git a/labcodes/lab4/obj/kern/libs/readline.o b/labcodes/lab4/obj/kern/libs/readline.o index 2c22bf30fc60afcbf8a229ea99dfbca64de7ec58..ff86b2d49d90136bac3939da6bc1486807bd25d6 100644 GIT binary patch delta 1025 zcmYk4%WD%+6vn@qOlq2DCJ9XyOxuk1m9goNnWT+L8ZkDgxKpVMQK3&7tW8K07g9_& z6^kycSHy*j?(9ma1?!@MAa48%x^Sa(ry!!zo%PJaix=*EzwexLXU@HIpTu@UkJQMn z7xqZo&p1K|V(sLXwEFG(d-fyH@mOe)da)1Y7rOPhQ;S8?WtW?zy)Hi`U3Pf`?5d}` z+2Yy~q6l#ALX2|^{hU?koR7ij2`Hflc^>aUk#jFDaPGtSe|*E?CM_O7nI{HN;T%VU zv&Q=_VGt`kK8OdL6IkOsgy)=fyx<(eOU?$i&{B4aB6397W<{l)jmlvkwRN6qWHv6xgs*JVe}p}hN5vh1eUy8A)RAguf6FoN4!w8Z zUYJlq;+BV9O i(`;kmU{qGAn{{#u%@&poc1jd5?N81J!xGikEb|u+?VK3^ literal 3988 zcma)9U2GIp6h7M)C

    -B!Jo_l(-A+urvGLg-E0eBnlx)6EP&4{h4kzYjkoc@m8edE_U{d2gDY1U%{>)xVNW96+{mwbxJ@?#m z?#$e|kbU(~AP^wk0@O=giRk`%X^Dw0M4M?7{k8Fhf5zs2ox2~Jo9QR->4j|n{ODlc zoxVXP{q|sadHGJZFEm*~R4LUw7sZ%~X{$ada6 z9+)5NEQ~E(d0()zVE4D5otx><`Ar6O`Do`}7`AoZYTP%puNpSES;d3DBa&0D`n`pi z?taV46-}=77@ffgUTTSY1Y-y8`xG~VepcZ(4eS~Cnt{JJ@ZSdBg2`qfbK7s=IRk%g z;2#X!gRo}BNTQH|j~cja;EM*nX5d8w|773?2Hu9c=(*Ace#5|L4g7(DuLECHao#fU zZG-cpf$teO(AS-Ji-9czA2jeu1J?|E$-o~P_$ve7H86+!iHiAW=ym+}AHy;E{n$4l zHTD4Tpu)$2KL+ks@+fUph-j3y(K=th9Z!^Oqx3xO^zi`g_HmFLAMc=)k9X2b2G06; zkdFCy7o9Y4!N)Jsq=8#L4$-ua!*t2VduZOk@A-I$uKIXbteM48vgk8kKR{pl*ru<6 z$B~~|^c_5yHHDXenYPF`)qX*LOW~5nO*dbvR%)(Qq|as;?CApv)N%H9*-hxD!G2SY*jDxNQIMLS zd8%?YN*BpEakv_<*7It6s2X9S7_3yPw+mHQ?i^JRm{M#KD>v<`7O>k66LN>xZPbyY zRSmRbX-veVQKetImPTD;TV<0SCrrmvVz8sLsp8U}l~t$Ck80E{RwnaR6_=y4rWTx2 zW)+#Elck+2vyRQ_=1azQrd}z@u#hf1Xihv#;?Zn*rApnJkV45FZvhwT^(x2?Kb7L4 zBy8*w-7H1_YG8N_A>_!Y=7TV(@uQSB5^899V)J8*(y<)s(AlVTonvvu5 zn{wn3oWf6|iC3jJ(qJo=t-M!8AS1}4>UZH2arofDkzi=7(5`vyVA_gVkzuTJ* zu_7_c4of}1viorHnF_CWI(%%5PgaYp!zZ7f!No0b?llU$-5=P#zOU~J&O6UR#}_y8 z-p@YSf4S%74Xb*-xDARl7n(M? z{#RSePjtyZy>)01AlfZl7$enO+BTeUoQ$|I|k_wr;FS}n3z*-``Y z1yG@?OFO>mlWq<4THSLk?5bf9i>H-buC*=f=7!t!rllKqA~)X5Pr8WWe>ctx?<=H8 zv>5LC48jV%=e7f{#dQD|w+^<$5%fr@;2FO;~Q)Q4iF(Edu0d2M>$Q{d@$1XFn(+}^^)V>E9H zJbhMXyXKt*HuG`{dEvZsUN~>eW7+ftk#4}>CMfZ!5VpDC@iWT4%seb&AL#QsOu`TM Rn{k=E5+=LM2G#U>{{#P|foT8$ diff --git a/labcodes/lab4/obj/kern/libs/stdio.o b/labcodes/lab4/obj/kern/libs/stdio.o index 2bd0affc0efe446387b6c7f64fe20d52e8b46491..11b8d8ca228c5be48a85dacc97347b50c7b57379 100644 GIT binary patch literal 2932 zcma)8TWefZ6kao#>R5BDS}8WBu|~+W$w_81xsZ#UG-ujU(qP4)LN%S7Oq!TXGR&L= zEv+7`LWdCSlTU(q@CW$hqXw+>ABYb=h#(3UoJuec3i12)W#&`~x?s(^eS597*V$*E zc`rM4E)t1|rHC|0-4bbgOh?j6bV-Xe%S`2`TlbG`X5*Du=P!Tl@9%GB8#iU^r3hrD z^-ksf8(%9(*S+j6m(lHZHgbX68Q;q8Ld5RHIvF$Tck7F`fX-GovsI!(MJn0dO)Ry^ z!}T93S!LQ^pKSRuySFt{t-R71W1AOLn{hN*nTfZ2A-A)8!OcBc|87ecLOX}qPKUx( z>t*h!4pIEp&0X<-H!YYMx$-`S#SzU*ly&7ecuZ*`ry$iPAzuUsVA4hKHaHG08NCtm z18@Mg)*Nsd9kZt5O1^EQK@him{=%KrS)n&ZiG zzO>rAvNTujwVrF9mzwp~3dN zfy8LvXflOlxuVK7s2UowAn_J+C6#gjDRZ+cOJ!YQFrmup+y|CoRzUs%=I)V|jU|!B z>{gAXY}+mSCFM^)RENpX$hCYu1GehX4Jqd*Cr3KEX6Dvc{q>Gy(n&jgJ;`-tCf`k^ zoW69zxbe82GS4q^{bh;Vh)0e$#$vbe9Qj=BvwfbJiRSo+(X&m5-fW6ZeA66bYz)j8 z-~C#=SdU+U`!%q7^X+=C9>0ND09JRLjbGOB4){L-e+=f?uH}zTX#iYp;2rSKMz3LB ztw9i}6OX5*m^@JTn6>$3G@nDYrzq@J8-%3(4A}1X3B=W042E%jAMAb^?|~hFxj)*2 zkaj<`$6(vuX}hp3soM6<(XWblYpdm1zBRRDEgSlH7ku+NUHn5Z4Wx@-s@{G8kk87sy>oUap8mFuWZ~d})Up zAfb0K1er1Ns*!<_+eY3sQk?QT1wS_j>6f%zv|1^@;`sTueR1YWh{I8_$Ig@}f5}!TK zPX*eA6O6+UB6!GIGdZID6}QmeSgZtcmuH^25Is#VVUd^4 zKT#Vw)S{xYWm&4aVM9>_2z8MKVo?cHp-50F!~%BBk_{CSRpo+378Hf=yFYJ^Ygurm zH|M+OeD|Dl&%O7(Yrj&uaw!&ziEl9(mO)Qs`h>NljhK`ZGA92VJNNI!?Z3YI;pv^y z$aZ|X^rN1h6_UE1F%X{OHNQ-SyB{O=Ep{ibwxcX4m~*@-yQy~;RY(?=%q$tOP zo0P36$K{I_8vI~{$K+w)8Rh??@_+S^f9_b@igH%@|FWEn^yegu@I#UTehz*%A@^}! zXu8cG*Zu;T!&6f^bX5+d6=jmbw4yww;!fjzQ13L)H`bQA=e=g7S`Ew9)_QxbQLiOr zt=XIFO(v&(3duqc!qR9pSH``gl(nX& zj&#&-cGp&#^;$F}ZHJ`kFdfdOXS2C*HskyrVrMKn^J#Xuj1+<}Z*t69QkJBdpdj8j z?%f$y&a!fzWhQc9HhIg)V>Yv4m`dfsWGb7_q;t7UKAA5Z*70o)(7ma zwmQAY8YHb5vM`ehbJ=`>zi?@Jhuj5z)dD)qW-=*M%@sFVuE4DqBuWwH?V3ft20XWN z0hTUV2s3cC+-OzY_Hb*2KxtT|*6J@c>UQV21%W9~lbN};yS0El2uUbkqT5txN4quf zj;%49wnkTe@7fyu8V9bLbez?WUowM3Urm>n_w1~`bWv8tdUb8R(r|f&zG`m5WoLGo zg}zwcxikCR!a==kZr56CHJcX7g@YDmro^1fT79{jSe2z#s{wn!gJ{m7U^nN>tbQ)7;AB&O;@QDRan^??uO z;>>b+VPS53a&f8O?DfZI6X`^9Cg_`9@VzjZNTw6Pl-1+Y5XZyY4L&Jy`RPU8pl?%$ ztDT&}!xp>#jKnrZVrNF<@hyB$_zmL2_6UDU$47oJ^u)3IzVj{^*2XV0ZM=g-_SV4u zJk)%6KZxv01N#Qlui-hZ?NI03R zNZ;b}vAIk6{=vV>SQl1i(1uY#{_VlW`3@cUD~^0`H5Byy?a}xBSKs%!5`#7@pB;37 zhH-Q9cQYD@dGGYKz8~?wLW66x^LF_>9@d)n8AxAS_Os~wTC#rueP28Fi|G4iV*A^J zJyud}HM?b=u;}o}HG3S^d+z8}ItFz8rnO_ZgW;HW+#zg2-nC-bfLzm|<0987kBR)y z+5ba{ixKxFc~9b@e2WsiX)H}_Oyn1oNc2NWIKPEG8M_~MP?VPZar%Lrck;VVZaR6> z$=gm!qWkiCud)Q$>sYz!QK#NW^y)A5BvGsMDw0_0b|pb&*A1vFfhq~yvDWKN(3-7Y zJ%N)p148u$*I#M&6YWl`UGMZ>w!`bI<>gLgy^a+A@AeRw+{>SFBhrxO{^$CBpL0KO zSI#^AC~B4jMhVS$o`2rYxu-Y=Wi)NUJ8*s9eGGl_{}+$>_%U=*L}wCf;&(XX@?FGS zbbc3*-#m284|Ma+V!Sy#J|>_vFme7bz&9Uj0SaRJWqS@mrY$tTwDGy(q*3DMH728) z_s6ruoUw&W+XC;b!xWqcTNe+n*g!$%p~O)! gbt4bk-uTjWc?SfZE#Le+cJGP3&d6 zv_|CKQUw|x(ORXITT$t4szI^PmMhU4YwArkDs7|0HdVApx#hm^%y(u_mO#1BA@Z@!uNX6BnYXBX}X&$>cut-MRC-YSt&>XsQcC)Yr_8l(oQNbL9V!A!@)sTs{X z5A|8_3PiP?DM-gshIh0bJ$iI!d;eIckwX|)jz#*%2G)!Iz}?{^*36N3pLxL4z7|s+CZ-HO572Q0^|LAAg9obP;e)kJ zDZ9g6$WXCxXB>Z#uC&Jnp4$`)chpvQsI-4=N_)QP{w8ZThjx5+H#6PM?!nztP0L_8 zJ|`8QXgErwumYywfPrX0ZTMgy9`3)hy-)0AG)6a12p>$lzsxo*4mYrDs%cv@9Ucqs zjpHxUoc8p<`uJd0f#SOPG0ULYe|LC4D~W~MeS;nb1Q1`cluGbVL~`{=c`>vYe^XOp;jVkD&1kIHTU&ilrPUpP89LJxN~>LClBwdj zgSr{xWV1(MOySE8HCs z#%C?DaC01g5qN}1ml-D^yV)Zx^cL!cu~@h;ea|8N%{5kz=`nTKM2umsF> zPn!1UV&U~X?XNz$X}>$%!v1gun~CxvLy{P-qq0;&;*l-h;G>B$t+vI(+f2RNSnt+Y_{n&9YdrF#srSh^B&b(bOWOUP z{vBa0DKP8~Z?qoUXgzjdiO*ff_$NA{C#OxpF!nFuAo~XW&rEk4bS&Wwar|{#!VezM zn9!-;p3~oq&iYsc$@Pp)^|8p>Sa=Omv2a}+e@G4_;$w~J;M#bk&LeBsQ!h4|g(Q2# zOo=ma86tc+mTgTcd+M=extaX*(9xsVoi1SCk$lP~)94T+A2CV0 zaJiZK$FN_|2IruN-M@Ff-+w}L)GYe()b)-3>Bp2cwV%~f*+^2^0mqazO>O;a5A{Zq z%BCfieH49C@xcr?h}yA8%kFTS5iy9hnd#GJ&J5W3>Jj5?9s~Y_aC_Q%|JMFMQdMUr zSH)cpu{3e=@Xwd~o2-+cNV0NHk`*{H1tNs4PL2=HA_?jVtZ`yD;tTX+6?4q1leckR;=wB;y^w{{ky2Wq2Q0 zkR8Ar<89L}ODcV3QfYYBbhQa`taWp)i!{kuXh&`J4%b!Nnu$sFu1d1^C_CbXrOT zc(_O`(GKTKaW0-aJdro;8rZH_cw-!Ykp^+phT7^42}kvVuJMw#Eon?@$--k=(r(6J zy)|7Q57);d>&5ii+Um94Ok-nA48Z;*(*;SU{WH!yW3<(F1SW(#Y{O2&;P}I4VRC5~ z!V{iJ8ICHw5$(W(NNrQXV0x0lq8<#gI2`2pHR1g>Cpunen3-gLS+aTG4&kkV^bsiSc8-AW9W&5d-j6i%-=By(nGx<-Fo!ugLrYl-EU@UtT|(k7gpEc zIBm}4URbq{)pm@QB=vb^Qj>TBwwkvkY2KcsX?7H}5n^12^p&R}fP*bo91^82!9B?^ zrTDIBxbWM6HNx-q@wGnA2ih9kynckch6LA6+zq&SF5{uE1~;$oqY*WRDfN_(cY@c6 zoDfpiyHrTsfHzzA3aJR*V<~kQ`on=|;yxAKXaKSW7@$pdS#89X^|T!P(B~xZeY>6He8TdXS+0D)KodMfpf|x{nX>@u7~7QWt{vhJ$Id z*vTJK7dgIOWrCjz9k!tgcOG~HkUpO#JkiJRL29p%df4axhgCx75tZ$9HmR|WZ&u^M zuafpOI(e>|>3E)+3qDVDTAX~dy2ZyAJN|vO#>dzB_y)%t6yF!}3aL%%-z_!#IUj%7 z@y8V3@$d?%EsAX@m-cXf;uTVZ)qYFChp3OiSBuUfr}Mb_lhb)Z{T+Or=-lUYLW<92 zyh7>$b&-$r!0X8`bG%;VIsTxU;`lmsh2vp01AMd8)#&6uP&2`|LtX>J2XV}!{U(0M z)egKGI*ribeAo&8mgrOEQ}700Vm&@hvAIHOt8YGR_05ML`R2oq6xS55kovKjXeszM z-1Z7#gudqZv+6p>wq|HC)O8dYMBHLAoM`?-45>Hl2)(D4_2^X*0Tf=`~9|1T-dy$hs0 z54rXXR&O}{A?m-uGeu{U(`hm>_^Tp+#>ubs&AkUyZ;T@^&N04!@c2N->(vm)A5?ri zwL0t6rH)^x(!pm-T_3r+URD{9FBbWyPQE||UD*YS?=q~-jcU5%o761FH>(>QU#NJp ztq_}MV+?KCR}>GVmhVzLjC@mca-GgFRq1pBYBl(J(V60Oexa(J&Tdr${uFd-V3_OT zIpJO4zYuOJ#YdBnw?*FRTSwmfY=;i#*!!Z>;nR6k%2S7a7IiKXJ*-j@<%?D2x zou{47KDET@>{H(WpCURhIh|Z}m($5JYiE||FqZHNseQh6v`_t;6+_;P)n>1ddR^^u z{5AEKk8>^XV!t{p1#eM*ar{kn7<`e`dky@`i*frj@j2r*Up7^U&Mi)7l{ydd)goWw z?0r_^R>m^s$Fm;#H52#x3mqq87PUl@S_gY2%hLbN)-*#mesD~Wis5U#k zN&Ud_&FUG)7piUG`^DxVXY)PvtkZc<{nW=_ar}M7_eRza@2l5*yv6YkR2%qVv7ZC9 z`ok2@o0bREXW;xYvJQfLr?X#u?sR^yj(}evI#)TJ1*(rPj`eeVqvER&Yk!j(=J;lH zspAV(I`~MjS?+AMstl*op~iww6&=nUYjc%3Z_X0=1}FbeUGK_%q~E52;Vo&s^D$)QgUHsb4z&nfeuYos^|t zt<8}7tv3@P%08%0b$p!~6*3XTqIO%UGr(%$_MB~d>Eh~ck(p-OCNvF@j;qv>O(k&>#TN%$6OjD;yu9?{NGaeV>o7bNnm% zdB@MwiFrO$w>kOw`p-W8h2z8Y`EITb(?Q1rdajS(>iC8F0UzJu_{DmUkGDF0iRRh1 z-znCg)p+)|eT=FhDG5Fl{A|%#>vTrwOPtOKo#FUMeYKDCOlNJ5(rbKtgX5!hqmRGp z_+|P-$Fuce$Ah|;i!)>NV8?Sc&l!nt{B{qI1aUOx4%=>_i-&rtkFe#B<6teIMl8#m+c6Ao3Xp z5mYsae6o{I(TTIx6zx6Dhg3*E;p~U>PaMBO|Hko|I&tp0Qh(&+SL!auuhM71i@%Y2 zf9>kc^_`dU%yYqh(fPpXT%{+uSaFq}>i8_Z82qs4Uo63tabva98L95~@wnroRK4R- zwZX@EhUtrV!7-ZcY|hq+^UQ4hw9~&v@AL6@9luuhcI*8*oj51lp!xoZ7v5{>Q9hpU z_*`88K2+Lp?f_3eS4Evpo~i*KDLOe$XRiL1)0wNkYE1Ro6cRG10B}J*I=sf3i3iJTTd4*JgKEub)cf3$f^YO1c zzDVEWc#&S`<69js*3FJD(H}UzOn>g<{ak!2(U)m@IS z)L;1cQO9rB7h|vH6;ikB49D-#SA#zV`!&d8Y=2%jWB$v+xfkpe&N%<3@OJQbgtvkJ zQFsmb{|Has3kD&;v#u8C08|t10B&CGxEVjs6`fX}j^|J6&?mgwabJh_UkLpGIIme! z)~5JQUa2qWx5dRv3Rjd?6;za!WfiGgi=*Y2m6cuAUAnZWC|FRmysV<6w0LorswiAq z9IU7)pSUDFJ2NL^GCqUmbBy`SHJ^DIlcUJU%gE2p&kata6(?bLb-yfiB+bg zsw}yySW>|ZwW6fFs-h|?f-zPwCMfA#q{}NymX;SU4nWbE$jdN|nOFgHV>2d?1dPj= zd`IORv~Z#_pEp=p<(Oc!c*#U0#@mLC&&VGg%*h>>JATaA-0}I2j?2%?&KwiWUs77Q zw37O{8Awu65nWzU9Id*O!n};kvAITwnhHuw%5SA~g6VlqHk(jdQdw0{TwWEub7JO% zvCu~O!UDR^r=FQJ77e#qD+?Ddj?&7QjLcxr7|&N;N5^L1xwqa{Yw79sSFj`zVaR%FKr%Vp!Ol3~c(O~+7? zFduZmDGb;Z)D<@Oa$>^ML4iqh4fn6T~0GmkF@+#~o zmM7-KmpVMj!-P$qT7O}5Vacl<9AUxG@_qD;# z+RMxdj%S89QxkdEIE)EIS(-qbcvyj|ov;w0-MG!!D4*xb^1zfpwkoWw#3`v{d3j(- zAVFS zfeMvgksX*ENVp?CBZC>UBeP~9FXse#!QI=_6ct z%20mau%*T|GW<-BQ5PPkWO~IhE`okVwio71zs;%JKUik1GOODZOGh9yZZ*{>jc~TV zm6hqa#!p5u$$BJ@I2el+U zj0x+`>8>}X$63gVf`QSnk~~K%(}QT2%^%fcex9%0CJtIxJJ)8r{m>VK%x^%Zqs>*g zcj6rpzsKeG3FaN+jOo)S2GS#o5L8zLa&oeAv$99$tT4%(yMw{3Y_XTKfTr8gaA#{2htQ?>$pn4f}lD zjx73z-+3o=?&+qJf;{?<-_0a+&g|{k8459fk3j$S)RzGAXCj~9&+vV3!bW}{&jxi$ zp~Lav^Ls+)>b{;1q}?v4yDLTg#k@Q41pHT;^4iIaPcNi74jd~Y)5C$D|CtUT?fIMO z(MWs#W!iuB#y3y=&5Y+?=Fdjj^Ci=ZkoNq>^a`XsA2A(A+Vct1-$mN%KhyJ(_Ab8n zeq0iKO*=@XsAs%PAoJ%YrM=&{P|W-q61kYJ_7Xs*e~!BzW6bd!#BbKT#|A7cydPm~ z=Bp1cEGz%xu+!zX-7O(|xRWJfaHW$awq_^l7BRW&d8b;ZVfNz0!>}sA=3ZV>q|7Gb zwERH<{o?e~m>9E&==4&-IwHEfR`3zQ24F9|D{7PUe!))#4@o}Xi_>1Y;3~n_iLm=y z!4AQXfwcPx(^md$+*> zv|BCsFM{6@I63>dlb!HG=%kiTXv7zd_Osg3k!@`x%yhm1zWn z7Lm6J9uVvTQja#NH;{Xk7K|5Xas2yPU7fr$Gh z!Pf-;3&`@VOr!jJf`6eL{^Gk;mg|Feoy4;Q&jqqvCh;t#E*HE`@J1l*EheH|so*NX z8X(KBC8C~9B7a=3P$=@jWwBR-%^&5$>yHDhA3I0Lw0P~^uS0eO!V_#xB z`w4zUa2Sw!!rWLtTW~0l zcBeB9yR(@d4EvH_ELbIYC-b5IEh75$h{zuk{E6TT%!l3qNq;KX3*XPN9j5@9-=AsJ zdxqdJ!F<8FMCdOREE9|ZS^jP!+VL%suM>P!@CoKa?`ft{&vwDrD2Kn^CZhZwC`Ubi z68s;*UN}6l{0t!TuMu1*SS0z&iLg^6@->3r72L>t*m;r&z3n1z6#TVdGxMSMfus)z z9u_<*`R8E|V*9fM%Yba(3c)(T81rFokEELg-xb_1`CUY`t1o;+I|BsI7rY2aJ9$LZ zJB^KW%n}>}q+UML(7Qr#mS6#p?OP)0hXtP^qMn}!?iBn5koH<6-6nWIunWk1 zm{b~jai-uF!4|=x+_#a>-=PzC3G)A{VA|~SK>mXsruiEf;&#DS!DZa1!Pg3I6Xb72 zD4!=docl1+lLYq)a$lyLzpW!y39c1v7fj*4hWvEFX2D7D5#_fC^0z=tKPebs+(tSi zIA4(a0p(i+2QqFVohvv?utAXj@Phd!P6B62dZS>IV5?w=@dkSH1vdz$a9u+_OK`QI zS&xvXa$NvZINyNjf|EGDNN*Hu5=_M$r92?GL9kJ=3NSM4^1UV3*)o zh{2T48)C6S@Jak=g>s&=IX~CScyAEgDA*v#-yTu_Nx=Z-UoWJm3f>}EBiJC=B)DHN z74wqiG6nftZ>B2*RaWJlWmScXfK^e8%RCk>F3qaKcWNqYabZ=V%34%esj?`nlmdl| zplU_YPyom5P_)Yc0GPMB7gG8U{r)Rbe`tD;J;U zJ6uUKkJov)F(r+Em~O_~xpep$Vb_$$a^jPX`S(~X1Gk!MG{)I~dG!ulY3gmoSYw%)i+U`VjoaV8L({SLFb-@VmNK5|Y<+yT^y&mvZ5c}O-;{Zm zSJw;($YH`<>1fDSUqP>ZsHR)J^R7_l-vF^*_Rp*L8gSZUJ9)K?voX-7Y##IH;r7~K z^2U1_7QMVu(ev8JO4oXs$n)B_4BYRRdbE#quzmEK*FF|?w!qio$Ml@TSoY?o9+teZ e<#U5N0*Ag1xp#R@Kp5!e=ML1n(o+I@djAVcd1M6u literal 22212 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 diff --git a/labcodes/lab4/obj/kern/mm/kmalloc.o b/labcodes/lab4/obj/kern/mm/kmalloc.o index 14f1c6f1c963b8fcd35be0de76737a49a2f1e83b..038c99f4b93896575913b01e8235a7d7b6b1263c 100644 GIT binary patch literal 11516 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 literal 15324 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 RSdRT3O)9m76(m`?{|ozALcRb1 literal 33032 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 A{{R30 diff --git a/labcodes/lab4/obj/kern/mm/swap_fifo.o b/labcodes/lab4/obj/kern/mm/swap_fifo.o index 286b04fc13843783fc9bacc838c05e320d92af28..a74f2ae56b7b78d0d1ac0581968e3826e975bb08 100644 GIT binary patch literal 8456 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 diff --git a/labcodes/lab4/obj/kern/mm/vmm.d b/labcodes/lab4/obj/kern/mm/vmm.d index 76e91d77..3f60b719 100644 --- a/labcodes/lab4/obj/kern/mm/vmm.d +++ b/labcodes/lab4/obj/kern/mm/vmm.d @@ -2,4 +2,4 @@ obj/kern/mm/vmm.o obj/kern/mm/vmm.d: kern/mm/vmm.c kern/mm/vmm.h \ libs/defs.h libs/list.h kern/mm/memlayout.h libs/atomic.h \ kern/sync/sync.h libs/x86.h kern/driver/intr.h kern/mm/mmu.h \ libs/string.h kern/debug/assert.h libs/stdio.h libs/stdarg.h \ - libs/error.h kern/mm/pmm.h kern/mm/swap.h + libs/error.h kern/mm/pmm.h kern/mm/swap.h kern/mm/kmalloc.h diff --git a/labcodes/lab4/obj/kern/mm/vmm.o b/labcodes/lab4/obj/kern/mm/vmm.o index ae49d1ec11e65d88423b8da2f34006afb56e99a2..0374518653d206609f36f53dcfd0c81fb583274f 100644 GIT binary patch literal 16480 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 J6;f=d{|kN6)2;vj literal 20800 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 diff --git a/labcodes/lab4/obj/kern/process/entry.o b/labcodes/lab4/obj/kern/process/entry.o index 058d76d977eee646efb46cbc4594a0d9565a6b91..994eb4947d7c8a625894bed8f205a7eaff886ad9 100644 GIT binary patch delta 126 zcmZ3${(xNMU4PaE1v1X&@I20K-ca{Qv*} delta 189 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 a2$*@jHNilaQHW^!^_-5^|mZ literal 21868 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

    *gSa%N%i*R)^a!3&#A#0Vc>ir4R0Oa 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 E1EH5-1poj5 diff --git a/labcodes/lab4/obj/kern/process/switch.o b/labcodes/lab4/obj/kern/process/switch.o index c16237dfe6c7ebd51f3fc60b468ace98649f6f32..6070d88d605394acdbcbdc20e1bef445b1b8a72c 100644 GIT binary patch delta 120 zcmZ3$`G8}B0@DSijY?6BVufavc?Jf0#SHo-xdr;k$q@eJNsLyTd6@1nGQD7&{E9h9 r&47V{fdhz{fS3h{1%Q|nh?#*H2JSFUPGV7$m;h8`4-*5@j8HZJuR|1V delta 184 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 H$gJZ(s3O3# literal 8656 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 diff --git a/labcodes/lab4/obj/kern/trap/trap.o b/labcodes/lab4/obj/kern/trap/trap.o index bccf11f87a93498c9d1949fcbb2a8e3c497c9e38..fd575bf936a817d7f83177174d8b3ac9feb95d74 100644 GIT binary patch literal 11968 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 delta 193 zcmaFBxqxee0%OKT#c)QkkP_F#A|JhC2K|!U0{!G<2!C=Pqm?}a5@2RvM&dC5c`Rsr zRy02Q7-Wb5l#gtI$K-`9>JlnI MA!nd03@}0&0AYnIT+J-LiV zEJh>uG#as38qIAXA=LM~^XU zek09))bKd}0RuemlT!kMHdkzNxQ5$hR^H59u$uIi4P}6AAw%UGvb*dfqva48C&$Q1 zayoQ#!*euPDAVOynIU(|9C=jc$@8*E-jw%cX~%P*AX~^#*-1vq zesZuJArs|fIa4l>i{(nk?b)LZ8f=r<@}SI>XJw(hF7HSOXOm~NtgI|+%LdX86o?~7&%-f$p1e-P4DN*G`UQ!lUrn#bnnyRm^>v5zAm(R5?#BmTTlznJtgV)3Q+BkPl_q(w+mUD(gu< zSaSadY0y?i$i8x@Opr-(woH>NUS6I(tt9KpMzWaRqp z93I zYZ}~>US-sPtScMIW->&E%ieO3jF%JT44ER+OT_hGufcYiBah2`StM^uS6MY6Yf4`k zAX~{W87ZSF@Bdg0@LSRxeEHzEH3u&^A?D!Dc$^}9kXGyu2~#?+H4f{HXDoWo8x0Po`ZU3ljt*MQ)qp&X|#da zOzP`-P;s6$o6q++yj0rIY!Pi_wv;|^ww&UySJ4;E)=@vR4b<+eXPHVIKG=wks`#Kt+p=f}%K?Afc8ldga0Bw&3Xa_Vv!_WZ5gJFHz5e?8z zXn=;J0ooZ2&@MRtfn0P&12h5+&~9jec1HvBO*B9w(E#m%253(-KzpG9+8Yf}Jc-88 zC^SIdLIbof8le5q0PT} zh6d<#G(cyVdDD;40G){j=qxlqXQKi72^xTIXAZsyIGBqD=sYw)lhFX3j|S)hG(c0( z0R0pV&{Q-)7oq{0h6dgcO7Xb%fpaGhW2Iw+0K$oKd z`Xw5mE6@O4i3aE@G(cCQ0lEea(6wlQu0sR#D>OjYqXGIg8gSt{I2+Ia2OH4<-Gm0{ zW;8%E&;Z?n2Iy8aK)*o)G!qTbZD@dQM+5X*G(dNt0lE_n&@41Sze5B3{&#kv0lFIv z&}=kN3hqGzbT1m9-=hJVg9hk6G(h*G0r~?Ppa;+ZJ%|SAAv8b_qXBvZ4bY>w{!O_! zh6d=5Xn-C!3#LDz0h)^j=m|7HPoe?(Ga8_IXn>wV1N1Z+pueC2dIk;9vuJ?kqXGIW zuKy@5&Y=N%9u3d}G(dkt1M~tKpueL5T8IYdMKnM!p#k~_8lXjJfL=xe^a>iFSJ42y zh6d<$T>lI%iqQc56AjQCXn@{C1N0UepnstOdK(SUztI4_g9hkbG(hj60s0Rbp!d-L zeSik&Lo`5Z{EG;IZ9W;5RNYBU?lrnIURRGEgIAw~Ze@Zi;=h*&#FacD Tp_Z#SBsnd?*NIEsolxyRbyT%= delta 4282 zcmZA44SY>?9LMqBxnnVf5ay{-R#t5qvF2$Qd8W~57Mh0;n%PDpcSb@8W3hxr2x%T; zA)yf(35^g-qj?NzH0t}^{q}nG!e00NKR??&=ic)<*V+6lPVN@9)`8O$!cfVgLK%WnTZ=GHjK6VB7nF?NS>K1?Tv>F)oXLaltCm zPu7#cvWX0r9c2&MTgJ#CGFFb3$#N=mbH}qZSRgaxYPnHvm)Y`=%$4V4fxIb;WJ$;K zLd(i3j=76pxt|90WUy=^!)0d~Df`O7a->X>6XkR{PcD)x9Jl9)GBwyLcgX|ts5~w6 zFxg&4$lh{*94-^(e?LD(+p}f5Tq@VdO>&2H@73b4 zJR$SsC3#EUliui^?Ua*MWo;QC8_1@zjqKvlZ9O&UCx^&5IaW@RGh~`vELX~PGE453 z2jww&rdXW+3mROPcciO?=M|Qbm1IrnFN0)=Y$-d)?lM{qlp`pw|0E42%Q86X?UR(o8>Ne+fiS$PPCd?H(K4S2gP1{(VAw_w3b;v`ncHu>Ss2X);1eP>zKvTC(Pn0j&cn4 zZ%$paaUA%YCDW(OCQ%&z6k5-0It}pLs5sA<&E+;;)_nS$*+Lpu7++paI$+4bTC2|Hp7K5Dm~lXn?+f2Iyck zK!>0KIus4iH_-qch6dw;pcBvlO+f>6A{wCXNr-@pchLZy zj0RlrJv2b4paD7+4bW+5fWD6g=yWtdXP^N()69>4fClI+G(cyg0Xhc_&{Q-4-OgNm z5O6RL4bU_+KtDtSbUqrO3(x>fM+5XDG(Z=k0s1i-po`D|U5p0k5;Qd)ievJm` zPBcKjK?8Ib8lbz;0Po+OJ!pV_iw0;m8t{U9(E#0t2IzNafbK^F^Z**52hjli9u3eO zG(Zob0eTn>&>zqMJ%R@4k2wDgxj2dj=rJ@vkDGu)npaFUo4bXFFfaakA`YX5e?Aa(Eu$#1N0Ia zpqJ4Ay@CelRWv}ap#gdw4bVT(0KI_*=uMpeja=M91N2WcKyRY~`WG6Yg=m1@K?C$I z8lZop0a}Cx=sh$*@1p_w4;rBOdyzVhU8XL_u2Wwx$8K>^!m&b%-;s-`_lC6Sl&Vf{ rs&7J9JPt`1jmL8d-AgBzH}gRt-l@$JtGnvAPK`?RcQR8aBv$zsxK6u0 diff --git a/labcodes/lab4/obj/kernel.asm b/labcodes/lab4/obj/kernel.asm index 5ddb2156..5c75fb8d 100644 --- a/labcodes/lab4/obj/kernel.asm +++ b/labcodes/lab4/obj/kernel.asm @@ -67,19516 +67,19466 @@ static void lab1_switch_test(void); int kern_init(void) { -c0100036: f3 0f 1e fb endbr32 -c010003a: 55 push %ebp -c010003b: 89 e5 mov %esp,%ebp -c010003d: 83 ec 28 sub $0x28,%esp +c0100036: 55 push %ebp +c0100037: 89 e5 mov %esp,%ebp +c0100039: 83 ec 28 sub $0x28,%esp extern char edata[], end[]; //声明外部变量 edata 和 end memset(edata, 0, end - edata); // 将数据段清零 -c0100040: b8 b8 e1 12 c0 mov $0xc012e1b8,%eax -c0100045: 2d 00 b0 12 c0 sub $0xc012b000,%eax -c010004a: 89 44 24 08 mov %eax,0x8(%esp) -c010004e: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c0100055: 00 -c0100056: c7 04 24 00 b0 12 c0 movl $0xc012b000,(%esp) -c010005d: e8 f2 98 00 00 call c0109954 +c010003c: b8 b4 e1 12 c0 mov $0xc012e1b4,%eax +c0100041: 2d 00 b0 12 c0 sub $0xc012b000,%eax +c0100046: 89 44 24 08 mov %eax,0x8(%esp) +c010004a: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c0100051: 00 +c0100052: c7 04 24 00 b0 12 c0 movl $0xc012b000,(%esp) +c0100059: e8 86 9e 00 00 call c0109ee4 cons_init(); // init the console 初始化控制台 -c0100062: e8 1a 1e 00 00 call c0101e81 +c010005e: e8 54 15 00 00 call c01015b7 const char *message = "(THU.CST) os is loading ..."; -c0100067: c7 45 f4 a0 a2 10 c0 movl $0xc010a2a0,-0xc(%ebp) +c0100063: c7 45 f4 80 a0 10 c0 movl $0xc010a080,-0xc(%ebp) cprintf("%s\n\n", message);// 将消息输出到控制台 -c010006e: 8b 45 f4 mov -0xc(%ebp),%eax -c0100071: 89 44 24 04 mov %eax,0x4(%esp) -c0100075: c7 04 24 bc a2 10 c0 movl $0xc010a2bc,(%esp) -c010007c: e8 56 02 00 00 call c01002d7 +c010006a: 8b 45 f4 mov -0xc(%ebp),%eax +c010006d: 89 44 24 04 mov %eax,0x4(%esp) +c0100071: c7 04 24 9c a0 10 c0 movl $0xc010a09c,(%esp) +c0100078: e8 fb 02 00 00 call c0100378 print_kerninfo();// 输出内核信息的函数 -c0100081: e8 14 09 00 00 call c010099a +c010007d: e8 19 08 00 00 call c010089b grade_backtrace(); //调用回溯函数,通常用于调试,显示函数调用栈。 -c0100086: e8 a7 00 00 00 call c0100132 +c0100082: e8 a7 00 00 00 call c010012e pmm_init(); // init physical memory management初始化物理内存管理 -c010008b: e8 aa 3c 00 00 call c0103d3a +c0100087: e8 1d 55 00 00 call c01055a9 pic_init(); // init interrupt controller初始化可编程中断控制器 -c0100090: e8 67 1f 00 00 call c0101ffc +c010008c: e8 04 1f 00 00 call c0101f95 idt_init(); // init interrupt descriptor table初始化中断描述符表 -c0100095: e8 e7 20 00 00 call c0102181 +c0100091: e8 68 20 00 00 call c01020fe vmm_init(); // init virtual memory management 初始化虚拟内存管理 -c010009a: e8 15 58 00 00 call c01058b4 +c0100096: e8 5a 7c 00 00 call c0107cf5 + + proc_init(); // init process table +c010009b: e8 3e 90 00 00 call c01090de ide_init(); // init ide devices初始化IDE设备 -c010009f: e8 12 0d 00 00 call c0100db6 +c01000a0: e8 4c 16 00 00 call c01016f1 swap_init(); // init swap 初始化交换分区 -c01000a4: e8 74 69 00 00 call c0106a1d +c01000a5: e8 44 67 00 00 call c01067ee clock_init(); // init clock interrupt 初始化时钟中断 -c01000a9: e8 1a 15 00 00 call c01015c8 +c01000aa: e8 67 0c 00 00 call c0100d16 intr_enable(); // enable irq interrupt -c01000ae: e8 95 20 00 00 call c0102148 +c01000af: e8 3f 1e 00 00 call c0101ef3 //LAB1: CAHLLENGE 1 If you try to do it, uncomment lab1_switch_test() // user/kernel mode switch test //lab1_switch_test(); - cpu_idle(); // run idle process -c01000b3: e8 e5 93 00 00 call c010949d + cpu_idle(); // run idle process 运行空闲进程 +c01000b4: e8 e6 91 00 00 call c010929f -c01000b8 : +c01000b9 : } //不进行内联的回溯函数,调用 mon_backtrace 显示当前的调用栈。 void __attribute__((noinline)) grade_backtrace2(int arg0, int arg1, int arg2, int arg3) { -c01000b8: f3 0f 1e fb endbr32 -c01000bc: 55 push %ebp -c01000bd: 89 e5 mov %esp,%ebp -c01000bf: 83 ec 18 sub $0x18,%esp +c01000b9: 55 push %ebp +c01000ba: 89 e5 mov %esp,%ebp +c01000bc: 83 ec 18 sub $0x18,%esp mon_backtrace(0, NULL, NULL); -c01000c2: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c01000c9: 00 -c01000ca: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c01000d1: 00 -c01000d2: c7 04 24 00 00 00 00 movl $0x0,(%esp) -c01000d9: e8 65 0c 00 00 call c0100d43 -} -c01000de: 90 nop -c01000df: c9 leave -c01000e0: c3 ret - -c01000e1 : +c01000bf: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c01000c6: 00 +c01000c7: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c01000ce: 00 +c01000cf: c7 04 24 00 00 00 00 movl $0x0,(%esp) +c01000d6: e8 56 0b 00 00 call c0100c31 +} +c01000db: 90 nop +c01000dc: 89 ec mov %ebp,%esp +c01000de: 5d pop %ebp +c01000df: c3 ret + +c01000e0 : //不进行内联的回溯函数,传递参数到 grade_backtrace2 void __attribute__((noinline)) grade_backtrace1(int arg0, int arg1) { -c01000e1: f3 0f 1e fb endbr32 -c01000e5: 55 push %ebp -c01000e6: 89 e5 mov %esp,%ebp -c01000e8: 53 push %ebx -c01000e9: 83 ec 14 sub $0x14,%esp +c01000e0: 55 push %ebp +c01000e1: 89 e5 mov %esp,%ebp +c01000e3: 83 ec 18 sub $0x18,%esp +c01000e6: 89 5d fc mov %ebx,-0x4(%ebp) grade_backtrace2(arg0, (int)&arg0, arg1, (int)&arg1); -c01000ec: 8d 4d 0c lea 0xc(%ebp),%ecx -c01000ef: 8b 55 0c mov 0xc(%ebp),%edx -c01000f2: 8d 5d 08 lea 0x8(%ebp),%ebx -c01000f5: 8b 45 08 mov 0x8(%ebp),%eax -c01000f8: 89 4c 24 0c mov %ecx,0xc(%esp) -c01000fc: 89 54 24 08 mov %edx,0x8(%esp) -c0100100: 89 5c 24 04 mov %ebx,0x4(%esp) -c0100104: 89 04 24 mov %eax,(%esp) -c0100107: e8 ac ff ff ff call c01000b8 -} -c010010c: 90 nop -c010010d: 83 c4 14 add $0x14,%esp -c0100110: 5b pop %ebx -c0100111: 5d pop %ebp -c0100112: c3 ret - -c0100113 : +c01000e9: 8d 4d 0c lea 0xc(%ebp),%ecx +c01000ec: 8b 55 0c mov 0xc(%ebp),%edx +c01000ef: 8d 5d 08 lea 0x8(%ebp),%ebx +c01000f2: 8b 45 08 mov 0x8(%ebp),%eax +c01000f5: 89 4c 24 0c mov %ecx,0xc(%esp) +c01000f9: 89 54 24 08 mov %edx,0x8(%esp) +c01000fd: 89 5c 24 04 mov %ebx,0x4(%esp) +c0100101: 89 04 24 mov %eax,(%esp) +c0100104: e8 b0 ff ff ff call c01000b9 +} +c0100109: 90 nop +c010010a: 8b 5d fc mov -0x4(%ebp),%ebx +c010010d: 89 ec mov %ebp,%esp +c010010f: 5d pop %ebp +c0100110: c3 ret + +c0100111 : //不进行内联的回溯函数,传递参数到 grade_backtrace1 void __attribute__((noinline)) grade_backtrace0(int arg0, int arg1, int arg2) { -c0100113: f3 0f 1e fb endbr32 -c0100117: 55 push %ebp -c0100118: 89 e5 mov %esp,%ebp -c010011a: 83 ec 18 sub $0x18,%esp +c0100111: 55 push %ebp +c0100112: 89 e5 mov %esp,%ebp +c0100114: 83 ec 18 sub $0x18,%esp grade_backtrace1(arg0, arg2); -c010011d: 8b 45 10 mov 0x10(%ebp),%eax -c0100120: 89 44 24 04 mov %eax,0x4(%esp) -c0100124: 8b 45 08 mov 0x8(%ebp),%eax -c0100127: 89 04 24 mov %eax,(%esp) -c010012a: e8 b2 ff ff ff call c01000e1 -} -c010012f: 90 nop -c0100130: c9 leave -c0100131: c3 ret - -c0100132 : +c0100117: 8b 45 10 mov 0x10(%ebp),%eax +c010011a: 89 44 24 04 mov %eax,0x4(%esp) +c010011e: 8b 45 08 mov 0x8(%ebp),%eax +c0100121: 89 04 24 mov %eax,(%esp) +c0100124: e8 b7 ff ff ff call c01000e0 +} +c0100129: 90 nop +c010012a: 89 ec mov %ebp,%esp +c010012c: 5d pop %ebp +c010012d: c3 ret + +c010012e : //触发回溯的起始点,传递初始化函数地址。 void grade_backtrace(void) { -c0100132: f3 0f 1e fb endbr32 -c0100136: 55 push %ebp -c0100137: 89 e5 mov %esp,%ebp -c0100139: 83 ec 18 sub $0x18,%esp +c010012e: 55 push %ebp +c010012f: 89 e5 mov %esp,%ebp +c0100131: 83 ec 18 sub $0x18,%esp grade_backtrace0(0, (int)kern_init, 0xffff0000); -c010013c: b8 36 00 10 c0 mov $0xc0100036,%eax -c0100141: c7 44 24 08 00 00 ff movl $0xffff0000,0x8(%esp) -c0100148: ff -c0100149: 89 44 24 04 mov %eax,0x4(%esp) -c010014d: c7 04 24 00 00 00 00 movl $0x0,(%esp) -c0100154: e8 ba ff ff ff call c0100113 -} -c0100159: 90 nop -c010015a: c9 leave -c010015b: c3 ret - -c010015c : +c0100134: b8 36 00 10 c0 mov $0xc0100036,%eax +c0100139: c7 44 24 08 00 00 ff movl $0xffff0000,0x8(%esp) +c0100140: ff +c0100141: 89 44 24 04 mov %eax,0x4(%esp) +c0100145: c7 04 24 00 00 00 00 movl $0x0,(%esp) +c010014c: e8 c0 ff ff ff call c0100111 +} +c0100151: 90 nop +c0100152: 89 ec mov %ebp,%esp +c0100154: 5d pop %ebp +c0100155: c3 ret + +c0100156 : //打印当前的段寄存器状态。 static void lab1_print_cur_status(void) { -c010015c: f3 0f 1e fb endbr32 -c0100160: 55 push %ebp -c0100161: 89 e5 mov %esp,%ebp -c0100163: 83 ec 28 sub $0x28,%esp +c0100156: 55 push %ebp +c0100157: 89 e5 mov %esp,%ebp +c0100159: 83 ec 28 sub $0x28,%esp static int round = 0; uint16_t reg1, reg2, reg3, reg4; //嵌入汇编代码,确保编译器不优化这些代码。 asm volatile ( -c0100166: 8c 4d f6 mov %cs,-0xa(%ebp) -c0100169: 8c 5d f4 mov %ds,-0xc(%ebp) -c010016c: 8c 45 f2 mov %es,-0xe(%ebp) -c010016f: 8c 55 f0 mov %ss,-0x10(%ebp) +c010015c: 8c 4d f6 mov %cs,-0xa(%ebp) +c010015f: 8c 5d f4 mov %ds,-0xc(%ebp) +c0100162: 8c 45 f2 mov %es,-0xe(%ebp) +c0100165: 8c 55 f0 mov %ss,-0x10(%ebp) "mov %%cs, %0;"// 将当前代码段寄存器的值移动到 reg1 "mov %%ds, %1;" "mov %%es, %2;" "mov %%ss, %3;" : "=m"(reg1), "=m"(reg2), "=m"(reg3), "=m"(reg4)); cprintf("%d: @ring %d\n", round, reg1 & 3);//打印当前的 round、权限级(ring)和各段寄存器的值。 -c0100172: 0f b7 45 f6 movzwl -0xa(%ebp),%eax -c0100176: 83 e0 03 and $0x3,%eax -c0100179: 89 c2 mov %eax,%edx -c010017b: a1 00 b0 12 c0 mov 0xc012b000,%eax -c0100180: 89 54 24 08 mov %edx,0x8(%esp) -c0100184: 89 44 24 04 mov %eax,0x4(%esp) -c0100188: c7 04 24 c1 a2 10 c0 movl $0xc010a2c1,(%esp) -c010018f: e8 43 01 00 00 call c01002d7 +c0100168: 0f b7 45 f6 movzwl -0xa(%ebp),%eax +c010016c: 83 e0 03 and $0x3,%eax +c010016f: 89 c2 mov %eax,%edx +c0100171: a1 00 b0 12 c0 mov 0xc012b000,%eax +c0100176: 89 54 24 08 mov %edx,0x8(%esp) +c010017a: 89 44 24 04 mov %eax,0x4(%esp) +c010017e: c7 04 24 a1 a0 10 c0 movl $0xc010a0a1,(%esp) +c0100185: e8 ee 01 00 00 call c0100378 cprintf("%d: cs = %x\n", round, reg1); -c0100194: 0f b7 45 f6 movzwl -0xa(%ebp),%eax -c0100198: 89 c2 mov %eax,%edx -c010019a: a1 00 b0 12 c0 mov 0xc012b000,%eax -c010019f: 89 54 24 08 mov %edx,0x8(%esp) -c01001a3: 89 44 24 04 mov %eax,0x4(%esp) -c01001a7: c7 04 24 cf a2 10 c0 movl $0xc010a2cf,(%esp) -c01001ae: e8 24 01 00 00 call c01002d7 +c010018a: 0f b7 45 f6 movzwl -0xa(%ebp),%eax +c010018e: 89 c2 mov %eax,%edx +c0100190: a1 00 b0 12 c0 mov 0xc012b000,%eax +c0100195: 89 54 24 08 mov %edx,0x8(%esp) +c0100199: 89 44 24 04 mov %eax,0x4(%esp) +c010019d: c7 04 24 af a0 10 c0 movl $0xc010a0af,(%esp) +c01001a4: e8 cf 01 00 00 call c0100378 cprintf("%d: ds = %x\n", round, reg2); -c01001b3: 0f b7 45 f4 movzwl -0xc(%ebp),%eax -c01001b7: 89 c2 mov %eax,%edx -c01001b9: a1 00 b0 12 c0 mov 0xc012b000,%eax -c01001be: 89 54 24 08 mov %edx,0x8(%esp) -c01001c2: 89 44 24 04 mov %eax,0x4(%esp) -c01001c6: c7 04 24 dd a2 10 c0 movl $0xc010a2dd,(%esp) -c01001cd: e8 05 01 00 00 call c01002d7 +c01001a9: 0f b7 45 f4 movzwl -0xc(%ebp),%eax +c01001ad: 89 c2 mov %eax,%edx +c01001af: a1 00 b0 12 c0 mov 0xc012b000,%eax +c01001b4: 89 54 24 08 mov %edx,0x8(%esp) +c01001b8: 89 44 24 04 mov %eax,0x4(%esp) +c01001bc: c7 04 24 bd a0 10 c0 movl $0xc010a0bd,(%esp) +c01001c3: e8 b0 01 00 00 call c0100378 cprintf("%d: es = %x\n", round, reg3); -c01001d2: 0f b7 45 f2 movzwl -0xe(%ebp),%eax -c01001d6: 89 c2 mov %eax,%edx -c01001d8: a1 00 b0 12 c0 mov 0xc012b000,%eax -c01001dd: 89 54 24 08 mov %edx,0x8(%esp) -c01001e1: 89 44 24 04 mov %eax,0x4(%esp) -c01001e5: c7 04 24 eb a2 10 c0 movl $0xc010a2eb,(%esp) -c01001ec: e8 e6 00 00 00 call c01002d7 +c01001c8: 0f b7 45 f2 movzwl -0xe(%ebp),%eax +c01001cc: 89 c2 mov %eax,%edx +c01001ce: a1 00 b0 12 c0 mov 0xc012b000,%eax +c01001d3: 89 54 24 08 mov %edx,0x8(%esp) +c01001d7: 89 44 24 04 mov %eax,0x4(%esp) +c01001db: c7 04 24 cb a0 10 c0 movl $0xc010a0cb,(%esp) +c01001e2: e8 91 01 00 00 call c0100378 cprintf("%d: ss = %x\n", round, reg4); -c01001f1: 0f b7 45 f0 movzwl -0x10(%ebp),%eax -c01001f5: 89 c2 mov %eax,%edx -c01001f7: a1 00 b0 12 c0 mov 0xc012b000,%eax -c01001fc: 89 54 24 08 mov %edx,0x8(%esp) -c0100200: 89 44 24 04 mov %eax,0x4(%esp) -c0100204: c7 04 24 f9 a2 10 c0 movl $0xc010a2f9,(%esp) -c010020b: e8 c7 00 00 00 call c01002d7 +c01001e7: 0f b7 45 f0 movzwl -0x10(%ebp),%eax +c01001eb: 89 c2 mov %eax,%edx +c01001ed: a1 00 b0 12 c0 mov 0xc012b000,%eax +c01001f2: 89 54 24 08 mov %edx,0x8(%esp) +c01001f6: 89 44 24 04 mov %eax,0x4(%esp) +c01001fa: c7 04 24 d9 a0 10 c0 movl $0xc010a0d9,(%esp) +c0100201: e8 72 01 00 00 call c0100378 round ++;//将 round 增加1,以便每次调用时记录状态。 -c0100210: a1 00 b0 12 c0 mov 0xc012b000,%eax -c0100215: 40 inc %eax -c0100216: a3 00 b0 12 c0 mov %eax,0xc012b000 +c0100206: a1 00 b0 12 c0 mov 0xc012b000,%eax +c010020b: 40 inc %eax +c010020c: a3 00 b0 12 c0 mov %eax,0xc012b000 } -c010021b: 90 nop -c010021c: c9 leave -c010021d: c3 ret +c0100211: 90 nop +c0100212: 89 ec mov %ebp,%esp +c0100214: 5d pop %ebp +c0100215: c3 ret -c010021e : +c0100216 : static void lab1_switch_to_user(void) { -c010021e: f3 0f 1e fb endbr32 -c0100222: 55 push %ebp -c0100223: 89 e5 mov %esp,%ebp +c0100216: 55 push %ebp +c0100217: 89 e5 mov %esp,%ebp // 从内核模式切换到用户模式 //LAB1 CHALLENGE 1 : TODO asm volatile ( -c0100225: 83 ec 08 sub $0x8,%esp -c0100228: cd 78 int $0x78 -c010022a: 89 ec mov %ebp,%esp +c0100219: 83 ec 08 sub $0x8,%esp +c010021c: cd 78 int $0x78 +c010021e: 89 ec mov %ebp,%esp "int %0 \n"//通过触发一个中断,将控制权转移到内核,切换到用户模式。 "movl %%ebp, %%esp"// 将基指针(EBP)值移动到堆栈指针(ESP),恢复堆栈指针。 : : "i"(T_SWITCH_TOU)//T_SWITCH_TOU是一个常量,表示切换到用户态的中断号。传入常量 T_SWITCH_TOU ); } -c010022c: 90 nop -c010022d: 5d pop %ebp -c010022e: c3 ret +c0100220: 90 nop +c0100221: 5d pop %ebp +c0100222: c3 ret -c010022f : +c0100223 : static void lab1_switch_to_kernel(void) { -c010022f: f3 0f 1e fb endbr32 -c0100233: 55 push %ebp -c0100234: 89 e5 mov %esp,%ebp +c0100223: 55 push %ebp +c0100224: 89 e5 mov %esp,%ebp // 从用户模式切换到内核模式 //LAB1 CHALLENGE 1 : TODO asm volatile ( -c0100236: cd 79 int $0x79 -c0100238: 89 ec mov %ebp,%esp +c0100226: cd 79 int $0x79 +c0100228: 89 ec mov %ebp,%esp "int %0 \n"// 同样触发中断,这里用的是 T_SWITCH_TOK,从用户态切换回内核态。 "movl %%ebp, %%esp \n"//恢复堆栈指针 : : "i"(T_SWITCH_TOK)//传入常量 T_SWITCH_TOU ); } -c010023a: 90 nop -c010023b: 5d pop %ebp -c010023c: c3 ret +c010022a: 90 nop +c010022b: 5d pop %ebp +c010022c: c3 ret -c010023d : +c010022d : //测试用户模式和内核模式切换。 //调用 lab1_print_cur_status 打印当前状态,进行模式切换,然后再次打印状态。 static void lab1_switch_test(void) { -c010023d: f3 0f 1e fb endbr32 -c0100241: 55 push %ebp -c0100242: 89 e5 mov %esp,%ebp -c0100244: 83 ec 18 sub $0x18,%esp +c010022d: 55 push %ebp +c010022e: 89 e5 mov %esp,%ebp +c0100230: 83 ec 18 sub $0x18,%esp lab1_print_cur_status(); -c0100247: e8 10 ff ff ff call c010015c +c0100233: e8 1e ff ff ff call c0100156 cprintf("+++ switch to user mode +++\n"); -c010024c: c7 04 24 08 a3 10 c0 movl $0xc010a308,(%esp) -c0100253: e8 7f 00 00 00 call c01002d7 +c0100238: c7 04 24 e8 a0 10 c0 movl $0xc010a0e8,(%esp) +c010023f: e8 34 01 00 00 call c0100378 lab1_switch_to_user(); -c0100258: e8 c1 ff ff ff call c010021e +c0100244: e8 cd ff ff ff call c0100216 lab1_print_cur_status(); -c010025d: e8 fa fe ff ff call c010015c +c0100249: e8 08 ff ff ff call c0100156 cprintf("+++ switch to kernel mode +++\n"); -c0100262: c7 04 24 28 a3 10 c0 movl $0xc010a328,(%esp) -c0100269: e8 69 00 00 00 call c01002d7 +c010024e: c7 04 24 08 a1 10 c0 movl $0xc010a108,(%esp) +c0100255: e8 1e 01 00 00 call c0100378 lab1_switch_to_kernel(); -c010026e: e8 bc ff ff ff call c010022f +c010025a: e8 c4 ff ff ff call c0100223 lab1_print_cur_status(); -c0100273: e8 e4 fe ff ff call c010015c +c010025f: e8 f2 fe ff ff call c0100156 +} +c0100264: 90 nop +c0100265: 89 ec mov %ebp,%esp +c0100267: 5d pop %ebp +c0100268: c3 ret + +c0100269 : + * The readline() function returns the text of the line read. If some errors + * are happened, NULL is returned. The return value is a global variable, + * thus it should be copied before it is used. + * */ +char * +readline(const char *prompt) { +c0100269: 55 push %ebp +c010026a: 89 e5 mov %esp,%ebp +c010026c: 83 ec 28 sub $0x28,%esp + if (prompt != NULL) { +c010026f: 83 7d 08 00 cmpl $0x0,0x8(%ebp) +c0100273: 74 13 je c0100288 + cprintf("%s", prompt); +c0100275: 8b 45 08 mov 0x8(%ebp),%eax +c0100278: 89 44 24 04 mov %eax,0x4(%esp) +c010027c: c7 04 24 27 a1 10 c0 movl $0xc010a127,(%esp) +c0100283: e8 f0 00 00 00 call c0100378 + } + int i = 0, c; +c0100288: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) + while (1) { + c = getchar(); +c010028f: e8 73 01 00 00 call c0100407 +c0100294: 89 45 f0 mov %eax,-0x10(%ebp) + if (c < 0) { +c0100297: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) +c010029b: 79 07 jns c01002a4 + return NULL; +c010029d: b8 00 00 00 00 mov $0x0,%eax +c01002a2: eb 78 jmp c010031c + } + else if (c >= ' ' && i < BUFSIZE - 1) { +c01002a4: 83 7d f0 1f cmpl $0x1f,-0x10(%ebp) +c01002a8: 7e 28 jle c01002d2 +c01002aa: 81 7d f4 fe 03 00 00 cmpl $0x3fe,-0xc(%ebp) +c01002b1: 7f 1f jg c01002d2 + cputchar(c); +c01002b3: 8b 45 f0 mov -0x10(%ebp),%eax +c01002b6: 89 04 24 mov %eax,(%esp) +c01002b9: e8 e2 00 00 00 call c01003a0 + buf[i ++] = c; +c01002be: 8b 45 f4 mov -0xc(%ebp),%eax +c01002c1: 8d 50 01 lea 0x1(%eax),%edx +c01002c4: 89 55 f4 mov %edx,-0xc(%ebp) +c01002c7: 8b 55 f0 mov -0x10(%ebp),%edx +c01002ca: 88 90 20 b0 12 c0 mov %dl,-0x3fed4fe0(%eax) +c01002d0: eb 45 jmp c0100317 + } + else if (c == '\b' && i > 0) { +c01002d2: 83 7d f0 08 cmpl $0x8,-0x10(%ebp) +c01002d6: 75 16 jne c01002ee +c01002d8: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c01002dc: 7e 10 jle c01002ee + cputchar(c); +c01002de: 8b 45 f0 mov -0x10(%ebp),%eax +c01002e1: 89 04 24 mov %eax,(%esp) +c01002e4: e8 b7 00 00 00 call c01003a0 + i --; +c01002e9: ff 4d f4 decl -0xc(%ebp) +c01002ec: eb 29 jmp c0100317 + } + else if (c == '\n' || c == '\r') { +c01002ee: 83 7d f0 0a cmpl $0xa,-0x10(%ebp) +c01002f2: 74 06 je c01002fa +c01002f4: 83 7d f0 0d cmpl $0xd,-0x10(%ebp) +c01002f8: 75 95 jne c010028f + cputchar(c); +c01002fa: 8b 45 f0 mov -0x10(%ebp),%eax +c01002fd: 89 04 24 mov %eax,(%esp) +c0100300: e8 9b 00 00 00 call c01003a0 + buf[i] = '\0'; +c0100305: 8b 45 f4 mov -0xc(%ebp),%eax +c0100308: 05 20 b0 12 c0 add $0xc012b020,%eax +c010030d: c6 00 00 movb $0x0,(%eax) + return buf; +c0100310: b8 20 b0 12 c0 mov $0xc012b020,%eax +c0100315: eb 05 jmp c010031c + c = getchar(); +c0100317: e9 73 ff ff ff jmp c010028f + } + } } -c0100278: 90 nop -c0100279: c9 leave -c010027a: c3 ret +c010031c: 89 ec mov %ebp,%esp +c010031e: 5d pop %ebp +c010031f: c3 ret -c010027b : +c0100320 : /* * * cputch - writes a single character @c to stdout, and it will * increace the value of counter pointed by @cnt. * */ static void cputch(int c, int *cnt) { -c010027b: f3 0f 1e fb endbr32 -c010027f: 55 push %ebp -c0100280: 89 e5 mov %esp,%ebp -c0100282: 83 ec 18 sub $0x18,%esp +c0100320: 55 push %ebp +c0100321: 89 e5 mov %esp,%ebp +c0100323: 83 ec 18 sub $0x18,%esp cons_putc(c); -c0100285: 8b 45 08 mov 0x8(%ebp),%eax -c0100288: 89 04 24 mov %eax,(%esp) -c010028b: e8 22 1c 00 00 call c0101eb2 +c0100326: 8b 45 08 mov 0x8(%ebp),%eax +c0100329: 89 04 24 mov %eax,(%esp) +c010032c: e8 b5 12 00 00 call c01015e6 (*cnt) ++; -c0100290: 8b 45 0c mov 0xc(%ebp),%eax -c0100293: 8b 00 mov (%eax),%eax -c0100295: 8d 50 01 lea 0x1(%eax),%edx -c0100298: 8b 45 0c mov 0xc(%ebp),%eax -c010029b: 89 10 mov %edx,(%eax) -} -c010029d: 90 nop -c010029e: c9 leave -c010029f: c3 ret - -c01002a0 : +c0100331: 8b 45 0c mov 0xc(%ebp),%eax +c0100334: 8b 00 mov (%eax),%eax +c0100336: 8d 50 01 lea 0x1(%eax),%edx +c0100339: 8b 45 0c mov 0xc(%ebp),%eax +c010033c: 89 10 mov %edx,(%eax) +} +c010033e: 90 nop +c010033f: 89 ec mov %ebp,%esp +c0100341: 5d pop %ebp +c0100342: c3 ret + +c0100343 : * * Call this function if you are already dealing with a va_list. * Or you probably want cprintf() instead. * */ int vcprintf(const char *fmt, va_list ap) { -c01002a0: f3 0f 1e fb endbr32 -c01002a4: 55 push %ebp -c01002a5: 89 e5 mov %esp,%ebp -c01002a7: 83 ec 28 sub $0x28,%esp +c0100343: 55 push %ebp +c0100344: 89 e5 mov %esp,%ebp +c0100346: 83 ec 28 sub $0x28,%esp int cnt = 0; -c01002aa: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) +c0100349: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) vprintfmt((void*)cputch, &cnt, fmt, ap); -c01002b1: 8b 45 0c mov 0xc(%ebp),%eax -c01002b4: 89 44 24 0c mov %eax,0xc(%esp) -c01002b8: 8b 45 08 mov 0x8(%ebp),%eax -c01002bb: 89 44 24 08 mov %eax,0x8(%esp) -c01002bf: 8d 45 f4 lea -0xc(%ebp),%eax -c01002c2: 89 44 24 04 mov %eax,0x4(%esp) -c01002c6: c7 04 24 7b 02 10 c0 movl $0xc010027b,(%esp) -c01002cd: e8 ee 99 00 00 call c0109cc0 +c0100350: 8b 45 0c mov 0xc(%ebp),%eax +c0100353: 89 44 24 0c mov %eax,0xc(%esp) +c0100357: 8b 45 08 mov 0x8(%ebp),%eax +c010035a: 89 44 24 08 mov %eax,0x8(%esp) +c010035e: 8d 45 f4 lea -0xc(%ebp),%eax +c0100361: 89 44 24 04 mov %eax,0x4(%esp) +c0100365: c7 04 24 20 03 10 c0 movl $0xc0100320,(%esp) +c010036c: e8 c6 92 00 00 call c0109637 return cnt; -c01002d2: 8b 45 f4 mov -0xc(%ebp),%eax +c0100371: 8b 45 f4 mov -0xc(%ebp),%eax } -c01002d5: c9 leave -c01002d6: c3 ret +c0100374: 89 ec mov %ebp,%esp +c0100376: 5d pop %ebp +c0100377: c3 ret -c01002d7 : +c0100378 : * * The return value is the number of characters which would be * written to stdout. * */ int cprintf(const char *fmt, ...) { -c01002d7: f3 0f 1e fb endbr32 -c01002db: 55 push %ebp -c01002dc: 89 e5 mov %esp,%ebp -c01002de: 83 ec 28 sub $0x28,%esp +c0100378: 55 push %ebp +c0100379: 89 e5 mov %esp,%ebp +c010037b: 83 ec 28 sub $0x28,%esp va_list ap; int cnt; va_start(ap, fmt); -c01002e1: 8d 45 0c lea 0xc(%ebp),%eax -c01002e4: 89 45 f0 mov %eax,-0x10(%ebp) +c010037e: 8d 45 0c lea 0xc(%ebp),%eax +c0100381: 89 45 f0 mov %eax,-0x10(%ebp) cnt = vcprintf(fmt, ap); -c01002e7: 8b 45 f0 mov -0x10(%ebp),%eax -c01002ea: 89 44 24 04 mov %eax,0x4(%esp) -c01002ee: 8b 45 08 mov 0x8(%ebp),%eax -c01002f1: 89 04 24 mov %eax,(%esp) -c01002f4: e8 a7 ff ff ff call c01002a0 -c01002f9: 89 45 f4 mov %eax,-0xc(%ebp) +c0100384: 8b 45 f0 mov -0x10(%ebp),%eax +c0100387: 89 44 24 04 mov %eax,0x4(%esp) +c010038b: 8b 45 08 mov 0x8(%ebp),%eax +c010038e: 89 04 24 mov %eax,(%esp) +c0100391: e8 ad ff ff ff call c0100343 +c0100396: 89 45 f4 mov %eax,-0xc(%ebp) va_end(ap); return cnt; -c01002fc: 8b 45 f4 mov -0xc(%ebp),%eax +c0100399: 8b 45 f4 mov -0xc(%ebp),%eax } -c01002ff: c9 leave -c0100300: c3 ret +c010039c: 89 ec mov %ebp,%esp +c010039e: 5d pop %ebp +c010039f: c3 ret -c0100301 : +c01003a0 : /* cputchar - writes a single character to stdout */ void cputchar(int c) { -c0100301: f3 0f 1e fb endbr32 -c0100305: 55 push %ebp -c0100306: 89 e5 mov %esp,%ebp -c0100308: 83 ec 18 sub $0x18,%esp +c01003a0: 55 push %ebp +c01003a1: 89 e5 mov %esp,%ebp +c01003a3: 83 ec 18 sub $0x18,%esp cons_putc(c); -c010030b: 8b 45 08 mov 0x8(%ebp),%eax -c010030e: 89 04 24 mov %eax,(%esp) -c0100311: e8 9c 1b 00 00 call c0101eb2 +c01003a6: 8b 45 08 mov 0x8(%ebp),%eax +c01003a9: 89 04 24 mov %eax,(%esp) +c01003ac: e8 35 12 00 00 call c01015e6 } -c0100316: 90 nop -c0100317: c9 leave -c0100318: c3 ret +c01003b1: 90 nop +c01003b2: 89 ec mov %ebp,%esp +c01003b4: 5d pop %ebp +c01003b5: c3 ret -c0100319 : +c01003b6 : /* * * cputs- writes the string pointed by @str to stdout and * appends a newline character. * */ int cputs(const char *str) { -c0100319: f3 0f 1e fb endbr32 -c010031d: 55 push %ebp -c010031e: 89 e5 mov %esp,%ebp -c0100320: 83 ec 28 sub $0x28,%esp +c01003b6: 55 push %ebp +c01003b7: 89 e5 mov %esp,%ebp +c01003b9: 83 ec 28 sub $0x28,%esp int cnt = 0; -c0100323: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%ebp) +c01003bc: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%ebp) char c; while ((c = *str ++) != '\0') { -c010032a: eb 13 jmp c010033f +c01003c3: eb 13 jmp c01003d8 cputch(c, &cnt); -c010032c: 0f be 45 f7 movsbl -0x9(%ebp),%eax -c0100330: 8d 55 f0 lea -0x10(%ebp),%edx -c0100333: 89 54 24 04 mov %edx,0x4(%esp) -c0100337: 89 04 24 mov %eax,(%esp) -c010033a: e8 3c ff ff ff call c010027b +c01003c5: 0f be 45 f7 movsbl -0x9(%ebp),%eax +c01003c9: 8d 55 f0 lea -0x10(%ebp),%edx +c01003cc: 89 54 24 04 mov %edx,0x4(%esp) +c01003d0: 89 04 24 mov %eax,(%esp) +c01003d3: e8 48 ff ff ff call c0100320 while ((c = *str ++) != '\0') { -c010033f: 8b 45 08 mov 0x8(%ebp),%eax -c0100342: 8d 50 01 lea 0x1(%eax),%edx -c0100345: 89 55 08 mov %edx,0x8(%ebp) -c0100348: 0f b6 00 movzbl (%eax),%eax -c010034b: 88 45 f7 mov %al,-0x9(%ebp) -c010034e: 80 7d f7 00 cmpb $0x0,-0x9(%ebp) -c0100352: 75 d8 jne c010032c +c01003d8: 8b 45 08 mov 0x8(%ebp),%eax +c01003db: 8d 50 01 lea 0x1(%eax),%edx +c01003de: 89 55 08 mov %edx,0x8(%ebp) +c01003e1: 0f b6 00 movzbl (%eax),%eax +c01003e4: 88 45 f7 mov %al,-0x9(%ebp) +c01003e7: 80 7d f7 00 cmpb $0x0,-0x9(%ebp) +c01003eb: 75 d8 jne c01003c5 } cputch('\n', &cnt); -c0100354: 8d 45 f0 lea -0x10(%ebp),%eax -c0100357: 89 44 24 04 mov %eax,0x4(%esp) -c010035b: c7 04 24 0a 00 00 00 movl $0xa,(%esp) -c0100362: e8 14 ff ff ff call c010027b +c01003ed: 8d 45 f0 lea -0x10(%ebp),%eax +c01003f0: 89 44 24 04 mov %eax,0x4(%esp) +c01003f4: c7 04 24 0a 00 00 00 movl $0xa,(%esp) +c01003fb: e8 20 ff ff ff call c0100320 return cnt; -c0100367: 8b 45 f0 mov -0x10(%ebp),%eax +c0100400: 8b 45 f0 mov -0x10(%ebp),%eax } -c010036a: c9 leave -c010036b: c3 ret +c0100403: 89 ec mov %ebp,%esp +c0100405: 5d pop %ebp +c0100406: c3 ret -c010036c : +c0100407 : /* getchar - reads a single non-zero character from stdin */ int getchar(void) { -c010036c: f3 0f 1e fb endbr32 -c0100370: 55 push %ebp -c0100371: 89 e5 mov %esp,%ebp -c0100373: 83 ec 18 sub $0x18,%esp +c0100407: 55 push %ebp +c0100408: 89 e5 mov %esp,%ebp +c010040a: 83 ec 18 sub $0x18,%esp int c; while ((c = cons_getc()) == 0) -c0100376: 90 nop -c0100377: e8 77 1b 00 00 call c0101ef3 -c010037c: 89 45 f4 mov %eax,-0xc(%ebp) -c010037f: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0100383: 74 f2 je c0100377 +c010040d: 90 nop +c010040e: e8 12 12 00 00 call c0101625 +c0100413: 89 45 f4 mov %eax,-0xc(%ebp) +c0100416: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c010041a: 74 f2 je c010040e /* do nothing */; return c; -c0100385: 8b 45 f4 mov -0xc(%ebp),%eax -} -c0100388: c9 leave -c0100389: c3 ret - -c010038a : - * The readline() function returns the text of the line read. If some errors - * are happened, NULL is returned. The return value is a global variable, - * thus it should be copied before it is used. - * */ -char * -readline(const char *prompt) { -c010038a: f3 0f 1e fb endbr32 -c010038e: 55 push %ebp -c010038f: 89 e5 mov %esp,%ebp -c0100391: 83 ec 28 sub $0x28,%esp - if (prompt != NULL) { -c0100394: 83 7d 08 00 cmpl $0x0,0x8(%ebp) -c0100398: 74 13 je c01003ad - cprintf("%s", prompt); -c010039a: 8b 45 08 mov 0x8(%ebp),%eax -c010039d: 89 44 24 04 mov %eax,0x4(%esp) -c01003a1: c7 04 24 47 a3 10 c0 movl $0xc010a347,(%esp) -c01003a8: e8 2a ff ff ff call c01002d7 - } - int i = 0, c; -c01003ad: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) - while (1) { - c = getchar(); -c01003b4: e8 b3 ff ff ff call c010036c -c01003b9: 89 45 f0 mov %eax,-0x10(%ebp) - if (c < 0) { -c01003bc: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c01003c0: 79 07 jns c01003c9 - return NULL; -c01003c2: b8 00 00 00 00 mov $0x0,%eax -c01003c7: eb 78 jmp c0100441 - } - else if (c >= ' ' && i < BUFSIZE - 1) { -c01003c9: 83 7d f0 1f cmpl $0x1f,-0x10(%ebp) -c01003cd: 7e 28 jle c01003f7 -c01003cf: 81 7d f4 fe 03 00 00 cmpl $0x3fe,-0xc(%ebp) -c01003d6: 7f 1f jg c01003f7 - cputchar(c); -c01003d8: 8b 45 f0 mov -0x10(%ebp),%eax -c01003db: 89 04 24 mov %eax,(%esp) -c01003de: e8 1e ff ff ff call c0100301 - buf[i ++] = c; -c01003e3: 8b 45 f4 mov -0xc(%ebp),%eax -c01003e6: 8d 50 01 lea 0x1(%eax),%edx -c01003e9: 89 55 f4 mov %edx,-0xc(%ebp) -c01003ec: 8b 55 f0 mov -0x10(%ebp),%edx -c01003ef: 88 90 20 b0 12 c0 mov %dl,-0x3fed4fe0(%eax) -c01003f5: eb 45 jmp c010043c - } - else if (c == '\b' && i > 0) { -c01003f7: 83 7d f0 08 cmpl $0x8,-0x10(%ebp) -c01003fb: 75 16 jne c0100413 -c01003fd: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0100401: 7e 10 jle c0100413 - cputchar(c); -c0100403: 8b 45 f0 mov -0x10(%ebp),%eax -c0100406: 89 04 24 mov %eax,(%esp) -c0100409: e8 f3 fe ff ff call c0100301 - i --; -c010040e: ff 4d f4 decl -0xc(%ebp) -c0100411: eb 29 jmp c010043c - } - else if (c == '\n' || c == '\r') { -c0100413: 83 7d f0 0a cmpl $0xa,-0x10(%ebp) -c0100417: 74 06 je c010041f -c0100419: 83 7d f0 0d cmpl $0xd,-0x10(%ebp) -c010041d: 75 95 jne c01003b4 - cputchar(c); -c010041f: 8b 45 f0 mov -0x10(%ebp),%eax -c0100422: 89 04 24 mov %eax,(%esp) -c0100425: e8 d7 fe ff ff call c0100301 - buf[i] = '\0'; -c010042a: 8b 45 f4 mov -0xc(%ebp),%eax -c010042d: 05 20 b0 12 c0 add $0xc012b020,%eax -c0100432: c6 00 00 movb $0x0,(%eax) - return buf; -c0100435: b8 20 b0 12 c0 mov $0xc012b020,%eax -c010043a: eb 05 jmp c0100441 - c = getchar(); -c010043c: e9 73 ff ff ff jmp c01003b4 - } - } -} -c0100441: c9 leave -c0100442: c3 ret - -c0100443 <__panic>: -/* * - * __panic - __panic is called on unresolvable fatal errors. it prints - * "panic: 'message'", and then enters the kernel monitor. - * */ -void -__panic(const char *file, int line, const char *fmt, ...) { -c0100443: f3 0f 1e fb endbr32 -c0100447: 55 push %ebp -c0100448: 89 e5 mov %esp,%ebp -c010044a: 83 ec 28 sub $0x28,%esp - if (is_panic) { -c010044d: a1 20 b4 12 c0 mov 0xc012b420,%eax -c0100452: 85 c0 test %eax,%eax -c0100454: 75 5b jne c01004b1 <__panic+0x6e> - goto panic_dead; - } - is_panic = 1; -c0100456: c7 05 20 b4 12 c0 01 movl $0x1,0xc012b420 -c010045d: 00 00 00 - - // print the 'message' - va_list ap; - va_start(ap, fmt); -c0100460: 8d 45 14 lea 0x14(%ebp),%eax -c0100463: 89 45 f4 mov %eax,-0xc(%ebp) - cprintf("kernel panic at %s:%d:\n ", file, line); -c0100466: 8b 45 0c mov 0xc(%ebp),%eax -c0100469: 89 44 24 08 mov %eax,0x8(%esp) -c010046d: 8b 45 08 mov 0x8(%ebp),%eax -c0100470: 89 44 24 04 mov %eax,0x4(%esp) -c0100474: c7 04 24 4a a3 10 c0 movl $0xc010a34a,(%esp) -c010047b: e8 57 fe ff ff call c01002d7 - vcprintf(fmt, ap); -c0100480: 8b 45 f4 mov -0xc(%ebp),%eax -c0100483: 89 44 24 04 mov %eax,0x4(%esp) -c0100487: 8b 45 10 mov 0x10(%ebp),%eax -c010048a: 89 04 24 mov %eax,(%esp) -c010048d: e8 0e fe ff ff call c01002a0 - cprintf("\n"); -c0100492: c7 04 24 66 a3 10 c0 movl $0xc010a366,(%esp) -c0100499: e8 39 fe ff ff call c01002d7 - - cprintf("stack trackback:\n"); -c010049e: c7 04 24 68 a3 10 c0 movl $0xc010a368,(%esp) -c01004a5: e8 2d fe ff ff call c01002d7 - print_stackframe(); -c01004aa: e8 3d 06 00 00 call c0100aec -c01004af: eb 01 jmp c01004b2 <__panic+0x6f> - goto panic_dead; -c01004b1: 90 nop - - va_end(ap); - -panic_dead: - intr_disable(); -c01004b2: e8 9d 1c 00 00 call c0102154 - while (1) { - kmonitor(NULL); -c01004b7: c7 04 24 00 00 00 00 movl $0x0,(%esp) -c01004be: e8 a7 07 00 00 call c0100c6a -c01004c3: eb f2 jmp c01004b7 <__panic+0x74> - -c01004c5 <__warn>: - } -} - -/* __warn - like panic, but don't */ -void -__warn(const char *file, int line, const char *fmt, ...) { -c01004c5: f3 0f 1e fb endbr32 -c01004c9: 55 push %ebp -c01004ca: 89 e5 mov %esp,%ebp -c01004cc: 83 ec 28 sub $0x28,%esp - va_list ap; - va_start(ap, fmt); -c01004cf: 8d 45 14 lea 0x14(%ebp),%eax -c01004d2: 89 45 f4 mov %eax,-0xc(%ebp) - cprintf("kernel warning at %s:%d:\n ", file, line); -c01004d5: 8b 45 0c mov 0xc(%ebp),%eax -c01004d8: 89 44 24 08 mov %eax,0x8(%esp) -c01004dc: 8b 45 08 mov 0x8(%ebp),%eax -c01004df: 89 44 24 04 mov %eax,0x4(%esp) -c01004e3: c7 04 24 7a a3 10 c0 movl $0xc010a37a,(%esp) -c01004ea: e8 e8 fd ff ff call c01002d7 - vcprintf(fmt, ap); -c01004ef: 8b 45 f4 mov -0xc(%ebp),%eax -c01004f2: 89 44 24 04 mov %eax,0x4(%esp) -c01004f6: 8b 45 10 mov 0x10(%ebp),%eax -c01004f9: 89 04 24 mov %eax,(%esp) -c01004fc: e8 9f fd ff ff call c01002a0 - cprintf("\n"); -c0100501: c7 04 24 66 a3 10 c0 movl $0xc010a366,(%esp) -c0100508: e8 ca fd ff ff call c01002d7 - va_end(ap); +c010041c: 8b 45 f4 mov -0xc(%ebp),%eax } -c010050d: 90 nop -c010050e: c9 leave -c010050f: c3 ret +c010041f: 89 ec mov %ebp,%esp +c0100421: 5d pop %ebp +c0100422: c3 ret -c0100510 : - -bool -is_kernel_panic(void) { -c0100510: f3 0f 1e fb endbr32 -c0100514: 55 push %ebp -c0100515: 89 e5 mov %esp,%ebp - return is_panic; -c0100517: a1 20 b4 12 c0 mov 0xc012b420,%eax -} -c010051c: 5d pop %ebp -c010051d: c3 ret - -c010051e : +c0100423 : * stab_binsearch(stabs, &left, &right, N_SO, 0xf0100184); * will exit setting left = 118, right = 554. * */ static void stab_binsearch(const struct stab *stabs, int *region_left, int *region_right, int type, uintptr_t addr) { -c010051e: f3 0f 1e fb endbr32 -c0100522: 55 push %ebp -c0100523: 89 e5 mov %esp,%ebp -c0100525: 83 ec 20 sub $0x20,%esp +c0100423: 55 push %ebp +c0100424: 89 e5 mov %esp,%ebp +c0100426: 83 ec 20 sub $0x20,%esp int l = *region_left, r = *region_right, any_matches = 0; -c0100528: 8b 45 0c mov 0xc(%ebp),%eax -c010052b: 8b 00 mov (%eax),%eax -c010052d: 89 45 fc mov %eax,-0x4(%ebp) -c0100530: 8b 45 10 mov 0x10(%ebp),%eax -c0100533: 8b 00 mov (%eax),%eax -c0100535: 89 45 f8 mov %eax,-0x8(%ebp) -c0100538: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) +c0100429: 8b 45 0c mov 0xc(%ebp),%eax +c010042c: 8b 00 mov (%eax),%eax +c010042e: 89 45 fc mov %eax,-0x4(%ebp) +c0100431: 8b 45 10 mov 0x10(%ebp),%eax +c0100434: 8b 00 mov (%eax),%eax +c0100436: 89 45 f8 mov %eax,-0x8(%ebp) +c0100439: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) while (l <= r) { -c010053f: e9 ca 00 00 00 jmp c010060e +c0100440: e9 ca 00 00 00 jmp c010050f int true_m = (l + r) / 2, m = true_m; -c0100544: 8b 55 fc mov -0x4(%ebp),%edx -c0100547: 8b 45 f8 mov -0x8(%ebp),%eax -c010054a: 01 d0 add %edx,%eax -c010054c: 89 c2 mov %eax,%edx -c010054e: c1 ea 1f shr $0x1f,%edx -c0100551: 01 d0 add %edx,%eax -c0100553: d1 f8 sar %eax -c0100555: 89 45 ec mov %eax,-0x14(%ebp) -c0100558: 8b 45 ec mov -0x14(%ebp),%eax -c010055b: 89 45 f0 mov %eax,-0x10(%ebp) +c0100445: 8b 55 fc mov -0x4(%ebp),%edx +c0100448: 8b 45 f8 mov -0x8(%ebp),%eax +c010044b: 01 d0 add %edx,%eax +c010044d: 89 c2 mov %eax,%edx +c010044f: c1 ea 1f shr $0x1f,%edx +c0100452: 01 d0 add %edx,%eax +c0100454: d1 f8 sar %eax +c0100456: 89 45 ec mov %eax,-0x14(%ebp) +c0100459: 8b 45 ec mov -0x14(%ebp),%eax +c010045c: 89 45 f0 mov %eax,-0x10(%ebp) // search for earliest stab with right type while (m >= l && stabs[m].n_type != type) { -c010055e: eb 03 jmp c0100563 +c010045f: eb 03 jmp c0100464 m --; -c0100560: ff 4d f0 decl -0x10(%ebp) +c0100461: ff 4d f0 decl -0x10(%ebp) while (m >= l && stabs[m].n_type != type) { -c0100563: 8b 45 f0 mov -0x10(%ebp),%eax -c0100566: 3b 45 fc cmp -0x4(%ebp),%eax -c0100569: 7c 1f jl c010058a -c010056b: 8b 55 f0 mov -0x10(%ebp),%edx -c010056e: 89 d0 mov %edx,%eax -c0100570: 01 c0 add %eax,%eax -c0100572: 01 d0 add %edx,%eax -c0100574: c1 e0 02 shl $0x2,%eax -c0100577: 89 c2 mov %eax,%edx -c0100579: 8b 45 08 mov 0x8(%ebp),%eax -c010057c: 01 d0 add %edx,%eax -c010057e: 0f b6 40 04 movzbl 0x4(%eax),%eax -c0100582: 0f b6 c0 movzbl %al,%eax -c0100585: 39 45 14 cmp %eax,0x14(%ebp) -c0100588: 75 d6 jne c0100560 +c0100464: 8b 45 f0 mov -0x10(%ebp),%eax +c0100467: 3b 45 fc cmp -0x4(%ebp),%eax +c010046a: 7c 1f jl c010048b +c010046c: 8b 55 f0 mov -0x10(%ebp),%edx +c010046f: 89 d0 mov %edx,%eax +c0100471: 01 c0 add %eax,%eax +c0100473: 01 d0 add %edx,%eax +c0100475: c1 e0 02 shl $0x2,%eax +c0100478: 89 c2 mov %eax,%edx +c010047a: 8b 45 08 mov 0x8(%ebp),%eax +c010047d: 01 d0 add %edx,%eax +c010047f: 0f b6 40 04 movzbl 0x4(%eax),%eax +c0100483: 0f b6 c0 movzbl %al,%eax +c0100486: 39 45 14 cmp %eax,0x14(%ebp) +c0100489: 75 d6 jne c0100461 } if (m < l) { // no match in [l, m] -c010058a: 8b 45 f0 mov -0x10(%ebp),%eax -c010058d: 3b 45 fc cmp -0x4(%ebp),%eax -c0100590: 7d 09 jge c010059b +c010048b: 8b 45 f0 mov -0x10(%ebp),%eax +c010048e: 3b 45 fc cmp -0x4(%ebp),%eax +c0100491: 7d 09 jge c010049c l = true_m + 1; -c0100592: 8b 45 ec mov -0x14(%ebp),%eax -c0100595: 40 inc %eax -c0100596: 89 45 fc mov %eax,-0x4(%ebp) +c0100493: 8b 45 ec mov -0x14(%ebp),%eax +c0100496: 40 inc %eax +c0100497: 89 45 fc mov %eax,-0x4(%ebp) continue; -c0100599: eb 73 jmp c010060e +c010049a: eb 73 jmp c010050f } // actual binary search any_matches = 1; -c010059b: c7 45 f4 01 00 00 00 movl $0x1,-0xc(%ebp) +c010049c: c7 45 f4 01 00 00 00 movl $0x1,-0xc(%ebp) if (stabs[m].n_value < addr) { -c01005a2: 8b 55 f0 mov -0x10(%ebp),%edx -c01005a5: 89 d0 mov %edx,%eax -c01005a7: 01 c0 add %eax,%eax -c01005a9: 01 d0 add %edx,%eax -c01005ab: c1 e0 02 shl $0x2,%eax -c01005ae: 89 c2 mov %eax,%edx -c01005b0: 8b 45 08 mov 0x8(%ebp),%eax -c01005b3: 01 d0 add %edx,%eax -c01005b5: 8b 40 08 mov 0x8(%eax),%eax -c01005b8: 39 45 18 cmp %eax,0x18(%ebp) -c01005bb: 76 11 jbe c01005ce +c01004a3: 8b 55 f0 mov -0x10(%ebp),%edx +c01004a6: 89 d0 mov %edx,%eax +c01004a8: 01 c0 add %eax,%eax +c01004aa: 01 d0 add %edx,%eax +c01004ac: c1 e0 02 shl $0x2,%eax +c01004af: 89 c2 mov %eax,%edx +c01004b1: 8b 45 08 mov 0x8(%ebp),%eax +c01004b4: 01 d0 add %edx,%eax +c01004b6: 8b 40 08 mov 0x8(%eax),%eax +c01004b9: 39 45 18 cmp %eax,0x18(%ebp) +c01004bc: 76 11 jbe c01004cf *region_left = m; -c01005bd: 8b 45 0c mov 0xc(%ebp),%eax -c01005c0: 8b 55 f0 mov -0x10(%ebp),%edx -c01005c3: 89 10 mov %edx,(%eax) +c01004be: 8b 45 0c mov 0xc(%ebp),%eax +c01004c1: 8b 55 f0 mov -0x10(%ebp),%edx +c01004c4: 89 10 mov %edx,(%eax) l = true_m + 1; -c01005c5: 8b 45 ec mov -0x14(%ebp),%eax -c01005c8: 40 inc %eax -c01005c9: 89 45 fc mov %eax,-0x4(%ebp) -c01005cc: eb 40 jmp c010060e +c01004c6: 8b 45 ec mov -0x14(%ebp),%eax +c01004c9: 40 inc %eax +c01004ca: 89 45 fc mov %eax,-0x4(%ebp) +c01004cd: eb 40 jmp c010050f } else if (stabs[m].n_value > addr) { -c01005ce: 8b 55 f0 mov -0x10(%ebp),%edx -c01005d1: 89 d0 mov %edx,%eax -c01005d3: 01 c0 add %eax,%eax -c01005d5: 01 d0 add %edx,%eax -c01005d7: c1 e0 02 shl $0x2,%eax -c01005da: 89 c2 mov %eax,%edx -c01005dc: 8b 45 08 mov 0x8(%ebp),%eax -c01005df: 01 d0 add %edx,%eax -c01005e1: 8b 40 08 mov 0x8(%eax),%eax -c01005e4: 39 45 18 cmp %eax,0x18(%ebp) -c01005e7: 73 14 jae c01005fd +c01004cf: 8b 55 f0 mov -0x10(%ebp),%edx +c01004d2: 89 d0 mov %edx,%eax +c01004d4: 01 c0 add %eax,%eax +c01004d6: 01 d0 add %edx,%eax +c01004d8: c1 e0 02 shl $0x2,%eax +c01004db: 89 c2 mov %eax,%edx +c01004dd: 8b 45 08 mov 0x8(%ebp),%eax +c01004e0: 01 d0 add %edx,%eax +c01004e2: 8b 40 08 mov 0x8(%eax),%eax +c01004e5: 39 45 18 cmp %eax,0x18(%ebp) +c01004e8: 73 14 jae c01004fe *region_right = m - 1; -c01005e9: 8b 45 f0 mov -0x10(%ebp),%eax -c01005ec: 8d 50 ff lea -0x1(%eax),%edx -c01005ef: 8b 45 10 mov 0x10(%ebp),%eax -c01005f2: 89 10 mov %edx,(%eax) +c01004ea: 8b 45 f0 mov -0x10(%ebp),%eax +c01004ed: 8d 50 ff lea -0x1(%eax),%edx +c01004f0: 8b 45 10 mov 0x10(%ebp),%eax +c01004f3: 89 10 mov %edx,(%eax) r = m - 1; -c01005f4: 8b 45 f0 mov -0x10(%ebp),%eax -c01005f7: 48 dec %eax -c01005f8: 89 45 f8 mov %eax,-0x8(%ebp) -c01005fb: eb 11 jmp c010060e +c01004f5: 8b 45 f0 mov -0x10(%ebp),%eax +c01004f8: 48 dec %eax +c01004f9: 89 45 f8 mov %eax,-0x8(%ebp) +c01004fc: eb 11 jmp c010050f } else { // exact match for 'addr', but continue loop to find // *region_right *region_left = m; -c01005fd: 8b 45 0c mov 0xc(%ebp),%eax -c0100600: 8b 55 f0 mov -0x10(%ebp),%edx -c0100603: 89 10 mov %edx,(%eax) +c01004fe: 8b 45 0c mov 0xc(%ebp),%eax +c0100501: 8b 55 f0 mov -0x10(%ebp),%edx +c0100504: 89 10 mov %edx,(%eax) l = m; -c0100605: 8b 45 f0 mov -0x10(%ebp),%eax -c0100608: 89 45 fc mov %eax,-0x4(%ebp) +c0100506: 8b 45 f0 mov -0x10(%ebp),%eax +c0100509: 89 45 fc mov %eax,-0x4(%ebp) addr ++; -c010060b: ff 45 18 incl 0x18(%ebp) +c010050c: ff 45 18 incl 0x18(%ebp) while (l <= r) { -c010060e: 8b 45 fc mov -0x4(%ebp),%eax -c0100611: 3b 45 f8 cmp -0x8(%ebp),%eax -c0100614: 0f 8e 2a ff ff ff jle c0100544 +c010050f: 8b 45 fc mov -0x4(%ebp),%eax +c0100512: 3b 45 f8 cmp -0x8(%ebp),%eax +c0100515: 0f 8e 2a ff ff ff jle c0100445 } } if (!any_matches) { -c010061a: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c010061e: 75 0f jne c010062f +c010051b: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c010051f: 75 0f jne c0100530 *region_right = *region_left - 1; -c0100620: 8b 45 0c mov 0xc(%ebp),%eax -c0100623: 8b 00 mov (%eax),%eax -c0100625: 8d 50 ff lea -0x1(%eax),%edx -c0100628: 8b 45 10 mov 0x10(%ebp),%eax -c010062b: 89 10 mov %edx,(%eax) +c0100521: 8b 45 0c mov 0xc(%ebp),%eax +c0100524: 8b 00 mov (%eax),%eax +c0100526: 8d 50 ff lea -0x1(%eax),%edx +c0100529: 8b 45 10 mov 0x10(%ebp),%eax +c010052c: 89 10 mov %edx,(%eax) l = *region_right; for (; l > *region_left && stabs[l].n_type != type; l --) /* do nothing */; *region_left = l; } } -c010062d: eb 3e jmp c010066d +c010052e: eb 3e jmp c010056e l = *region_right; -c010062f: 8b 45 10 mov 0x10(%ebp),%eax -c0100632: 8b 00 mov (%eax),%eax -c0100634: 89 45 fc mov %eax,-0x4(%ebp) +c0100530: 8b 45 10 mov 0x10(%ebp),%eax +c0100533: 8b 00 mov (%eax),%eax +c0100535: 89 45 fc mov %eax,-0x4(%ebp) for (; l > *region_left && stabs[l].n_type != type; l --) -c0100637: eb 03 jmp c010063c -c0100639: ff 4d fc decl -0x4(%ebp) -c010063c: 8b 45 0c mov 0xc(%ebp),%eax -c010063f: 8b 00 mov (%eax),%eax -c0100641: 39 45 fc cmp %eax,-0x4(%ebp) -c0100644: 7e 1f jle c0100665 -c0100646: 8b 55 fc mov -0x4(%ebp),%edx -c0100649: 89 d0 mov %edx,%eax -c010064b: 01 c0 add %eax,%eax -c010064d: 01 d0 add %edx,%eax -c010064f: c1 e0 02 shl $0x2,%eax -c0100652: 89 c2 mov %eax,%edx -c0100654: 8b 45 08 mov 0x8(%ebp),%eax -c0100657: 01 d0 add %edx,%eax -c0100659: 0f b6 40 04 movzbl 0x4(%eax),%eax -c010065d: 0f b6 c0 movzbl %al,%eax -c0100660: 39 45 14 cmp %eax,0x14(%ebp) -c0100663: 75 d4 jne c0100639 +c0100538: eb 03 jmp c010053d +c010053a: ff 4d fc decl -0x4(%ebp) +c010053d: 8b 45 0c mov 0xc(%ebp),%eax +c0100540: 8b 00 mov (%eax),%eax +c0100542: 39 45 fc cmp %eax,-0x4(%ebp) +c0100545: 7e 1f jle c0100566 +c0100547: 8b 55 fc mov -0x4(%ebp),%edx +c010054a: 89 d0 mov %edx,%eax +c010054c: 01 c0 add %eax,%eax +c010054e: 01 d0 add %edx,%eax +c0100550: c1 e0 02 shl $0x2,%eax +c0100553: 89 c2 mov %eax,%edx +c0100555: 8b 45 08 mov 0x8(%ebp),%eax +c0100558: 01 d0 add %edx,%eax +c010055a: 0f b6 40 04 movzbl 0x4(%eax),%eax +c010055e: 0f b6 c0 movzbl %al,%eax +c0100561: 39 45 14 cmp %eax,0x14(%ebp) +c0100564: 75 d4 jne c010053a *region_left = l; -c0100665: 8b 45 0c mov 0xc(%ebp),%eax -c0100668: 8b 55 fc mov -0x4(%ebp),%edx -c010066b: 89 10 mov %edx,(%eax) +c0100566: 8b 45 0c mov 0xc(%ebp),%eax +c0100569: 8b 55 fc mov -0x4(%ebp),%edx +c010056c: 89 10 mov %edx,(%eax) } -c010066d: 90 nop -c010066e: c9 leave -c010066f: c3 ret +c010056e: 90 nop +c010056f: 89 ec mov %ebp,%esp +c0100571: 5d pop %ebp +c0100572: c3 ret -c0100670 : +c0100573 : * the specified instruction address, @addr. Returns 0 if information * was found, and negative if not. But even if it returns negative it * has stored some information into '*info'. * */ int debuginfo_eip(uintptr_t addr, struct eipdebuginfo *info) { -c0100670: f3 0f 1e fb endbr32 -c0100674: 55 push %ebp -c0100675: 89 e5 mov %esp,%ebp -c0100677: 83 ec 58 sub $0x58,%esp +c0100573: 55 push %ebp +c0100574: 89 e5 mov %esp,%ebp +c0100576: 83 ec 58 sub $0x58,%esp const struct stab *stabs, *stab_end; const char *stabstr, *stabstr_end; info->eip_file = ""; -c010067a: 8b 45 0c mov 0xc(%ebp),%eax -c010067d: c7 00 98 a3 10 c0 movl $0xc010a398,(%eax) +c0100579: 8b 45 0c mov 0xc(%ebp),%eax +c010057c: c7 00 2c a1 10 c0 movl $0xc010a12c,(%eax) info->eip_line = 0; -c0100683: 8b 45 0c mov 0xc(%ebp),%eax -c0100686: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax) +c0100582: 8b 45 0c mov 0xc(%ebp),%eax +c0100585: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax) info->eip_fn_name = ""; -c010068d: 8b 45 0c mov 0xc(%ebp),%eax -c0100690: c7 40 08 98 a3 10 c0 movl $0xc010a398,0x8(%eax) +c010058c: 8b 45 0c mov 0xc(%ebp),%eax +c010058f: c7 40 08 2c a1 10 c0 movl $0xc010a12c,0x8(%eax) info->eip_fn_namelen = 9; -c0100697: 8b 45 0c mov 0xc(%ebp),%eax -c010069a: c7 40 0c 09 00 00 00 movl $0x9,0xc(%eax) +c0100596: 8b 45 0c mov 0xc(%ebp),%eax +c0100599: c7 40 0c 09 00 00 00 movl $0x9,0xc(%eax) info->eip_fn_addr = addr; -c01006a1: 8b 45 0c mov 0xc(%ebp),%eax -c01006a4: 8b 55 08 mov 0x8(%ebp),%edx -c01006a7: 89 50 10 mov %edx,0x10(%eax) +c01005a0: 8b 45 0c mov 0xc(%ebp),%eax +c01005a3: 8b 55 08 mov 0x8(%ebp),%edx +c01005a6: 89 50 10 mov %edx,0x10(%eax) info->eip_fn_narg = 0; -c01006aa: 8b 45 0c mov 0xc(%ebp),%eax -c01006ad: c7 40 14 00 00 00 00 movl $0x0,0x14(%eax) +c01005a9: 8b 45 0c mov 0xc(%ebp),%eax +c01005ac: c7 40 14 00 00 00 00 movl $0x0,0x14(%eax) stabs = __STAB_BEGIN__; -c01006b4: c7 45 f4 dc c5 10 c0 movl $0xc010c5dc,-0xc(%ebp) +c01005b3: c7 45 f4 b8 c3 10 c0 movl $0xc010c3b8,-0xc(%ebp) stab_end = __STAB_END__; -c01006bb: c7 45 f0 4c 0f 12 c0 movl $0xc0120f4c,-0x10(%ebp) +c01005ba: c7 45 f0 24 f0 11 c0 movl $0xc011f024,-0x10(%ebp) stabstr = __STABSTR_BEGIN__; -c01006c2: c7 45 ec 4d 0f 12 c0 movl $0xc0120f4d,-0x14(%ebp) +c01005c1: c7 45 ec 25 f0 11 c0 movl $0xc011f025,-0x14(%ebp) stabstr_end = __STABSTR_END__; -c01006c9: c7 45 e8 48 58 12 c0 movl $0xc0125848,-0x18(%ebp) +c01005c8: c7 45 e8 b4 54 12 c0 movl $0xc01254b4,-0x18(%ebp) // String table validity checks if (stabstr_end <= stabstr || stabstr_end[-1] != 0) { -c01006d0: 8b 45 e8 mov -0x18(%ebp),%eax -c01006d3: 3b 45 ec cmp -0x14(%ebp),%eax -c01006d6: 76 0b jbe c01006e3 -c01006d8: 8b 45 e8 mov -0x18(%ebp),%eax -c01006db: 48 dec %eax -c01006dc: 0f b6 00 movzbl (%eax),%eax -c01006df: 84 c0 test %al,%al -c01006e1: 74 0a je c01006ed +c01005cf: 8b 45 e8 mov -0x18(%ebp),%eax +c01005d2: 3b 45 ec cmp -0x14(%ebp),%eax +c01005d5: 76 0b jbe c01005e2 +c01005d7: 8b 45 e8 mov -0x18(%ebp),%eax +c01005da: 48 dec %eax +c01005db: 0f b6 00 movzbl (%eax),%eax +c01005de: 84 c0 test %al,%al +c01005e0: 74 0a je c01005ec return -1; -c01006e3: b8 ff ff ff ff mov $0xffffffff,%eax -c01006e8: e9 ab 02 00 00 jmp c0100998 +c01005e2: b8 ff ff ff ff mov $0xffffffff,%eax +c01005e7: e9 ab 02 00 00 jmp c0100897 // 'eip'. First, we find the basic source file containing 'eip'. // Then, we look in that source file for the function. Then we look // for the line number. // Search the entire set of stabs for the source file (type N_SO). int lfile = 0, rfile = (stab_end - stabs) - 1; -c01006ed: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) -c01006f4: 8b 45 f0 mov -0x10(%ebp),%eax -c01006f7: 2b 45 f4 sub -0xc(%ebp),%eax -c01006fa: c1 f8 02 sar $0x2,%eax -c01006fd: 69 c0 ab aa aa aa imul $0xaaaaaaab,%eax,%eax -c0100703: 48 dec %eax -c0100704: 89 45 e0 mov %eax,-0x20(%ebp) +c01005ec: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) +c01005f3: 8b 45 f0 mov -0x10(%ebp),%eax +c01005f6: 2b 45 f4 sub -0xc(%ebp),%eax +c01005f9: c1 f8 02 sar $0x2,%eax +c01005fc: 69 c0 ab aa aa aa imul $0xaaaaaaab,%eax,%eax +c0100602: 48 dec %eax +c0100603: 89 45 e0 mov %eax,-0x20(%ebp) stab_binsearch(stabs, &lfile, &rfile, N_SO, addr); -c0100707: 8b 45 08 mov 0x8(%ebp),%eax -c010070a: 89 44 24 10 mov %eax,0x10(%esp) -c010070e: c7 44 24 0c 64 00 00 movl $0x64,0xc(%esp) -c0100715: 00 -c0100716: 8d 45 e0 lea -0x20(%ebp),%eax -c0100719: 89 44 24 08 mov %eax,0x8(%esp) -c010071d: 8d 45 e4 lea -0x1c(%ebp),%eax -c0100720: 89 44 24 04 mov %eax,0x4(%esp) -c0100724: 8b 45 f4 mov -0xc(%ebp),%eax -c0100727: 89 04 24 mov %eax,(%esp) -c010072a: e8 ef fd ff ff call c010051e +c0100606: 8b 45 08 mov 0x8(%ebp),%eax +c0100609: 89 44 24 10 mov %eax,0x10(%esp) +c010060d: c7 44 24 0c 64 00 00 movl $0x64,0xc(%esp) +c0100614: 00 +c0100615: 8d 45 e0 lea -0x20(%ebp),%eax +c0100618: 89 44 24 08 mov %eax,0x8(%esp) +c010061c: 8d 45 e4 lea -0x1c(%ebp),%eax +c010061f: 89 44 24 04 mov %eax,0x4(%esp) +c0100623: 8b 45 f4 mov -0xc(%ebp),%eax +c0100626: 89 04 24 mov %eax,(%esp) +c0100629: e8 f5 fd ff ff call c0100423 if (lfile == 0) -c010072f: 8b 45 e4 mov -0x1c(%ebp),%eax -c0100732: 85 c0 test %eax,%eax -c0100734: 75 0a jne c0100740 +c010062e: 8b 45 e4 mov -0x1c(%ebp),%eax +c0100631: 85 c0 test %eax,%eax +c0100633: 75 0a jne c010063f return -1; -c0100736: b8 ff ff ff ff mov $0xffffffff,%eax -c010073b: e9 58 02 00 00 jmp c0100998 +c0100635: b8 ff ff ff ff mov $0xffffffff,%eax +c010063a: e9 58 02 00 00 jmp c0100897 // Search within that file's stabs for the function definition // (N_FUN). int lfun = lfile, rfun = rfile; -c0100740: 8b 45 e4 mov -0x1c(%ebp),%eax -c0100743: 89 45 dc mov %eax,-0x24(%ebp) -c0100746: 8b 45 e0 mov -0x20(%ebp),%eax -c0100749: 89 45 d8 mov %eax,-0x28(%ebp) +c010063f: 8b 45 e4 mov -0x1c(%ebp),%eax +c0100642: 89 45 dc mov %eax,-0x24(%ebp) +c0100645: 8b 45 e0 mov -0x20(%ebp),%eax +c0100648: 89 45 d8 mov %eax,-0x28(%ebp) int lline, rline; stab_binsearch(stabs, &lfun, &rfun, N_FUN, addr); -c010074c: 8b 45 08 mov 0x8(%ebp),%eax -c010074f: 89 44 24 10 mov %eax,0x10(%esp) -c0100753: c7 44 24 0c 24 00 00 movl $0x24,0xc(%esp) -c010075a: 00 -c010075b: 8d 45 d8 lea -0x28(%ebp),%eax -c010075e: 89 44 24 08 mov %eax,0x8(%esp) -c0100762: 8d 45 dc lea -0x24(%ebp),%eax -c0100765: 89 44 24 04 mov %eax,0x4(%esp) -c0100769: 8b 45 f4 mov -0xc(%ebp),%eax -c010076c: 89 04 24 mov %eax,(%esp) -c010076f: e8 aa fd ff ff call c010051e +c010064b: 8b 45 08 mov 0x8(%ebp),%eax +c010064e: 89 44 24 10 mov %eax,0x10(%esp) +c0100652: c7 44 24 0c 24 00 00 movl $0x24,0xc(%esp) +c0100659: 00 +c010065a: 8d 45 d8 lea -0x28(%ebp),%eax +c010065d: 89 44 24 08 mov %eax,0x8(%esp) +c0100661: 8d 45 dc lea -0x24(%ebp),%eax +c0100664: 89 44 24 04 mov %eax,0x4(%esp) +c0100668: 8b 45 f4 mov -0xc(%ebp),%eax +c010066b: 89 04 24 mov %eax,(%esp) +c010066e: e8 b0 fd ff ff call c0100423 if (lfun <= rfun) { -c0100774: 8b 55 dc mov -0x24(%ebp),%edx -c0100777: 8b 45 d8 mov -0x28(%ebp),%eax -c010077a: 39 c2 cmp %eax,%edx -c010077c: 7f 78 jg c01007f6 +c0100673: 8b 55 dc mov -0x24(%ebp),%edx +c0100676: 8b 45 d8 mov -0x28(%ebp),%eax +c0100679: 39 c2 cmp %eax,%edx +c010067b: 7f 78 jg c01006f5 // stabs[lfun] points to the function name // in the string table, but check bounds just in case. if (stabs[lfun].n_strx < stabstr_end - stabstr) { -c010077e: 8b 45 dc mov -0x24(%ebp),%eax -c0100781: 89 c2 mov %eax,%edx -c0100783: 89 d0 mov %edx,%eax -c0100785: 01 c0 add %eax,%eax -c0100787: 01 d0 add %edx,%eax -c0100789: c1 e0 02 shl $0x2,%eax -c010078c: 89 c2 mov %eax,%edx -c010078e: 8b 45 f4 mov -0xc(%ebp),%eax -c0100791: 01 d0 add %edx,%eax -c0100793: 8b 10 mov (%eax),%edx -c0100795: 8b 45 e8 mov -0x18(%ebp),%eax -c0100798: 2b 45 ec sub -0x14(%ebp),%eax -c010079b: 39 c2 cmp %eax,%edx -c010079d: 73 22 jae c01007c1 +c010067d: 8b 45 dc mov -0x24(%ebp),%eax +c0100680: 89 c2 mov %eax,%edx +c0100682: 89 d0 mov %edx,%eax +c0100684: 01 c0 add %eax,%eax +c0100686: 01 d0 add %edx,%eax +c0100688: c1 e0 02 shl $0x2,%eax +c010068b: 89 c2 mov %eax,%edx +c010068d: 8b 45 f4 mov -0xc(%ebp),%eax +c0100690: 01 d0 add %edx,%eax +c0100692: 8b 10 mov (%eax),%edx +c0100694: 8b 45 e8 mov -0x18(%ebp),%eax +c0100697: 2b 45 ec sub -0x14(%ebp),%eax +c010069a: 39 c2 cmp %eax,%edx +c010069c: 73 22 jae c01006c0 info->eip_fn_name = stabstr + stabs[lfun].n_strx; -c010079f: 8b 45 dc mov -0x24(%ebp),%eax -c01007a2: 89 c2 mov %eax,%edx -c01007a4: 89 d0 mov %edx,%eax -c01007a6: 01 c0 add %eax,%eax -c01007a8: 01 d0 add %edx,%eax -c01007aa: c1 e0 02 shl $0x2,%eax -c01007ad: 89 c2 mov %eax,%edx -c01007af: 8b 45 f4 mov -0xc(%ebp),%eax -c01007b2: 01 d0 add %edx,%eax -c01007b4: 8b 10 mov (%eax),%edx -c01007b6: 8b 45 ec mov -0x14(%ebp),%eax -c01007b9: 01 c2 add %eax,%edx -c01007bb: 8b 45 0c mov 0xc(%ebp),%eax -c01007be: 89 50 08 mov %edx,0x8(%eax) +c010069e: 8b 45 dc mov -0x24(%ebp),%eax +c01006a1: 89 c2 mov %eax,%edx +c01006a3: 89 d0 mov %edx,%eax +c01006a5: 01 c0 add %eax,%eax +c01006a7: 01 d0 add %edx,%eax +c01006a9: c1 e0 02 shl $0x2,%eax +c01006ac: 89 c2 mov %eax,%edx +c01006ae: 8b 45 f4 mov -0xc(%ebp),%eax +c01006b1: 01 d0 add %edx,%eax +c01006b3: 8b 10 mov (%eax),%edx +c01006b5: 8b 45 ec mov -0x14(%ebp),%eax +c01006b8: 01 c2 add %eax,%edx +c01006ba: 8b 45 0c mov 0xc(%ebp),%eax +c01006bd: 89 50 08 mov %edx,0x8(%eax) } info->eip_fn_addr = stabs[lfun].n_value; -c01007c1: 8b 45 dc mov -0x24(%ebp),%eax -c01007c4: 89 c2 mov %eax,%edx -c01007c6: 89 d0 mov %edx,%eax -c01007c8: 01 c0 add %eax,%eax -c01007ca: 01 d0 add %edx,%eax -c01007cc: c1 e0 02 shl $0x2,%eax -c01007cf: 89 c2 mov %eax,%edx -c01007d1: 8b 45 f4 mov -0xc(%ebp),%eax -c01007d4: 01 d0 add %edx,%eax -c01007d6: 8b 50 08 mov 0x8(%eax),%edx -c01007d9: 8b 45 0c mov 0xc(%ebp),%eax -c01007dc: 89 50 10 mov %edx,0x10(%eax) +c01006c0: 8b 45 dc mov -0x24(%ebp),%eax +c01006c3: 89 c2 mov %eax,%edx +c01006c5: 89 d0 mov %edx,%eax +c01006c7: 01 c0 add %eax,%eax +c01006c9: 01 d0 add %edx,%eax +c01006cb: c1 e0 02 shl $0x2,%eax +c01006ce: 89 c2 mov %eax,%edx +c01006d0: 8b 45 f4 mov -0xc(%ebp),%eax +c01006d3: 01 d0 add %edx,%eax +c01006d5: 8b 50 08 mov 0x8(%eax),%edx +c01006d8: 8b 45 0c mov 0xc(%ebp),%eax +c01006db: 89 50 10 mov %edx,0x10(%eax) addr -= info->eip_fn_addr; -c01007df: 8b 45 0c mov 0xc(%ebp),%eax -c01007e2: 8b 40 10 mov 0x10(%eax),%eax -c01007e5: 29 45 08 sub %eax,0x8(%ebp) +c01006de: 8b 45 0c mov 0xc(%ebp),%eax +c01006e1: 8b 40 10 mov 0x10(%eax),%eax +c01006e4: 29 45 08 sub %eax,0x8(%ebp) // Search within the function definition for the line number. lline = lfun; -c01007e8: 8b 45 dc mov -0x24(%ebp),%eax -c01007eb: 89 45 d4 mov %eax,-0x2c(%ebp) +c01006e7: 8b 45 dc mov -0x24(%ebp),%eax +c01006ea: 89 45 d4 mov %eax,-0x2c(%ebp) rline = rfun; -c01007ee: 8b 45 d8 mov -0x28(%ebp),%eax -c01007f1: 89 45 d0 mov %eax,-0x30(%ebp) -c01007f4: eb 15 jmp c010080b +c01006ed: 8b 45 d8 mov -0x28(%ebp),%eax +c01006f0: 89 45 d0 mov %eax,-0x30(%ebp) +c01006f3: eb 15 jmp c010070a } else { // Couldn't find function stab! Maybe we're in an assembly // file. Search the whole file for the line number. info->eip_fn_addr = addr; -c01007f6: 8b 45 0c mov 0xc(%ebp),%eax -c01007f9: 8b 55 08 mov 0x8(%ebp),%edx -c01007fc: 89 50 10 mov %edx,0x10(%eax) +c01006f5: 8b 45 0c mov 0xc(%ebp),%eax +c01006f8: 8b 55 08 mov 0x8(%ebp),%edx +c01006fb: 89 50 10 mov %edx,0x10(%eax) lline = lfile; -c01007ff: 8b 45 e4 mov -0x1c(%ebp),%eax -c0100802: 89 45 d4 mov %eax,-0x2c(%ebp) +c01006fe: 8b 45 e4 mov -0x1c(%ebp),%eax +c0100701: 89 45 d4 mov %eax,-0x2c(%ebp) rline = rfile; -c0100805: 8b 45 e0 mov -0x20(%ebp),%eax -c0100808: 89 45 d0 mov %eax,-0x30(%ebp) +c0100704: 8b 45 e0 mov -0x20(%ebp),%eax +c0100707: 89 45 d0 mov %eax,-0x30(%ebp) } info->eip_fn_namelen = strfind(info->eip_fn_name, ':') - info->eip_fn_name; -c010080b: 8b 45 0c mov 0xc(%ebp),%eax -c010080e: 8b 40 08 mov 0x8(%eax),%eax -c0100811: c7 44 24 04 3a 00 00 movl $0x3a,0x4(%esp) -c0100818: 00 -c0100819: 89 04 24 mov %eax,(%esp) -c010081c: e8 a7 8f 00 00 call c01097c8 -c0100821: 8b 55 0c mov 0xc(%ebp),%edx -c0100824: 8b 52 08 mov 0x8(%edx),%edx -c0100827: 29 d0 sub %edx,%eax -c0100829: 89 c2 mov %eax,%edx -c010082b: 8b 45 0c mov 0xc(%ebp),%eax -c010082e: 89 50 0c mov %edx,0xc(%eax) +c010070a: 8b 45 0c mov 0xc(%ebp),%eax +c010070d: 8b 40 08 mov 0x8(%eax),%eax +c0100710: c7 44 24 04 3a 00 00 movl $0x3a,0x4(%esp) +c0100717: 00 +c0100718: 89 04 24 mov %eax,(%esp) +c010071b: e8 3c 96 00 00 call c0109d5c +c0100720: 8b 55 0c mov 0xc(%ebp),%edx +c0100723: 8b 4a 08 mov 0x8(%edx),%ecx +c0100726: 29 c8 sub %ecx,%eax +c0100728: 89 c2 mov %eax,%edx +c010072a: 8b 45 0c mov 0xc(%ebp),%eax +c010072d: 89 50 0c mov %edx,0xc(%eax) // Search within [lline, rline] for the line number stab. // If found, set info->eip_line to the right line number. // If not found, return -1. stab_binsearch(stabs, &lline, &rline, N_SLINE, addr); -c0100831: 8b 45 08 mov 0x8(%ebp),%eax -c0100834: 89 44 24 10 mov %eax,0x10(%esp) -c0100838: c7 44 24 0c 44 00 00 movl $0x44,0xc(%esp) -c010083f: 00 -c0100840: 8d 45 d0 lea -0x30(%ebp),%eax -c0100843: 89 44 24 08 mov %eax,0x8(%esp) -c0100847: 8d 45 d4 lea -0x2c(%ebp),%eax -c010084a: 89 44 24 04 mov %eax,0x4(%esp) -c010084e: 8b 45 f4 mov -0xc(%ebp),%eax -c0100851: 89 04 24 mov %eax,(%esp) -c0100854: e8 c5 fc ff ff call c010051e +c0100730: 8b 45 08 mov 0x8(%ebp),%eax +c0100733: 89 44 24 10 mov %eax,0x10(%esp) +c0100737: c7 44 24 0c 44 00 00 movl $0x44,0xc(%esp) +c010073e: 00 +c010073f: 8d 45 d0 lea -0x30(%ebp),%eax +c0100742: 89 44 24 08 mov %eax,0x8(%esp) +c0100746: 8d 45 d4 lea -0x2c(%ebp),%eax +c0100749: 89 44 24 04 mov %eax,0x4(%esp) +c010074d: 8b 45 f4 mov -0xc(%ebp),%eax +c0100750: 89 04 24 mov %eax,(%esp) +c0100753: e8 cb fc ff ff call c0100423 if (lline <= rline) { -c0100859: 8b 55 d4 mov -0x2c(%ebp),%edx -c010085c: 8b 45 d0 mov -0x30(%ebp),%eax -c010085f: 39 c2 cmp %eax,%edx -c0100861: 7f 23 jg c0100886 +c0100758: 8b 55 d4 mov -0x2c(%ebp),%edx +c010075b: 8b 45 d0 mov -0x30(%ebp),%eax +c010075e: 39 c2 cmp %eax,%edx +c0100760: 7f 23 jg c0100785 info->eip_line = stabs[rline].n_desc; -c0100863: 8b 45 d0 mov -0x30(%ebp),%eax -c0100866: 89 c2 mov %eax,%edx -c0100868: 89 d0 mov %edx,%eax -c010086a: 01 c0 add %eax,%eax -c010086c: 01 d0 add %edx,%eax -c010086e: c1 e0 02 shl $0x2,%eax -c0100871: 89 c2 mov %eax,%edx -c0100873: 8b 45 f4 mov -0xc(%ebp),%eax -c0100876: 01 d0 add %edx,%eax -c0100878: 0f b7 40 06 movzwl 0x6(%eax),%eax -c010087c: 89 c2 mov %eax,%edx -c010087e: 8b 45 0c mov 0xc(%ebp),%eax -c0100881: 89 50 04 mov %edx,0x4(%eax) +c0100762: 8b 45 d0 mov -0x30(%ebp),%eax +c0100765: 89 c2 mov %eax,%edx +c0100767: 89 d0 mov %edx,%eax +c0100769: 01 c0 add %eax,%eax +c010076b: 01 d0 add %edx,%eax +c010076d: c1 e0 02 shl $0x2,%eax +c0100770: 89 c2 mov %eax,%edx +c0100772: 8b 45 f4 mov -0xc(%ebp),%eax +c0100775: 01 d0 add %edx,%eax +c0100777: 0f b7 40 06 movzwl 0x6(%eax),%eax +c010077b: 89 c2 mov %eax,%edx +c010077d: 8b 45 0c mov 0xc(%ebp),%eax +c0100780: 89 50 04 mov %edx,0x4(%eax) // Search backwards from the line number for the relevant filename stab. // We can't just use the "lfile" stab because inlined functions // can interpolate code from a different file! // Such included source files use the N_SOL stab type. while (lline >= lfile -c0100884: eb 11 jmp c0100897 +c0100783: eb 11 jmp c0100796 return -1; -c0100886: b8 ff ff ff ff mov $0xffffffff,%eax -c010088b: e9 08 01 00 00 jmp c0100998 +c0100785: b8 ff ff ff ff mov $0xffffffff,%eax +c010078a: e9 08 01 00 00 jmp c0100897 && stabs[lline].n_type != N_SOL && (stabs[lline].n_type != N_SO || !stabs[lline].n_value)) { lline --; -c0100890: 8b 45 d4 mov -0x2c(%ebp),%eax -c0100893: 48 dec %eax -c0100894: 89 45 d4 mov %eax,-0x2c(%ebp) +c010078f: 8b 45 d4 mov -0x2c(%ebp),%eax +c0100792: 48 dec %eax +c0100793: 89 45 d4 mov %eax,-0x2c(%ebp) while (lline >= lfile -c0100897: 8b 55 d4 mov -0x2c(%ebp),%edx -c010089a: 8b 45 e4 mov -0x1c(%ebp),%eax -c010089d: 39 c2 cmp %eax,%edx -c010089f: 7c 56 jl c01008f7 +c0100796: 8b 55 d4 mov -0x2c(%ebp),%edx +c0100799: 8b 45 e4 mov -0x1c(%ebp),%eax + && (stabs[lline].n_type != N_SO || !stabs[lline].n_value)) { +c010079c: 39 c2 cmp %eax,%edx +c010079e: 7c 56 jl c01007f6 && stabs[lline].n_type != N_SOL -c01008a1: 8b 45 d4 mov -0x2c(%ebp),%eax -c01008a4: 89 c2 mov %eax,%edx -c01008a6: 89 d0 mov %edx,%eax -c01008a8: 01 c0 add %eax,%eax -c01008aa: 01 d0 add %edx,%eax -c01008ac: c1 e0 02 shl $0x2,%eax -c01008af: 89 c2 mov %eax,%edx -c01008b1: 8b 45 f4 mov -0xc(%ebp),%eax -c01008b4: 01 d0 add %edx,%eax -c01008b6: 0f b6 40 04 movzbl 0x4(%eax),%eax -c01008ba: 3c 84 cmp $0x84,%al -c01008bc: 74 39 je c01008f7 +c01007a0: 8b 45 d4 mov -0x2c(%ebp),%eax +c01007a3: 89 c2 mov %eax,%edx +c01007a5: 89 d0 mov %edx,%eax +c01007a7: 01 c0 add %eax,%eax +c01007a9: 01 d0 add %edx,%eax +c01007ab: c1 e0 02 shl $0x2,%eax +c01007ae: 89 c2 mov %eax,%edx +c01007b0: 8b 45 f4 mov -0xc(%ebp),%eax +c01007b3: 01 d0 add %edx,%eax +c01007b5: 0f b6 40 04 movzbl 0x4(%eax),%eax +c01007b9: 3c 84 cmp $0x84,%al +c01007bb: 74 39 je c01007f6 && (stabs[lline].n_type != N_SO || !stabs[lline].n_value)) { -c01008be: 8b 45 d4 mov -0x2c(%ebp),%eax -c01008c1: 89 c2 mov %eax,%edx -c01008c3: 89 d0 mov %edx,%eax -c01008c5: 01 c0 add %eax,%eax -c01008c7: 01 d0 add %edx,%eax -c01008c9: c1 e0 02 shl $0x2,%eax -c01008cc: 89 c2 mov %eax,%edx -c01008ce: 8b 45 f4 mov -0xc(%ebp),%eax -c01008d1: 01 d0 add %edx,%eax -c01008d3: 0f b6 40 04 movzbl 0x4(%eax),%eax -c01008d7: 3c 64 cmp $0x64,%al -c01008d9: 75 b5 jne c0100890 -c01008db: 8b 45 d4 mov -0x2c(%ebp),%eax -c01008de: 89 c2 mov %eax,%edx -c01008e0: 89 d0 mov %edx,%eax -c01008e2: 01 c0 add %eax,%eax -c01008e4: 01 d0 add %edx,%eax -c01008e6: c1 e0 02 shl $0x2,%eax -c01008e9: 89 c2 mov %eax,%edx -c01008eb: 8b 45 f4 mov -0xc(%ebp),%eax -c01008ee: 01 d0 add %edx,%eax -c01008f0: 8b 40 08 mov 0x8(%eax),%eax -c01008f3: 85 c0 test %eax,%eax -c01008f5: 74 99 je c0100890 +c01007bd: 8b 45 d4 mov -0x2c(%ebp),%eax +c01007c0: 89 c2 mov %eax,%edx +c01007c2: 89 d0 mov %edx,%eax +c01007c4: 01 c0 add %eax,%eax +c01007c6: 01 d0 add %edx,%eax +c01007c8: c1 e0 02 shl $0x2,%eax +c01007cb: 89 c2 mov %eax,%edx +c01007cd: 8b 45 f4 mov -0xc(%ebp),%eax +c01007d0: 01 d0 add %edx,%eax +c01007d2: 0f b6 40 04 movzbl 0x4(%eax),%eax +c01007d6: 3c 64 cmp $0x64,%al +c01007d8: 75 b5 jne c010078f +c01007da: 8b 45 d4 mov -0x2c(%ebp),%eax +c01007dd: 89 c2 mov %eax,%edx +c01007df: 89 d0 mov %edx,%eax +c01007e1: 01 c0 add %eax,%eax +c01007e3: 01 d0 add %edx,%eax +c01007e5: c1 e0 02 shl $0x2,%eax +c01007e8: 89 c2 mov %eax,%edx +c01007ea: 8b 45 f4 mov -0xc(%ebp),%eax +c01007ed: 01 d0 add %edx,%eax +c01007ef: 8b 40 08 mov 0x8(%eax),%eax +c01007f2: 85 c0 test %eax,%eax +c01007f4: 74 99 je c010078f } if (lline >= lfile && stabs[lline].n_strx < stabstr_end - stabstr) { -c01008f7: 8b 55 d4 mov -0x2c(%ebp),%edx -c01008fa: 8b 45 e4 mov -0x1c(%ebp),%eax -c01008fd: 39 c2 cmp %eax,%edx -c01008ff: 7c 42 jl c0100943 -c0100901: 8b 45 d4 mov -0x2c(%ebp),%eax -c0100904: 89 c2 mov %eax,%edx -c0100906: 89 d0 mov %edx,%eax -c0100908: 01 c0 add %eax,%eax -c010090a: 01 d0 add %edx,%eax -c010090c: c1 e0 02 shl $0x2,%eax -c010090f: 89 c2 mov %eax,%edx -c0100911: 8b 45 f4 mov -0xc(%ebp),%eax -c0100914: 01 d0 add %edx,%eax -c0100916: 8b 10 mov (%eax),%edx -c0100918: 8b 45 e8 mov -0x18(%ebp),%eax -c010091b: 2b 45 ec sub -0x14(%ebp),%eax -c010091e: 39 c2 cmp %eax,%edx -c0100920: 73 21 jae c0100943 +c01007f6: 8b 55 d4 mov -0x2c(%ebp),%edx +c01007f9: 8b 45 e4 mov -0x1c(%ebp),%eax +c01007fc: 39 c2 cmp %eax,%edx +c01007fe: 7c 42 jl c0100842 +c0100800: 8b 45 d4 mov -0x2c(%ebp),%eax +c0100803: 89 c2 mov %eax,%edx +c0100805: 89 d0 mov %edx,%eax +c0100807: 01 c0 add %eax,%eax +c0100809: 01 d0 add %edx,%eax +c010080b: c1 e0 02 shl $0x2,%eax +c010080e: 89 c2 mov %eax,%edx +c0100810: 8b 45 f4 mov -0xc(%ebp),%eax +c0100813: 01 d0 add %edx,%eax +c0100815: 8b 10 mov (%eax),%edx +c0100817: 8b 45 e8 mov -0x18(%ebp),%eax +c010081a: 2b 45 ec sub -0x14(%ebp),%eax +c010081d: 39 c2 cmp %eax,%edx +c010081f: 73 21 jae c0100842 info->eip_file = stabstr + stabs[lline].n_strx; -c0100922: 8b 45 d4 mov -0x2c(%ebp),%eax -c0100925: 89 c2 mov %eax,%edx -c0100927: 89 d0 mov %edx,%eax -c0100929: 01 c0 add %eax,%eax -c010092b: 01 d0 add %edx,%eax -c010092d: c1 e0 02 shl $0x2,%eax -c0100930: 89 c2 mov %eax,%edx -c0100932: 8b 45 f4 mov -0xc(%ebp),%eax -c0100935: 01 d0 add %edx,%eax -c0100937: 8b 10 mov (%eax),%edx -c0100939: 8b 45 ec mov -0x14(%ebp),%eax -c010093c: 01 c2 add %eax,%edx -c010093e: 8b 45 0c mov 0xc(%ebp),%eax -c0100941: 89 10 mov %edx,(%eax) +c0100821: 8b 45 d4 mov -0x2c(%ebp),%eax +c0100824: 89 c2 mov %eax,%edx +c0100826: 89 d0 mov %edx,%eax +c0100828: 01 c0 add %eax,%eax +c010082a: 01 d0 add %edx,%eax +c010082c: c1 e0 02 shl $0x2,%eax +c010082f: 89 c2 mov %eax,%edx +c0100831: 8b 45 f4 mov -0xc(%ebp),%eax +c0100834: 01 d0 add %edx,%eax +c0100836: 8b 10 mov (%eax),%edx +c0100838: 8b 45 ec mov -0x14(%ebp),%eax +c010083b: 01 c2 add %eax,%edx +c010083d: 8b 45 0c mov 0xc(%ebp),%eax +c0100840: 89 10 mov %edx,(%eax) } // Set eip_fn_narg to the number of arguments taken by the function, // or 0 if there was no containing function. if (lfun < rfun) { -c0100943: 8b 55 dc mov -0x24(%ebp),%edx -c0100946: 8b 45 d8 mov -0x28(%ebp),%eax -c0100949: 39 c2 cmp %eax,%edx -c010094b: 7d 46 jge c0100993 +c0100842: 8b 55 dc mov -0x24(%ebp),%edx +c0100845: 8b 45 d8 mov -0x28(%ebp),%eax +c0100848: 39 c2 cmp %eax,%edx +c010084a: 7d 46 jge c0100892 for (lline = lfun + 1; -c010094d: 8b 45 dc mov -0x24(%ebp),%eax -c0100950: 40 inc %eax -c0100951: 89 45 d4 mov %eax,-0x2c(%ebp) -c0100954: eb 16 jmp c010096c +c010084c: 8b 45 dc mov -0x24(%ebp),%eax +c010084f: 40 inc %eax +c0100850: 89 45 d4 mov %eax,-0x2c(%ebp) +c0100853: eb 16 jmp c010086b lline < rfun && stabs[lline].n_type == N_PSYM; lline ++) { info->eip_fn_narg ++; -c0100956: 8b 45 0c mov 0xc(%ebp),%eax -c0100959: 8b 40 14 mov 0x14(%eax),%eax -c010095c: 8d 50 01 lea 0x1(%eax),%edx -c010095f: 8b 45 0c mov 0xc(%ebp),%eax -c0100962: 89 50 14 mov %edx,0x14(%eax) +c0100855: 8b 45 0c mov 0xc(%ebp),%eax +c0100858: 8b 40 14 mov 0x14(%eax),%eax +c010085b: 8d 50 01 lea 0x1(%eax),%edx +c010085e: 8b 45 0c mov 0xc(%ebp),%eax +c0100861: 89 50 14 mov %edx,0x14(%eax) lline ++) { -c0100965: 8b 45 d4 mov -0x2c(%ebp),%eax -c0100968: 40 inc %eax -c0100969: 89 45 d4 mov %eax,-0x2c(%ebp) - lline < rfun && stabs[lline].n_type == N_PSYM; -c010096c: 8b 55 d4 mov -0x2c(%ebp),%edx -c010096f: 8b 45 d8 mov -0x28(%ebp),%eax - for (lline = lfun + 1; -c0100972: 39 c2 cmp %eax,%edx -c0100974: 7d 1d jge c0100993 +c0100864: 8b 45 d4 mov -0x2c(%ebp),%eax +c0100867: 40 inc %eax +c0100868: 89 45 d4 mov %eax,-0x2c(%ebp) lline < rfun && stabs[lline].n_type == N_PSYM; -c0100976: 8b 45 d4 mov -0x2c(%ebp),%eax -c0100979: 89 c2 mov %eax,%edx -c010097b: 89 d0 mov %edx,%eax -c010097d: 01 c0 add %eax,%eax -c010097f: 01 d0 add %edx,%eax -c0100981: c1 e0 02 shl $0x2,%eax -c0100984: 89 c2 mov %eax,%edx -c0100986: 8b 45 f4 mov -0xc(%ebp),%eax -c0100989: 01 d0 add %edx,%eax -c010098b: 0f b6 40 04 movzbl 0x4(%eax),%eax -c010098f: 3c a0 cmp $0xa0,%al -c0100991: 74 c3 je c0100956 +c010086b: 8b 55 d4 mov -0x2c(%ebp),%edx +c010086e: 8b 45 d8 mov -0x28(%ebp),%eax +c0100871: 39 c2 cmp %eax,%edx +c0100873: 7d 1d jge c0100892 +c0100875: 8b 45 d4 mov -0x2c(%ebp),%eax +c0100878: 89 c2 mov %eax,%edx +c010087a: 89 d0 mov %edx,%eax +c010087c: 01 c0 add %eax,%eax +c010087e: 01 d0 add %edx,%eax +c0100880: c1 e0 02 shl $0x2,%eax +c0100883: 89 c2 mov %eax,%edx +c0100885: 8b 45 f4 mov -0xc(%ebp),%eax +c0100888: 01 d0 add %edx,%eax +c010088a: 0f b6 40 04 movzbl 0x4(%eax),%eax +c010088e: 3c a0 cmp $0xa0,%al +c0100890: 74 c3 je c0100855 } } return 0; -c0100993: b8 00 00 00 00 mov $0x0,%eax +c0100892: b8 00 00 00 00 mov $0x0,%eax } -c0100998: c9 leave -c0100999: c3 ret +c0100897: 89 ec mov %ebp,%esp +c0100899: 5d pop %ebp +c010089a: c3 ret -c010099a : +c010089b : * print_kerninfo - print the information about kernel, including the location * of kernel entry, the start addresses of data and text segements, the start * address of free memory and how many memory that kernel has used. * */ void print_kerninfo(void) { -c010099a: f3 0f 1e fb endbr32 -c010099e: 55 push %ebp -c010099f: 89 e5 mov %esp,%ebp -c01009a1: 83 ec 18 sub $0x18,%esp +c010089b: 55 push %ebp +c010089c: 89 e5 mov %esp,%ebp +c010089e: 83 ec 18 sub $0x18,%esp extern char etext[], edata[], end[], kern_init[]; cprintf("Special kernel symbols:\n"); -c01009a4: c7 04 24 a2 a3 10 c0 movl $0xc010a3a2,(%esp) -c01009ab: e8 27 f9 ff ff call c01002d7 +c01008a1: c7 04 24 36 a1 10 c0 movl $0xc010a136,(%esp) +c01008a8: e8 cb fa ff ff call c0100378 cprintf(" entry 0x%08x (phys)\n", kern_init); -c01009b0: c7 44 24 04 36 00 10 movl $0xc0100036,0x4(%esp) -c01009b7: c0 -c01009b8: c7 04 24 bb a3 10 c0 movl $0xc010a3bb,(%esp) -c01009bf: e8 13 f9 ff ff call c01002d7 +c01008ad: c7 44 24 04 36 00 10 movl $0xc0100036,0x4(%esp) +c01008b4: c0 +c01008b5: c7 04 24 4f a1 10 c0 movl $0xc010a14f,(%esp) +c01008bc: e8 b7 fa ff ff call c0100378 cprintf(" etext 0x%08x (phys)\n", etext); -c01009c4: c7 44 24 04 81 a2 10 movl $0xc010a281,0x4(%esp) -c01009cb: c0 -c01009cc: c7 04 24 d3 a3 10 c0 movl $0xc010a3d3,(%esp) -c01009d3: e8 ff f8 ff ff call c01002d7 +c01008c1: c7 44 24 04 70 a0 10 movl $0xc010a070,0x4(%esp) +c01008c8: c0 +c01008c9: c7 04 24 67 a1 10 c0 movl $0xc010a167,(%esp) +c01008d0: e8 a3 fa ff ff call c0100378 cprintf(" edata 0x%08x (phys)\n", edata); -c01009d8: c7 44 24 04 00 b0 12 movl $0xc012b000,0x4(%esp) -c01009df: c0 -c01009e0: c7 04 24 eb a3 10 c0 movl $0xc010a3eb,(%esp) -c01009e7: e8 eb f8 ff ff call c01002d7 +c01008d5: c7 44 24 04 00 b0 12 movl $0xc012b000,0x4(%esp) +c01008dc: c0 +c01008dd: c7 04 24 7f a1 10 c0 movl $0xc010a17f,(%esp) +c01008e4: e8 8f fa ff ff call c0100378 cprintf(" end 0x%08x (phys)\n", end); -c01009ec: c7 44 24 04 b8 e1 12 movl $0xc012e1b8,0x4(%esp) -c01009f3: c0 -c01009f4: c7 04 24 03 a4 10 c0 movl $0xc010a403,(%esp) -c01009fb: e8 d7 f8 ff ff call c01002d7 +c01008e9: c7 44 24 04 b4 e1 12 movl $0xc012e1b4,0x4(%esp) +c01008f0: c0 +c01008f1: c7 04 24 97 a1 10 c0 movl $0xc010a197,(%esp) +c01008f8: e8 7b fa ff ff call c0100378 cprintf("Kernel executable memory footprint: %dKB\n", (end - kern_init + 1023)/1024); -c0100a00: b8 b8 e1 12 c0 mov $0xc012e1b8,%eax -c0100a05: 2d 36 00 10 c0 sub $0xc0100036,%eax -c0100a0a: 05 ff 03 00 00 add $0x3ff,%eax -c0100a0f: 8d 90 ff 03 00 00 lea 0x3ff(%eax),%edx -c0100a15: 85 c0 test %eax,%eax -c0100a17: 0f 48 c2 cmovs %edx,%eax -c0100a1a: c1 f8 0a sar $0xa,%eax -c0100a1d: 89 44 24 04 mov %eax,0x4(%esp) -c0100a21: c7 04 24 1c a4 10 c0 movl $0xc010a41c,(%esp) -c0100a28: e8 aa f8 ff ff call c01002d7 -} -c0100a2d: 90 nop -c0100a2e: c9 leave -c0100a2f: c3 ret - -c0100a30 : +c01008fd: b8 b4 e1 12 c0 mov $0xc012e1b4,%eax +c0100902: 2d 36 00 10 c0 sub $0xc0100036,%eax +c0100907: 05 ff 03 00 00 add $0x3ff,%eax +c010090c: 8d 90 ff 03 00 00 lea 0x3ff(%eax),%edx +c0100912: 85 c0 test %eax,%eax +c0100914: 0f 48 c2 cmovs %edx,%eax +c0100917: c1 f8 0a sar $0xa,%eax +c010091a: 89 44 24 04 mov %eax,0x4(%esp) +c010091e: c7 04 24 b0 a1 10 c0 movl $0xc010a1b0,(%esp) +c0100925: e8 4e fa ff ff call c0100378 +} +c010092a: 90 nop +c010092b: 89 ec mov %ebp,%esp +c010092d: 5d pop %ebp +c010092e: c3 ret + +c010092f : /* * * print_debuginfo - read and print the stat information for the address @eip, * and info.eip_fn_addr should be the first address of the related function. * */ void print_debuginfo(uintptr_t eip) { -c0100a30: f3 0f 1e fb endbr32 -c0100a34: 55 push %ebp -c0100a35: 89 e5 mov %esp,%ebp -c0100a37: 81 ec 48 01 00 00 sub $0x148,%esp +c010092f: 55 push %ebp +c0100930: 89 e5 mov %esp,%ebp +c0100932: 81 ec 48 01 00 00 sub $0x148,%esp struct eipdebuginfo info; if (debuginfo_eip(eip, &info) != 0) { -c0100a3d: 8d 45 dc lea -0x24(%ebp),%eax -c0100a40: 89 44 24 04 mov %eax,0x4(%esp) -c0100a44: 8b 45 08 mov 0x8(%ebp),%eax -c0100a47: 89 04 24 mov %eax,(%esp) -c0100a4a: e8 21 fc ff ff call c0100670 -c0100a4f: 85 c0 test %eax,%eax -c0100a51: 74 15 je c0100a68 +c0100938: 8d 45 dc lea -0x24(%ebp),%eax +c010093b: 89 44 24 04 mov %eax,0x4(%esp) +c010093f: 8b 45 08 mov 0x8(%ebp),%eax +c0100942: 89 04 24 mov %eax,(%esp) +c0100945: e8 29 fc ff ff call c0100573 +c010094a: 85 c0 test %eax,%eax +c010094c: 74 15 je c0100963 cprintf(" : -- 0x%08x --\n", eip); -c0100a53: 8b 45 08 mov 0x8(%ebp),%eax -c0100a56: 89 44 24 04 mov %eax,0x4(%esp) -c0100a5a: c7 04 24 46 a4 10 c0 movl $0xc010a446,(%esp) -c0100a61: e8 71 f8 ff ff call c01002d7 +c010094e: 8b 45 08 mov 0x8(%ebp),%eax +c0100951: 89 44 24 04 mov %eax,0x4(%esp) +c0100955: c7 04 24 da a1 10 c0 movl $0xc010a1da,(%esp) +c010095c: e8 17 fa ff ff call c0100378 } fnname[j] = '\0'; cprintf(" %s:%d: %s+%d\n", info.eip_file, info.eip_line, fnname, eip - info.eip_fn_addr); } } -c0100a66: eb 6c jmp c0100ad4 +c0100961: eb 6c jmp c01009cf for (j = 0; j < info.eip_fn_namelen; j ++) { -c0100a68: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) -c0100a6f: eb 1b jmp c0100a8c +c0100963: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) +c010096a: eb 1b jmp c0100987 fnname[j] = info.eip_fn_name[j]; -c0100a71: 8b 55 e4 mov -0x1c(%ebp),%edx -c0100a74: 8b 45 f4 mov -0xc(%ebp),%eax -c0100a77: 01 d0 add %edx,%eax -c0100a79: 0f b6 10 movzbl (%eax),%edx -c0100a7c: 8d 8d dc fe ff ff lea -0x124(%ebp),%ecx -c0100a82: 8b 45 f4 mov -0xc(%ebp),%eax -c0100a85: 01 c8 add %ecx,%eax -c0100a87: 88 10 mov %dl,(%eax) +c010096c: 8b 55 e4 mov -0x1c(%ebp),%edx +c010096f: 8b 45 f4 mov -0xc(%ebp),%eax +c0100972: 01 d0 add %edx,%eax +c0100974: 0f b6 10 movzbl (%eax),%edx +c0100977: 8d 8d dc fe ff ff lea -0x124(%ebp),%ecx +c010097d: 8b 45 f4 mov -0xc(%ebp),%eax +c0100980: 01 c8 add %ecx,%eax +c0100982: 88 10 mov %dl,(%eax) for (j = 0; j < info.eip_fn_namelen; j ++) { -c0100a89: ff 45 f4 incl -0xc(%ebp) -c0100a8c: 8b 45 e8 mov -0x18(%ebp),%eax -c0100a8f: 39 45 f4 cmp %eax,-0xc(%ebp) -c0100a92: 7c dd jl c0100a71 +c0100984: ff 45 f4 incl -0xc(%ebp) +c0100987: 8b 45 e8 mov -0x18(%ebp),%eax +c010098a: 39 45 f4 cmp %eax,-0xc(%ebp) +c010098d: 7c dd jl c010096c fnname[j] = '\0'; -c0100a94: 8d 95 dc fe ff ff lea -0x124(%ebp),%edx -c0100a9a: 8b 45 f4 mov -0xc(%ebp),%eax -c0100a9d: 01 d0 add %edx,%eax -c0100a9f: c6 00 00 movb $0x0,(%eax) +c010098f: 8d 95 dc fe ff ff lea -0x124(%ebp),%edx +c0100995: 8b 45 f4 mov -0xc(%ebp),%eax +c0100998: 01 d0 add %edx,%eax +c010099a: c6 00 00 movb $0x0,(%eax) fnname, eip - info.eip_fn_addr); -c0100aa2: 8b 45 ec mov -0x14(%ebp),%eax +c010099d: 8b 55 ec mov -0x14(%ebp),%edx cprintf(" %s:%d: %s+%d\n", info.eip_file, info.eip_line, -c0100aa5: 8b 55 08 mov 0x8(%ebp),%edx -c0100aa8: 89 d1 mov %edx,%ecx -c0100aaa: 29 c1 sub %eax,%ecx -c0100aac: 8b 55 e0 mov -0x20(%ebp),%edx -c0100aaf: 8b 45 dc mov -0x24(%ebp),%eax -c0100ab2: 89 4c 24 10 mov %ecx,0x10(%esp) -c0100ab6: 8d 8d dc fe ff ff lea -0x124(%ebp),%ecx -c0100abc: 89 4c 24 0c mov %ecx,0xc(%esp) -c0100ac0: 89 54 24 08 mov %edx,0x8(%esp) -c0100ac4: 89 44 24 04 mov %eax,0x4(%esp) -c0100ac8: c7 04 24 62 a4 10 c0 movl $0xc010a462,(%esp) -c0100acf: e8 03 f8 ff ff call c01002d7 -} -c0100ad4: 90 nop -c0100ad5: c9 leave -c0100ad6: c3 ret - -c0100ad7 : +c01009a0: 8b 45 08 mov 0x8(%ebp),%eax +c01009a3: 29 d0 sub %edx,%eax +c01009a5: 89 c1 mov %eax,%ecx +c01009a7: 8b 55 e0 mov -0x20(%ebp),%edx +c01009aa: 8b 45 dc mov -0x24(%ebp),%eax +c01009ad: 89 4c 24 10 mov %ecx,0x10(%esp) +c01009b1: 8d 8d dc fe ff ff lea -0x124(%ebp),%ecx +c01009b7: 89 4c 24 0c mov %ecx,0xc(%esp) +c01009bb: 89 54 24 08 mov %edx,0x8(%esp) +c01009bf: 89 44 24 04 mov %eax,0x4(%esp) +c01009c3: c7 04 24 f6 a1 10 c0 movl $0xc010a1f6,(%esp) +c01009ca: e8 a9 f9 ff ff call c0100378 +} +c01009cf: 90 nop +c01009d0: 89 ec mov %ebp,%esp +c01009d2: 5d pop %ebp +c01009d3: c3 ret + +c01009d4 : static __noinline uint32_t read_eip(void) { -c0100ad7: f3 0f 1e fb endbr32 -c0100adb: 55 push %ebp -c0100adc: 89 e5 mov %esp,%ebp -c0100ade: 83 ec 10 sub $0x10,%esp +c01009d4: 55 push %ebp +c01009d5: 89 e5 mov %esp,%ebp +c01009d7: 83 ec 10 sub $0x10,%esp uint32_t eip; asm volatile("movl 4(%%ebp), %0" : "=r" (eip)); -c0100ae1: 8b 45 04 mov 0x4(%ebp),%eax -c0100ae4: 89 45 fc mov %eax,-0x4(%ebp) +c01009da: 8b 45 04 mov 0x4(%ebp),%eax +c01009dd: 89 45 fc mov %eax,-0x4(%ebp) return eip; -c0100ae7: 8b 45 fc mov -0x4(%ebp),%eax +c01009e0: 8b 45 fc mov -0x4(%ebp),%eax } -c0100aea: c9 leave -c0100aeb: c3 ret +c01009e3: 89 ec mov %ebp,%esp +c01009e5: 5d pop %ebp +c01009e6: c3 ret -c0100aec : +c01009e7 : * * Note that, the length of ebp-chain is limited. In boot/bootasm.S, before jumping * to the kernel entry, the value of ebp has been set to zero, that's the boundary. * */ void print_stackframe(void) { -c0100aec: f3 0f 1e fb endbr32 -c0100af0: 55 push %ebp -c0100af1: 89 e5 mov %esp,%ebp +c01009e7: 55 push %ebp +c01009e8: 89 e5 mov %esp,%ebp * (3.4) call print_debuginfo(eip-1) to print the C calling function name and line number, etc. * (3.5) popup a calling stackframe * NOTICE: the calling funciton's return addr eip = ss:[ebp+4] * the calling funciton's ebp = ss:[ebp] */ } -c0100af3: 90 nop -c0100af4: 5d pop %ebp -c0100af5: c3 ret +c01009ea: 90 nop +c01009eb: 5d pop %ebp +c01009ec: c3 ret -c0100af6 : +c01009ed : #define MAXARGS 16 #define WHITESPACE " \t\n\r" /* parse - parse the command buffer into whitespace-separated arguments */ static int parse(char *buf, char **argv) { -c0100af6: f3 0f 1e fb endbr32 -c0100afa: 55 push %ebp -c0100afb: 89 e5 mov %esp,%ebp -c0100afd: 83 ec 28 sub $0x28,%esp +c01009ed: 55 push %ebp +c01009ee: 89 e5 mov %esp,%ebp +c01009f0: 83 ec 28 sub $0x28,%esp int argc = 0; -c0100b00: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) +c01009f3: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) while (1) { // find global whitespace while (*buf != '\0' && strchr(WHITESPACE, *buf) != NULL) { -c0100b07: eb 0c jmp c0100b15 +c01009fa: eb 0c jmp c0100a08 *buf ++ = '\0'; -c0100b09: 8b 45 08 mov 0x8(%ebp),%eax -c0100b0c: 8d 50 01 lea 0x1(%eax),%edx -c0100b0f: 89 55 08 mov %edx,0x8(%ebp) -c0100b12: c6 00 00 movb $0x0,(%eax) +c01009fc: 8b 45 08 mov 0x8(%ebp),%eax +c01009ff: 8d 50 01 lea 0x1(%eax),%edx +c0100a02: 89 55 08 mov %edx,0x8(%ebp) +c0100a05: c6 00 00 movb $0x0,(%eax) while (*buf != '\0' && strchr(WHITESPACE, *buf) != NULL) { -c0100b15: 8b 45 08 mov 0x8(%ebp),%eax -c0100b18: 0f b6 00 movzbl (%eax),%eax -c0100b1b: 84 c0 test %al,%al -c0100b1d: 74 1d je c0100b3c -c0100b1f: 8b 45 08 mov 0x8(%ebp),%eax -c0100b22: 0f b6 00 movzbl (%eax),%eax -c0100b25: 0f be c0 movsbl %al,%eax -c0100b28: 89 44 24 04 mov %eax,0x4(%esp) -c0100b2c: c7 04 24 f4 a4 10 c0 movl $0xc010a4f4,(%esp) -c0100b33: e8 5a 8c 00 00 call c0109792 -c0100b38: 85 c0 test %eax,%eax -c0100b3a: 75 cd jne c0100b09 +c0100a08: 8b 45 08 mov 0x8(%ebp),%eax +c0100a0b: 0f b6 00 movzbl (%eax),%eax +c0100a0e: 84 c0 test %al,%al +c0100a10: 74 1d je c0100a2f +c0100a12: 8b 45 08 mov 0x8(%ebp),%eax +c0100a15: 0f b6 00 movzbl (%eax),%eax +c0100a18: 0f be c0 movsbl %al,%eax +c0100a1b: 89 44 24 04 mov %eax,0x4(%esp) +c0100a1f: c7 04 24 88 a2 10 c0 movl $0xc010a288,(%esp) +c0100a26: e8 fd 92 00 00 call c0109d28 +c0100a2b: 85 c0 test %eax,%eax +c0100a2d: 75 cd jne c01009fc } if (*buf == '\0') { -c0100b3c: 8b 45 08 mov 0x8(%ebp),%eax -c0100b3f: 0f b6 00 movzbl (%eax),%eax -c0100b42: 84 c0 test %al,%al -c0100b44: 74 65 je c0100bab +c0100a2f: 8b 45 08 mov 0x8(%ebp),%eax +c0100a32: 0f b6 00 movzbl (%eax),%eax +c0100a35: 84 c0 test %al,%al +c0100a37: 74 65 je c0100a9e break; } // save and scan past next arg if (argc == MAXARGS - 1) { -c0100b46: 83 7d f4 0f cmpl $0xf,-0xc(%ebp) -c0100b4a: 75 14 jne c0100b60 +c0100a39: 83 7d f4 0f cmpl $0xf,-0xc(%ebp) +c0100a3d: 75 14 jne c0100a53 cprintf("Too many arguments (max %d).\n", MAXARGS); -c0100b4c: c7 44 24 04 10 00 00 movl $0x10,0x4(%esp) -c0100b53: 00 -c0100b54: c7 04 24 f9 a4 10 c0 movl $0xc010a4f9,(%esp) -c0100b5b: e8 77 f7 ff ff call c01002d7 +c0100a3f: c7 44 24 04 10 00 00 movl $0x10,0x4(%esp) +c0100a46: 00 +c0100a47: c7 04 24 8d a2 10 c0 movl $0xc010a28d,(%esp) +c0100a4e: e8 25 f9 ff ff call c0100378 } argv[argc ++] = buf; -c0100b60: 8b 45 f4 mov -0xc(%ebp),%eax -c0100b63: 8d 50 01 lea 0x1(%eax),%edx -c0100b66: 89 55 f4 mov %edx,-0xc(%ebp) -c0100b69: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx -c0100b70: 8b 45 0c mov 0xc(%ebp),%eax -c0100b73: 01 c2 add %eax,%edx -c0100b75: 8b 45 08 mov 0x8(%ebp),%eax -c0100b78: 89 02 mov %eax,(%edx) +c0100a53: 8b 45 f4 mov -0xc(%ebp),%eax +c0100a56: 8d 50 01 lea 0x1(%eax),%edx +c0100a59: 89 55 f4 mov %edx,-0xc(%ebp) +c0100a5c: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx +c0100a63: 8b 45 0c mov 0xc(%ebp),%eax +c0100a66: 01 c2 add %eax,%edx +c0100a68: 8b 45 08 mov 0x8(%ebp),%eax +c0100a6b: 89 02 mov %eax,(%edx) while (*buf != '\0' && strchr(WHITESPACE, *buf) == NULL) { -c0100b7a: eb 03 jmp c0100b7f +c0100a6d: eb 03 jmp c0100a72 buf ++; -c0100b7c: ff 45 08 incl 0x8(%ebp) +c0100a6f: ff 45 08 incl 0x8(%ebp) while (*buf != '\0' && strchr(WHITESPACE, *buf) == NULL) { -c0100b7f: 8b 45 08 mov 0x8(%ebp),%eax -c0100b82: 0f b6 00 movzbl (%eax),%eax -c0100b85: 84 c0 test %al,%al -c0100b87: 74 8c je c0100b15 -c0100b89: 8b 45 08 mov 0x8(%ebp),%eax -c0100b8c: 0f b6 00 movzbl (%eax),%eax -c0100b8f: 0f be c0 movsbl %al,%eax -c0100b92: 89 44 24 04 mov %eax,0x4(%esp) -c0100b96: c7 04 24 f4 a4 10 c0 movl $0xc010a4f4,(%esp) -c0100b9d: e8 f0 8b 00 00 call c0109792 -c0100ba2: 85 c0 test %eax,%eax -c0100ba4: 74 d6 je c0100b7c +c0100a72: 8b 45 08 mov 0x8(%ebp),%eax +c0100a75: 0f b6 00 movzbl (%eax),%eax +c0100a78: 84 c0 test %al,%al +c0100a7a: 74 8c je c0100a08 +c0100a7c: 8b 45 08 mov 0x8(%ebp),%eax +c0100a7f: 0f b6 00 movzbl (%eax),%eax +c0100a82: 0f be c0 movsbl %al,%eax +c0100a85: 89 44 24 04 mov %eax,0x4(%esp) +c0100a89: c7 04 24 88 a2 10 c0 movl $0xc010a288,(%esp) +c0100a90: e8 93 92 00 00 call c0109d28 +c0100a95: 85 c0 test %eax,%eax +c0100a97: 74 d6 je c0100a6f while (*buf != '\0' && strchr(WHITESPACE, *buf) != NULL) { -c0100ba6: e9 6a ff ff ff jmp c0100b15 +c0100a99: e9 6a ff ff ff jmp c0100a08 break; -c0100bab: 90 nop +c0100a9e: 90 nop } } return argc; -c0100bac: 8b 45 f4 mov -0xc(%ebp),%eax +c0100a9f: 8b 45 f4 mov -0xc(%ebp),%eax } -c0100baf: c9 leave -c0100bb0: c3 ret +c0100aa2: 89 ec mov %ebp,%esp +c0100aa4: 5d pop %ebp +c0100aa5: c3 ret -c0100bb1 : +c0100aa6 : /* * * runcmd - parse the input string, split it into separated arguments * and then lookup and invoke some related commands/ * */ static int runcmd(char *buf, struct trapframe *tf) { -c0100bb1: f3 0f 1e fb endbr32 -c0100bb5: 55 push %ebp -c0100bb6: 89 e5 mov %esp,%ebp -c0100bb8: 53 push %ebx -c0100bb9: 83 ec 64 sub $0x64,%esp +c0100aa6: 55 push %ebp +c0100aa7: 89 e5 mov %esp,%ebp +c0100aa9: 83 ec 68 sub $0x68,%esp +c0100aac: 89 5d fc mov %ebx,-0x4(%ebp) char *argv[MAXARGS]; int argc = parse(buf, argv); -c0100bbc: 8d 45 b0 lea -0x50(%ebp),%eax -c0100bbf: 89 44 24 04 mov %eax,0x4(%esp) -c0100bc3: 8b 45 08 mov 0x8(%ebp),%eax -c0100bc6: 89 04 24 mov %eax,(%esp) -c0100bc9: e8 28 ff ff ff call c0100af6 -c0100bce: 89 45 f0 mov %eax,-0x10(%ebp) +c0100aaf: 8d 45 b0 lea -0x50(%ebp),%eax +c0100ab2: 89 44 24 04 mov %eax,0x4(%esp) +c0100ab6: 8b 45 08 mov 0x8(%ebp),%eax +c0100ab9: 89 04 24 mov %eax,(%esp) +c0100abc: e8 2c ff ff ff call c01009ed +c0100ac1: 89 45 f0 mov %eax,-0x10(%ebp) if (argc == 0) { -c0100bd1: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c0100bd5: 75 0a jne c0100be1 +c0100ac4: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) +c0100ac8: 75 0a jne c0100ad4 return 0; -c0100bd7: b8 00 00 00 00 mov $0x0,%eax -c0100bdc: e9 83 00 00 00 jmp c0100c64 +c0100aca: b8 00 00 00 00 mov $0x0,%eax +c0100acf: e9 83 00 00 00 jmp c0100b57 } int i; for (i = 0; i < NCOMMANDS; i ++) { -c0100be1: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) -c0100be8: eb 5a jmp c0100c44 +c0100ad4: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) +c0100adb: eb 5a jmp c0100b37 if (strcmp(commands[i].name, argv[0]) == 0) { -c0100bea: 8b 4d b0 mov -0x50(%ebp),%ecx -c0100bed: 8b 55 f4 mov -0xc(%ebp),%edx -c0100bf0: 89 d0 mov %edx,%eax -c0100bf2: 01 c0 add %eax,%eax -c0100bf4: 01 d0 add %edx,%eax -c0100bf6: c1 e0 02 shl $0x2,%eax -c0100bf9: 05 00 80 12 c0 add $0xc0128000,%eax -c0100bfe: 8b 00 mov (%eax),%eax -c0100c00: 89 4c 24 04 mov %ecx,0x4(%esp) -c0100c04: 89 04 24 mov %eax,(%esp) -c0100c07: e8 e2 8a 00 00 call c01096ee -c0100c0c: 85 c0 test %eax,%eax -c0100c0e: 75 31 jne c0100c41 +c0100add: 8b 55 b0 mov -0x50(%ebp),%edx +c0100ae0: 8b 4d f4 mov -0xc(%ebp),%ecx +c0100ae3: 89 c8 mov %ecx,%eax +c0100ae5: 01 c0 add %eax,%eax +c0100ae7: 01 c8 add %ecx,%eax +c0100ae9: c1 e0 02 shl $0x2,%eax +c0100aec: 05 00 80 12 c0 add $0xc0128000,%eax +c0100af1: 8b 00 mov (%eax),%eax +c0100af3: 89 54 24 04 mov %edx,0x4(%esp) +c0100af7: 89 04 24 mov %eax,(%esp) +c0100afa: e8 8d 91 00 00 call c0109c8c +c0100aff: 85 c0 test %eax,%eax +c0100b01: 75 31 jne c0100b34 return commands[i].func(argc - 1, argv + 1, tf); -c0100c10: 8b 55 f4 mov -0xc(%ebp),%edx -c0100c13: 89 d0 mov %edx,%eax -c0100c15: 01 c0 add %eax,%eax -c0100c17: 01 d0 add %edx,%eax -c0100c19: c1 e0 02 shl $0x2,%eax -c0100c1c: 05 08 80 12 c0 add $0xc0128008,%eax -c0100c21: 8b 10 mov (%eax),%edx -c0100c23: 8d 45 b0 lea -0x50(%ebp),%eax -c0100c26: 83 c0 04 add $0x4,%eax -c0100c29: 8b 4d f0 mov -0x10(%ebp),%ecx -c0100c2c: 8d 59 ff lea -0x1(%ecx),%ebx -c0100c2f: 8b 4d 0c mov 0xc(%ebp),%ecx -c0100c32: 89 4c 24 08 mov %ecx,0x8(%esp) -c0100c36: 89 44 24 04 mov %eax,0x4(%esp) -c0100c3a: 89 1c 24 mov %ebx,(%esp) -c0100c3d: ff d2 call *%edx -c0100c3f: eb 23 jmp c0100c64 +c0100b03: 8b 55 f4 mov -0xc(%ebp),%edx +c0100b06: 89 d0 mov %edx,%eax +c0100b08: 01 c0 add %eax,%eax +c0100b0a: 01 d0 add %edx,%eax +c0100b0c: c1 e0 02 shl $0x2,%eax +c0100b0f: 05 08 80 12 c0 add $0xc0128008,%eax +c0100b14: 8b 10 mov (%eax),%edx +c0100b16: 8d 45 b0 lea -0x50(%ebp),%eax +c0100b19: 83 c0 04 add $0x4,%eax +c0100b1c: 8b 4d f0 mov -0x10(%ebp),%ecx +c0100b1f: 8d 59 ff lea -0x1(%ecx),%ebx +c0100b22: 8b 4d 0c mov 0xc(%ebp),%ecx +c0100b25: 89 4c 24 08 mov %ecx,0x8(%esp) +c0100b29: 89 44 24 04 mov %eax,0x4(%esp) +c0100b2d: 89 1c 24 mov %ebx,(%esp) +c0100b30: ff d2 call *%edx +c0100b32: eb 23 jmp c0100b57 for (i = 0; i < NCOMMANDS; i ++) { -c0100c41: ff 45 f4 incl -0xc(%ebp) -c0100c44: 8b 45 f4 mov -0xc(%ebp),%eax -c0100c47: 83 f8 02 cmp $0x2,%eax -c0100c4a: 76 9e jbe c0100bea +c0100b34: ff 45 f4 incl -0xc(%ebp) +c0100b37: 8b 45 f4 mov -0xc(%ebp),%eax +c0100b3a: 83 f8 02 cmp $0x2,%eax +c0100b3d: 76 9e jbe c0100add } } cprintf("Unknown command '%s'\n", argv[0]); -c0100c4c: 8b 45 b0 mov -0x50(%ebp),%eax -c0100c4f: 89 44 24 04 mov %eax,0x4(%esp) -c0100c53: c7 04 24 17 a5 10 c0 movl $0xc010a517,(%esp) -c0100c5a: e8 78 f6 ff ff call c01002d7 +c0100b3f: 8b 45 b0 mov -0x50(%ebp),%eax +c0100b42: 89 44 24 04 mov %eax,0x4(%esp) +c0100b46: c7 04 24 ab a2 10 c0 movl $0xc010a2ab,(%esp) +c0100b4d: e8 26 f8 ff ff call c0100378 return 0; -c0100c5f: b8 00 00 00 00 mov $0x0,%eax +c0100b52: b8 00 00 00 00 mov $0x0,%eax } -c0100c64: 83 c4 64 add $0x64,%esp -c0100c67: 5b pop %ebx -c0100c68: 5d pop %ebp -c0100c69: c3 ret +c0100b57: 8b 5d fc mov -0x4(%ebp),%ebx +c0100b5a: 89 ec mov %ebp,%esp +c0100b5c: 5d pop %ebp +c0100b5d: c3 ret -c0100c6a : +c0100b5e : /***** Implementations of basic kernel monitor commands *****/ void kmonitor(struct trapframe *tf) { -c0100c6a: f3 0f 1e fb endbr32 -c0100c6e: 55 push %ebp -c0100c6f: 89 e5 mov %esp,%ebp -c0100c71: 83 ec 28 sub $0x28,%esp +c0100b5e: 55 push %ebp +c0100b5f: 89 e5 mov %esp,%ebp +c0100b61: 83 ec 28 sub $0x28,%esp cprintf("Welcome to the kernel debug monitor!!\n"); -c0100c74: c7 04 24 30 a5 10 c0 movl $0xc010a530,(%esp) -c0100c7b: e8 57 f6 ff ff call c01002d7 +c0100b64: c7 04 24 c4 a2 10 c0 movl $0xc010a2c4,(%esp) +c0100b6b: e8 08 f8 ff ff call c0100378 cprintf("Type 'help' for a list of commands.\n"); -c0100c80: c7 04 24 58 a5 10 c0 movl $0xc010a558,(%esp) -c0100c87: e8 4b f6 ff ff call c01002d7 +c0100b70: c7 04 24 ec a2 10 c0 movl $0xc010a2ec,(%esp) +c0100b77: e8 fc f7 ff ff call c0100378 if (tf != NULL) { -c0100c8c: 83 7d 08 00 cmpl $0x0,0x8(%ebp) -c0100c90: 74 0b je c0100c9d +c0100b7c: 83 7d 08 00 cmpl $0x0,0x8(%ebp) +c0100b80: 74 0b je c0100b8d print_trapframe(tf); -c0100c92: 8b 45 08 mov 0x8(%ebp),%eax -c0100c95: 89 04 24 mov %eax,(%esp) -c0100c98: e8 a9 16 00 00 call c0102346 +c0100b82: 8b 45 08 mov 0x8(%ebp),%eax +c0100b85: 89 04 24 mov %eax,(%esp) +c0100b88: e8 2c 17 00 00 call c01022b9 } char *buf; while (1) { if ((buf = readline("K> ")) != NULL) { -c0100c9d: c7 04 24 7d a5 10 c0 movl $0xc010a57d,(%esp) -c0100ca4: e8 e1 f6 ff ff call c010038a -c0100ca9: 89 45 f4 mov %eax,-0xc(%ebp) -c0100cac: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0100cb0: 74 eb je c0100c9d +c0100b8d: c7 04 24 11 a3 10 c0 movl $0xc010a311,(%esp) +c0100b94: e8 d0 f6 ff ff call c0100269 +c0100b99: 89 45 f4 mov %eax,-0xc(%ebp) +c0100b9c: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0100ba0: 74 eb je c0100b8d if (runcmd(buf, tf) < 0) { -c0100cb2: 8b 45 08 mov 0x8(%ebp),%eax -c0100cb5: 89 44 24 04 mov %eax,0x4(%esp) -c0100cb9: 8b 45 f4 mov -0xc(%ebp),%eax -c0100cbc: 89 04 24 mov %eax,(%esp) -c0100cbf: e8 ed fe ff ff call c0100bb1 -c0100cc4: 85 c0 test %eax,%eax -c0100cc6: 78 02 js c0100cca +c0100ba2: 8b 45 08 mov 0x8(%ebp),%eax +c0100ba5: 89 44 24 04 mov %eax,0x4(%esp) +c0100ba9: 8b 45 f4 mov -0xc(%ebp),%eax +c0100bac: 89 04 24 mov %eax,(%esp) +c0100baf: e8 f2 fe ff ff call c0100aa6 +c0100bb4: 85 c0 test %eax,%eax +c0100bb6: 78 02 js c0100bba if ((buf = readline("K> ")) != NULL) { -c0100cc8: eb d3 jmp c0100c9d +c0100bb8: eb d3 jmp c0100b8d break; -c0100cca: 90 nop +c0100bba: 90 nop } } } } -c0100ccb: 90 nop -c0100ccc: c9 leave -c0100ccd: c3 ret +c0100bbb: 90 nop +c0100bbc: 89 ec mov %ebp,%esp +c0100bbe: 5d pop %ebp +c0100bbf: c3 ret -c0100cce : +c0100bc0 : /* mon_help - print the information about mon_* functions */ int mon_help(int argc, char **argv, struct trapframe *tf) { -c0100cce: f3 0f 1e fb endbr32 -c0100cd2: 55 push %ebp -c0100cd3: 89 e5 mov %esp,%ebp -c0100cd5: 83 ec 28 sub $0x28,%esp +c0100bc0: 55 push %ebp +c0100bc1: 89 e5 mov %esp,%ebp +c0100bc3: 83 ec 28 sub $0x28,%esp int i; for (i = 0; i < NCOMMANDS; i ++) { -c0100cd8: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) -c0100cdf: eb 3d jmp c0100d1e +c0100bc6: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) +c0100bcd: eb 3d jmp c0100c0c cprintf("%s - %s\n", commands[i].name, commands[i].desc); -c0100ce1: 8b 55 f4 mov -0xc(%ebp),%edx -c0100ce4: 89 d0 mov %edx,%eax -c0100ce6: 01 c0 add %eax,%eax -c0100ce8: 01 d0 add %edx,%eax -c0100cea: c1 e0 02 shl $0x2,%eax -c0100ced: 05 04 80 12 c0 add $0xc0128004,%eax -c0100cf2: 8b 08 mov (%eax),%ecx -c0100cf4: 8b 55 f4 mov -0xc(%ebp),%edx -c0100cf7: 89 d0 mov %edx,%eax -c0100cf9: 01 c0 add %eax,%eax -c0100cfb: 01 d0 add %edx,%eax -c0100cfd: c1 e0 02 shl $0x2,%eax -c0100d00: 05 00 80 12 c0 add $0xc0128000,%eax -c0100d05: 8b 00 mov (%eax),%eax -c0100d07: 89 4c 24 08 mov %ecx,0x8(%esp) -c0100d0b: 89 44 24 04 mov %eax,0x4(%esp) -c0100d0f: c7 04 24 81 a5 10 c0 movl $0xc010a581,(%esp) -c0100d16: e8 bc f5 ff ff call c01002d7 +c0100bcf: 8b 55 f4 mov -0xc(%ebp),%edx +c0100bd2: 89 d0 mov %edx,%eax +c0100bd4: 01 c0 add %eax,%eax +c0100bd6: 01 d0 add %edx,%eax +c0100bd8: c1 e0 02 shl $0x2,%eax +c0100bdb: 05 04 80 12 c0 add $0xc0128004,%eax +c0100be0: 8b 10 mov (%eax),%edx +c0100be2: 8b 4d f4 mov -0xc(%ebp),%ecx +c0100be5: 89 c8 mov %ecx,%eax +c0100be7: 01 c0 add %eax,%eax +c0100be9: 01 c8 add %ecx,%eax +c0100beb: c1 e0 02 shl $0x2,%eax +c0100bee: 05 00 80 12 c0 add $0xc0128000,%eax +c0100bf3: 8b 00 mov (%eax),%eax +c0100bf5: 89 54 24 08 mov %edx,0x8(%esp) +c0100bf9: 89 44 24 04 mov %eax,0x4(%esp) +c0100bfd: c7 04 24 15 a3 10 c0 movl $0xc010a315,(%esp) +c0100c04: e8 6f f7 ff ff call c0100378 for (i = 0; i < NCOMMANDS; i ++) { -c0100d1b: ff 45 f4 incl -0xc(%ebp) -c0100d1e: 8b 45 f4 mov -0xc(%ebp),%eax -c0100d21: 83 f8 02 cmp $0x2,%eax -c0100d24: 76 bb jbe c0100ce1 +c0100c09: ff 45 f4 incl -0xc(%ebp) +c0100c0c: 8b 45 f4 mov -0xc(%ebp),%eax +c0100c0f: 83 f8 02 cmp $0x2,%eax +c0100c12: 76 bb jbe c0100bcf } return 0; -c0100d26: b8 00 00 00 00 mov $0x0,%eax +c0100c14: b8 00 00 00 00 mov $0x0,%eax } -c0100d2b: c9 leave -c0100d2c: c3 ret +c0100c19: 89 ec mov %ebp,%esp +c0100c1b: 5d pop %ebp +c0100c1c: c3 ret -c0100d2d : +c0100c1d : /* * * mon_kerninfo - call print_kerninfo in kern/debug/kdebug.c to * print the memory occupancy in kernel. * */ int mon_kerninfo(int argc, char **argv, struct trapframe *tf) { -c0100d2d: f3 0f 1e fb endbr32 -c0100d31: 55 push %ebp -c0100d32: 89 e5 mov %esp,%ebp -c0100d34: 83 ec 08 sub $0x8,%esp +c0100c1d: 55 push %ebp +c0100c1e: 89 e5 mov %esp,%ebp +c0100c20: 83 ec 08 sub $0x8,%esp print_kerninfo(); -c0100d37: e8 5e fc ff ff call c010099a +c0100c23: e8 73 fc ff ff call c010089b return 0; -c0100d3c: b8 00 00 00 00 mov $0x0,%eax +c0100c28: b8 00 00 00 00 mov $0x0,%eax } -c0100d41: c9 leave -c0100d42: c3 ret +c0100c2d: 89 ec mov %ebp,%esp +c0100c2f: 5d pop %ebp +c0100c30: c3 ret -c0100d43 : +c0100c31 : /* * * mon_backtrace - call print_stackframe in kern/debug/kdebug.c to * print a backtrace of the stack. * */ int mon_backtrace(int argc, char **argv, struct trapframe *tf) { -c0100d43: f3 0f 1e fb endbr32 -c0100d47: 55 push %ebp -c0100d48: 89 e5 mov %esp,%ebp -c0100d4a: 83 ec 08 sub $0x8,%esp +c0100c31: 55 push %ebp +c0100c32: 89 e5 mov %esp,%ebp +c0100c34: 83 ec 08 sub $0x8,%esp print_stackframe(); -c0100d4d: e8 9a fd ff ff call c0100aec +c0100c37: e8 ab fd ff ff call c01009e7 return 0; -c0100d52: b8 00 00 00 00 mov $0x0,%eax +c0100c3c: b8 00 00 00 00 mov $0x0,%eax } -c0100d57: c9 leave -c0100d58: c3 ret +c0100c41: 89 ec mov %ebp,%esp +c0100c43: 5d pop %ebp +c0100c44: c3 ret -c0100d59 : - unsigned int size; // Size in Sectors - unsigned char model[41]; // Model in String -} ide_devices[MAX_IDE]; +c0100c45 <__panic>: +/* * + * __panic - __panic is called on unresolvable fatal errors. it prints + * "panic: 'message'", and then enters the kernel monitor. + * */ +void +__panic(const char *file, int line, const char *fmt, ...) { +c0100c45: 55 push %ebp +c0100c46: 89 e5 mov %esp,%ebp +c0100c48: 83 ec 28 sub $0x28,%esp + if (is_panic) { +c0100c4b: a1 20 b4 12 c0 mov 0xc012b420,%eax +c0100c50: 85 c0 test %eax,%eax +c0100c52: 75 5b jne c0100caf <__panic+0x6a> + goto panic_dead; + } + is_panic = 1; +c0100c54: c7 05 20 b4 12 c0 01 movl $0x1,0xc012b420 +c0100c5b: 00 00 00 -static int -ide_wait_ready(unsigned short iobase, bool check_error) { -c0100d59: f3 0f 1e fb endbr32 -c0100d5d: 55 push %ebp -c0100d5e: 89 e5 mov %esp,%ebp -c0100d60: 83 ec 14 sub $0x14,%esp -c0100d63: 8b 45 08 mov 0x8(%ebp),%eax -c0100d66: 66 89 45 ec mov %ax,-0x14(%ebp) - int r; - while ((r = inb(iobase + ISA_STATUS)) & IDE_BSY) -c0100d6a: 90 nop -c0100d6b: 8b 45 ec mov -0x14(%ebp),%eax -c0100d6e: 83 c0 07 add $0x7,%eax -c0100d71: 0f b7 c0 movzwl %ax,%eax -c0100d74: 66 89 45 fa mov %ax,-0x6(%ebp) -static inline void invlpg(void *addr) __attribute__((always_inline)); - -static inline uint8_t -inb(uint16_t port) { - uint8_t data; - asm volatile ("inb %1, %0" : "=a" (data) : "d" (port) : "memory"); -c0100d78: 0f b7 45 fa movzwl -0x6(%ebp),%eax -c0100d7c: 89 c2 mov %eax,%edx -c0100d7e: ec in (%dx),%al -c0100d7f: 88 45 f9 mov %al,-0x7(%ebp) - return data; -c0100d82: 0f b6 45 f9 movzbl -0x7(%ebp),%eax -c0100d86: 0f b6 c0 movzbl %al,%eax -c0100d89: 89 45 fc mov %eax,-0x4(%ebp) -c0100d8c: 8b 45 fc mov -0x4(%ebp),%eax -c0100d8f: 25 80 00 00 00 and $0x80,%eax -c0100d94: 85 c0 test %eax,%eax -c0100d96: 75 d3 jne c0100d6b - /* nothing */; - if (check_error && (r & (IDE_DF | IDE_ERR)) != 0) { -c0100d98: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) -c0100d9c: 74 11 je c0100daf -c0100d9e: 8b 45 fc mov -0x4(%ebp),%eax -c0100da1: 83 e0 21 and $0x21,%eax -c0100da4: 85 c0 test %eax,%eax -c0100da6: 74 07 je c0100daf - return -1; -c0100da8: b8 ff ff ff ff mov $0xffffffff,%eax -c0100dad: eb 05 jmp c0100db4 + // print the 'message' + va_list ap; + va_start(ap, fmt); +c0100c5e: 8d 45 14 lea 0x14(%ebp),%eax +c0100c61: 89 45 f4 mov %eax,-0xc(%ebp) + cprintf("kernel panic at %s:%d:\n ", file, line); +c0100c64: 8b 45 0c mov 0xc(%ebp),%eax +c0100c67: 89 44 24 08 mov %eax,0x8(%esp) +c0100c6b: 8b 45 08 mov 0x8(%ebp),%eax +c0100c6e: 89 44 24 04 mov %eax,0x4(%esp) +c0100c72: c7 04 24 1e a3 10 c0 movl $0xc010a31e,(%esp) +c0100c79: e8 fa f6 ff ff call c0100378 + vcprintf(fmt, ap); +c0100c7e: 8b 45 f4 mov -0xc(%ebp),%eax +c0100c81: 89 44 24 04 mov %eax,0x4(%esp) +c0100c85: 8b 45 10 mov 0x10(%ebp),%eax +c0100c88: 89 04 24 mov %eax,(%esp) +c0100c8b: e8 b3 f6 ff ff call c0100343 + cprintf("\n"); +c0100c90: c7 04 24 3a a3 10 c0 movl $0xc010a33a,(%esp) +c0100c97: e8 dc f6 ff ff call c0100378 + + cprintf("stack trackback:\n"); +c0100c9c: c7 04 24 3c a3 10 c0 movl $0xc010a33c,(%esp) +c0100ca3: e8 d0 f6 ff ff call c0100378 + print_stackframe(); +c0100ca8: e8 3a fd ff ff call c01009e7 +c0100cad: eb 01 jmp c0100cb0 <__panic+0x6b> + goto panic_dead; +c0100caf: 90 nop + + va_end(ap); + +panic_dead: + intr_disable(); +c0100cb0: e8 46 12 00 00 call c0101efb + while (1) { + kmonitor(NULL); +c0100cb5: c7 04 24 00 00 00 00 movl $0x0,(%esp) +c0100cbc: e8 9d fe ff ff call c0100b5e +c0100cc1: eb f2 jmp c0100cb5 <__panic+0x70> + +c0100cc3 <__warn>: } - return 0; -c0100daf: b8 00 00 00 00 mov $0x0,%eax } -c0100db4: c9 leave -c0100db5: c3 ret - -c0100db6 : +/* __warn - like panic, but don't */ void -ide_init(void) { -c0100db6: f3 0f 1e fb endbr32 -c0100dba: 55 push %ebp -c0100dbb: 89 e5 mov %esp,%ebp -c0100dbd: 57 push %edi -c0100dbe: 53 push %ebx -c0100dbf: 81 ec 50 02 00 00 sub $0x250,%esp - static_assert((SECTSIZE % 4) == 0); - unsigned short ideno, iobase; - for (ideno = 0; ideno < MAX_IDE; ideno ++) { -c0100dc5: 66 c7 45 f6 00 00 movw $0x0,-0xa(%ebp) -c0100dcb: e9 bd 02 00 00 jmp c010108d - /* assume that no device here */ - ide_devices[ideno].valid = 0; -c0100dd0: 0f b7 55 f6 movzwl -0xa(%ebp),%edx -c0100dd4: 89 d0 mov %edx,%eax -c0100dd6: c1 e0 03 shl $0x3,%eax -c0100dd9: 29 d0 sub %edx,%eax -c0100ddb: c1 e0 03 shl $0x3,%eax -c0100dde: 05 40 b4 12 c0 add $0xc012b440,%eax -c0100de3: c6 00 00 movb $0x0,(%eax) +__warn(const char *file, int line, const char *fmt, ...) { +c0100cc3: 55 push %ebp +c0100cc4: 89 e5 mov %esp,%ebp +c0100cc6: 83 ec 28 sub $0x28,%esp + va_list ap; + va_start(ap, fmt); +c0100cc9: 8d 45 14 lea 0x14(%ebp),%eax +c0100ccc: 89 45 f4 mov %eax,-0xc(%ebp) + cprintf("kernel warning at %s:%d:\n ", file, line); +c0100ccf: 8b 45 0c mov 0xc(%ebp),%eax +c0100cd2: 89 44 24 08 mov %eax,0x8(%esp) +c0100cd6: 8b 45 08 mov 0x8(%ebp),%eax +c0100cd9: 89 44 24 04 mov %eax,0x4(%esp) +c0100cdd: c7 04 24 4e a3 10 c0 movl $0xc010a34e,(%esp) +c0100ce4: e8 8f f6 ff ff call c0100378 + vcprintf(fmt, ap); +c0100ce9: 8b 45 f4 mov -0xc(%ebp),%eax +c0100cec: 89 44 24 04 mov %eax,0x4(%esp) +c0100cf0: 8b 45 10 mov 0x10(%ebp),%eax +c0100cf3: 89 04 24 mov %eax,(%esp) +c0100cf6: e8 48 f6 ff ff call c0100343 + cprintf("\n"); +c0100cfb: c7 04 24 3a a3 10 c0 movl $0xc010a33a,(%esp) +c0100d02: e8 71 f6 ff ff call c0100378 + va_end(ap); +} +c0100d07: 90 nop +c0100d08: 89 ec mov %ebp,%esp +c0100d0a: 5d pop %ebp +c0100d0b: c3 ret - iobase = IO_BASE(ideno); -c0100de6: 0f b7 45 f6 movzwl -0xa(%ebp),%eax -c0100dea: d1 e8 shr %eax -c0100dec: 0f b7 c0 movzwl %ax,%eax -c0100def: 8b 04 85 8c a5 10 c0 mov -0x3fef5a74(,%eax,4),%eax -c0100df6: 66 89 45 ea mov %ax,-0x16(%ebp) +c0100d0c : - /* wait device ready */ - ide_wait_ready(iobase, 0); -c0100dfa: 0f b7 45 ea movzwl -0x16(%ebp),%eax -c0100dfe: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c0100e05: 00 -c0100e06: 89 04 24 mov %eax,(%esp) -c0100e09: e8 4b ff ff ff call c0100d59 +bool +is_kernel_panic(void) { +c0100d0c: 55 push %ebp +c0100d0d: 89 e5 mov %esp,%ebp + return is_panic; +c0100d0f: a1 20 b4 12 c0 mov 0xc012b420,%eax +} +c0100d14: 5d pop %ebp +c0100d15: c3 ret - /* step1: select drive */ - outb(iobase + ISA_SDH, 0xE0 | ((ideno & 1) << 4)); -c0100e0e: 0f b7 45 f6 movzwl -0xa(%ebp),%eax -c0100e12: c1 e0 04 shl $0x4,%eax -c0100e15: 24 10 and $0x10,%al -c0100e17: 0c e0 or $0xe0,%al -c0100e19: 0f b6 c0 movzbl %al,%eax -c0100e1c: 0f b7 55 ea movzwl -0x16(%ebp),%edx -c0100e20: 83 c2 06 add $0x6,%edx -c0100e23: 0f b7 d2 movzwl %dx,%edx -c0100e26: 66 89 55 ca mov %dx,-0x36(%ebp) -c0100e2a: 88 45 c9 mov %al,-0x37(%ebp) +c0100d16 : +/* * + * clock_init - initialize 8253 clock to interrupt 100 times per second, + * and then enable IRQ_TIMER. + * */ +void +clock_init(void) { +c0100d16: 55 push %ebp +c0100d17: 89 e5 mov %esp,%ebp +c0100d19: 83 ec 28 sub $0x28,%esp +c0100d1c: 66 c7 45 ee 43 00 movw $0x43,-0x12(%ebp) +c0100d22: c6 45 ed 34 movb $0x34,-0x13(%ebp) : "memory", "cc"); } static inline void outb(uint16_t port, uint8_t data) { asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0100e2d: 0f b6 45 c9 movzbl -0x37(%ebp),%eax -c0100e31: 0f b7 55 ca movzwl -0x36(%ebp),%edx -c0100e35: ee out %al,(%dx) +c0100d26: 0f b6 45 ed movzbl -0x13(%ebp),%eax +c0100d2a: 0f b7 55 ee movzwl -0x12(%ebp),%edx +c0100d2e: ee out %al,(%dx) } -c0100e36: 90 nop - ide_wait_ready(iobase, 0); -c0100e37: 0f b7 45 ea movzwl -0x16(%ebp),%eax -c0100e3b: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c0100e42: 00 -c0100e43: 89 04 24 mov %eax,(%esp) -c0100e46: e8 0e ff ff ff call c0100d59 - - /* step2: send ATA identify command */ - outb(iobase + ISA_COMMAND, IDE_CMD_IDENTIFY); -c0100e4b: 0f b7 45 ea movzwl -0x16(%ebp),%eax -c0100e4f: 83 c0 07 add $0x7,%eax -c0100e52: 0f b7 c0 movzwl %ax,%eax -c0100e55: 66 89 45 ce mov %ax,-0x32(%ebp) -c0100e59: c6 45 cd ec movb $0xec,-0x33(%ebp) +c0100d2f: 90 nop +c0100d30: 66 c7 45 f2 40 00 movw $0x40,-0xe(%ebp) +c0100d36: c6 45 f1 9c movb $0x9c,-0xf(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0100e5d: 0f b6 45 cd movzbl -0x33(%ebp),%eax -c0100e61: 0f b7 55 ce movzwl -0x32(%ebp),%edx -c0100e65: ee out %al,(%dx) +c0100d3a: 0f b6 45 f1 movzbl -0xf(%ebp),%eax +c0100d3e: 0f b7 55 f2 movzwl -0xe(%ebp),%edx +c0100d42: ee out %al,(%dx) } -c0100e66: 90 nop - ide_wait_ready(iobase, 0); -c0100e67: 0f b7 45 ea movzwl -0x16(%ebp),%eax -c0100e6b: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c0100e72: 00 -c0100e73: 89 04 24 mov %eax,(%esp) -c0100e76: e8 de fe ff ff call c0100d59 +c0100d43: 90 nop +c0100d44: 66 c7 45 f6 40 00 movw $0x40,-0xa(%ebp) +c0100d4a: c6 45 f5 2e movb $0x2e,-0xb(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0100d4e: 0f b6 45 f5 movzbl -0xb(%ebp),%eax +c0100d52: 0f b7 55 f6 movzwl -0xa(%ebp),%edx +c0100d56: ee out %al,(%dx) +} +c0100d57: 90 nop + outb(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16BIT); + outb(IO_TIMER1, TIMER_DIV(100) % 256); + outb(IO_TIMER1, TIMER_DIV(100) / 256); - /* step3: polling */ - if (inb(iobase + ISA_STATUS) == 0 || ide_wait_ready(iobase, 1) != 0) { -c0100e7b: 0f b7 45 ea movzwl -0x16(%ebp),%eax -c0100e7f: 83 c0 07 add $0x7,%eax -c0100e82: 0f b7 c0 movzwl %ax,%eax -c0100e85: 66 89 45 d2 mov %ax,-0x2e(%ebp) - asm volatile ("inb %1, %0" : "=a" (data) : "d" (port) : "memory"); -c0100e89: 0f b7 45 d2 movzwl -0x2e(%ebp),%eax -c0100e8d: 89 c2 mov %eax,%edx -c0100e8f: ec in (%dx),%al -c0100e90: 88 45 d1 mov %al,-0x2f(%ebp) - return data; -c0100e93: 0f b6 45 d1 movzbl -0x2f(%ebp),%eax -c0100e97: 84 c0 test %al,%al -c0100e99: 0f 84 e4 01 00 00 je c0101083 -c0100e9f: 0f b7 45 ea movzwl -0x16(%ebp),%eax -c0100ea3: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c0100eaa: 00 -c0100eab: 89 04 24 mov %eax,(%esp) -c0100eae: e8 a6 fe ff ff call c0100d59 -c0100eb3: 85 c0 test %eax,%eax -c0100eb5: 0f 85 c8 01 00 00 jne c0101083 - continue ; - } + // initialize time counter 'ticks' to zero + ticks = 0; +c0100d58: c7 05 24 b4 12 c0 00 movl $0x0,0xc012b424 +c0100d5f: 00 00 00 - /* device is ok */ - ide_devices[ideno].valid = 1; -c0100ebb: 0f b7 55 f6 movzwl -0xa(%ebp),%edx -c0100ebf: 89 d0 mov %edx,%eax -c0100ec1: c1 e0 03 shl $0x3,%eax -c0100ec4: 29 d0 sub %edx,%eax -c0100ec6: c1 e0 03 shl $0x3,%eax -c0100ec9: 05 40 b4 12 c0 add $0xc012b440,%eax -c0100ece: c6 00 01 movb $0x1,(%eax) + cprintf("++ setup timer interrupts\n"); +c0100d62: c7 04 24 6c a3 10 c0 movl $0xc010a36c,(%esp) +c0100d69: e8 0a f6 ff ff call c0100378 + pic_enable(IRQ_TIMER); +c0100d6e: c7 04 24 00 00 00 00 movl $0x0,(%esp) +c0100d75: e8 e6 11 00 00 call c0101f60 +} +c0100d7a: 90 nop +c0100d7b: 89 ec mov %ebp,%esp +c0100d7d: 5d pop %ebp +c0100d7e: c3 ret - /* read identification space of the device */ - unsigned int buffer[128]; - insl(iobase + ISA_DATA, buffer, sizeof(buffer) / sizeof(unsigned int)); -c0100ed1: 0f b7 45 ea movzwl -0x16(%ebp),%eax -c0100ed5: 89 45 c4 mov %eax,-0x3c(%ebp) -c0100ed8: 8d 85 bc fd ff ff lea -0x244(%ebp),%eax -c0100ede: 89 45 c0 mov %eax,-0x40(%ebp) -c0100ee1: c7 45 bc 80 00 00 00 movl $0x80,-0x44(%ebp) - asm volatile ( -c0100ee8: 8b 55 c4 mov -0x3c(%ebp),%edx -c0100eeb: 8b 4d c0 mov -0x40(%ebp),%ecx -c0100eee: 8b 45 bc mov -0x44(%ebp),%eax -c0100ef1: 89 cb mov %ecx,%ebx -c0100ef3: 89 df mov %ebx,%edi -c0100ef5: 89 c1 mov %eax,%ecx -c0100ef7: fc cld -c0100ef8: f2 6d repnz insl (%dx),%es:(%edi) -c0100efa: 89 c8 mov %ecx,%eax -c0100efc: 89 fb mov %edi,%ebx -c0100efe: 89 5d c0 mov %ebx,-0x40(%ebp) -c0100f01: 89 45 bc mov %eax,-0x44(%ebp) -} -c0100f04: 90 nop +c0100d7f <__intr_save>: +#include +#include +#include - unsigned char *ident = (unsigned char *)buffer; -c0100f05: 8d 85 bc fd ff ff lea -0x244(%ebp),%eax -c0100f0b: 89 45 e4 mov %eax,-0x1c(%ebp) - unsigned int sectors; - unsigned int cmdsets = *(unsigned int *)(ident + IDE_IDENT_CMDSETS); -c0100f0e: 8b 45 e4 mov -0x1c(%ebp),%eax -c0100f11: 8b 80 a4 00 00 00 mov 0xa4(%eax),%eax -c0100f17: 89 45 e0 mov %eax,-0x20(%ebp) - /* device use 48-bits or 28-bits addressing */ - if (cmdsets & (1 << 26)) { -c0100f1a: 8b 45 e0 mov -0x20(%ebp),%eax -c0100f1d: 25 00 00 00 04 and $0x4000000,%eax -c0100f22: 85 c0 test %eax,%eax -c0100f24: 74 0e je c0100f34 - sectors = *(unsigned int *)(ident + IDE_IDENT_MAX_LBA_EXT); -c0100f26: 8b 45 e4 mov -0x1c(%ebp),%eax -c0100f29: 8b 80 c8 00 00 00 mov 0xc8(%eax),%eax -c0100f2f: 89 45 f0 mov %eax,-0x10(%ebp) -c0100f32: eb 09 jmp c0100f3d - } - else { - sectors = *(unsigned int *)(ident + IDE_IDENT_MAX_LBA); -c0100f34: 8b 45 e4 mov -0x1c(%ebp),%eax -c0100f37: 8b 40 78 mov 0x78(%eax),%eax -c0100f3a: 89 45 f0 mov %eax,-0x10(%ebp) - } - ide_devices[ideno].sets = cmdsets; -c0100f3d: 0f b7 55 f6 movzwl -0xa(%ebp),%edx -c0100f41: 89 d0 mov %edx,%eax -c0100f43: c1 e0 03 shl $0x3,%eax -c0100f46: 29 d0 sub %edx,%eax -c0100f48: c1 e0 03 shl $0x3,%eax -c0100f4b: 8d 90 44 b4 12 c0 lea -0x3fed4bbc(%eax),%edx -c0100f51: 8b 45 e0 mov -0x20(%ebp),%eax -c0100f54: 89 02 mov %eax,(%edx) - ide_devices[ideno].size = sectors; -c0100f56: 0f b7 55 f6 movzwl -0xa(%ebp),%edx -c0100f5a: 89 d0 mov %edx,%eax -c0100f5c: c1 e0 03 shl $0x3,%eax -c0100f5f: 29 d0 sub %edx,%eax -c0100f61: c1 e0 03 shl $0x3,%eax -c0100f64: 8d 90 48 b4 12 c0 lea -0x3fed4bb8(%eax),%edx -c0100f6a: 8b 45 f0 mov -0x10(%ebp),%eax -c0100f6d: 89 02 mov %eax,(%edx) +static inline bool +__intr_save(void) { +c0100d7f: 55 push %ebp +c0100d80: 89 e5 mov %esp,%ebp +c0100d82: 83 ec 18 sub $0x18,%esp +} - /* check if supports LBA */ - assert((*(unsigned short *)(ident + IDE_IDENT_CAPABILITIES) & 0x200) != 0); -c0100f6f: 8b 45 e4 mov -0x1c(%ebp),%eax -c0100f72: 83 c0 62 add $0x62,%eax -c0100f75: 0f b7 00 movzwl (%eax),%eax -c0100f78: 25 00 02 00 00 and $0x200,%eax -c0100f7d: 85 c0 test %eax,%eax -c0100f7f: 75 24 jne c0100fa5 -c0100f81: c7 44 24 0c 94 a5 10 movl $0xc010a594,0xc(%esp) -c0100f88: c0 -c0100f89: c7 44 24 08 d7 a5 10 movl $0xc010a5d7,0x8(%esp) -c0100f90: c0 -c0100f91: c7 44 24 04 7d 00 00 movl $0x7d,0x4(%esp) -c0100f98: 00 -c0100f99: c7 04 24 ec a5 10 c0 movl $0xc010a5ec,(%esp) -c0100fa0: e8 9e f4 ff ff call c0100443 <__panic> +static inline uint32_t +read_eflags(void) { + uint32_t eflags; + asm volatile ("pushfl; popl %0" : "=r" (eflags)); +c0100d85: 9c pushf +c0100d86: 58 pop %eax +c0100d87: 89 45 f4 mov %eax,-0xc(%ebp) + return eflags; +c0100d8a: 8b 45 f4 mov -0xc(%ebp),%eax + if (read_eflags() & FL_IF) { +c0100d8d: 25 00 02 00 00 and $0x200,%eax +c0100d92: 85 c0 test %eax,%eax +c0100d94: 74 0c je c0100da2 <__intr_save+0x23> + intr_disable(); +c0100d96: e8 60 11 00 00 call c0101efb + return 1; +c0100d9b: b8 01 00 00 00 mov $0x1,%eax +c0100da0: eb 05 jmp c0100da7 <__intr_save+0x28> + } + return 0; +c0100da2: b8 00 00 00 00 mov $0x0,%eax +} +c0100da7: 89 ec mov %ebp,%esp +c0100da9: 5d pop %ebp +c0100daa: c3 ret - unsigned char *model = ide_devices[ideno].model, *data = ident + IDE_IDENT_MODEL; -c0100fa5: 0f b7 55 f6 movzwl -0xa(%ebp),%edx -c0100fa9: 89 d0 mov %edx,%eax -c0100fab: c1 e0 03 shl $0x3,%eax -c0100fae: 29 d0 sub %edx,%eax -c0100fb0: c1 e0 03 shl $0x3,%eax -c0100fb3: 05 40 b4 12 c0 add $0xc012b440,%eax -c0100fb8: 83 c0 0c add $0xc,%eax -c0100fbb: 89 45 dc mov %eax,-0x24(%ebp) -c0100fbe: 8b 45 e4 mov -0x1c(%ebp),%eax -c0100fc1: 83 c0 36 add $0x36,%eax -c0100fc4: 89 45 d8 mov %eax,-0x28(%ebp) - unsigned int i, length = 40; -c0100fc7: c7 45 d4 28 00 00 00 movl $0x28,-0x2c(%ebp) - for (i = 0; i < length; i += 2) { -c0100fce: c7 45 ec 00 00 00 00 movl $0x0,-0x14(%ebp) -c0100fd5: eb 34 jmp c010100b - model[i] = data[i + 1], model[i + 1] = data[i]; -c0100fd7: 8b 45 ec mov -0x14(%ebp),%eax -c0100fda: 8d 50 01 lea 0x1(%eax),%edx -c0100fdd: 8b 45 d8 mov -0x28(%ebp),%eax -c0100fe0: 01 c2 add %eax,%edx -c0100fe2: 8b 4d dc mov -0x24(%ebp),%ecx -c0100fe5: 8b 45 ec mov -0x14(%ebp),%eax -c0100fe8: 01 c8 add %ecx,%eax -c0100fea: 0f b6 12 movzbl (%edx),%edx -c0100fed: 88 10 mov %dl,(%eax) -c0100fef: 8b 55 d8 mov -0x28(%ebp),%edx -c0100ff2: 8b 45 ec mov -0x14(%ebp),%eax -c0100ff5: 01 c2 add %eax,%edx -c0100ff7: 8b 45 ec mov -0x14(%ebp),%eax -c0100ffa: 8d 48 01 lea 0x1(%eax),%ecx -c0100ffd: 8b 45 dc mov -0x24(%ebp),%eax -c0101000: 01 c8 add %ecx,%eax -c0101002: 0f b6 12 movzbl (%edx),%edx -c0101005: 88 10 mov %dl,(%eax) - for (i = 0; i < length; i += 2) { -c0101007: 83 45 ec 02 addl $0x2,-0x14(%ebp) -c010100b: 8b 45 ec mov -0x14(%ebp),%eax -c010100e: 3b 45 d4 cmp -0x2c(%ebp),%eax -c0101011: 72 c4 jb c0100fd7 - } - do { - model[i] = '\0'; -c0101013: 8b 55 dc mov -0x24(%ebp),%edx -c0101016: 8b 45 ec mov -0x14(%ebp),%eax -c0101019: 01 d0 add %edx,%eax -c010101b: c6 00 00 movb $0x0,(%eax) - } while (i -- > 0 && model[i] == ' '); -c010101e: 8b 45 ec mov -0x14(%ebp),%eax -c0101021: 8d 50 ff lea -0x1(%eax),%edx -c0101024: 89 55 ec mov %edx,-0x14(%ebp) -c0101027: 85 c0 test %eax,%eax -c0101029: 74 0f je c010103a -c010102b: 8b 55 dc mov -0x24(%ebp),%edx -c010102e: 8b 45 ec mov -0x14(%ebp),%eax -c0101031: 01 d0 add %edx,%eax -c0101033: 0f b6 00 movzbl (%eax),%eax -c0101036: 3c 20 cmp $0x20,%al -c0101038: 74 d9 je c0101013 - - cprintf("ide %d: %10u(sectors), '%s'.\n", ideno, ide_devices[ideno].size, ide_devices[ideno].model); -c010103a: 0f b7 55 f6 movzwl -0xa(%ebp),%edx -c010103e: 89 d0 mov %edx,%eax -c0101040: c1 e0 03 shl $0x3,%eax -c0101043: 29 d0 sub %edx,%eax -c0101045: c1 e0 03 shl $0x3,%eax -c0101048: 05 40 b4 12 c0 add $0xc012b440,%eax -c010104d: 8d 48 0c lea 0xc(%eax),%ecx -c0101050: 0f b7 55 f6 movzwl -0xa(%ebp),%edx -c0101054: 89 d0 mov %edx,%eax -c0101056: c1 e0 03 shl $0x3,%eax -c0101059: 29 d0 sub %edx,%eax -c010105b: c1 e0 03 shl $0x3,%eax -c010105e: 05 48 b4 12 c0 add $0xc012b448,%eax -c0101063: 8b 10 mov (%eax),%edx -c0101065: 0f b7 45 f6 movzwl -0xa(%ebp),%eax -c0101069: 89 4c 24 0c mov %ecx,0xc(%esp) -c010106d: 89 54 24 08 mov %edx,0x8(%esp) -c0101071: 89 44 24 04 mov %eax,0x4(%esp) -c0101075: c7 04 24 fe a5 10 c0 movl $0xc010a5fe,(%esp) -c010107c: e8 56 f2 ff ff call c01002d7 -c0101081: eb 01 jmp c0101084 - continue ; -c0101083: 90 nop - for (ideno = 0; ideno < MAX_IDE; ideno ++) { -c0101084: 0f b7 45 f6 movzwl -0xa(%ebp),%eax -c0101088: 40 inc %eax -c0101089: 66 89 45 f6 mov %ax,-0xa(%ebp) -c010108d: 0f b7 45 f6 movzwl -0xa(%ebp),%eax -c0101091: 83 f8 03 cmp $0x3,%eax -c0101094: 0f 86 36 fd ff ff jbe c0100dd0 - } - - // enable ide interrupt - pic_enable(IRQ_IDE1); -c010109a: c7 04 24 0e 00 00 00 movl $0xe,(%esp) -c01010a1: e8 1f 0f 00 00 call c0101fc5 - pic_enable(IRQ_IDE2); -c01010a6: c7 04 24 0f 00 00 00 movl $0xf,(%esp) -c01010ad: e8 13 0f 00 00 call c0101fc5 -} -c01010b2: 90 nop -c01010b3: 81 c4 50 02 00 00 add $0x250,%esp -c01010b9: 5b pop %ebx -c01010ba: 5f pop %edi -c01010bb: 5d pop %ebp -c01010bc: c3 ret - -c01010bd : - -bool -ide_device_valid(unsigned short ideno) { -c01010bd: f3 0f 1e fb endbr32 -c01010c1: 55 push %ebp -c01010c2: 89 e5 mov %esp,%ebp -c01010c4: 83 ec 04 sub $0x4,%esp -c01010c7: 8b 45 08 mov 0x8(%ebp),%eax -c01010ca: 66 89 45 fc mov %ax,-0x4(%ebp) - return VALID_IDE(ideno); -c01010ce: 0f b7 45 fc movzwl -0x4(%ebp),%eax -c01010d2: 83 f8 03 cmp $0x3,%eax -c01010d5: 77 21 ja c01010f8 -c01010d7: 0f b7 55 fc movzwl -0x4(%ebp),%edx -c01010db: 89 d0 mov %edx,%eax -c01010dd: c1 e0 03 shl $0x3,%eax -c01010e0: 29 d0 sub %edx,%eax -c01010e2: c1 e0 03 shl $0x3,%eax -c01010e5: 05 40 b4 12 c0 add $0xc012b440,%eax -c01010ea: 0f b6 00 movzbl (%eax),%eax -c01010ed: 84 c0 test %al,%al -c01010ef: 74 07 je c01010f8 -c01010f1: b8 01 00 00 00 mov $0x1,%eax -c01010f6: eb 05 jmp c01010fd -c01010f8: b8 00 00 00 00 mov $0x0,%eax -} -c01010fd: c9 leave -c01010fe: c3 ret - -c01010ff : - -size_t -ide_device_size(unsigned short ideno) { -c01010ff: f3 0f 1e fb endbr32 -c0101103: 55 push %ebp -c0101104: 89 e5 mov %esp,%ebp -c0101106: 83 ec 08 sub $0x8,%esp -c0101109: 8b 45 08 mov 0x8(%ebp),%eax -c010110c: 66 89 45 fc mov %ax,-0x4(%ebp) - if (ide_device_valid(ideno)) { -c0101110: 0f b7 45 fc movzwl -0x4(%ebp),%eax -c0101114: 89 04 24 mov %eax,(%esp) -c0101117: e8 a1 ff ff ff call c01010bd -c010111c: 85 c0 test %eax,%eax -c010111e: 74 17 je c0101137 - return ide_devices[ideno].size; -c0101120: 0f b7 55 fc movzwl -0x4(%ebp),%edx -c0101124: 89 d0 mov %edx,%eax -c0101126: c1 e0 03 shl $0x3,%eax -c0101129: 29 d0 sub %edx,%eax -c010112b: c1 e0 03 shl $0x3,%eax -c010112e: 05 48 b4 12 c0 add $0xc012b448,%eax -c0101133: 8b 00 mov (%eax),%eax -c0101135: eb 05 jmp c010113c - } - return 0; -c0101137: b8 00 00 00 00 mov $0x0,%eax -} -c010113c: c9 leave -c010113d: c3 ret - -c010113e : - -int -ide_read_secs(unsigned short ideno, uint32_t secno, void *dst, size_t nsecs) { -c010113e: f3 0f 1e fb endbr32 -c0101142: 55 push %ebp -c0101143: 89 e5 mov %esp,%ebp -c0101145: 57 push %edi -c0101146: 53 push %ebx -c0101147: 83 ec 50 sub $0x50,%esp -c010114a: 8b 45 08 mov 0x8(%ebp),%eax -c010114d: 66 89 45 c4 mov %ax,-0x3c(%ebp) - assert(nsecs <= MAX_NSECS && VALID_IDE(ideno)); -c0101151: 81 7d 14 80 00 00 00 cmpl $0x80,0x14(%ebp) -c0101158: 77 23 ja c010117d -c010115a: 0f b7 45 c4 movzwl -0x3c(%ebp),%eax -c010115e: 83 f8 03 cmp $0x3,%eax -c0101161: 77 1a ja c010117d -c0101163: 0f b7 55 c4 movzwl -0x3c(%ebp),%edx -c0101167: 89 d0 mov %edx,%eax -c0101169: c1 e0 03 shl $0x3,%eax -c010116c: 29 d0 sub %edx,%eax -c010116e: c1 e0 03 shl $0x3,%eax -c0101171: 05 40 b4 12 c0 add $0xc012b440,%eax -c0101176: 0f b6 00 movzbl (%eax),%eax -c0101179: 84 c0 test %al,%al -c010117b: 75 24 jne c01011a1 -c010117d: c7 44 24 0c 1c a6 10 movl $0xc010a61c,0xc(%esp) -c0101184: c0 -c0101185: c7 44 24 08 d7 a5 10 movl $0xc010a5d7,0x8(%esp) -c010118c: c0 -c010118d: c7 44 24 04 9f 00 00 movl $0x9f,0x4(%esp) -c0101194: 00 -c0101195: c7 04 24 ec a5 10 c0 movl $0xc010a5ec,(%esp) -c010119c: e8 a2 f2 ff ff call c0100443 <__panic> - assert(secno < MAX_DISK_NSECS && secno + nsecs <= MAX_DISK_NSECS); -c01011a1: 81 7d 0c ff ff ff 0f cmpl $0xfffffff,0xc(%ebp) -c01011a8: 77 0f ja c01011b9 -c01011aa: 8b 55 0c mov 0xc(%ebp),%edx -c01011ad: 8b 45 14 mov 0x14(%ebp),%eax -c01011b0: 01 d0 add %edx,%eax -c01011b2: 3d 00 00 00 10 cmp $0x10000000,%eax -c01011b7: 76 24 jbe c01011dd -c01011b9: c7 44 24 0c 44 a6 10 movl $0xc010a644,0xc(%esp) -c01011c0: c0 -c01011c1: c7 44 24 08 d7 a5 10 movl $0xc010a5d7,0x8(%esp) -c01011c8: c0 -c01011c9: c7 44 24 04 a0 00 00 movl $0xa0,0x4(%esp) -c01011d0: 00 -c01011d1: c7 04 24 ec a5 10 c0 movl $0xc010a5ec,(%esp) -c01011d8: e8 66 f2 ff ff call c0100443 <__panic> - unsigned short iobase = IO_BASE(ideno), ioctrl = IO_CTRL(ideno); -c01011dd: 0f b7 45 c4 movzwl -0x3c(%ebp),%eax -c01011e1: d1 e8 shr %eax -c01011e3: 0f b7 c0 movzwl %ax,%eax -c01011e6: 8b 04 85 8c a5 10 c0 mov -0x3fef5a74(,%eax,4),%eax -c01011ed: 66 89 45 f2 mov %ax,-0xe(%ebp) -c01011f1: 0f b7 45 c4 movzwl -0x3c(%ebp),%eax -c01011f5: d1 e8 shr %eax -c01011f7: 0f b7 c0 movzwl %ax,%eax -c01011fa: 0f b7 04 85 8e a5 10 movzwl -0x3fef5a72(,%eax,4),%eax -c0101201: c0 -c0101202: 66 89 45 f0 mov %ax,-0x10(%ebp) - - ide_wait_ready(iobase, 0); -c0101206: 0f b7 45 f2 movzwl -0xe(%ebp),%eax -c010120a: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c0101211: 00 -c0101212: 89 04 24 mov %eax,(%esp) -c0101215: e8 3f fb ff ff call c0100d59 - - // generate interrupt - outb(ioctrl + ISA_CTRL, 0); -c010121a: 8b 45 f0 mov -0x10(%ebp),%eax -c010121d: 83 c0 02 add $0x2,%eax -c0101220: 0f b7 c0 movzwl %ax,%eax -c0101223: 66 89 45 d6 mov %ax,-0x2a(%ebp) -c0101227: c6 45 d5 00 movb $0x0,-0x2b(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c010122b: 0f b6 45 d5 movzbl -0x2b(%ebp),%eax -c010122f: 0f b7 55 d6 movzwl -0x2a(%ebp),%edx -c0101233: ee out %al,(%dx) -} -c0101234: 90 nop - outb(iobase + ISA_SECCNT, nsecs); -c0101235: 8b 45 14 mov 0x14(%ebp),%eax -c0101238: 0f b6 c0 movzbl %al,%eax -c010123b: 0f b7 55 f2 movzwl -0xe(%ebp),%edx -c010123f: 83 c2 02 add $0x2,%edx -c0101242: 0f b7 d2 movzwl %dx,%edx -c0101245: 66 89 55 da mov %dx,-0x26(%ebp) -c0101249: 88 45 d9 mov %al,-0x27(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c010124c: 0f b6 45 d9 movzbl -0x27(%ebp),%eax -c0101250: 0f b7 55 da movzwl -0x26(%ebp),%edx -c0101254: ee out %al,(%dx) -} -c0101255: 90 nop - outb(iobase + ISA_SECTOR, secno & 0xFF); -c0101256: 8b 45 0c mov 0xc(%ebp),%eax -c0101259: 0f b6 c0 movzbl %al,%eax -c010125c: 0f b7 55 f2 movzwl -0xe(%ebp),%edx -c0101260: 83 c2 03 add $0x3,%edx -c0101263: 0f b7 d2 movzwl %dx,%edx -c0101266: 66 89 55 de mov %dx,-0x22(%ebp) -c010126a: 88 45 dd mov %al,-0x23(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c010126d: 0f b6 45 dd movzbl -0x23(%ebp),%eax -c0101271: 0f b7 55 de movzwl -0x22(%ebp),%edx -c0101275: ee out %al,(%dx) -} -c0101276: 90 nop - outb(iobase + ISA_CYL_LO, (secno >> 8) & 0xFF); -c0101277: 8b 45 0c mov 0xc(%ebp),%eax -c010127a: c1 e8 08 shr $0x8,%eax -c010127d: 0f b6 c0 movzbl %al,%eax -c0101280: 0f b7 55 f2 movzwl -0xe(%ebp),%edx -c0101284: 83 c2 04 add $0x4,%edx -c0101287: 0f b7 d2 movzwl %dx,%edx -c010128a: 66 89 55 e2 mov %dx,-0x1e(%ebp) -c010128e: 88 45 e1 mov %al,-0x1f(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0101291: 0f b6 45 e1 movzbl -0x1f(%ebp),%eax -c0101295: 0f b7 55 e2 movzwl -0x1e(%ebp),%edx -c0101299: ee out %al,(%dx) -} -c010129a: 90 nop - outb(iobase + ISA_CYL_HI, (secno >> 16) & 0xFF); -c010129b: 8b 45 0c mov 0xc(%ebp),%eax -c010129e: c1 e8 10 shr $0x10,%eax -c01012a1: 0f b6 c0 movzbl %al,%eax -c01012a4: 0f b7 55 f2 movzwl -0xe(%ebp),%edx -c01012a8: 83 c2 05 add $0x5,%edx -c01012ab: 0f b7 d2 movzwl %dx,%edx -c01012ae: 66 89 55 e6 mov %dx,-0x1a(%ebp) -c01012b2: 88 45 e5 mov %al,-0x1b(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c01012b5: 0f b6 45 e5 movzbl -0x1b(%ebp),%eax -c01012b9: 0f b7 55 e6 movzwl -0x1a(%ebp),%edx -c01012bd: ee out %al,(%dx) -} -c01012be: 90 nop - outb(iobase + ISA_SDH, 0xE0 | ((ideno & 1) << 4) | ((secno >> 24) & 0xF)); -c01012bf: 8b 45 c4 mov -0x3c(%ebp),%eax -c01012c2: c0 e0 04 shl $0x4,%al -c01012c5: 24 10 and $0x10,%al -c01012c7: 88 c2 mov %al,%dl -c01012c9: 8b 45 0c mov 0xc(%ebp),%eax -c01012cc: c1 e8 18 shr $0x18,%eax -c01012cf: 24 0f and $0xf,%al -c01012d1: 08 d0 or %dl,%al -c01012d3: 0c e0 or $0xe0,%al -c01012d5: 0f b6 c0 movzbl %al,%eax -c01012d8: 0f b7 55 f2 movzwl -0xe(%ebp),%edx -c01012dc: 83 c2 06 add $0x6,%edx -c01012df: 0f b7 d2 movzwl %dx,%edx -c01012e2: 66 89 55 ea mov %dx,-0x16(%ebp) -c01012e6: 88 45 e9 mov %al,-0x17(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c01012e9: 0f b6 45 e9 movzbl -0x17(%ebp),%eax -c01012ed: 0f b7 55 ea movzwl -0x16(%ebp),%edx -c01012f1: ee out %al,(%dx) -} -c01012f2: 90 nop - outb(iobase + ISA_COMMAND, IDE_CMD_READ); -c01012f3: 0f b7 45 f2 movzwl -0xe(%ebp),%eax -c01012f7: 83 c0 07 add $0x7,%eax -c01012fa: 0f b7 c0 movzwl %ax,%eax -c01012fd: 66 89 45 ee mov %ax,-0x12(%ebp) -c0101301: c6 45 ed 20 movb $0x20,-0x13(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0101305: 0f b6 45 ed movzbl -0x13(%ebp),%eax -c0101309: 0f b7 55 ee movzwl -0x12(%ebp),%edx -c010130d: ee out %al,(%dx) -} -c010130e: 90 nop - - int ret = 0; -c010130f: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) - for (; nsecs > 0; nsecs --, dst += SECTSIZE) { -c0101316: eb 58 jmp c0101370 - if ((ret = ide_wait_ready(iobase, 1)) != 0) { -c0101318: 0f b7 45 f2 movzwl -0xe(%ebp),%eax -c010131c: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c0101323: 00 -c0101324: 89 04 24 mov %eax,(%esp) -c0101327: e8 2d fa ff ff call c0100d59 -c010132c: 89 45 f4 mov %eax,-0xc(%ebp) -c010132f: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0101333: 75 43 jne c0101378 - goto out; - } - insl(iobase, dst, SECTSIZE / sizeof(uint32_t)); -c0101335: 0f b7 45 f2 movzwl -0xe(%ebp),%eax -c0101339: 89 45 d0 mov %eax,-0x30(%ebp) -c010133c: 8b 45 10 mov 0x10(%ebp),%eax -c010133f: 89 45 cc mov %eax,-0x34(%ebp) -c0101342: c7 45 c8 80 00 00 00 movl $0x80,-0x38(%ebp) - asm volatile ( -c0101349: 8b 55 d0 mov -0x30(%ebp),%edx -c010134c: 8b 4d cc mov -0x34(%ebp),%ecx -c010134f: 8b 45 c8 mov -0x38(%ebp),%eax -c0101352: 89 cb mov %ecx,%ebx -c0101354: 89 df mov %ebx,%edi -c0101356: 89 c1 mov %eax,%ecx -c0101358: fc cld -c0101359: f2 6d repnz insl (%dx),%es:(%edi) -c010135b: 89 c8 mov %ecx,%eax -c010135d: 89 fb mov %edi,%ebx -c010135f: 89 5d cc mov %ebx,-0x34(%ebp) -c0101362: 89 45 c8 mov %eax,-0x38(%ebp) -} -c0101365: 90 nop - for (; nsecs > 0; nsecs --, dst += SECTSIZE) { -c0101366: ff 4d 14 decl 0x14(%ebp) -c0101369: 81 45 10 00 02 00 00 addl $0x200,0x10(%ebp) -c0101370: 83 7d 14 00 cmpl $0x0,0x14(%ebp) -c0101374: 75 a2 jne c0101318 - } - -out: -c0101376: eb 01 jmp c0101379 - goto out; -c0101378: 90 nop - return ret; -c0101379: 8b 45 f4 mov -0xc(%ebp),%eax -} -c010137c: 83 c4 50 add $0x50,%esp -c010137f: 5b pop %ebx -c0101380: 5f pop %edi -c0101381: 5d pop %ebp -c0101382: c3 ret - -c0101383 : - -int -ide_write_secs(unsigned short ideno, uint32_t secno, const void *src, size_t nsecs) { -c0101383: f3 0f 1e fb endbr32 -c0101387: 55 push %ebp -c0101388: 89 e5 mov %esp,%ebp -c010138a: 56 push %esi -c010138b: 53 push %ebx -c010138c: 83 ec 50 sub $0x50,%esp -c010138f: 8b 45 08 mov 0x8(%ebp),%eax -c0101392: 66 89 45 c4 mov %ax,-0x3c(%ebp) - assert(nsecs <= MAX_NSECS && VALID_IDE(ideno)); -c0101396: 81 7d 14 80 00 00 00 cmpl $0x80,0x14(%ebp) -c010139d: 77 23 ja c01013c2 -c010139f: 0f b7 45 c4 movzwl -0x3c(%ebp),%eax -c01013a3: 83 f8 03 cmp $0x3,%eax -c01013a6: 77 1a ja c01013c2 -c01013a8: 0f b7 55 c4 movzwl -0x3c(%ebp),%edx -c01013ac: 89 d0 mov %edx,%eax -c01013ae: c1 e0 03 shl $0x3,%eax -c01013b1: 29 d0 sub %edx,%eax -c01013b3: c1 e0 03 shl $0x3,%eax -c01013b6: 05 40 b4 12 c0 add $0xc012b440,%eax -c01013bb: 0f b6 00 movzbl (%eax),%eax -c01013be: 84 c0 test %al,%al -c01013c0: 75 24 jne c01013e6 -c01013c2: c7 44 24 0c 1c a6 10 movl $0xc010a61c,0xc(%esp) -c01013c9: c0 -c01013ca: c7 44 24 08 d7 a5 10 movl $0xc010a5d7,0x8(%esp) -c01013d1: c0 -c01013d2: c7 44 24 04 bc 00 00 movl $0xbc,0x4(%esp) -c01013d9: 00 -c01013da: c7 04 24 ec a5 10 c0 movl $0xc010a5ec,(%esp) -c01013e1: e8 5d f0 ff ff call c0100443 <__panic> - assert(secno < MAX_DISK_NSECS && secno + nsecs <= MAX_DISK_NSECS); -c01013e6: 81 7d 0c ff ff ff 0f cmpl $0xfffffff,0xc(%ebp) -c01013ed: 77 0f ja c01013fe -c01013ef: 8b 55 0c mov 0xc(%ebp),%edx -c01013f2: 8b 45 14 mov 0x14(%ebp),%eax -c01013f5: 01 d0 add %edx,%eax -c01013f7: 3d 00 00 00 10 cmp $0x10000000,%eax -c01013fc: 76 24 jbe c0101422 -c01013fe: c7 44 24 0c 44 a6 10 movl $0xc010a644,0xc(%esp) -c0101405: c0 -c0101406: c7 44 24 08 d7 a5 10 movl $0xc010a5d7,0x8(%esp) -c010140d: c0 -c010140e: c7 44 24 04 bd 00 00 movl $0xbd,0x4(%esp) -c0101415: 00 -c0101416: c7 04 24 ec a5 10 c0 movl $0xc010a5ec,(%esp) -c010141d: e8 21 f0 ff ff call c0100443 <__panic> - unsigned short iobase = IO_BASE(ideno), ioctrl = IO_CTRL(ideno); -c0101422: 0f b7 45 c4 movzwl -0x3c(%ebp),%eax -c0101426: d1 e8 shr %eax -c0101428: 0f b7 c0 movzwl %ax,%eax -c010142b: 8b 04 85 8c a5 10 c0 mov -0x3fef5a74(,%eax,4),%eax -c0101432: 66 89 45 f2 mov %ax,-0xe(%ebp) -c0101436: 0f b7 45 c4 movzwl -0x3c(%ebp),%eax -c010143a: d1 e8 shr %eax -c010143c: 0f b7 c0 movzwl %ax,%eax -c010143f: 0f b7 04 85 8e a5 10 movzwl -0x3fef5a72(,%eax,4),%eax -c0101446: c0 -c0101447: 66 89 45 f0 mov %ax,-0x10(%ebp) - - ide_wait_ready(iobase, 0); -c010144b: 0f b7 45 f2 movzwl -0xe(%ebp),%eax -c010144f: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c0101456: 00 -c0101457: 89 04 24 mov %eax,(%esp) -c010145a: e8 fa f8 ff ff call c0100d59 - - // generate interrupt - outb(ioctrl + ISA_CTRL, 0); -c010145f: 8b 45 f0 mov -0x10(%ebp),%eax -c0101462: 83 c0 02 add $0x2,%eax -c0101465: 0f b7 c0 movzwl %ax,%eax -c0101468: 66 89 45 d6 mov %ax,-0x2a(%ebp) -c010146c: c6 45 d5 00 movb $0x0,-0x2b(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0101470: 0f b6 45 d5 movzbl -0x2b(%ebp),%eax -c0101474: 0f b7 55 d6 movzwl -0x2a(%ebp),%edx -c0101478: ee out %al,(%dx) -} -c0101479: 90 nop - outb(iobase + ISA_SECCNT, nsecs); -c010147a: 8b 45 14 mov 0x14(%ebp),%eax -c010147d: 0f b6 c0 movzbl %al,%eax -c0101480: 0f b7 55 f2 movzwl -0xe(%ebp),%edx -c0101484: 83 c2 02 add $0x2,%edx -c0101487: 0f b7 d2 movzwl %dx,%edx -c010148a: 66 89 55 da mov %dx,-0x26(%ebp) -c010148e: 88 45 d9 mov %al,-0x27(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0101491: 0f b6 45 d9 movzbl -0x27(%ebp),%eax -c0101495: 0f b7 55 da movzwl -0x26(%ebp),%edx -c0101499: ee out %al,(%dx) -} -c010149a: 90 nop - outb(iobase + ISA_SECTOR, secno & 0xFF); -c010149b: 8b 45 0c mov 0xc(%ebp),%eax -c010149e: 0f b6 c0 movzbl %al,%eax -c01014a1: 0f b7 55 f2 movzwl -0xe(%ebp),%edx -c01014a5: 83 c2 03 add $0x3,%edx -c01014a8: 0f b7 d2 movzwl %dx,%edx -c01014ab: 66 89 55 de mov %dx,-0x22(%ebp) -c01014af: 88 45 dd mov %al,-0x23(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c01014b2: 0f b6 45 dd movzbl -0x23(%ebp),%eax -c01014b6: 0f b7 55 de movzwl -0x22(%ebp),%edx -c01014ba: ee out %al,(%dx) -} -c01014bb: 90 nop - outb(iobase + ISA_CYL_LO, (secno >> 8) & 0xFF); -c01014bc: 8b 45 0c mov 0xc(%ebp),%eax -c01014bf: c1 e8 08 shr $0x8,%eax -c01014c2: 0f b6 c0 movzbl %al,%eax -c01014c5: 0f b7 55 f2 movzwl -0xe(%ebp),%edx -c01014c9: 83 c2 04 add $0x4,%edx -c01014cc: 0f b7 d2 movzwl %dx,%edx -c01014cf: 66 89 55 e2 mov %dx,-0x1e(%ebp) -c01014d3: 88 45 e1 mov %al,-0x1f(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c01014d6: 0f b6 45 e1 movzbl -0x1f(%ebp),%eax -c01014da: 0f b7 55 e2 movzwl -0x1e(%ebp),%edx -c01014de: ee out %al,(%dx) -} -c01014df: 90 nop - outb(iobase + ISA_CYL_HI, (secno >> 16) & 0xFF); -c01014e0: 8b 45 0c mov 0xc(%ebp),%eax -c01014e3: c1 e8 10 shr $0x10,%eax -c01014e6: 0f b6 c0 movzbl %al,%eax -c01014e9: 0f b7 55 f2 movzwl -0xe(%ebp),%edx -c01014ed: 83 c2 05 add $0x5,%edx -c01014f0: 0f b7 d2 movzwl %dx,%edx -c01014f3: 66 89 55 e6 mov %dx,-0x1a(%ebp) -c01014f7: 88 45 e5 mov %al,-0x1b(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c01014fa: 0f b6 45 e5 movzbl -0x1b(%ebp),%eax -c01014fe: 0f b7 55 e6 movzwl -0x1a(%ebp),%edx -c0101502: ee out %al,(%dx) -} -c0101503: 90 nop - outb(iobase + ISA_SDH, 0xE0 | ((ideno & 1) << 4) | ((secno >> 24) & 0xF)); -c0101504: 8b 45 c4 mov -0x3c(%ebp),%eax -c0101507: c0 e0 04 shl $0x4,%al -c010150a: 24 10 and $0x10,%al -c010150c: 88 c2 mov %al,%dl -c010150e: 8b 45 0c mov 0xc(%ebp),%eax -c0101511: c1 e8 18 shr $0x18,%eax -c0101514: 24 0f and $0xf,%al -c0101516: 08 d0 or %dl,%al -c0101518: 0c e0 or $0xe0,%al -c010151a: 0f b6 c0 movzbl %al,%eax -c010151d: 0f b7 55 f2 movzwl -0xe(%ebp),%edx -c0101521: 83 c2 06 add $0x6,%edx -c0101524: 0f b7 d2 movzwl %dx,%edx -c0101527: 66 89 55 ea mov %dx,-0x16(%ebp) -c010152b: 88 45 e9 mov %al,-0x17(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c010152e: 0f b6 45 e9 movzbl -0x17(%ebp),%eax -c0101532: 0f b7 55 ea movzwl -0x16(%ebp),%edx -c0101536: ee out %al,(%dx) -} -c0101537: 90 nop - outb(iobase + ISA_COMMAND, IDE_CMD_WRITE); -c0101538: 0f b7 45 f2 movzwl -0xe(%ebp),%eax -c010153c: 83 c0 07 add $0x7,%eax -c010153f: 0f b7 c0 movzwl %ax,%eax -c0101542: 66 89 45 ee mov %ax,-0x12(%ebp) -c0101546: c6 45 ed 30 movb $0x30,-0x13(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c010154a: 0f b6 45 ed movzbl -0x13(%ebp),%eax -c010154e: 0f b7 55 ee movzwl -0x12(%ebp),%edx -c0101552: ee out %al,(%dx) -} -c0101553: 90 nop - - int ret = 0; -c0101554: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) - for (; nsecs > 0; nsecs --, src += SECTSIZE) { -c010155b: eb 58 jmp c01015b5 - if ((ret = ide_wait_ready(iobase, 1)) != 0) { -c010155d: 0f b7 45 f2 movzwl -0xe(%ebp),%eax -c0101561: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c0101568: 00 -c0101569: 89 04 24 mov %eax,(%esp) -c010156c: e8 e8 f7 ff ff call c0100d59 -c0101571: 89 45 f4 mov %eax,-0xc(%ebp) -c0101574: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0101578: 75 43 jne c01015bd - goto out; - } - outsl(iobase, src, SECTSIZE / sizeof(uint32_t)); -c010157a: 0f b7 45 f2 movzwl -0xe(%ebp),%eax -c010157e: 89 45 d0 mov %eax,-0x30(%ebp) -c0101581: 8b 45 10 mov 0x10(%ebp),%eax -c0101584: 89 45 cc mov %eax,-0x34(%ebp) -c0101587: c7 45 c8 80 00 00 00 movl $0x80,-0x38(%ebp) - asm volatile ("outw %0, %1" :: "a" (data), "d" (port) : "memory"); -} - -static inline void -outsl(uint32_t port, const void *addr, int cnt) { - asm volatile ( -c010158e: 8b 55 d0 mov -0x30(%ebp),%edx -c0101591: 8b 4d cc mov -0x34(%ebp),%ecx -c0101594: 8b 45 c8 mov -0x38(%ebp),%eax -c0101597: 89 cb mov %ecx,%ebx -c0101599: 89 de mov %ebx,%esi -c010159b: 89 c1 mov %eax,%ecx -c010159d: fc cld -c010159e: f2 6f repnz outsl %ds:(%esi),(%dx) -c01015a0: 89 c8 mov %ecx,%eax -c01015a2: 89 f3 mov %esi,%ebx -c01015a4: 89 5d cc mov %ebx,-0x34(%ebp) -c01015a7: 89 45 c8 mov %eax,-0x38(%ebp) - "cld;" - "repne; outsl;" - : "=S" (addr), "=c" (cnt) - : "d" (port), "0" (addr), "1" (cnt) - : "memory", "cc"); -} -c01015aa: 90 nop - for (; nsecs > 0; nsecs --, src += SECTSIZE) { -c01015ab: ff 4d 14 decl 0x14(%ebp) -c01015ae: 81 45 10 00 02 00 00 addl $0x200,0x10(%ebp) -c01015b5: 83 7d 14 00 cmpl $0x0,0x14(%ebp) -c01015b9: 75 a2 jne c010155d - } - -out: -c01015bb: eb 01 jmp c01015be - goto out; -c01015bd: 90 nop - return ret; -c01015be: 8b 45 f4 mov -0xc(%ebp),%eax -} -c01015c1: 83 c4 50 add $0x50,%esp -c01015c4: 5b pop %ebx -c01015c5: 5e pop %esi -c01015c6: 5d pop %ebp -c01015c7: c3 ret - -c01015c8 : -/* * - * clock_init - initialize 8253 clock to interrupt 100 times per second, - * and then enable IRQ_TIMER. - * */ -void -clock_init(void) { -c01015c8: f3 0f 1e fb endbr32 -c01015cc: 55 push %ebp -c01015cd: 89 e5 mov %esp,%ebp -c01015cf: 83 ec 28 sub $0x28,%esp -c01015d2: 66 c7 45 ee 43 00 movw $0x43,-0x12(%ebp) -c01015d8: c6 45 ed 34 movb $0x34,-0x13(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c01015dc: 0f b6 45 ed movzbl -0x13(%ebp),%eax -c01015e0: 0f b7 55 ee movzwl -0x12(%ebp),%edx -c01015e4: ee out %al,(%dx) -} -c01015e5: 90 nop -c01015e6: 66 c7 45 f2 40 00 movw $0x40,-0xe(%ebp) -c01015ec: c6 45 f1 9c movb $0x9c,-0xf(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c01015f0: 0f b6 45 f1 movzbl -0xf(%ebp),%eax -c01015f4: 0f b7 55 f2 movzwl -0xe(%ebp),%edx -c01015f8: ee out %al,(%dx) -} -c01015f9: 90 nop -c01015fa: 66 c7 45 f6 40 00 movw $0x40,-0xa(%ebp) -c0101600: c6 45 f5 2e movb $0x2e,-0xb(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0101604: 0f b6 45 f5 movzbl -0xb(%ebp),%eax -c0101608: 0f b7 55 f6 movzwl -0xa(%ebp),%edx -c010160c: ee out %al,(%dx) -} -c010160d: 90 nop - outb(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16BIT); - outb(IO_TIMER1, TIMER_DIV(100) % 256); - outb(IO_TIMER1, TIMER_DIV(100) / 256); - - // initialize time counter 'ticks' to zero - ticks = 0; -c010160e: c7 05 54 e0 12 c0 00 movl $0x0,0xc012e054 -c0101615: 00 00 00 - - cprintf("++ setup timer interrupts\n"); -c0101618: c7 04 24 7e a6 10 c0 movl $0xc010a67e,(%esp) -c010161f: e8 b3 ec ff ff call c01002d7 - pic_enable(IRQ_TIMER); -c0101624: c7 04 24 00 00 00 00 movl $0x0,(%esp) -c010162b: e8 95 09 00 00 call c0101fc5 -} -c0101630: 90 nop -c0101631: c9 leave -c0101632: c3 ret - -c0101633 <__intr_save>: -#include -#include -#include - -static inline bool -__intr_save(void) { -c0101633: 55 push %ebp -c0101634: 89 e5 mov %esp,%ebp -c0101636: 83 ec 18 sub $0x18,%esp -} - -static inline uint32_t -read_eflags(void) { - uint32_t eflags; - asm volatile ("pushfl; popl %0" : "=r" (eflags)); -c0101639: 9c pushf -c010163a: 58 pop %eax -c010163b: 89 45 f4 mov %eax,-0xc(%ebp) - return eflags; -c010163e: 8b 45 f4 mov -0xc(%ebp),%eax - if (read_eflags() & FL_IF) { -c0101641: 25 00 02 00 00 and $0x200,%eax -c0101646: 85 c0 test %eax,%eax -c0101648: 74 0c je c0101656 <__intr_save+0x23> - intr_disable(); -c010164a: e8 05 0b 00 00 call c0102154 - return 1; -c010164f: b8 01 00 00 00 mov $0x1,%eax -c0101654: eb 05 jmp c010165b <__intr_save+0x28> - } - return 0; -c0101656: b8 00 00 00 00 mov $0x0,%eax -} -c010165b: c9 leave -c010165c: c3 ret - -c010165d <__intr_restore>: +c0100dab <__intr_restore>: static inline void __intr_restore(bool flag) { -c010165d: 55 push %ebp -c010165e: 89 e5 mov %esp,%ebp -c0101660: 83 ec 08 sub $0x8,%esp +c0100dab: 55 push %ebp +c0100dac: 89 e5 mov %esp,%ebp +c0100dae: 83 ec 08 sub $0x8,%esp if (flag) { -c0101663: 83 7d 08 00 cmpl $0x0,0x8(%ebp) -c0101667: 74 05 je c010166e <__intr_restore+0x11> +c0100db1: 83 7d 08 00 cmpl $0x0,0x8(%ebp) +c0100db5: 74 05 je c0100dbc <__intr_restore+0x11> intr_enable(); -c0101669: e8 da 0a 00 00 call c0102148 +c0100db7: e8 37 11 00 00 call c0101ef3 } } -c010166e: 90 nop -c010166f: c9 leave -c0101670: c3 ret +c0100dbc: 90 nop +c0100dbd: 89 ec mov %ebp,%esp +c0100dbf: 5d pop %ebp +c0100dc0: c3 ret -c0101671 : +c0100dc1 : #include #include /* stupid I/O delay routine necessitated by historical PC design flaws */ static void delay(void) { -c0101671: f3 0f 1e fb endbr32 -c0101675: 55 push %ebp -c0101676: 89 e5 mov %esp,%ebp -c0101678: 83 ec 10 sub $0x10,%esp -c010167b: 66 c7 45 f2 84 00 movw $0x84,-0xe(%ebp) +c0100dc1: 55 push %ebp +c0100dc2: 89 e5 mov %esp,%ebp +c0100dc4: 83 ec 10 sub $0x10,%esp +c0100dc7: 66 c7 45 f2 84 00 movw $0x84,-0xe(%ebp) asm volatile ("inb %1, %0" : "=a" (data) : "d" (port) : "memory"); -c0101681: 0f b7 45 f2 movzwl -0xe(%ebp),%eax -c0101685: 89 c2 mov %eax,%edx -c0101687: ec in (%dx),%al -c0101688: 88 45 f1 mov %al,-0xf(%ebp) -c010168b: 66 c7 45 f6 84 00 movw $0x84,-0xa(%ebp) -c0101691: 0f b7 45 f6 movzwl -0xa(%ebp),%eax -c0101695: 89 c2 mov %eax,%edx -c0101697: ec in (%dx),%al -c0101698: 88 45 f5 mov %al,-0xb(%ebp) -c010169b: 66 c7 45 fa 84 00 movw $0x84,-0x6(%ebp) -c01016a1: 0f b7 45 fa movzwl -0x6(%ebp),%eax -c01016a5: 89 c2 mov %eax,%edx -c01016a7: ec in (%dx),%al -c01016a8: 88 45 f9 mov %al,-0x7(%ebp) -c01016ab: 66 c7 45 fe 84 00 movw $0x84,-0x2(%ebp) -c01016b1: 0f b7 45 fe movzwl -0x2(%ebp),%eax -c01016b5: 89 c2 mov %eax,%edx -c01016b7: ec in (%dx),%al -c01016b8: 88 45 fd mov %al,-0x3(%ebp) +c0100dcd: 0f b7 45 f2 movzwl -0xe(%ebp),%eax +c0100dd1: 89 c2 mov %eax,%edx +c0100dd3: ec in (%dx),%al +c0100dd4: 88 45 f1 mov %al,-0xf(%ebp) +c0100dd7: 66 c7 45 f6 84 00 movw $0x84,-0xa(%ebp) +c0100ddd: 0f b7 45 f6 movzwl -0xa(%ebp),%eax +c0100de1: 89 c2 mov %eax,%edx +c0100de3: ec in (%dx),%al +c0100de4: 88 45 f5 mov %al,-0xb(%ebp) +c0100de7: 66 c7 45 fa 84 00 movw $0x84,-0x6(%ebp) +c0100ded: 0f b7 45 fa movzwl -0x6(%ebp),%eax +c0100df1: 89 c2 mov %eax,%edx +c0100df3: ec in (%dx),%al +c0100df4: 88 45 f9 mov %al,-0x7(%ebp) +c0100df7: 66 c7 45 fe 84 00 movw $0x84,-0x2(%ebp) +c0100dfd: 0f b7 45 fe movzwl -0x2(%ebp),%eax +c0100e01: 89 c2 mov %eax,%edx +c0100e03: ec in (%dx),%al +c0100e04: 88 45 fd mov %al,-0x3(%ebp) inb(0x84); inb(0x84); inb(0x84); inb(0x84); } -c01016bb: 90 nop -c01016bc: c9 leave -c01016bd: c3 ret +c0100e07: 90 nop +c0100e08: 89 ec mov %ebp,%esp +c0100e0a: 5d pop %ebp +c0100e0b: c3 ret -c01016be : +c0100e0c : static uint16_t addr_6845; /* TEXT-mode CGA/VGA display output */ static void cga_init(void) { -c01016be: f3 0f 1e fb endbr32 -c01016c2: 55 push %ebp -c01016c3: 89 e5 mov %esp,%ebp -c01016c5: 83 ec 20 sub $0x20,%esp +c0100e0c: 55 push %ebp +c0100e0d: 89 e5 mov %esp,%ebp +c0100e0f: 83 ec 20 sub $0x20,%esp volatile uint16_t *cp = (uint16_t *)(CGA_BUF + KERNBASE); -c01016c8: c7 45 fc 00 80 0b c0 movl $0xc00b8000,-0x4(%ebp) +c0100e12: c7 45 fc 00 80 0b c0 movl $0xc00b8000,-0x4(%ebp) uint16_t was = *cp; -c01016cf: 8b 45 fc mov -0x4(%ebp),%eax -c01016d2: 0f b7 00 movzwl (%eax),%eax -c01016d5: 66 89 45 fa mov %ax,-0x6(%ebp) +c0100e19: 8b 45 fc mov -0x4(%ebp),%eax +c0100e1c: 0f b7 00 movzwl (%eax),%eax +c0100e1f: 66 89 45 fa mov %ax,-0x6(%ebp) *cp = (uint16_t) 0xA55A; -c01016d9: 8b 45 fc mov -0x4(%ebp),%eax -c01016dc: 66 c7 00 5a a5 movw $0xa55a,(%eax) +c0100e23: 8b 45 fc mov -0x4(%ebp),%eax +c0100e26: 66 c7 00 5a a5 movw $0xa55a,(%eax) if (*cp != 0xA55A) { -c01016e1: 8b 45 fc mov -0x4(%ebp),%eax -c01016e4: 0f b7 00 movzwl (%eax),%eax -c01016e7: 0f b7 c0 movzwl %ax,%eax -c01016ea: 3d 5a a5 00 00 cmp $0xa55a,%eax -c01016ef: 74 12 je c0101703 +c0100e2b: 8b 45 fc mov -0x4(%ebp),%eax +c0100e2e: 0f b7 00 movzwl (%eax),%eax +c0100e31: 0f b7 c0 movzwl %ax,%eax +c0100e34: 3d 5a a5 00 00 cmp $0xa55a,%eax +c0100e39: 74 12 je c0100e4d cp = (uint16_t*)(MONO_BUF + KERNBASE); -c01016f1: c7 45 fc 00 00 0b c0 movl $0xc00b0000,-0x4(%ebp) +c0100e3b: c7 45 fc 00 00 0b c0 movl $0xc00b0000,-0x4(%ebp) addr_6845 = MONO_BASE; -c01016f8: 66 c7 05 26 b5 12 c0 movw $0x3b4,0xc012b526 -c01016ff: b4 03 -c0101701: eb 13 jmp c0101716 +c0100e42: 66 c7 05 46 b4 12 c0 movw $0x3b4,0xc012b446 +c0100e49: b4 03 +c0100e4b: eb 13 jmp c0100e60 } else { *cp = was; -c0101703: 8b 45 fc mov -0x4(%ebp),%eax -c0101706: 0f b7 55 fa movzwl -0x6(%ebp),%edx -c010170a: 66 89 10 mov %dx,(%eax) +c0100e4d: 8b 45 fc mov -0x4(%ebp),%eax +c0100e50: 0f b7 55 fa movzwl -0x6(%ebp),%edx +c0100e54: 66 89 10 mov %dx,(%eax) addr_6845 = CGA_BASE; -c010170d: 66 c7 05 26 b5 12 c0 movw $0x3d4,0xc012b526 -c0101714: d4 03 +c0100e57: 66 c7 05 46 b4 12 c0 movw $0x3d4,0xc012b446 +c0100e5e: d4 03 } // Extract cursor location uint32_t pos; outb(addr_6845, 14); -c0101716: 0f b7 05 26 b5 12 c0 movzwl 0xc012b526,%eax -c010171d: 66 89 45 e6 mov %ax,-0x1a(%ebp) -c0101721: c6 45 e5 0e movb $0xe,-0x1b(%ebp) +c0100e60: 0f b7 05 46 b4 12 c0 movzwl 0xc012b446,%eax +c0100e67: 66 89 45 e6 mov %ax,-0x1a(%ebp) +c0100e6b: c6 45 e5 0e movb $0xe,-0x1b(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0101725: 0f b6 45 e5 movzbl -0x1b(%ebp),%eax -c0101729: 0f b7 55 e6 movzwl -0x1a(%ebp),%edx -c010172d: ee out %al,(%dx) +c0100e6f: 0f b6 45 e5 movzbl -0x1b(%ebp),%eax +c0100e73: 0f b7 55 e6 movzwl -0x1a(%ebp),%edx +c0100e77: ee out %al,(%dx) } -c010172e: 90 nop +c0100e78: 90 nop pos = inb(addr_6845 + 1) << 8; -c010172f: 0f b7 05 26 b5 12 c0 movzwl 0xc012b526,%eax -c0101736: 40 inc %eax -c0101737: 0f b7 c0 movzwl %ax,%eax -c010173a: 66 89 45 ea mov %ax,-0x16(%ebp) +c0100e79: 0f b7 05 46 b4 12 c0 movzwl 0xc012b446,%eax +c0100e80: 40 inc %eax +c0100e81: 0f b7 c0 movzwl %ax,%eax +c0100e84: 66 89 45 ea mov %ax,-0x16(%ebp) asm volatile ("inb %1, %0" : "=a" (data) : "d" (port) : "memory"); -c010173e: 0f b7 45 ea movzwl -0x16(%ebp),%eax -c0101742: 89 c2 mov %eax,%edx -c0101744: ec in (%dx),%al -c0101745: 88 45 e9 mov %al,-0x17(%ebp) +c0100e88: 0f b7 45 ea movzwl -0x16(%ebp),%eax +c0100e8c: 89 c2 mov %eax,%edx +c0100e8e: ec in (%dx),%al +c0100e8f: 88 45 e9 mov %al,-0x17(%ebp) return data; -c0101748: 0f b6 45 e9 movzbl -0x17(%ebp),%eax -c010174c: 0f b6 c0 movzbl %al,%eax -c010174f: c1 e0 08 shl $0x8,%eax -c0101752: 89 45 f4 mov %eax,-0xc(%ebp) +c0100e92: 0f b6 45 e9 movzbl -0x17(%ebp),%eax +c0100e96: 0f b6 c0 movzbl %al,%eax +c0100e99: c1 e0 08 shl $0x8,%eax +c0100e9c: 89 45 f4 mov %eax,-0xc(%ebp) outb(addr_6845, 15); -c0101755: 0f b7 05 26 b5 12 c0 movzwl 0xc012b526,%eax -c010175c: 66 89 45 ee mov %ax,-0x12(%ebp) -c0101760: c6 45 ed 0f movb $0xf,-0x13(%ebp) +c0100e9f: 0f b7 05 46 b4 12 c0 movzwl 0xc012b446,%eax +c0100ea6: 66 89 45 ee mov %ax,-0x12(%ebp) +c0100eaa: c6 45 ed 0f movb $0xf,-0x13(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0101764: 0f b6 45 ed movzbl -0x13(%ebp),%eax -c0101768: 0f b7 55 ee movzwl -0x12(%ebp),%edx -c010176c: ee out %al,(%dx) +c0100eae: 0f b6 45 ed movzbl -0x13(%ebp),%eax +c0100eb2: 0f b7 55 ee movzwl -0x12(%ebp),%edx +c0100eb6: ee out %al,(%dx) } -c010176d: 90 nop +c0100eb7: 90 nop pos |= inb(addr_6845 + 1); -c010176e: 0f b7 05 26 b5 12 c0 movzwl 0xc012b526,%eax -c0101775: 40 inc %eax -c0101776: 0f b7 c0 movzwl %ax,%eax -c0101779: 66 89 45 f2 mov %ax,-0xe(%ebp) +c0100eb8: 0f b7 05 46 b4 12 c0 movzwl 0xc012b446,%eax +c0100ebf: 40 inc %eax +c0100ec0: 0f b7 c0 movzwl %ax,%eax +c0100ec3: 66 89 45 f2 mov %ax,-0xe(%ebp) asm volatile ("inb %1, %0" : "=a" (data) : "d" (port) : "memory"); -c010177d: 0f b7 45 f2 movzwl -0xe(%ebp),%eax -c0101781: 89 c2 mov %eax,%edx -c0101783: ec in (%dx),%al -c0101784: 88 45 f1 mov %al,-0xf(%ebp) +c0100ec7: 0f b7 45 f2 movzwl -0xe(%ebp),%eax +c0100ecb: 89 c2 mov %eax,%edx +c0100ecd: ec in (%dx),%al +c0100ece: 88 45 f1 mov %al,-0xf(%ebp) return data; -c0101787: 0f b6 45 f1 movzbl -0xf(%ebp),%eax -c010178b: 0f b6 c0 movzbl %al,%eax -c010178e: 09 45 f4 or %eax,-0xc(%ebp) +c0100ed1: 0f b6 45 f1 movzbl -0xf(%ebp),%eax +c0100ed5: 0f b6 c0 movzbl %al,%eax +c0100ed8: 09 45 f4 or %eax,-0xc(%ebp) crt_buf = (uint16_t*) cp; -c0101791: 8b 45 fc mov -0x4(%ebp),%eax -c0101794: a3 20 b5 12 c0 mov %eax,0xc012b520 +c0100edb: 8b 45 fc mov -0x4(%ebp),%eax +c0100ede: a3 40 b4 12 c0 mov %eax,0xc012b440 crt_pos = pos; -c0101799: 8b 45 f4 mov -0xc(%ebp),%eax -c010179c: 0f b7 c0 movzwl %ax,%eax -c010179f: 66 a3 24 b5 12 c0 mov %ax,0xc012b524 +c0100ee3: 8b 45 f4 mov -0xc(%ebp),%eax +c0100ee6: 0f b7 c0 movzwl %ax,%eax +c0100ee9: 66 a3 44 b4 12 c0 mov %ax,0xc012b444 } -c01017a5: 90 nop -c01017a6: c9 leave -c01017a7: c3 ret +c0100eef: 90 nop +c0100ef0: 89 ec mov %ebp,%esp +c0100ef2: 5d pop %ebp +c0100ef3: c3 ret -c01017a8 : +c0100ef4 : static bool serial_exists = 0; static void serial_init(void) { -c01017a8: f3 0f 1e fb endbr32 -c01017ac: 55 push %ebp -c01017ad: 89 e5 mov %esp,%ebp -c01017af: 83 ec 48 sub $0x48,%esp -c01017b2: 66 c7 45 d2 fa 03 movw $0x3fa,-0x2e(%ebp) -c01017b8: c6 45 d1 00 movb $0x0,-0x2f(%ebp) +c0100ef4: 55 push %ebp +c0100ef5: 89 e5 mov %esp,%ebp +c0100ef7: 83 ec 48 sub $0x48,%esp +c0100efa: 66 c7 45 d2 fa 03 movw $0x3fa,-0x2e(%ebp) +c0100f00: c6 45 d1 00 movb $0x0,-0x2f(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c01017bc: 0f b6 45 d1 movzbl -0x2f(%ebp),%eax -c01017c0: 0f b7 55 d2 movzwl -0x2e(%ebp),%edx -c01017c4: ee out %al,(%dx) +c0100f04: 0f b6 45 d1 movzbl -0x2f(%ebp),%eax +c0100f08: 0f b7 55 d2 movzwl -0x2e(%ebp),%edx +c0100f0c: ee out %al,(%dx) } -c01017c5: 90 nop -c01017c6: 66 c7 45 d6 fb 03 movw $0x3fb,-0x2a(%ebp) -c01017cc: c6 45 d5 80 movb $0x80,-0x2b(%ebp) +c0100f0d: 90 nop +c0100f0e: 66 c7 45 d6 fb 03 movw $0x3fb,-0x2a(%ebp) +c0100f14: c6 45 d5 80 movb $0x80,-0x2b(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c01017d0: 0f b6 45 d5 movzbl -0x2b(%ebp),%eax -c01017d4: 0f b7 55 d6 movzwl -0x2a(%ebp),%edx -c01017d8: ee out %al,(%dx) +c0100f18: 0f b6 45 d5 movzbl -0x2b(%ebp),%eax +c0100f1c: 0f b7 55 d6 movzwl -0x2a(%ebp),%edx +c0100f20: ee out %al,(%dx) } -c01017d9: 90 nop -c01017da: 66 c7 45 da f8 03 movw $0x3f8,-0x26(%ebp) -c01017e0: c6 45 d9 0c movb $0xc,-0x27(%ebp) +c0100f21: 90 nop +c0100f22: 66 c7 45 da f8 03 movw $0x3f8,-0x26(%ebp) +c0100f28: c6 45 d9 0c movb $0xc,-0x27(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c01017e4: 0f b6 45 d9 movzbl -0x27(%ebp),%eax -c01017e8: 0f b7 55 da movzwl -0x26(%ebp),%edx -c01017ec: ee out %al,(%dx) +c0100f2c: 0f b6 45 d9 movzbl -0x27(%ebp),%eax +c0100f30: 0f b7 55 da movzwl -0x26(%ebp),%edx +c0100f34: ee out %al,(%dx) } -c01017ed: 90 nop -c01017ee: 66 c7 45 de f9 03 movw $0x3f9,-0x22(%ebp) -c01017f4: c6 45 dd 00 movb $0x0,-0x23(%ebp) +c0100f35: 90 nop +c0100f36: 66 c7 45 de f9 03 movw $0x3f9,-0x22(%ebp) +c0100f3c: c6 45 dd 00 movb $0x0,-0x23(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c01017f8: 0f b6 45 dd movzbl -0x23(%ebp),%eax -c01017fc: 0f b7 55 de movzwl -0x22(%ebp),%edx -c0101800: ee out %al,(%dx) +c0100f40: 0f b6 45 dd movzbl -0x23(%ebp),%eax +c0100f44: 0f b7 55 de movzwl -0x22(%ebp),%edx +c0100f48: ee out %al,(%dx) } -c0101801: 90 nop -c0101802: 66 c7 45 e2 fb 03 movw $0x3fb,-0x1e(%ebp) -c0101808: c6 45 e1 03 movb $0x3,-0x1f(%ebp) +c0100f49: 90 nop +c0100f4a: 66 c7 45 e2 fb 03 movw $0x3fb,-0x1e(%ebp) +c0100f50: c6 45 e1 03 movb $0x3,-0x1f(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c010180c: 0f b6 45 e1 movzbl -0x1f(%ebp),%eax -c0101810: 0f b7 55 e2 movzwl -0x1e(%ebp),%edx -c0101814: ee out %al,(%dx) +c0100f54: 0f b6 45 e1 movzbl -0x1f(%ebp),%eax +c0100f58: 0f b7 55 e2 movzwl -0x1e(%ebp),%edx +c0100f5c: ee out %al,(%dx) } -c0101815: 90 nop -c0101816: 66 c7 45 e6 fc 03 movw $0x3fc,-0x1a(%ebp) -c010181c: c6 45 e5 00 movb $0x0,-0x1b(%ebp) +c0100f5d: 90 nop +c0100f5e: 66 c7 45 e6 fc 03 movw $0x3fc,-0x1a(%ebp) +c0100f64: c6 45 e5 00 movb $0x0,-0x1b(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0101820: 0f b6 45 e5 movzbl -0x1b(%ebp),%eax -c0101824: 0f b7 55 e6 movzwl -0x1a(%ebp),%edx -c0101828: ee out %al,(%dx) +c0100f68: 0f b6 45 e5 movzbl -0x1b(%ebp),%eax +c0100f6c: 0f b7 55 e6 movzwl -0x1a(%ebp),%edx +c0100f70: ee out %al,(%dx) } -c0101829: 90 nop -c010182a: 66 c7 45 ea f9 03 movw $0x3f9,-0x16(%ebp) -c0101830: c6 45 e9 01 movb $0x1,-0x17(%ebp) +c0100f71: 90 nop +c0100f72: 66 c7 45 ea f9 03 movw $0x3f9,-0x16(%ebp) +c0100f78: c6 45 e9 01 movb $0x1,-0x17(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0101834: 0f b6 45 e9 movzbl -0x17(%ebp),%eax -c0101838: 0f b7 55 ea movzwl -0x16(%ebp),%edx -c010183c: ee out %al,(%dx) +c0100f7c: 0f b6 45 e9 movzbl -0x17(%ebp),%eax +c0100f80: 0f b7 55 ea movzwl -0x16(%ebp),%edx +c0100f84: ee out %al,(%dx) } -c010183d: 90 nop -c010183e: 66 c7 45 ee fd 03 movw $0x3fd,-0x12(%ebp) +c0100f85: 90 nop +c0100f86: 66 c7 45 ee fd 03 movw $0x3fd,-0x12(%ebp) asm volatile ("inb %1, %0" : "=a" (data) : "d" (port) : "memory"); -c0101844: 0f b7 45 ee movzwl -0x12(%ebp),%eax -c0101848: 89 c2 mov %eax,%edx -c010184a: ec in (%dx),%al -c010184b: 88 45 ed mov %al,-0x13(%ebp) +c0100f8c: 0f b7 45 ee movzwl -0x12(%ebp),%eax +c0100f90: 89 c2 mov %eax,%edx +c0100f92: ec in (%dx),%al +c0100f93: 88 45 ed mov %al,-0x13(%ebp) return data; -c010184e: 0f b6 45 ed movzbl -0x13(%ebp),%eax +c0100f96: 0f b6 45 ed movzbl -0x13(%ebp),%eax // Enable rcv interrupts outb(COM1 + COM_IER, COM_IER_RDI); // Clear any preexisting overrun indications and interrupts // Serial port doesn't exist if COM_LSR returns 0xFF serial_exists = (inb(COM1 + COM_LSR) != 0xFF); -c0101852: 3c ff cmp $0xff,%al -c0101854: 0f 95 c0 setne %al -c0101857: 0f b6 c0 movzbl %al,%eax -c010185a: a3 28 b5 12 c0 mov %eax,0xc012b528 -c010185f: 66 c7 45 f2 fa 03 movw $0x3fa,-0xe(%ebp) +c0100f9a: 3c ff cmp $0xff,%al +c0100f9c: 0f 95 c0 setne %al +c0100f9f: 0f b6 c0 movzbl %al,%eax +c0100fa2: a3 48 b4 12 c0 mov %eax,0xc012b448 +c0100fa7: 66 c7 45 f2 fa 03 movw $0x3fa,-0xe(%ebp) asm volatile ("inb %1, %0" : "=a" (data) : "d" (port) : "memory"); -c0101865: 0f b7 45 f2 movzwl -0xe(%ebp),%eax -c0101869: 89 c2 mov %eax,%edx -c010186b: ec in (%dx),%al -c010186c: 88 45 f1 mov %al,-0xf(%ebp) -c010186f: 66 c7 45 f6 f8 03 movw $0x3f8,-0xa(%ebp) -c0101875: 0f b7 45 f6 movzwl -0xa(%ebp),%eax -c0101879: 89 c2 mov %eax,%edx -c010187b: ec in (%dx),%al -c010187c: 88 45 f5 mov %al,-0xb(%ebp) +c0100fad: 0f b7 45 f2 movzwl -0xe(%ebp),%eax +c0100fb1: 89 c2 mov %eax,%edx +c0100fb3: ec in (%dx),%al +c0100fb4: 88 45 f1 mov %al,-0xf(%ebp) +c0100fb7: 66 c7 45 f6 f8 03 movw $0x3f8,-0xa(%ebp) +c0100fbd: 0f b7 45 f6 movzwl -0xa(%ebp),%eax +c0100fc1: 89 c2 mov %eax,%edx +c0100fc3: ec in (%dx),%al +c0100fc4: 88 45 f5 mov %al,-0xb(%ebp) (void) inb(COM1+COM_IIR); (void) inb(COM1+COM_RX); if (serial_exists) { -c010187f: a1 28 b5 12 c0 mov 0xc012b528,%eax -c0101884: 85 c0 test %eax,%eax -c0101886: 74 0c je c0101894 +c0100fc7: a1 48 b4 12 c0 mov 0xc012b448,%eax +c0100fcc: 85 c0 test %eax,%eax +c0100fce: 74 0c je c0100fdc pic_enable(IRQ_COM1); -c0101888: c7 04 24 04 00 00 00 movl $0x4,(%esp) -c010188f: e8 31 07 00 00 call c0101fc5 +c0100fd0: c7 04 24 04 00 00 00 movl $0x4,(%esp) +c0100fd7: e8 84 0f 00 00 call c0101f60 } } -c0101894: 90 nop -c0101895: c9 leave -c0101896: c3 ret +c0100fdc: 90 nop +c0100fdd: 89 ec mov %ebp,%esp +c0100fdf: 5d pop %ebp +c0100fe0: c3 ret -c0101897 : +c0100fe1 : static void lpt_putc_sub(int c) { -c0101897: f3 0f 1e fb endbr32 -c010189b: 55 push %ebp -c010189c: 89 e5 mov %esp,%ebp -c010189e: 83 ec 20 sub $0x20,%esp +c0100fe1: 55 push %ebp +c0100fe2: 89 e5 mov %esp,%ebp +c0100fe4: 83 ec 20 sub $0x20,%esp int i; for (i = 0; !(inb(LPTPORT + 1) & 0x80) && i < 12800; i ++) { -c01018a1: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) -c01018a8: eb 08 jmp c01018b2 +c0100fe7: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) +c0100fee: eb 08 jmp c0100ff8 delay(); -c01018aa: e8 c2 fd ff ff call c0101671 +c0100ff0: e8 cc fd ff ff call c0100dc1 for (i = 0; !(inb(LPTPORT + 1) & 0x80) && i < 12800; i ++) { -c01018af: ff 45 fc incl -0x4(%ebp) -c01018b2: 66 c7 45 fa 79 03 movw $0x379,-0x6(%ebp) -c01018b8: 0f b7 45 fa movzwl -0x6(%ebp),%eax -c01018bc: 89 c2 mov %eax,%edx -c01018be: ec in (%dx),%al -c01018bf: 88 45 f9 mov %al,-0x7(%ebp) +c0100ff5: ff 45 fc incl -0x4(%ebp) +c0100ff8: 66 c7 45 fa 79 03 movw $0x379,-0x6(%ebp) +c0100ffe: 0f b7 45 fa movzwl -0x6(%ebp),%eax +c0101002: 89 c2 mov %eax,%edx +c0101004: ec in (%dx),%al +c0101005: 88 45 f9 mov %al,-0x7(%ebp) return data; -c01018c2: 0f b6 45 f9 movzbl -0x7(%ebp),%eax -c01018c6: 84 c0 test %al,%al -c01018c8: 78 09 js c01018d3 -c01018ca: 81 7d fc ff 31 00 00 cmpl $0x31ff,-0x4(%ebp) -c01018d1: 7e d7 jle c01018aa +c0101008: 0f b6 45 f9 movzbl -0x7(%ebp),%eax +c010100c: 84 c0 test %al,%al +c010100e: 78 09 js c0101019 +c0101010: 81 7d fc ff 31 00 00 cmpl $0x31ff,-0x4(%ebp) +c0101017: 7e d7 jle c0100ff0 } outb(LPTPORT + 0, c); -c01018d3: 8b 45 08 mov 0x8(%ebp),%eax -c01018d6: 0f b6 c0 movzbl %al,%eax -c01018d9: 66 c7 45 ee 78 03 movw $0x378,-0x12(%ebp) -c01018df: 88 45 ed mov %al,-0x13(%ebp) +c0101019: 8b 45 08 mov 0x8(%ebp),%eax +c010101c: 0f b6 c0 movzbl %al,%eax +c010101f: 66 c7 45 ee 78 03 movw $0x378,-0x12(%ebp) +c0101025: 88 45 ed mov %al,-0x13(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c01018e2: 0f b6 45 ed movzbl -0x13(%ebp),%eax -c01018e6: 0f b7 55 ee movzwl -0x12(%ebp),%edx -c01018ea: ee out %al,(%dx) +c0101028: 0f b6 45 ed movzbl -0x13(%ebp),%eax +c010102c: 0f b7 55 ee movzwl -0x12(%ebp),%edx +c0101030: ee out %al,(%dx) } -c01018eb: 90 nop -c01018ec: 66 c7 45 f2 7a 03 movw $0x37a,-0xe(%ebp) -c01018f2: c6 45 f1 0d movb $0xd,-0xf(%ebp) +c0101031: 90 nop +c0101032: 66 c7 45 f2 7a 03 movw $0x37a,-0xe(%ebp) +c0101038: c6 45 f1 0d movb $0xd,-0xf(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c01018f6: 0f b6 45 f1 movzbl -0xf(%ebp),%eax -c01018fa: 0f b7 55 f2 movzwl -0xe(%ebp),%edx -c01018fe: ee out %al,(%dx) +c010103c: 0f b6 45 f1 movzbl -0xf(%ebp),%eax +c0101040: 0f b7 55 f2 movzwl -0xe(%ebp),%edx +c0101044: ee out %al,(%dx) } -c01018ff: 90 nop -c0101900: 66 c7 45 f6 7a 03 movw $0x37a,-0xa(%ebp) -c0101906: c6 45 f5 08 movb $0x8,-0xb(%ebp) +c0101045: 90 nop +c0101046: 66 c7 45 f6 7a 03 movw $0x37a,-0xa(%ebp) +c010104c: c6 45 f5 08 movb $0x8,-0xb(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c010190a: 0f b6 45 f5 movzbl -0xb(%ebp),%eax -c010190e: 0f b7 55 f6 movzwl -0xa(%ebp),%edx -c0101912: ee out %al,(%dx) +c0101050: 0f b6 45 f5 movzbl -0xb(%ebp),%eax +c0101054: 0f b7 55 f6 movzwl -0xa(%ebp),%edx +c0101058: ee out %al,(%dx) } -c0101913: 90 nop +c0101059: 90 nop outb(LPTPORT + 2, 0x08 | 0x04 | 0x01); outb(LPTPORT + 2, 0x08); } -c0101914: 90 nop -c0101915: c9 leave -c0101916: c3 ret +c010105a: 90 nop +c010105b: 89 ec mov %ebp,%esp +c010105d: 5d pop %ebp +c010105e: c3 ret -c0101917 : +c010105f : /* lpt_putc - copy console output to parallel port */ static void lpt_putc(int c) { -c0101917: f3 0f 1e fb endbr32 -c010191b: 55 push %ebp -c010191c: 89 e5 mov %esp,%ebp -c010191e: 83 ec 04 sub $0x4,%esp +c010105f: 55 push %ebp +c0101060: 89 e5 mov %esp,%ebp +c0101062: 83 ec 04 sub $0x4,%esp if (c != '\b') { -c0101921: 83 7d 08 08 cmpl $0x8,0x8(%ebp) -c0101925: 74 0d je c0101934 +c0101065: 83 7d 08 08 cmpl $0x8,0x8(%ebp) +c0101069: 74 0d je c0101078 lpt_putc_sub(c); -c0101927: 8b 45 08 mov 0x8(%ebp),%eax -c010192a: 89 04 24 mov %eax,(%esp) -c010192d: e8 65 ff ff ff call c0101897 +c010106b: 8b 45 08 mov 0x8(%ebp),%eax +c010106e: 89 04 24 mov %eax,(%esp) +c0101071: e8 6b ff ff ff call c0100fe1 else { lpt_putc_sub('\b'); lpt_putc_sub(' '); lpt_putc_sub('\b'); } } -c0101932: eb 24 jmp c0101958 +c0101076: eb 24 jmp c010109c lpt_putc_sub('\b'); -c0101934: c7 04 24 08 00 00 00 movl $0x8,(%esp) -c010193b: e8 57 ff ff ff call c0101897 +c0101078: c7 04 24 08 00 00 00 movl $0x8,(%esp) +c010107f: e8 5d ff ff ff call c0100fe1 lpt_putc_sub(' '); -c0101940: c7 04 24 20 00 00 00 movl $0x20,(%esp) -c0101947: e8 4b ff ff ff call c0101897 +c0101084: c7 04 24 20 00 00 00 movl $0x20,(%esp) +c010108b: e8 51 ff ff ff call c0100fe1 lpt_putc_sub('\b'); -c010194c: c7 04 24 08 00 00 00 movl $0x8,(%esp) -c0101953: e8 3f ff ff ff call c0101897 +c0101090: c7 04 24 08 00 00 00 movl $0x8,(%esp) +c0101097: e8 45 ff ff ff call c0100fe1 } -c0101958: 90 nop -c0101959: c9 leave -c010195a: c3 ret +c010109c: 90 nop +c010109d: 89 ec mov %ebp,%esp +c010109f: 5d pop %ebp +c01010a0: c3 ret -c010195b : +c01010a1 : /* cga_putc - print character to console */ static void cga_putc(int c) { -c010195b: f3 0f 1e fb endbr32 -c010195f: 55 push %ebp -c0101960: 89 e5 mov %esp,%ebp -c0101962: 53 push %ebx -c0101963: 83 ec 34 sub $0x34,%esp +c01010a1: 55 push %ebp +c01010a2: 89 e5 mov %esp,%ebp +c01010a4: 83 ec 38 sub $0x38,%esp +c01010a7: 89 5d fc mov %ebx,-0x4(%ebp) // set black on white if (!(c & ~0xFF)) { -c0101966: 8b 45 08 mov 0x8(%ebp),%eax -c0101969: 25 00 ff ff ff and $0xffffff00,%eax -c010196e: 85 c0 test %eax,%eax -c0101970: 75 07 jne c0101979 +c01010aa: 8b 45 08 mov 0x8(%ebp),%eax +c01010ad: 25 00 ff ff ff and $0xffffff00,%eax +c01010b2: 85 c0 test %eax,%eax +c01010b4: 75 07 jne c01010bd c |= 0x0700; -c0101972: 81 4d 08 00 07 00 00 orl $0x700,0x8(%ebp) +c01010b6: 81 4d 08 00 07 00 00 orl $0x700,0x8(%ebp) } switch (c & 0xff) { -c0101979: 8b 45 08 mov 0x8(%ebp),%eax -c010197c: 0f b6 c0 movzbl %al,%eax -c010197f: 83 f8 0d cmp $0xd,%eax -c0101982: 74 72 je c01019f6 -c0101984: 83 f8 0d cmp $0xd,%eax -c0101987: 0f 8f a3 00 00 00 jg c0101a30 -c010198d: 83 f8 08 cmp $0x8,%eax -c0101990: 74 0a je c010199c -c0101992: 83 f8 0a cmp $0xa,%eax -c0101995: 74 4c je c01019e3 -c0101997: e9 94 00 00 00 jmp c0101a30 +c01010bd: 8b 45 08 mov 0x8(%ebp),%eax +c01010c0: 0f b6 c0 movzbl %al,%eax +c01010c3: 83 f8 0d cmp $0xd,%eax +c01010c6: 74 72 je c010113a +c01010c8: 83 f8 0d cmp $0xd,%eax +c01010cb: 0f 8f a3 00 00 00 jg c0101174 +c01010d1: 83 f8 08 cmp $0x8,%eax +c01010d4: 74 0a je c01010e0 +c01010d6: 83 f8 0a cmp $0xa,%eax +c01010d9: 74 4c je c0101127 +c01010db: e9 94 00 00 00 jmp c0101174 case '\b': if (crt_pos > 0) { -c010199c: 0f b7 05 24 b5 12 c0 movzwl 0xc012b524,%eax -c01019a3: 85 c0 test %eax,%eax -c01019a5: 0f 84 af 00 00 00 je c0101a5a +c01010e0: 0f b7 05 44 b4 12 c0 movzwl 0xc012b444,%eax +c01010e7: 85 c0 test %eax,%eax +c01010e9: 0f 84 af 00 00 00 je c010119e crt_pos --; -c01019ab: 0f b7 05 24 b5 12 c0 movzwl 0xc012b524,%eax -c01019b2: 48 dec %eax -c01019b3: 0f b7 c0 movzwl %ax,%eax -c01019b6: 66 a3 24 b5 12 c0 mov %ax,0xc012b524 +c01010ef: 0f b7 05 44 b4 12 c0 movzwl 0xc012b444,%eax +c01010f6: 48 dec %eax +c01010f7: 0f b7 c0 movzwl %ax,%eax +c01010fa: 66 a3 44 b4 12 c0 mov %ax,0xc012b444 crt_buf[crt_pos] = (c & ~0xff) | ' '; -c01019bc: 8b 45 08 mov 0x8(%ebp),%eax -c01019bf: 98 cwtl -c01019c0: 25 00 ff ff ff and $0xffffff00,%eax -c01019c5: 98 cwtl -c01019c6: 83 c8 20 or $0x20,%eax -c01019c9: 98 cwtl -c01019ca: 8b 15 20 b5 12 c0 mov 0xc012b520,%edx -c01019d0: 0f b7 0d 24 b5 12 c0 movzwl 0xc012b524,%ecx -c01019d7: 01 c9 add %ecx,%ecx -c01019d9: 01 ca add %ecx,%edx -c01019db: 0f b7 c0 movzwl %ax,%eax -c01019de: 66 89 02 mov %ax,(%edx) +c0101100: 8b 45 08 mov 0x8(%ebp),%eax +c0101103: 98 cwtl +c0101104: 25 00 ff ff ff and $0xffffff00,%eax +c0101109: 98 cwtl +c010110a: 83 c8 20 or $0x20,%eax +c010110d: 98 cwtl +c010110e: 8b 0d 40 b4 12 c0 mov 0xc012b440,%ecx +c0101114: 0f b7 15 44 b4 12 c0 movzwl 0xc012b444,%edx +c010111b: 01 d2 add %edx,%edx +c010111d: 01 ca add %ecx,%edx +c010111f: 0f b7 c0 movzwl %ax,%eax +c0101122: 66 89 02 mov %ax,(%edx) } break; -c01019e1: eb 77 jmp c0101a5a +c0101125: eb 77 jmp c010119e case '\n': crt_pos += CRT_COLS; -c01019e3: 0f b7 05 24 b5 12 c0 movzwl 0xc012b524,%eax -c01019ea: 83 c0 50 add $0x50,%eax -c01019ed: 0f b7 c0 movzwl %ax,%eax -c01019f0: 66 a3 24 b5 12 c0 mov %ax,0xc012b524 +c0101127: 0f b7 05 44 b4 12 c0 movzwl 0xc012b444,%eax +c010112e: 83 c0 50 add $0x50,%eax +c0101131: 0f b7 c0 movzwl %ax,%eax +c0101134: 66 a3 44 b4 12 c0 mov %ax,0xc012b444 case '\r': crt_pos -= (crt_pos % CRT_COLS); -c01019f6: 0f b7 1d 24 b5 12 c0 movzwl 0xc012b524,%ebx -c01019fd: 0f b7 0d 24 b5 12 c0 movzwl 0xc012b524,%ecx -c0101a04: ba cd cc cc cc mov $0xcccccccd,%edx -c0101a09: 89 c8 mov %ecx,%eax -c0101a0b: f7 e2 mul %edx -c0101a0d: c1 ea 06 shr $0x6,%edx -c0101a10: 89 d0 mov %edx,%eax -c0101a12: c1 e0 02 shl $0x2,%eax -c0101a15: 01 d0 add %edx,%eax -c0101a17: c1 e0 04 shl $0x4,%eax -c0101a1a: 29 c1 sub %eax,%ecx -c0101a1c: 89 c8 mov %ecx,%eax -c0101a1e: 0f b7 c0 movzwl %ax,%eax -c0101a21: 29 c3 sub %eax,%ebx -c0101a23: 89 d8 mov %ebx,%eax -c0101a25: 0f b7 c0 movzwl %ax,%eax -c0101a28: 66 a3 24 b5 12 c0 mov %ax,0xc012b524 +c010113a: 0f b7 1d 44 b4 12 c0 movzwl 0xc012b444,%ebx +c0101141: 0f b7 0d 44 b4 12 c0 movzwl 0xc012b444,%ecx +c0101148: ba cd cc cc cc mov $0xcccccccd,%edx +c010114d: 89 c8 mov %ecx,%eax +c010114f: f7 e2 mul %edx +c0101151: c1 ea 06 shr $0x6,%edx +c0101154: 89 d0 mov %edx,%eax +c0101156: c1 e0 02 shl $0x2,%eax +c0101159: 01 d0 add %edx,%eax +c010115b: c1 e0 04 shl $0x4,%eax +c010115e: 29 c1 sub %eax,%ecx +c0101160: 89 ca mov %ecx,%edx +c0101162: 0f b7 d2 movzwl %dx,%edx +c0101165: 89 d8 mov %ebx,%eax +c0101167: 29 d0 sub %edx,%eax +c0101169: 0f b7 c0 movzwl %ax,%eax +c010116c: 66 a3 44 b4 12 c0 mov %ax,0xc012b444 break; -c0101a2e: eb 2b jmp c0101a5b +c0101172: eb 2b jmp c010119f default: crt_buf[crt_pos ++] = c; // write the character -c0101a30: 8b 0d 20 b5 12 c0 mov 0xc012b520,%ecx -c0101a36: 0f b7 05 24 b5 12 c0 movzwl 0xc012b524,%eax -c0101a3d: 8d 50 01 lea 0x1(%eax),%edx -c0101a40: 0f b7 d2 movzwl %dx,%edx -c0101a43: 66 89 15 24 b5 12 c0 mov %dx,0xc012b524 -c0101a4a: 01 c0 add %eax,%eax -c0101a4c: 8d 14 01 lea (%ecx,%eax,1),%edx -c0101a4f: 8b 45 08 mov 0x8(%ebp),%eax -c0101a52: 0f b7 c0 movzwl %ax,%eax -c0101a55: 66 89 02 mov %ax,(%edx) +c0101174: 8b 0d 40 b4 12 c0 mov 0xc012b440,%ecx +c010117a: 0f b7 05 44 b4 12 c0 movzwl 0xc012b444,%eax +c0101181: 8d 50 01 lea 0x1(%eax),%edx +c0101184: 0f b7 d2 movzwl %dx,%edx +c0101187: 66 89 15 44 b4 12 c0 mov %dx,0xc012b444 +c010118e: 01 c0 add %eax,%eax +c0101190: 8d 14 01 lea (%ecx,%eax,1),%edx +c0101193: 8b 45 08 mov 0x8(%ebp),%eax +c0101196: 0f b7 c0 movzwl %ax,%eax +c0101199: 66 89 02 mov %ax,(%edx) break; -c0101a58: eb 01 jmp c0101a5b +c010119c: eb 01 jmp c010119f break; -c0101a5a: 90 nop +c010119e: 90 nop } // What is the purpose of this? if (crt_pos >= CRT_SIZE) { -c0101a5b: 0f b7 05 24 b5 12 c0 movzwl 0xc012b524,%eax -c0101a62: 3d cf 07 00 00 cmp $0x7cf,%eax -c0101a67: 76 5d jbe c0101ac6 +c010119f: 0f b7 05 44 b4 12 c0 movzwl 0xc012b444,%eax +c01011a6: 3d cf 07 00 00 cmp $0x7cf,%eax +c01011ab: 76 5e jbe c010120b int i; memmove(crt_buf, crt_buf + CRT_COLS, (CRT_SIZE - CRT_COLS) * sizeof(uint16_t)); -c0101a69: a1 20 b5 12 c0 mov 0xc012b520,%eax -c0101a6e: 8d 90 a0 00 00 00 lea 0xa0(%eax),%edx -c0101a74: a1 20 b5 12 c0 mov 0xc012b520,%eax -c0101a79: c7 44 24 08 00 0f 00 movl $0xf00,0x8(%esp) -c0101a80: 00 -c0101a81: 89 54 24 04 mov %edx,0x4(%esp) -c0101a85: 89 04 24 mov %eax,(%esp) -c0101a88: e8 0a 7f 00 00 call c0109997 +c01011ad: a1 40 b4 12 c0 mov 0xc012b440,%eax +c01011b2: 8d 90 a0 00 00 00 lea 0xa0(%eax),%edx +c01011b8: a1 40 b4 12 c0 mov 0xc012b440,%eax +c01011bd: c7 44 24 08 00 0f 00 movl $0xf00,0x8(%esp) +c01011c4: 00 +c01011c5: 89 54 24 04 mov %edx,0x4(%esp) +c01011c9: 89 04 24 mov %eax,(%esp) +c01011cc: e8 55 8d 00 00 call c0109f26 for (i = CRT_SIZE - CRT_COLS; i < CRT_SIZE; i ++) { -c0101a8d: c7 45 f4 80 07 00 00 movl $0x780,-0xc(%ebp) -c0101a94: eb 14 jmp c0101aaa +c01011d1: c7 45 f4 80 07 00 00 movl $0x780,-0xc(%ebp) +c01011d8: eb 15 jmp c01011ef crt_buf[i] = 0x0700 | ' '; -c0101a96: a1 20 b5 12 c0 mov 0xc012b520,%eax -c0101a9b: 8b 55 f4 mov -0xc(%ebp),%edx -c0101a9e: 01 d2 add %edx,%edx -c0101aa0: 01 d0 add %edx,%eax -c0101aa2: 66 c7 00 20 07 movw $0x720,(%eax) +c01011da: 8b 15 40 b4 12 c0 mov 0xc012b440,%edx +c01011e0: 8b 45 f4 mov -0xc(%ebp),%eax +c01011e3: 01 c0 add %eax,%eax +c01011e5: 01 d0 add %edx,%eax +c01011e7: 66 c7 00 20 07 movw $0x720,(%eax) for (i = CRT_SIZE - CRT_COLS; i < CRT_SIZE; i ++) { -c0101aa7: ff 45 f4 incl -0xc(%ebp) -c0101aaa: 81 7d f4 cf 07 00 00 cmpl $0x7cf,-0xc(%ebp) -c0101ab1: 7e e3 jle c0101a96 +c01011ec: ff 45 f4 incl -0xc(%ebp) +c01011ef: 81 7d f4 cf 07 00 00 cmpl $0x7cf,-0xc(%ebp) +c01011f6: 7e e2 jle c01011da } crt_pos -= CRT_COLS; -c0101ab3: 0f b7 05 24 b5 12 c0 movzwl 0xc012b524,%eax -c0101aba: 83 e8 50 sub $0x50,%eax -c0101abd: 0f b7 c0 movzwl %ax,%eax -c0101ac0: 66 a3 24 b5 12 c0 mov %ax,0xc012b524 +c01011f8: 0f b7 05 44 b4 12 c0 movzwl 0xc012b444,%eax +c01011ff: 83 e8 50 sub $0x50,%eax +c0101202: 0f b7 c0 movzwl %ax,%eax +c0101205: 66 a3 44 b4 12 c0 mov %ax,0xc012b444 } // move that little blinky thing outb(addr_6845, 14); -c0101ac6: 0f b7 05 26 b5 12 c0 movzwl 0xc012b526,%eax -c0101acd: 66 89 45 e6 mov %ax,-0x1a(%ebp) -c0101ad1: c6 45 e5 0e movb $0xe,-0x1b(%ebp) +c010120b: 0f b7 05 46 b4 12 c0 movzwl 0xc012b446,%eax +c0101212: 66 89 45 e6 mov %ax,-0x1a(%ebp) +c0101216: c6 45 e5 0e movb $0xe,-0x1b(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0101ad5: 0f b6 45 e5 movzbl -0x1b(%ebp),%eax -c0101ad9: 0f b7 55 e6 movzwl -0x1a(%ebp),%edx -c0101add: ee out %al,(%dx) +c010121a: 0f b6 45 e5 movzbl -0x1b(%ebp),%eax +c010121e: 0f b7 55 e6 movzwl -0x1a(%ebp),%edx +c0101222: ee out %al,(%dx) } -c0101ade: 90 nop +c0101223: 90 nop outb(addr_6845 + 1, crt_pos >> 8); -c0101adf: 0f b7 05 24 b5 12 c0 movzwl 0xc012b524,%eax -c0101ae6: c1 e8 08 shr $0x8,%eax -c0101ae9: 0f b7 c0 movzwl %ax,%eax -c0101aec: 0f b6 c0 movzbl %al,%eax -c0101aef: 0f b7 15 26 b5 12 c0 movzwl 0xc012b526,%edx -c0101af6: 42 inc %edx -c0101af7: 0f b7 d2 movzwl %dx,%edx -c0101afa: 66 89 55 ea mov %dx,-0x16(%ebp) -c0101afe: 88 45 e9 mov %al,-0x17(%ebp) +c0101224: 0f b7 05 44 b4 12 c0 movzwl 0xc012b444,%eax +c010122b: c1 e8 08 shr $0x8,%eax +c010122e: 0f b7 c0 movzwl %ax,%eax +c0101231: 0f b6 c0 movzbl %al,%eax +c0101234: 0f b7 15 46 b4 12 c0 movzwl 0xc012b446,%edx +c010123b: 42 inc %edx +c010123c: 0f b7 d2 movzwl %dx,%edx +c010123f: 66 89 55 ea mov %dx,-0x16(%ebp) +c0101243: 88 45 e9 mov %al,-0x17(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0101b01: 0f b6 45 e9 movzbl -0x17(%ebp),%eax -c0101b05: 0f b7 55 ea movzwl -0x16(%ebp),%edx -c0101b09: ee out %al,(%dx) +c0101246: 0f b6 45 e9 movzbl -0x17(%ebp),%eax +c010124a: 0f b7 55 ea movzwl -0x16(%ebp),%edx +c010124e: ee out %al,(%dx) } -c0101b0a: 90 nop +c010124f: 90 nop outb(addr_6845, 15); -c0101b0b: 0f b7 05 26 b5 12 c0 movzwl 0xc012b526,%eax -c0101b12: 66 89 45 ee mov %ax,-0x12(%ebp) -c0101b16: c6 45 ed 0f movb $0xf,-0x13(%ebp) +c0101250: 0f b7 05 46 b4 12 c0 movzwl 0xc012b446,%eax +c0101257: 66 89 45 ee mov %ax,-0x12(%ebp) +c010125b: c6 45 ed 0f movb $0xf,-0x13(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0101b1a: 0f b6 45 ed movzbl -0x13(%ebp),%eax -c0101b1e: 0f b7 55 ee movzwl -0x12(%ebp),%edx -c0101b22: ee out %al,(%dx) +c010125f: 0f b6 45 ed movzbl -0x13(%ebp),%eax +c0101263: 0f b7 55 ee movzwl -0x12(%ebp),%edx +c0101267: ee out %al,(%dx) } -c0101b23: 90 nop +c0101268: 90 nop outb(addr_6845 + 1, crt_pos); -c0101b24: 0f b7 05 24 b5 12 c0 movzwl 0xc012b524,%eax -c0101b2b: 0f b6 c0 movzbl %al,%eax -c0101b2e: 0f b7 15 26 b5 12 c0 movzwl 0xc012b526,%edx -c0101b35: 42 inc %edx -c0101b36: 0f b7 d2 movzwl %dx,%edx -c0101b39: 66 89 55 f2 mov %dx,-0xe(%ebp) -c0101b3d: 88 45 f1 mov %al,-0xf(%ebp) +c0101269: 0f b7 05 44 b4 12 c0 movzwl 0xc012b444,%eax +c0101270: 0f b6 c0 movzbl %al,%eax +c0101273: 0f b7 15 46 b4 12 c0 movzwl 0xc012b446,%edx +c010127a: 42 inc %edx +c010127b: 0f b7 d2 movzwl %dx,%edx +c010127e: 66 89 55 f2 mov %dx,-0xe(%ebp) +c0101282: 88 45 f1 mov %al,-0xf(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0101b40: 0f b6 45 f1 movzbl -0xf(%ebp),%eax -c0101b44: 0f b7 55 f2 movzwl -0xe(%ebp),%edx -c0101b48: ee out %al,(%dx) +c0101285: 0f b6 45 f1 movzbl -0xf(%ebp),%eax +c0101289: 0f b7 55 f2 movzwl -0xe(%ebp),%edx +c010128d: ee out %al,(%dx) } -c0101b49: 90 nop +c010128e: 90 nop } -c0101b4a: 90 nop -c0101b4b: 83 c4 34 add $0x34,%esp -c0101b4e: 5b pop %ebx -c0101b4f: 5d pop %ebp -c0101b50: c3 ret +c010128f: 90 nop +c0101290: 8b 5d fc mov -0x4(%ebp),%ebx +c0101293: 89 ec mov %ebp,%esp +c0101295: 5d pop %ebp +c0101296: c3 ret -c0101b51 : +c0101297 : static void serial_putc_sub(int c) { -c0101b51: f3 0f 1e fb endbr32 -c0101b55: 55 push %ebp -c0101b56: 89 e5 mov %esp,%ebp -c0101b58: 83 ec 10 sub $0x10,%esp +c0101297: 55 push %ebp +c0101298: 89 e5 mov %esp,%ebp +c010129a: 83 ec 10 sub $0x10,%esp int i; for (i = 0; !(inb(COM1 + COM_LSR) & COM_LSR_TXRDY) && i < 12800; i ++) { -c0101b5b: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) -c0101b62: eb 08 jmp c0101b6c +c010129d: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) +c01012a4: eb 08 jmp c01012ae delay(); -c0101b64: e8 08 fb ff ff call c0101671 +c01012a6: e8 16 fb ff ff call c0100dc1 for (i = 0; !(inb(COM1 + COM_LSR) & COM_LSR_TXRDY) && i < 12800; i ++) { -c0101b69: ff 45 fc incl -0x4(%ebp) -c0101b6c: 66 c7 45 fa fd 03 movw $0x3fd,-0x6(%ebp) +c01012ab: ff 45 fc incl -0x4(%ebp) +c01012ae: 66 c7 45 fa fd 03 movw $0x3fd,-0x6(%ebp) asm volatile ("inb %1, %0" : "=a" (data) : "d" (port) : "memory"); -c0101b72: 0f b7 45 fa movzwl -0x6(%ebp),%eax -c0101b76: 89 c2 mov %eax,%edx -c0101b78: ec in (%dx),%al -c0101b79: 88 45 f9 mov %al,-0x7(%ebp) +c01012b4: 0f b7 45 fa movzwl -0x6(%ebp),%eax +c01012b8: 89 c2 mov %eax,%edx +c01012ba: ec in (%dx),%al +c01012bb: 88 45 f9 mov %al,-0x7(%ebp) return data; -c0101b7c: 0f b6 45 f9 movzbl -0x7(%ebp),%eax -c0101b80: 0f b6 c0 movzbl %al,%eax -c0101b83: 83 e0 20 and $0x20,%eax -c0101b86: 85 c0 test %eax,%eax -c0101b88: 75 09 jne c0101b93 -c0101b8a: 81 7d fc ff 31 00 00 cmpl $0x31ff,-0x4(%ebp) -c0101b91: 7e d1 jle c0101b64 +c01012be: 0f b6 45 f9 movzbl -0x7(%ebp),%eax +c01012c2: 0f b6 c0 movzbl %al,%eax +c01012c5: 83 e0 20 and $0x20,%eax +c01012c8: 85 c0 test %eax,%eax +c01012ca: 75 09 jne c01012d5 +c01012cc: 81 7d fc ff 31 00 00 cmpl $0x31ff,-0x4(%ebp) +c01012d3: 7e d1 jle c01012a6 } outb(COM1 + COM_TX, c); -c0101b93: 8b 45 08 mov 0x8(%ebp),%eax -c0101b96: 0f b6 c0 movzbl %al,%eax -c0101b99: 66 c7 45 f6 f8 03 movw $0x3f8,-0xa(%ebp) -c0101b9f: 88 45 f5 mov %al,-0xb(%ebp) +c01012d5: 8b 45 08 mov 0x8(%ebp),%eax +c01012d8: 0f b6 c0 movzbl %al,%eax +c01012db: 66 c7 45 f6 f8 03 movw $0x3f8,-0xa(%ebp) +c01012e1: 88 45 f5 mov %al,-0xb(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0101ba2: 0f b6 45 f5 movzbl -0xb(%ebp),%eax -c0101ba6: 0f b7 55 f6 movzwl -0xa(%ebp),%edx -c0101baa: ee out %al,(%dx) +c01012e4: 0f b6 45 f5 movzbl -0xb(%ebp),%eax +c01012e8: 0f b7 55 f6 movzwl -0xa(%ebp),%edx +c01012ec: ee out %al,(%dx) } -c0101bab: 90 nop +c01012ed: 90 nop } -c0101bac: 90 nop -c0101bad: c9 leave -c0101bae: c3 ret +c01012ee: 90 nop +c01012ef: 89 ec mov %ebp,%esp +c01012f1: 5d pop %ebp +c01012f2: c3 ret -c0101baf : +c01012f3 : /* serial_putc - print character to serial port */ static void serial_putc(int c) { -c0101baf: f3 0f 1e fb endbr32 -c0101bb3: 55 push %ebp -c0101bb4: 89 e5 mov %esp,%ebp -c0101bb6: 83 ec 04 sub $0x4,%esp +c01012f3: 55 push %ebp +c01012f4: 89 e5 mov %esp,%ebp +c01012f6: 83 ec 04 sub $0x4,%esp if (c != '\b') { -c0101bb9: 83 7d 08 08 cmpl $0x8,0x8(%ebp) -c0101bbd: 74 0d je c0101bcc +c01012f9: 83 7d 08 08 cmpl $0x8,0x8(%ebp) +c01012fd: 74 0d je c010130c serial_putc_sub(c); -c0101bbf: 8b 45 08 mov 0x8(%ebp),%eax -c0101bc2: 89 04 24 mov %eax,(%esp) -c0101bc5: e8 87 ff ff ff call c0101b51 +c01012ff: 8b 45 08 mov 0x8(%ebp),%eax +c0101302: 89 04 24 mov %eax,(%esp) +c0101305: e8 8d ff ff ff call c0101297 else { serial_putc_sub('\b'); serial_putc_sub(' '); serial_putc_sub('\b'); } } -c0101bca: eb 24 jmp c0101bf0 +c010130a: eb 24 jmp c0101330 serial_putc_sub('\b'); -c0101bcc: c7 04 24 08 00 00 00 movl $0x8,(%esp) -c0101bd3: e8 79 ff ff ff call c0101b51 +c010130c: c7 04 24 08 00 00 00 movl $0x8,(%esp) +c0101313: e8 7f ff ff ff call c0101297 serial_putc_sub(' '); -c0101bd8: c7 04 24 20 00 00 00 movl $0x20,(%esp) -c0101bdf: e8 6d ff ff ff call c0101b51 +c0101318: c7 04 24 20 00 00 00 movl $0x20,(%esp) +c010131f: e8 73 ff ff ff call c0101297 serial_putc_sub('\b'); -c0101be4: c7 04 24 08 00 00 00 movl $0x8,(%esp) -c0101beb: e8 61 ff ff ff call c0101b51 +c0101324: c7 04 24 08 00 00 00 movl $0x8,(%esp) +c010132b: e8 67 ff ff ff call c0101297 } -c0101bf0: 90 nop -c0101bf1: c9 leave -c0101bf2: c3 ret +c0101330: 90 nop +c0101331: 89 ec mov %ebp,%esp +c0101333: 5d pop %ebp +c0101334: c3 ret -c0101bf3 : +c0101335 : /* * * cons_intr - called by device interrupt routines to feed input * characters into the circular console input buffer. * */ static void cons_intr(int (*proc)(void)) { -c0101bf3: f3 0f 1e fb endbr32 -c0101bf7: 55 push %ebp -c0101bf8: 89 e5 mov %esp,%ebp -c0101bfa: 83 ec 18 sub $0x18,%esp +c0101335: 55 push %ebp +c0101336: 89 e5 mov %esp,%ebp +c0101338: 83 ec 18 sub $0x18,%esp int c; while ((c = (*proc)()) != -1) { -c0101bfd: eb 33 jmp c0101c32 +c010133b: eb 33 jmp c0101370 if (c != 0) { -c0101bff: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0101c03: 74 2d je c0101c32 +c010133d: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0101341: 74 2d je c0101370 cons.buf[cons.wpos ++] = c; -c0101c05: a1 44 b7 12 c0 mov 0xc012b744,%eax -c0101c0a: 8d 50 01 lea 0x1(%eax),%edx -c0101c0d: 89 15 44 b7 12 c0 mov %edx,0xc012b744 -c0101c13: 8b 55 f4 mov -0xc(%ebp),%edx -c0101c16: 88 90 40 b5 12 c0 mov %dl,-0x3fed4ac0(%eax) +c0101343: a1 64 b6 12 c0 mov 0xc012b664,%eax +c0101348: 8d 50 01 lea 0x1(%eax),%edx +c010134b: 89 15 64 b6 12 c0 mov %edx,0xc012b664 +c0101351: 8b 55 f4 mov -0xc(%ebp),%edx +c0101354: 88 90 60 b4 12 c0 mov %dl,-0x3fed4ba0(%eax) if (cons.wpos == CONSBUFSIZE) { -c0101c1c: a1 44 b7 12 c0 mov 0xc012b744,%eax -c0101c21: 3d 00 02 00 00 cmp $0x200,%eax -c0101c26: 75 0a jne c0101c32 +c010135a: a1 64 b6 12 c0 mov 0xc012b664,%eax +c010135f: 3d 00 02 00 00 cmp $0x200,%eax +c0101364: 75 0a jne c0101370 cons.wpos = 0; -c0101c28: c7 05 44 b7 12 c0 00 movl $0x0,0xc012b744 -c0101c2f: 00 00 00 +c0101366: c7 05 64 b6 12 c0 00 movl $0x0,0xc012b664 +c010136d: 00 00 00 while ((c = (*proc)()) != -1) { -c0101c32: 8b 45 08 mov 0x8(%ebp),%eax -c0101c35: ff d0 call *%eax -c0101c37: 89 45 f4 mov %eax,-0xc(%ebp) -c0101c3a: 83 7d f4 ff cmpl $0xffffffff,-0xc(%ebp) -c0101c3e: 75 bf jne c0101bff +c0101370: 8b 45 08 mov 0x8(%ebp),%eax +c0101373: ff d0 call *%eax +c0101375: 89 45 f4 mov %eax,-0xc(%ebp) +c0101378: 83 7d f4 ff cmpl $0xffffffff,-0xc(%ebp) +c010137c: 75 bf jne c010133d } } } } -c0101c40: 90 nop -c0101c41: 90 nop -c0101c42: c9 leave -c0101c43: c3 ret +c010137e: 90 nop +c010137f: 90 nop +c0101380: 89 ec mov %ebp,%esp +c0101382: 5d pop %ebp +c0101383: c3 ret -c0101c44 : +c0101384 : /* serial_proc_data - get data from serial port */ static int serial_proc_data(void) { -c0101c44: f3 0f 1e fb endbr32 -c0101c48: 55 push %ebp -c0101c49: 89 e5 mov %esp,%ebp -c0101c4b: 83 ec 10 sub $0x10,%esp -c0101c4e: 66 c7 45 fa fd 03 movw $0x3fd,-0x6(%ebp) +c0101384: 55 push %ebp +c0101385: 89 e5 mov %esp,%ebp +c0101387: 83 ec 10 sub $0x10,%esp +c010138a: 66 c7 45 fa fd 03 movw $0x3fd,-0x6(%ebp) asm volatile ("inb %1, %0" : "=a" (data) : "d" (port) : "memory"); -c0101c54: 0f b7 45 fa movzwl -0x6(%ebp),%eax -c0101c58: 89 c2 mov %eax,%edx -c0101c5a: ec in (%dx),%al -c0101c5b: 88 45 f9 mov %al,-0x7(%ebp) +c0101390: 0f b7 45 fa movzwl -0x6(%ebp),%eax +c0101394: 89 c2 mov %eax,%edx +c0101396: ec in (%dx),%al +c0101397: 88 45 f9 mov %al,-0x7(%ebp) return data; -c0101c5e: 0f b6 45 f9 movzbl -0x7(%ebp),%eax +c010139a: 0f b6 45 f9 movzbl -0x7(%ebp),%eax if (!(inb(COM1 + COM_LSR) & COM_LSR_DATA)) { -c0101c62: 0f b6 c0 movzbl %al,%eax -c0101c65: 83 e0 01 and $0x1,%eax -c0101c68: 85 c0 test %eax,%eax -c0101c6a: 75 07 jne c0101c73 +c010139e: 0f b6 c0 movzbl %al,%eax +c01013a1: 83 e0 01 and $0x1,%eax +c01013a4: 85 c0 test %eax,%eax +c01013a6: 75 07 jne c01013af return -1; -c0101c6c: b8 ff ff ff ff mov $0xffffffff,%eax -c0101c71: eb 2a jmp c0101c9d -c0101c73: 66 c7 45 f6 f8 03 movw $0x3f8,-0xa(%ebp) +c01013a8: b8 ff ff ff ff mov $0xffffffff,%eax +c01013ad: eb 2a jmp c01013d9 +c01013af: 66 c7 45 f6 f8 03 movw $0x3f8,-0xa(%ebp) asm volatile ("inb %1, %0" : "=a" (data) : "d" (port) : "memory"); -c0101c79: 0f b7 45 f6 movzwl -0xa(%ebp),%eax -c0101c7d: 89 c2 mov %eax,%edx -c0101c7f: ec in (%dx),%al -c0101c80: 88 45 f5 mov %al,-0xb(%ebp) +c01013b5: 0f b7 45 f6 movzwl -0xa(%ebp),%eax +c01013b9: 89 c2 mov %eax,%edx +c01013bb: ec in (%dx),%al +c01013bc: 88 45 f5 mov %al,-0xb(%ebp) return data; -c0101c83: 0f b6 45 f5 movzbl -0xb(%ebp),%eax +c01013bf: 0f b6 45 f5 movzbl -0xb(%ebp),%eax } int c = inb(COM1 + COM_RX); -c0101c87: 0f b6 c0 movzbl %al,%eax -c0101c8a: 89 45 fc mov %eax,-0x4(%ebp) +c01013c3: 0f b6 c0 movzbl %al,%eax +c01013c6: 89 45 fc mov %eax,-0x4(%ebp) if (c == 127) { -c0101c8d: 83 7d fc 7f cmpl $0x7f,-0x4(%ebp) -c0101c91: 75 07 jne c0101c9a +c01013c9: 83 7d fc 7f cmpl $0x7f,-0x4(%ebp) +c01013cd: 75 07 jne c01013d6 c = '\b'; -c0101c93: c7 45 fc 08 00 00 00 movl $0x8,-0x4(%ebp) +c01013cf: c7 45 fc 08 00 00 00 movl $0x8,-0x4(%ebp) } return c; -c0101c9a: 8b 45 fc mov -0x4(%ebp),%eax +c01013d6: 8b 45 fc mov -0x4(%ebp),%eax } -c0101c9d: c9 leave -c0101c9e: c3 ret +c01013d9: 89 ec mov %ebp,%esp +c01013db: 5d pop %ebp +c01013dc: c3 ret -c0101c9f : +c01013dd : /* serial_intr - try to feed input characters from serial port */ void serial_intr(void) { -c0101c9f: f3 0f 1e fb endbr32 -c0101ca3: 55 push %ebp -c0101ca4: 89 e5 mov %esp,%ebp -c0101ca6: 83 ec 18 sub $0x18,%esp +c01013dd: 55 push %ebp +c01013de: 89 e5 mov %esp,%ebp +c01013e0: 83 ec 18 sub $0x18,%esp if (serial_exists) { -c0101ca9: a1 28 b5 12 c0 mov 0xc012b528,%eax -c0101cae: 85 c0 test %eax,%eax -c0101cb0: 74 0c je c0101cbe +c01013e3: a1 48 b4 12 c0 mov 0xc012b448,%eax +c01013e8: 85 c0 test %eax,%eax +c01013ea: 74 0c je c01013f8 cons_intr(serial_proc_data); -c0101cb2: c7 04 24 44 1c 10 c0 movl $0xc0101c44,(%esp) -c0101cb9: e8 35 ff ff ff call c0101bf3 +c01013ec: c7 04 24 84 13 10 c0 movl $0xc0101384,(%esp) +c01013f3: e8 3d ff ff ff call c0101335 } } -c0101cbe: 90 nop -c0101cbf: c9 leave -c0101cc0: c3 ret +c01013f8: 90 nop +c01013f9: 89 ec mov %ebp,%esp +c01013fb: 5d pop %ebp +c01013fc: c3 ret -c0101cc1 : +c01013fd : * * The kbd_proc_data() function gets data from the keyboard. * If we finish a character, return it, else 0. And return -1 if no data. * */ static int kbd_proc_data(void) { -c0101cc1: f3 0f 1e fb endbr32 -c0101cc5: 55 push %ebp -c0101cc6: 89 e5 mov %esp,%ebp -c0101cc8: 83 ec 38 sub $0x38,%esp -c0101ccb: 66 c7 45 f0 64 00 movw $0x64,-0x10(%ebp) +c01013fd: 55 push %ebp +c01013fe: 89 e5 mov %esp,%ebp +c0101400: 83 ec 38 sub $0x38,%esp +c0101403: 66 c7 45 f0 64 00 movw $0x64,-0x10(%ebp) asm volatile ("inb %1, %0" : "=a" (data) : "d" (port) : "memory"); -c0101cd1: 8b 45 f0 mov -0x10(%ebp),%eax -c0101cd4: 89 c2 mov %eax,%edx -c0101cd6: ec in (%dx),%al -c0101cd7: 88 45 ef mov %al,-0x11(%ebp) +c0101409: 8b 45 f0 mov -0x10(%ebp),%eax +c010140c: 89 c2 mov %eax,%edx +c010140e: ec in (%dx),%al +c010140f: 88 45 ef mov %al,-0x11(%ebp) return data; -c0101cda: 0f b6 45 ef movzbl -0x11(%ebp),%eax +c0101412: 0f b6 45 ef movzbl -0x11(%ebp),%eax int c; uint8_t data; static uint32_t shift; if ((inb(KBSTATP) & KBS_DIB) == 0) { -c0101cde: 0f b6 c0 movzbl %al,%eax -c0101ce1: 83 e0 01 and $0x1,%eax -c0101ce4: 85 c0 test %eax,%eax -c0101ce6: 75 0a jne c0101cf2 +c0101416: 0f b6 c0 movzbl %al,%eax +c0101419: 83 e0 01 and $0x1,%eax +c010141c: 85 c0 test %eax,%eax +c010141e: 75 0a jne c010142a return -1; -c0101ce8: b8 ff ff ff ff mov $0xffffffff,%eax -c0101ced: e9 56 01 00 00 jmp c0101e48 -c0101cf2: 66 c7 45 ec 60 00 movw $0x60,-0x14(%ebp) +c0101420: b8 ff ff ff ff mov $0xffffffff,%eax +c0101425: e9 56 01 00 00 jmp c0101580 +c010142a: 66 c7 45 ec 60 00 movw $0x60,-0x14(%ebp) asm volatile ("inb %1, %0" : "=a" (data) : "d" (port) : "memory"); -c0101cf8: 8b 45 ec mov -0x14(%ebp),%eax -c0101cfb: 89 c2 mov %eax,%edx -c0101cfd: ec in (%dx),%al -c0101cfe: 88 45 eb mov %al,-0x15(%ebp) +c0101430: 8b 45 ec mov -0x14(%ebp),%eax +c0101433: 89 c2 mov %eax,%edx +c0101435: ec in (%dx),%al +c0101436: 88 45 eb mov %al,-0x15(%ebp) return data; -c0101d01: 0f b6 45 eb movzbl -0x15(%ebp),%eax +c0101439: 0f b6 45 eb movzbl -0x15(%ebp),%eax } data = inb(KBDATAP); -c0101d05: 88 45 f3 mov %al,-0xd(%ebp) +c010143d: 88 45 f3 mov %al,-0xd(%ebp) if (data == 0xE0) { -c0101d08: 80 7d f3 e0 cmpb $0xe0,-0xd(%ebp) -c0101d0c: 75 17 jne c0101d25 +c0101440: 80 7d f3 e0 cmpb $0xe0,-0xd(%ebp) +c0101444: 75 17 jne c010145d // E0 escape character shift |= E0ESC; -c0101d0e: a1 48 b7 12 c0 mov 0xc012b748,%eax -c0101d13: 83 c8 40 or $0x40,%eax -c0101d16: a3 48 b7 12 c0 mov %eax,0xc012b748 +c0101446: a1 68 b6 12 c0 mov 0xc012b668,%eax +c010144b: 83 c8 40 or $0x40,%eax +c010144e: a3 68 b6 12 c0 mov %eax,0xc012b668 return 0; -c0101d1b: b8 00 00 00 00 mov $0x0,%eax -c0101d20: e9 23 01 00 00 jmp c0101e48 +c0101453: b8 00 00 00 00 mov $0x0,%eax +c0101458: e9 23 01 00 00 jmp c0101580 } else if (data & 0x80) { -c0101d25: 0f b6 45 f3 movzbl -0xd(%ebp),%eax -c0101d29: 84 c0 test %al,%al -c0101d2b: 79 45 jns c0101d72 +c010145d: 0f b6 45 f3 movzbl -0xd(%ebp),%eax +c0101461: 84 c0 test %al,%al +c0101463: 79 45 jns c01014aa // Key released data = (shift & E0ESC ? data : data & 0x7F); -c0101d2d: a1 48 b7 12 c0 mov 0xc012b748,%eax -c0101d32: 83 e0 40 and $0x40,%eax -c0101d35: 85 c0 test %eax,%eax -c0101d37: 75 08 jne c0101d41 -c0101d39: 0f b6 45 f3 movzbl -0xd(%ebp),%eax -c0101d3d: 24 7f and $0x7f,%al -c0101d3f: eb 04 jmp c0101d45 -c0101d41: 0f b6 45 f3 movzbl -0xd(%ebp),%eax -c0101d45: 88 45 f3 mov %al,-0xd(%ebp) +c0101465: a1 68 b6 12 c0 mov 0xc012b668,%eax +c010146a: 83 e0 40 and $0x40,%eax +c010146d: 85 c0 test %eax,%eax +c010146f: 75 08 jne c0101479 +c0101471: 0f b6 45 f3 movzbl -0xd(%ebp),%eax +c0101475: 24 7f and $0x7f,%al +c0101477: eb 04 jmp c010147d +c0101479: 0f b6 45 f3 movzbl -0xd(%ebp),%eax +c010147d: 88 45 f3 mov %al,-0xd(%ebp) shift &= ~(shiftcode[data] | E0ESC); -c0101d48: 0f b6 45 f3 movzbl -0xd(%ebp),%eax -c0101d4c: 0f b6 80 40 80 12 c0 movzbl -0x3fed7fc0(%eax),%eax -c0101d53: 0c 40 or $0x40,%al -c0101d55: 0f b6 c0 movzbl %al,%eax -c0101d58: f7 d0 not %eax -c0101d5a: 89 c2 mov %eax,%edx -c0101d5c: a1 48 b7 12 c0 mov 0xc012b748,%eax -c0101d61: 21 d0 and %edx,%eax -c0101d63: a3 48 b7 12 c0 mov %eax,0xc012b748 +c0101480: 0f b6 45 f3 movzbl -0xd(%ebp),%eax +c0101484: 0f b6 80 40 80 12 c0 movzbl -0x3fed7fc0(%eax),%eax +c010148b: 0c 40 or $0x40,%al +c010148d: 0f b6 c0 movzbl %al,%eax +c0101490: f7 d0 not %eax +c0101492: 89 c2 mov %eax,%edx +c0101494: a1 68 b6 12 c0 mov 0xc012b668,%eax +c0101499: 21 d0 and %edx,%eax +c010149b: a3 68 b6 12 c0 mov %eax,0xc012b668 return 0; -c0101d68: b8 00 00 00 00 mov $0x0,%eax -c0101d6d: e9 d6 00 00 00 jmp c0101e48 +c01014a0: b8 00 00 00 00 mov $0x0,%eax +c01014a5: e9 d6 00 00 00 jmp c0101580 } else if (shift & E0ESC) { -c0101d72: a1 48 b7 12 c0 mov 0xc012b748,%eax -c0101d77: 83 e0 40 and $0x40,%eax -c0101d7a: 85 c0 test %eax,%eax -c0101d7c: 74 11 je c0101d8f +c01014aa: a1 68 b6 12 c0 mov 0xc012b668,%eax +c01014af: 83 e0 40 and $0x40,%eax +c01014b2: 85 c0 test %eax,%eax +c01014b4: 74 11 je c01014c7 // Last character was an E0 escape; or with 0x80 data |= 0x80; -c0101d7e: 80 4d f3 80 orb $0x80,-0xd(%ebp) +c01014b6: 80 4d f3 80 orb $0x80,-0xd(%ebp) shift &= ~E0ESC; -c0101d82: a1 48 b7 12 c0 mov 0xc012b748,%eax -c0101d87: 83 e0 bf and $0xffffffbf,%eax -c0101d8a: a3 48 b7 12 c0 mov %eax,0xc012b748 +c01014ba: a1 68 b6 12 c0 mov 0xc012b668,%eax +c01014bf: 83 e0 bf and $0xffffffbf,%eax +c01014c2: a3 68 b6 12 c0 mov %eax,0xc012b668 } shift |= shiftcode[data]; -c0101d8f: 0f b6 45 f3 movzbl -0xd(%ebp),%eax -c0101d93: 0f b6 80 40 80 12 c0 movzbl -0x3fed7fc0(%eax),%eax -c0101d9a: 0f b6 d0 movzbl %al,%edx -c0101d9d: a1 48 b7 12 c0 mov 0xc012b748,%eax -c0101da2: 09 d0 or %edx,%eax -c0101da4: a3 48 b7 12 c0 mov %eax,0xc012b748 +c01014c7: 0f b6 45 f3 movzbl -0xd(%ebp),%eax +c01014cb: 0f b6 80 40 80 12 c0 movzbl -0x3fed7fc0(%eax),%eax +c01014d2: 0f b6 d0 movzbl %al,%edx +c01014d5: a1 68 b6 12 c0 mov 0xc012b668,%eax +c01014da: 09 d0 or %edx,%eax +c01014dc: a3 68 b6 12 c0 mov %eax,0xc012b668 shift ^= togglecode[data]; -c0101da9: 0f b6 45 f3 movzbl -0xd(%ebp),%eax -c0101dad: 0f b6 80 40 81 12 c0 movzbl -0x3fed7ec0(%eax),%eax -c0101db4: 0f b6 d0 movzbl %al,%edx -c0101db7: a1 48 b7 12 c0 mov 0xc012b748,%eax -c0101dbc: 31 d0 xor %edx,%eax -c0101dbe: a3 48 b7 12 c0 mov %eax,0xc012b748 +c01014e1: 0f b6 45 f3 movzbl -0xd(%ebp),%eax +c01014e5: 0f b6 80 40 81 12 c0 movzbl -0x3fed7ec0(%eax),%eax +c01014ec: 0f b6 d0 movzbl %al,%edx +c01014ef: a1 68 b6 12 c0 mov 0xc012b668,%eax +c01014f4: 31 d0 xor %edx,%eax +c01014f6: a3 68 b6 12 c0 mov %eax,0xc012b668 c = charcode[shift & (CTL | SHIFT)][data]; -c0101dc3: a1 48 b7 12 c0 mov 0xc012b748,%eax -c0101dc8: 83 e0 03 and $0x3,%eax -c0101dcb: 8b 14 85 40 85 12 c0 mov -0x3fed7ac0(,%eax,4),%edx -c0101dd2: 0f b6 45 f3 movzbl -0xd(%ebp),%eax -c0101dd6: 01 d0 add %edx,%eax -c0101dd8: 0f b6 00 movzbl (%eax),%eax -c0101ddb: 0f b6 c0 movzbl %al,%eax -c0101dde: 89 45 f4 mov %eax,-0xc(%ebp) +c01014fb: a1 68 b6 12 c0 mov 0xc012b668,%eax +c0101500: 83 e0 03 and $0x3,%eax +c0101503: 8b 14 85 40 85 12 c0 mov -0x3fed7ac0(,%eax,4),%edx +c010150a: 0f b6 45 f3 movzbl -0xd(%ebp),%eax +c010150e: 01 d0 add %edx,%eax +c0101510: 0f b6 00 movzbl (%eax),%eax +c0101513: 0f b6 c0 movzbl %al,%eax +c0101516: 89 45 f4 mov %eax,-0xc(%ebp) if (shift & CAPSLOCK) { -c0101de1: a1 48 b7 12 c0 mov 0xc012b748,%eax -c0101de6: 83 e0 08 and $0x8,%eax -c0101de9: 85 c0 test %eax,%eax -c0101deb: 74 22 je c0101e0f +c0101519: a1 68 b6 12 c0 mov 0xc012b668,%eax +c010151e: 83 e0 08 and $0x8,%eax +c0101521: 85 c0 test %eax,%eax +c0101523: 74 22 je c0101547 if ('a' <= c && c <= 'z') -c0101ded: 83 7d f4 60 cmpl $0x60,-0xc(%ebp) -c0101df1: 7e 0c jle c0101dff -c0101df3: 83 7d f4 7a cmpl $0x7a,-0xc(%ebp) -c0101df7: 7f 06 jg c0101dff +c0101525: 83 7d f4 60 cmpl $0x60,-0xc(%ebp) +c0101529: 7e 0c jle c0101537 +c010152b: 83 7d f4 7a cmpl $0x7a,-0xc(%ebp) +c010152f: 7f 06 jg c0101537 c += 'A' - 'a'; -c0101df9: 83 6d f4 20 subl $0x20,-0xc(%ebp) -c0101dfd: eb 10 jmp c0101e0f +c0101531: 83 6d f4 20 subl $0x20,-0xc(%ebp) +c0101535: eb 10 jmp c0101547 else if ('A' <= c && c <= 'Z') -c0101dff: 83 7d f4 40 cmpl $0x40,-0xc(%ebp) -c0101e03: 7e 0a jle c0101e0f -c0101e05: 83 7d f4 5a cmpl $0x5a,-0xc(%ebp) -c0101e09: 7f 04 jg c0101e0f +c0101537: 83 7d f4 40 cmpl $0x40,-0xc(%ebp) +c010153b: 7e 0a jle c0101547 +c010153d: 83 7d f4 5a cmpl $0x5a,-0xc(%ebp) +c0101541: 7f 04 jg c0101547 c += 'a' - 'A'; -c0101e0b: 83 45 f4 20 addl $0x20,-0xc(%ebp) +c0101543: 83 45 f4 20 addl $0x20,-0xc(%ebp) } // Process special keys // Ctrl-Alt-Del: reboot if (!(~shift & (CTL | ALT)) && c == KEY_DEL) { -c0101e0f: a1 48 b7 12 c0 mov 0xc012b748,%eax -c0101e14: f7 d0 not %eax -c0101e16: 83 e0 06 and $0x6,%eax -c0101e19: 85 c0 test %eax,%eax -c0101e1b: 75 28 jne c0101e45 -c0101e1d: 81 7d f4 e9 00 00 00 cmpl $0xe9,-0xc(%ebp) -c0101e24: 75 1f jne c0101e45 +c0101547: a1 68 b6 12 c0 mov 0xc012b668,%eax +c010154c: f7 d0 not %eax +c010154e: 83 e0 06 and $0x6,%eax +c0101551: 85 c0 test %eax,%eax +c0101553: 75 28 jne c010157d +c0101555: 81 7d f4 e9 00 00 00 cmpl $0xe9,-0xc(%ebp) +c010155c: 75 1f jne c010157d cprintf("Rebooting!\n"); -c0101e26: c7 04 24 99 a6 10 c0 movl $0xc010a699,(%esp) -c0101e2d: e8 a5 e4 ff ff call c01002d7 -c0101e32: 66 c7 45 e8 92 00 movw $0x92,-0x18(%ebp) -c0101e38: c6 45 e7 03 movb $0x3,-0x19(%ebp) +c010155e: c7 04 24 87 a3 10 c0 movl $0xc010a387,(%esp) +c0101565: e8 0e ee ff ff call c0100378 +c010156a: 66 c7 45 e8 92 00 movw $0x92,-0x18(%ebp) +c0101570: c6 45 e7 03 movb $0x3,-0x19(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0101e3c: 0f b6 45 e7 movzbl -0x19(%ebp),%eax -c0101e40: 8b 55 e8 mov -0x18(%ebp),%edx -c0101e43: ee out %al,(%dx) +c0101574: 0f b6 45 e7 movzbl -0x19(%ebp),%eax +c0101578: 8b 55 e8 mov -0x18(%ebp),%edx +c010157b: ee out %al,(%dx) } -c0101e44: 90 nop +c010157c: 90 nop outb(0x92, 0x3); // courtesy of Chris Frost } return c; -c0101e45: 8b 45 f4 mov -0xc(%ebp),%eax +c010157d: 8b 45 f4 mov -0xc(%ebp),%eax } -c0101e48: c9 leave -c0101e49: c3 ret +c0101580: 89 ec mov %ebp,%esp +c0101582: 5d pop %ebp +c0101583: c3 ret -c0101e4a : +c0101584 : /* kbd_intr - try to feed input characters from keyboard */ static void kbd_intr(void) { -c0101e4a: f3 0f 1e fb endbr32 -c0101e4e: 55 push %ebp -c0101e4f: 89 e5 mov %esp,%ebp -c0101e51: 83 ec 18 sub $0x18,%esp +c0101584: 55 push %ebp +c0101585: 89 e5 mov %esp,%ebp +c0101587: 83 ec 18 sub $0x18,%esp cons_intr(kbd_proc_data); -c0101e54: c7 04 24 c1 1c 10 c0 movl $0xc0101cc1,(%esp) -c0101e5b: e8 93 fd ff ff call c0101bf3 +c010158a: c7 04 24 fd 13 10 c0 movl $0xc01013fd,(%esp) +c0101591: e8 9f fd ff ff call c0101335 } -c0101e60: 90 nop -c0101e61: c9 leave -c0101e62: c3 ret +c0101596: 90 nop +c0101597: 89 ec mov %ebp,%esp +c0101599: 5d pop %ebp +c010159a: c3 ret -c0101e63 : +c010159b : static void kbd_init(void) { -c0101e63: f3 0f 1e fb endbr32 -c0101e67: 55 push %ebp -c0101e68: 89 e5 mov %esp,%ebp -c0101e6a: 83 ec 18 sub $0x18,%esp +c010159b: 55 push %ebp +c010159c: 89 e5 mov %esp,%ebp +c010159e: 83 ec 18 sub $0x18,%esp // drain the kbd buffer kbd_intr(); -c0101e6d: e8 d8 ff ff ff call c0101e4a +c01015a1: e8 de ff ff ff call c0101584 pic_enable(IRQ_KBD); -c0101e72: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0101e79: e8 47 01 00 00 call c0101fc5 +c01015a6: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c01015ad: e8 ae 09 00 00 call c0101f60 } -c0101e7e: 90 nop -c0101e7f: c9 leave -c0101e80: c3 ret +c01015b2: 90 nop +c01015b3: 89 ec mov %ebp,%esp +c01015b5: 5d pop %ebp +c01015b6: c3 ret -c0101e81 : +c01015b7 : /* cons_init - initializes the console devices */ void cons_init(void) { -c0101e81: f3 0f 1e fb endbr32 -c0101e85: 55 push %ebp -c0101e86: 89 e5 mov %esp,%ebp -c0101e88: 83 ec 18 sub $0x18,%esp +c01015b7: 55 push %ebp +c01015b8: 89 e5 mov %esp,%ebp +c01015ba: 83 ec 18 sub $0x18,%esp cga_init(); -c0101e8b: e8 2e f8 ff ff call c01016be +c01015bd: e8 4a f8 ff ff call c0100e0c serial_init(); -c0101e90: e8 13 f9 ff ff call c01017a8 +c01015c2: e8 2d f9 ff ff call c0100ef4 kbd_init(); -c0101e95: e8 c9 ff ff ff call c0101e63 +c01015c7: e8 cf ff ff ff call c010159b if (!serial_exists) { -c0101e9a: a1 28 b5 12 c0 mov 0xc012b528,%eax -c0101e9f: 85 c0 test %eax,%eax -c0101ea1: 75 0c jne c0101eaf +c01015cc: a1 48 b4 12 c0 mov 0xc012b448,%eax +c01015d1: 85 c0 test %eax,%eax +c01015d3: 75 0c jne c01015e1 cprintf("serial port does not exist!!\n"); -c0101ea3: c7 04 24 a5 a6 10 c0 movl $0xc010a6a5,(%esp) -c0101eaa: e8 28 e4 ff ff call c01002d7 +c01015d5: c7 04 24 93 a3 10 c0 movl $0xc010a393,(%esp) +c01015dc: e8 97 ed ff ff call c0100378 } } -c0101eaf: 90 nop -c0101eb0: c9 leave -c0101eb1: c3 ret +c01015e1: 90 nop +c01015e2: 89 ec mov %ebp,%esp +c01015e4: 5d pop %ebp +c01015e5: c3 ret -c0101eb2 : +c01015e6 : /* cons_putc - print a single character @c to console devices */ void cons_putc(int c) { -c0101eb2: f3 0f 1e fb endbr32 -c0101eb6: 55 push %ebp -c0101eb7: 89 e5 mov %esp,%ebp -c0101eb9: 83 ec 28 sub $0x28,%esp +c01015e6: 55 push %ebp +c01015e7: 89 e5 mov %esp,%ebp +c01015e9: 83 ec 28 sub $0x28,%esp bool intr_flag; local_intr_save(intr_flag); -c0101ebc: e8 72 f7 ff ff call c0101633 <__intr_save> -c0101ec1: 89 45 f4 mov %eax,-0xc(%ebp) +c01015ec: e8 8e f7 ff ff call c0100d7f <__intr_save> +c01015f1: 89 45 f4 mov %eax,-0xc(%ebp) { lpt_putc(c); -c0101ec4: 8b 45 08 mov 0x8(%ebp),%eax -c0101ec7: 89 04 24 mov %eax,(%esp) -c0101eca: e8 48 fa ff ff call c0101917 +c01015f4: 8b 45 08 mov 0x8(%ebp),%eax +c01015f7: 89 04 24 mov %eax,(%esp) +c01015fa: e8 60 fa ff ff call c010105f cga_putc(c); -c0101ecf: 8b 45 08 mov 0x8(%ebp),%eax -c0101ed2: 89 04 24 mov %eax,(%esp) -c0101ed5: e8 81 fa ff ff call c010195b +c01015ff: 8b 45 08 mov 0x8(%ebp),%eax +c0101602: 89 04 24 mov %eax,(%esp) +c0101605: e8 97 fa ff ff call c01010a1 serial_putc(c); -c0101eda: 8b 45 08 mov 0x8(%ebp),%eax -c0101edd: 89 04 24 mov %eax,(%esp) -c0101ee0: e8 ca fc ff ff call c0101baf +c010160a: 8b 45 08 mov 0x8(%ebp),%eax +c010160d: 89 04 24 mov %eax,(%esp) +c0101610: e8 de fc ff ff call c01012f3 } local_intr_restore(intr_flag); -c0101ee5: 8b 45 f4 mov -0xc(%ebp),%eax -c0101ee8: 89 04 24 mov %eax,(%esp) -c0101eeb: e8 6d f7 ff ff call c010165d <__intr_restore> +c0101615: 8b 45 f4 mov -0xc(%ebp),%eax +c0101618: 89 04 24 mov %eax,(%esp) +c010161b: e8 8b f7 ff ff call c0100dab <__intr_restore> } -c0101ef0: 90 nop -c0101ef1: c9 leave -c0101ef2: c3 ret +c0101620: 90 nop +c0101621: 89 ec mov %ebp,%esp +c0101623: 5d pop %ebp +c0101624: c3 ret -c0101ef3 : +c0101625 : /* * * cons_getc - return the next input character from console, * or 0 if none waiting. * */ int cons_getc(void) { -c0101ef3: f3 0f 1e fb endbr32 -c0101ef7: 55 push %ebp -c0101ef8: 89 e5 mov %esp,%ebp -c0101efa: 83 ec 28 sub $0x28,%esp +c0101625: 55 push %ebp +c0101626: 89 e5 mov %esp,%ebp +c0101628: 83 ec 28 sub $0x28,%esp int c = 0; -c0101efd: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) +c010162b: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) bool intr_flag; local_intr_save(intr_flag); -c0101f04: e8 2a f7 ff ff call c0101633 <__intr_save> -c0101f09: 89 45 f0 mov %eax,-0x10(%ebp) +c0101632: e8 48 f7 ff ff call c0100d7f <__intr_save> +c0101637: 89 45 f0 mov %eax,-0x10(%ebp) { // poll for any pending input characters, // so that this function works even when interrupts are disabled // (e.g., when called from the kernel monitor). serial_intr(); -c0101f0c: e8 8e fd ff ff call c0101c9f +c010163a: e8 9e fd ff ff call c01013dd kbd_intr(); -c0101f11: e8 34 ff ff ff call c0101e4a +c010163f: e8 40 ff ff ff call c0101584 // grab the next character from the input buffer. if (cons.rpos != cons.wpos) { -c0101f16: 8b 15 40 b7 12 c0 mov 0xc012b740,%edx -c0101f1c: a1 44 b7 12 c0 mov 0xc012b744,%eax -c0101f21: 39 c2 cmp %eax,%edx -c0101f23: 74 31 je c0101f56 +c0101644: 8b 15 60 b6 12 c0 mov 0xc012b660,%edx +c010164a: a1 64 b6 12 c0 mov 0xc012b664,%eax +c010164f: 39 c2 cmp %eax,%edx +c0101651: 74 31 je c0101684 c = cons.buf[cons.rpos ++]; -c0101f25: a1 40 b7 12 c0 mov 0xc012b740,%eax -c0101f2a: 8d 50 01 lea 0x1(%eax),%edx -c0101f2d: 89 15 40 b7 12 c0 mov %edx,0xc012b740 -c0101f33: 0f b6 80 40 b5 12 c0 movzbl -0x3fed4ac0(%eax),%eax -c0101f3a: 0f b6 c0 movzbl %al,%eax -c0101f3d: 89 45 f4 mov %eax,-0xc(%ebp) +c0101653: a1 60 b6 12 c0 mov 0xc012b660,%eax +c0101658: 8d 50 01 lea 0x1(%eax),%edx +c010165b: 89 15 60 b6 12 c0 mov %edx,0xc012b660 +c0101661: 0f b6 80 60 b4 12 c0 movzbl -0x3fed4ba0(%eax),%eax +c0101668: 0f b6 c0 movzbl %al,%eax +c010166b: 89 45 f4 mov %eax,-0xc(%ebp) if (cons.rpos == CONSBUFSIZE) { -c0101f40: a1 40 b7 12 c0 mov 0xc012b740,%eax -c0101f45: 3d 00 02 00 00 cmp $0x200,%eax -c0101f4a: 75 0a jne c0101f56 +c010166e: a1 60 b6 12 c0 mov 0xc012b660,%eax +c0101673: 3d 00 02 00 00 cmp $0x200,%eax +c0101678: 75 0a jne c0101684 cons.rpos = 0; -c0101f4c: c7 05 40 b7 12 c0 00 movl $0x0,0xc012b740 -c0101f53: 00 00 00 +c010167a: c7 05 60 b6 12 c0 00 movl $0x0,0xc012b660 +c0101681: 00 00 00 } } } local_intr_restore(intr_flag); -c0101f56: 8b 45 f0 mov -0x10(%ebp),%eax -c0101f59: 89 04 24 mov %eax,(%esp) -c0101f5c: e8 fc f6 ff ff call c010165d <__intr_restore> +c0101684: 8b 45 f0 mov -0x10(%ebp),%eax +c0101687: 89 04 24 mov %eax,(%esp) +c010168a: e8 1c f7 ff ff call c0100dab <__intr_restore> return c; -c0101f61: 8b 45 f4 mov -0xc(%ebp),%eax +c010168f: 8b 45 f4 mov -0xc(%ebp),%eax } -c0101f64: c9 leave -c0101f65: c3 ret +c0101692: 89 ec mov %ebp,%esp +c0101694: 5d pop %ebp +c0101695: c3 ret -c0101f66 : -// Initial IRQ mask has interrupt 2 enabled (for slave 8259A). -static uint16_t irq_mask = 0xFFFF & ~(1 << IRQ_SLAVE); -static bool did_init = 0; +c0101696 : + unsigned int size; // Size in Sectors + unsigned char model[41]; // Model in String +} ide_devices[MAX_IDE]; -static void -pic_setmask(uint16_t mask) { -c0101f66: f3 0f 1e fb endbr32 -c0101f6a: 55 push %ebp -c0101f6b: 89 e5 mov %esp,%ebp -c0101f6d: 83 ec 14 sub $0x14,%esp -c0101f70: 8b 45 08 mov 0x8(%ebp),%eax -c0101f73: 66 89 45 ec mov %ax,-0x14(%ebp) - irq_mask = mask; -c0101f77: 8b 45 ec mov -0x14(%ebp),%eax -c0101f7a: 66 a3 50 85 12 c0 mov %ax,0xc0128550 - if (did_init) { -c0101f80: a1 4c b7 12 c0 mov 0xc012b74c,%eax -c0101f85: 85 c0 test %eax,%eax -c0101f87: 74 39 je c0101fc2 - outb(IO_PIC1 + 1, mask); -c0101f89: 8b 45 ec mov -0x14(%ebp),%eax -c0101f8c: 0f b6 c0 movzbl %al,%eax -c0101f8f: 66 c7 45 fa 21 00 movw $0x21,-0x6(%ebp) -c0101f95: 88 45 f9 mov %al,-0x7(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0101f98: 0f b6 45 f9 movzbl -0x7(%ebp),%eax -c0101f9c: 0f b7 55 fa movzwl -0x6(%ebp),%edx -c0101fa0: ee out %al,(%dx) -} -c0101fa1: 90 nop - outb(IO_PIC2 + 1, mask >> 8); -c0101fa2: 0f b7 45 ec movzwl -0x14(%ebp),%eax -c0101fa6: c1 e8 08 shr $0x8,%eax -c0101fa9: 0f b7 c0 movzwl %ax,%eax -c0101fac: 0f b6 c0 movzbl %al,%eax -c0101faf: 66 c7 45 fe a1 00 movw $0xa1,-0x2(%ebp) -c0101fb5: 88 45 fd mov %al,-0x3(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0101fb8: 0f b6 45 fd movzbl -0x3(%ebp),%eax -c0101fbc: 0f b7 55 fe movzwl -0x2(%ebp),%edx -c0101fc0: ee out %al,(%dx) -} -c0101fc1: 90 nop +static int +ide_wait_ready(unsigned short iobase, bool check_error) { +c0101696: 55 push %ebp +c0101697: 89 e5 mov %esp,%ebp +c0101699: 83 ec 14 sub $0x14,%esp +c010169c: 8b 45 08 mov 0x8(%ebp),%eax +c010169f: 66 89 45 ec mov %ax,-0x14(%ebp) + int r; + while ((r = inb(iobase + ISA_STATUS)) & IDE_BSY) +c01016a3: 90 nop +c01016a4: 8b 45 ec mov -0x14(%ebp),%eax +c01016a7: 83 c0 07 add $0x7,%eax +c01016aa: 0f b7 c0 movzwl %ax,%eax +c01016ad: 66 89 45 fa mov %ax,-0x6(%ebp) + asm volatile ("inb %1, %0" : "=a" (data) : "d" (port) : "memory"); +c01016b1: 0f b7 45 fa movzwl -0x6(%ebp),%eax +c01016b5: 89 c2 mov %eax,%edx +c01016b7: ec in (%dx),%al +c01016b8: 88 45 f9 mov %al,-0x7(%ebp) + return data; +c01016bb: 0f b6 45 f9 movzbl -0x7(%ebp),%eax +c01016bf: 0f b6 c0 movzbl %al,%eax +c01016c2: 89 45 fc mov %eax,-0x4(%ebp) +c01016c5: 8b 45 fc mov -0x4(%ebp),%eax +c01016c8: 25 80 00 00 00 and $0x80,%eax +c01016cd: 85 c0 test %eax,%eax +c01016cf: 75 d3 jne c01016a4 + /* nothing */; + if (check_error && (r & (IDE_DF | IDE_ERR)) != 0) { +c01016d1: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) +c01016d5: 74 11 je c01016e8 +c01016d7: 8b 45 fc mov -0x4(%ebp),%eax +c01016da: 83 e0 21 and $0x21,%eax +c01016dd: 85 c0 test %eax,%eax +c01016df: 74 07 je c01016e8 + return -1; +c01016e1: b8 ff ff ff ff mov $0xffffffff,%eax +c01016e6: eb 05 jmp c01016ed } + return 0; +c01016e8: b8 00 00 00 00 mov $0x0,%eax } -c0101fc2: 90 nop -c0101fc3: c9 leave -c0101fc4: c3 ret +c01016ed: 89 ec mov %ebp,%esp +c01016ef: 5d pop %ebp +c01016f0: c3 ret -c0101fc5 : +c01016f1 : void -pic_enable(unsigned int irq) { -c0101fc5: f3 0f 1e fb endbr32 -c0101fc9: 55 push %ebp -c0101fca: 89 e5 mov %esp,%ebp -c0101fcc: 83 ec 04 sub $0x4,%esp - pic_setmask(irq_mask & ~(1 << irq)); -c0101fcf: 8b 45 08 mov 0x8(%ebp),%eax -c0101fd2: ba 01 00 00 00 mov $0x1,%edx -c0101fd7: 88 c1 mov %al,%cl -c0101fd9: d3 e2 shl %cl,%edx -c0101fdb: 89 d0 mov %edx,%eax -c0101fdd: 98 cwtl -c0101fde: f7 d0 not %eax -c0101fe0: 0f bf d0 movswl %ax,%edx -c0101fe3: 0f b7 05 50 85 12 c0 movzwl 0xc0128550,%eax -c0101fea: 98 cwtl -c0101feb: 21 d0 and %edx,%eax -c0101fed: 98 cwtl -c0101fee: 0f b7 c0 movzwl %ax,%eax -c0101ff1: 89 04 24 mov %eax,(%esp) -c0101ff4: e8 6d ff ff ff call c0101f66 -} -c0101ff9: 90 nop -c0101ffa: c9 leave -c0101ffb: c3 ret - -c0101ffc : +ide_init(void) { +c01016f1: 55 push %ebp +c01016f2: 89 e5 mov %esp,%ebp +c01016f4: 57 push %edi +c01016f5: 53 push %ebx +c01016f6: 81 ec 50 02 00 00 sub $0x250,%esp + static_assert((SECTSIZE % 4) == 0); + unsigned short ideno, iobase; + for (ideno = 0; ideno < MAX_IDE; ideno ++) { +c01016fc: 66 c7 45 f6 00 00 movw $0x0,-0xa(%ebp) +c0101702: e9 bd 02 00 00 jmp c01019c4 + /* assume that no device here */ + ide_devices[ideno].valid = 0; +c0101707: 0f b7 55 f6 movzwl -0xa(%ebp),%edx +c010170b: 89 d0 mov %edx,%eax +c010170d: c1 e0 03 shl $0x3,%eax +c0101710: 29 d0 sub %edx,%eax +c0101712: c1 e0 03 shl $0x3,%eax +c0101715: 05 80 b6 12 c0 add $0xc012b680,%eax +c010171a: c6 00 00 movb $0x0,(%eax) -/* pic_init - initialize the 8259A interrupt controllers */ -void -pic_init(void) { -c0101ffc: f3 0f 1e fb endbr32 -c0102000: 55 push %ebp -c0102001: 89 e5 mov %esp,%ebp -c0102003: 83 ec 44 sub $0x44,%esp - did_init = 1; -c0102006: c7 05 4c b7 12 c0 01 movl $0x1,0xc012b74c -c010200d: 00 00 00 -c0102010: 66 c7 45 ca 21 00 movw $0x21,-0x36(%ebp) -c0102016: c6 45 c9 ff movb $0xff,-0x37(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c010201a: 0f b6 45 c9 movzbl -0x37(%ebp),%eax -c010201e: 0f b7 55 ca movzwl -0x36(%ebp),%edx -c0102022: ee out %al,(%dx) -} -c0102023: 90 nop -c0102024: 66 c7 45 ce a1 00 movw $0xa1,-0x32(%ebp) -c010202a: c6 45 cd ff movb $0xff,-0x33(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c010202e: 0f b6 45 cd movzbl -0x33(%ebp),%eax -c0102032: 0f b7 55 ce movzwl -0x32(%ebp),%edx -c0102036: ee out %al,(%dx) -} -c0102037: 90 nop -c0102038: 66 c7 45 d2 20 00 movw $0x20,-0x2e(%ebp) -c010203e: c6 45 d1 11 movb $0x11,-0x2f(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0102042: 0f b6 45 d1 movzbl -0x2f(%ebp),%eax -c0102046: 0f b7 55 d2 movzwl -0x2e(%ebp),%edx -c010204a: ee out %al,(%dx) -} -c010204b: 90 nop -c010204c: 66 c7 45 d6 21 00 movw $0x21,-0x2a(%ebp) -c0102052: c6 45 d5 20 movb $0x20,-0x2b(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0102056: 0f b6 45 d5 movzbl -0x2b(%ebp),%eax -c010205a: 0f b7 55 d6 movzwl -0x2a(%ebp),%edx -c010205e: ee out %al,(%dx) -} -c010205f: 90 nop -c0102060: 66 c7 45 da 21 00 movw $0x21,-0x26(%ebp) -c0102066: c6 45 d9 04 movb $0x4,-0x27(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c010206a: 0f b6 45 d9 movzbl -0x27(%ebp),%eax -c010206e: 0f b7 55 da movzwl -0x26(%ebp),%edx -c0102072: ee out %al,(%dx) -} -c0102073: 90 nop -c0102074: 66 c7 45 de 21 00 movw $0x21,-0x22(%ebp) -c010207a: c6 45 dd 03 movb $0x3,-0x23(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c010207e: 0f b6 45 dd movzbl -0x23(%ebp),%eax -c0102082: 0f b7 55 de movzwl -0x22(%ebp),%edx -c0102086: ee out %al,(%dx) -} -c0102087: 90 nop -c0102088: 66 c7 45 e2 a0 00 movw $0xa0,-0x1e(%ebp) -c010208e: c6 45 e1 11 movb $0x11,-0x1f(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c0102092: 0f b6 45 e1 movzbl -0x1f(%ebp),%eax -c0102096: 0f b7 55 e2 movzwl -0x1e(%ebp),%edx -c010209a: ee out %al,(%dx) -} -c010209b: 90 nop -c010209c: 66 c7 45 e6 a1 00 movw $0xa1,-0x1a(%ebp) -c01020a2: c6 45 e5 28 movb $0x28,-0x1b(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c01020a6: 0f b6 45 e5 movzbl -0x1b(%ebp),%eax -c01020aa: 0f b7 55 e6 movzwl -0x1a(%ebp),%edx -c01020ae: ee out %al,(%dx) -} -c01020af: 90 nop -c01020b0: 66 c7 45 ea a1 00 movw $0xa1,-0x16(%ebp) -c01020b6: c6 45 e9 02 movb $0x2,-0x17(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c01020ba: 0f b6 45 e9 movzbl -0x17(%ebp),%eax -c01020be: 0f b7 55 ea movzwl -0x16(%ebp),%edx -c01020c2: ee out %al,(%dx) -} -c01020c3: 90 nop -c01020c4: 66 c7 45 ee a1 00 movw $0xa1,-0x12(%ebp) -c01020ca: c6 45 ed 03 movb $0x3,-0x13(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c01020ce: 0f b6 45 ed movzbl -0x13(%ebp),%eax -c01020d2: 0f b7 55 ee movzwl -0x12(%ebp),%edx -c01020d6: ee out %al,(%dx) -} -c01020d7: 90 nop -c01020d8: 66 c7 45 f2 20 00 movw $0x20,-0xe(%ebp) -c01020de: c6 45 f1 68 movb $0x68,-0xf(%ebp) - asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c01020e2: 0f b6 45 f1 movzbl -0xf(%ebp),%eax -c01020e6: 0f b7 55 f2 movzwl -0xe(%ebp),%edx -c01020ea: ee out %al,(%dx) -} -c01020eb: 90 nop -c01020ec: 66 c7 45 f6 20 00 movw $0x20,-0xa(%ebp) -c01020f2: c6 45 f5 0a movb $0xa,-0xb(%ebp) + iobase = IO_BASE(ideno); +c010171d: 0f b7 45 f6 movzwl -0xa(%ebp),%eax +c0101721: d1 e8 shr %eax +c0101723: 0f b7 c0 movzwl %ax,%eax +c0101726: 8b 04 85 b4 a3 10 c0 mov -0x3fef5c4c(,%eax,4),%eax +c010172d: 66 89 45 ea mov %ax,-0x16(%ebp) + + /* wait device ready */ + ide_wait_ready(iobase, 0); +c0101731: 0f b7 45 ea movzwl -0x16(%ebp),%eax +c0101735: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c010173c: 00 +c010173d: 89 04 24 mov %eax,(%esp) +c0101740: e8 51 ff ff ff call c0101696 + + /* step1: select drive */ + outb(iobase + ISA_SDH, 0xE0 | ((ideno & 1) << 4)); +c0101745: 0f b7 45 f6 movzwl -0xa(%ebp),%eax +c0101749: c1 e0 04 shl $0x4,%eax +c010174c: 24 10 and $0x10,%al +c010174e: 0c e0 or $0xe0,%al +c0101750: 0f b6 c0 movzbl %al,%eax +c0101753: 0f b7 55 ea movzwl -0x16(%ebp),%edx +c0101757: 83 c2 06 add $0x6,%edx +c010175a: 0f b7 d2 movzwl %dx,%edx +c010175d: 66 89 55 ca mov %dx,-0x36(%ebp) +c0101761: 88 45 c9 mov %al,-0x37(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c01020f6: 0f b6 45 f5 movzbl -0xb(%ebp),%eax -c01020fa: 0f b7 55 f6 movzwl -0xa(%ebp),%edx -c01020fe: ee out %al,(%dx) +c0101764: 0f b6 45 c9 movzbl -0x37(%ebp),%eax +c0101768: 0f b7 55 ca movzwl -0x36(%ebp),%edx +c010176c: ee out %al,(%dx) } -c01020ff: 90 nop -c0102100: 66 c7 45 fa a0 00 movw $0xa0,-0x6(%ebp) -c0102106: c6 45 f9 68 movb $0x68,-0x7(%ebp) +c010176d: 90 nop + ide_wait_ready(iobase, 0); +c010176e: 0f b7 45 ea movzwl -0x16(%ebp),%eax +c0101772: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c0101779: 00 +c010177a: 89 04 24 mov %eax,(%esp) +c010177d: e8 14 ff ff ff call c0101696 + + /* step2: send ATA identify command */ + outb(iobase + ISA_COMMAND, IDE_CMD_IDENTIFY); +c0101782: 0f b7 45 ea movzwl -0x16(%ebp),%eax +c0101786: 83 c0 07 add $0x7,%eax +c0101789: 0f b7 c0 movzwl %ax,%eax +c010178c: 66 89 45 ce mov %ax,-0x32(%ebp) +c0101790: c6 45 cd ec movb $0xec,-0x33(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c010210a: 0f b6 45 f9 movzbl -0x7(%ebp),%eax -c010210e: 0f b7 55 fa movzwl -0x6(%ebp),%edx -c0102112: ee out %al,(%dx) +c0101794: 0f b6 45 cd movzbl -0x33(%ebp),%eax +c0101798: 0f b7 55 ce movzwl -0x32(%ebp),%edx +c010179c: ee out %al,(%dx) } -c0102113: 90 nop -c0102114: 66 c7 45 fe a0 00 movw $0xa0,-0x2(%ebp) -c010211a: c6 45 fd 0a movb $0xa,-0x3(%ebp) +c010179d: 90 nop + ide_wait_ready(iobase, 0); +c010179e: 0f b7 45 ea movzwl -0x16(%ebp),%eax +c01017a2: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c01017a9: 00 +c01017aa: 89 04 24 mov %eax,(%esp) +c01017ad: e8 e4 fe ff ff call c0101696 + + /* step3: polling */ + if (inb(iobase + ISA_STATUS) == 0 || ide_wait_ready(iobase, 1) != 0) { +c01017b2: 0f b7 45 ea movzwl -0x16(%ebp),%eax +c01017b6: 83 c0 07 add $0x7,%eax +c01017b9: 0f b7 c0 movzwl %ax,%eax +c01017bc: 66 89 45 d2 mov %ax,-0x2e(%ebp) + asm volatile ("inb %1, %0" : "=a" (data) : "d" (port) : "memory"); +c01017c0: 0f b7 45 d2 movzwl -0x2e(%ebp),%eax +c01017c4: 89 c2 mov %eax,%edx +c01017c6: ec in (%dx),%al +c01017c7: 88 45 d1 mov %al,-0x2f(%ebp) + return data; +c01017ca: 0f b6 45 d1 movzbl -0x2f(%ebp),%eax +c01017ce: 84 c0 test %al,%al +c01017d0: 0f 84 e4 01 00 00 je c01019ba +c01017d6: 0f b7 45 ea movzwl -0x16(%ebp),%eax +c01017da: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c01017e1: 00 +c01017e2: 89 04 24 mov %eax,(%esp) +c01017e5: e8 ac fe ff ff call c0101696 +c01017ea: 85 c0 test %eax,%eax +c01017ec: 0f 85 c8 01 00 00 jne c01019ba + continue ; + } + + /* device is ok */ + ide_devices[ideno].valid = 1; +c01017f2: 0f b7 55 f6 movzwl -0xa(%ebp),%edx +c01017f6: 89 d0 mov %edx,%eax +c01017f8: c1 e0 03 shl $0x3,%eax +c01017fb: 29 d0 sub %edx,%eax +c01017fd: c1 e0 03 shl $0x3,%eax +c0101800: 05 80 b6 12 c0 add $0xc012b680,%eax +c0101805: c6 00 01 movb $0x1,(%eax) + + /* read identification space of the device */ + unsigned int buffer[128]; + insl(iobase + ISA_DATA, buffer, sizeof(buffer) / sizeof(unsigned int)); +c0101808: 0f b7 45 ea movzwl -0x16(%ebp),%eax +c010180c: 89 45 c4 mov %eax,-0x3c(%ebp) +c010180f: 8d 85 bc fd ff ff lea -0x244(%ebp),%eax +c0101815: 89 45 c0 mov %eax,-0x40(%ebp) +c0101818: c7 45 bc 80 00 00 00 movl $0x80,-0x44(%ebp) + asm volatile ( +c010181f: 8b 55 c4 mov -0x3c(%ebp),%edx +c0101822: 8b 4d c0 mov -0x40(%ebp),%ecx +c0101825: 8b 45 bc mov -0x44(%ebp),%eax +c0101828: 89 cb mov %ecx,%ebx +c010182a: 89 df mov %ebx,%edi +c010182c: 89 c1 mov %eax,%ecx +c010182e: fc cld +c010182f: f2 6d repnz insl (%dx),%es:(%edi) +c0101831: 89 c8 mov %ecx,%eax +c0101833: 89 fb mov %edi,%ebx +c0101835: 89 5d c0 mov %ebx,-0x40(%ebp) +c0101838: 89 45 bc mov %eax,-0x44(%ebp) +} +c010183b: 90 nop + + unsigned char *ident = (unsigned char *)buffer; +c010183c: 8d 85 bc fd ff ff lea -0x244(%ebp),%eax +c0101842: 89 45 e4 mov %eax,-0x1c(%ebp) + unsigned int sectors; + unsigned int cmdsets = *(unsigned int *)(ident + IDE_IDENT_CMDSETS); +c0101845: 8b 45 e4 mov -0x1c(%ebp),%eax +c0101848: 8b 80 a4 00 00 00 mov 0xa4(%eax),%eax +c010184e: 89 45 e0 mov %eax,-0x20(%ebp) + /* device use 48-bits or 28-bits addressing */ + if (cmdsets & (1 << 26)) { +c0101851: 8b 45 e0 mov -0x20(%ebp),%eax +c0101854: 25 00 00 00 04 and $0x4000000,%eax +c0101859: 85 c0 test %eax,%eax +c010185b: 74 0e je c010186b + sectors = *(unsigned int *)(ident + IDE_IDENT_MAX_LBA_EXT); +c010185d: 8b 45 e4 mov -0x1c(%ebp),%eax +c0101860: 8b 80 c8 00 00 00 mov 0xc8(%eax),%eax +c0101866: 89 45 f0 mov %eax,-0x10(%ebp) +c0101869: eb 09 jmp c0101874 + } + else { + sectors = *(unsigned int *)(ident + IDE_IDENT_MAX_LBA); +c010186b: 8b 45 e4 mov -0x1c(%ebp),%eax +c010186e: 8b 40 78 mov 0x78(%eax),%eax +c0101871: 89 45 f0 mov %eax,-0x10(%ebp) + } + ide_devices[ideno].sets = cmdsets; +c0101874: 0f b7 55 f6 movzwl -0xa(%ebp),%edx +c0101878: 89 d0 mov %edx,%eax +c010187a: c1 e0 03 shl $0x3,%eax +c010187d: 29 d0 sub %edx,%eax +c010187f: c1 e0 03 shl $0x3,%eax +c0101882: 8d 90 84 b6 12 c0 lea -0x3fed497c(%eax),%edx +c0101888: 8b 45 e0 mov -0x20(%ebp),%eax +c010188b: 89 02 mov %eax,(%edx) + ide_devices[ideno].size = sectors; +c010188d: 0f b7 55 f6 movzwl -0xa(%ebp),%edx +c0101891: 89 d0 mov %edx,%eax +c0101893: c1 e0 03 shl $0x3,%eax +c0101896: 29 d0 sub %edx,%eax +c0101898: c1 e0 03 shl $0x3,%eax +c010189b: 8d 90 88 b6 12 c0 lea -0x3fed4978(%eax),%edx +c01018a1: 8b 45 f0 mov -0x10(%ebp),%eax +c01018a4: 89 02 mov %eax,(%edx) + + /* check if supports LBA */ + assert((*(unsigned short *)(ident + IDE_IDENT_CAPABILITIES) & 0x200) != 0); +c01018a6: 8b 45 e4 mov -0x1c(%ebp),%eax +c01018a9: 83 c0 62 add $0x62,%eax +c01018ac: 0f b7 00 movzwl (%eax),%eax +c01018af: 25 00 02 00 00 and $0x200,%eax +c01018b4: 85 c0 test %eax,%eax +c01018b6: 75 24 jne c01018dc +c01018b8: c7 44 24 0c bc a3 10 movl $0xc010a3bc,0xc(%esp) +c01018bf: c0 +c01018c0: c7 44 24 08 ff a3 10 movl $0xc010a3ff,0x8(%esp) +c01018c7: c0 +c01018c8: c7 44 24 04 7d 00 00 movl $0x7d,0x4(%esp) +c01018cf: 00 +c01018d0: c7 04 24 14 a4 10 c0 movl $0xc010a414,(%esp) +c01018d7: e8 69 f3 ff ff call c0100c45 <__panic> + + unsigned char *model = ide_devices[ideno].model, *data = ident + IDE_IDENT_MODEL; +c01018dc: 0f b7 55 f6 movzwl -0xa(%ebp),%edx +c01018e0: 89 d0 mov %edx,%eax +c01018e2: c1 e0 03 shl $0x3,%eax +c01018e5: 29 d0 sub %edx,%eax +c01018e7: c1 e0 03 shl $0x3,%eax +c01018ea: 05 80 b6 12 c0 add $0xc012b680,%eax +c01018ef: 83 c0 0c add $0xc,%eax +c01018f2: 89 45 dc mov %eax,-0x24(%ebp) +c01018f5: 8b 45 e4 mov -0x1c(%ebp),%eax +c01018f8: 83 c0 36 add $0x36,%eax +c01018fb: 89 45 d8 mov %eax,-0x28(%ebp) + unsigned int i, length = 40; +c01018fe: c7 45 d4 28 00 00 00 movl $0x28,-0x2c(%ebp) + for (i = 0; i < length; i += 2) { +c0101905: c7 45 ec 00 00 00 00 movl $0x0,-0x14(%ebp) +c010190c: eb 34 jmp c0101942 + model[i] = data[i + 1], model[i + 1] = data[i]; +c010190e: 8b 45 ec mov -0x14(%ebp),%eax +c0101911: 8d 50 01 lea 0x1(%eax),%edx +c0101914: 8b 45 d8 mov -0x28(%ebp),%eax +c0101917: 01 c2 add %eax,%edx +c0101919: 8b 4d dc mov -0x24(%ebp),%ecx +c010191c: 8b 45 ec mov -0x14(%ebp),%eax +c010191f: 01 c8 add %ecx,%eax +c0101921: 0f b6 12 movzbl (%edx),%edx +c0101924: 88 10 mov %dl,(%eax) +c0101926: 8b 55 d8 mov -0x28(%ebp),%edx +c0101929: 8b 45 ec mov -0x14(%ebp),%eax +c010192c: 01 c2 add %eax,%edx +c010192e: 8b 45 ec mov -0x14(%ebp),%eax +c0101931: 8d 48 01 lea 0x1(%eax),%ecx +c0101934: 8b 45 dc mov -0x24(%ebp),%eax +c0101937: 01 c8 add %ecx,%eax +c0101939: 0f b6 12 movzbl (%edx),%edx +c010193c: 88 10 mov %dl,(%eax) + for (i = 0; i < length; i += 2) { +c010193e: 83 45 ec 02 addl $0x2,-0x14(%ebp) +c0101942: 8b 45 ec mov -0x14(%ebp),%eax +c0101945: 3b 45 d4 cmp -0x2c(%ebp),%eax +c0101948: 72 c4 jb c010190e + } + do { + model[i] = '\0'; +c010194a: 8b 55 dc mov -0x24(%ebp),%edx +c010194d: 8b 45 ec mov -0x14(%ebp),%eax +c0101950: 01 d0 add %edx,%eax +c0101952: c6 00 00 movb $0x0,(%eax) + } while (i -- > 0 && model[i] == ' '); +c0101955: 8b 45 ec mov -0x14(%ebp),%eax +c0101958: 8d 50 ff lea -0x1(%eax),%edx +c010195b: 89 55 ec mov %edx,-0x14(%ebp) +c010195e: 85 c0 test %eax,%eax +c0101960: 74 0f je c0101971 +c0101962: 8b 55 dc mov -0x24(%ebp),%edx +c0101965: 8b 45 ec mov -0x14(%ebp),%eax +c0101968: 01 d0 add %edx,%eax +c010196a: 0f b6 00 movzbl (%eax),%eax +c010196d: 3c 20 cmp $0x20,%al +c010196f: 74 d9 je c010194a + + cprintf("ide %d: %10u(sectors), '%s'.\n", ideno, ide_devices[ideno].size, ide_devices[ideno].model); +c0101971: 0f b7 55 f6 movzwl -0xa(%ebp),%edx +c0101975: 89 d0 mov %edx,%eax +c0101977: c1 e0 03 shl $0x3,%eax +c010197a: 29 d0 sub %edx,%eax +c010197c: c1 e0 03 shl $0x3,%eax +c010197f: 05 80 b6 12 c0 add $0xc012b680,%eax +c0101984: 8d 48 0c lea 0xc(%eax),%ecx +c0101987: 0f b7 55 f6 movzwl -0xa(%ebp),%edx +c010198b: 89 d0 mov %edx,%eax +c010198d: c1 e0 03 shl $0x3,%eax +c0101990: 29 d0 sub %edx,%eax +c0101992: c1 e0 03 shl $0x3,%eax +c0101995: 05 88 b6 12 c0 add $0xc012b688,%eax +c010199a: 8b 10 mov (%eax),%edx +c010199c: 0f b7 45 f6 movzwl -0xa(%ebp),%eax +c01019a0: 89 4c 24 0c mov %ecx,0xc(%esp) +c01019a4: 89 54 24 08 mov %edx,0x8(%esp) +c01019a8: 89 44 24 04 mov %eax,0x4(%esp) +c01019ac: c7 04 24 26 a4 10 c0 movl $0xc010a426,(%esp) +c01019b3: e8 c0 e9 ff ff call c0100378 +c01019b8: eb 01 jmp c01019bb + continue ; +c01019ba: 90 nop + for (ideno = 0; ideno < MAX_IDE; ideno ++) { +c01019bb: 0f b7 45 f6 movzwl -0xa(%ebp),%eax +c01019bf: 40 inc %eax +c01019c0: 66 89 45 f6 mov %ax,-0xa(%ebp) +c01019c4: 0f b7 45 f6 movzwl -0xa(%ebp),%eax +c01019c8: 83 f8 03 cmp $0x3,%eax +c01019cb: 0f 86 36 fd ff ff jbe c0101707 + } + + // enable ide interrupt + pic_enable(IRQ_IDE1); +c01019d1: c7 04 24 0e 00 00 00 movl $0xe,(%esp) +c01019d8: e8 83 05 00 00 call c0101f60 + pic_enable(IRQ_IDE2); +c01019dd: c7 04 24 0f 00 00 00 movl $0xf,(%esp) +c01019e4: e8 77 05 00 00 call c0101f60 +} +c01019e9: 90 nop +c01019ea: 81 c4 50 02 00 00 add $0x250,%esp +c01019f0: 5b pop %ebx +c01019f1: 5f pop %edi +c01019f2: 5d pop %ebp +c01019f3: c3 ret + +c01019f4 : + +bool +ide_device_valid(unsigned short ideno) { +c01019f4: 55 push %ebp +c01019f5: 89 e5 mov %esp,%ebp +c01019f7: 83 ec 04 sub $0x4,%esp +c01019fa: 8b 45 08 mov 0x8(%ebp),%eax +c01019fd: 66 89 45 fc mov %ax,-0x4(%ebp) + return VALID_IDE(ideno); +c0101a01: 0f b7 45 fc movzwl -0x4(%ebp),%eax +c0101a05: 83 f8 03 cmp $0x3,%eax +c0101a08: 77 21 ja c0101a2b +c0101a0a: 0f b7 55 fc movzwl -0x4(%ebp),%edx +c0101a0e: 89 d0 mov %edx,%eax +c0101a10: c1 e0 03 shl $0x3,%eax +c0101a13: 29 d0 sub %edx,%eax +c0101a15: c1 e0 03 shl $0x3,%eax +c0101a18: 05 80 b6 12 c0 add $0xc012b680,%eax +c0101a1d: 0f b6 00 movzbl (%eax),%eax +c0101a20: 84 c0 test %al,%al +c0101a22: 74 07 je c0101a2b +c0101a24: b8 01 00 00 00 mov $0x1,%eax +c0101a29: eb 05 jmp c0101a30 +c0101a2b: b8 00 00 00 00 mov $0x0,%eax +} +c0101a30: 89 ec mov %ebp,%esp +c0101a32: 5d pop %ebp +c0101a33: c3 ret + +c0101a34 : + +size_t +ide_device_size(unsigned short ideno) { +c0101a34: 55 push %ebp +c0101a35: 89 e5 mov %esp,%ebp +c0101a37: 83 ec 08 sub $0x8,%esp +c0101a3a: 8b 45 08 mov 0x8(%ebp),%eax +c0101a3d: 66 89 45 fc mov %ax,-0x4(%ebp) + if (ide_device_valid(ideno)) { +c0101a41: 0f b7 45 fc movzwl -0x4(%ebp),%eax +c0101a45: 89 04 24 mov %eax,(%esp) +c0101a48: e8 a7 ff ff ff call c01019f4 +c0101a4d: 85 c0 test %eax,%eax +c0101a4f: 74 17 je c0101a68 + return ide_devices[ideno].size; +c0101a51: 0f b7 55 fc movzwl -0x4(%ebp),%edx +c0101a55: 89 d0 mov %edx,%eax +c0101a57: c1 e0 03 shl $0x3,%eax +c0101a5a: 29 d0 sub %edx,%eax +c0101a5c: c1 e0 03 shl $0x3,%eax +c0101a5f: 05 88 b6 12 c0 add $0xc012b688,%eax +c0101a64: 8b 00 mov (%eax),%eax +c0101a66: eb 05 jmp c0101a6d + } + return 0; +c0101a68: b8 00 00 00 00 mov $0x0,%eax +} +c0101a6d: 89 ec mov %ebp,%esp +c0101a6f: 5d pop %ebp +c0101a70: c3 ret + +c0101a71 : + +int +ide_read_secs(unsigned short ideno, uint32_t secno, void *dst, size_t nsecs) { +c0101a71: 55 push %ebp +c0101a72: 89 e5 mov %esp,%ebp +c0101a74: 57 push %edi +c0101a75: 53 push %ebx +c0101a76: 83 ec 50 sub $0x50,%esp +c0101a79: 8b 45 08 mov 0x8(%ebp),%eax +c0101a7c: 66 89 45 c4 mov %ax,-0x3c(%ebp) + assert(nsecs <= MAX_NSECS && VALID_IDE(ideno)); +c0101a80: 81 7d 14 80 00 00 00 cmpl $0x80,0x14(%ebp) +c0101a87: 77 23 ja c0101aac +c0101a89: 0f b7 45 c4 movzwl -0x3c(%ebp),%eax +c0101a8d: 83 f8 03 cmp $0x3,%eax +c0101a90: 77 1a ja c0101aac +c0101a92: 0f b7 55 c4 movzwl -0x3c(%ebp),%edx +c0101a96: 89 d0 mov %edx,%eax +c0101a98: c1 e0 03 shl $0x3,%eax +c0101a9b: 29 d0 sub %edx,%eax +c0101a9d: c1 e0 03 shl $0x3,%eax +c0101aa0: 05 80 b6 12 c0 add $0xc012b680,%eax +c0101aa5: 0f b6 00 movzbl (%eax),%eax +c0101aa8: 84 c0 test %al,%al +c0101aaa: 75 24 jne c0101ad0 +c0101aac: c7 44 24 0c 44 a4 10 movl $0xc010a444,0xc(%esp) +c0101ab3: c0 +c0101ab4: c7 44 24 08 ff a3 10 movl $0xc010a3ff,0x8(%esp) +c0101abb: c0 +c0101abc: c7 44 24 04 9f 00 00 movl $0x9f,0x4(%esp) +c0101ac3: 00 +c0101ac4: c7 04 24 14 a4 10 c0 movl $0xc010a414,(%esp) +c0101acb: e8 75 f1 ff ff call c0100c45 <__panic> + assert(secno < MAX_DISK_NSECS && secno + nsecs <= MAX_DISK_NSECS); +c0101ad0: 81 7d 0c ff ff ff 0f cmpl $0xfffffff,0xc(%ebp) +c0101ad7: 77 0f ja c0101ae8 +c0101ad9: 8b 55 0c mov 0xc(%ebp),%edx +c0101adc: 8b 45 14 mov 0x14(%ebp),%eax +c0101adf: 01 d0 add %edx,%eax +c0101ae1: 3d 00 00 00 10 cmp $0x10000000,%eax +c0101ae6: 76 24 jbe c0101b0c +c0101ae8: c7 44 24 0c 6c a4 10 movl $0xc010a46c,0xc(%esp) +c0101aef: c0 +c0101af0: c7 44 24 08 ff a3 10 movl $0xc010a3ff,0x8(%esp) +c0101af7: c0 +c0101af8: c7 44 24 04 a0 00 00 movl $0xa0,0x4(%esp) +c0101aff: 00 +c0101b00: c7 04 24 14 a4 10 c0 movl $0xc010a414,(%esp) +c0101b07: e8 39 f1 ff ff call c0100c45 <__panic> + unsigned short iobase = IO_BASE(ideno), ioctrl = IO_CTRL(ideno); +c0101b0c: 0f b7 45 c4 movzwl -0x3c(%ebp),%eax +c0101b10: d1 e8 shr %eax +c0101b12: 0f b7 c0 movzwl %ax,%eax +c0101b15: 8b 04 85 b4 a3 10 c0 mov -0x3fef5c4c(,%eax,4),%eax +c0101b1c: 66 89 45 f2 mov %ax,-0xe(%ebp) +c0101b20: 0f b7 45 c4 movzwl -0x3c(%ebp),%eax +c0101b24: d1 e8 shr %eax +c0101b26: 0f b7 c0 movzwl %ax,%eax +c0101b29: 0f b7 04 85 b6 a3 10 movzwl -0x3fef5c4a(,%eax,4),%eax +c0101b30: c0 +c0101b31: 66 89 45 f0 mov %ax,-0x10(%ebp) + + ide_wait_ready(iobase, 0); +c0101b35: 0f b7 45 f2 movzwl -0xe(%ebp),%eax +c0101b39: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c0101b40: 00 +c0101b41: 89 04 24 mov %eax,(%esp) +c0101b44: e8 4d fb ff ff call c0101696 + + // generate interrupt + outb(ioctrl + ISA_CTRL, 0); +c0101b49: 8b 45 f0 mov -0x10(%ebp),%eax +c0101b4c: 83 c0 02 add $0x2,%eax +c0101b4f: 0f b7 c0 movzwl %ax,%eax +c0101b52: 66 89 45 d6 mov %ax,-0x2a(%ebp) +c0101b56: c6 45 d5 00 movb $0x0,-0x2b(%ebp) asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); -c010211e: 0f b6 45 fd movzbl -0x3(%ebp),%eax -c0102122: 0f b7 55 fe movzwl -0x2(%ebp),%edx -c0102126: ee out %al,(%dx) +c0101b5a: 0f b6 45 d5 movzbl -0x2b(%ebp),%eax +c0101b5e: 0f b7 55 d6 movzwl -0x2a(%ebp),%edx +c0101b62: ee out %al,(%dx) } -c0102127: 90 nop - outb(IO_PIC1, 0x0a); // read IRR by default +c0101b63: 90 nop + outb(iobase + ISA_SECCNT, nsecs); +c0101b64: 8b 45 14 mov 0x14(%ebp),%eax +c0101b67: 0f b6 c0 movzbl %al,%eax +c0101b6a: 0f b7 55 f2 movzwl -0xe(%ebp),%edx +c0101b6e: 83 c2 02 add $0x2,%edx +c0101b71: 0f b7 d2 movzwl %dx,%edx +c0101b74: 66 89 55 da mov %dx,-0x26(%ebp) +c0101b78: 88 45 d9 mov %al,-0x27(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101b7b: 0f b6 45 d9 movzbl -0x27(%ebp),%eax +c0101b7f: 0f b7 55 da movzwl -0x26(%ebp),%edx +c0101b83: ee out %al,(%dx) +} +c0101b84: 90 nop + outb(iobase + ISA_SECTOR, secno & 0xFF); +c0101b85: 8b 45 0c mov 0xc(%ebp),%eax +c0101b88: 0f b6 c0 movzbl %al,%eax +c0101b8b: 0f b7 55 f2 movzwl -0xe(%ebp),%edx +c0101b8f: 83 c2 03 add $0x3,%edx +c0101b92: 0f b7 d2 movzwl %dx,%edx +c0101b95: 66 89 55 de mov %dx,-0x22(%ebp) +c0101b99: 88 45 dd mov %al,-0x23(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101b9c: 0f b6 45 dd movzbl -0x23(%ebp),%eax +c0101ba0: 0f b7 55 de movzwl -0x22(%ebp),%edx +c0101ba4: ee out %al,(%dx) +} +c0101ba5: 90 nop + outb(iobase + ISA_CYL_LO, (secno >> 8) & 0xFF); +c0101ba6: 8b 45 0c mov 0xc(%ebp),%eax +c0101ba9: c1 e8 08 shr $0x8,%eax +c0101bac: 0f b6 c0 movzbl %al,%eax +c0101baf: 0f b7 55 f2 movzwl -0xe(%ebp),%edx +c0101bb3: 83 c2 04 add $0x4,%edx +c0101bb6: 0f b7 d2 movzwl %dx,%edx +c0101bb9: 66 89 55 e2 mov %dx,-0x1e(%ebp) +c0101bbd: 88 45 e1 mov %al,-0x1f(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101bc0: 0f b6 45 e1 movzbl -0x1f(%ebp),%eax +c0101bc4: 0f b7 55 e2 movzwl -0x1e(%ebp),%edx +c0101bc8: ee out %al,(%dx) +} +c0101bc9: 90 nop + outb(iobase + ISA_CYL_HI, (secno >> 16) & 0xFF); +c0101bca: 8b 45 0c mov 0xc(%ebp),%eax +c0101bcd: c1 e8 10 shr $0x10,%eax +c0101bd0: 0f b6 c0 movzbl %al,%eax +c0101bd3: 0f b7 55 f2 movzwl -0xe(%ebp),%edx +c0101bd7: 83 c2 05 add $0x5,%edx +c0101bda: 0f b7 d2 movzwl %dx,%edx +c0101bdd: 66 89 55 e6 mov %dx,-0x1a(%ebp) +c0101be1: 88 45 e5 mov %al,-0x1b(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101be4: 0f b6 45 e5 movzbl -0x1b(%ebp),%eax +c0101be8: 0f b7 55 e6 movzwl -0x1a(%ebp),%edx +c0101bec: ee out %al,(%dx) +} +c0101bed: 90 nop + outb(iobase + ISA_SDH, 0xE0 | ((ideno & 1) << 4) | ((secno >> 24) & 0xF)); +c0101bee: 8b 45 c4 mov -0x3c(%ebp),%eax +c0101bf1: c0 e0 04 shl $0x4,%al +c0101bf4: 24 10 and $0x10,%al +c0101bf6: 88 c2 mov %al,%dl +c0101bf8: 8b 45 0c mov 0xc(%ebp),%eax +c0101bfb: c1 e8 18 shr $0x18,%eax +c0101bfe: 24 0f and $0xf,%al +c0101c00: 08 d0 or %dl,%al +c0101c02: 0c e0 or $0xe0,%al +c0101c04: 0f b6 c0 movzbl %al,%eax +c0101c07: 0f b7 55 f2 movzwl -0xe(%ebp),%edx +c0101c0b: 83 c2 06 add $0x6,%edx +c0101c0e: 0f b7 d2 movzwl %dx,%edx +c0101c11: 66 89 55 ea mov %dx,-0x16(%ebp) +c0101c15: 88 45 e9 mov %al,-0x17(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101c18: 0f b6 45 e9 movzbl -0x17(%ebp),%eax +c0101c1c: 0f b7 55 ea movzwl -0x16(%ebp),%edx +c0101c20: ee out %al,(%dx) +} +c0101c21: 90 nop + outb(iobase + ISA_COMMAND, IDE_CMD_READ); +c0101c22: 0f b7 45 f2 movzwl -0xe(%ebp),%eax +c0101c26: 83 c0 07 add $0x7,%eax +c0101c29: 0f b7 c0 movzwl %ax,%eax +c0101c2c: 66 89 45 ee mov %ax,-0x12(%ebp) +c0101c30: c6 45 ed 20 movb $0x20,-0x13(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101c34: 0f b6 45 ed movzbl -0x13(%ebp),%eax +c0101c38: 0f b7 55 ee movzwl -0x12(%ebp),%edx +c0101c3c: ee out %al,(%dx) +} +c0101c3d: 90 nop - outb(IO_PIC2, 0x68); // OCW3 - outb(IO_PIC2, 0x0a); // OCW3 + int ret = 0; +c0101c3e: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) + for (; nsecs > 0; nsecs --, dst += SECTSIZE) { +c0101c45: eb 58 jmp c0101c9f + if ((ret = ide_wait_ready(iobase, 1)) != 0) { +c0101c47: 0f b7 45 f2 movzwl -0xe(%ebp),%eax +c0101c4b: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c0101c52: 00 +c0101c53: 89 04 24 mov %eax,(%esp) +c0101c56: e8 3b fa ff ff call c0101696 +c0101c5b: 89 45 f4 mov %eax,-0xc(%ebp) +c0101c5e: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0101c62: 75 43 jne c0101ca7 + goto out; + } + insl(iobase, dst, SECTSIZE / sizeof(uint32_t)); +c0101c64: 0f b7 45 f2 movzwl -0xe(%ebp),%eax +c0101c68: 89 45 d0 mov %eax,-0x30(%ebp) +c0101c6b: 8b 45 10 mov 0x10(%ebp),%eax +c0101c6e: 89 45 cc mov %eax,-0x34(%ebp) +c0101c71: c7 45 c8 80 00 00 00 movl $0x80,-0x38(%ebp) + asm volatile ( +c0101c78: 8b 55 d0 mov -0x30(%ebp),%edx +c0101c7b: 8b 4d cc mov -0x34(%ebp),%ecx +c0101c7e: 8b 45 c8 mov -0x38(%ebp),%eax +c0101c81: 89 cb mov %ecx,%ebx +c0101c83: 89 df mov %ebx,%edi +c0101c85: 89 c1 mov %eax,%ecx +c0101c87: fc cld +c0101c88: f2 6d repnz insl (%dx),%es:(%edi) +c0101c8a: 89 c8 mov %ecx,%eax +c0101c8c: 89 fb mov %edi,%ebx +c0101c8e: 89 5d cc mov %ebx,-0x34(%ebp) +c0101c91: 89 45 c8 mov %eax,-0x38(%ebp) +} +c0101c94: 90 nop + for (; nsecs > 0; nsecs --, dst += SECTSIZE) { +c0101c95: ff 4d 14 decl 0x14(%ebp) +c0101c98: 81 45 10 00 02 00 00 addl $0x200,0x10(%ebp) +c0101c9f: 83 7d 14 00 cmpl $0x0,0x14(%ebp) +c0101ca3: 75 a2 jne c0101c47 + } - if (irq_mask != 0xFFFF) { -c0102128: 0f b7 05 50 85 12 c0 movzwl 0xc0128550,%eax -c010212f: 3d ff ff 00 00 cmp $0xffff,%eax -c0102134: 74 0f je c0102145 - pic_setmask(irq_mask); -c0102136: 0f b7 05 50 85 12 c0 movzwl 0xc0128550,%eax -c010213d: 89 04 24 mov %eax,(%esp) -c0102140: e8 21 fe ff ff call c0101f66 +out: +c0101ca5: eb 01 jmp c0101ca8 + goto out; +c0101ca7: 90 nop + return ret; +c0101ca8: 8b 45 f4 mov -0xc(%ebp),%eax +} +c0101cab: 83 c4 50 add $0x50,%esp +c0101cae: 5b pop %ebx +c0101caf: 5f pop %edi +c0101cb0: 5d pop %ebp +c0101cb1: c3 ret + +c0101cb2 : + +int +ide_write_secs(unsigned short ideno, uint32_t secno, const void *src, size_t nsecs) { +c0101cb2: 55 push %ebp +c0101cb3: 89 e5 mov %esp,%ebp +c0101cb5: 56 push %esi +c0101cb6: 53 push %ebx +c0101cb7: 83 ec 50 sub $0x50,%esp +c0101cba: 8b 45 08 mov 0x8(%ebp),%eax +c0101cbd: 66 89 45 c4 mov %ax,-0x3c(%ebp) + assert(nsecs <= MAX_NSECS && VALID_IDE(ideno)); +c0101cc1: 81 7d 14 80 00 00 00 cmpl $0x80,0x14(%ebp) +c0101cc8: 77 23 ja c0101ced +c0101cca: 0f b7 45 c4 movzwl -0x3c(%ebp),%eax +c0101cce: 83 f8 03 cmp $0x3,%eax +c0101cd1: 77 1a ja c0101ced +c0101cd3: 0f b7 55 c4 movzwl -0x3c(%ebp),%edx +c0101cd7: 89 d0 mov %edx,%eax +c0101cd9: c1 e0 03 shl $0x3,%eax +c0101cdc: 29 d0 sub %edx,%eax +c0101cde: c1 e0 03 shl $0x3,%eax +c0101ce1: 05 80 b6 12 c0 add $0xc012b680,%eax +c0101ce6: 0f b6 00 movzbl (%eax),%eax +c0101ce9: 84 c0 test %al,%al +c0101ceb: 75 24 jne c0101d11 +c0101ced: c7 44 24 0c 44 a4 10 movl $0xc010a444,0xc(%esp) +c0101cf4: c0 +c0101cf5: c7 44 24 08 ff a3 10 movl $0xc010a3ff,0x8(%esp) +c0101cfc: c0 +c0101cfd: c7 44 24 04 bc 00 00 movl $0xbc,0x4(%esp) +c0101d04: 00 +c0101d05: c7 04 24 14 a4 10 c0 movl $0xc010a414,(%esp) +c0101d0c: e8 34 ef ff ff call c0100c45 <__panic> + assert(secno < MAX_DISK_NSECS && secno + nsecs <= MAX_DISK_NSECS); +c0101d11: 81 7d 0c ff ff ff 0f cmpl $0xfffffff,0xc(%ebp) +c0101d18: 77 0f ja c0101d29 +c0101d1a: 8b 55 0c mov 0xc(%ebp),%edx +c0101d1d: 8b 45 14 mov 0x14(%ebp),%eax +c0101d20: 01 d0 add %edx,%eax +c0101d22: 3d 00 00 00 10 cmp $0x10000000,%eax +c0101d27: 76 24 jbe c0101d4d +c0101d29: c7 44 24 0c 6c a4 10 movl $0xc010a46c,0xc(%esp) +c0101d30: c0 +c0101d31: c7 44 24 08 ff a3 10 movl $0xc010a3ff,0x8(%esp) +c0101d38: c0 +c0101d39: c7 44 24 04 bd 00 00 movl $0xbd,0x4(%esp) +c0101d40: 00 +c0101d41: c7 04 24 14 a4 10 c0 movl $0xc010a414,(%esp) +c0101d48: e8 f8 ee ff ff call c0100c45 <__panic> + unsigned short iobase = IO_BASE(ideno), ioctrl = IO_CTRL(ideno); +c0101d4d: 0f b7 45 c4 movzwl -0x3c(%ebp),%eax +c0101d51: d1 e8 shr %eax +c0101d53: 0f b7 c0 movzwl %ax,%eax +c0101d56: 8b 04 85 b4 a3 10 c0 mov -0x3fef5c4c(,%eax,4),%eax +c0101d5d: 66 89 45 f2 mov %ax,-0xe(%ebp) +c0101d61: 0f b7 45 c4 movzwl -0x3c(%ebp),%eax +c0101d65: d1 e8 shr %eax +c0101d67: 0f b7 c0 movzwl %ax,%eax +c0101d6a: 0f b7 04 85 b6 a3 10 movzwl -0x3fef5c4a(,%eax,4),%eax +c0101d71: c0 +c0101d72: 66 89 45 f0 mov %ax,-0x10(%ebp) + + ide_wait_ready(iobase, 0); +c0101d76: 0f b7 45 f2 movzwl -0xe(%ebp),%eax +c0101d7a: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c0101d81: 00 +c0101d82: 89 04 24 mov %eax,(%esp) +c0101d85: e8 0c f9 ff ff call c0101696 + + // generate interrupt + outb(ioctrl + ISA_CTRL, 0); +c0101d8a: 8b 45 f0 mov -0x10(%ebp),%eax +c0101d8d: 83 c0 02 add $0x2,%eax +c0101d90: 0f b7 c0 movzwl %ax,%eax +c0101d93: 66 89 45 d6 mov %ax,-0x2a(%ebp) +c0101d97: c6 45 d5 00 movb $0x0,-0x2b(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101d9b: 0f b6 45 d5 movzbl -0x2b(%ebp),%eax +c0101d9f: 0f b7 55 d6 movzwl -0x2a(%ebp),%edx +c0101da3: ee out %al,(%dx) +} +c0101da4: 90 nop + outb(iobase + ISA_SECCNT, nsecs); +c0101da5: 8b 45 14 mov 0x14(%ebp),%eax +c0101da8: 0f b6 c0 movzbl %al,%eax +c0101dab: 0f b7 55 f2 movzwl -0xe(%ebp),%edx +c0101daf: 83 c2 02 add $0x2,%edx +c0101db2: 0f b7 d2 movzwl %dx,%edx +c0101db5: 66 89 55 da mov %dx,-0x26(%ebp) +c0101db9: 88 45 d9 mov %al,-0x27(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101dbc: 0f b6 45 d9 movzbl -0x27(%ebp),%eax +c0101dc0: 0f b7 55 da movzwl -0x26(%ebp),%edx +c0101dc4: ee out %al,(%dx) +} +c0101dc5: 90 nop + outb(iobase + ISA_SECTOR, secno & 0xFF); +c0101dc6: 8b 45 0c mov 0xc(%ebp),%eax +c0101dc9: 0f b6 c0 movzbl %al,%eax +c0101dcc: 0f b7 55 f2 movzwl -0xe(%ebp),%edx +c0101dd0: 83 c2 03 add $0x3,%edx +c0101dd3: 0f b7 d2 movzwl %dx,%edx +c0101dd6: 66 89 55 de mov %dx,-0x22(%ebp) +c0101dda: 88 45 dd mov %al,-0x23(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101ddd: 0f b6 45 dd movzbl -0x23(%ebp),%eax +c0101de1: 0f b7 55 de movzwl -0x22(%ebp),%edx +c0101de5: ee out %al,(%dx) +} +c0101de6: 90 nop + outb(iobase + ISA_CYL_LO, (secno >> 8) & 0xFF); +c0101de7: 8b 45 0c mov 0xc(%ebp),%eax +c0101dea: c1 e8 08 shr $0x8,%eax +c0101ded: 0f b6 c0 movzbl %al,%eax +c0101df0: 0f b7 55 f2 movzwl -0xe(%ebp),%edx +c0101df4: 83 c2 04 add $0x4,%edx +c0101df7: 0f b7 d2 movzwl %dx,%edx +c0101dfa: 66 89 55 e2 mov %dx,-0x1e(%ebp) +c0101dfe: 88 45 e1 mov %al,-0x1f(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101e01: 0f b6 45 e1 movzbl -0x1f(%ebp),%eax +c0101e05: 0f b7 55 e2 movzwl -0x1e(%ebp),%edx +c0101e09: ee out %al,(%dx) +} +c0101e0a: 90 nop + outb(iobase + ISA_CYL_HI, (secno >> 16) & 0xFF); +c0101e0b: 8b 45 0c mov 0xc(%ebp),%eax +c0101e0e: c1 e8 10 shr $0x10,%eax +c0101e11: 0f b6 c0 movzbl %al,%eax +c0101e14: 0f b7 55 f2 movzwl -0xe(%ebp),%edx +c0101e18: 83 c2 05 add $0x5,%edx +c0101e1b: 0f b7 d2 movzwl %dx,%edx +c0101e1e: 66 89 55 e6 mov %dx,-0x1a(%ebp) +c0101e22: 88 45 e5 mov %al,-0x1b(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101e25: 0f b6 45 e5 movzbl -0x1b(%ebp),%eax +c0101e29: 0f b7 55 e6 movzwl -0x1a(%ebp),%edx +c0101e2d: ee out %al,(%dx) +} +c0101e2e: 90 nop + outb(iobase + ISA_SDH, 0xE0 | ((ideno & 1) << 4) | ((secno >> 24) & 0xF)); +c0101e2f: 8b 45 c4 mov -0x3c(%ebp),%eax +c0101e32: c0 e0 04 shl $0x4,%al +c0101e35: 24 10 and $0x10,%al +c0101e37: 88 c2 mov %al,%dl +c0101e39: 8b 45 0c mov 0xc(%ebp),%eax +c0101e3c: c1 e8 18 shr $0x18,%eax +c0101e3f: 24 0f and $0xf,%al +c0101e41: 08 d0 or %dl,%al +c0101e43: 0c e0 or $0xe0,%al +c0101e45: 0f b6 c0 movzbl %al,%eax +c0101e48: 0f b7 55 f2 movzwl -0xe(%ebp),%edx +c0101e4c: 83 c2 06 add $0x6,%edx +c0101e4f: 0f b7 d2 movzwl %dx,%edx +c0101e52: 66 89 55 ea mov %dx,-0x16(%ebp) +c0101e56: 88 45 e9 mov %al,-0x17(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101e59: 0f b6 45 e9 movzbl -0x17(%ebp),%eax +c0101e5d: 0f b7 55 ea movzwl -0x16(%ebp),%edx +c0101e61: ee out %al,(%dx) +} +c0101e62: 90 nop + outb(iobase + ISA_COMMAND, IDE_CMD_WRITE); +c0101e63: 0f b7 45 f2 movzwl -0xe(%ebp),%eax +c0101e67: 83 c0 07 add $0x7,%eax +c0101e6a: 0f b7 c0 movzwl %ax,%eax +c0101e6d: 66 89 45 ee mov %ax,-0x12(%ebp) +c0101e71: c6 45 ed 30 movb $0x30,-0x13(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101e75: 0f b6 45 ed movzbl -0x13(%ebp),%eax +c0101e79: 0f b7 55 ee movzwl -0x12(%ebp),%edx +c0101e7d: ee out %al,(%dx) +} +c0101e7e: 90 nop + + int ret = 0; +c0101e7f: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) + for (; nsecs > 0; nsecs --, src += SECTSIZE) { +c0101e86: eb 58 jmp c0101ee0 + if ((ret = ide_wait_ready(iobase, 1)) != 0) { +c0101e88: 0f b7 45 f2 movzwl -0xe(%ebp),%eax +c0101e8c: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c0101e93: 00 +c0101e94: 89 04 24 mov %eax,(%esp) +c0101e97: e8 fa f7 ff ff call c0101696 +c0101e9c: 89 45 f4 mov %eax,-0xc(%ebp) +c0101e9f: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0101ea3: 75 43 jne c0101ee8 + goto out; + } + outsl(iobase, src, SECTSIZE / sizeof(uint32_t)); +c0101ea5: 0f b7 45 f2 movzwl -0xe(%ebp),%eax +c0101ea9: 89 45 d0 mov %eax,-0x30(%ebp) +c0101eac: 8b 45 10 mov 0x10(%ebp),%eax +c0101eaf: 89 45 cc mov %eax,-0x34(%ebp) +c0101eb2: c7 45 c8 80 00 00 00 movl $0x80,-0x38(%ebp) + asm volatile ( +c0101eb9: 8b 55 d0 mov -0x30(%ebp),%edx +c0101ebc: 8b 4d cc mov -0x34(%ebp),%ecx +c0101ebf: 8b 45 c8 mov -0x38(%ebp),%eax +c0101ec2: 89 cb mov %ecx,%ebx +c0101ec4: 89 de mov %ebx,%esi +c0101ec6: 89 c1 mov %eax,%ecx +c0101ec8: fc cld +c0101ec9: f2 6f repnz outsl %ds:(%esi),(%dx) +c0101ecb: 89 c8 mov %ecx,%eax +c0101ecd: 89 f3 mov %esi,%ebx +c0101ecf: 89 5d cc mov %ebx,-0x34(%ebp) +c0101ed2: 89 45 c8 mov %eax,-0x38(%ebp) +} +c0101ed5: 90 nop + for (; nsecs > 0; nsecs --, src += SECTSIZE) { +c0101ed6: ff 4d 14 decl 0x14(%ebp) +c0101ed9: 81 45 10 00 02 00 00 addl $0x200,0x10(%ebp) +c0101ee0: 83 7d 14 00 cmpl $0x0,0x14(%ebp) +c0101ee4: 75 a2 jne c0101e88 } + +out: +c0101ee6: eb 01 jmp c0101ee9 + goto out; +c0101ee8: 90 nop + return ret; +c0101ee9: 8b 45 f4 mov -0xc(%ebp),%eax } -c0102145: 90 nop -c0102146: c9 leave -c0102147: c3 ret +c0101eec: 83 c4 50 add $0x50,%esp +c0101eef: 5b pop %ebx +c0101ef0: 5e pop %esi +c0101ef1: 5d pop %ebp +c0101ef2: c3 ret -c0102148 : +c0101ef3 : #include #include /* intr_enable - enable irq interrupt */ void intr_enable(void) { -c0102148: f3 0f 1e fb endbr32 -c010214c: 55 push %ebp -c010214d: 89 e5 mov %esp,%ebp +c0101ef3: 55 push %ebp +c0101ef4: 89 e5 mov %esp,%ebp asm volatile ("sti"); -c010214f: fb sti +c0101ef6: fb sti } -c0102150: 90 nop +c0101ef7: 90 nop sti(); } -c0102151: 90 nop -c0102152: 5d pop %ebp -c0102153: c3 ret +c0101ef8: 90 nop +c0101ef9: 5d pop %ebp +c0101efa: c3 ret -c0102154 : +c0101efb : /* intr_disable - disable irq interrupt */ void intr_disable(void) { -c0102154: f3 0f 1e fb endbr32 -c0102158: 55 push %ebp -c0102159: 89 e5 mov %esp,%ebp +c0101efb: 55 push %ebp +c0101efc: 89 e5 mov %esp,%ebp asm volatile ("cli" ::: "memory"); -c010215b: fa cli +c0101efe: fa cli } -c010215c: 90 nop +c0101eff: 90 nop cli(); } -c010215d: 90 nop -c010215e: 5d pop %ebp -c010215f: c3 ret +c0101f00: 90 nop +c0101f01: 5d pop %ebp +c0101f02: c3 ret + +c0101f03 : +// Initial IRQ mask has interrupt 2 enabled (for slave 8259A). +static uint16_t irq_mask = 0xFFFF & ~(1 << IRQ_SLAVE); +static bool did_init = 0; + +static void +pic_setmask(uint16_t mask) { +c0101f03: 55 push %ebp +c0101f04: 89 e5 mov %esp,%ebp +c0101f06: 83 ec 14 sub $0x14,%esp +c0101f09: 8b 45 08 mov 0x8(%ebp),%eax +c0101f0c: 66 89 45 ec mov %ax,-0x14(%ebp) + irq_mask = mask; +c0101f10: 8b 45 ec mov -0x14(%ebp),%eax +c0101f13: 66 a3 50 85 12 c0 mov %ax,0xc0128550 + if (did_init) { +c0101f19: a1 60 b7 12 c0 mov 0xc012b760,%eax +c0101f1e: 85 c0 test %eax,%eax +c0101f20: 74 39 je c0101f5b + outb(IO_PIC1 + 1, mask); +c0101f22: 8b 45 ec mov -0x14(%ebp),%eax +c0101f25: 0f b6 c0 movzbl %al,%eax +c0101f28: 66 c7 45 fa 21 00 movw $0x21,-0x6(%ebp) +c0101f2e: 88 45 f9 mov %al,-0x7(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101f31: 0f b6 45 f9 movzbl -0x7(%ebp),%eax +c0101f35: 0f b7 55 fa movzwl -0x6(%ebp),%edx +c0101f39: ee out %al,(%dx) +} +c0101f3a: 90 nop + outb(IO_PIC2 + 1, mask >> 8); +c0101f3b: 0f b7 45 ec movzwl -0x14(%ebp),%eax +c0101f3f: c1 e8 08 shr $0x8,%eax +c0101f42: 0f b7 c0 movzwl %ax,%eax +c0101f45: 0f b6 c0 movzbl %al,%eax +c0101f48: 66 c7 45 fe a1 00 movw $0xa1,-0x2(%ebp) +c0101f4e: 88 45 fd mov %al,-0x3(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101f51: 0f b6 45 fd movzbl -0x3(%ebp),%eax +c0101f55: 0f b7 55 fe movzwl -0x2(%ebp),%edx +c0101f59: ee out %al,(%dx) +} +c0101f5a: 90 nop + } +} +c0101f5b: 90 nop +c0101f5c: 89 ec mov %ebp,%esp +c0101f5e: 5d pop %ebp +c0101f5f: c3 ret + +c0101f60 : + +void +pic_enable(unsigned int irq) { +c0101f60: 55 push %ebp +c0101f61: 89 e5 mov %esp,%ebp +c0101f63: 83 ec 04 sub $0x4,%esp + pic_setmask(irq_mask & ~(1 << irq)); +c0101f66: 8b 45 08 mov 0x8(%ebp),%eax +c0101f69: ba 01 00 00 00 mov $0x1,%edx +c0101f6e: 88 c1 mov %al,%cl +c0101f70: d3 e2 shl %cl,%edx +c0101f72: 89 d0 mov %edx,%eax +c0101f74: 98 cwtl +c0101f75: f7 d0 not %eax +c0101f77: 0f bf d0 movswl %ax,%edx +c0101f7a: 0f b7 05 50 85 12 c0 movzwl 0xc0128550,%eax +c0101f81: 98 cwtl +c0101f82: 21 d0 and %edx,%eax +c0101f84: 98 cwtl +c0101f85: 0f b7 c0 movzwl %ax,%eax +c0101f88: 89 04 24 mov %eax,(%esp) +c0101f8b: e8 73 ff ff ff call c0101f03 +} +c0101f90: 90 nop +c0101f91: 89 ec mov %ebp,%esp +c0101f93: 5d pop %ebp +c0101f94: c3 ret + +c0101f95 : + +/* pic_init - initialize the 8259A interrupt controllers */ +void +pic_init(void) { +c0101f95: 55 push %ebp +c0101f96: 89 e5 mov %esp,%ebp +c0101f98: 83 ec 44 sub $0x44,%esp + did_init = 1; +c0101f9b: c7 05 60 b7 12 c0 01 movl $0x1,0xc012b760 +c0101fa2: 00 00 00 +c0101fa5: 66 c7 45 ca 21 00 movw $0x21,-0x36(%ebp) +c0101fab: c6 45 c9 ff movb $0xff,-0x37(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101faf: 0f b6 45 c9 movzbl -0x37(%ebp),%eax +c0101fb3: 0f b7 55 ca movzwl -0x36(%ebp),%edx +c0101fb7: ee out %al,(%dx) +} +c0101fb8: 90 nop +c0101fb9: 66 c7 45 ce a1 00 movw $0xa1,-0x32(%ebp) +c0101fbf: c6 45 cd ff movb $0xff,-0x33(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101fc3: 0f b6 45 cd movzbl -0x33(%ebp),%eax +c0101fc7: 0f b7 55 ce movzwl -0x32(%ebp),%edx +c0101fcb: ee out %al,(%dx) +} +c0101fcc: 90 nop +c0101fcd: 66 c7 45 d2 20 00 movw $0x20,-0x2e(%ebp) +c0101fd3: c6 45 d1 11 movb $0x11,-0x2f(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101fd7: 0f b6 45 d1 movzbl -0x2f(%ebp),%eax +c0101fdb: 0f b7 55 d2 movzwl -0x2e(%ebp),%edx +c0101fdf: ee out %al,(%dx) +} +c0101fe0: 90 nop +c0101fe1: 66 c7 45 d6 21 00 movw $0x21,-0x2a(%ebp) +c0101fe7: c6 45 d5 20 movb $0x20,-0x2b(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101feb: 0f b6 45 d5 movzbl -0x2b(%ebp),%eax +c0101fef: 0f b7 55 d6 movzwl -0x2a(%ebp),%edx +c0101ff3: ee out %al,(%dx) +} +c0101ff4: 90 nop +c0101ff5: 66 c7 45 da 21 00 movw $0x21,-0x26(%ebp) +c0101ffb: c6 45 d9 04 movb $0x4,-0x27(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0101fff: 0f b6 45 d9 movzbl -0x27(%ebp),%eax +c0102003: 0f b7 55 da movzwl -0x26(%ebp),%edx +c0102007: ee out %al,(%dx) +} +c0102008: 90 nop +c0102009: 66 c7 45 de 21 00 movw $0x21,-0x22(%ebp) +c010200f: c6 45 dd 03 movb $0x3,-0x23(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0102013: 0f b6 45 dd movzbl -0x23(%ebp),%eax +c0102017: 0f b7 55 de movzwl -0x22(%ebp),%edx +c010201b: ee out %al,(%dx) +} +c010201c: 90 nop +c010201d: 66 c7 45 e2 a0 00 movw $0xa0,-0x1e(%ebp) +c0102023: c6 45 e1 11 movb $0x11,-0x1f(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0102027: 0f b6 45 e1 movzbl -0x1f(%ebp),%eax +c010202b: 0f b7 55 e2 movzwl -0x1e(%ebp),%edx +c010202f: ee out %al,(%dx) +} +c0102030: 90 nop +c0102031: 66 c7 45 e6 a1 00 movw $0xa1,-0x1a(%ebp) +c0102037: c6 45 e5 28 movb $0x28,-0x1b(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c010203b: 0f b6 45 e5 movzbl -0x1b(%ebp),%eax +c010203f: 0f b7 55 e6 movzwl -0x1a(%ebp),%edx +c0102043: ee out %al,(%dx) +} +c0102044: 90 nop +c0102045: 66 c7 45 ea a1 00 movw $0xa1,-0x16(%ebp) +c010204b: c6 45 e9 02 movb $0x2,-0x17(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c010204f: 0f b6 45 e9 movzbl -0x17(%ebp),%eax +c0102053: 0f b7 55 ea movzwl -0x16(%ebp),%edx +c0102057: ee out %al,(%dx) +} +c0102058: 90 nop +c0102059: 66 c7 45 ee a1 00 movw $0xa1,-0x12(%ebp) +c010205f: c6 45 ed 03 movb $0x3,-0x13(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0102063: 0f b6 45 ed movzbl -0x13(%ebp),%eax +c0102067: 0f b7 55 ee movzwl -0x12(%ebp),%edx +c010206b: ee out %al,(%dx) +} +c010206c: 90 nop +c010206d: 66 c7 45 f2 20 00 movw $0x20,-0xe(%ebp) +c0102073: c6 45 f1 68 movb $0x68,-0xf(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c0102077: 0f b6 45 f1 movzbl -0xf(%ebp),%eax +c010207b: 0f b7 55 f2 movzwl -0xe(%ebp),%edx +c010207f: ee out %al,(%dx) +} +c0102080: 90 nop +c0102081: 66 c7 45 f6 20 00 movw $0x20,-0xa(%ebp) +c0102087: c6 45 f5 0a movb $0xa,-0xb(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c010208b: 0f b6 45 f5 movzbl -0xb(%ebp),%eax +c010208f: 0f b7 55 f6 movzwl -0xa(%ebp),%edx +c0102093: ee out %al,(%dx) +} +c0102094: 90 nop +c0102095: 66 c7 45 fa a0 00 movw $0xa0,-0x6(%ebp) +c010209b: c6 45 f9 68 movb $0x68,-0x7(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c010209f: 0f b6 45 f9 movzbl -0x7(%ebp),%eax +c01020a3: 0f b7 55 fa movzwl -0x6(%ebp),%edx +c01020a7: ee out %al,(%dx) +} +c01020a8: 90 nop +c01020a9: 66 c7 45 fe a0 00 movw $0xa0,-0x2(%ebp) +c01020af: c6 45 fd 0a movb $0xa,-0x3(%ebp) + asm volatile ("outb %0, %1" :: "a" (data), "d" (port) : "memory"); +c01020b3: 0f b6 45 fd movzbl -0x3(%ebp),%eax +c01020b7: 0f b7 55 fe movzwl -0x2(%ebp),%edx +c01020bb: ee out %al,(%dx) +} +c01020bc: 90 nop + outb(IO_PIC1, 0x0a); // read IRR by default + + outb(IO_PIC2, 0x68); // OCW3 + outb(IO_PIC2, 0x0a); // OCW3 + + if (irq_mask != 0xFFFF) { +c01020bd: 0f b7 05 50 85 12 c0 movzwl 0xc0128550,%eax +c01020c4: 3d ff ff 00 00 cmp $0xffff,%eax +c01020c9: 74 0f je c01020da + pic_setmask(irq_mask); +c01020cb: 0f b7 05 50 85 12 c0 movzwl 0xc0128550,%eax +c01020d2: 89 04 24 mov %eax,(%esp) +c01020d5: e8 29 fe ff ff call c0101f03 + } +} +c01020da: 90 nop +c01020db: 89 ec mov %ebp,%esp +c01020dd: 5d pop %ebp +c01020de: c3 ret -c0102160 : +c01020df : #include #include #define TICK_NUM 100 static void print_ticks() { -c0102160: f3 0f 1e fb endbr32 -c0102164: 55 push %ebp -c0102165: 89 e5 mov %esp,%ebp -c0102167: 83 ec 18 sub $0x18,%esp +c01020df: 55 push %ebp +c01020e0: 89 e5 mov %esp,%ebp +c01020e2: 83 ec 18 sub $0x18,%esp cprintf("%d ticks\n",TICK_NUM); -c010216a: c7 44 24 04 64 00 00 movl $0x64,0x4(%esp) -c0102171: 00 -c0102172: c7 04 24 e0 a6 10 c0 movl $0xc010a6e0,(%esp) -c0102179: e8 59 e1 ff ff call c01002d7 +c01020e5: c7 44 24 04 64 00 00 movl $0x64,0x4(%esp) +c01020ec: 00 +c01020ed: c7 04 24 c0 a4 10 c0 movl $0xc010a4c0,(%esp) +c01020f4: e8 7f e2 ff ff call c0100378 #ifdef DEBUG_GRADE cprintf("End of Test.\n"); panic("EOT: kernel seems ok.");//panic 是一个用于处理内核崩溃的函数,它会打印出错误信息并导致系统停止运行。 #endif } -c010217e: 90 nop -c010217f: c9 leave -c0102180: c3 ret +c01020f9: 90 nop +c01020fa: 89 ec mov %ebp,%esp +c01020fc: 5d pop %ebp +c01020fd: c3 ret -c0102181 : +c01020fe : sizeof(idt) - 1, (uintptr_t)idt }; /* idt_init - initialize IDT to each of the entry points in kern/trap/vectors.S */ void idt_init(void) { -c0102181: f3 0f 1e fb endbr32 -c0102185: 55 push %ebp -c0102186: 89 e5 mov %esp,%ebp -c0102188: 83 ec 10 sub $0x10,%esp +c01020fe: 55 push %ebp +c01020ff: 89 e5 mov %esp,%ebp +c0102101: 83 ec 10 sub $0x10,%esp * Notice: the argument of lidt is idt_pd. try to find it! */ extern uintptr_t __vectors[];//声明了一个外部数组 __vectors,该数组存储中断服务例程(ISR)的地址。 int i; for (i = 0; i < sizeof(idt) / sizeof(struct gatedesc); i ++) { -c010218b: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) -c0102192: e9 c4 00 00 00 jmp c010225b +c0102104: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) +c010210b: e9 c4 00 00 00 jmp c01021d4 SETGATE(idt[i], 0, GD_KTEXT, __vectors[i], DPL_KERNEL); -c0102197: 8b 45 fc mov -0x4(%ebp),%eax -c010219a: 8b 04 85 e0 85 12 c0 mov -0x3fed7a20(,%eax,4),%eax -c01021a1: 0f b7 d0 movzwl %ax,%edx -c01021a4: 8b 45 fc mov -0x4(%ebp),%eax -c01021a7: 66 89 14 c5 60 b7 12 mov %dx,-0x3fed48a0(,%eax,8) -c01021ae: c0 -c01021af: 8b 45 fc mov -0x4(%ebp),%eax -c01021b2: 66 c7 04 c5 62 b7 12 movw $0x8,-0x3fed489e(,%eax,8) -c01021b9: c0 08 00 -c01021bc: 8b 45 fc mov -0x4(%ebp),%eax -c01021bf: 0f b6 14 c5 64 b7 12 movzbl -0x3fed489c(,%eax,8),%edx -c01021c6: c0 -c01021c7: 80 e2 e0 and $0xe0,%dl -c01021ca: 88 14 c5 64 b7 12 c0 mov %dl,-0x3fed489c(,%eax,8) -c01021d1: 8b 45 fc mov -0x4(%ebp),%eax -c01021d4: 0f b6 14 c5 64 b7 12 movzbl -0x3fed489c(,%eax,8),%edx -c01021db: c0 -c01021dc: 80 e2 1f and $0x1f,%dl -c01021df: 88 14 c5 64 b7 12 c0 mov %dl,-0x3fed489c(,%eax,8) -c01021e6: 8b 45 fc mov -0x4(%ebp),%eax -c01021e9: 0f b6 14 c5 65 b7 12 movzbl -0x3fed489b(,%eax,8),%edx -c01021f0: c0 -c01021f1: 80 e2 f0 and $0xf0,%dl -c01021f4: 80 ca 0e or $0xe,%dl -c01021f7: 88 14 c5 65 b7 12 c0 mov %dl,-0x3fed489b(,%eax,8) -c01021fe: 8b 45 fc mov -0x4(%ebp),%eax -c0102201: 0f b6 14 c5 65 b7 12 movzbl -0x3fed489b(,%eax,8),%edx -c0102208: c0 -c0102209: 80 e2 ef and $0xef,%dl -c010220c: 88 14 c5 65 b7 12 c0 mov %dl,-0x3fed489b(,%eax,8) -c0102213: 8b 45 fc mov -0x4(%ebp),%eax -c0102216: 0f b6 14 c5 65 b7 12 movzbl -0x3fed489b(,%eax,8),%edx -c010221d: c0 -c010221e: 80 e2 9f and $0x9f,%dl -c0102221: 88 14 c5 65 b7 12 c0 mov %dl,-0x3fed489b(,%eax,8) -c0102228: 8b 45 fc mov -0x4(%ebp),%eax -c010222b: 0f b6 14 c5 65 b7 12 movzbl -0x3fed489b(,%eax,8),%edx -c0102232: c0 -c0102233: 80 ca 80 or $0x80,%dl -c0102236: 88 14 c5 65 b7 12 c0 mov %dl,-0x3fed489b(,%eax,8) -c010223d: 8b 45 fc mov -0x4(%ebp),%eax -c0102240: 8b 04 85 e0 85 12 c0 mov -0x3fed7a20(,%eax,4),%eax -c0102247: c1 e8 10 shr $0x10,%eax -c010224a: 0f b7 d0 movzwl %ax,%edx -c010224d: 8b 45 fc mov -0x4(%ebp),%eax -c0102250: 66 89 14 c5 66 b7 12 mov %dx,-0x3fed489a(,%eax,8) -c0102257: c0 +c0102110: 8b 45 fc mov -0x4(%ebp),%eax +c0102113: 8b 04 85 e0 85 12 c0 mov -0x3fed7a20(,%eax,4),%eax +c010211a: 0f b7 d0 movzwl %ax,%edx +c010211d: 8b 45 fc mov -0x4(%ebp),%eax +c0102120: 66 89 14 c5 e0 b7 12 mov %dx,-0x3fed4820(,%eax,8) +c0102127: c0 +c0102128: 8b 45 fc mov -0x4(%ebp),%eax +c010212b: 66 c7 04 c5 e2 b7 12 movw $0x8,-0x3fed481e(,%eax,8) +c0102132: c0 08 00 +c0102135: 8b 45 fc mov -0x4(%ebp),%eax +c0102138: 0f b6 14 c5 e4 b7 12 movzbl -0x3fed481c(,%eax,8),%edx +c010213f: c0 +c0102140: 80 e2 e0 and $0xe0,%dl +c0102143: 88 14 c5 e4 b7 12 c0 mov %dl,-0x3fed481c(,%eax,8) +c010214a: 8b 45 fc mov -0x4(%ebp),%eax +c010214d: 0f b6 14 c5 e4 b7 12 movzbl -0x3fed481c(,%eax,8),%edx +c0102154: c0 +c0102155: 80 e2 1f and $0x1f,%dl +c0102158: 88 14 c5 e4 b7 12 c0 mov %dl,-0x3fed481c(,%eax,8) +c010215f: 8b 45 fc mov -0x4(%ebp),%eax +c0102162: 0f b6 14 c5 e5 b7 12 movzbl -0x3fed481b(,%eax,8),%edx +c0102169: c0 +c010216a: 80 e2 f0 and $0xf0,%dl +c010216d: 80 ca 0e or $0xe,%dl +c0102170: 88 14 c5 e5 b7 12 c0 mov %dl,-0x3fed481b(,%eax,8) +c0102177: 8b 45 fc mov -0x4(%ebp),%eax +c010217a: 0f b6 14 c5 e5 b7 12 movzbl -0x3fed481b(,%eax,8),%edx +c0102181: c0 +c0102182: 80 e2 ef and $0xef,%dl +c0102185: 88 14 c5 e5 b7 12 c0 mov %dl,-0x3fed481b(,%eax,8) +c010218c: 8b 45 fc mov -0x4(%ebp),%eax +c010218f: 0f b6 14 c5 e5 b7 12 movzbl -0x3fed481b(,%eax,8),%edx +c0102196: c0 +c0102197: 80 e2 9f and $0x9f,%dl +c010219a: 88 14 c5 e5 b7 12 c0 mov %dl,-0x3fed481b(,%eax,8) +c01021a1: 8b 45 fc mov -0x4(%ebp),%eax +c01021a4: 0f b6 14 c5 e5 b7 12 movzbl -0x3fed481b(,%eax,8),%edx +c01021ab: c0 +c01021ac: 80 ca 80 or $0x80,%dl +c01021af: 88 14 c5 e5 b7 12 c0 mov %dl,-0x3fed481b(,%eax,8) +c01021b6: 8b 45 fc mov -0x4(%ebp),%eax +c01021b9: 8b 04 85 e0 85 12 c0 mov -0x3fed7a20(,%eax,4),%eax +c01021c0: c1 e8 10 shr $0x10,%eax +c01021c3: 0f b7 d0 movzwl %ax,%edx +c01021c6: 8b 45 fc mov -0x4(%ebp),%eax +c01021c9: 66 89 14 c5 e6 b7 12 mov %dx,-0x3fed481a(,%eax,8) +c01021d0: c0 for (i = 0; i < sizeof(idt) / sizeof(struct gatedesc); i ++) { -c0102258: ff 45 fc incl -0x4(%ebp) -c010225b: 8b 45 fc mov -0x4(%ebp),%eax -c010225e: 3d ff 00 00 00 cmp $0xff,%eax -c0102263: 0f 86 2e ff ff ff jbe c0102197 +c01021d1: ff 45 fc incl -0x4(%ebp) +c01021d4: 8b 45 fc mov -0x4(%ebp),%eax +c01021d7: 3d ff 00 00 00 cmp $0xff,%eax +c01021dc: 0f 86 2e ff ff ff jbe c0102110 //宏用于配置每个 IDT 条目.0 表示最高特权级(内核级)GD_KTEXT: 指向内核代码段的选择子,确保 ISR 在内核代码段中执行。 //__vectors[i]: 对应中断的 ISR 地址,DPL_KERNEL: 描述符特权级,表示该中断只能由内核级代码触发。 // set for switch from user to kernel //SETGATE 这行代码特别设置了 T_SWITCH_TOK(一个特定的中断向量,用于用户态到内核态的切换)的 IDT 条目。 //DPL_USER 表示该中断可以由用户态代码触发 SETGATE(idt[T_SWITCH_TOK], 0, GD_KTEXT, __vectors[T_SWITCH_TOK], DPL_USER); -c0102269: a1 c4 87 12 c0 mov 0xc01287c4,%eax -c010226e: 0f b7 c0 movzwl %ax,%eax -c0102271: 66 a3 28 bb 12 c0 mov %ax,0xc012bb28 -c0102277: 66 c7 05 2a bb 12 c0 movw $0x8,0xc012bb2a -c010227e: 08 00 -c0102280: 0f b6 05 2c bb 12 c0 movzbl 0xc012bb2c,%eax -c0102287: 24 e0 and $0xe0,%al -c0102289: a2 2c bb 12 c0 mov %al,0xc012bb2c -c010228e: 0f b6 05 2c bb 12 c0 movzbl 0xc012bb2c,%eax -c0102295: 24 1f and $0x1f,%al -c0102297: a2 2c bb 12 c0 mov %al,0xc012bb2c -c010229c: 0f b6 05 2d bb 12 c0 movzbl 0xc012bb2d,%eax -c01022a3: 24 f0 and $0xf0,%al -c01022a5: 0c 0e or $0xe,%al -c01022a7: a2 2d bb 12 c0 mov %al,0xc012bb2d -c01022ac: 0f b6 05 2d bb 12 c0 movzbl 0xc012bb2d,%eax -c01022b3: 24 ef and $0xef,%al -c01022b5: a2 2d bb 12 c0 mov %al,0xc012bb2d -c01022ba: 0f b6 05 2d bb 12 c0 movzbl 0xc012bb2d,%eax -c01022c1: 0c 60 or $0x60,%al -c01022c3: a2 2d bb 12 c0 mov %al,0xc012bb2d -c01022c8: 0f b6 05 2d bb 12 c0 movzbl 0xc012bb2d,%eax -c01022cf: 0c 80 or $0x80,%al -c01022d1: a2 2d bb 12 c0 mov %al,0xc012bb2d -c01022d6: a1 c4 87 12 c0 mov 0xc01287c4,%eax -c01022db: c1 e8 10 shr $0x10,%eax -c01022de: 0f b7 c0 movzwl %ax,%eax -c01022e1: 66 a3 2e bb 12 c0 mov %ax,0xc012bb2e -c01022e7: c7 45 f8 60 85 12 c0 movl $0xc0128560,-0x8(%ebp) +c01021e2: a1 c4 87 12 c0 mov 0xc01287c4,%eax +c01021e7: 0f b7 c0 movzwl %ax,%eax +c01021ea: 66 a3 a8 bb 12 c0 mov %ax,0xc012bba8 +c01021f0: 66 c7 05 aa bb 12 c0 movw $0x8,0xc012bbaa +c01021f7: 08 00 +c01021f9: 0f b6 05 ac bb 12 c0 movzbl 0xc012bbac,%eax +c0102200: 24 e0 and $0xe0,%al +c0102202: a2 ac bb 12 c0 mov %al,0xc012bbac +c0102207: 0f b6 05 ac bb 12 c0 movzbl 0xc012bbac,%eax +c010220e: 24 1f and $0x1f,%al +c0102210: a2 ac bb 12 c0 mov %al,0xc012bbac +c0102215: 0f b6 05 ad bb 12 c0 movzbl 0xc012bbad,%eax +c010221c: 24 f0 and $0xf0,%al +c010221e: 0c 0e or $0xe,%al +c0102220: a2 ad bb 12 c0 mov %al,0xc012bbad +c0102225: 0f b6 05 ad bb 12 c0 movzbl 0xc012bbad,%eax +c010222c: 24 ef and $0xef,%al +c010222e: a2 ad bb 12 c0 mov %al,0xc012bbad +c0102233: 0f b6 05 ad bb 12 c0 movzbl 0xc012bbad,%eax +c010223a: 0c 60 or $0x60,%al +c010223c: a2 ad bb 12 c0 mov %al,0xc012bbad +c0102241: 0f b6 05 ad bb 12 c0 movzbl 0xc012bbad,%eax +c0102248: 0c 80 or $0x80,%al +c010224a: a2 ad bb 12 c0 mov %al,0xc012bbad +c010224f: a1 c4 87 12 c0 mov 0xc01287c4,%eax +c0102254: c1 e8 10 shr $0x10,%eax +c0102257: 0f b7 c0 movzwl %ax,%eax +c010225a: 66 a3 ae bb 12 c0 mov %ax,0xc012bbae +c0102260: c7 45 f8 60 85 12 c0 movl $0xc0128560,-0x8(%ebp) asm volatile ("lidt (%0)" :: "r" (pd) : "memory"); -c01022ee: 8b 45 f8 mov -0x8(%ebp),%eax -c01022f1: 0f 01 18 lidtl (%eax) +c0102267: 8b 45 f8 mov -0x8(%ebp),%eax +c010226a: 0f 01 18 lidtl (%eax) } -c01022f4: 90 nop +c010226d: 90 nop // load the IDT //使用 lidt 指令将 IDT 描述符加载到 CPU 中 lidt(&idt_pd); } -c01022f5: 90 nop -c01022f6: c9 leave -c01022f7: c3 ret +c010226e: 90 nop +c010226f: 89 ec mov %ebp,%esp +c0102271: 5d pop %ebp +c0102272: c3 ret -c01022f8 : +c0102273 : static const char * trapname(int trapno) { -c01022f8: f3 0f 1e fb endbr32 -c01022fc: 55 push %ebp -c01022fd: 89 e5 mov %esp,%ebp +c0102273: 55 push %ebp +c0102274: 89 e5 mov %esp,%ebp "Alignment Check", "Machine-Check", "SIMD Floating-Point Exception" }; //如果 trapno 小于数组长度,则返回对应的异常名称。 if (trapno < sizeof(excnames)/sizeof(const char * const)) { -c01022ff: 8b 45 08 mov 0x8(%ebp),%eax -c0102302: 83 f8 13 cmp $0x13,%eax -c0102305: 77 0c ja c0102313 +c0102276: 8b 45 08 mov 0x8(%ebp),%eax +c0102279: 83 f8 13 cmp $0x13,%eax +c010227c: 77 0c ja c010228a return excnames[trapno]; -c0102307: 8b 45 08 mov 0x8(%ebp),%eax -c010230a: 8b 04 85 40 ab 10 c0 mov -0x3fef54c0(,%eax,4),%eax -c0102311: eb 18 jmp c010232b +c010227e: 8b 45 08 mov 0x8(%ebp),%eax +c0102281: 8b 04 85 20 a9 10 c0 mov -0x3fef56e0(,%eax,4),%eax +c0102288: eb 18 jmp c01022a2 } //如果 trapno 在 IRQ_OFFSET 和 IRQ_OFFSET + 16 之间,表示它是一个硬件中断 if (trapno >= IRQ_OFFSET && trapno < IRQ_OFFSET + 16) { -c0102313: 83 7d 08 1f cmpl $0x1f,0x8(%ebp) -c0102317: 7e 0d jle c0102326 -c0102319: 83 7d 08 2f cmpl $0x2f,0x8(%ebp) -c010231d: 7f 07 jg c0102326 +c010228a: 83 7d 08 1f cmpl $0x1f,0x8(%ebp) +c010228e: 7e 0d jle c010229d +c0102290: 83 7d 08 2f cmpl $0x2f,0x8(%ebp) +c0102294: 7f 07 jg c010229d return "Hardware Interrupt"; -c010231f: b8 ea a6 10 c0 mov $0xc010a6ea,%eax -c0102324: eb 05 jmp c010232b +c0102296: b8 ca a4 10 c0 mov $0xc010a4ca,%eax +c010229b: eb 05 jmp c01022a2 } return "(unknown trap)"; -c0102326: b8 fd a6 10 c0 mov $0xc010a6fd,%eax +c010229d: b8 dd a4 10 c0 mov $0xc010a4dd,%eax } -c010232b: 5d pop %ebp -c010232c: c3 ret +c01022a2: 5d pop %ebp +c01022a3: c3 ret -c010232d : +c01022a4 : /* trap_in_kernel - test if trap happened in kernel */ bool trap_in_kernel(struct trapframe *tf) { -c010232d: f3 0f 1e fb endbr32 -c0102331: 55 push %ebp -c0102332: 89 e5 mov %esp,%ebp +c01022a4: 55 push %ebp +c01022a5: 89 e5 mov %esp,%ebp return (tf->tf_cs == (uint16_t)KERNEL_CS); -c0102334: 8b 45 08 mov 0x8(%ebp),%eax -c0102337: 0f b7 40 3c movzwl 0x3c(%eax),%eax -c010233b: 83 f8 08 cmp $0x8,%eax -c010233e: 0f 94 c0 sete %al -c0102341: 0f b6 c0 movzbl %al,%eax +c01022a7: 8b 45 08 mov 0x8(%ebp),%eax +c01022aa: 0f b7 40 3c movzwl 0x3c(%eax),%eax +c01022ae: 83 f8 08 cmp $0x8,%eax +c01022b1: 0f 94 c0 sete %al +c01022b4: 0f b6 c0 movzbl %al,%eax //函数通过检查 tf 中的 tf_cs 字段来判断当前处于哪个特权级,tf_cs 存储了当前代码段选择子的值 //当 tf->tf_cs 等于 KERNEL_CS 时,表示陷阱发生在内核模式下 } -c0102344: 5d pop %ebp -c0102345: c3 ret +c01022b7: 5d pop %ebp +c01022b8: c3 ret -c0102346 : +c01022b9 : "TF", "IF", "DF", "OF", NULL, NULL, "NT", NULL, "RF", "VM", "AC", "VIF", "VIP", "ID", NULL, NULL, }; //struct trapframe *tf,一个指向 trapframe 结构的指针,包含有关陷阱发生时的 CPU 状态的信息。 void print_trapframe(struct trapframe *tf) { -c0102346: f3 0f 1e fb endbr32 -c010234a: 55 push %ebp -c010234b: 89 e5 mov %esp,%ebp -c010234d: 83 ec 28 sub $0x28,%esp +c01022b9: 55 push %ebp +c01022ba: 89 e5 mov %esp,%ebp +c01022bc: 83 ec 28 sub $0x28,%esp cprintf("trapframe at %p\n", tf); //打印陷阱框架地址 -c0102350: 8b 45 08 mov 0x8(%ebp),%eax -c0102353: 89 44 24 04 mov %eax,0x4(%esp) -c0102357: c7 04 24 3e a7 10 c0 movl $0xc010a73e,(%esp) -c010235e: e8 74 df ff ff call c01002d7 +c01022bf: 8b 45 08 mov 0x8(%ebp),%eax +c01022c2: 89 44 24 04 mov %eax,0x4(%esp) +c01022c6: c7 04 24 1e a5 10 c0 movl $0xc010a51e,(%esp) +c01022cd: e8 a6 e0 ff ff call c0100378 print_regs(&tf->tf_regs); //打印寄存器状态 -c0102363: 8b 45 08 mov 0x8(%ebp),%eax -c0102366: 89 04 24 mov %eax,(%esp) -c0102369: e8 8d 01 00 00 call c01024fb +c01022d2: 8b 45 08 mov 0x8(%ebp),%eax +c01022d5: 89 04 24 mov %eax,(%esp) +c01022d8: e8 8f 01 00 00 call c010246c //打印数据段(DS)、扩展段(ES)、文件段(FS)、通用段(GS)的值。 cprintf(" ds 0x----%04x\n", tf->tf_ds); -c010236e: 8b 45 08 mov 0x8(%ebp),%eax -c0102371: 0f b7 40 2c movzwl 0x2c(%eax),%eax -c0102375: 89 44 24 04 mov %eax,0x4(%esp) -c0102379: c7 04 24 4f a7 10 c0 movl $0xc010a74f,(%esp) -c0102380: e8 52 df ff ff call c01002d7 +c01022dd: 8b 45 08 mov 0x8(%ebp),%eax +c01022e0: 0f b7 40 2c movzwl 0x2c(%eax),%eax +c01022e4: 89 44 24 04 mov %eax,0x4(%esp) +c01022e8: c7 04 24 2f a5 10 c0 movl $0xc010a52f,(%esp) +c01022ef: e8 84 e0 ff ff call c0100378 cprintf(" es 0x----%04x\n", tf->tf_es); -c0102385: 8b 45 08 mov 0x8(%ebp),%eax -c0102388: 0f b7 40 28 movzwl 0x28(%eax),%eax -c010238c: 89 44 24 04 mov %eax,0x4(%esp) -c0102390: c7 04 24 62 a7 10 c0 movl $0xc010a762,(%esp) -c0102397: e8 3b df ff ff call c01002d7 +c01022f4: 8b 45 08 mov 0x8(%ebp),%eax +c01022f7: 0f b7 40 28 movzwl 0x28(%eax),%eax +c01022fb: 89 44 24 04 mov %eax,0x4(%esp) +c01022ff: c7 04 24 42 a5 10 c0 movl $0xc010a542,(%esp) +c0102306: e8 6d e0 ff ff call c0100378 cprintf(" fs 0x----%04x\n", tf->tf_fs); -c010239c: 8b 45 08 mov 0x8(%ebp),%eax -c010239f: 0f b7 40 24 movzwl 0x24(%eax),%eax -c01023a3: 89 44 24 04 mov %eax,0x4(%esp) -c01023a7: c7 04 24 75 a7 10 c0 movl $0xc010a775,(%esp) -c01023ae: e8 24 df ff ff call c01002d7 +c010230b: 8b 45 08 mov 0x8(%ebp),%eax +c010230e: 0f b7 40 24 movzwl 0x24(%eax),%eax +c0102312: 89 44 24 04 mov %eax,0x4(%esp) +c0102316: c7 04 24 55 a5 10 c0 movl $0xc010a555,(%esp) +c010231d: e8 56 e0 ff ff call c0100378 cprintf(" gs 0x----%04x\n", tf->tf_gs); -c01023b3: 8b 45 08 mov 0x8(%ebp),%eax -c01023b6: 0f b7 40 20 movzwl 0x20(%eax),%eax -c01023ba: 89 44 24 04 mov %eax,0x4(%esp) -c01023be: c7 04 24 88 a7 10 c0 movl $0xc010a788,(%esp) -c01023c5: e8 0d df ff ff call c01002d7 +c0102322: 8b 45 08 mov 0x8(%ebp),%eax +c0102325: 0f b7 40 20 movzwl 0x20(%eax),%eax +c0102329: 89 44 24 04 mov %eax,0x4(%esp) +c010232d: c7 04 24 68 a5 10 c0 movl $0xc010a568,(%esp) +c0102334: e8 3f e0 ff ff call c0100378 // 打印陷阱号(trap number)及其对应的名称,通过调用 trapname 函数获取。 cprintf(" trap 0x%08x %s\n", tf->tf_trapno, trapname(tf->tf_trapno)); -c01023ca: 8b 45 08 mov 0x8(%ebp),%eax -c01023cd: 8b 40 30 mov 0x30(%eax),%eax -c01023d0: 89 04 24 mov %eax,(%esp) -c01023d3: e8 20 ff ff ff call c01022f8 -c01023d8: 8b 55 08 mov 0x8(%ebp),%edx -c01023db: 8b 52 30 mov 0x30(%edx),%edx -c01023de: 89 44 24 08 mov %eax,0x8(%esp) -c01023e2: 89 54 24 04 mov %edx,0x4(%esp) -c01023e6: c7 04 24 9b a7 10 c0 movl $0xc010a79b,(%esp) -c01023ed: e8 e5 de ff ff call c01002d7 +c0102339: 8b 45 08 mov 0x8(%ebp),%eax +c010233c: 8b 40 30 mov 0x30(%eax),%eax +c010233f: 89 04 24 mov %eax,(%esp) +c0102342: e8 2c ff ff ff call c0102273 +c0102347: 8b 55 08 mov 0x8(%ebp),%edx +c010234a: 8b 52 30 mov 0x30(%edx),%edx +c010234d: 89 44 24 08 mov %eax,0x8(%esp) +c0102351: 89 54 24 04 mov %edx,0x4(%esp) +c0102355: c7 04 24 7b a5 10 c0 movl $0xc010a57b,(%esp) +c010235c: e8 17 e0 ff ff call c0100378 cprintf(" err 0x%08x\n", tf->tf_err);// 如果有错误代码,打印该字段的值。 -c01023f2: 8b 45 08 mov 0x8(%ebp),%eax -c01023f5: 8b 40 34 mov 0x34(%eax),%eax -c01023f8: 89 44 24 04 mov %eax,0x4(%esp) -c01023fc: c7 04 24 ad a7 10 c0 movl $0xc010a7ad,(%esp) -c0102403: e8 cf de ff ff call c01002d7 +c0102361: 8b 45 08 mov 0x8(%ebp),%eax +c0102364: 8b 40 34 mov 0x34(%eax),%eax +c0102367: 89 44 24 04 mov %eax,0x4(%esp) +c010236b: c7 04 24 8d a5 10 c0 movl $0xc010a58d,(%esp) +c0102372: e8 01 e0 ff ff call c0100378 cprintf(" eip 0x%08x\n", tf->tf_eip);//打印当前执行的指令指针(EIP),指向出错或中断的指令。 -c0102408: 8b 45 08 mov 0x8(%ebp),%eax -c010240b: 8b 40 38 mov 0x38(%eax),%eax -c010240e: 89 44 24 04 mov %eax,0x4(%esp) -c0102412: c7 04 24 bc a7 10 c0 movl $0xc010a7bc,(%esp) -c0102419: e8 b9 de ff ff call c01002d7 +c0102377: 8b 45 08 mov 0x8(%ebp),%eax +c010237a: 8b 40 38 mov 0x38(%eax),%eax +c010237d: 89 44 24 04 mov %eax,0x4(%esp) +c0102381: c7 04 24 9c a5 10 c0 movl $0xc010a59c,(%esp) +c0102388: e8 eb df ff ff call c0100378 cprintf(" cs 0x----%04x\n", tf->tf_cs);//打印代码段寄存器(CS)的值。 -c010241e: 8b 45 08 mov 0x8(%ebp),%eax -c0102421: 0f b7 40 3c movzwl 0x3c(%eax),%eax -c0102425: 89 44 24 04 mov %eax,0x4(%esp) -c0102429: c7 04 24 cb a7 10 c0 movl $0xc010a7cb,(%esp) -c0102430: e8 a2 de ff ff call c01002d7 +c010238d: 8b 45 08 mov 0x8(%ebp),%eax +c0102390: 0f b7 40 3c movzwl 0x3c(%eax),%eax +c0102394: 89 44 24 04 mov %eax,0x4(%esp) +c0102398: c7 04 24 ab a5 10 c0 movl $0xc010a5ab,(%esp) +c010239f: e8 d4 df ff ff call c0100378 cprintf(" flag 0x%08x ", tf->tf_eflags);// 打印标志寄存器(EFLAGS)的值 -c0102435: 8b 45 08 mov 0x8(%ebp),%eax -c0102438: 8b 40 40 mov 0x40(%eax),%eax -c010243b: 89 44 24 04 mov %eax,0x4(%esp) -c010243f: c7 04 24 de a7 10 c0 movl $0xc010a7de,(%esp) -c0102446: e8 8c de ff ff call c01002d7 +c01023a4: 8b 45 08 mov 0x8(%ebp),%eax +c01023a7: 8b 40 40 mov 0x40(%eax),%eax +c01023aa: 89 44 24 04 mov %eax,0x4(%esp) +c01023ae: c7 04 24 be a5 10 c0 movl $0xc010a5be,(%esp) +c01023b5: e8 be df ff ff call c0100378 //使用循环遍历 IA32flags 数组,j 表示当前标志位的位掩码。 int i, j; for (i = 0, j = 1; i < sizeof(IA32flags) / sizeof(IA32flags[0]); i ++, j <<= 1) { -c010244b: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) -c0102452: c7 45 f0 01 00 00 00 movl $0x1,-0x10(%ebp) -c0102459: eb 3d jmp c0102498 +c01023ba: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) +c01023c1: c7 45 f0 01 00 00 00 movl $0x1,-0x10(%ebp) +c01023c8: eb 3d jmp c0102407 if ((tf->tf_eflags & j) && IA32flags[i] != NULL) { -c010245b: 8b 45 08 mov 0x8(%ebp),%eax -c010245e: 8b 50 40 mov 0x40(%eax),%edx -c0102461: 8b 45 f0 mov -0x10(%ebp),%eax -c0102464: 21 d0 and %edx,%eax -c0102466: 85 c0 test %eax,%eax -c0102468: 74 28 je c0102492 -c010246a: 8b 45 f4 mov -0xc(%ebp),%eax -c010246d: 8b 04 85 80 85 12 c0 mov -0x3fed7a80(,%eax,4),%eax -c0102474: 85 c0 test %eax,%eax -c0102476: 74 1a je c0102492 +c01023ca: 8b 45 08 mov 0x8(%ebp),%eax +c01023cd: 8b 50 40 mov 0x40(%eax),%edx +c01023d0: 8b 45 f0 mov -0x10(%ebp),%eax +c01023d3: 21 d0 and %edx,%eax +c01023d5: 85 c0 test %eax,%eax +c01023d7: 74 28 je c0102401 +c01023d9: 8b 45 f4 mov -0xc(%ebp),%eax +c01023dc: 8b 04 85 80 85 12 c0 mov -0x3fed7a80(,%eax,4),%eax +c01023e3: 85 c0 test %eax,%eax +c01023e5: 74 1a je c0102401 cprintf("%s,", IA32flags[i]); -c0102478: 8b 45 f4 mov -0xc(%ebp),%eax -c010247b: 8b 04 85 80 85 12 c0 mov -0x3fed7a80(,%eax,4),%eax -c0102482: 89 44 24 04 mov %eax,0x4(%esp) -c0102486: c7 04 24 ed a7 10 c0 movl $0xc010a7ed,(%esp) -c010248d: e8 45 de ff ff call c01002d7 +c01023e7: 8b 45 f4 mov -0xc(%ebp),%eax +c01023ea: 8b 04 85 80 85 12 c0 mov -0x3fed7a80(,%eax,4),%eax +c01023f1: 89 44 24 04 mov %eax,0x4(%esp) +c01023f5: c7 04 24 cd a5 10 c0 movl $0xc010a5cd,(%esp) +c01023fc: e8 77 df ff ff call c0100378 for (i = 0, j = 1; i < sizeof(IA32flags) / sizeof(IA32flags[0]); i ++, j <<= 1) { -c0102492: ff 45 f4 incl -0xc(%ebp) -c0102495: d1 65 f0 shll -0x10(%ebp) -c0102498: 8b 45 f4 mov -0xc(%ebp),%eax -c010249b: 83 f8 17 cmp $0x17,%eax -c010249e: 76 bb jbe c010245b +c0102401: ff 45 f4 incl -0xc(%ebp) +c0102404: d1 65 f0 shll -0x10(%ebp) +c0102407: 8b 45 f4 mov -0xc(%ebp),%eax +c010240a: 83 f8 17 cmp $0x17,%eax +c010240d: 76 bb jbe c01023ca } } //通过位掩码 FL_IOPL_MASK 获取和打印当前的 I/O 特权级别。 cprintf("IOPL=%d\n", (tf->tf_eflags & FL_IOPL_MASK) >> 12); -c01024a0: 8b 45 08 mov 0x8(%ebp),%eax -c01024a3: 8b 40 40 mov 0x40(%eax),%eax -c01024a6: c1 e8 0c shr $0xc,%eax -c01024a9: 83 e0 03 and $0x3,%eax -c01024ac: 89 44 24 04 mov %eax,0x4(%esp) -c01024b0: c7 04 24 f1 a7 10 c0 movl $0xc010a7f1,(%esp) -c01024b7: e8 1b de ff ff call c01002d7 +c010240f: 8b 45 08 mov 0x8(%ebp),%eax +c0102412: 8b 40 40 mov 0x40(%eax),%eax +c0102415: c1 e8 0c shr $0xc,%eax +c0102418: 83 e0 03 and $0x3,%eax +c010241b: 89 44 24 04 mov %eax,0x4(%esp) +c010241f: c7 04 24 d1 a5 10 c0 movl $0xc010a5d1,(%esp) +c0102426: e8 4d df ff ff call c0100378 //如果陷阱不是在内核中发生的(通过 trap_in_kernel 判断), //则打印栈指针(ESP)和栈段(SS)寄存器的值。 if (!trap_in_kernel(tf)) { -c01024bc: 8b 45 08 mov 0x8(%ebp),%eax -c01024bf: 89 04 24 mov %eax,(%esp) -c01024c2: e8 66 fe ff ff call c010232d -c01024c7: 85 c0 test %eax,%eax -c01024c9: 75 2d jne c01024f8 +c010242b: 8b 45 08 mov 0x8(%ebp),%eax +c010242e: 89 04 24 mov %eax,(%esp) +c0102431: e8 6e fe ff ff call c01022a4 +c0102436: 85 c0 test %eax,%eax +c0102438: 75 2d jne c0102467 cprintf(" esp 0x%08x\n", tf->tf_esp); -c01024cb: 8b 45 08 mov 0x8(%ebp),%eax -c01024ce: 8b 40 44 mov 0x44(%eax),%eax -c01024d1: 89 44 24 04 mov %eax,0x4(%esp) -c01024d5: c7 04 24 fa a7 10 c0 movl $0xc010a7fa,(%esp) -c01024dc: e8 f6 dd ff ff call c01002d7 +c010243a: 8b 45 08 mov 0x8(%ebp),%eax +c010243d: 8b 40 44 mov 0x44(%eax),%eax +c0102440: 89 44 24 04 mov %eax,0x4(%esp) +c0102444: c7 04 24 da a5 10 c0 movl $0xc010a5da,(%esp) +c010244b: e8 28 df ff ff call c0100378 cprintf(" ss 0x----%04x\n", tf->tf_ss); -c01024e1: 8b 45 08 mov 0x8(%ebp),%eax -c01024e4: 0f b7 40 48 movzwl 0x48(%eax),%eax -c01024e8: 89 44 24 04 mov %eax,0x4(%esp) -c01024ec: c7 04 24 09 a8 10 c0 movl $0xc010a809,(%esp) -c01024f3: e8 df dd ff ff call c01002d7 +c0102450: 8b 45 08 mov 0x8(%ebp),%eax +c0102453: 0f b7 40 48 movzwl 0x48(%eax),%eax +c0102457: 89 44 24 04 mov %eax,0x4(%esp) +c010245b: c7 04 24 e9 a5 10 c0 movl $0xc010a5e9,(%esp) +c0102462: e8 11 df ff ff call c0100378 } } -c01024f8: 90 nop -c01024f9: c9 leave -c01024fa: c3 ret +c0102467: 90 nop +c0102468: 89 ec mov %ebp,%esp +c010246a: 5d pop %ebp +c010246b: c3 ret -c01024fb : +c010246c : //定义了一个名为 print_regs 的函数, //打印出存储在 struct pushregs 结构体中的寄存器值。 void print_regs(struct pushregs *regs) { -c01024fb: f3 0f 1e fb endbr32 -c01024ff: 55 push %ebp -c0102500: 89 e5 mov %esp,%ebp -c0102502: 83 ec 18 sub $0x18,%esp +c010246c: 55 push %ebp +c010246d: 89 e5 mov %esp,%ebp +c010246f: 83 ec 18 sub $0x18,%esp cprintf(" edi 0x%08x\n", regs->reg_edi); -c0102505: 8b 45 08 mov 0x8(%ebp),%eax -c0102508: 8b 00 mov (%eax),%eax -c010250a: 89 44 24 04 mov %eax,0x4(%esp) -c010250e: c7 04 24 1c a8 10 c0 movl $0xc010a81c,(%esp) -c0102515: e8 bd dd ff ff call c01002d7 +c0102472: 8b 45 08 mov 0x8(%ebp),%eax +c0102475: 8b 00 mov (%eax),%eax +c0102477: 89 44 24 04 mov %eax,0x4(%esp) +c010247b: c7 04 24 fc a5 10 c0 movl $0xc010a5fc,(%esp) +c0102482: e8 f1 de ff ff call c0100378 cprintf(" esi 0x%08x\n", regs->reg_esi); -c010251a: 8b 45 08 mov 0x8(%ebp),%eax -c010251d: 8b 40 04 mov 0x4(%eax),%eax -c0102520: 89 44 24 04 mov %eax,0x4(%esp) -c0102524: c7 04 24 2b a8 10 c0 movl $0xc010a82b,(%esp) -c010252b: e8 a7 dd ff ff call c01002d7 +c0102487: 8b 45 08 mov 0x8(%ebp),%eax +c010248a: 8b 40 04 mov 0x4(%eax),%eax +c010248d: 89 44 24 04 mov %eax,0x4(%esp) +c0102491: c7 04 24 0b a6 10 c0 movl $0xc010a60b,(%esp) +c0102498: e8 db de ff ff call c0100378 cprintf(" ebp 0x%08x\n", regs->reg_ebp); -c0102530: 8b 45 08 mov 0x8(%ebp),%eax -c0102533: 8b 40 08 mov 0x8(%eax),%eax -c0102536: 89 44 24 04 mov %eax,0x4(%esp) -c010253a: c7 04 24 3a a8 10 c0 movl $0xc010a83a,(%esp) -c0102541: e8 91 dd ff ff call c01002d7 +c010249d: 8b 45 08 mov 0x8(%ebp),%eax +c01024a0: 8b 40 08 mov 0x8(%eax),%eax +c01024a3: 89 44 24 04 mov %eax,0x4(%esp) +c01024a7: c7 04 24 1a a6 10 c0 movl $0xc010a61a,(%esp) +c01024ae: e8 c5 de ff ff call c0100378 cprintf(" oesp 0x%08x\n", regs->reg_oesp);//打印旧的栈指针(OESP),这个寄存器通常在陷阱或中断发生时用于记录上一个栈指针。 -c0102546: 8b 45 08 mov 0x8(%ebp),%eax -c0102549: 8b 40 0c mov 0xc(%eax),%eax -c010254c: 89 44 24 04 mov %eax,0x4(%esp) -c0102550: c7 04 24 49 a8 10 c0 movl $0xc010a849,(%esp) -c0102557: e8 7b dd ff ff call c01002d7 +c01024b3: 8b 45 08 mov 0x8(%ebp),%eax +c01024b6: 8b 40 0c mov 0xc(%eax),%eax +c01024b9: 89 44 24 04 mov %eax,0x4(%esp) +c01024bd: c7 04 24 29 a6 10 c0 movl $0xc010a629,(%esp) +c01024c4: e8 af de ff ff call c0100378 cprintf(" ebx 0x%08x\n", regs->reg_ebx); -c010255c: 8b 45 08 mov 0x8(%ebp),%eax -c010255f: 8b 40 10 mov 0x10(%eax),%eax -c0102562: 89 44 24 04 mov %eax,0x4(%esp) -c0102566: c7 04 24 58 a8 10 c0 movl $0xc010a858,(%esp) -c010256d: e8 65 dd ff ff call c01002d7 +c01024c9: 8b 45 08 mov 0x8(%ebp),%eax +c01024cc: 8b 40 10 mov 0x10(%eax),%eax +c01024cf: 89 44 24 04 mov %eax,0x4(%esp) +c01024d3: c7 04 24 38 a6 10 c0 movl $0xc010a638,(%esp) +c01024da: e8 99 de ff ff call c0100378 cprintf(" edx 0x%08x\n", regs->reg_edx); -c0102572: 8b 45 08 mov 0x8(%ebp),%eax -c0102575: 8b 40 14 mov 0x14(%eax),%eax -c0102578: 89 44 24 04 mov %eax,0x4(%esp) -c010257c: c7 04 24 67 a8 10 c0 movl $0xc010a867,(%esp) -c0102583: e8 4f dd ff ff call c01002d7 +c01024df: 8b 45 08 mov 0x8(%ebp),%eax +c01024e2: 8b 40 14 mov 0x14(%eax),%eax +c01024e5: 89 44 24 04 mov %eax,0x4(%esp) +c01024e9: c7 04 24 47 a6 10 c0 movl $0xc010a647,(%esp) +c01024f0: e8 83 de ff ff call c0100378 cprintf(" ecx 0x%08x\n", regs->reg_ecx); -c0102588: 8b 45 08 mov 0x8(%ebp),%eax -c010258b: 8b 40 18 mov 0x18(%eax),%eax -c010258e: 89 44 24 04 mov %eax,0x4(%esp) -c0102592: c7 04 24 76 a8 10 c0 movl $0xc010a876,(%esp) -c0102599: e8 39 dd ff ff call c01002d7 +c01024f5: 8b 45 08 mov 0x8(%ebp),%eax +c01024f8: 8b 40 18 mov 0x18(%eax),%eax +c01024fb: 89 44 24 04 mov %eax,0x4(%esp) +c01024ff: c7 04 24 56 a6 10 c0 movl $0xc010a656,(%esp) +c0102506: e8 6d de ff ff call c0100378 cprintf(" eax 0x%08x\n", regs->reg_eax); -c010259e: 8b 45 08 mov 0x8(%ebp),%eax -c01025a1: 8b 40 1c mov 0x1c(%eax),%eax -c01025a4: 89 44 24 04 mov %eax,0x4(%esp) -c01025a8: c7 04 24 85 a8 10 c0 movl $0xc010a885,(%esp) -c01025af: e8 23 dd ff ff call c01002d7 -} -c01025b4: 90 nop -c01025b5: c9 leave -c01025b6: c3 ret - -c01025b7 : +c010250b: 8b 45 08 mov 0x8(%ebp),%eax +c010250e: 8b 40 1c mov 0x1c(%eax),%eax +c0102511: 89 44 24 04 mov %eax,0x4(%esp) +c0102515: c7 04 24 65 a6 10 c0 movl $0xc010a665,(%esp) +c010251c: e8 57 de ff ff call c0100378 +} +c0102521: 90 nop +c0102522: 89 ec mov %ebp,%esp +c0102524: 5d pop %ebp +c0102525: c3 ret + +c0102526 : * 此函数用于输出页面故障的详细信息,包括故障地址、访问类型(读/写)、访问模式(用户/内核)以及故障类型(未找到页面/保护故障)。 * * @param tf 指向 trapframe 结构的指针,包含故障发生时的寄存器状态和错误代码。 */ static inline void print_pgfault(struct trapframe *tf) { -c01025b7: 55 push %ebp -c01025b8: 89 e5 mov %esp,%ebp -c01025ba: 53 push %ebx -c01025bb: 83 ec 34 sub $0x34,%esp +c0102526: 55 push %ebp +c0102527: 89 e5 mov %esp,%ebp +c0102529: 83 ec 38 sub $0x38,%esp +c010252c: 89 5d fc mov %ebx,-0x4(%ebp) * bit 2 == 0 表示内核模式,1 表示用户模式 * */ cprintf("page fault at 0x%08x: %c/%c [%s].\n", rcr2(), (tf->tf_err & 4) ? 'U' : 'K', (tf->tf_err & 2) ? 'W' : 'R', (tf->tf_err & 1) ? "protection fault" : "no page found"); -c01025be: 8b 45 08 mov 0x8(%ebp),%eax -c01025c1: 8b 40 34 mov 0x34(%eax),%eax -c01025c4: 83 e0 01 and $0x1,%eax +c010252f: 8b 45 08 mov 0x8(%ebp),%eax +c0102532: 8b 40 34 mov 0x34(%eax),%eax +c0102535: 83 e0 01 and $0x1,%eax cprintf("page fault at 0x%08x: %c/%c [%s].\n", rcr2(), -c01025c7: 85 c0 test %eax,%eax -c01025c9: 74 07 je c01025d2 -c01025cb: bb 94 a8 10 c0 mov $0xc010a894,%ebx -c01025d0: eb 05 jmp c01025d7 -c01025d2: bb a5 a8 10 c0 mov $0xc010a8a5,%ebx +c0102538: 85 c0 test %eax,%eax +c010253a: 74 07 je c0102543 +c010253c: bb 74 a6 10 c0 mov $0xc010a674,%ebx +c0102541: eb 05 jmp c0102548 +c0102543: bb 85 a6 10 c0 mov $0xc010a685,%ebx (tf->tf_err & 2) ? 'W' : 'R', -c01025d7: 8b 45 08 mov 0x8(%ebp),%eax -c01025da: 8b 40 34 mov 0x34(%eax),%eax -c01025dd: 83 e0 02 and $0x2,%eax +c0102548: 8b 45 08 mov 0x8(%ebp),%eax +c010254b: 8b 40 34 mov 0x34(%eax),%eax +c010254e: 83 e0 02 and $0x2,%eax cprintf("page fault at 0x%08x: %c/%c [%s].\n", rcr2(), -c01025e0: 85 c0 test %eax,%eax -c01025e2: 74 07 je c01025eb -c01025e4: b9 57 00 00 00 mov $0x57,%ecx -c01025e9: eb 05 jmp c01025f0 -c01025eb: b9 52 00 00 00 mov $0x52,%ecx +c0102551: 85 c0 test %eax,%eax +c0102553: 74 07 je c010255c +c0102555: b9 57 00 00 00 mov $0x57,%ecx +c010255a: eb 05 jmp c0102561 +c010255c: b9 52 00 00 00 mov $0x52,%ecx (tf->tf_err & 4) ? 'U' : 'K', -c01025f0: 8b 45 08 mov 0x8(%ebp),%eax -c01025f3: 8b 40 34 mov 0x34(%eax),%eax -c01025f6: 83 e0 04 and $0x4,%eax +c0102561: 8b 45 08 mov 0x8(%ebp),%eax +c0102564: 8b 40 34 mov 0x34(%eax),%eax +c0102567: 83 e0 04 and $0x4,%eax cprintf("page fault at 0x%08x: %c/%c [%s].\n", rcr2(), -c01025f9: 85 c0 test %eax,%eax -c01025fb: 74 07 je c0102604 -c01025fd: ba 55 00 00 00 mov $0x55,%edx -c0102602: eb 05 jmp c0102609 -c0102604: ba 4b 00 00 00 mov $0x4b,%edx +c010256a: 85 c0 test %eax,%eax +c010256c: 74 07 je c0102575 +c010256e: ba 55 00 00 00 mov $0x55,%edx +c0102573: eb 05 jmp c010257a +c0102575: ba 4b 00 00 00 mov $0x4b,%edx } static inline uintptr_t rcr2(void) { uintptr_t cr2; asm volatile ("mov %%cr2, %0" : "=r" (cr2) :: "memory"); -c0102609: 0f 20 d0 mov %cr2,%eax -c010260c: 89 45 f4 mov %eax,-0xc(%ebp) +c010257a: 0f 20 d0 mov %cr2,%eax +c010257d: 89 45 f4 mov %eax,-0xc(%ebp) return cr2; -c010260f: 8b 45 f4 mov -0xc(%ebp),%eax -c0102612: 89 5c 24 10 mov %ebx,0x10(%esp) -c0102616: 89 4c 24 0c mov %ecx,0xc(%esp) -c010261a: 89 54 24 08 mov %edx,0x8(%esp) -c010261e: 89 44 24 04 mov %eax,0x4(%esp) -c0102622: c7 04 24 b4 a8 10 c0 movl $0xc010a8b4,(%esp) -c0102629: e8 a9 dc ff ff call c01002d7 -} -c010262e: 90 nop -c010262f: 83 c4 34 add $0x34,%esp -c0102632: 5b pop %ebx -c0102633: 5d pop %ebp -c0102634: c3 ret - -c0102635 : +c0102580: 8b 45 f4 mov -0xc(%ebp),%eax +c0102583: 89 5c 24 10 mov %ebx,0x10(%esp) +c0102587: 89 4c 24 0c mov %ecx,0xc(%esp) +c010258b: 89 54 24 08 mov %edx,0x8(%esp) +c010258f: 89 44 24 04 mov %eax,0x4(%esp) +c0102593: c7 04 24 94 a6 10 c0 movl $0xc010a694,(%esp) +c010259a: e8 d9 dd ff ff call c0100378 +} +c010259f: 90 nop +c01025a0: 8b 5d fc mov -0x4(%ebp),%ebx +c01025a3: 89 ec mov %ebp,%esp +c01025a5: 5d pop %ebp +c01025a6: c3 ret + +c01025a7 : * * @param tf 指向陷阱帧的指针,包含故障发生时的CPU状态信息 * @return 返回页面故障处理的结果,或者在无法处理时引发系统崩溃 */ static int pgfault_handler(struct trapframe *tf) { -c0102635: f3 0f 1e fb endbr32 -c0102639: 55 push %ebp -c010263a: 89 e5 mov %esp,%ebp -c010263c: 83 ec 28 sub $0x28,%esp +c01025a7: 55 push %ebp +c01025a8: 89 e5 mov %esp,%ebp +c01025aa: 83 ec 28 sub $0x28,%esp // 声明一个外部变量,用于检查内存管理结构 extern struct mm_struct *check_mm_struct; // 打印页面故障信息 print_pgfault(tf); -c010263f: 8b 45 08 mov 0x8(%ebp),%eax -c0102642: 89 04 24 mov %eax,(%esp) -c0102645: e8 6d ff ff ff call c01025b7 +c01025ad: 8b 45 08 mov 0x8(%ebp),%eax +c01025b0: 89 04 24 mov %eax,(%esp) +c01025b3: e8 6e ff ff ff call c0102526 // 检查是否存在有效的内存管理结构 if (check_mm_struct != NULL) { -c010264a: a1 c4 e0 12 c0 mov 0xc012e0c4,%eax -c010264f: 85 c0 test %eax,%eax -c0102651: 74 26 je c0102679 +c01025b8: a1 6c c1 12 c0 mov 0xc012c16c,%eax +c01025bd: 85 c0 test %eax,%eax +c01025bf: 74 26 je c01025e7 asm volatile ("mov %%cr2, %0" : "=r" (cr2) :: "memory"); -c0102653: 0f 20 d0 mov %cr2,%eax -c0102656: 89 45 f4 mov %eax,-0xc(%ebp) +c01025c1: 0f 20 d0 mov %cr2,%eax +c01025c4: 89 45 f4 mov %eax,-0xc(%ebp) return cr2; -c0102659: 8b 4d f4 mov -0xc(%ebp),%ecx +c01025c7: 8b 4d f4 mov -0xc(%ebp),%ecx // 如果存在,调用页面故障处理函数 return do_pgfault(check_mm_struct, tf->tf_err, rcr2()); -c010265c: 8b 45 08 mov 0x8(%ebp),%eax -c010265f: 8b 50 34 mov 0x34(%eax),%edx -c0102662: a1 c4 e0 12 c0 mov 0xc012e0c4,%eax -c0102667: 89 4c 24 08 mov %ecx,0x8(%esp) -c010266b: 89 54 24 04 mov %edx,0x4(%esp) -c010266f: 89 04 24 mov %eax,(%esp) -c0102672: e8 86 39 00 00 call c0105ffd -c0102677: eb 1c jmp c0102695 +c01025ca: 8b 45 08 mov 0x8(%ebp),%eax +c01025cd: 8b 50 34 mov 0x34(%eax),%edx +c01025d0: a1 6c c1 12 c0 mov 0xc012c16c,%eax +c01025d5: 89 4c 24 08 mov %ecx,0x8(%esp) +c01025d9: 89 54 24 04 mov %edx,0x4(%esp) +c01025dd: 89 04 24 mov %eax,(%esp) +c01025e0: e8 23 5e 00 00 call c0108408 +c01025e5: eb 1c jmp c0102603 } // 如果没有有效的内存管理结构,引发系统崩溃 panic("unhandled page fault.\n"); -c0102679: c7 44 24 08 d7 a8 10 movl $0xc010a8d7,0x8(%esp) -c0102680: c0 -c0102681: c7 44 24 04 d3 00 00 movl $0xd3,0x4(%esp) -c0102688: 00 -c0102689: c7 04 24 ee a8 10 c0 movl $0xc010a8ee,(%esp) -c0102690: e8 ae dd ff ff call c0100443 <__panic> +c01025e7: c7 44 24 08 b7 a6 10 movl $0xc010a6b7,0x8(%esp) +c01025ee: c0 +c01025ef: c7 44 24 04 d3 00 00 movl $0xd3,0x4(%esp) +c01025f6: 00 +c01025f7: c7 04 24 ce a6 10 c0 movl $0xc010a6ce,(%esp) +c01025fe: e8 42 e6 ff ff call c0100c45 <__panic> } -c0102695: c9 leave -c0102696: c3 ret +c0102603: 89 ec mov %ebp,%esp +c0102605: 5d pop %ebp +c0102606: c3 ret -c0102697 : +c0102607 : struct trapframe switchk2u, *switchu2k; //定义了一个名为 trap_dispatch 的静态函数,根据发生的陷阱类型进行相应的处理。 // 参数 tf 是指向陷阱帧的指针,包含了关于陷阱发生时的CPU状态信息。 static void trap_dispatch(struct trapframe *tf) { -c0102697: f3 0f 1e fb endbr32 -c010269b: 55 push %ebp -c010269c: 89 e5 mov %esp,%ebp -c010269e: 57 push %edi -c010269f: 56 push %esi -c01026a0: 53 push %ebx -c01026a1: 83 ec 2c sub $0x2c,%esp +c0102607: 55 push %ebp +c0102608: 89 e5 mov %esp,%ebp +c010260a: 83 ec 28 sub $0x28,%esp +c010260d: 89 5d fc mov %ebx,-0x4(%ebp) char c; int ret; //通过 switch 语句根据 tf->tf_trapno 的值来分发不同的陷阱处理逻辑。 switch (tf->tf_trapno) { -c01026a4: 8b 45 08 mov 0x8(%ebp),%eax -c01026a7: 8b 40 30 mov 0x30(%eax),%eax -c01026aa: 83 f8 79 cmp $0x79,%eax -c01026ad: 0f 84 fd 01 00 00 je c01028b0 -c01026b3: 83 f8 79 cmp $0x79,%eax -c01026b6: 0f 87 71 02 00 00 ja c010292d -c01026bc: 83 f8 2f cmp $0x2f,%eax -c01026bf: 77 1f ja c01026e0 -c01026c1: 83 f8 0e cmp $0xe,%eax -c01026c4: 0f 82 63 02 00 00 jb c010292d -c01026ca: 83 e8 0e sub $0xe,%eax -c01026cd: 83 f8 21 cmp $0x21,%eax -c01026d0: 0f 87 57 02 00 00 ja c010292d -c01026d6: 8b 04 85 58 a9 10 c0 mov -0x3fef56a8(,%eax,4),%eax -c01026dd: 3e ff e0 notrack jmp *%eax -c01026e0: 83 f8 78 cmp $0x78,%eax -c01026e3: 0f 84 e3 00 00 00 je c01027cc -c01026e9: e9 3f 02 00 00 jmp c010292d +c0102610: 8b 45 08 mov 0x8(%ebp),%eax +c0102613: 8b 40 30 mov 0x30(%eax),%eax +c0102616: 83 f8 79 cmp $0x79,%eax +c0102619: 0f 84 a2 01 00 00 je c01027c1 +c010261f: 83 f8 79 cmp $0x79,%eax +c0102622: 0f 87 16 02 00 00 ja c010283e +c0102628: 83 f8 2f cmp $0x2f,%eax +c010262b: 77 1e ja c010264b +c010262d: 83 f8 0e cmp $0xe,%eax +c0102630: 0f 82 08 02 00 00 jb c010283e +c0102636: 83 e8 0e sub $0xe,%eax +c0102639: 83 f8 21 cmp $0x21,%eax +c010263c: 0f 87 fc 01 00 00 ja c010283e +c0102642: 8b 04 85 38 a7 10 c0 mov -0x3fef58c8(,%eax,4),%eax +c0102649: ff e0 jmp *%eax +c010264b: 83 f8 78 cmp $0x78,%eax +c010264e: 0f 84 e3 00 00 00 je c0102737 +c0102654: e9 e5 01 00 00 jmp c010283e case T_PGFLT: //page fault // 处理页故障中断 if ((ret = pgfault_handler(tf)) != 0) { -c01026ee: 8b 45 08 mov 0x8(%ebp),%eax -c01026f1: 89 04 24 mov %eax,(%esp) -c01026f4: e8 3c ff ff ff call c0102635 -c01026f9: 89 45 e0 mov %eax,-0x20(%ebp) -c01026fc: 83 7d e0 00 cmpl $0x0,-0x20(%ebp) -c0102700: 0f 84 5f 02 00 00 je c0102965 +c0102659: 8b 45 08 mov 0x8(%ebp),%eax +c010265c: 89 04 24 mov %eax,(%esp) +c010265f: e8 43 ff ff ff call c01025a7 +c0102664: 89 45 f0 mov %eax,-0x10(%ebp) +c0102667: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) +c010266b: 0f 84 05 02 00 00 je c0102876 print_trapframe(tf); -c0102706: 8b 45 08 mov 0x8(%ebp),%eax -c0102709: 89 04 24 mov %eax,(%esp) -c010270c: e8 35 fc ff ff call c0102346 +c0102671: 8b 45 08 mov 0x8(%ebp),%eax +c0102674: 89 04 24 mov %eax,(%esp) +c0102677: e8 3d fc ff ff call c01022b9 panic("handle pgfault failed. %e\n", ret); -c0102711: 8b 45 e0 mov -0x20(%ebp),%eax -c0102714: 89 44 24 0c mov %eax,0xc(%esp) -c0102718: c7 44 24 08 ff a8 10 movl $0xc010a8ff,0x8(%esp) -c010271f: c0 -c0102720: c7 44 24 04 e7 00 00 movl $0xe7,0x4(%esp) -c0102727: 00 -c0102728: c7 04 24 ee a8 10 c0 movl $0xc010a8ee,(%esp) -c010272f: e8 0f dd ff ff call c0100443 <__panic> +c010267c: 8b 45 f0 mov -0x10(%ebp),%eax +c010267f: 89 44 24 0c mov %eax,0xc(%esp) +c0102683: c7 44 24 08 df a6 10 movl $0xc010a6df,0x8(%esp) +c010268a: c0 +c010268b: c7 44 24 04 e7 00 00 movl $0xe7,0x4(%esp) +c0102692: 00 +c0102693: c7 04 24 ce a6 10 c0 movl $0xc010a6ce,(%esp) +c010269a: e8 a6 e5 ff ff call c0100c45 <__panic> /* handle the timer interrupt */ /* (1) After a timer interrupt, you should record this event using a global variable (increase it), such as ticks in kern/driver/clock.c * (2) Every TICK_NUM cycle, you can print some info using a funciton, such as print_ticks(). * (3) Too Simple? Yes, I think so! */ ticks ++; //记录中断事件 -c0102734: a1 54 e0 12 c0 mov 0xc012e054,%eax -c0102739: 40 inc %eax -c010273a: a3 54 e0 12 c0 mov %eax,0xc012e054 +c010269f: a1 24 b4 12 c0 mov 0xc012b424,%eax +c01026a4: 40 inc %eax +c01026a5: a3 24 b4 12 c0 mov %eax,0xc012b424 if (ticks % TICK_NUM == 0) -c010273f: 8b 0d 54 e0 12 c0 mov 0xc012e054,%ecx -c0102745: ba 1f 85 eb 51 mov $0x51eb851f,%edx -c010274a: 89 c8 mov %ecx,%eax -c010274c: f7 e2 mul %edx -c010274e: c1 ea 05 shr $0x5,%edx -c0102751: 89 d0 mov %edx,%eax -c0102753: c1 e0 02 shl $0x2,%eax -c0102756: 01 d0 add %edx,%eax -c0102758: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx -c010275f: 01 d0 add %edx,%eax -c0102761: c1 e0 02 shl $0x2,%eax -c0102764: 29 c1 sub %eax,%ecx -c0102766: 89 ca mov %ecx,%edx -c0102768: 85 d2 test %edx,%edx -c010276a: 0f 85 f8 01 00 00 jne c0102968 +c01026aa: 8b 0d 24 b4 12 c0 mov 0xc012b424,%ecx +c01026b0: ba 1f 85 eb 51 mov $0x51eb851f,%edx +c01026b5: 89 c8 mov %ecx,%eax +c01026b7: f7 e2 mul %edx +c01026b9: c1 ea 05 shr $0x5,%edx +c01026bc: 89 d0 mov %edx,%eax +c01026be: c1 e0 02 shl $0x2,%eax +c01026c1: 01 d0 add %edx,%eax +c01026c3: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx +c01026ca: 01 d0 add %edx,%eax +c01026cc: c1 e0 02 shl $0x2,%eax +c01026cf: 29 c1 sub %eax,%ecx +c01026d1: 89 ca mov %ecx,%edx +c01026d3: 85 d2 test %edx,%edx +c01026d5: 0f 85 9e 01 00 00 jne c0102879 { print_ticks(); -c0102770: e8 eb f9 ff ff call c0102160 +c01026db: e8 ff f9 ff ff call c01020df }//每经过 TICK_NUM 次周期时,调用 print_ticks() 打印信息。 break; -c0102775: e9 ee 01 00 00 jmp c0102968 +c01026e0: e9 94 01 00 00 jmp c0102879 //处理串口中断,调用 cons_getc() 从串口读取字符并打印。 case IRQ_OFFSET + IRQ_COM1: c = cons_getc(); -c010277a: e8 74 f7 ff ff call c0101ef3 -c010277f: 88 45 e7 mov %al,-0x19(%ebp) +c01026e5: e8 3b ef ff ff call c0101625 +c01026ea: 88 45 f7 mov %al,-0x9(%ebp) cprintf("serial [%03d] %c\n", c, c); -c0102782: 0f be 55 e7 movsbl -0x19(%ebp),%edx -c0102786: 0f be 45 e7 movsbl -0x19(%ebp),%eax -c010278a: 89 54 24 08 mov %edx,0x8(%esp) -c010278e: 89 44 24 04 mov %eax,0x4(%esp) -c0102792: c7 04 24 1a a9 10 c0 movl $0xc010a91a,(%esp) -c0102799: e8 39 db ff ff call c01002d7 +c01026ed: 0f be 55 f7 movsbl -0x9(%ebp),%edx +c01026f1: 0f be 45 f7 movsbl -0x9(%ebp),%eax +c01026f5: 89 54 24 08 mov %edx,0x8(%esp) +c01026f9: 89 44 24 04 mov %eax,0x4(%esp) +c01026fd: c7 04 24 fa a6 10 c0 movl $0xc010a6fa,(%esp) +c0102704: e8 6f dc ff ff call c0100378 break; -c010279e: e9 cc 01 00 00 jmp c010296f +c0102709: e9 72 01 00 00 jmp c0102880 //处理键盘中断,调用 cons_getc() 读取键盘输入并打印。 case IRQ_OFFSET + IRQ_KBD: c = cons_getc(); -c01027a3: e8 4b f7 ff ff call c0101ef3 -c01027a8: 88 45 e7 mov %al,-0x19(%ebp) +c010270e: e8 12 ef ff ff call c0101625 +c0102713: 88 45 f7 mov %al,-0x9(%ebp) cprintf("kbd [%03d] %c\n", c, c); -c01027ab: 0f be 55 e7 movsbl -0x19(%ebp),%edx -c01027af: 0f be 45 e7 movsbl -0x19(%ebp),%eax -c01027b3: 89 54 24 08 mov %edx,0x8(%esp) -c01027b7: 89 44 24 04 mov %eax,0x4(%esp) -c01027bb: c7 04 24 2c a9 10 c0 movl $0xc010a92c,(%esp) -c01027c2: e8 10 db ff ff call c01002d7 +c0102716: 0f be 55 f7 movsbl -0x9(%ebp),%edx +c010271a: 0f be 45 f7 movsbl -0x9(%ebp),%eax +c010271e: 89 54 24 08 mov %edx,0x8(%esp) +c0102722: 89 44 24 04 mov %eax,0x4(%esp) +c0102726: c7 04 24 0c a7 10 c0 movl $0xc010a70c,(%esp) +c010272d: e8 46 dc ff ff call c0100378 break; -c01027c7: e9 a3 01 00 00 jmp c010296f +c0102732: e9 49 01 00 00 jmp c0102880 //LAB1 CHALLENGE 1 : YOUR CODE you should modify below codes. case T_SWITCH_TOU://表示发生了从内核模式切换到用户模式的请求。 if (tf->tf_cs != USER_CS) {//判断当前是否在内核模式下 -c01027cc: 8b 45 08 mov 0x8(%ebp),%eax -c01027cf: 0f b7 40 3c movzwl 0x3c(%eax),%eax -c01027d3: 83 f8 1b cmp $0x1b,%eax -c01027d6: 0f 84 8f 01 00 00 je c010296b +c0102737: 8b 45 08 mov 0x8(%ebp),%eax +c010273a: 0f b7 40 3c movzwl 0x3c(%eax),%eax +c010273e: 83 f8 1b cmp $0x1b,%eax +c0102741: 0f 84 35 01 00 00 je c010287c switchk2u = *tf; //保存当前陷阱框架 -c01027dc: 8b 55 08 mov 0x8(%ebp),%edx -c01027df: b8 60 e0 12 c0 mov $0xc012e060,%eax -c01027e4: bb 4c 00 00 00 mov $0x4c,%ebx -c01027e9: 89 c1 mov %eax,%ecx -c01027eb: 83 e1 01 and $0x1,%ecx -c01027ee: 85 c9 test %ecx,%ecx -c01027f0: 74 0c je c01027fe -c01027f2: 0f b6 0a movzbl (%edx),%ecx -c01027f5: 88 08 mov %cl,(%eax) -c01027f7: 8d 40 01 lea 0x1(%eax),%eax -c01027fa: 8d 52 01 lea 0x1(%edx),%edx -c01027fd: 4b dec %ebx -c01027fe: 89 c1 mov %eax,%ecx -c0102800: 83 e1 02 and $0x2,%ecx -c0102803: 85 c9 test %ecx,%ecx -c0102805: 74 0f je c0102816 -c0102807: 0f b7 0a movzwl (%edx),%ecx -c010280a: 66 89 08 mov %cx,(%eax) -c010280d: 8d 40 02 lea 0x2(%eax),%eax -c0102810: 8d 52 02 lea 0x2(%edx),%edx -c0102813: 83 eb 02 sub $0x2,%ebx -c0102816: 89 df mov %ebx,%edi -c0102818: 83 e7 fc and $0xfffffffc,%edi -c010281b: b9 00 00 00 00 mov $0x0,%ecx -c0102820: 8b 34 0a mov (%edx,%ecx,1),%esi -c0102823: 89 34 08 mov %esi,(%eax,%ecx,1) -c0102826: 83 c1 04 add $0x4,%ecx -c0102829: 39 f9 cmp %edi,%ecx -c010282b: 72 f3 jb c0102820 -c010282d: 01 c8 add %ecx,%eax -c010282f: 01 ca add %ecx,%edx -c0102831: b9 00 00 00 00 mov $0x0,%ecx -c0102836: 89 de mov %ebx,%esi -c0102838: 83 e6 02 and $0x2,%esi -c010283b: 85 f6 test %esi,%esi -c010283d: 74 0b je c010284a -c010283f: 0f b7 34 0a movzwl (%edx,%ecx,1),%esi -c0102843: 66 89 34 08 mov %si,(%eax,%ecx,1) -c0102847: 83 c1 02 add $0x2,%ecx -c010284a: 83 e3 01 and $0x1,%ebx -c010284d: 85 db test %ebx,%ebx -c010284f: 74 07 je c0102858 -c0102851: 0f b6 14 0a movzbl (%edx,%ecx,1),%edx -c0102855: 88 14 08 mov %dl,(%eax,%ecx,1) +c0102747: 8b 4d 08 mov 0x8(%ebp),%ecx +c010274a: b8 4c 00 00 00 mov $0x4c,%eax +c010274f: 83 e0 fc and $0xfffffffc,%eax +c0102752: 89 c3 mov %eax,%ebx +c0102754: b8 00 00 00 00 mov $0x0,%eax +c0102759: 8b 14 01 mov (%ecx,%eax,1),%edx +c010275c: 89 90 80 b7 12 c0 mov %edx,-0x3fed4880(%eax) +c0102762: 83 c0 04 add $0x4,%eax +c0102765: 39 d8 cmp %ebx,%eax +c0102767: 72 f0 jb c0102759 switchk2u.tf_cs = USER_CS;//设置用户模式的段寄存器 -c0102858: 66 c7 05 9c e0 12 c0 movw $0x1b,0xc012e09c -c010285f: 1b 00 +c0102769: 66 c7 05 bc b7 12 c0 movw $0x1b,0xc012b7bc +c0102770: 1b 00 //将数据段和栈段寄存器 都设置为 USER_DS(用户数据段) switchk2u.tf_ds = switchk2u.tf_es = switchk2u.tf_ss = USER_DS; -c0102861: 66 c7 05 a8 e0 12 c0 movw $0x23,0xc012e0a8 -c0102868: 23 00 -c010286a: 0f b7 05 a8 e0 12 c0 movzwl 0xc012e0a8,%eax -c0102871: 66 a3 88 e0 12 c0 mov %ax,0xc012e088 -c0102877: 0f b7 05 88 e0 12 c0 movzwl 0xc012e088,%eax -c010287e: 66 a3 8c e0 12 c0 mov %ax,0xc012e08c +c0102772: 66 c7 05 c8 b7 12 c0 movw $0x23,0xc012b7c8 +c0102779: 23 00 +c010277b: 0f b7 05 c8 b7 12 c0 movzwl 0xc012b7c8,%eax +c0102782: 66 a3 a8 b7 12 c0 mov %ax,0xc012b7a8 +c0102788: 0f b7 05 a8 b7 12 c0 movzwl 0xc012b7a8,%eax +c010278f: 66 a3 ac b7 12 c0 mov %ax,0xc012b7ac switchk2u.tf_esp = (uint32_t)tf + sizeof(struct trapframe) - 8; -c0102884: 8b 45 08 mov 0x8(%ebp),%eax -c0102887: 83 c0 44 add $0x44,%eax -c010288a: a3 a4 e0 12 c0 mov %eax,0xc012e0a4 +c0102795: 8b 45 08 mov 0x8(%ebp),%eax +c0102798: 83 c0 44 add $0x44,%eax +c010279b: a3 c4 b7 12 c0 mov %eax,0xc012b7c4 // set eflags, make sure ucore can use io under user mode. // if CPL > IOPL, then cpu will generate a general protection. switchk2u.tf_eflags |= FL_IOPL_MASK;//允许用户模式下进行 I/O 操作 -c010288f: a1 a0 e0 12 c0 mov 0xc012e0a0,%eax -c0102894: 0d 00 30 00 00 or $0x3000,%eax -c0102899: a3 a0 e0 12 c0 mov %eax,0xc012e0a0 +c01027a0: a1 c0 b7 12 c0 mov 0xc012b7c0,%eax +c01027a5: 0d 00 30 00 00 or $0x3000,%eax +c01027aa: a3 c0 b7 12 c0 mov %eax,0xc012b7c0 // set temporary stack // then iret will jump to the right stack *((uint32_t *)tf - 1) = (uint32_t)&switchk2u; -c010289e: 8b 45 08 mov 0x8(%ebp),%eax -c01028a1: 83 e8 04 sub $0x4,%eax -c01028a4: ba 60 e0 12 c0 mov $0xc012e060,%edx -c01028a9: 89 10 mov %edx,(%eax) +c01027af: 8b 45 08 mov 0x8(%ebp),%eax +c01027b2: 83 e8 04 sub $0x4,%eax +c01027b5: ba 80 b7 12 c0 mov $0xc012b780,%edx +c01027ba: 89 10 mov %edx,(%eax) } break; -c01028ab: e9 bb 00 00 00 jmp c010296b +c01027bc: e9 bb 00 00 00 jmp c010287c case T_SWITCH_TOK://T_SWITCH_TOK 表示发生了从用户模式切换到内核模式的请求。 if (tf->tf_cs != KERNEL_CS) { //判断当前是否在用户模式下 -c01028b0: 8b 45 08 mov 0x8(%ebp),%eax -c01028b3: 0f b7 40 3c movzwl 0x3c(%eax),%eax -c01028b7: 83 f8 08 cmp $0x8,%eax -c01028ba: 0f 84 ae 00 00 00 je c010296e +c01027c1: 8b 45 08 mov 0x8(%ebp),%eax +c01027c4: 0f b7 40 3c movzwl 0x3c(%eax),%eax +c01027c8: 83 f8 08 cmp $0x8,%eax +c01027cb: 0f 84 ae 00 00 00 je c010287f tf->tf_cs = KERNEL_CS; -c01028c0: 8b 45 08 mov 0x8(%ebp),%eax -c01028c3: 66 c7 40 3c 08 00 movw $0x8,0x3c(%eax) +c01027d1: 8b 45 08 mov 0x8(%ebp),%eax +c01027d4: 66 c7 40 3c 08 00 movw $0x8,0x3c(%eax) tf->tf_ds = tf->tf_es = KERNEL_DS; -c01028c9: 8b 45 08 mov 0x8(%ebp),%eax -c01028cc: 66 c7 40 28 10 00 movw $0x10,0x28(%eax) -c01028d2: 8b 45 08 mov 0x8(%ebp),%eax -c01028d5: 0f b7 50 28 movzwl 0x28(%eax),%edx -c01028d9: 8b 45 08 mov 0x8(%ebp),%eax -c01028dc: 66 89 50 2c mov %dx,0x2c(%eax) +c01027da: 8b 45 08 mov 0x8(%ebp),%eax +c01027dd: 66 c7 40 28 10 00 movw $0x10,0x28(%eax) +c01027e3: 8b 45 08 mov 0x8(%ebp),%eax +c01027e6: 0f b7 50 28 movzwl 0x28(%eax),%edx +c01027ea: 8b 45 08 mov 0x8(%ebp),%eax +c01027ed: 66 89 50 2c mov %dx,0x2c(%eax) //设置内核模式的段寄存器 tf->tf_eflags &= ~FL_IOPL_MASK; //清除 I/O 权限标志 -c01028e0: 8b 45 08 mov 0x8(%ebp),%eax -c01028e3: 8b 40 40 mov 0x40(%eax),%eax -c01028e6: 25 ff cf ff ff and $0xffffcfff,%eax -c01028eb: 89 c2 mov %eax,%edx -c01028ed: 8b 45 08 mov 0x8(%ebp),%eax -c01028f0: 89 50 40 mov %edx,0x40(%eax) +c01027f1: 8b 45 08 mov 0x8(%ebp),%eax +c01027f4: 8b 40 40 mov 0x40(%eax),%eax +c01027f7: 25 ff cf ff ff and $0xffffcfff,%eax +c01027fc: 89 c2 mov %eax,%edx +c01027fe: 8b 45 08 mov 0x8(%ebp),%eax +c0102801: 89 50 40 mov %edx,0x40(%eax) switchu2k = (struct trapframe *)(tf->tf_esp - (sizeof(struct trapframe) - 8)); -c01028f3: 8b 45 08 mov 0x8(%ebp),%eax -c01028f6: 8b 40 44 mov 0x44(%eax),%eax -c01028f9: 83 e8 44 sub $0x44,%eax -c01028fc: a3 ac e0 12 c0 mov %eax,0xc012e0ac +c0102804: 8b 45 08 mov 0x8(%ebp),%eax +c0102807: 8b 40 44 mov 0x44(%eax),%eax +c010280a: 83 e8 44 sub $0x44,%eax +c010280d: a3 cc b7 12 c0 mov %eax,0xc012b7cc //使用 memmove 将当前的陷阱框架(除了最后8个字节)复制到新的陷阱框架位置 switchu2k memmove(switchu2k, tf, sizeof(struct trapframe) - 8); -c0102901: a1 ac e0 12 c0 mov 0xc012e0ac,%eax -c0102906: c7 44 24 08 44 00 00 movl $0x44,0x8(%esp) -c010290d: 00 -c010290e: 8b 55 08 mov 0x8(%ebp),%edx -c0102911: 89 54 24 04 mov %edx,0x4(%esp) -c0102915: 89 04 24 mov %eax,(%esp) -c0102918: e8 7a 70 00 00 call c0109997 +c0102812: a1 cc b7 12 c0 mov 0xc012b7cc,%eax +c0102817: c7 44 24 08 44 00 00 movl $0x44,0x8(%esp) +c010281e: 00 +c010281f: 8b 55 08 mov 0x8(%ebp),%edx +c0102822: 89 54 24 04 mov %edx,0x4(%esp) +c0102826: 89 04 24 mov %eax,(%esp) +c0102829: e8 f8 76 00 00 call c0109f26 //将新的陷阱框架地址 switchu2k 存储到当前陷阱框架之前的一个栈位置 *((uint32_t *)tf - 1) = (uint32_t)switchu2k; -c010291d: 8b 15 ac e0 12 c0 mov 0xc012e0ac,%edx -c0102923: 8b 45 08 mov 0x8(%ebp),%eax -c0102926: 83 e8 04 sub $0x4,%eax -c0102929: 89 10 mov %edx,(%eax) +c010282e: 8b 15 cc b7 12 c0 mov 0xc012b7cc,%edx +c0102834: 8b 45 08 mov 0x8(%ebp),%eax +c0102837: 83 e8 04 sub $0x4,%eax +c010283a: 89 10 mov %edx,(%eax) } break; -c010292b: eb 41 jmp c010296e +c010283c: eb 41 jmp c010287f break; default: // in kernel, it must be a mistake //检查当前陷阱框架的代码段寄存器 tf->tf_cs 的特权级 //(tf->tf_cs & 3) == 0 检查是否在内核模式中 if ((tf->tf_cs & 3) == 0) { -c010292d: 8b 45 08 mov 0x8(%ebp),%eax -c0102930: 0f b7 40 3c movzwl 0x3c(%eax),%eax -c0102934: 83 e0 03 and $0x3,%eax -c0102937: 85 c0 test %eax,%eax -c0102939: 75 34 jne c010296f +c010283e: 8b 45 08 mov 0x8(%ebp),%eax +c0102841: 0f b7 40 3c movzwl 0x3c(%eax),%eax +c0102845: 83 e0 03 and $0x3,%eax +c0102848: 85 c0 test %eax,%eax +c010284a: 75 34 jne c0102880 print_trapframe(tf); -c010293b: 8b 45 08 mov 0x8(%ebp),%eax -c010293e: 89 04 24 mov %eax,(%esp) -c0102941: e8 00 fa ff ff call c0102346 +c010284c: 8b 45 08 mov 0x8(%ebp),%eax +c010284f: 89 04 24 mov %eax,(%esp) +c0102852: e8 62 fa ff ff call c01022b9 panic("unexpected trap in kernel.\n"); -c0102946: c7 44 24 08 3b a9 10 movl $0xc010a93b,0x8(%esp) -c010294d: c0 -c010294e: c7 44 24 04 2f 01 00 movl $0x12f,0x4(%esp) -c0102955: 00 -c0102956: c7 04 24 ee a8 10 c0 movl $0xc010a8ee,(%esp) -c010295d: e8 e1 da ff ff call c0100443 <__panic> +c0102857: c7 44 24 08 1b a7 10 movl $0xc010a71b,0x8(%esp) +c010285e: c0 +c010285f: c7 44 24 04 2f 01 00 movl $0x12f,0x4(%esp) +c0102866: 00 +c0102867: c7 04 24 ce a6 10 c0 movl $0xc010a6ce,(%esp) +c010286e: e8 d2 e3 ff ff call c0100c45 <__panic> break; -c0102962: 90 nop -c0102963: eb 0a jmp c010296f +c0102873: 90 nop +c0102874: eb 0a jmp c0102880 break; -c0102965: 90 nop -c0102966: eb 07 jmp c010296f +c0102876: 90 nop +c0102877: eb 07 jmp c0102880 break; -c0102968: 90 nop -c0102969: eb 04 jmp c010296f +c0102879: 90 nop +c010287a: eb 04 jmp c0102880 break; -c010296b: 90 nop -c010296c: eb 01 jmp c010296f +c010287c: 90 nop +c010287d: eb 01 jmp c0102880 break; -c010296e: 90 nop +c010287f: 90 nop } } } -c010296f: 90 nop -c0102970: 83 c4 2c add $0x2c,%esp -c0102973: 5b pop %ebx -c0102974: 5e pop %esi -c0102975: 5f pop %edi -c0102976: 5d pop %ebp -c0102977: c3 ret +c0102880: 90 nop +c0102881: 8b 5d fc mov -0x4(%ebp),%ebx +c0102884: 89 ec mov %ebp,%esp +c0102886: 5d pop %ebp +c0102887: c3 ret -c0102978 : +c0102888 : * trap - handles or dispatches an exception/interrupt. if and when trap() returns, * the code in kern/trap/trapentry.S restores the old CPU state saved in the * trapframe and then uses the iret instruction to return from the exception. * */ void trap(struct trapframe *tf) { -c0102978: f3 0f 1e fb endbr32 -c010297c: 55 push %ebp -c010297d: 89 e5 mov %esp,%ebp -c010297f: 83 ec 18 sub $0x18,%esp +c0102888: 55 push %ebp +c0102889: 89 e5 mov %esp,%ebp +c010288b: 83 ec 18 sub $0x18,%esp // dispatch based on what type of trap occurred //该行代码调用 trap_dispatch 函数,将陷阱帧传递给它。 trap_dispatch(tf); -c0102982: 8b 45 08 mov 0x8(%ebp),%eax -c0102985: 89 04 24 mov %eax,(%esp) -c0102988: e8 0a fd ff ff call c0102697 +c010288e: 8b 45 08 mov 0x8(%ebp),%eax +c0102891: 89 04 24 mov %eax,(%esp) +c0102894: e8 6e fd ff ff call c0102607 } -c010298d: 90 nop -c010298e: c9 leave -c010298f: c3 ret +c0102899: 90 nop +c010289a: 89 ec mov %ebp,%esp +c010289c: 5d pop %ebp +c010289d: c3 ret -c0102990 : -# handler -.text +c010289e <__alltraps>: .globl __alltraps -.globl vector0 -vector0: - pushl $0 -c0102990: 6a 00 push $0x0 - pushl $0 -c0102992: 6a 00 push $0x0 - jmp __alltraps -c0102994: e9 69 0a 00 00 jmp c0103402 <__alltraps> +__alltraps: + # push registers to build a trap frame + # therefore make the stack look like a struct trapframe + # 通过 push 指令,将数据段寄存器和所有通用寄存器(使用 pushal)的值压入栈中,以保存当前状态。 + pushl %ds +c010289e: 1e push %ds + pushl %es +c010289f: 06 push %es + pushl %fs +c01028a0: 0f a0 push %fs + pushl %gs +c01028a2: 0f a8 push %gs + pushal +c01028a4: 60 pusha -c0102999 : -.globl vector1 -vector1: - pushl $0 -c0102999: 6a 00 push $0x0 - pushl $1 -c010299b: 6a 01 push $0x1 - jmp __alltraps -c010299d: e9 60 0a 00 00 jmp c0103402 <__alltraps> + # load GD_KDATA into %ds and %es to set up data segments for kernel + # 将常量 GD_KDATA 加载到 %eax 中,然后将其值复制到 %ds 和 %es 中,设置内核的数据段。 + movl $GD_KDATA, %eax +c01028a5: b8 10 00 00 00 mov $0x10,%eax + movw %ax, %ds +c01028aa: 8e d8 mov %eax,%ds + movw %ax, %es +c01028ac: 8e c0 mov %eax,%es -c01029a2 : + # push %esp to pass a pointer to the trapframe as an argument to trap() + # 将 %esp 压栈,以将指向 trapframe 的指针作为参数传递给 trap() + pushl %esp +c01028ae: 54 push %esp + + # call trap(tf), where tf=%esp + # 调用 trap(tf),其中 tf=%esp + call trap +c01028af: e8 d4 ff ff ff call c0102888 + + # pop the pushed stack pointer弹出之前压入的栈指针 + popl %esp +c01028b4: 5c pop %esp + +c01028b5 <__trapret>: + # 返回后继续执行到 trapret... +.globl __trapret +__trapret: + # restore registers from stack + # 定义了返回的入口点 __trapret。 + popal +c01028b5: 61 popa + + # restore %ds, %es, %fs and %gs + # 这里会恢复之前保存的寄存器 + popl %gs +c01028b6: 0f a9 pop %gs + popl %fs +c01028b8: 0f a1 pop %fs + popl %es +c01028ba: 07 pop %es + popl %ds +c01028bb: 1f pop %ds + + # get rid of the trap number and error code + # 通过 iret 指令返回中断处理 + addl $0x8, %esp +c01028bc: 83 c4 08 add $0x8,%esp + iret +c01028bf: cf iret + +c01028c0 : + +.globl forkrets +forkrets: + # set stack to this new process's trapframe + movl 4(%esp), %esp +c01028c0: 8b 64 24 04 mov 0x4(%esp),%esp + jmp __trapret +c01028c4: eb ef jmp c01028b5 <__trapret> + +c01028c6 : +# handler +.text +.globl __alltraps +.globl vector0 +vector0: + pushl $0 +c01028c6: 6a 00 push $0x0 + pushl $0 +c01028c8: 6a 00 push $0x0 + jmp __alltraps +c01028ca: e9 cf ff ff ff jmp c010289e <__alltraps> + +c01028cf : +.globl vector1 +vector1: + pushl $0 +c01028cf: 6a 00 push $0x0 + pushl $1 +c01028d1: 6a 01 push $0x1 + jmp __alltraps +c01028d3: e9 c6 ff ff ff jmp c010289e <__alltraps> + +c01028d8 : .globl vector2 vector2: pushl $0 -c01029a2: 6a 00 push $0x0 +c01028d8: 6a 00 push $0x0 pushl $2 -c01029a4: 6a 02 push $0x2 +c01028da: 6a 02 push $0x2 jmp __alltraps -c01029a6: e9 57 0a 00 00 jmp c0103402 <__alltraps> +c01028dc: e9 bd ff ff ff jmp c010289e <__alltraps> -c01029ab : +c01028e1 : .globl vector3 vector3: pushl $0 -c01029ab: 6a 00 push $0x0 +c01028e1: 6a 00 push $0x0 pushl $3 -c01029ad: 6a 03 push $0x3 +c01028e3: 6a 03 push $0x3 jmp __alltraps -c01029af: e9 4e 0a 00 00 jmp c0103402 <__alltraps> +c01028e5: e9 b4 ff ff ff jmp c010289e <__alltraps> -c01029b4 : +c01028ea : .globl vector4 vector4: pushl $0 -c01029b4: 6a 00 push $0x0 +c01028ea: 6a 00 push $0x0 pushl $4 -c01029b6: 6a 04 push $0x4 +c01028ec: 6a 04 push $0x4 jmp __alltraps -c01029b8: e9 45 0a 00 00 jmp c0103402 <__alltraps> +c01028ee: e9 ab ff ff ff jmp c010289e <__alltraps> -c01029bd : +c01028f3 : .globl vector5 vector5: pushl $0 -c01029bd: 6a 00 push $0x0 +c01028f3: 6a 00 push $0x0 pushl $5 -c01029bf: 6a 05 push $0x5 +c01028f5: 6a 05 push $0x5 jmp __alltraps -c01029c1: e9 3c 0a 00 00 jmp c0103402 <__alltraps> +c01028f7: e9 a2 ff ff ff jmp c010289e <__alltraps> -c01029c6 : +c01028fc : .globl vector6 vector6: pushl $0 -c01029c6: 6a 00 push $0x0 +c01028fc: 6a 00 push $0x0 pushl $6 -c01029c8: 6a 06 push $0x6 +c01028fe: 6a 06 push $0x6 jmp __alltraps -c01029ca: e9 33 0a 00 00 jmp c0103402 <__alltraps> +c0102900: e9 99 ff ff ff jmp c010289e <__alltraps> -c01029cf : +c0102905 : .globl vector7 vector7: pushl $0 -c01029cf: 6a 00 push $0x0 +c0102905: 6a 00 push $0x0 pushl $7 -c01029d1: 6a 07 push $0x7 +c0102907: 6a 07 push $0x7 jmp __alltraps -c01029d3: e9 2a 0a 00 00 jmp c0103402 <__alltraps> +c0102909: e9 90 ff ff ff jmp c010289e <__alltraps> -c01029d8 : +c010290e : .globl vector8 vector8: pushl $8 -c01029d8: 6a 08 push $0x8 +c010290e: 6a 08 push $0x8 jmp __alltraps -c01029da: e9 23 0a 00 00 jmp c0103402 <__alltraps> +c0102910: e9 89 ff ff ff jmp c010289e <__alltraps> -c01029df : +c0102915 : .globl vector9 vector9: pushl $0 -c01029df: 6a 00 push $0x0 +c0102915: 6a 00 push $0x0 pushl $9 -c01029e1: 6a 09 push $0x9 +c0102917: 6a 09 push $0x9 jmp __alltraps -c01029e3: e9 1a 0a 00 00 jmp c0103402 <__alltraps> +c0102919: e9 80 ff ff ff jmp c010289e <__alltraps> -c01029e8 : +c010291e : .globl vector10 vector10: pushl $10 -c01029e8: 6a 0a push $0xa +c010291e: 6a 0a push $0xa jmp __alltraps -c01029ea: e9 13 0a 00 00 jmp c0103402 <__alltraps> +c0102920: e9 79 ff ff ff jmp c010289e <__alltraps> -c01029ef : +c0102925 : .globl vector11 vector11: pushl $11 -c01029ef: 6a 0b push $0xb +c0102925: 6a 0b push $0xb jmp __alltraps -c01029f1: e9 0c 0a 00 00 jmp c0103402 <__alltraps> +c0102927: e9 72 ff ff ff jmp c010289e <__alltraps> -c01029f6 : +c010292c : .globl vector12 vector12: pushl $12 -c01029f6: 6a 0c push $0xc +c010292c: 6a 0c push $0xc jmp __alltraps -c01029f8: e9 05 0a 00 00 jmp c0103402 <__alltraps> +c010292e: e9 6b ff ff ff jmp c010289e <__alltraps> -c01029fd : +c0102933 : .globl vector13 vector13: pushl $13 -c01029fd: 6a 0d push $0xd +c0102933: 6a 0d push $0xd jmp __alltraps -c01029ff: e9 fe 09 00 00 jmp c0103402 <__alltraps> +c0102935: e9 64 ff ff ff jmp c010289e <__alltraps> -c0102a04 : +c010293a : .globl vector14 vector14: pushl $14 -c0102a04: 6a 0e push $0xe +c010293a: 6a 0e push $0xe jmp __alltraps -c0102a06: e9 f7 09 00 00 jmp c0103402 <__alltraps> +c010293c: e9 5d ff ff ff jmp c010289e <__alltraps> -c0102a0b : +c0102941 : .globl vector15 vector15: pushl $0 -c0102a0b: 6a 00 push $0x0 +c0102941: 6a 00 push $0x0 pushl $15 -c0102a0d: 6a 0f push $0xf +c0102943: 6a 0f push $0xf jmp __alltraps -c0102a0f: e9 ee 09 00 00 jmp c0103402 <__alltraps> +c0102945: e9 54 ff ff ff jmp c010289e <__alltraps> -c0102a14 : +c010294a : .globl vector16 vector16: pushl $0 -c0102a14: 6a 00 push $0x0 +c010294a: 6a 00 push $0x0 pushl $16 -c0102a16: 6a 10 push $0x10 +c010294c: 6a 10 push $0x10 jmp __alltraps -c0102a18: e9 e5 09 00 00 jmp c0103402 <__alltraps> +c010294e: e9 4b ff ff ff jmp c010289e <__alltraps> -c0102a1d : +c0102953 : .globl vector17 vector17: pushl $17 -c0102a1d: 6a 11 push $0x11 +c0102953: 6a 11 push $0x11 jmp __alltraps -c0102a1f: e9 de 09 00 00 jmp c0103402 <__alltraps> +c0102955: e9 44 ff ff ff jmp c010289e <__alltraps> -c0102a24 : +c010295a : .globl vector18 vector18: pushl $0 -c0102a24: 6a 00 push $0x0 +c010295a: 6a 00 push $0x0 pushl $18 -c0102a26: 6a 12 push $0x12 +c010295c: 6a 12 push $0x12 jmp __alltraps -c0102a28: e9 d5 09 00 00 jmp c0103402 <__alltraps> +c010295e: e9 3b ff ff ff jmp c010289e <__alltraps> -c0102a2d : +c0102963 : .globl vector19 vector19: pushl $0 -c0102a2d: 6a 00 push $0x0 +c0102963: 6a 00 push $0x0 pushl $19 -c0102a2f: 6a 13 push $0x13 +c0102965: 6a 13 push $0x13 jmp __alltraps -c0102a31: e9 cc 09 00 00 jmp c0103402 <__alltraps> +c0102967: e9 32 ff ff ff jmp c010289e <__alltraps> -c0102a36 : +c010296c : .globl vector20 vector20: pushl $0 -c0102a36: 6a 00 push $0x0 +c010296c: 6a 00 push $0x0 pushl $20 -c0102a38: 6a 14 push $0x14 +c010296e: 6a 14 push $0x14 jmp __alltraps -c0102a3a: e9 c3 09 00 00 jmp c0103402 <__alltraps> +c0102970: e9 29 ff ff ff jmp c010289e <__alltraps> -c0102a3f : +c0102975 : .globl vector21 vector21: pushl $0 -c0102a3f: 6a 00 push $0x0 +c0102975: 6a 00 push $0x0 pushl $21 -c0102a41: 6a 15 push $0x15 +c0102977: 6a 15 push $0x15 jmp __alltraps -c0102a43: e9 ba 09 00 00 jmp c0103402 <__alltraps> +c0102979: e9 20 ff ff ff jmp c010289e <__alltraps> -c0102a48 : +c010297e : .globl vector22 vector22: pushl $0 -c0102a48: 6a 00 push $0x0 +c010297e: 6a 00 push $0x0 pushl $22 -c0102a4a: 6a 16 push $0x16 +c0102980: 6a 16 push $0x16 jmp __alltraps -c0102a4c: e9 b1 09 00 00 jmp c0103402 <__alltraps> +c0102982: e9 17 ff ff ff jmp c010289e <__alltraps> -c0102a51 : +c0102987 : .globl vector23 vector23: pushl $0 -c0102a51: 6a 00 push $0x0 +c0102987: 6a 00 push $0x0 pushl $23 -c0102a53: 6a 17 push $0x17 +c0102989: 6a 17 push $0x17 jmp __alltraps -c0102a55: e9 a8 09 00 00 jmp c0103402 <__alltraps> +c010298b: e9 0e ff ff ff jmp c010289e <__alltraps> -c0102a5a : +c0102990 : .globl vector24 vector24: pushl $0 -c0102a5a: 6a 00 push $0x0 +c0102990: 6a 00 push $0x0 pushl $24 -c0102a5c: 6a 18 push $0x18 +c0102992: 6a 18 push $0x18 jmp __alltraps -c0102a5e: e9 9f 09 00 00 jmp c0103402 <__alltraps> +c0102994: e9 05 ff ff ff jmp c010289e <__alltraps> -c0102a63 : +c0102999 : .globl vector25 vector25: pushl $0 -c0102a63: 6a 00 push $0x0 +c0102999: 6a 00 push $0x0 pushl $25 -c0102a65: 6a 19 push $0x19 +c010299b: 6a 19 push $0x19 jmp __alltraps -c0102a67: e9 96 09 00 00 jmp c0103402 <__alltraps> +c010299d: e9 fc fe ff ff jmp c010289e <__alltraps> -c0102a6c : +c01029a2 : .globl vector26 vector26: pushl $0 -c0102a6c: 6a 00 push $0x0 +c01029a2: 6a 00 push $0x0 pushl $26 -c0102a6e: 6a 1a push $0x1a +c01029a4: 6a 1a push $0x1a jmp __alltraps -c0102a70: e9 8d 09 00 00 jmp c0103402 <__alltraps> +c01029a6: e9 f3 fe ff ff jmp c010289e <__alltraps> -c0102a75 : +c01029ab : .globl vector27 vector27: pushl $0 -c0102a75: 6a 00 push $0x0 +c01029ab: 6a 00 push $0x0 pushl $27 -c0102a77: 6a 1b push $0x1b +c01029ad: 6a 1b push $0x1b jmp __alltraps -c0102a79: e9 84 09 00 00 jmp c0103402 <__alltraps> +c01029af: e9 ea fe ff ff jmp c010289e <__alltraps> -c0102a7e : +c01029b4 : .globl vector28 vector28: pushl $0 -c0102a7e: 6a 00 push $0x0 +c01029b4: 6a 00 push $0x0 pushl $28 -c0102a80: 6a 1c push $0x1c +c01029b6: 6a 1c push $0x1c jmp __alltraps -c0102a82: e9 7b 09 00 00 jmp c0103402 <__alltraps> +c01029b8: e9 e1 fe ff ff jmp c010289e <__alltraps> -c0102a87 : +c01029bd : .globl vector29 vector29: pushl $0 -c0102a87: 6a 00 push $0x0 +c01029bd: 6a 00 push $0x0 pushl $29 -c0102a89: 6a 1d push $0x1d +c01029bf: 6a 1d push $0x1d jmp __alltraps -c0102a8b: e9 72 09 00 00 jmp c0103402 <__alltraps> +c01029c1: e9 d8 fe ff ff jmp c010289e <__alltraps> -c0102a90 : +c01029c6 : .globl vector30 vector30: pushl $0 -c0102a90: 6a 00 push $0x0 +c01029c6: 6a 00 push $0x0 pushl $30 -c0102a92: 6a 1e push $0x1e +c01029c8: 6a 1e push $0x1e jmp __alltraps -c0102a94: e9 69 09 00 00 jmp c0103402 <__alltraps> +c01029ca: e9 cf fe ff ff jmp c010289e <__alltraps> -c0102a99 : +c01029cf : .globl vector31 vector31: pushl $0 -c0102a99: 6a 00 push $0x0 +c01029cf: 6a 00 push $0x0 pushl $31 -c0102a9b: 6a 1f push $0x1f +c01029d1: 6a 1f push $0x1f jmp __alltraps -c0102a9d: e9 60 09 00 00 jmp c0103402 <__alltraps> +c01029d3: e9 c6 fe ff ff jmp c010289e <__alltraps> -c0102aa2 : +c01029d8 : .globl vector32 vector32: pushl $0 -c0102aa2: 6a 00 push $0x0 +c01029d8: 6a 00 push $0x0 pushl $32 -c0102aa4: 6a 20 push $0x20 +c01029da: 6a 20 push $0x20 jmp __alltraps -c0102aa6: e9 57 09 00 00 jmp c0103402 <__alltraps> +c01029dc: e9 bd fe ff ff jmp c010289e <__alltraps> -c0102aab : +c01029e1 : .globl vector33 vector33: pushl $0 -c0102aab: 6a 00 push $0x0 +c01029e1: 6a 00 push $0x0 pushl $33 -c0102aad: 6a 21 push $0x21 +c01029e3: 6a 21 push $0x21 jmp __alltraps -c0102aaf: e9 4e 09 00 00 jmp c0103402 <__alltraps> +c01029e5: e9 b4 fe ff ff jmp c010289e <__alltraps> -c0102ab4 : +c01029ea : .globl vector34 vector34: pushl $0 -c0102ab4: 6a 00 push $0x0 +c01029ea: 6a 00 push $0x0 pushl $34 -c0102ab6: 6a 22 push $0x22 +c01029ec: 6a 22 push $0x22 jmp __alltraps -c0102ab8: e9 45 09 00 00 jmp c0103402 <__alltraps> +c01029ee: e9 ab fe ff ff jmp c010289e <__alltraps> -c0102abd : +c01029f3 : .globl vector35 vector35: pushl $0 -c0102abd: 6a 00 push $0x0 +c01029f3: 6a 00 push $0x0 pushl $35 -c0102abf: 6a 23 push $0x23 +c01029f5: 6a 23 push $0x23 jmp __alltraps -c0102ac1: e9 3c 09 00 00 jmp c0103402 <__alltraps> +c01029f7: e9 a2 fe ff ff jmp c010289e <__alltraps> -c0102ac6 : +c01029fc : .globl vector36 vector36: pushl $0 -c0102ac6: 6a 00 push $0x0 +c01029fc: 6a 00 push $0x0 pushl $36 -c0102ac8: 6a 24 push $0x24 +c01029fe: 6a 24 push $0x24 jmp __alltraps -c0102aca: e9 33 09 00 00 jmp c0103402 <__alltraps> +c0102a00: e9 99 fe ff ff jmp c010289e <__alltraps> -c0102acf : +c0102a05 : .globl vector37 vector37: pushl $0 -c0102acf: 6a 00 push $0x0 +c0102a05: 6a 00 push $0x0 pushl $37 -c0102ad1: 6a 25 push $0x25 +c0102a07: 6a 25 push $0x25 jmp __alltraps -c0102ad3: e9 2a 09 00 00 jmp c0103402 <__alltraps> +c0102a09: e9 90 fe ff ff jmp c010289e <__alltraps> -c0102ad8 : +c0102a0e : .globl vector38 vector38: pushl $0 -c0102ad8: 6a 00 push $0x0 +c0102a0e: 6a 00 push $0x0 pushl $38 -c0102ada: 6a 26 push $0x26 +c0102a10: 6a 26 push $0x26 jmp __alltraps -c0102adc: e9 21 09 00 00 jmp c0103402 <__alltraps> +c0102a12: e9 87 fe ff ff jmp c010289e <__alltraps> -c0102ae1 : +c0102a17 : .globl vector39 vector39: pushl $0 -c0102ae1: 6a 00 push $0x0 +c0102a17: 6a 00 push $0x0 pushl $39 -c0102ae3: 6a 27 push $0x27 +c0102a19: 6a 27 push $0x27 jmp __alltraps -c0102ae5: e9 18 09 00 00 jmp c0103402 <__alltraps> +c0102a1b: e9 7e fe ff ff jmp c010289e <__alltraps> -c0102aea : +c0102a20 : .globl vector40 vector40: pushl $0 -c0102aea: 6a 00 push $0x0 +c0102a20: 6a 00 push $0x0 pushl $40 -c0102aec: 6a 28 push $0x28 +c0102a22: 6a 28 push $0x28 jmp __alltraps -c0102aee: e9 0f 09 00 00 jmp c0103402 <__alltraps> +c0102a24: e9 75 fe ff ff jmp c010289e <__alltraps> -c0102af3 : +c0102a29 : .globl vector41 vector41: pushl $0 -c0102af3: 6a 00 push $0x0 +c0102a29: 6a 00 push $0x0 pushl $41 -c0102af5: 6a 29 push $0x29 +c0102a2b: 6a 29 push $0x29 jmp __alltraps -c0102af7: e9 06 09 00 00 jmp c0103402 <__alltraps> +c0102a2d: e9 6c fe ff ff jmp c010289e <__alltraps> -c0102afc : +c0102a32 : .globl vector42 vector42: pushl $0 -c0102afc: 6a 00 push $0x0 +c0102a32: 6a 00 push $0x0 pushl $42 -c0102afe: 6a 2a push $0x2a +c0102a34: 6a 2a push $0x2a jmp __alltraps -c0102b00: e9 fd 08 00 00 jmp c0103402 <__alltraps> +c0102a36: e9 63 fe ff ff jmp c010289e <__alltraps> -c0102b05 : +c0102a3b : .globl vector43 vector43: pushl $0 -c0102b05: 6a 00 push $0x0 +c0102a3b: 6a 00 push $0x0 pushl $43 -c0102b07: 6a 2b push $0x2b +c0102a3d: 6a 2b push $0x2b jmp __alltraps -c0102b09: e9 f4 08 00 00 jmp c0103402 <__alltraps> +c0102a3f: e9 5a fe ff ff jmp c010289e <__alltraps> -c0102b0e : +c0102a44 : .globl vector44 vector44: pushl $0 -c0102b0e: 6a 00 push $0x0 +c0102a44: 6a 00 push $0x0 pushl $44 -c0102b10: 6a 2c push $0x2c +c0102a46: 6a 2c push $0x2c jmp __alltraps -c0102b12: e9 eb 08 00 00 jmp c0103402 <__alltraps> +c0102a48: e9 51 fe ff ff jmp c010289e <__alltraps> -c0102b17 : +c0102a4d : .globl vector45 vector45: pushl $0 -c0102b17: 6a 00 push $0x0 +c0102a4d: 6a 00 push $0x0 pushl $45 -c0102b19: 6a 2d push $0x2d +c0102a4f: 6a 2d push $0x2d jmp __alltraps -c0102b1b: e9 e2 08 00 00 jmp c0103402 <__alltraps> +c0102a51: e9 48 fe ff ff jmp c010289e <__alltraps> -c0102b20 : +c0102a56 : .globl vector46 vector46: pushl $0 -c0102b20: 6a 00 push $0x0 +c0102a56: 6a 00 push $0x0 pushl $46 -c0102b22: 6a 2e push $0x2e +c0102a58: 6a 2e push $0x2e jmp __alltraps -c0102b24: e9 d9 08 00 00 jmp c0103402 <__alltraps> +c0102a5a: e9 3f fe ff ff jmp c010289e <__alltraps> -c0102b29 : +c0102a5f : .globl vector47 vector47: pushl $0 -c0102b29: 6a 00 push $0x0 +c0102a5f: 6a 00 push $0x0 pushl $47 -c0102b2b: 6a 2f push $0x2f +c0102a61: 6a 2f push $0x2f jmp __alltraps -c0102b2d: e9 d0 08 00 00 jmp c0103402 <__alltraps> +c0102a63: e9 36 fe ff ff jmp c010289e <__alltraps> -c0102b32 : +c0102a68 : .globl vector48 vector48: pushl $0 -c0102b32: 6a 00 push $0x0 +c0102a68: 6a 00 push $0x0 pushl $48 -c0102b34: 6a 30 push $0x30 +c0102a6a: 6a 30 push $0x30 jmp __alltraps -c0102b36: e9 c7 08 00 00 jmp c0103402 <__alltraps> +c0102a6c: e9 2d fe ff ff jmp c010289e <__alltraps> -c0102b3b : +c0102a71 : .globl vector49 vector49: pushl $0 -c0102b3b: 6a 00 push $0x0 +c0102a71: 6a 00 push $0x0 pushl $49 -c0102b3d: 6a 31 push $0x31 +c0102a73: 6a 31 push $0x31 jmp __alltraps -c0102b3f: e9 be 08 00 00 jmp c0103402 <__alltraps> +c0102a75: e9 24 fe ff ff jmp c010289e <__alltraps> -c0102b44 : +c0102a7a : .globl vector50 vector50: pushl $0 -c0102b44: 6a 00 push $0x0 +c0102a7a: 6a 00 push $0x0 pushl $50 -c0102b46: 6a 32 push $0x32 +c0102a7c: 6a 32 push $0x32 jmp __alltraps -c0102b48: e9 b5 08 00 00 jmp c0103402 <__alltraps> +c0102a7e: e9 1b fe ff ff jmp c010289e <__alltraps> -c0102b4d : +c0102a83 : .globl vector51 vector51: pushl $0 -c0102b4d: 6a 00 push $0x0 +c0102a83: 6a 00 push $0x0 pushl $51 -c0102b4f: 6a 33 push $0x33 +c0102a85: 6a 33 push $0x33 jmp __alltraps -c0102b51: e9 ac 08 00 00 jmp c0103402 <__alltraps> +c0102a87: e9 12 fe ff ff jmp c010289e <__alltraps> -c0102b56 : +c0102a8c : .globl vector52 vector52: pushl $0 -c0102b56: 6a 00 push $0x0 +c0102a8c: 6a 00 push $0x0 pushl $52 -c0102b58: 6a 34 push $0x34 +c0102a8e: 6a 34 push $0x34 jmp __alltraps -c0102b5a: e9 a3 08 00 00 jmp c0103402 <__alltraps> +c0102a90: e9 09 fe ff ff jmp c010289e <__alltraps> -c0102b5f : +c0102a95 : .globl vector53 vector53: pushl $0 -c0102b5f: 6a 00 push $0x0 +c0102a95: 6a 00 push $0x0 pushl $53 -c0102b61: 6a 35 push $0x35 +c0102a97: 6a 35 push $0x35 jmp __alltraps -c0102b63: e9 9a 08 00 00 jmp c0103402 <__alltraps> +c0102a99: e9 00 fe ff ff jmp c010289e <__alltraps> -c0102b68 : +c0102a9e : .globl vector54 vector54: pushl $0 -c0102b68: 6a 00 push $0x0 +c0102a9e: 6a 00 push $0x0 pushl $54 -c0102b6a: 6a 36 push $0x36 +c0102aa0: 6a 36 push $0x36 jmp __alltraps -c0102b6c: e9 91 08 00 00 jmp c0103402 <__alltraps> +c0102aa2: e9 f7 fd ff ff jmp c010289e <__alltraps> -c0102b71 : +c0102aa7 : .globl vector55 vector55: pushl $0 -c0102b71: 6a 00 push $0x0 +c0102aa7: 6a 00 push $0x0 pushl $55 -c0102b73: 6a 37 push $0x37 +c0102aa9: 6a 37 push $0x37 jmp __alltraps -c0102b75: e9 88 08 00 00 jmp c0103402 <__alltraps> +c0102aab: e9 ee fd ff ff jmp c010289e <__alltraps> -c0102b7a : +c0102ab0 : .globl vector56 vector56: pushl $0 -c0102b7a: 6a 00 push $0x0 +c0102ab0: 6a 00 push $0x0 pushl $56 -c0102b7c: 6a 38 push $0x38 +c0102ab2: 6a 38 push $0x38 jmp __alltraps -c0102b7e: e9 7f 08 00 00 jmp c0103402 <__alltraps> +c0102ab4: e9 e5 fd ff ff jmp c010289e <__alltraps> -c0102b83 : +c0102ab9 : .globl vector57 vector57: pushl $0 -c0102b83: 6a 00 push $0x0 +c0102ab9: 6a 00 push $0x0 pushl $57 -c0102b85: 6a 39 push $0x39 +c0102abb: 6a 39 push $0x39 jmp __alltraps -c0102b87: e9 76 08 00 00 jmp c0103402 <__alltraps> +c0102abd: e9 dc fd ff ff jmp c010289e <__alltraps> -c0102b8c : +c0102ac2 : .globl vector58 vector58: pushl $0 -c0102b8c: 6a 00 push $0x0 +c0102ac2: 6a 00 push $0x0 pushl $58 -c0102b8e: 6a 3a push $0x3a +c0102ac4: 6a 3a push $0x3a jmp __alltraps -c0102b90: e9 6d 08 00 00 jmp c0103402 <__alltraps> +c0102ac6: e9 d3 fd ff ff jmp c010289e <__alltraps> -c0102b95 : +c0102acb : .globl vector59 vector59: pushl $0 -c0102b95: 6a 00 push $0x0 +c0102acb: 6a 00 push $0x0 pushl $59 -c0102b97: 6a 3b push $0x3b +c0102acd: 6a 3b push $0x3b jmp __alltraps -c0102b99: e9 64 08 00 00 jmp c0103402 <__alltraps> +c0102acf: e9 ca fd ff ff jmp c010289e <__alltraps> -c0102b9e : +c0102ad4 : .globl vector60 vector60: pushl $0 -c0102b9e: 6a 00 push $0x0 +c0102ad4: 6a 00 push $0x0 pushl $60 -c0102ba0: 6a 3c push $0x3c +c0102ad6: 6a 3c push $0x3c jmp __alltraps -c0102ba2: e9 5b 08 00 00 jmp c0103402 <__alltraps> +c0102ad8: e9 c1 fd ff ff jmp c010289e <__alltraps> -c0102ba7 : +c0102add : .globl vector61 vector61: pushl $0 -c0102ba7: 6a 00 push $0x0 +c0102add: 6a 00 push $0x0 pushl $61 -c0102ba9: 6a 3d push $0x3d +c0102adf: 6a 3d push $0x3d jmp __alltraps -c0102bab: e9 52 08 00 00 jmp c0103402 <__alltraps> +c0102ae1: e9 b8 fd ff ff jmp c010289e <__alltraps> -c0102bb0 : +c0102ae6 : .globl vector62 vector62: pushl $0 -c0102bb0: 6a 00 push $0x0 +c0102ae6: 6a 00 push $0x0 pushl $62 -c0102bb2: 6a 3e push $0x3e +c0102ae8: 6a 3e push $0x3e jmp __alltraps -c0102bb4: e9 49 08 00 00 jmp c0103402 <__alltraps> +c0102aea: e9 af fd ff ff jmp c010289e <__alltraps> -c0102bb9 : +c0102aef : .globl vector63 vector63: pushl $0 -c0102bb9: 6a 00 push $0x0 +c0102aef: 6a 00 push $0x0 pushl $63 -c0102bbb: 6a 3f push $0x3f +c0102af1: 6a 3f push $0x3f jmp __alltraps -c0102bbd: e9 40 08 00 00 jmp c0103402 <__alltraps> +c0102af3: e9 a6 fd ff ff jmp c010289e <__alltraps> -c0102bc2 : +c0102af8 : .globl vector64 vector64: pushl $0 -c0102bc2: 6a 00 push $0x0 +c0102af8: 6a 00 push $0x0 pushl $64 -c0102bc4: 6a 40 push $0x40 +c0102afa: 6a 40 push $0x40 jmp __alltraps -c0102bc6: e9 37 08 00 00 jmp c0103402 <__alltraps> +c0102afc: e9 9d fd ff ff jmp c010289e <__alltraps> -c0102bcb : +c0102b01 : .globl vector65 vector65: pushl $0 -c0102bcb: 6a 00 push $0x0 +c0102b01: 6a 00 push $0x0 pushl $65 -c0102bcd: 6a 41 push $0x41 +c0102b03: 6a 41 push $0x41 jmp __alltraps -c0102bcf: e9 2e 08 00 00 jmp c0103402 <__alltraps> +c0102b05: e9 94 fd ff ff jmp c010289e <__alltraps> -c0102bd4 : +c0102b0a : .globl vector66 vector66: pushl $0 -c0102bd4: 6a 00 push $0x0 +c0102b0a: 6a 00 push $0x0 pushl $66 -c0102bd6: 6a 42 push $0x42 +c0102b0c: 6a 42 push $0x42 jmp __alltraps -c0102bd8: e9 25 08 00 00 jmp c0103402 <__alltraps> +c0102b0e: e9 8b fd ff ff jmp c010289e <__alltraps> -c0102bdd : +c0102b13 : .globl vector67 vector67: pushl $0 -c0102bdd: 6a 00 push $0x0 +c0102b13: 6a 00 push $0x0 pushl $67 -c0102bdf: 6a 43 push $0x43 +c0102b15: 6a 43 push $0x43 jmp __alltraps -c0102be1: e9 1c 08 00 00 jmp c0103402 <__alltraps> +c0102b17: e9 82 fd ff ff jmp c010289e <__alltraps> -c0102be6 : +c0102b1c : .globl vector68 vector68: pushl $0 -c0102be6: 6a 00 push $0x0 +c0102b1c: 6a 00 push $0x0 pushl $68 -c0102be8: 6a 44 push $0x44 +c0102b1e: 6a 44 push $0x44 jmp __alltraps -c0102bea: e9 13 08 00 00 jmp c0103402 <__alltraps> +c0102b20: e9 79 fd ff ff jmp c010289e <__alltraps> -c0102bef : +c0102b25 : .globl vector69 vector69: pushl $0 -c0102bef: 6a 00 push $0x0 +c0102b25: 6a 00 push $0x0 pushl $69 -c0102bf1: 6a 45 push $0x45 +c0102b27: 6a 45 push $0x45 jmp __alltraps -c0102bf3: e9 0a 08 00 00 jmp c0103402 <__alltraps> +c0102b29: e9 70 fd ff ff jmp c010289e <__alltraps> -c0102bf8 : +c0102b2e : .globl vector70 vector70: pushl $0 -c0102bf8: 6a 00 push $0x0 +c0102b2e: 6a 00 push $0x0 pushl $70 -c0102bfa: 6a 46 push $0x46 +c0102b30: 6a 46 push $0x46 jmp __alltraps -c0102bfc: e9 01 08 00 00 jmp c0103402 <__alltraps> +c0102b32: e9 67 fd ff ff jmp c010289e <__alltraps> -c0102c01 : +c0102b37 : .globl vector71 vector71: pushl $0 -c0102c01: 6a 00 push $0x0 +c0102b37: 6a 00 push $0x0 pushl $71 -c0102c03: 6a 47 push $0x47 +c0102b39: 6a 47 push $0x47 jmp __alltraps -c0102c05: e9 f8 07 00 00 jmp c0103402 <__alltraps> +c0102b3b: e9 5e fd ff ff jmp c010289e <__alltraps> -c0102c0a : +c0102b40 : .globl vector72 vector72: pushl $0 -c0102c0a: 6a 00 push $0x0 +c0102b40: 6a 00 push $0x0 pushl $72 -c0102c0c: 6a 48 push $0x48 +c0102b42: 6a 48 push $0x48 jmp __alltraps -c0102c0e: e9 ef 07 00 00 jmp c0103402 <__alltraps> +c0102b44: e9 55 fd ff ff jmp c010289e <__alltraps> -c0102c13 : +c0102b49 : .globl vector73 vector73: pushl $0 -c0102c13: 6a 00 push $0x0 +c0102b49: 6a 00 push $0x0 pushl $73 -c0102c15: 6a 49 push $0x49 +c0102b4b: 6a 49 push $0x49 jmp __alltraps -c0102c17: e9 e6 07 00 00 jmp c0103402 <__alltraps> +c0102b4d: e9 4c fd ff ff jmp c010289e <__alltraps> -c0102c1c : +c0102b52 : .globl vector74 vector74: pushl $0 -c0102c1c: 6a 00 push $0x0 +c0102b52: 6a 00 push $0x0 pushl $74 -c0102c1e: 6a 4a push $0x4a +c0102b54: 6a 4a push $0x4a jmp __alltraps -c0102c20: e9 dd 07 00 00 jmp c0103402 <__alltraps> +c0102b56: e9 43 fd ff ff jmp c010289e <__alltraps> -c0102c25 : +c0102b5b : .globl vector75 vector75: pushl $0 -c0102c25: 6a 00 push $0x0 +c0102b5b: 6a 00 push $0x0 pushl $75 -c0102c27: 6a 4b push $0x4b +c0102b5d: 6a 4b push $0x4b jmp __alltraps -c0102c29: e9 d4 07 00 00 jmp c0103402 <__alltraps> +c0102b5f: e9 3a fd ff ff jmp c010289e <__alltraps> -c0102c2e : +c0102b64 : .globl vector76 vector76: pushl $0 -c0102c2e: 6a 00 push $0x0 +c0102b64: 6a 00 push $0x0 pushl $76 -c0102c30: 6a 4c push $0x4c +c0102b66: 6a 4c push $0x4c jmp __alltraps -c0102c32: e9 cb 07 00 00 jmp c0103402 <__alltraps> +c0102b68: e9 31 fd ff ff jmp c010289e <__alltraps> -c0102c37 : +c0102b6d : .globl vector77 vector77: pushl $0 -c0102c37: 6a 00 push $0x0 +c0102b6d: 6a 00 push $0x0 pushl $77 -c0102c39: 6a 4d push $0x4d +c0102b6f: 6a 4d push $0x4d jmp __alltraps -c0102c3b: e9 c2 07 00 00 jmp c0103402 <__alltraps> +c0102b71: e9 28 fd ff ff jmp c010289e <__alltraps> -c0102c40 : +c0102b76 : .globl vector78 vector78: pushl $0 -c0102c40: 6a 00 push $0x0 +c0102b76: 6a 00 push $0x0 pushl $78 -c0102c42: 6a 4e push $0x4e +c0102b78: 6a 4e push $0x4e jmp __alltraps -c0102c44: e9 b9 07 00 00 jmp c0103402 <__alltraps> +c0102b7a: e9 1f fd ff ff jmp c010289e <__alltraps> -c0102c49 : +c0102b7f : .globl vector79 vector79: pushl $0 -c0102c49: 6a 00 push $0x0 +c0102b7f: 6a 00 push $0x0 pushl $79 -c0102c4b: 6a 4f push $0x4f +c0102b81: 6a 4f push $0x4f jmp __alltraps -c0102c4d: e9 b0 07 00 00 jmp c0103402 <__alltraps> +c0102b83: e9 16 fd ff ff jmp c010289e <__alltraps> -c0102c52 : +c0102b88 : .globl vector80 vector80: pushl $0 -c0102c52: 6a 00 push $0x0 +c0102b88: 6a 00 push $0x0 pushl $80 -c0102c54: 6a 50 push $0x50 +c0102b8a: 6a 50 push $0x50 jmp __alltraps -c0102c56: e9 a7 07 00 00 jmp c0103402 <__alltraps> +c0102b8c: e9 0d fd ff ff jmp c010289e <__alltraps> -c0102c5b : +c0102b91 : .globl vector81 vector81: pushl $0 -c0102c5b: 6a 00 push $0x0 +c0102b91: 6a 00 push $0x0 pushl $81 -c0102c5d: 6a 51 push $0x51 +c0102b93: 6a 51 push $0x51 jmp __alltraps -c0102c5f: e9 9e 07 00 00 jmp c0103402 <__alltraps> +c0102b95: e9 04 fd ff ff jmp c010289e <__alltraps> -c0102c64 : +c0102b9a : .globl vector82 vector82: pushl $0 -c0102c64: 6a 00 push $0x0 +c0102b9a: 6a 00 push $0x0 pushl $82 -c0102c66: 6a 52 push $0x52 +c0102b9c: 6a 52 push $0x52 jmp __alltraps -c0102c68: e9 95 07 00 00 jmp c0103402 <__alltraps> +c0102b9e: e9 fb fc ff ff jmp c010289e <__alltraps> -c0102c6d : +c0102ba3 : .globl vector83 vector83: pushl $0 -c0102c6d: 6a 00 push $0x0 +c0102ba3: 6a 00 push $0x0 pushl $83 -c0102c6f: 6a 53 push $0x53 +c0102ba5: 6a 53 push $0x53 jmp __alltraps -c0102c71: e9 8c 07 00 00 jmp c0103402 <__alltraps> +c0102ba7: e9 f2 fc ff ff jmp c010289e <__alltraps> -c0102c76 : +c0102bac : .globl vector84 vector84: pushl $0 -c0102c76: 6a 00 push $0x0 +c0102bac: 6a 00 push $0x0 pushl $84 -c0102c78: 6a 54 push $0x54 +c0102bae: 6a 54 push $0x54 jmp __alltraps -c0102c7a: e9 83 07 00 00 jmp c0103402 <__alltraps> +c0102bb0: e9 e9 fc ff ff jmp c010289e <__alltraps> -c0102c7f : +c0102bb5 : .globl vector85 vector85: pushl $0 -c0102c7f: 6a 00 push $0x0 +c0102bb5: 6a 00 push $0x0 pushl $85 -c0102c81: 6a 55 push $0x55 +c0102bb7: 6a 55 push $0x55 jmp __alltraps -c0102c83: e9 7a 07 00 00 jmp c0103402 <__alltraps> +c0102bb9: e9 e0 fc ff ff jmp c010289e <__alltraps> -c0102c88 : +c0102bbe : .globl vector86 vector86: pushl $0 -c0102c88: 6a 00 push $0x0 +c0102bbe: 6a 00 push $0x0 pushl $86 -c0102c8a: 6a 56 push $0x56 +c0102bc0: 6a 56 push $0x56 jmp __alltraps -c0102c8c: e9 71 07 00 00 jmp c0103402 <__alltraps> +c0102bc2: e9 d7 fc ff ff jmp c010289e <__alltraps> -c0102c91 : +c0102bc7 : .globl vector87 vector87: pushl $0 -c0102c91: 6a 00 push $0x0 +c0102bc7: 6a 00 push $0x0 pushl $87 -c0102c93: 6a 57 push $0x57 +c0102bc9: 6a 57 push $0x57 jmp __alltraps -c0102c95: e9 68 07 00 00 jmp c0103402 <__alltraps> +c0102bcb: e9 ce fc ff ff jmp c010289e <__alltraps> -c0102c9a : +c0102bd0 : .globl vector88 vector88: pushl $0 -c0102c9a: 6a 00 push $0x0 +c0102bd0: 6a 00 push $0x0 pushl $88 -c0102c9c: 6a 58 push $0x58 +c0102bd2: 6a 58 push $0x58 jmp __alltraps -c0102c9e: e9 5f 07 00 00 jmp c0103402 <__alltraps> +c0102bd4: e9 c5 fc ff ff jmp c010289e <__alltraps> -c0102ca3 : +c0102bd9 : .globl vector89 vector89: pushl $0 -c0102ca3: 6a 00 push $0x0 +c0102bd9: 6a 00 push $0x0 pushl $89 -c0102ca5: 6a 59 push $0x59 +c0102bdb: 6a 59 push $0x59 jmp __alltraps -c0102ca7: e9 56 07 00 00 jmp c0103402 <__alltraps> +c0102bdd: e9 bc fc ff ff jmp c010289e <__alltraps> -c0102cac : +c0102be2 : .globl vector90 vector90: pushl $0 -c0102cac: 6a 00 push $0x0 +c0102be2: 6a 00 push $0x0 pushl $90 -c0102cae: 6a 5a push $0x5a +c0102be4: 6a 5a push $0x5a jmp __alltraps -c0102cb0: e9 4d 07 00 00 jmp c0103402 <__alltraps> +c0102be6: e9 b3 fc ff ff jmp c010289e <__alltraps> -c0102cb5 : +c0102beb : .globl vector91 vector91: pushl $0 -c0102cb5: 6a 00 push $0x0 +c0102beb: 6a 00 push $0x0 pushl $91 -c0102cb7: 6a 5b push $0x5b +c0102bed: 6a 5b push $0x5b jmp __alltraps -c0102cb9: e9 44 07 00 00 jmp c0103402 <__alltraps> +c0102bef: e9 aa fc ff ff jmp c010289e <__alltraps> -c0102cbe : +c0102bf4 : .globl vector92 vector92: pushl $0 -c0102cbe: 6a 00 push $0x0 +c0102bf4: 6a 00 push $0x0 pushl $92 -c0102cc0: 6a 5c push $0x5c +c0102bf6: 6a 5c push $0x5c jmp __alltraps -c0102cc2: e9 3b 07 00 00 jmp c0103402 <__alltraps> +c0102bf8: e9 a1 fc ff ff jmp c010289e <__alltraps> -c0102cc7 : +c0102bfd : .globl vector93 vector93: pushl $0 -c0102cc7: 6a 00 push $0x0 +c0102bfd: 6a 00 push $0x0 pushl $93 -c0102cc9: 6a 5d push $0x5d +c0102bff: 6a 5d push $0x5d jmp __alltraps -c0102ccb: e9 32 07 00 00 jmp c0103402 <__alltraps> +c0102c01: e9 98 fc ff ff jmp c010289e <__alltraps> -c0102cd0 : +c0102c06 : .globl vector94 vector94: pushl $0 -c0102cd0: 6a 00 push $0x0 +c0102c06: 6a 00 push $0x0 pushl $94 -c0102cd2: 6a 5e push $0x5e +c0102c08: 6a 5e push $0x5e jmp __alltraps -c0102cd4: e9 29 07 00 00 jmp c0103402 <__alltraps> +c0102c0a: e9 8f fc ff ff jmp c010289e <__alltraps> -c0102cd9 : +c0102c0f : .globl vector95 vector95: pushl $0 -c0102cd9: 6a 00 push $0x0 +c0102c0f: 6a 00 push $0x0 pushl $95 -c0102cdb: 6a 5f push $0x5f +c0102c11: 6a 5f push $0x5f jmp __alltraps -c0102cdd: e9 20 07 00 00 jmp c0103402 <__alltraps> +c0102c13: e9 86 fc ff ff jmp c010289e <__alltraps> -c0102ce2 : +c0102c18 : .globl vector96 vector96: pushl $0 -c0102ce2: 6a 00 push $0x0 +c0102c18: 6a 00 push $0x0 pushl $96 -c0102ce4: 6a 60 push $0x60 +c0102c1a: 6a 60 push $0x60 jmp __alltraps -c0102ce6: e9 17 07 00 00 jmp c0103402 <__alltraps> +c0102c1c: e9 7d fc ff ff jmp c010289e <__alltraps> -c0102ceb : +c0102c21 : .globl vector97 vector97: pushl $0 -c0102ceb: 6a 00 push $0x0 +c0102c21: 6a 00 push $0x0 pushl $97 -c0102ced: 6a 61 push $0x61 +c0102c23: 6a 61 push $0x61 jmp __alltraps -c0102cef: e9 0e 07 00 00 jmp c0103402 <__alltraps> +c0102c25: e9 74 fc ff ff jmp c010289e <__alltraps> -c0102cf4 : +c0102c2a : .globl vector98 vector98: pushl $0 -c0102cf4: 6a 00 push $0x0 +c0102c2a: 6a 00 push $0x0 pushl $98 -c0102cf6: 6a 62 push $0x62 +c0102c2c: 6a 62 push $0x62 jmp __alltraps -c0102cf8: e9 05 07 00 00 jmp c0103402 <__alltraps> +c0102c2e: e9 6b fc ff ff jmp c010289e <__alltraps> -c0102cfd : +c0102c33 : .globl vector99 vector99: pushl $0 -c0102cfd: 6a 00 push $0x0 +c0102c33: 6a 00 push $0x0 pushl $99 -c0102cff: 6a 63 push $0x63 +c0102c35: 6a 63 push $0x63 jmp __alltraps -c0102d01: e9 fc 06 00 00 jmp c0103402 <__alltraps> +c0102c37: e9 62 fc ff ff jmp c010289e <__alltraps> -c0102d06 : +c0102c3c : .globl vector100 vector100: pushl $0 -c0102d06: 6a 00 push $0x0 +c0102c3c: 6a 00 push $0x0 pushl $100 -c0102d08: 6a 64 push $0x64 +c0102c3e: 6a 64 push $0x64 jmp __alltraps -c0102d0a: e9 f3 06 00 00 jmp c0103402 <__alltraps> +c0102c40: e9 59 fc ff ff jmp c010289e <__alltraps> -c0102d0f : +c0102c45 : .globl vector101 vector101: pushl $0 -c0102d0f: 6a 00 push $0x0 +c0102c45: 6a 00 push $0x0 pushl $101 -c0102d11: 6a 65 push $0x65 +c0102c47: 6a 65 push $0x65 jmp __alltraps -c0102d13: e9 ea 06 00 00 jmp c0103402 <__alltraps> +c0102c49: e9 50 fc ff ff jmp c010289e <__alltraps> -c0102d18 : +c0102c4e : .globl vector102 vector102: pushl $0 -c0102d18: 6a 00 push $0x0 +c0102c4e: 6a 00 push $0x0 pushl $102 -c0102d1a: 6a 66 push $0x66 +c0102c50: 6a 66 push $0x66 jmp __alltraps -c0102d1c: e9 e1 06 00 00 jmp c0103402 <__alltraps> +c0102c52: e9 47 fc ff ff jmp c010289e <__alltraps> -c0102d21 : +c0102c57 : .globl vector103 vector103: pushl $0 -c0102d21: 6a 00 push $0x0 +c0102c57: 6a 00 push $0x0 pushl $103 -c0102d23: 6a 67 push $0x67 +c0102c59: 6a 67 push $0x67 jmp __alltraps -c0102d25: e9 d8 06 00 00 jmp c0103402 <__alltraps> +c0102c5b: e9 3e fc ff ff jmp c010289e <__alltraps> -c0102d2a : +c0102c60 : .globl vector104 vector104: pushl $0 -c0102d2a: 6a 00 push $0x0 +c0102c60: 6a 00 push $0x0 pushl $104 -c0102d2c: 6a 68 push $0x68 +c0102c62: 6a 68 push $0x68 jmp __alltraps -c0102d2e: e9 cf 06 00 00 jmp c0103402 <__alltraps> +c0102c64: e9 35 fc ff ff jmp c010289e <__alltraps> -c0102d33 : +c0102c69 : .globl vector105 vector105: pushl $0 -c0102d33: 6a 00 push $0x0 +c0102c69: 6a 00 push $0x0 pushl $105 -c0102d35: 6a 69 push $0x69 +c0102c6b: 6a 69 push $0x69 jmp __alltraps -c0102d37: e9 c6 06 00 00 jmp c0103402 <__alltraps> +c0102c6d: e9 2c fc ff ff jmp c010289e <__alltraps> -c0102d3c : +c0102c72 : .globl vector106 vector106: pushl $0 -c0102d3c: 6a 00 push $0x0 +c0102c72: 6a 00 push $0x0 pushl $106 -c0102d3e: 6a 6a push $0x6a +c0102c74: 6a 6a push $0x6a jmp __alltraps -c0102d40: e9 bd 06 00 00 jmp c0103402 <__alltraps> +c0102c76: e9 23 fc ff ff jmp c010289e <__alltraps> -c0102d45 : +c0102c7b : .globl vector107 vector107: pushl $0 -c0102d45: 6a 00 push $0x0 +c0102c7b: 6a 00 push $0x0 pushl $107 -c0102d47: 6a 6b push $0x6b +c0102c7d: 6a 6b push $0x6b jmp __alltraps -c0102d49: e9 b4 06 00 00 jmp c0103402 <__alltraps> +c0102c7f: e9 1a fc ff ff jmp c010289e <__alltraps> -c0102d4e : +c0102c84 : .globl vector108 vector108: pushl $0 -c0102d4e: 6a 00 push $0x0 +c0102c84: 6a 00 push $0x0 pushl $108 -c0102d50: 6a 6c push $0x6c +c0102c86: 6a 6c push $0x6c jmp __alltraps -c0102d52: e9 ab 06 00 00 jmp c0103402 <__alltraps> +c0102c88: e9 11 fc ff ff jmp c010289e <__alltraps> -c0102d57 : +c0102c8d : .globl vector109 vector109: pushl $0 -c0102d57: 6a 00 push $0x0 +c0102c8d: 6a 00 push $0x0 pushl $109 -c0102d59: 6a 6d push $0x6d +c0102c8f: 6a 6d push $0x6d jmp __alltraps -c0102d5b: e9 a2 06 00 00 jmp c0103402 <__alltraps> +c0102c91: e9 08 fc ff ff jmp c010289e <__alltraps> -c0102d60 : +c0102c96 : .globl vector110 vector110: pushl $0 -c0102d60: 6a 00 push $0x0 +c0102c96: 6a 00 push $0x0 pushl $110 -c0102d62: 6a 6e push $0x6e +c0102c98: 6a 6e push $0x6e jmp __alltraps -c0102d64: e9 99 06 00 00 jmp c0103402 <__alltraps> +c0102c9a: e9 ff fb ff ff jmp c010289e <__alltraps> -c0102d69 : +c0102c9f : .globl vector111 vector111: pushl $0 -c0102d69: 6a 00 push $0x0 +c0102c9f: 6a 00 push $0x0 pushl $111 -c0102d6b: 6a 6f push $0x6f +c0102ca1: 6a 6f push $0x6f jmp __alltraps -c0102d6d: e9 90 06 00 00 jmp c0103402 <__alltraps> +c0102ca3: e9 f6 fb ff ff jmp c010289e <__alltraps> -c0102d72 : +c0102ca8 : .globl vector112 vector112: pushl $0 -c0102d72: 6a 00 push $0x0 +c0102ca8: 6a 00 push $0x0 pushl $112 -c0102d74: 6a 70 push $0x70 +c0102caa: 6a 70 push $0x70 jmp __alltraps -c0102d76: e9 87 06 00 00 jmp c0103402 <__alltraps> +c0102cac: e9 ed fb ff ff jmp c010289e <__alltraps> -c0102d7b : +c0102cb1 : .globl vector113 vector113: pushl $0 -c0102d7b: 6a 00 push $0x0 +c0102cb1: 6a 00 push $0x0 pushl $113 -c0102d7d: 6a 71 push $0x71 +c0102cb3: 6a 71 push $0x71 jmp __alltraps -c0102d7f: e9 7e 06 00 00 jmp c0103402 <__alltraps> +c0102cb5: e9 e4 fb ff ff jmp c010289e <__alltraps> -c0102d84 : +c0102cba : .globl vector114 vector114: pushl $0 -c0102d84: 6a 00 push $0x0 +c0102cba: 6a 00 push $0x0 pushl $114 -c0102d86: 6a 72 push $0x72 +c0102cbc: 6a 72 push $0x72 jmp __alltraps -c0102d88: e9 75 06 00 00 jmp c0103402 <__alltraps> +c0102cbe: e9 db fb ff ff jmp c010289e <__alltraps> -c0102d8d : +c0102cc3 : .globl vector115 vector115: pushl $0 -c0102d8d: 6a 00 push $0x0 +c0102cc3: 6a 00 push $0x0 pushl $115 -c0102d8f: 6a 73 push $0x73 +c0102cc5: 6a 73 push $0x73 jmp __alltraps -c0102d91: e9 6c 06 00 00 jmp c0103402 <__alltraps> +c0102cc7: e9 d2 fb ff ff jmp c010289e <__alltraps> -c0102d96 : +c0102ccc : .globl vector116 vector116: pushl $0 -c0102d96: 6a 00 push $0x0 +c0102ccc: 6a 00 push $0x0 pushl $116 -c0102d98: 6a 74 push $0x74 +c0102cce: 6a 74 push $0x74 jmp __alltraps -c0102d9a: e9 63 06 00 00 jmp c0103402 <__alltraps> +c0102cd0: e9 c9 fb ff ff jmp c010289e <__alltraps> -c0102d9f : +c0102cd5 : .globl vector117 vector117: pushl $0 -c0102d9f: 6a 00 push $0x0 +c0102cd5: 6a 00 push $0x0 pushl $117 -c0102da1: 6a 75 push $0x75 +c0102cd7: 6a 75 push $0x75 jmp __alltraps -c0102da3: e9 5a 06 00 00 jmp c0103402 <__alltraps> +c0102cd9: e9 c0 fb ff ff jmp c010289e <__alltraps> -c0102da8 : +c0102cde : .globl vector118 vector118: pushl $0 -c0102da8: 6a 00 push $0x0 +c0102cde: 6a 00 push $0x0 pushl $118 -c0102daa: 6a 76 push $0x76 +c0102ce0: 6a 76 push $0x76 jmp __alltraps -c0102dac: e9 51 06 00 00 jmp c0103402 <__alltraps> +c0102ce2: e9 b7 fb ff ff jmp c010289e <__alltraps> -c0102db1 : +c0102ce7 : .globl vector119 vector119: pushl $0 -c0102db1: 6a 00 push $0x0 +c0102ce7: 6a 00 push $0x0 pushl $119 -c0102db3: 6a 77 push $0x77 +c0102ce9: 6a 77 push $0x77 jmp __alltraps -c0102db5: e9 48 06 00 00 jmp c0103402 <__alltraps> +c0102ceb: e9 ae fb ff ff jmp c010289e <__alltraps> -c0102dba : +c0102cf0 : .globl vector120 vector120: pushl $0 -c0102dba: 6a 00 push $0x0 +c0102cf0: 6a 00 push $0x0 pushl $120 -c0102dbc: 6a 78 push $0x78 +c0102cf2: 6a 78 push $0x78 jmp __alltraps -c0102dbe: e9 3f 06 00 00 jmp c0103402 <__alltraps> +c0102cf4: e9 a5 fb ff ff jmp c010289e <__alltraps> -c0102dc3 : +c0102cf9 : .globl vector121 vector121: pushl $0 -c0102dc3: 6a 00 push $0x0 +c0102cf9: 6a 00 push $0x0 pushl $121 -c0102dc5: 6a 79 push $0x79 +c0102cfb: 6a 79 push $0x79 jmp __alltraps -c0102dc7: e9 36 06 00 00 jmp c0103402 <__alltraps> +c0102cfd: e9 9c fb ff ff jmp c010289e <__alltraps> -c0102dcc : +c0102d02 : .globl vector122 vector122: pushl $0 -c0102dcc: 6a 00 push $0x0 +c0102d02: 6a 00 push $0x0 pushl $122 -c0102dce: 6a 7a push $0x7a +c0102d04: 6a 7a push $0x7a jmp __alltraps -c0102dd0: e9 2d 06 00 00 jmp c0103402 <__alltraps> +c0102d06: e9 93 fb ff ff jmp c010289e <__alltraps> -c0102dd5 : +c0102d0b : .globl vector123 vector123: pushl $0 -c0102dd5: 6a 00 push $0x0 +c0102d0b: 6a 00 push $0x0 pushl $123 -c0102dd7: 6a 7b push $0x7b +c0102d0d: 6a 7b push $0x7b jmp __alltraps -c0102dd9: e9 24 06 00 00 jmp c0103402 <__alltraps> +c0102d0f: e9 8a fb ff ff jmp c010289e <__alltraps> -c0102dde : +c0102d14 : .globl vector124 vector124: pushl $0 -c0102dde: 6a 00 push $0x0 +c0102d14: 6a 00 push $0x0 pushl $124 -c0102de0: 6a 7c push $0x7c +c0102d16: 6a 7c push $0x7c jmp __alltraps -c0102de2: e9 1b 06 00 00 jmp c0103402 <__alltraps> +c0102d18: e9 81 fb ff ff jmp c010289e <__alltraps> -c0102de7 : +c0102d1d : .globl vector125 vector125: pushl $0 -c0102de7: 6a 00 push $0x0 +c0102d1d: 6a 00 push $0x0 pushl $125 -c0102de9: 6a 7d push $0x7d +c0102d1f: 6a 7d push $0x7d jmp __alltraps -c0102deb: e9 12 06 00 00 jmp c0103402 <__alltraps> +c0102d21: e9 78 fb ff ff jmp c010289e <__alltraps> -c0102df0 : +c0102d26 : .globl vector126 vector126: pushl $0 -c0102df0: 6a 00 push $0x0 +c0102d26: 6a 00 push $0x0 pushl $126 -c0102df2: 6a 7e push $0x7e +c0102d28: 6a 7e push $0x7e jmp __alltraps -c0102df4: e9 09 06 00 00 jmp c0103402 <__alltraps> +c0102d2a: e9 6f fb ff ff jmp c010289e <__alltraps> -c0102df9 : +c0102d2f : .globl vector127 vector127: pushl $0 -c0102df9: 6a 00 push $0x0 +c0102d2f: 6a 00 push $0x0 pushl $127 -c0102dfb: 6a 7f push $0x7f +c0102d31: 6a 7f push $0x7f jmp __alltraps -c0102dfd: e9 00 06 00 00 jmp c0103402 <__alltraps> +c0102d33: e9 66 fb ff ff jmp c010289e <__alltraps> -c0102e02 : +c0102d38 : .globl vector128 vector128: pushl $0 -c0102e02: 6a 00 push $0x0 +c0102d38: 6a 00 push $0x0 pushl $128 -c0102e04: 68 80 00 00 00 push $0x80 +c0102d3a: 68 80 00 00 00 push $0x80 jmp __alltraps -c0102e09: e9 f4 05 00 00 jmp c0103402 <__alltraps> +c0102d3f: e9 5a fb ff ff jmp c010289e <__alltraps> -c0102e0e : +c0102d44 : .globl vector129 vector129: pushl $0 -c0102e0e: 6a 00 push $0x0 +c0102d44: 6a 00 push $0x0 pushl $129 -c0102e10: 68 81 00 00 00 push $0x81 +c0102d46: 68 81 00 00 00 push $0x81 jmp __alltraps -c0102e15: e9 e8 05 00 00 jmp c0103402 <__alltraps> +c0102d4b: e9 4e fb ff ff jmp c010289e <__alltraps> -c0102e1a : +c0102d50 : .globl vector130 vector130: pushl $0 -c0102e1a: 6a 00 push $0x0 +c0102d50: 6a 00 push $0x0 pushl $130 -c0102e1c: 68 82 00 00 00 push $0x82 +c0102d52: 68 82 00 00 00 push $0x82 jmp __alltraps -c0102e21: e9 dc 05 00 00 jmp c0103402 <__alltraps> +c0102d57: e9 42 fb ff ff jmp c010289e <__alltraps> -c0102e26 : +c0102d5c : .globl vector131 vector131: pushl $0 -c0102e26: 6a 00 push $0x0 +c0102d5c: 6a 00 push $0x0 pushl $131 -c0102e28: 68 83 00 00 00 push $0x83 +c0102d5e: 68 83 00 00 00 push $0x83 jmp __alltraps -c0102e2d: e9 d0 05 00 00 jmp c0103402 <__alltraps> +c0102d63: e9 36 fb ff ff jmp c010289e <__alltraps> -c0102e32 : +c0102d68 : .globl vector132 vector132: pushl $0 -c0102e32: 6a 00 push $0x0 +c0102d68: 6a 00 push $0x0 pushl $132 -c0102e34: 68 84 00 00 00 push $0x84 +c0102d6a: 68 84 00 00 00 push $0x84 jmp __alltraps -c0102e39: e9 c4 05 00 00 jmp c0103402 <__alltraps> +c0102d6f: e9 2a fb ff ff jmp c010289e <__alltraps> -c0102e3e : +c0102d74 : .globl vector133 vector133: pushl $0 -c0102e3e: 6a 00 push $0x0 +c0102d74: 6a 00 push $0x0 pushl $133 -c0102e40: 68 85 00 00 00 push $0x85 +c0102d76: 68 85 00 00 00 push $0x85 jmp __alltraps -c0102e45: e9 b8 05 00 00 jmp c0103402 <__alltraps> +c0102d7b: e9 1e fb ff ff jmp c010289e <__alltraps> -c0102e4a : +c0102d80 : .globl vector134 vector134: pushl $0 -c0102e4a: 6a 00 push $0x0 +c0102d80: 6a 00 push $0x0 pushl $134 -c0102e4c: 68 86 00 00 00 push $0x86 +c0102d82: 68 86 00 00 00 push $0x86 jmp __alltraps -c0102e51: e9 ac 05 00 00 jmp c0103402 <__alltraps> +c0102d87: e9 12 fb ff ff jmp c010289e <__alltraps> -c0102e56 : +c0102d8c : .globl vector135 vector135: pushl $0 -c0102e56: 6a 00 push $0x0 +c0102d8c: 6a 00 push $0x0 pushl $135 -c0102e58: 68 87 00 00 00 push $0x87 +c0102d8e: 68 87 00 00 00 push $0x87 jmp __alltraps -c0102e5d: e9 a0 05 00 00 jmp c0103402 <__alltraps> +c0102d93: e9 06 fb ff ff jmp c010289e <__alltraps> -c0102e62 : +c0102d98 : .globl vector136 vector136: pushl $0 -c0102e62: 6a 00 push $0x0 +c0102d98: 6a 00 push $0x0 pushl $136 -c0102e64: 68 88 00 00 00 push $0x88 +c0102d9a: 68 88 00 00 00 push $0x88 jmp __alltraps -c0102e69: e9 94 05 00 00 jmp c0103402 <__alltraps> +c0102d9f: e9 fa fa ff ff jmp c010289e <__alltraps> -c0102e6e : +c0102da4 : .globl vector137 vector137: pushl $0 -c0102e6e: 6a 00 push $0x0 +c0102da4: 6a 00 push $0x0 pushl $137 -c0102e70: 68 89 00 00 00 push $0x89 +c0102da6: 68 89 00 00 00 push $0x89 jmp __alltraps -c0102e75: e9 88 05 00 00 jmp c0103402 <__alltraps> +c0102dab: e9 ee fa ff ff jmp c010289e <__alltraps> -c0102e7a : +c0102db0 : .globl vector138 vector138: pushl $0 -c0102e7a: 6a 00 push $0x0 +c0102db0: 6a 00 push $0x0 pushl $138 -c0102e7c: 68 8a 00 00 00 push $0x8a +c0102db2: 68 8a 00 00 00 push $0x8a jmp __alltraps -c0102e81: e9 7c 05 00 00 jmp c0103402 <__alltraps> +c0102db7: e9 e2 fa ff ff jmp c010289e <__alltraps> -c0102e86 : +c0102dbc : .globl vector139 vector139: pushl $0 -c0102e86: 6a 00 push $0x0 +c0102dbc: 6a 00 push $0x0 pushl $139 -c0102e88: 68 8b 00 00 00 push $0x8b +c0102dbe: 68 8b 00 00 00 push $0x8b jmp __alltraps -c0102e8d: e9 70 05 00 00 jmp c0103402 <__alltraps> +c0102dc3: e9 d6 fa ff ff jmp c010289e <__alltraps> -c0102e92 : +c0102dc8 : .globl vector140 vector140: pushl $0 -c0102e92: 6a 00 push $0x0 +c0102dc8: 6a 00 push $0x0 pushl $140 -c0102e94: 68 8c 00 00 00 push $0x8c +c0102dca: 68 8c 00 00 00 push $0x8c jmp __alltraps -c0102e99: e9 64 05 00 00 jmp c0103402 <__alltraps> +c0102dcf: e9 ca fa ff ff jmp c010289e <__alltraps> -c0102e9e : +c0102dd4 : .globl vector141 vector141: pushl $0 -c0102e9e: 6a 00 push $0x0 +c0102dd4: 6a 00 push $0x0 pushl $141 -c0102ea0: 68 8d 00 00 00 push $0x8d +c0102dd6: 68 8d 00 00 00 push $0x8d jmp __alltraps -c0102ea5: e9 58 05 00 00 jmp c0103402 <__alltraps> +c0102ddb: e9 be fa ff ff jmp c010289e <__alltraps> -c0102eaa : +c0102de0 : .globl vector142 vector142: pushl $0 -c0102eaa: 6a 00 push $0x0 +c0102de0: 6a 00 push $0x0 pushl $142 -c0102eac: 68 8e 00 00 00 push $0x8e +c0102de2: 68 8e 00 00 00 push $0x8e jmp __alltraps -c0102eb1: e9 4c 05 00 00 jmp c0103402 <__alltraps> +c0102de7: e9 b2 fa ff ff jmp c010289e <__alltraps> -c0102eb6 : +c0102dec : .globl vector143 vector143: pushl $0 -c0102eb6: 6a 00 push $0x0 +c0102dec: 6a 00 push $0x0 pushl $143 -c0102eb8: 68 8f 00 00 00 push $0x8f +c0102dee: 68 8f 00 00 00 push $0x8f jmp __alltraps -c0102ebd: e9 40 05 00 00 jmp c0103402 <__alltraps> +c0102df3: e9 a6 fa ff ff jmp c010289e <__alltraps> -c0102ec2 : +c0102df8 : .globl vector144 vector144: pushl $0 -c0102ec2: 6a 00 push $0x0 +c0102df8: 6a 00 push $0x0 pushl $144 -c0102ec4: 68 90 00 00 00 push $0x90 +c0102dfa: 68 90 00 00 00 push $0x90 jmp __alltraps -c0102ec9: e9 34 05 00 00 jmp c0103402 <__alltraps> +c0102dff: e9 9a fa ff ff jmp c010289e <__alltraps> -c0102ece : +c0102e04 : .globl vector145 vector145: pushl $0 -c0102ece: 6a 00 push $0x0 +c0102e04: 6a 00 push $0x0 pushl $145 -c0102ed0: 68 91 00 00 00 push $0x91 +c0102e06: 68 91 00 00 00 push $0x91 jmp __alltraps -c0102ed5: e9 28 05 00 00 jmp c0103402 <__alltraps> +c0102e0b: e9 8e fa ff ff jmp c010289e <__alltraps> -c0102eda : +c0102e10 : .globl vector146 vector146: pushl $0 -c0102eda: 6a 00 push $0x0 +c0102e10: 6a 00 push $0x0 pushl $146 -c0102edc: 68 92 00 00 00 push $0x92 +c0102e12: 68 92 00 00 00 push $0x92 jmp __alltraps -c0102ee1: e9 1c 05 00 00 jmp c0103402 <__alltraps> +c0102e17: e9 82 fa ff ff jmp c010289e <__alltraps> -c0102ee6 : +c0102e1c : .globl vector147 vector147: pushl $0 -c0102ee6: 6a 00 push $0x0 +c0102e1c: 6a 00 push $0x0 pushl $147 -c0102ee8: 68 93 00 00 00 push $0x93 +c0102e1e: 68 93 00 00 00 push $0x93 jmp __alltraps -c0102eed: e9 10 05 00 00 jmp c0103402 <__alltraps> +c0102e23: e9 76 fa ff ff jmp c010289e <__alltraps> -c0102ef2 : +c0102e28 : .globl vector148 vector148: pushl $0 -c0102ef2: 6a 00 push $0x0 +c0102e28: 6a 00 push $0x0 pushl $148 -c0102ef4: 68 94 00 00 00 push $0x94 +c0102e2a: 68 94 00 00 00 push $0x94 jmp __alltraps -c0102ef9: e9 04 05 00 00 jmp c0103402 <__alltraps> +c0102e2f: e9 6a fa ff ff jmp c010289e <__alltraps> -c0102efe : +c0102e34 : .globl vector149 vector149: pushl $0 -c0102efe: 6a 00 push $0x0 +c0102e34: 6a 00 push $0x0 pushl $149 -c0102f00: 68 95 00 00 00 push $0x95 +c0102e36: 68 95 00 00 00 push $0x95 jmp __alltraps -c0102f05: e9 f8 04 00 00 jmp c0103402 <__alltraps> +c0102e3b: e9 5e fa ff ff jmp c010289e <__alltraps> -c0102f0a : +c0102e40 : .globl vector150 vector150: pushl $0 -c0102f0a: 6a 00 push $0x0 +c0102e40: 6a 00 push $0x0 pushl $150 -c0102f0c: 68 96 00 00 00 push $0x96 +c0102e42: 68 96 00 00 00 push $0x96 jmp __alltraps -c0102f11: e9 ec 04 00 00 jmp c0103402 <__alltraps> +c0102e47: e9 52 fa ff ff jmp c010289e <__alltraps> -c0102f16 : +c0102e4c : .globl vector151 vector151: pushl $0 -c0102f16: 6a 00 push $0x0 +c0102e4c: 6a 00 push $0x0 pushl $151 -c0102f18: 68 97 00 00 00 push $0x97 +c0102e4e: 68 97 00 00 00 push $0x97 jmp __alltraps -c0102f1d: e9 e0 04 00 00 jmp c0103402 <__alltraps> +c0102e53: e9 46 fa ff ff jmp c010289e <__alltraps> -c0102f22 : +c0102e58 : .globl vector152 vector152: pushl $0 -c0102f22: 6a 00 push $0x0 +c0102e58: 6a 00 push $0x0 pushl $152 -c0102f24: 68 98 00 00 00 push $0x98 +c0102e5a: 68 98 00 00 00 push $0x98 jmp __alltraps -c0102f29: e9 d4 04 00 00 jmp c0103402 <__alltraps> +c0102e5f: e9 3a fa ff ff jmp c010289e <__alltraps> -c0102f2e : +c0102e64 : .globl vector153 vector153: pushl $0 -c0102f2e: 6a 00 push $0x0 +c0102e64: 6a 00 push $0x0 pushl $153 -c0102f30: 68 99 00 00 00 push $0x99 +c0102e66: 68 99 00 00 00 push $0x99 jmp __alltraps -c0102f35: e9 c8 04 00 00 jmp c0103402 <__alltraps> +c0102e6b: e9 2e fa ff ff jmp c010289e <__alltraps> -c0102f3a : +c0102e70 : .globl vector154 vector154: pushl $0 -c0102f3a: 6a 00 push $0x0 +c0102e70: 6a 00 push $0x0 pushl $154 -c0102f3c: 68 9a 00 00 00 push $0x9a +c0102e72: 68 9a 00 00 00 push $0x9a jmp __alltraps -c0102f41: e9 bc 04 00 00 jmp c0103402 <__alltraps> +c0102e77: e9 22 fa ff ff jmp c010289e <__alltraps> -c0102f46 : +c0102e7c : .globl vector155 vector155: pushl $0 -c0102f46: 6a 00 push $0x0 +c0102e7c: 6a 00 push $0x0 pushl $155 -c0102f48: 68 9b 00 00 00 push $0x9b +c0102e7e: 68 9b 00 00 00 push $0x9b jmp __alltraps -c0102f4d: e9 b0 04 00 00 jmp c0103402 <__alltraps> +c0102e83: e9 16 fa ff ff jmp c010289e <__alltraps> -c0102f52 : +c0102e88 : .globl vector156 vector156: pushl $0 -c0102f52: 6a 00 push $0x0 +c0102e88: 6a 00 push $0x0 pushl $156 -c0102f54: 68 9c 00 00 00 push $0x9c +c0102e8a: 68 9c 00 00 00 push $0x9c jmp __alltraps -c0102f59: e9 a4 04 00 00 jmp c0103402 <__alltraps> +c0102e8f: e9 0a fa ff ff jmp c010289e <__alltraps> -c0102f5e : +c0102e94 : .globl vector157 vector157: pushl $0 -c0102f5e: 6a 00 push $0x0 +c0102e94: 6a 00 push $0x0 pushl $157 -c0102f60: 68 9d 00 00 00 push $0x9d +c0102e96: 68 9d 00 00 00 push $0x9d jmp __alltraps -c0102f65: e9 98 04 00 00 jmp c0103402 <__alltraps> +c0102e9b: e9 fe f9 ff ff jmp c010289e <__alltraps> -c0102f6a : +c0102ea0 : .globl vector158 vector158: pushl $0 -c0102f6a: 6a 00 push $0x0 +c0102ea0: 6a 00 push $0x0 pushl $158 -c0102f6c: 68 9e 00 00 00 push $0x9e +c0102ea2: 68 9e 00 00 00 push $0x9e jmp __alltraps -c0102f71: e9 8c 04 00 00 jmp c0103402 <__alltraps> +c0102ea7: e9 f2 f9 ff ff jmp c010289e <__alltraps> -c0102f76 : +c0102eac : .globl vector159 vector159: pushl $0 -c0102f76: 6a 00 push $0x0 +c0102eac: 6a 00 push $0x0 pushl $159 -c0102f78: 68 9f 00 00 00 push $0x9f +c0102eae: 68 9f 00 00 00 push $0x9f jmp __alltraps -c0102f7d: e9 80 04 00 00 jmp c0103402 <__alltraps> +c0102eb3: e9 e6 f9 ff ff jmp c010289e <__alltraps> -c0102f82 : +c0102eb8 : .globl vector160 vector160: pushl $0 -c0102f82: 6a 00 push $0x0 +c0102eb8: 6a 00 push $0x0 pushl $160 -c0102f84: 68 a0 00 00 00 push $0xa0 +c0102eba: 68 a0 00 00 00 push $0xa0 jmp __alltraps -c0102f89: e9 74 04 00 00 jmp c0103402 <__alltraps> +c0102ebf: e9 da f9 ff ff jmp c010289e <__alltraps> -c0102f8e : +c0102ec4 : .globl vector161 vector161: pushl $0 -c0102f8e: 6a 00 push $0x0 +c0102ec4: 6a 00 push $0x0 pushl $161 -c0102f90: 68 a1 00 00 00 push $0xa1 +c0102ec6: 68 a1 00 00 00 push $0xa1 jmp __alltraps -c0102f95: e9 68 04 00 00 jmp c0103402 <__alltraps> +c0102ecb: e9 ce f9 ff ff jmp c010289e <__alltraps> -c0102f9a : +c0102ed0 : .globl vector162 vector162: pushl $0 -c0102f9a: 6a 00 push $0x0 +c0102ed0: 6a 00 push $0x0 pushl $162 -c0102f9c: 68 a2 00 00 00 push $0xa2 +c0102ed2: 68 a2 00 00 00 push $0xa2 jmp __alltraps -c0102fa1: e9 5c 04 00 00 jmp c0103402 <__alltraps> +c0102ed7: e9 c2 f9 ff ff jmp c010289e <__alltraps> -c0102fa6 : +c0102edc : .globl vector163 vector163: pushl $0 -c0102fa6: 6a 00 push $0x0 +c0102edc: 6a 00 push $0x0 pushl $163 -c0102fa8: 68 a3 00 00 00 push $0xa3 +c0102ede: 68 a3 00 00 00 push $0xa3 jmp __alltraps -c0102fad: e9 50 04 00 00 jmp c0103402 <__alltraps> +c0102ee3: e9 b6 f9 ff ff jmp c010289e <__alltraps> -c0102fb2 : +c0102ee8 : .globl vector164 vector164: pushl $0 -c0102fb2: 6a 00 push $0x0 +c0102ee8: 6a 00 push $0x0 pushl $164 -c0102fb4: 68 a4 00 00 00 push $0xa4 +c0102eea: 68 a4 00 00 00 push $0xa4 jmp __alltraps -c0102fb9: e9 44 04 00 00 jmp c0103402 <__alltraps> +c0102eef: e9 aa f9 ff ff jmp c010289e <__alltraps> -c0102fbe : +c0102ef4 : .globl vector165 vector165: pushl $0 -c0102fbe: 6a 00 push $0x0 +c0102ef4: 6a 00 push $0x0 pushl $165 -c0102fc0: 68 a5 00 00 00 push $0xa5 +c0102ef6: 68 a5 00 00 00 push $0xa5 jmp __alltraps -c0102fc5: e9 38 04 00 00 jmp c0103402 <__alltraps> +c0102efb: e9 9e f9 ff ff jmp c010289e <__alltraps> -c0102fca : +c0102f00 : .globl vector166 vector166: pushl $0 -c0102fca: 6a 00 push $0x0 +c0102f00: 6a 00 push $0x0 pushl $166 -c0102fcc: 68 a6 00 00 00 push $0xa6 +c0102f02: 68 a6 00 00 00 push $0xa6 jmp __alltraps -c0102fd1: e9 2c 04 00 00 jmp c0103402 <__alltraps> +c0102f07: e9 92 f9 ff ff jmp c010289e <__alltraps> -c0102fd6 : +c0102f0c : .globl vector167 vector167: pushl $0 -c0102fd6: 6a 00 push $0x0 +c0102f0c: 6a 00 push $0x0 pushl $167 -c0102fd8: 68 a7 00 00 00 push $0xa7 +c0102f0e: 68 a7 00 00 00 push $0xa7 jmp __alltraps -c0102fdd: e9 20 04 00 00 jmp c0103402 <__alltraps> +c0102f13: e9 86 f9 ff ff jmp c010289e <__alltraps> -c0102fe2 : +c0102f18 : .globl vector168 vector168: pushl $0 -c0102fe2: 6a 00 push $0x0 +c0102f18: 6a 00 push $0x0 pushl $168 -c0102fe4: 68 a8 00 00 00 push $0xa8 +c0102f1a: 68 a8 00 00 00 push $0xa8 jmp __alltraps -c0102fe9: e9 14 04 00 00 jmp c0103402 <__alltraps> +c0102f1f: e9 7a f9 ff ff jmp c010289e <__alltraps> -c0102fee : +c0102f24 : .globl vector169 vector169: pushl $0 -c0102fee: 6a 00 push $0x0 +c0102f24: 6a 00 push $0x0 pushl $169 -c0102ff0: 68 a9 00 00 00 push $0xa9 +c0102f26: 68 a9 00 00 00 push $0xa9 jmp __alltraps -c0102ff5: e9 08 04 00 00 jmp c0103402 <__alltraps> +c0102f2b: e9 6e f9 ff ff jmp c010289e <__alltraps> -c0102ffa : +c0102f30 : .globl vector170 vector170: pushl $0 -c0102ffa: 6a 00 push $0x0 +c0102f30: 6a 00 push $0x0 pushl $170 -c0102ffc: 68 aa 00 00 00 push $0xaa +c0102f32: 68 aa 00 00 00 push $0xaa jmp __alltraps -c0103001: e9 fc 03 00 00 jmp c0103402 <__alltraps> +c0102f37: e9 62 f9 ff ff jmp c010289e <__alltraps> -c0103006 : +c0102f3c : .globl vector171 vector171: pushl $0 -c0103006: 6a 00 push $0x0 +c0102f3c: 6a 00 push $0x0 pushl $171 -c0103008: 68 ab 00 00 00 push $0xab +c0102f3e: 68 ab 00 00 00 push $0xab jmp __alltraps -c010300d: e9 f0 03 00 00 jmp c0103402 <__alltraps> +c0102f43: e9 56 f9 ff ff jmp c010289e <__alltraps> -c0103012 : +c0102f48 : .globl vector172 vector172: pushl $0 -c0103012: 6a 00 push $0x0 +c0102f48: 6a 00 push $0x0 pushl $172 -c0103014: 68 ac 00 00 00 push $0xac +c0102f4a: 68 ac 00 00 00 push $0xac jmp __alltraps -c0103019: e9 e4 03 00 00 jmp c0103402 <__alltraps> +c0102f4f: e9 4a f9 ff ff jmp c010289e <__alltraps> -c010301e : +c0102f54 : .globl vector173 vector173: pushl $0 -c010301e: 6a 00 push $0x0 +c0102f54: 6a 00 push $0x0 pushl $173 -c0103020: 68 ad 00 00 00 push $0xad +c0102f56: 68 ad 00 00 00 push $0xad jmp __alltraps -c0103025: e9 d8 03 00 00 jmp c0103402 <__alltraps> +c0102f5b: e9 3e f9 ff ff jmp c010289e <__alltraps> -c010302a : +c0102f60 : .globl vector174 vector174: pushl $0 -c010302a: 6a 00 push $0x0 +c0102f60: 6a 00 push $0x0 pushl $174 -c010302c: 68 ae 00 00 00 push $0xae +c0102f62: 68 ae 00 00 00 push $0xae jmp __alltraps -c0103031: e9 cc 03 00 00 jmp c0103402 <__alltraps> +c0102f67: e9 32 f9 ff ff jmp c010289e <__alltraps> -c0103036 : +c0102f6c : .globl vector175 vector175: pushl $0 -c0103036: 6a 00 push $0x0 +c0102f6c: 6a 00 push $0x0 pushl $175 -c0103038: 68 af 00 00 00 push $0xaf +c0102f6e: 68 af 00 00 00 push $0xaf jmp __alltraps -c010303d: e9 c0 03 00 00 jmp c0103402 <__alltraps> +c0102f73: e9 26 f9 ff ff jmp c010289e <__alltraps> -c0103042 : +c0102f78 : .globl vector176 vector176: pushl $0 -c0103042: 6a 00 push $0x0 +c0102f78: 6a 00 push $0x0 pushl $176 -c0103044: 68 b0 00 00 00 push $0xb0 +c0102f7a: 68 b0 00 00 00 push $0xb0 jmp __alltraps -c0103049: e9 b4 03 00 00 jmp c0103402 <__alltraps> +c0102f7f: e9 1a f9 ff ff jmp c010289e <__alltraps> -c010304e : +c0102f84 : .globl vector177 vector177: pushl $0 -c010304e: 6a 00 push $0x0 +c0102f84: 6a 00 push $0x0 pushl $177 -c0103050: 68 b1 00 00 00 push $0xb1 +c0102f86: 68 b1 00 00 00 push $0xb1 jmp __alltraps -c0103055: e9 a8 03 00 00 jmp c0103402 <__alltraps> +c0102f8b: e9 0e f9 ff ff jmp c010289e <__alltraps> -c010305a : +c0102f90 : .globl vector178 vector178: pushl $0 -c010305a: 6a 00 push $0x0 +c0102f90: 6a 00 push $0x0 pushl $178 -c010305c: 68 b2 00 00 00 push $0xb2 +c0102f92: 68 b2 00 00 00 push $0xb2 jmp __alltraps -c0103061: e9 9c 03 00 00 jmp c0103402 <__alltraps> +c0102f97: e9 02 f9 ff ff jmp c010289e <__alltraps> -c0103066 : +c0102f9c : .globl vector179 vector179: pushl $0 -c0103066: 6a 00 push $0x0 +c0102f9c: 6a 00 push $0x0 pushl $179 -c0103068: 68 b3 00 00 00 push $0xb3 +c0102f9e: 68 b3 00 00 00 push $0xb3 jmp __alltraps -c010306d: e9 90 03 00 00 jmp c0103402 <__alltraps> +c0102fa3: e9 f6 f8 ff ff jmp c010289e <__alltraps> -c0103072 : +c0102fa8 : .globl vector180 vector180: pushl $0 -c0103072: 6a 00 push $0x0 +c0102fa8: 6a 00 push $0x0 pushl $180 -c0103074: 68 b4 00 00 00 push $0xb4 +c0102faa: 68 b4 00 00 00 push $0xb4 jmp __alltraps -c0103079: e9 84 03 00 00 jmp c0103402 <__alltraps> +c0102faf: e9 ea f8 ff ff jmp c010289e <__alltraps> -c010307e : +c0102fb4 : .globl vector181 vector181: pushl $0 -c010307e: 6a 00 push $0x0 +c0102fb4: 6a 00 push $0x0 pushl $181 -c0103080: 68 b5 00 00 00 push $0xb5 +c0102fb6: 68 b5 00 00 00 push $0xb5 jmp __alltraps -c0103085: e9 78 03 00 00 jmp c0103402 <__alltraps> +c0102fbb: e9 de f8 ff ff jmp c010289e <__alltraps> -c010308a : +c0102fc0 : .globl vector182 vector182: pushl $0 -c010308a: 6a 00 push $0x0 +c0102fc0: 6a 00 push $0x0 pushl $182 -c010308c: 68 b6 00 00 00 push $0xb6 +c0102fc2: 68 b6 00 00 00 push $0xb6 jmp __alltraps -c0103091: e9 6c 03 00 00 jmp c0103402 <__alltraps> +c0102fc7: e9 d2 f8 ff ff jmp c010289e <__alltraps> -c0103096 : +c0102fcc : .globl vector183 vector183: pushl $0 -c0103096: 6a 00 push $0x0 +c0102fcc: 6a 00 push $0x0 pushl $183 -c0103098: 68 b7 00 00 00 push $0xb7 +c0102fce: 68 b7 00 00 00 push $0xb7 jmp __alltraps -c010309d: e9 60 03 00 00 jmp c0103402 <__alltraps> +c0102fd3: e9 c6 f8 ff ff jmp c010289e <__alltraps> -c01030a2 : +c0102fd8 : .globl vector184 vector184: pushl $0 -c01030a2: 6a 00 push $0x0 +c0102fd8: 6a 00 push $0x0 pushl $184 -c01030a4: 68 b8 00 00 00 push $0xb8 +c0102fda: 68 b8 00 00 00 push $0xb8 jmp __alltraps -c01030a9: e9 54 03 00 00 jmp c0103402 <__alltraps> +c0102fdf: e9 ba f8 ff ff jmp c010289e <__alltraps> -c01030ae : +c0102fe4 : .globl vector185 vector185: pushl $0 -c01030ae: 6a 00 push $0x0 +c0102fe4: 6a 00 push $0x0 pushl $185 -c01030b0: 68 b9 00 00 00 push $0xb9 +c0102fe6: 68 b9 00 00 00 push $0xb9 jmp __alltraps -c01030b5: e9 48 03 00 00 jmp c0103402 <__alltraps> +c0102feb: e9 ae f8 ff ff jmp c010289e <__alltraps> -c01030ba : +c0102ff0 : .globl vector186 vector186: pushl $0 -c01030ba: 6a 00 push $0x0 +c0102ff0: 6a 00 push $0x0 pushl $186 -c01030bc: 68 ba 00 00 00 push $0xba +c0102ff2: 68 ba 00 00 00 push $0xba jmp __alltraps -c01030c1: e9 3c 03 00 00 jmp c0103402 <__alltraps> +c0102ff7: e9 a2 f8 ff ff jmp c010289e <__alltraps> -c01030c6 : +c0102ffc : .globl vector187 vector187: pushl $0 -c01030c6: 6a 00 push $0x0 +c0102ffc: 6a 00 push $0x0 pushl $187 -c01030c8: 68 bb 00 00 00 push $0xbb +c0102ffe: 68 bb 00 00 00 push $0xbb jmp __alltraps -c01030cd: e9 30 03 00 00 jmp c0103402 <__alltraps> +c0103003: e9 96 f8 ff ff jmp c010289e <__alltraps> -c01030d2 : +c0103008 : .globl vector188 vector188: pushl $0 -c01030d2: 6a 00 push $0x0 +c0103008: 6a 00 push $0x0 pushl $188 -c01030d4: 68 bc 00 00 00 push $0xbc +c010300a: 68 bc 00 00 00 push $0xbc jmp __alltraps -c01030d9: e9 24 03 00 00 jmp c0103402 <__alltraps> +c010300f: e9 8a f8 ff ff jmp c010289e <__alltraps> -c01030de : +c0103014 : .globl vector189 vector189: pushl $0 -c01030de: 6a 00 push $0x0 +c0103014: 6a 00 push $0x0 pushl $189 -c01030e0: 68 bd 00 00 00 push $0xbd +c0103016: 68 bd 00 00 00 push $0xbd jmp __alltraps -c01030e5: e9 18 03 00 00 jmp c0103402 <__alltraps> +c010301b: e9 7e f8 ff ff jmp c010289e <__alltraps> -c01030ea : +c0103020 : .globl vector190 vector190: pushl $0 -c01030ea: 6a 00 push $0x0 +c0103020: 6a 00 push $0x0 pushl $190 -c01030ec: 68 be 00 00 00 push $0xbe +c0103022: 68 be 00 00 00 push $0xbe jmp __alltraps -c01030f1: e9 0c 03 00 00 jmp c0103402 <__alltraps> +c0103027: e9 72 f8 ff ff jmp c010289e <__alltraps> -c01030f6 : +c010302c : .globl vector191 vector191: pushl $0 -c01030f6: 6a 00 push $0x0 +c010302c: 6a 00 push $0x0 pushl $191 -c01030f8: 68 bf 00 00 00 push $0xbf +c010302e: 68 bf 00 00 00 push $0xbf jmp __alltraps -c01030fd: e9 00 03 00 00 jmp c0103402 <__alltraps> +c0103033: e9 66 f8 ff ff jmp c010289e <__alltraps> -c0103102 : +c0103038 : .globl vector192 vector192: pushl $0 -c0103102: 6a 00 push $0x0 +c0103038: 6a 00 push $0x0 pushl $192 -c0103104: 68 c0 00 00 00 push $0xc0 +c010303a: 68 c0 00 00 00 push $0xc0 jmp __alltraps -c0103109: e9 f4 02 00 00 jmp c0103402 <__alltraps> +c010303f: e9 5a f8 ff ff jmp c010289e <__alltraps> -c010310e : +c0103044 : .globl vector193 vector193: pushl $0 -c010310e: 6a 00 push $0x0 +c0103044: 6a 00 push $0x0 pushl $193 -c0103110: 68 c1 00 00 00 push $0xc1 +c0103046: 68 c1 00 00 00 push $0xc1 jmp __alltraps -c0103115: e9 e8 02 00 00 jmp c0103402 <__alltraps> +c010304b: e9 4e f8 ff ff jmp c010289e <__alltraps> -c010311a : +c0103050 : .globl vector194 vector194: pushl $0 -c010311a: 6a 00 push $0x0 +c0103050: 6a 00 push $0x0 pushl $194 -c010311c: 68 c2 00 00 00 push $0xc2 +c0103052: 68 c2 00 00 00 push $0xc2 jmp __alltraps -c0103121: e9 dc 02 00 00 jmp c0103402 <__alltraps> +c0103057: e9 42 f8 ff ff jmp c010289e <__alltraps> -c0103126 : +c010305c : .globl vector195 vector195: pushl $0 -c0103126: 6a 00 push $0x0 +c010305c: 6a 00 push $0x0 pushl $195 -c0103128: 68 c3 00 00 00 push $0xc3 +c010305e: 68 c3 00 00 00 push $0xc3 jmp __alltraps -c010312d: e9 d0 02 00 00 jmp c0103402 <__alltraps> +c0103063: e9 36 f8 ff ff jmp c010289e <__alltraps> -c0103132 : +c0103068 : .globl vector196 vector196: pushl $0 -c0103132: 6a 00 push $0x0 +c0103068: 6a 00 push $0x0 pushl $196 -c0103134: 68 c4 00 00 00 push $0xc4 +c010306a: 68 c4 00 00 00 push $0xc4 jmp __alltraps -c0103139: e9 c4 02 00 00 jmp c0103402 <__alltraps> +c010306f: e9 2a f8 ff ff jmp c010289e <__alltraps> -c010313e : +c0103074 : .globl vector197 vector197: pushl $0 -c010313e: 6a 00 push $0x0 +c0103074: 6a 00 push $0x0 pushl $197 -c0103140: 68 c5 00 00 00 push $0xc5 +c0103076: 68 c5 00 00 00 push $0xc5 jmp __alltraps -c0103145: e9 b8 02 00 00 jmp c0103402 <__alltraps> +c010307b: e9 1e f8 ff ff jmp c010289e <__alltraps> -c010314a : +c0103080 : .globl vector198 vector198: pushl $0 -c010314a: 6a 00 push $0x0 +c0103080: 6a 00 push $0x0 pushl $198 -c010314c: 68 c6 00 00 00 push $0xc6 +c0103082: 68 c6 00 00 00 push $0xc6 jmp __alltraps -c0103151: e9 ac 02 00 00 jmp c0103402 <__alltraps> +c0103087: e9 12 f8 ff ff jmp c010289e <__alltraps> -c0103156 : +c010308c : .globl vector199 vector199: pushl $0 -c0103156: 6a 00 push $0x0 +c010308c: 6a 00 push $0x0 pushl $199 -c0103158: 68 c7 00 00 00 push $0xc7 +c010308e: 68 c7 00 00 00 push $0xc7 jmp __alltraps -c010315d: e9 a0 02 00 00 jmp c0103402 <__alltraps> +c0103093: e9 06 f8 ff ff jmp c010289e <__alltraps> -c0103162 : +c0103098 : .globl vector200 vector200: pushl $0 -c0103162: 6a 00 push $0x0 +c0103098: 6a 00 push $0x0 pushl $200 -c0103164: 68 c8 00 00 00 push $0xc8 +c010309a: 68 c8 00 00 00 push $0xc8 jmp __alltraps -c0103169: e9 94 02 00 00 jmp c0103402 <__alltraps> +c010309f: e9 fa f7 ff ff jmp c010289e <__alltraps> -c010316e : +c01030a4 : .globl vector201 vector201: pushl $0 -c010316e: 6a 00 push $0x0 +c01030a4: 6a 00 push $0x0 pushl $201 -c0103170: 68 c9 00 00 00 push $0xc9 +c01030a6: 68 c9 00 00 00 push $0xc9 jmp __alltraps -c0103175: e9 88 02 00 00 jmp c0103402 <__alltraps> +c01030ab: e9 ee f7 ff ff jmp c010289e <__alltraps> -c010317a : +c01030b0 : .globl vector202 vector202: pushl $0 -c010317a: 6a 00 push $0x0 +c01030b0: 6a 00 push $0x0 pushl $202 -c010317c: 68 ca 00 00 00 push $0xca +c01030b2: 68 ca 00 00 00 push $0xca jmp __alltraps -c0103181: e9 7c 02 00 00 jmp c0103402 <__alltraps> +c01030b7: e9 e2 f7 ff ff jmp c010289e <__alltraps> -c0103186 : +c01030bc : .globl vector203 vector203: pushl $0 -c0103186: 6a 00 push $0x0 +c01030bc: 6a 00 push $0x0 pushl $203 -c0103188: 68 cb 00 00 00 push $0xcb +c01030be: 68 cb 00 00 00 push $0xcb jmp __alltraps -c010318d: e9 70 02 00 00 jmp c0103402 <__alltraps> +c01030c3: e9 d6 f7 ff ff jmp c010289e <__alltraps> -c0103192 : +c01030c8 : .globl vector204 vector204: pushl $0 -c0103192: 6a 00 push $0x0 +c01030c8: 6a 00 push $0x0 pushl $204 -c0103194: 68 cc 00 00 00 push $0xcc +c01030ca: 68 cc 00 00 00 push $0xcc jmp __alltraps -c0103199: e9 64 02 00 00 jmp c0103402 <__alltraps> +c01030cf: e9 ca f7 ff ff jmp c010289e <__alltraps> -c010319e : +c01030d4 : .globl vector205 vector205: pushl $0 -c010319e: 6a 00 push $0x0 +c01030d4: 6a 00 push $0x0 pushl $205 -c01031a0: 68 cd 00 00 00 push $0xcd +c01030d6: 68 cd 00 00 00 push $0xcd jmp __alltraps -c01031a5: e9 58 02 00 00 jmp c0103402 <__alltraps> +c01030db: e9 be f7 ff ff jmp c010289e <__alltraps> -c01031aa : +c01030e0 : .globl vector206 vector206: pushl $0 -c01031aa: 6a 00 push $0x0 +c01030e0: 6a 00 push $0x0 pushl $206 -c01031ac: 68 ce 00 00 00 push $0xce +c01030e2: 68 ce 00 00 00 push $0xce jmp __alltraps -c01031b1: e9 4c 02 00 00 jmp c0103402 <__alltraps> +c01030e7: e9 b2 f7 ff ff jmp c010289e <__alltraps> -c01031b6 : +c01030ec : .globl vector207 vector207: pushl $0 -c01031b6: 6a 00 push $0x0 +c01030ec: 6a 00 push $0x0 pushl $207 -c01031b8: 68 cf 00 00 00 push $0xcf +c01030ee: 68 cf 00 00 00 push $0xcf jmp __alltraps -c01031bd: e9 40 02 00 00 jmp c0103402 <__alltraps> +c01030f3: e9 a6 f7 ff ff jmp c010289e <__alltraps> -c01031c2 : +c01030f8 : .globl vector208 vector208: pushl $0 -c01031c2: 6a 00 push $0x0 +c01030f8: 6a 00 push $0x0 pushl $208 -c01031c4: 68 d0 00 00 00 push $0xd0 +c01030fa: 68 d0 00 00 00 push $0xd0 jmp __alltraps -c01031c9: e9 34 02 00 00 jmp c0103402 <__alltraps> +c01030ff: e9 9a f7 ff ff jmp c010289e <__alltraps> -c01031ce : +c0103104 : .globl vector209 vector209: pushl $0 -c01031ce: 6a 00 push $0x0 +c0103104: 6a 00 push $0x0 pushl $209 -c01031d0: 68 d1 00 00 00 push $0xd1 +c0103106: 68 d1 00 00 00 push $0xd1 jmp __alltraps -c01031d5: e9 28 02 00 00 jmp c0103402 <__alltraps> +c010310b: e9 8e f7 ff ff jmp c010289e <__alltraps> -c01031da : +c0103110 : .globl vector210 vector210: pushl $0 -c01031da: 6a 00 push $0x0 +c0103110: 6a 00 push $0x0 pushl $210 -c01031dc: 68 d2 00 00 00 push $0xd2 +c0103112: 68 d2 00 00 00 push $0xd2 jmp __alltraps -c01031e1: e9 1c 02 00 00 jmp c0103402 <__alltraps> +c0103117: e9 82 f7 ff ff jmp c010289e <__alltraps> -c01031e6 : +c010311c : .globl vector211 vector211: pushl $0 -c01031e6: 6a 00 push $0x0 +c010311c: 6a 00 push $0x0 pushl $211 -c01031e8: 68 d3 00 00 00 push $0xd3 +c010311e: 68 d3 00 00 00 push $0xd3 jmp __alltraps -c01031ed: e9 10 02 00 00 jmp c0103402 <__alltraps> +c0103123: e9 76 f7 ff ff jmp c010289e <__alltraps> -c01031f2 : +c0103128 : .globl vector212 vector212: pushl $0 -c01031f2: 6a 00 push $0x0 +c0103128: 6a 00 push $0x0 pushl $212 -c01031f4: 68 d4 00 00 00 push $0xd4 +c010312a: 68 d4 00 00 00 push $0xd4 jmp __alltraps -c01031f9: e9 04 02 00 00 jmp c0103402 <__alltraps> +c010312f: e9 6a f7 ff ff jmp c010289e <__alltraps> -c01031fe : +c0103134 : .globl vector213 vector213: pushl $0 -c01031fe: 6a 00 push $0x0 +c0103134: 6a 00 push $0x0 pushl $213 -c0103200: 68 d5 00 00 00 push $0xd5 +c0103136: 68 d5 00 00 00 push $0xd5 jmp __alltraps -c0103205: e9 f8 01 00 00 jmp c0103402 <__alltraps> +c010313b: e9 5e f7 ff ff jmp c010289e <__alltraps> -c010320a : +c0103140 : .globl vector214 vector214: pushl $0 -c010320a: 6a 00 push $0x0 +c0103140: 6a 00 push $0x0 pushl $214 -c010320c: 68 d6 00 00 00 push $0xd6 +c0103142: 68 d6 00 00 00 push $0xd6 jmp __alltraps -c0103211: e9 ec 01 00 00 jmp c0103402 <__alltraps> +c0103147: e9 52 f7 ff ff jmp c010289e <__alltraps> -c0103216 : +c010314c : .globl vector215 vector215: pushl $0 -c0103216: 6a 00 push $0x0 +c010314c: 6a 00 push $0x0 pushl $215 -c0103218: 68 d7 00 00 00 push $0xd7 +c010314e: 68 d7 00 00 00 push $0xd7 jmp __alltraps -c010321d: e9 e0 01 00 00 jmp c0103402 <__alltraps> +c0103153: e9 46 f7 ff ff jmp c010289e <__alltraps> -c0103222 : +c0103158 : .globl vector216 vector216: pushl $0 -c0103222: 6a 00 push $0x0 +c0103158: 6a 00 push $0x0 pushl $216 -c0103224: 68 d8 00 00 00 push $0xd8 +c010315a: 68 d8 00 00 00 push $0xd8 jmp __alltraps -c0103229: e9 d4 01 00 00 jmp c0103402 <__alltraps> +c010315f: e9 3a f7 ff ff jmp c010289e <__alltraps> -c010322e : +c0103164 : .globl vector217 vector217: pushl $0 -c010322e: 6a 00 push $0x0 +c0103164: 6a 00 push $0x0 pushl $217 -c0103230: 68 d9 00 00 00 push $0xd9 +c0103166: 68 d9 00 00 00 push $0xd9 jmp __alltraps -c0103235: e9 c8 01 00 00 jmp c0103402 <__alltraps> +c010316b: e9 2e f7 ff ff jmp c010289e <__alltraps> -c010323a : +c0103170 : .globl vector218 vector218: pushl $0 -c010323a: 6a 00 push $0x0 +c0103170: 6a 00 push $0x0 pushl $218 -c010323c: 68 da 00 00 00 push $0xda +c0103172: 68 da 00 00 00 push $0xda jmp __alltraps -c0103241: e9 bc 01 00 00 jmp c0103402 <__alltraps> +c0103177: e9 22 f7 ff ff jmp c010289e <__alltraps> -c0103246 : +c010317c : .globl vector219 vector219: pushl $0 -c0103246: 6a 00 push $0x0 +c010317c: 6a 00 push $0x0 pushl $219 -c0103248: 68 db 00 00 00 push $0xdb +c010317e: 68 db 00 00 00 push $0xdb jmp __alltraps -c010324d: e9 b0 01 00 00 jmp c0103402 <__alltraps> +c0103183: e9 16 f7 ff ff jmp c010289e <__alltraps> -c0103252 : +c0103188 : .globl vector220 vector220: pushl $0 -c0103252: 6a 00 push $0x0 +c0103188: 6a 00 push $0x0 pushl $220 -c0103254: 68 dc 00 00 00 push $0xdc +c010318a: 68 dc 00 00 00 push $0xdc jmp __alltraps -c0103259: e9 a4 01 00 00 jmp c0103402 <__alltraps> +c010318f: e9 0a f7 ff ff jmp c010289e <__alltraps> -c010325e : +c0103194 : .globl vector221 vector221: pushl $0 -c010325e: 6a 00 push $0x0 +c0103194: 6a 00 push $0x0 pushl $221 -c0103260: 68 dd 00 00 00 push $0xdd +c0103196: 68 dd 00 00 00 push $0xdd jmp __alltraps -c0103265: e9 98 01 00 00 jmp c0103402 <__alltraps> +c010319b: e9 fe f6 ff ff jmp c010289e <__alltraps> -c010326a : +c01031a0 : .globl vector222 vector222: pushl $0 -c010326a: 6a 00 push $0x0 +c01031a0: 6a 00 push $0x0 pushl $222 -c010326c: 68 de 00 00 00 push $0xde +c01031a2: 68 de 00 00 00 push $0xde jmp __alltraps -c0103271: e9 8c 01 00 00 jmp c0103402 <__alltraps> +c01031a7: e9 f2 f6 ff ff jmp c010289e <__alltraps> -c0103276 : +c01031ac : .globl vector223 vector223: pushl $0 -c0103276: 6a 00 push $0x0 +c01031ac: 6a 00 push $0x0 pushl $223 -c0103278: 68 df 00 00 00 push $0xdf +c01031ae: 68 df 00 00 00 push $0xdf jmp __alltraps -c010327d: e9 80 01 00 00 jmp c0103402 <__alltraps> +c01031b3: e9 e6 f6 ff ff jmp c010289e <__alltraps> -c0103282 : +c01031b8 : .globl vector224 vector224: pushl $0 -c0103282: 6a 00 push $0x0 +c01031b8: 6a 00 push $0x0 pushl $224 -c0103284: 68 e0 00 00 00 push $0xe0 +c01031ba: 68 e0 00 00 00 push $0xe0 jmp __alltraps -c0103289: e9 74 01 00 00 jmp c0103402 <__alltraps> +c01031bf: e9 da f6 ff ff jmp c010289e <__alltraps> -c010328e : +c01031c4 : .globl vector225 vector225: pushl $0 -c010328e: 6a 00 push $0x0 +c01031c4: 6a 00 push $0x0 pushl $225 -c0103290: 68 e1 00 00 00 push $0xe1 +c01031c6: 68 e1 00 00 00 push $0xe1 jmp __alltraps -c0103295: e9 68 01 00 00 jmp c0103402 <__alltraps> +c01031cb: e9 ce f6 ff ff jmp c010289e <__alltraps> -c010329a : +c01031d0 : .globl vector226 vector226: pushl $0 -c010329a: 6a 00 push $0x0 +c01031d0: 6a 00 push $0x0 pushl $226 -c010329c: 68 e2 00 00 00 push $0xe2 +c01031d2: 68 e2 00 00 00 push $0xe2 jmp __alltraps -c01032a1: e9 5c 01 00 00 jmp c0103402 <__alltraps> +c01031d7: e9 c2 f6 ff ff jmp c010289e <__alltraps> -c01032a6 : +c01031dc : .globl vector227 vector227: pushl $0 -c01032a6: 6a 00 push $0x0 +c01031dc: 6a 00 push $0x0 pushl $227 -c01032a8: 68 e3 00 00 00 push $0xe3 +c01031de: 68 e3 00 00 00 push $0xe3 jmp __alltraps -c01032ad: e9 50 01 00 00 jmp c0103402 <__alltraps> +c01031e3: e9 b6 f6 ff ff jmp c010289e <__alltraps> -c01032b2 : +c01031e8 : .globl vector228 vector228: pushl $0 -c01032b2: 6a 00 push $0x0 +c01031e8: 6a 00 push $0x0 pushl $228 -c01032b4: 68 e4 00 00 00 push $0xe4 +c01031ea: 68 e4 00 00 00 push $0xe4 jmp __alltraps -c01032b9: e9 44 01 00 00 jmp c0103402 <__alltraps> +c01031ef: e9 aa f6 ff ff jmp c010289e <__alltraps> -c01032be : +c01031f4 : .globl vector229 vector229: pushl $0 -c01032be: 6a 00 push $0x0 +c01031f4: 6a 00 push $0x0 pushl $229 -c01032c0: 68 e5 00 00 00 push $0xe5 +c01031f6: 68 e5 00 00 00 push $0xe5 jmp __alltraps -c01032c5: e9 38 01 00 00 jmp c0103402 <__alltraps> +c01031fb: e9 9e f6 ff ff jmp c010289e <__alltraps> -c01032ca : +c0103200 : .globl vector230 vector230: pushl $0 -c01032ca: 6a 00 push $0x0 +c0103200: 6a 00 push $0x0 pushl $230 -c01032cc: 68 e6 00 00 00 push $0xe6 +c0103202: 68 e6 00 00 00 push $0xe6 jmp __alltraps -c01032d1: e9 2c 01 00 00 jmp c0103402 <__alltraps> +c0103207: e9 92 f6 ff ff jmp c010289e <__alltraps> -c01032d6 : +c010320c : .globl vector231 vector231: pushl $0 -c01032d6: 6a 00 push $0x0 +c010320c: 6a 00 push $0x0 pushl $231 -c01032d8: 68 e7 00 00 00 push $0xe7 +c010320e: 68 e7 00 00 00 push $0xe7 jmp __alltraps -c01032dd: e9 20 01 00 00 jmp c0103402 <__alltraps> +c0103213: e9 86 f6 ff ff jmp c010289e <__alltraps> -c01032e2 : +c0103218 : .globl vector232 vector232: pushl $0 -c01032e2: 6a 00 push $0x0 +c0103218: 6a 00 push $0x0 pushl $232 -c01032e4: 68 e8 00 00 00 push $0xe8 +c010321a: 68 e8 00 00 00 push $0xe8 jmp __alltraps -c01032e9: e9 14 01 00 00 jmp c0103402 <__alltraps> +c010321f: e9 7a f6 ff ff jmp c010289e <__alltraps> -c01032ee : +c0103224 : .globl vector233 vector233: pushl $0 -c01032ee: 6a 00 push $0x0 +c0103224: 6a 00 push $0x0 pushl $233 -c01032f0: 68 e9 00 00 00 push $0xe9 +c0103226: 68 e9 00 00 00 push $0xe9 jmp __alltraps -c01032f5: e9 08 01 00 00 jmp c0103402 <__alltraps> +c010322b: e9 6e f6 ff ff jmp c010289e <__alltraps> -c01032fa : +c0103230 : .globl vector234 vector234: pushl $0 -c01032fa: 6a 00 push $0x0 +c0103230: 6a 00 push $0x0 pushl $234 -c01032fc: 68 ea 00 00 00 push $0xea +c0103232: 68 ea 00 00 00 push $0xea jmp __alltraps -c0103301: e9 fc 00 00 00 jmp c0103402 <__alltraps> +c0103237: e9 62 f6 ff ff jmp c010289e <__alltraps> -c0103306 : +c010323c : .globl vector235 vector235: pushl $0 -c0103306: 6a 00 push $0x0 +c010323c: 6a 00 push $0x0 pushl $235 -c0103308: 68 eb 00 00 00 push $0xeb +c010323e: 68 eb 00 00 00 push $0xeb jmp __alltraps -c010330d: e9 f0 00 00 00 jmp c0103402 <__alltraps> +c0103243: e9 56 f6 ff ff jmp c010289e <__alltraps> -c0103312 : +c0103248 : .globl vector236 vector236: pushl $0 -c0103312: 6a 00 push $0x0 +c0103248: 6a 00 push $0x0 pushl $236 -c0103314: 68 ec 00 00 00 push $0xec +c010324a: 68 ec 00 00 00 push $0xec jmp __alltraps -c0103319: e9 e4 00 00 00 jmp c0103402 <__alltraps> +c010324f: e9 4a f6 ff ff jmp c010289e <__alltraps> -c010331e : +c0103254 : .globl vector237 vector237: pushl $0 -c010331e: 6a 00 push $0x0 +c0103254: 6a 00 push $0x0 pushl $237 -c0103320: 68 ed 00 00 00 push $0xed +c0103256: 68 ed 00 00 00 push $0xed jmp __alltraps -c0103325: e9 d8 00 00 00 jmp c0103402 <__alltraps> +c010325b: e9 3e f6 ff ff jmp c010289e <__alltraps> -c010332a : +c0103260 : .globl vector238 vector238: pushl $0 -c010332a: 6a 00 push $0x0 +c0103260: 6a 00 push $0x0 pushl $238 -c010332c: 68 ee 00 00 00 push $0xee +c0103262: 68 ee 00 00 00 push $0xee jmp __alltraps -c0103331: e9 cc 00 00 00 jmp c0103402 <__alltraps> +c0103267: e9 32 f6 ff ff jmp c010289e <__alltraps> -c0103336 : +c010326c : .globl vector239 vector239: pushl $0 -c0103336: 6a 00 push $0x0 +c010326c: 6a 00 push $0x0 pushl $239 -c0103338: 68 ef 00 00 00 push $0xef +c010326e: 68 ef 00 00 00 push $0xef jmp __alltraps -c010333d: e9 c0 00 00 00 jmp c0103402 <__alltraps> +c0103273: e9 26 f6 ff ff jmp c010289e <__alltraps> -c0103342 : +c0103278 : .globl vector240 vector240: pushl $0 -c0103342: 6a 00 push $0x0 +c0103278: 6a 00 push $0x0 pushl $240 -c0103344: 68 f0 00 00 00 push $0xf0 +c010327a: 68 f0 00 00 00 push $0xf0 jmp __alltraps -c0103349: e9 b4 00 00 00 jmp c0103402 <__alltraps> +c010327f: e9 1a f6 ff ff jmp c010289e <__alltraps> -c010334e : +c0103284 : .globl vector241 vector241: pushl $0 -c010334e: 6a 00 push $0x0 +c0103284: 6a 00 push $0x0 pushl $241 -c0103350: 68 f1 00 00 00 push $0xf1 +c0103286: 68 f1 00 00 00 push $0xf1 jmp __alltraps -c0103355: e9 a8 00 00 00 jmp c0103402 <__alltraps> +c010328b: e9 0e f6 ff ff jmp c010289e <__alltraps> -c010335a : +c0103290 : .globl vector242 vector242: pushl $0 -c010335a: 6a 00 push $0x0 +c0103290: 6a 00 push $0x0 pushl $242 -c010335c: 68 f2 00 00 00 push $0xf2 +c0103292: 68 f2 00 00 00 push $0xf2 jmp __alltraps -c0103361: e9 9c 00 00 00 jmp c0103402 <__alltraps> +c0103297: e9 02 f6 ff ff jmp c010289e <__alltraps> -c0103366 : +c010329c : .globl vector243 vector243: pushl $0 -c0103366: 6a 00 push $0x0 +c010329c: 6a 00 push $0x0 pushl $243 -c0103368: 68 f3 00 00 00 push $0xf3 +c010329e: 68 f3 00 00 00 push $0xf3 jmp __alltraps -c010336d: e9 90 00 00 00 jmp c0103402 <__alltraps> +c01032a3: e9 f6 f5 ff ff jmp c010289e <__alltraps> -c0103372 : +c01032a8 : .globl vector244 vector244: pushl $0 -c0103372: 6a 00 push $0x0 +c01032a8: 6a 00 push $0x0 pushl $244 -c0103374: 68 f4 00 00 00 push $0xf4 +c01032aa: 68 f4 00 00 00 push $0xf4 jmp __alltraps -c0103379: e9 84 00 00 00 jmp c0103402 <__alltraps> +c01032af: e9 ea f5 ff ff jmp c010289e <__alltraps> -c010337e : +c01032b4 : .globl vector245 vector245: pushl $0 -c010337e: 6a 00 push $0x0 +c01032b4: 6a 00 push $0x0 pushl $245 -c0103380: 68 f5 00 00 00 push $0xf5 +c01032b6: 68 f5 00 00 00 push $0xf5 jmp __alltraps -c0103385: e9 78 00 00 00 jmp c0103402 <__alltraps> +c01032bb: e9 de f5 ff ff jmp c010289e <__alltraps> -c010338a : +c01032c0 : .globl vector246 vector246: pushl $0 -c010338a: 6a 00 push $0x0 +c01032c0: 6a 00 push $0x0 pushl $246 -c010338c: 68 f6 00 00 00 push $0xf6 +c01032c2: 68 f6 00 00 00 push $0xf6 jmp __alltraps -c0103391: e9 6c 00 00 00 jmp c0103402 <__alltraps> +c01032c7: e9 d2 f5 ff ff jmp c010289e <__alltraps> -c0103396 : +c01032cc : .globl vector247 vector247: pushl $0 -c0103396: 6a 00 push $0x0 +c01032cc: 6a 00 push $0x0 pushl $247 -c0103398: 68 f7 00 00 00 push $0xf7 +c01032ce: 68 f7 00 00 00 push $0xf7 jmp __alltraps -c010339d: e9 60 00 00 00 jmp c0103402 <__alltraps> +c01032d3: e9 c6 f5 ff ff jmp c010289e <__alltraps> -c01033a2 : +c01032d8 : .globl vector248 vector248: pushl $0 -c01033a2: 6a 00 push $0x0 +c01032d8: 6a 00 push $0x0 pushl $248 -c01033a4: 68 f8 00 00 00 push $0xf8 +c01032da: 68 f8 00 00 00 push $0xf8 jmp __alltraps -c01033a9: e9 54 00 00 00 jmp c0103402 <__alltraps> +c01032df: e9 ba f5 ff ff jmp c010289e <__alltraps> -c01033ae : +c01032e4 : .globl vector249 vector249: pushl $0 -c01033ae: 6a 00 push $0x0 +c01032e4: 6a 00 push $0x0 pushl $249 -c01033b0: 68 f9 00 00 00 push $0xf9 +c01032e6: 68 f9 00 00 00 push $0xf9 jmp __alltraps -c01033b5: e9 48 00 00 00 jmp c0103402 <__alltraps> +c01032eb: e9 ae f5 ff ff jmp c010289e <__alltraps> -c01033ba : +c01032f0 : .globl vector250 vector250: pushl $0 -c01033ba: 6a 00 push $0x0 +c01032f0: 6a 00 push $0x0 pushl $250 -c01033bc: 68 fa 00 00 00 push $0xfa +c01032f2: 68 fa 00 00 00 push $0xfa jmp __alltraps -c01033c1: e9 3c 00 00 00 jmp c0103402 <__alltraps> +c01032f7: e9 a2 f5 ff ff jmp c010289e <__alltraps> -c01033c6 : +c01032fc : .globl vector251 vector251: pushl $0 -c01033c6: 6a 00 push $0x0 +c01032fc: 6a 00 push $0x0 pushl $251 -c01033c8: 68 fb 00 00 00 push $0xfb +c01032fe: 68 fb 00 00 00 push $0xfb jmp __alltraps -c01033cd: e9 30 00 00 00 jmp c0103402 <__alltraps> +c0103303: e9 96 f5 ff ff jmp c010289e <__alltraps> -c01033d2 : +c0103308 : .globl vector252 vector252: pushl $0 -c01033d2: 6a 00 push $0x0 +c0103308: 6a 00 push $0x0 pushl $252 -c01033d4: 68 fc 00 00 00 push $0xfc +c010330a: 68 fc 00 00 00 push $0xfc jmp __alltraps -c01033d9: e9 24 00 00 00 jmp c0103402 <__alltraps> +c010330f: e9 8a f5 ff ff jmp c010289e <__alltraps> -c01033de : +c0103314 : .globl vector253 vector253: pushl $0 -c01033de: 6a 00 push $0x0 +c0103314: 6a 00 push $0x0 pushl $253 -c01033e0: 68 fd 00 00 00 push $0xfd +c0103316: 68 fd 00 00 00 push $0xfd jmp __alltraps -c01033e5: e9 18 00 00 00 jmp c0103402 <__alltraps> +c010331b: e9 7e f5 ff ff jmp c010289e <__alltraps> -c01033ea : +c0103320 : .globl vector254 vector254: pushl $0 -c01033ea: 6a 00 push $0x0 +c0103320: 6a 00 push $0x0 pushl $254 -c01033ec: 68 fe 00 00 00 push $0xfe +c0103322: 68 fe 00 00 00 push $0xfe jmp __alltraps -c01033f1: e9 0c 00 00 00 jmp c0103402 <__alltraps> +c0103327: e9 72 f5 ff ff jmp c010289e <__alltraps> -c01033f6 : +c010332c : .globl vector255 vector255: pushl $0 -c01033f6: 6a 00 push $0x0 +c010332c: 6a 00 push $0x0 pushl $255 -c01033f8: 68 ff 00 00 00 push $0xff +c010332e: 68 ff 00 00 00 push $0xff jmp __alltraps -c01033fd: e9 00 00 00 00 jmp c0103402 <__alltraps> - -c0103402 <__alltraps>: -.globl __alltraps -__alltraps: - # push registers to build a trap frame - # therefore make the stack look like a struct trapframe - # 通过 push 指令,将数据段寄存器和所有通用寄存器(使用 pushal)的值压入栈中,以保存当前状态。 - pushl %ds -c0103402: 1e push %ds - pushl %es -c0103403: 06 push %es - pushl %fs -c0103404: 0f a0 push %fs - pushl %gs -c0103406: 0f a8 push %gs - pushal -c0103408: 60 pusha - - # load GD_KDATA into %ds and %es to set up data segments for kernel - # 将常量 GD_KDATA 加载到 %eax 中,然后将其值复制到 %ds 和 %es 中,设置内核的数据段。 - movl $GD_KDATA, %eax -c0103409: b8 10 00 00 00 mov $0x10,%eax - movw %ax, %ds -c010340e: 8e d8 mov %eax,%ds - movw %ax, %es -c0103410: 8e c0 mov %eax,%es - - # push %esp to pass a pointer to the trapframe as an argument to trap() - # 将 %esp 压栈,以将指向 trapframe 的指针作为参数传递给 trap() - pushl %esp -c0103412: 54 push %esp - - # call trap(tf), where tf=%esp - # 调用 trap(tf),其中 tf=%esp - call trap -c0103413: e8 60 f5 ff ff call c0102978 - - # pop the pushed stack pointer弹出之前压入的栈指针 - popl %esp -c0103418: 5c pop %esp - -c0103419 <__trapret>: - # 返回后继续执行到 trapret... -.globl __trapret -__trapret: - # restore registers from stack - # 定义了返回的入口点 __trapret。 - popal -c0103419: 61 popa - - # restore %ds, %es, %fs and %gs - # 这里会恢复之前保存的寄存器 - popl %gs -c010341a: 0f a9 pop %gs - popl %fs -c010341c: 0f a1 pop %fs - popl %es -c010341e: 07 pop %es - popl %ds -c010341f: 1f pop %ds - - # get rid of the trap number and error code - # 通过 iret 指令返回中断处理 - addl $0x8, %esp -c0103420: 83 c4 08 add $0x8,%esp - iret -c0103423: cf iret - -c0103424 : - -.globl forkrets -forkrets: - # set stack to this new process's trapframe - movl 4(%esp), %esp -c0103424: 8b 64 24 04 mov 0x4(%esp),%esp - jmp __trapret -c0103428: eb ef jmp c0103419 <__trapret> +c0103333: e9 66 f5 ff ff jmp c010289e <__alltraps> -c010342a : +c0103338 : extern struct Page *pages; extern size_t npage; static inline ppn_t page2ppn(struct Page *page) { -c010342a: 55 push %ebp -c010342b: 89 e5 mov %esp,%ebp +c0103338: 55 push %ebp +c0103339: 89 e5 mov %esp,%ebp return page - pages; -c010342d: a1 b8 e0 12 c0 mov 0xc012e0b8,%eax -c0103432: 8b 55 08 mov 0x8(%ebp),%edx -c0103435: 29 c2 sub %eax,%edx -c0103437: 89 d0 mov %edx,%eax -c0103439: c1 f8 05 sar $0x5,%eax +c010333b: 8b 15 00 c0 12 c0 mov 0xc012c000,%edx +c0103341: 8b 45 08 mov 0x8(%ebp),%eax +c0103344: 29 d0 sub %edx,%eax +c0103346: c1 f8 05 sar $0x5,%eax } -c010343c: 5d pop %ebp -c010343d: c3 ret +c0103349: 5d pop %ebp +c010334a: c3 ret -c010343e : +c010334b : static inline uintptr_t page2pa(struct Page *page) { -c010343e: 55 push %ebp -c010343f: 89 e5 mov %esp,%ebp -c0103441: 83 ec 04 sub $0x4,%esp +c010334b: 55 push %ebp +c010334c: 89 e5 mov %esp,%ebp +c010334e: 83 ec 04 sub $0x4,%esp return page2ppn(page) << PGSHIFT; -c0103444: 8b 45 08 mov 0x8(%ebp),%eax -c0103447: 89 04 24 mov %eax,(%esp) -c010344a: e8 db ff ff ff call c010342a -c010344f: c1 e0 0c shl $0xc,%eax -} -c0103452: c9 leave -c0103453: c3 ret - -c0103454 : - -static inline struct Page * -pa2page(uintptr_t pa) { -c0103454: 55 push %ebp -c0103455: 89 e5 mov %esp,%ebp -c0103457: 83 ec 18 sub $0x18,%esp - if (PPN(pa) >= npage) { -c010345a: 8b 45 08 mov 0x8(%ebp),%eax -c010345d: c1 e8 0c shr $0xc,%eax -c0103460: 89 c2 mov %eax,%edx -c0103462: a1 80 bf 12 c0 mov 0xc012bf80,%eax -c0103467: 39 c2 cmp %eax,%edx -c0103469: 72 1c jb c0103487 - panic("pa2page called with invalid pa"); -c010346b: c7 44 24 08 90 ab 10 movl $0xc010ab90,0x8(%esp) -c0103472: c0 -c0103473: c7 44 24 04 5f 00 00 movl $0x5f,0x4(%esp) -c010347a: 00 -c010347b: c7 04 24 af ab 10 c0 movl $0xc010abaf,(%esp) -c0103482: e8 bc cf ff ff call c0100443 <__panic> - } - return &pages[PPN(pa)]; -c0103487: a1 b8 e0 12 c0 mov 0xc012e0b8,%eax -c010348c: 8b 55 08 mov 0x8(%ebp),%edx -c010348f: c1 ea 0c shr $0xc,%edx -c0103492: c1 e2 05 shl $0x5,%edx -c0103495: 01 d0 add %edx,%eax +c0103351: 8b 45 08 mov 0x8(%ebp),%eax +c0103354: 89 04 24 mov %eax,(%esp) +c0103357: e8 dc ff ff ff call c0103338 +c010335c: c1 e0 0c shl $0xc,%eax } -c0103497: c9 leave -c0103498: c3 ret +c010335f: 89 ec mov %ebp,%esp +c0103361: 5d pop %ebp +c0103362: c3 ret -c0103499 : - -static inline void * -page2kva(struct Page *page) { -c0103499: 55 push %ebp -c010349a: 89 e5 mov %esp,%ebp -c010349c: 83 ec 28 sub $0x28,%esp - return KADDR(page2pa(page)); -c010349f: 8b 45 08 mov 0x8(%ebp),%eax -c01034a2: 89 04 24 mov %eax,(%esp) -c01034a5: e8 94 ff ff ff call c010343e -c01034aa: 89 45 f4 mov %eax,-0xc(%ebp) -c01034ad: 8b 45 f4 mov -0xc(%ebp),%eax -c01034b0: c1 e8 0c shr $0xc,%eax -c01034b3: 89 45 f0 mov %eax,-0x10(%ebp) -c01034b6: a1 80 bf 12 c0 mov 0xc012bf80,%eax -c01034bb: 39 45 f0 cmp %eax,-0x10(%ebp) -c01034be: 72 23 jb c01034e3 -c01034c0: 8b 45 f4 mov -0xc(%ebp),%eax -c01034c3: 89 44 24 0c mov %eax,0xc(%esp) -c01034c7: c7 44 24 08 c0 ab 10 movl $0xc010abc0,0x8(%esp) -c01034ce: c0 -c01034cf: c7 44 24 04 66 00 00 movl $0x66,0x4(%esp) -c01034d6: 00 -c01034d7: c7 04 24 af ab 10 c0 movl $0xc010abaf,(%esp) -c01034de: e8 60 cf ff ff call c0100443 <__panic> -c01034e3: 8b 45 f4 mov -0xc(%ebp),%eax -c01034e6: 2d 00 00 00 40 sub $0x40000000,%eax -} -c01034eb: c9 leave -c01034ec: c3 ret - -c01034ed : -kva2page(void *kva) { - return pa2page(PADDR(kva)); -} - -static inline struct Page * -pte2page(pte_t pte) { -c01034ed: 55 push %ebp -c01034ee: 89 e5 mov %esp,%ebp -c01034f0: 83 ec 18 sub $0x18,%esp - if (!(pte & PTE_P)) { -c01034f3: 8b 45 08 mov 0x8(%ebp),%eax -c01034f6: 83 e0 01 and $0x1,%eax -c01034f9: 85 c0 test %eax,%eax -c01034fb: 75 1c jne c0103519 - panic("pte2page called with invalid pte"); -c01034fd: c7 44 24 08 e4 ab 10 movl $0xc010abe4,0x8(%esp) -c0103504: c0 -c0103505: c7 44 24 04 71 00 00 movl $0x71,0x4(%esp) -c010350c: 00 -c010350d: c7 04 24 af ab 10 c0 movl $0xc010abaf,(%esp) -c0103514: e8 2a cf ff ff call c0100443 <__panic> - } - return pa2page(PTE_ADDR(pte)); -c0103519: 8b 45 08 mov 0x8(%ebp),%eax -c010351c: 25 00 f0 ff ff and $0xfffff000,%eax -c0103521: 89 04 24 mov %eax,(%esp) -c0103524: e8 2b ff ff ff call c0103454 -} -c0103529: c9 leave -c010352a: c3 ret - -c010352b : - -static inline struct Page * +c0103363 : pde2page(pde_t pde) { -c010352b: 55 push %ebp -c010352c: 89 e5 mov %esp,%ebp -c010352e: 83 ec 18 sub $0x18,%esp return pa2page(PDE_ADDR(pde)); -c0103531: 8b 45 08 mov 0x8(%ebp),%eax -c0103534: 25 00 f0 ff ff and $0xfffff000,%eax -c0103539: 89 04 24 mov %eax,(%esp) -c010353c: e8 13 ff ff ff call c0103454 } -c0103541: c9 leave -c0103542: c3 ret - -c0103543 : static inline int page_ref(struct Page *page) { -c0103543: 55 push %ebp -c0103544: 89 e5 mov %esp,%ebp +c0103363: 55 push %ebp +c0103364: 89 e5 mov %esp,%ebp return page->ref; -c0103546: 8b 45 08 mov 0x8(%ebp),%eax -c0103549: 8b 00 mov (%eax),%eax +c0103366: 8b 45 08 mov 0x8(%ebp),%eax +c0103369: 8b 00 mov (%eax),%eax } -c010354b: 5d pop %ebp -c010354c: c3 ret +c010336b: 5d pop %ebp +c010336c: c3 ret -c010354d : +c010336d : static inline void set_page_ref(struct Page *page, int val) { -c010354d: 55 push %ebp -c010354e: 89 e5 mov %esp,%ebp +c010336d: 55 push %ebp +c010336e: 89 e5 mov %esp,%ebp page->ref = val; -c0103550: 8b 45 08 mov 0x8(%ebp),%eax -c0103553: 8b 55 0c mov 0xc(%ebp),%edx -c0103556: 89 10 mov %edx,(%eax) -} -c0103558: 90 nop -c0103559: 5d pop %ebp -c010355a: c3 ret - -c010355b : - -static inline int -page_ref_inc(struct Page *page) { -c010355b: 55 push %ebp -c010355c: 89 e5 mov %esp,%ebp - page->ref += 1; -c010355e: 8b 45 08 mov 0x8(%ebp),%eax -c0103561: 8b 00 mov (%eax),%eax -c0103563: 8d 50 01 lea 0x1(%eax),%edx -c0103566: 8b 45 08 mov 0x8(%ebp),%eax -c0103569: 89 10 mov %edx,(%eax) - return page->ref; -c010356b: 8b 45 08 mov 0x8(%ebp),%eax -c010356e: 8b 00 mov (%eax),%eax +c0103370: 8b 45 08 mov 0x8(%ebp),%eax +c0103373: 8b 55 0c mov 0xc(%ebp),%edx +c0103376: 89 10 mov %edx,(%eax) } -c0103570: 5d pop %ebp -c0103571: c3 ret +c0103378: 90 nop +c0103379: 5d pop %ebp +c010337a: c3 ret -c0103572 : +c010337b : +#define nr_free (free_area.nr_free) -static inline int -page_ref_dec(struct Page *page) { -c0103572: 55 push %ebp -c0103573: 89 e5 mov %esp,%ebp - page->ref -= 1; -c0103575: 8b 45 08 mov 0x8(%ebp),%eax -c0103578: 8b 00 mov (%eax),%eax -c010357a: 8d 50 ff lea -0x1(%eax),%edx -c010357d: 8b 45 08 mov 0x8(%ebp),%eax -c0103580: 89 10 mov %edx,(%eax) - return page->ref; -c0103582: 8b 45 08 mov 0x8(%ebp),%eax -c0103585: 8b 00 mov (%eax),%eax +//free_list` 用于记录空闲内存块,nr_free` 是空闲内存块的总数。 +//用default_init函数来初始化 `free_list`,并将 `nr_free` 设置为 0。 +static void +default_init(void) { +c010337b: 55 push %ebp +c010337c: 89 e5 mov %esp,%ebp +c010337e: 83 ec 10 sub $0x10,%esp +c0103381: c7 45 fc e4 bf 12 c0 movl $0xc012bfe4,-0x4(%ebp) + * list_init - initialize a new entry + * @elm: new entry to be initialized + * */ +static inline void +list_init(list_entry_t *elm) { + elm->prev = elm->next = elm; +c0103388: 8b 45 fc mov -0x4(%ebp),%eax +c010338b: 8b 55 fc mov -0x4(%ebp),%edx +c010338e: 89 50 04 mov %edx,0x4(%eax) +c0103391: 8b 45 fc mov -0x4(%ebp),%eax +c0103394: 8b 50 04 mov 0x4(%eax),%edx +c0103397: 8b 45 fc mov -0x4(%ebp),%eax +c010339a: 89 10 mov %edx,(%eax) +} +c010339c: 90 nop + list_init(&free_list); + nr_free = 0; +c010339d: c7 05 ec bf 12 c0 00 movl $0x0,0xc012bfec +c01033a4: 00 00 00 } -c0103587: 5d pop %ebp -c0103588: c3 ret +c01033a7: 90 nop +c01033a8: 89 ec mov %ebp,%esp +c01033aa: 5d pop %ebp +c01033ab: c3 ret -c0103589 <__intr_save>: -__intr_save(void) { -c0103589: 55 push %ebp -c010358a: 89 e5 mov %esp,%ebp -c010358c: 83 ec 18 sub $0x18,%esp - asm volatile ("pushfl; popl %0" : "=r" (eflags)); -c010358f: 9c pushf -c0103590: 58 pop %eax -c0103591: 89 45 f4 mov %eax,-0xc(%ebp) - return eflags; -c0103594: 8b 45 f4 mov -0xc(%ebp),%eax - if (read_eflags() & FL_IF) { -c0103597: 25 00 02 00 00 and $0x200,%eax -c010359c: 85 c0 test %eax,%eax -c010359e: 74 0c je c01035ac <__intr_save+0x23> - intr_disable(); -c01035a0: e8 af eb ff ff call c0102154 - return 1; -c01035a5: b8 01 00 00 00 mov $0x1,%eax -c01035aa: eb 05 jmp c01035b1 <__intr_save+0x28> - return 0; -c01035ac: b8 00 00 00 00 mov $0x0,%eax -} -c01035b1: c9 leave -c01035b2: c3 ret +c01033ac : -c01035b3 <__intr_restore>: -__intr_restore(bool flag) { -c01035b3: 55 push %ebp -c01035b4: 89 e5 mov %esp,%ebp -c01035b6: 83 ec 08 sub $0x8,%esp - if (flag) { -c01035b9: 83 7d 08 00 cmpl $0x0,0x8(%ebp) -c01035bd: 74 05 je c01035c4 <__intr_restore+0x11> - intr_enable(); -c01035bf: e8 84 eb ff ff call c0102148 +//用于初始化一段连续的物理页,并将它们加入到空闲内存管理系统中. +//struct Page *base:指向要初始化的页块的起始地址。size_t n:要初始化的页的数量。 +static void +default_init_memmap(struct Page *base, size_t n) { +c01033ac: 55 push %ebp +c01033ad: 89 e5 mov %esp,%ebp +c01033af: 83 ec 48 sub $0x48,%esp + assert(n > 0);// 确保请求的页数大于零 +c01033b2: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) +c01033b6: 75 24 jne c01033dc +c01033b8: c7 44 24 0c 70 a9 10 movl $0xc010a970,0xc(%esp) +c01033bf: c0 +c01033c0: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c01033c7: c0 +c01033c8: c7 44 24 04 9a 00 00 movl $0x9a,0x4(%esp) +c01033cf: 00 +c01033d0: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c01033d7: e8 69 d8 ff ff call c0100c45 <__panic> + struct Page *p = base;// 指向当前初始化的页 +c01033dc: 8b 45 08 mov 0x8(%ebp),%eax +c01033df: 89 45 f4 mov %eax,-0xc(%ebp) + // 遍历每一页,设置其状态 + for (; p != base + n; p ++) { +c01033e2: eb 7d jmp c0103461 + assert(PageReserved(p));//检查每个页是否被标记为“保留”。若没有被保留,函数将抛出错误。 +c01033e4: 8b 45 f4 mov -0xc(%ebp),%eax +c01033e7: 83 c0 04 add $0x4,%eax +c01033ea: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%ebp) +c01033f1: 89 45 ec mov %eax,-0x14(%ebp) + * @addr: the address to count from + * */ +static inline bool +test_bit(int nr, volatile void *addr) { + int oldbit; + asm volatile ("btl %2, %1; sbbl %0,%0" : "=r" (oldbit) : "m" (*(volatile long *)addr), "Ir" (nr)); +c01033f4: 8b 45 ec mov -0x14(%ebp),%eax +c01033f7: 8b 55 f0 mov -0x10(%ebp),%edx +c01033fa: 0f a3 10 bt %edx,(%eax) +c01033fd: 19 c0 sbb %eax,%eax +c01033ff: 89 45 e8 mov %eax,-0x18(%ebp) + return oldbit != 0; +c0103402: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) +c0103406: 0f 95 c0 setne %al +c0103409: 0f b6 c0 movzbl %al,%eax +c010340c: 85 c0 test %eax,%eax +c010340e: 75 24 jne c0103434 +c0103410: c7 44 24 0c a1 a9 10 movl $0xc010a9a1,0xc(%esp) +c0103417: c0 +c0103418: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c010341f: c0 +c0103420: c7 44 24 04 9e 00 00 movl $0x9e,0x4(%esp) +c0103427: 00 +c0103428: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c010342f: e8 11 d8 ff ff call c0100c45 <__panic> + p->flags = p->property = 0;//将页的 flags 和 property 字段设置为 0,表示该页未分配、未使用。 +c0103434: 8b 45 f4 mov -0xc(%ebp),%eax +c0103437: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax) +c010343e: 8b 45 f4 mov -0xc(%ebp),%eax +c0103441: 8b 50 08 mov 0x8(%eax),%edx +c0103444: 8b 45 f4 mov -0xc(%ebp),%eax +c0103447: 89 50 04 mov %edx,0x4(%eax) + set_page_ref(p, 0);//将页的引用计数设置为 0,表明没有任何引用指向此页。 +c010344a: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c0103451: 00 +c0103452: 8b 45 f4 mov -0xc(%ebp),%eax +c0103455: 89 04 24 mov %eax,(%esp) +c0103458: e8 10 ff ff ff call c010336d + for (; p != base + n; p ++) { +c010345d: 83 45 f4 20 addl $0x20,-0xc(%ebp) +c0103461: 8b 45 0c mov 0xc(%ebp),%eax +c0103464: c1 e0 05 shl $0x5,%eax +c0103467: 89 c2 mov %eax,%edx +c0103469: 8b 45 08 mov 0x8(%ebp),%eax +c010346c: 01 d0 add %edx,%eax +c010346e: 39 45 f4 cmp %eax,-0xc(%ebp) +c0103471: 0f 85 6d ff ff ff jne c01033e4 + } + // 设置第一个页的 property 为块的总数 + base->property = n; +c0103477: 8b 45 08 mov 0x8(%ebp),%eax +c010347a: 8b 55 0c mov 0xc(%ebp),%edx +c010347d: 89 50 08 mov %edx,0x8(%eax) + SetPageProperty(base);// 设置当前页的有效标志 +c0103480: 8b 45 08 mov 0x8(%ebp),%eax +c0103483: 83 c0 04 add $0x4,%eax +c0103486: c7 45 d0 01 00 00 00 movl $0x1,-0x30(%ebp) +c010348d: 89 45 cc mov %eax,-0x34(%ebp) + asm volatile ("btsl %1, %0" :"=m" (*(volatile long *)addr) : "Ir" (nr)); +c0103490: 8b 45 cc mov -0x34(%ebp),%eax +c0103493: 8b 55 d0 mov -0x30(%ebp),%edx +c0103496: 0f ab 10 bts %edx,(%eax) } -c01035c4: 90 nop -c01035c5: c9 leave -c01035c6: c3 ret - -c01035c7 : - * data/code segement registers for kernel. - * lgdt - 加载全局描述符表寄存器并重置内核的数据/代码段寄存器。 +c0103499: 90 nop + nr_free += n;// 更新空闲页计数 +c010349a: 8b 15 ec bf 12 c0 mov 0xc012bfec,%edx +c01034a0: 8b 45 0c mov 0xc(%ebp),%eax +c01034a3: 01 d0 add %edx,%eax +c01034a5: a3 ec bf 12 c0 mov %eax,0xc012bfec + list_add_before(&free_list, &(base->page_link));// 将该块添加到空闲列表中 +c01034aa: 8b 45 08 mov 0x8(%ebp),%eax +c01034ad: 83 c0 0c add $0xc,%eax +c01034b0: c7 45 e4 e4 bf 12 c0 movl $0xc012bfe4,-0x1c(%ebp) +c01034b7: 89 45 e0 mov %eax,-0x20(%ebp) + * Insert the new element @elm *before* the element @listelm which + * is already in the list. * */ -//定义了一个静态内联函数 lgdt,接收一个指向伪描述符(struct pseudodesc)的指针 pd static inline void -lgdt(struct pseudodesc *pd) { -c01035c7: 55 push %ebp -c01035c8: 89 e5 mov %esp,%ebp - //这行汇编代码使用 lgdt 指令加载 GDT。%0 被替换为指向 pd 的指针,告诉处理器 GDT 的地址。 - asm volatile ("lgdt (%0)" :: "r" (pd)); -c01035ca: 8b 45 08 mov 0x8(%ebp),%eax -c01035cd: 0f 01 10 lgdtl (%eax) - asm volatile ("movw %%ax, %%gs" :: "a" (USER_DS));//将 USER_DS(用户数据段)的值移动到 gs 段寄存器。 -c01035d0: b8 23 00 00 00 mov $0x23,%eax -c01035d5: 8e e8 mov %eax,%gs - asm volatile ("movw %%ax, %%fs" :: "a" (USER_DS));//将 USER_DS 的值移动到 fs 段寄存器。 -c01035d7: b8 23 00 00 00 mov $0x23,%eax -c01035dc: 8e e0 mov %eax,%fs - asm volatile ("movw %%ax, %%es" :: "a" (KERNEL_DS));//将 KERNEL_DS(内核数据段)的值移动到 es 段寄存器。 -c01035de: b8 10 00 00 00 mov $0x10,%eax -c01035e3: 8e c0 mov %eax,%es - asm volatile ("movw %%ax, %%ds" :: "a" (KERNEL_DS));//将 KERNEL_DS 的值移动到 ds 段寄存器 -c01035e5: b8 10 00 00 00 mov $0x10,%eax -c01035ea: 8e d8 mov %eax,%ds - asm volatile ("movw %%ax, %%ss" :: "a" (KERNEL_DS));//将 KERNEL_DS 的值移动到 ss 段寄存器 -c01035ec: b8 10 00 00 00 mov $0x10,%eax -c01035f1: 8e d0 mov %eax,%ss - // reload cs - //通过 ljmp 指令重新加载代码段寄存器 cs,并跳转到标签 1。 - asm volatile ("ljmp %0, $1f\n 1:\n" :: "i" (KERNEL_CS)); -c01035f3: ea fa 35 10 c0 08 00 ljmp $0x8,$0xc01035fa -} -c01035fa: 90 nop -c01035fb: 5d pop %ebp -c01035fc: c3 ret - -c01035fd : - * load_esp0 - 修改默认任务状态段中的 ESP0,以便在从用户态陷入内核态时能够使用不同的内核栈。 +list_add_before(list_entry_t *listelm, list_entry_t *elm) { + __list_add(elm, listelm->prev, listelm); +c01034ba: 8b 45 e4 mov -0x1c(%ebp),%eax +c01034bd: 8b 00 mov (%eax),%eax +c01034bf: 8b 55 e0 mov -0x20(%ebp),%edx +c01034c2: 89 55 dc mov %edx,-0x24(%ebp) +c01034c5: 89 45 d8 mov %eax,-0x28(%ebp) +c01034c8: 8b 45 e4 mov -0x1c(%ebp),%eax +c01034cb: 89 45 d4 mov %eax,-0x2c(%ebp) + * This is only for internal list manipulation where we know + * the prev/next entries already! * */ -//uintptr_t esp0:这是新的堆栈指针,通常指向内核栈的顶部。 -//修改当前任务状态段(TSS)中的 ESP0 值。ESP0 是在从用户态切换到内核态时,CPU 使用的内核栈指针。 -void -load_esp0(uintptr_t esp0) { -c01035fd: f3 0f 1e fb endbr32 -c0103601: 55 push %ebp -c0103602: 89 e5 mov %esp,%ebp - ts.ts_esp0 = esp0; -c0103604: 8b 45 08 mov 0x8(%ebp),%eax -c0103607: a3 a4 bf 12 c0 mov %eax,0xc012bfa4 +static inline void +__list_add(list_entry_t *elm, list_entry_t *prev, list_entry_t *next) { + prev->next = next->prev = elm; +c01034ce: 8b 45 d4 mov -0x2c(%ebp),%eax +c01034d1: 8b 55 dc mov -0x24(%ebp),%edx +c01034d4: 89 10 mov %edx,(%eax) +c01034d6: 8b 45 d4 mov -0x2c(%ebp),%eax +c01034d9: 8b 10 mov (%eax),%edx +c01034db: 8b 45 d8 mov -0x28(%ebp),%eax +c01034de: 89 50 04 mov %edx,0x4(%eax) + elm->next = next; +c01034e1: 8b 45 dc mov -0x24(%ebp),%eax +c01034e4: 8b 55 d4 mov -0x2c(%ebp),%edx +c01034e7: 89 50 04 mov %edx,0x4(%eax) + elm->prev = prev; +c01034ea: 8b 45 dc mov -0x24(%ebp),%eax +c01034ed: 8b 55 d8 mov -0x28(%ebp),%edx +c01034f0: 89 10 mov %edx,(%eax) +} +c01034f2: 90 nop +} +c01034f3: 90 nop } -c010360c: 90 nop -c010360d: 5d pop %ebp -c010360e: c3 ret +c01034f4: 90 nop +c01034f5: 89 ec mov %ebp,%esp +c01034f7: 5d pop %ebp +c01034f8: c3 ret -c010360f : +c01034f9 : -/* gdt_init - initialize the default GDT and TSS */ -/* gdt_init - 初始化默认的 GDT 和 TSS */ -static void -gdt_init(void) { -c010360f: f3 0f 1e fb endbr32 -c0103613: 55 push %ebp -c0103614: 89 e5 mov %esp,%ebp -c0103616: 83 ec 14 sub $0x14,%esp - // 设置启动内核栈和默认的 SS0 - // set boot kernel stack and default SS0 - load_esp0((uintptr_t)bootstacktop); -c0103619: b8 00 80 12 c0 mov $0xc0128000,%eax -c010361e: 89 04 24 mov %eax,(%esp) -c0103621: e8 d7 ff ff ff call c01035fd - ts.ts_ss0 = KERNEL_DS; -c0103626: 66 c7 05 a8 bf 12 c0 movw $0x10,0xc012bfa8 -c010362d: 10 00 - // 初始化 GDT 中的 TSS 字段 - // initialize the TSS filed of the gdt - gdt[SEG_TSS] = SEGTSS(STS_T32A, (uintptr_t)&ts, sizeof(ts), DPL_KERNEL); -c010362f: 66 c7 05 28 8a 12 c0 movw $0x68,0xc0128a28 -c0103636: 68 00 -c0103638: b8 a0 bf 12 c0 mov $0xc012bfa0,%eax -c010363d: 0f b7 c0 movzwl %ax,%eax -c0103640: 66 a3 2a 8a 12 c0 mov %ax,0xc0128a2a -c0103646: b8 a0 bf 12 c0 mov $0xc012bfa0,%eax -c010364b: c1 e8 10 shr $0x10,%eax -c010364e: a2 2c 8a 12 c0 mov %al,0xc0128a2c -c0103653: 0f b6 05 2d 8a 12 c0 movzbl 0xc0128a2d,%eax -c010365a: 24 f0 and $0xf0,%al -c010365c: 0c 09 or $0x9,%al -c010365e: a2 2d 8a 12 c0 mov %al,0xc0128a2d -c0103663: 0f b6 05 2d 8a 12 c0 movzbl 0xc0128a2d,%eax -c010366a: 24 ef and $0xef,%al -c010366c: a2 2d 8a 12 c0 mov %al,0xc0128a2d -c0103671: 0f b6 05 2d 8a 12 c0 movzbl 0xc0128a2d,%eax -c0103678: 24 9f and $0x9f,%al -c010367a: a2 2d 8a 12 c0 mov %al,0xc0128a2d -c010367f: 0f b6 05 2d 8a 12 c0 movzbl 0xc0128a2d,%eax -c0103686: 0c 80 or $0x80,%al -c0103688: a2 2d 8a 12 c0 mov %al,0xc0128a2d -c010368d: 0f b6 05 2e 8a 12 c0 movzbl 0xc0128a2e,%eax -c0103694: 24 f0 and $0xf0,%al -c0103696: a2 2e 8a 12 c0 mov %al,0xc0128a2e -c010369b: 0f b6 05 2e 8a 12 c0 movzbl 0xc0128a2e,%eax -c01036a2: 24 ef and $0xef,%al -c01036a4: a2 2e 8a 12 c0 mov %al,0xc0128a2e -c01036a9: 0f b6 05 2e 8a 12 c0 movzbl 0xc0128a2e,%eax -c01036b0: 24 df and $0xdf,%al -c01036b2: a2 2e 8a 12 c0 mov %al,0xc0128a2e -c01036b7: 0f b6 05 2e 8a 12 c0 movzbl 0xc0128a2e,%eax -c01036be: 0c 40 or $0x40,%al -c01036c0: a2 2e 8a 12 c0 mov %al,0xc0128a2e -c01036c5: 0f b6 05 2e 8a 12 c0 movzbl 0xc0128a2e,%eax -c01036cc: 24 7f and $0x7f,%al -c01036ce: a2 2e 8a 12 c0 mov %al,0xc0128a2e -c01036d3: b8 a0 bf 12 c0 mov $0xc012bfa0,%eax -c01036d8: c1 e8 18 shr $0x18,%eax -c01036db: a2 2f 8a 12 c0 mov %al,0xc0128a2f - // 使用lgdt加载全局描述符表,更新所有段寄存器 - // reload all segment registers - lgdt(&gdt_pd); -c01036e0: c7 04 24 30 8a 12 c0 movl $0xc0128a30,(%esp) -c01036e7: e8 db fe ff ff call c01035c7 -c01036ec: 66 c7 45 fe 28 00 movw $0x28,-0x2(%ebp) - asm volatile ("ltr %0" :: "r" (sel) : "memory"); -c01036f2: 0f b7 45 fe movzwl -0x2(%ebp),%eax -c01036f6: 0f 00 d8 ltr %ax -} -c01036f9: 90 nop - // 加载 TSS,使 CPU 在进行特权级切换时能够正确使用 TSS。 - // load the TSS - ltr(GD_TSS); +//用于分配指定数量的连续物理页。该函数实现了首次适应内存分配算法。 +static struct Page * +default_alloc_pages(size_t n) { +c01034f9: 55 push %ebp +c01034fa: 89 e5 mov %esp,%ebp +c01034fc: 83 ec 68 sub $0x68,%esp + assert(n > 0);// 确保请求的页数大于零 +c01034ff: 83 7d 08 00 cmpl $0x0,0x8(%ebp) +c0103503: 75 24 jne c0103529 +c0103505: c7 44 24 0c 70 a9 10 movl $0xc010a970,0xc(%esp) +c010350c: c0 +c010350d: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103514: c0 +c0103515: c7 44 24 04 ac 00 00 movl $0xac,0x4(%esp) +c010351c: 00 +c010351d: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103524: e8 1c d7 ff ff call c0100c45 <__panic> + if (n > nr_free) {// 检查请求的页数是否超过空闲页数 +c0103529: a1 ec bf 12 c0 mov 0xc012bfec,%eax +c010352e: 39 45 08 cmp %eax,0x8(%ebp) +c0103531: 76 0a jbe c010353d + return NULL; +c0103533: b8 00 00 00 00 mov $0x0,%eax +c0103538: e9 3c 01 00 00 jmp c0103679 + } + struct Page *page = NULL;// 初始化分配的页指针 +c010353d: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) + list_entry_t *le = &free_list;// 初始化链表迭代器 +c0103544: c7 45 f0 e4 bf 12 c0 movl $0xc012bfe4,-0x10(%ebp) + // 遍历空闲列表,寻找第一个满足条件的块 + while ((le = list_next(le)) != &free_list) { +c010354b: eb 1c jmp c0103569 + struct Page *p = le2page(le, page_link);// 将链表节点转换为 Page 结构体 +c010354d: 8b 45 f0 mov -0x10(%ebp),%eax +c0103550: 83 e8 0c sub $0xc,%eax +c0103553: 89 45 ec mov %eax,-0x14(%ebp) + if (p->property >= n) {// 检查当前块的页数是否满足请求 +c0103556: 8b 45 ec mov -0x14(%ebp),%eax +c0103559: 8b 40 08 mov 0x8(%eax),%eax +c010355c: 39 45 08 cmp %eax,0x8(%ebp) +c010355f: 77 08 ja c0103569 + page = p;// 找到合适的块 +c0103561: 8b 45 ec mov -0x14(%ebp),%eax +c0103564: 89 45 f4 mov %eax,-0xc(%ebp) + break;// 退出循环 +c0103567: eb 18 jmp c0103581 +c0103569: 8b 45 f0 mov -0x10(%ebp),%eax +c010356c: 89 45 e4 mov %eax,-0x1c(%ebp) + return listelm->next; +c010356f: 8b 45 e4 mov -0x1c(%ebp),%eax +c0103572: 8b 40 04 mov 0x4(%eax),%eax + while ((le = list_next(le)) != &free_list) { +c0103575: 89 45 f0 mov %eax,-0x10(%ebp) +c0103578: 81 7d f0 e4 bf 12 c0 cmpl $0xc012bfe4,-0x10(%ebp) +c010357f: 75 cc jne c010354d + } + } + if (page != NULL) {// 如果找到合适的块 +c0103581: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0103585: 0f 84 eb 00 00 00 je c0103676 + //list_del(&(page->page_link));// 从空闲列表中删除该块 + if (page->property > n) { +c010358b: 8b 45 f4 mov -0xc(%ebp),%eax +c010358e: 8b 40 08 mov 0x8(%eax),%eax +c0103591: 39 45 08 cmp %eax,0x8(%ebp) +c0103594: 0f 83 88 00 00 00 jae c0103622 + struct Page *p = page + n;// 指向剩余的页 +c010359a: 8b 45 08 mov 0x8(%ebp),%eax +c010359d: c1 e0 05 shl $0x5,%eax +c01035a0: 89 c2 mov %eax,%edx +c01035a2: 8b 45 f4 mov -0xc(%ebp),%eax +c01035a5: 01 d0 add %edx,%eax +c01035a7: 89 45 e8 mov %eax,-0x18(%ebp) + p->property = page->property - n;// 更新剩余块的页数 +c01035aa: 8b 45 f4 mov -0xc(%ebp),%eax +c01035ad: 8b 40 08 mov 0x8(%eax),%eax +c01035b0: 2b 45 08 sub 0x8(%ebp),%eax +c01035b3: 89 c2 mov %eax,%edx +c01035b5: 8b 45 e8 mov -0x18(%ebp),%eax +c01035b8: 89 50 08 mov %edx,0x8(%eax) + SetPageProperty(p); +c01035bb: 8b 45 e8 mov -0x18(%ebp),%eax +c01035be: 83 c0 04 add $0x4,%eax +c01035c1: c7 45 cc 01 00 00 00 movl $0x1,-0x34(%ebp) +c01035c8: 89 45 c8 mov %eax,-0x38(%ebp) + asm volatile ("btsl %1, %0" :"=m" (*(volatile long *)addr) : "Ir" (nr)); +c01035cb: 8b 45 c8 mov -0x38(%ebp),%eax +c01035ce: 8b 55 cc mov -0x34(%ebp),%edx +c01035d1: 0f ab 10 bts %edx,(%eax) } -c01036fa: 90 nop -c01036fb: c9 leave -c01036fc: c3 ret - -c01036fd : - -//init_pmm_manager - initialize a pmm_manager instance -//初始化一个 pmm_manager 实例 -static void -init_pmm_manager(void) { -c01036fd: f3 0f 1e fb endbr32 -c0103701: 55 push %ebp -c0103702: 89 e5 mov %esp,%ebp -c0103704: 83 ec 18 sub $0x18,%esp - //将 pmm_manager 指向默认的 PMM 管理器实例。 - pmm_manager = &default_pmm_manager; -c0103707: c7 05 b0 e0 12 c0 2c movl $0xc010c12c,0xc012e0b0 -c010370e: c1 10 c0 - //使用 cprintf 打印当前内存管理器的名称。 - cprintf("memory management: %s\n", pmm_manager->name); -c0103711: a1 b0 e0 12 c0 mov 0xc012e0b0,%eax -c0103716: 8b 00 mov (%eax),%eax -c0103718: 89 44 24 04 mov %eax,0x4(%esp) -c010371c: c7 04 24 10 ac 10 c0 movl $0xc010ac10,(%esp) -c0103723: e8 af cb ff ff call c01002d7 - //调用 PMM 管理器的初始化函数,以设置和准备内存管理的相关数据结构。 - pmm_manager->init(); -c0103728: a1 b0 e0 12 c0 mov 0xc012e0b0,%eax -c010372d: 8b 40 04 mov 0x4(%eax),%eax -c0103730: ff d0 call *%eax +c01035d4: 90 nop + list_add_after(&(page->page_link), &(p->page_link));// 将剩余块添加回空闲列表 +c01035d5: 8b 45 e8 mov -0x18(%ebp),%eax +c01035d8: 83 c0 0c add $0xc,%eax +c01035db: 8b 55 f4 mov -0xc(%ebp),%edx +c01035de: 83 c2 0c add $0xc,%edx +c01035e1: 89 55 e0 mov %edx,-0x20(%ebp) +c01035e4: 89 45 dc mov %eax,-0x24(%ebp) + __list_add(elm, listelm, listelm->next); +c01035e7: 8b 45 e0 mov -0x20(%ebp),%eax +c01035ea: 8b 40 04 mov 0x4(%eax),%eax +c01035ed: 8b 55 dc mov -0x24(%ebp),%edx +c01035f0: 89 55 d8 mov %edx,-0x28(%ebp) +c01035f3: 8b 55 e0 mov -0x20(%ebp),%edx +c01035f6: 89 55 d4 mov %edx,-0x2c(%ebp) +c01035f9: 89 45 d0 mov %eax,-0x30(%ebp) + prev->next = next->prev = elm; +c01035fc: 8b 45 d0 mov -0x30(%ebp),%eax +c01035ff: 8b 55 d8 mov -0x28(%ebp),%edx +c0103602: 89 10 mov %edx,(%eax) +c0103604: 8b 45 d0 mov -0x30(%ebp),%eax +c0103607: 8b 10 mov (%eax),%edx +c0103609: 8b 45 d4 mov -0x2c(%ebp),%eax +c010360c: 89 50 04 mov %edx,0x4(%eax) + elm->next = next; +c010360f: 8b 45 d8 mov -0x28(%ebp),%eax +c0103612: 8b 55 d0 mov -0x30(%ebp),%edx +c0103615: 89 50 04 mov %edx,0x4(%eax) + elm->prev = prev; +c0103618: 8b 45 d8 mov -0x28(%ebp),%eax +c010361b: 8b 55 d4 mov -0x2c(%ebp),%edx +c010361e: 89 10 mov %edx,(%eax) } -c0103732: 90 nop -c0103733: c9 leave -c0103734: c3 ret - -c0103735 : - -//init_memmap - call pmm->init_memmap to build Page struct for free memory -// init_memmap - 调用 pmm->init_memmap 构建空闲内存的 Page 结构 -//struct Page *base:指向内存页的基础地址。 size_t n:要初始化的页数。 -static void -init_memmap(struct Page *base, size_t n) { -c0103735: f3 0f 1e fb endbr32 -c0103739: 55 push %ebp -c010373a: 89 e5 mov %esp,%ebp -c010373c: 83 ec 18 sub $0x18,%esp - pmm_manager->init_memmap(base, n); -c010373f: a1 b0 e0 12 c0 mov 0xc012e0b0,%eax -c0103744: 8b 40 08 mov 0x8(%eax),%eax -c0103747: 8b 55 0c mov 0xc(%ebp),%edx -c010374a: 89 54 24 04 mov %edx,0x4(%esp) -c010374e: 8b 55 08 mov 0x8(%ebp),%edx -c0103751: 89 14 24 mov %edx,(%esp) -c0103754: ff d0 call *%eax +c0103620: 90 nop } -c0103756: 90 nop -c0103757: c9 leave -c0103758: c3 ret - -c0103759 : - -//alloc_pages - call pmm->alloc_pages to allocate a continuous n*PAGESIZE memory -// alloc_pages - 调用 pmm->alloc_pages 分配连续的 n*PAGESIZE 内存 -struct Page * -alloc_pages(size_t n) { -c0103759: f3 0f 1e fb endbr32 -c010375d: 55 push %ebp -c010375e: 89 e5 mov %esp,%ebp -c0103760: 83 ec 28 sub $0x28,%esp - struct Page *page=NULL; -c0103763: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) - bool intr_flag; - //使用 local_intr_save 保存当前的中断状态,以避免在分配内存时发生中断。 - while (1) - { - local_intr_save(intr_flag); -c010376a: e8 1a fe ff ff call c0103589 <__intr_save> -c010376f: 89 45 f0 mov %eax,-0x10(%ebp) - { - page = pmm_manager->alloc_pages(n);//尝试分配 n 个页面。 -c0103772: a1 b0 e0 12 c0 mov 0xc012e0b0,%eax -c0103777: 8b 40 0c mov 0xc(%eax),%eax -c010377a: 8b 55 08 mov 0x8(%ebp),%edx -c010377d: 89 14 24 mov %edx,(%esp) -c0103780: ff d0 call *%eax -c0103782: 89 45 f4 mov %eax,-0xc(%ebp) - } - local_intr_restore(intr_flag); -c0103785: 8b 45 f0 mov -0x10(%ebp),%eax -c0103788: 89 04 24 mov %eax,(%esp) -c010378b: e8 23 fe ff ff call c01035b3 <__intr_restore> - - if (page != NULL || n > 1 || swap_init_ok == 0) break; -c0103790: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0103794: 75 2d jne c01037c3 -c0103796: 83 7d 08 01 cmpl $0x1,0x8(%ebp) -c010379a: 77 27 ja c01037c3 -c010379c: a1 14 c0 12 c0 mov 0xc012c014,%eax -c01037a1: 85 c0 test %eax,%eax -c01037a3: 74 1e je c01037c3 - - extern struct mm_struct *check_mm_struct; - //cprintf("page %x, call swap_out in alloc_pages %d\n",page, n); - swap_out(check_mm_struct, n, 0); -c01037a5: 8b 55 08 mov 0x8(%ebp),%edx -c01037a8: a1 c4 e0 12 c0 mov 0xc012e0c4,%eax -c01037ad: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c01037b4: 00 -c01037b5: 89 54 24 04 mov %edx,0x4(%esp) -c01037b9: 89 04 24 mov %eax,(%esp) -c01037bc: e8 7c 33 00 00 call c0106b3d - { -c01037c1: eb a7 jmp c010376a +c0103621: 90 nop } - //cprintf("n %d,get page %x, No %d in alloc_pages\n",n,page,(page-pages)); - return page; -c01037c3: 8b 45 f4 mov -0xc(%ebp),%eax + list_del(&(page->page_link)); +c0103622: 8b 45 f4 mov -0xc(%ebp),%eax +c0103625: 83 c0 0c add $0xc,%eax +c0103628: 89 45 bc mov %eax,-0x44(%ebp) + __list_del(listelm->prev, listelm->next); +c010362b: 8b 45 bc mov -0x44(%ebp),%eax +c010362e: 8b 40 04 mov 0x4(%eax),%eax +c0103631: 8b 55 bc mov -0x44(%ebp),%edx +c0103634: 8b 12 mov (%edx),%edx +c0103636: 89 55 b8 mov %edx,-0x48(%ebp) +c0103639: 89 45 b4 mov %eax,-0x4c(%ebp) + * This is only for internal list manipulation where we know + * the prev/next entries already! + * */ +static inline void +__list_del(list_entry_t *prev, list_entry_t *next) { + prev->next = next; +c010363c: 8b 45 b8 mov -0x48(%ebp),%eax +c010363f: 8b 55 b4 mov -0x4c(%ebp),%edx +c0103642: 89 50 04 mov %edx,0x4(%eax) + next->prev = prev; +c0103645: 8b 45 b4 mov -0x4c(%ebp),%eax +c0103648: 8b 55 b8 mov -0x48(%ebp),%edx +c010364b: 89 10 mov %edx,(%eax) } -c01037c6: c9 leave -c01037c7: c3 ret - -c01037c8 : - -//free_pages - call pmm->free_pages to free a continuous n*PAGESIZE memory -// free_pages - 调用 pmm->free_pages 释放连续的 n*PAGESIZE 内存 -//struct Page *base:指向要释放的内存页的基础地址。size_t n:要释放的页数。 -void -free_pages(struct Page *base, size_t n) { -c01037c8: f3 0f 1e fb endbr32 -c01037cc: 55 push %ebp -c01037cd: 89 e5 mov %esp,%ebp -c01037cf: 83 ec 28 sub $0x28,%esp - bool intr_flag; - //使用 local_intr_save 保存当前的中断状态,以避免在释放内存时发生中断。 - local_intr_save(intr_flag); -c01037d2: e8 b2 fd ff ff call c0103589 <__intr_save> -c01037d7: 89 45 f4 mov %eax,-0xc(%ebp) - { - //调用物理内存管理器的 free_pages 函数释放 n 页的内存。 - pmm_manager->free_pages(base, n); -c01037da: a1 b0 e0 12 c0 mov 0xc012e0b0,%eax -c01037df: 8b 40 10 mov 0x10(%eax),%eax -c01037e2: 8b 55 0c mov 0xc(%ebp),%edx -c01037e5: 89 54 24 04 mov %edx,0x4(%esp) -c01037e9: 8b 55 08 mov 0x8(%ebp),%edx -c01037ec: 89 14 24 mov %edx,(%esp) -c01037ef: ff d0 call *%eax - } - local_intr_restore(intr_flag); -c01037f1: 8b 45 f4 mov -0xc(%ebp),%eax -c01037f4: 89 04 24 mov %eax,(%esp) -c01037f7: e8 b7 fd ff ff call c01035b3 <__intr_restore> +c010364d: 90 nop } -c01037fc: 90 nop -c01037fd: c9 leave -c01037fe: c3 ret - -c01037ff : - -//nr_free_pages - call pmm->nr_free_pages to get the size (nr*PAGESIZE) -//of current free memory -// nr_free_pages - 调用 pmm->nr_free_pages 获取当前空闲内存的大小 (nr * PAGESIZE) -size_t -nr_free_pages(void) { -c01037ff: f3 0f 1e fb endbr32 -c0103803: 55 push %ebp -c0103804: 89 e5 mov %esp,%ebp -c0103806: 83 ec 28 sub $0x28,%esp - size_t ret;// 定义变量 ret 用于存储返回的空闲内存大小 - bool intr_flag;// 定义变量 intr_flag 用于保存中断状态 - local_intr_save(intr_flag);// 保存当前中断状态,并禁用中断 -c0103809: e8 7b fd ff ff call c0103589 <__intr_save> -c010380e: 89 45 f4 mov %eax,-0xc(%ebp) - { - ret = pmm_manager->nr_free_pages();// 调用物理内存管理器的函数获取空闲内存页数 -c0103811: a1 b0 e0 12 c0 mov 0xc012e0b0,%eax -c0103816: 8b 40 14 mov 0x14(%eax),%eax -c0103819: ff d0 call *%eax -c010381b: 89 45 f0 mov %eax,-0x10(%ebp) +c010364e: 90 nop + nr_free -= n;// 减少空闲页的计数 +c010364f: a1 ec bf 12 c0 mov 0xc012bfec,%eax +c0103654: 2b 45 08 sub 0x8(%ebp),%eax +c0103657: a3 ec bf 12 c0 mov %eax,0xc012bfec + ClearPageProperty(page);// 清除已分配页的属性 +c010365c: 8b 45 f4 mov -0xc(%ebp),%eax +c010365f: 83 c0 04 add $0x4,%eax +c0103662: c7 45 c4 01 00 00 00 movl $0x1,-0x3c(%ebp) +c0103669: 89 45 c0 mov %eax,-0x40(%ebp) + asm volatile ("btrl %1, %0" :"=m" (*(volatile long *)addr) : "Ir" (nr)); +c010366c: 8b 45 c0 mov -0x40(%ebp),%eax +c010366f: 8b 55 c4 mov -0x3c(%ebp),%edx +c0103672: 0f b3 10 btr %edx,(%eax) +} +c0103675: 90 nop } - local_intr_restore(intr_flag);// 恢复之前保存的中断状态 -c010381e: 8b 45 f4 mov -0xc(%ebp),%eax -c0103821: 89 04 24 mov %eax,(%esp) -c0103824: e8 8a fd ff ff call c01035b3 <__intr_restore> - return ret;// 返回空闲内存的大小 -c0103829: 8b 45 f0 mov -0x10(%ebp),%eax + return page;// 返回分配的页块 +c0103676: 8b 45 f4 mov -0xc(%ebp),%eax } -c010382c: c9 leave -c010382d: c3 ret +c0103679: 89 ec mov %ebp,%esp +c010367b: 5d pop %ebp +c010367c: c3 ret -c010382e : +c010367d : -/* pmm_init - initialize the physical memory management */ -/* pmm_init - 初始化物理内存管理 */ static void -page_init(void) { -c010382e: f3 0f 1e fb endbr32 -c0103832: 55 push %ebp -c0103833: 89 e5 mov %esp,%ebp -c0103835: 57 push %edi -c0103836: 56 push %esi -c0103837: 53 push %ebx -c0103838: 81 ec 9c 00 00 00 sub $0x9c,%esp - // 获取物理内存映射信息,存于特定地址 - struct e820map *memmap = (struct e820map *)(0x8000 + KERNBASE); -c010383e: c7 45 c4 00 80 00 c0 movl $0xc0008000,-0x3c(%ebp) - uint64_t maxpa = 0;// 初始化最大物理地址为0 -c0103845: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp) -c010384c: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) - - cprintf("e820map:\n");// 打印“e820map”标题 -c0103853: c7 04 24 27 ac 10 c0 movl $0xc010ac27,(%esp) -c010385a: e8 78 ca ff ff call c01002d7 - int i; - for (i = 0; i < memmap->nr_map; i ++) {// 遍历内存映射数组 -c010385f: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp) -c0103866: e9 1a 01 00 00 jmp c0103985 - uint64_t begin = memmap->map[i].addr, end = begin + memmap->map[i].size;// 获取每个区域的起始和结束地址 -c010386b: 8b 4d c4 mov -0x3c(%ebp),%ecx -c010386e: 8b 55 dc mov -0x24(%ebp),%edx -c0103871: 89 d0 mov %edx,%eax -c0103873: c1 e0 02 shl $0x2,%eax -c0103876: 01 d0 add %edx,%eax -c0103878: c1 e0 02 shl $0x2,%eax -c010387b: 01 c8 add %ecx,%eax -c010387d: 8b 50 08 mov 0x8(%eax),%edx -c0103880: 8b 40 04 mov 0x4(%eax),%eax -c0103883: 89 45 a0 mov %eax,-0x60(%ebp) -c0103886: 89 55 a4 mov %edx,-0x5c(%ebp) -c0103889: 8b 4d c4 mov -0x3c(%ebp),%ecx -c010388c: 8b 55 dc mov -0x24(%ebp),%edx -c010388f: 89 d0 mov %edx,%eax -c0103891: c1 e0 02 shl $0x2,%eax -c0103894: 01 d0 add %edx,%eax -c0103896: c1 e0 02 shl $0x2,%eax -c0103899: 01 c8 add %ecx,%eax -c010389b: 8b 48 0c mov 0xc(%eax),%ecx -c010389e: 8b 58 10 mov 0x10(%eax),%ebx -c01038a1: 8b 45 a0 mov -0x60(%ebp),%eax -c01038a4: 8b 55 a4 mov -0x5c(%ebp),%edx -c01038a7: 01 c8 add %ecx,%eax -c01038a9: 11 da adc %ebx,%edx -c01038ab: 89 45 98 mov %eax,-0x68(%ebp) -c01038ae: 89 55 9c mov %edx,-0x64(%ebp) - cprintf(" memory: %08llx, [%08llx, %08llx], type = %d.\n",// 打印内存区域的信息 -c01038b1: 8b 4d c4 mov -0x3c(%ebp),%ecx -c01038b4: 8b 55 dc mov -0x24(%ebp),%edx -c01038b7: 89 d0 mov %edx,%eax -c01038b9: c1 e0 02 shl $0x2,%eax -c01038bc: 01 d0 add %edx,%eax -c01038be: c1 e0 02 shl $0x2,%eax -c01038c1: 01 c8 add %ecx,%eax -c01038c3: 83 c0 14 add $0x14,%eax -c01038c6: 8b 00 mov (%eax),%eax -c01038c8: 89 45 84 mov %eax,-0x7c(%ebp) -c01038cb: 8b 45 98 mov -0x68(%ebp),%eax -c01038ce: 8b 55 9c mov -0x64(%ebp),%edx -c01038d1: 83 c0 ff add $0xffffffff,%eax -c01038d4: 83 d2 ff adc $0xffffffff,%edx -c01038d7: 89 85 78 ff ff ff mov %eax,-0x88(%ebp) -c01038dd: 89 95 7c ff ff ff mov %edx,-0x84(%ebp) -c01038e3: 8b 4d c4 mov -0x3c(%ebp),%ecx -c01038e6: 8b 55 dc mov -0x24(%ebp),%edx -c01038e9: 89 d0 mov %edx,%eax -c01038eb: c1 e0 02 shl $0x2,%eax -c01038ee: 01 d0 add %edx,%eax -c01038f0: c1 e0 02 shl $0x2,%eax -c01038f3: 01 c8 add %ecx,%eax -c01038f5: 8b 48 0c mov 0xc(%eax),%ecx -c01038f8: 8b 58 10 mov 0x10(%eax),%ebx -c01038fb: 8b 55 84 mov -0x7c(%ebp),%edx -c01038fe: 89 54 24 1c mov %edx,0x1c(%esp) -c0103902: 8b 85 78 ff ff ff mov -0x88(%ebp),%eax -c0103908: 8b 95 7c ff ff ff mov -0x84(%ebp),%edx -c010390e: 89 44 24 14 mov %eax,0x14(%esp) -c0103912: 89 54 24 18 mov %edx,0x18(%esp) -c0103916: 8b 45 a0 mov -0x60(%ebp),%eax -c0103919: 8b 55 a4 mov -0x5c(%ebp),%edx -c010391c: 89 44 24 0c mov %eax,0xc(%esp) -c0103920: 89 54 24 10 mov %edx,0x10(%esp) -c0103924: 89 4c 24 04 mov %ecx,0x4(%esp) -c0103928: 89 5c 24 08 mov %ebx,0x8(%esp) -c010392c: c7 04 24 34 ac 10 c0 movl $0xc010ac34,(%esp) -c0103933: e8 9f c9 ff ff call c01002d7 - memmap->map[i].size, begin, end - 1, memmap->map[i].type); - if (memmap->map[i].type == E820_ARM) {// 检查内存类型是否为可用内存 -c0103938: 8b 4d c4 mov -0x3c(%ebp),%ecx -c010393b: 8b 55 dc mov -0x24(%ebp),%edx -c010393e: 89 d0 mov %edx,%eax -c0103940: c1 e0 02 shl $0x2,%eax -c0103943: 01 d0 add %edx,%eax -c0103945: c1 e0 02 shl $0x2,%eax -c0103948: 01 c8 add %ecx,%eax -c010394a: 83 c0 14 add $0x14,%eax -c010394d: 8b 00 mov (%eax),%eax -c010394f: 83 f8 01 cmp $0x1,%eax -c0103952: 75 2e jne c0103982 - if (maxpa < end && begin < KMEMSIZE) {// 检查当前区域是否在有效范围内 -c0103954: 8b 45 e0 mov -0x20(%ebp),%eax -c0103957: 8b 55 e4 mov -0x1c(%ebp),%edx -c010395a: 3b 45 98 cmp -0x68(%ebp),%eax -c010395d: 89 d0 mov %edx,%eax -c010395f: 1b 45 9c sbb -0x64(%ebp),%eax -c0103962: 73 1e jae c0103982 -c0103964: ba ff ff ff 37 mov $0x37ffffff,%edx -c0103969: b8 00 00 00 00 mov $0x0,%eax -c010396e: 3b 55 a0 cmp -0x60(%ebp),%edx -c0103971: 1b 45 a4 sbb -0x5c(%ebp),%eax -c0103974: 72 0c jb c0103982 - maxpa = end;// 更新最大物理地址 -c0103976: 8b 45 98 mov -0x68(%ebp),%eax -c0103979: 8b 55 9c mov -0x64(%ebp),%edx -c010397c: 89 45 e0 mov %eax,-0x20(%ebp) -c010397f: 89 55 e4 mov %edx,-0x1c(%ebp) - for (i = 0; i < memmap->nr_map; i ++) {// 遍历内存映射数组 -c0103982: ff 45 dc incl -0x24(%ebp) -c0103985: 8b 45 c4 mov -0x3c(%ebp),%eax -c0103988: 8b 00 mov (%eax),%eax -c010398a: 39 45 dc cmp %eax,-0x24(%ebp) -c010398d: 0f 8c d8 fe ff ff jl c010386b - } - } - } - if (maxpa > KMEMSIZE) {// 如果最大物理地址超过了预定义的内存上限 -c0103993: ba 00 00 00 38 mov $0x38000000,%edx -c0103998: b8 00 00 00 00 mov $0x0,%eax -c010399d: 3b 55 e0 cmp -0x20(%ebp),%edx -c01039a0: 1b 45 e4 sbb -0x1c(%ebp),%eax -c01039a3: 73 0e jae c01039b3 - maxpa = KMEMSIZE;// 将其限制为内存上限 -c01039a5: c7 45 e0 00 00 00 38 movl $0x38000000,-0x20(%ebp) -c01039ac: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) +default_free_pages(struct Page *base, size_t n) { +c010367d: 55 push %ebp +c010367e: 89 e5 mov %esp,%ebp +c0103680: 81 ec 98 00 00 00 sub $0x98,%esp + assert(n > 0);// 确保请求释放的页数大于零 +c0103686: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) +c010368a: 75 24 jne c01036b0 +c010368c: c7 44 24 0c 70 a9 10 movl $0xc010a970,0xc(%esp) +c0103693: c0 +c0103694: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c010369b: c0 +c010369c: c7 44 24 04 cb 00 00 movl $0xcb,0x4(%esp) +c01036a3: 00 +c01036a4: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c01036ab: e8 95 d5 ff ff call c0100c45 <__panic> + struct Page *p = base; +c01036b0: 8b 45 08 mov 0x8(%ebp),%eax +c01036b3: 89 45 f4 mov %eax,-0xc(%ebp) + // 遍历释放的页,检查状态并重置 + for (; p != base + n; p ++) { +c01036b6: e9 9d 00 00 00 jmp c0103758 + assert(!PageReserved(p) && !PageProperty(p));// 确保页没有被保留并且没有属性 +c01036bb: 8b 45 f4 mov -0xc(%ebp),%eax +c01036be: 83 c0 04 add $0x4,%eax +c01036c1: c7 45 ec 00 00 00 00 movl $0x0,-0x14(%ebp) +c01036c8: 89 45 e8 mov %eax,-0x18(%ebp) + asm volatile ("btl %2, %1; sbbl %0,%0" : "=r" (oldbit) : "m" (*(volatile long *)addr), "Ir" (nr)); +c01036cb: 8b 45 e8 mov -0x18(%ebp),%eax +c01036ce: 8b 55 ec mov -0x14(%ebp),%edx +c01036d1: 0f a3 10 bt %edx,(%eax) +c01036d4: 19 c0 sbb %eax,%eax +c01036d6: 89 45 e4 mov %eax,-0x1c(%ebp) + return oldbit != 0; +c01036d9: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) +c01036dd: 0f 95 c0 setne %al +c01036e0: 0f b6 c0 movzbl %al,%eax +c01036e3: 85 c0 test %eax,%eax +c01036e5: 75 2c jne c0103713 +c01036e7: 8b 45 f4 mov -0xc(%ebp),%eax +c01036ea: 83 c0 04 add $0x4,%eax +c01036ed: c7 45 e0 01 00 00 00 movl $0x1,-0x20(%ebp) +c01036f4: 89 45 dc mov %eax,-0x24(%ebp) + asm volatile ("btl %2, %1; sbbl %0,%0" : "=r" (oldbit) : "m" (*(volatile long *)addr), "Ir" (nr)); +c01036f7: 8b 45 dc mov -0x24(%ebp),%eax +c01036fa: 8b 55 e0 mov -0x20(%ebp),%edx +c01036fd: 0f a3 10 bt %edx,(%eax) +c0103700: 19 c0 sbb %eax,%eax +c0103702: 89 45 d8 mov %eax,-0x28(%ebp) + return oldbit != 0; +c0103705: 83 7d d8 00 cmpl $0x0,-0x28(%ebp) +c0103709: 0f 95 c0 setne %al +c010370c: 0f b6 c0 movzbl %al,%eax +c010370f: 85 c0 test %eax,%eax +c0103711: 74 24 je c0103737 +c0103713: c7 44 24 0c b4 a9 10 movl $0xc010a9b4,0xc(%esp) +c010371a: c0 +c010371b: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103722: c0 +c0103723: c7 44 24 04 cf 00 00 movl $0xcf,0x4(%esp) +c010372a: 00 +c010372b: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103732: e8 0e d5 ff ff call c0100c45 <__panic> + p->flags = 0;// 清除 flags 字段 +c0103737: 8b 45 f4 mov -0xc(%ebp),%eax +c010373a: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax) + set_page_ref(p, 0);// 清除引用计数 +c0103741: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c0103748: 00 +c0103749: 8b 45 f4 mov -0xc(%ebp),%eax +c010374c: 89 04 24 mov %eax,(%esp) +c010374f: e8 19 fc ff ff call c010336d + for (; p != base + n; p ++) { +c0103754: 83 45 f4 20 addl $0x20,-0xc(%ebp) +c0103758: 8b 45 0c mov 0xc(%ebp),%eax +c010375b: c1 e0 05 shl $0x5,%eax +c010375e: 89 c2 mov %eax,%edx +c0103760: 8b 45 08 mov 0x8(%ebp),%eax +c0103763: 01 d0 add %edx,%eax +c0103765: 39 45 f4 cmp %eax,-0xc(%ebp) +c0103768: 0f 85 4d ff ff ff jne c01036bb } - - extern char end[];// 引入全局变量 end,指向内存的结束位置 - - npage = maxpa / PGSIZE;// 计算可用页数 -c01039b3: 8b 45 e0 mov -0x20(%ebp),%eax -c01039b6: 8b 55 e4 mov -0x1c(%ebp),%edx -c01039b9: 0f ac d0 0c shrd $0xc,%edx,%eax -c01039bd: c1 ea 0c shr $0xc,%edx -c01039c0: a3 80 bf 12 c0 mov %eax,0xc012bf80 - pages = (struct Page *)ROUNDUP((void *)end, PGSIZE);// 将 end 对齐到页边界,指向页结构数组的开头 -c01039c5: c7 45 c0 00 10 00 00 movl $0x1000,-0x40(%ebp) -c01039cc: b8 b8 e1 12 c0 mov $0xc012e1b8,%eax -c01039d1: 8d 50 ff lea -0x1(%eax),%edx -c01039d4: 8b 45 c0 mov -0x40(%ebp),%eax -c01039d7: 01 d0 add %edx,%eax -c01039d9: 89 45 bc mov %eax,-0x44(%ebp) -c01039dc: 8b 45 bc mov -0x44(%ebp),%eax -c01039df: ba 00 00 00 00 mov $0x0,%edx -c01039e4: f7 75 c0 divl -0x40(%ebp) -c01039e7: 8b 45 bc mov -0x44(%ebp),%eax -c01039ea: 29 d0 sub %edx,%eax -c01039ec: a3 b8 e0 12 c0 mov %eax,0xc012e0b8 - - for (i = 0; i < npage; i ++) {// 遍历每一页 -c01039f1: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp) -c01039f8: eb 27 jmp c0103a21 - SetPageReserved(pages + i);// 将每一页标记为保留状态 -c01039fa: a1 b8 e0 12 c0 mov 0xc012e0b8,%eax -c01039ff: 8b 55 dc mov -0x24(%ebp),%edx -c0103a02: c1 e2 05 shl $0x5,%edx -c0103a05: 01 d0 add %edx,%eax -c0103a07: 83 c0 04 add $0x4,%eax -c0103a0a: c7 45 94 00 00 00 00 movl $0x0,-0x6c(%ebp) -c0103a11: 89 45 90 mov %eax,-0x70(%ebp) - * Note that @nr may be almost arbitrarily large; this function is not - * restricted to acting on a single-word quantity. - * */ -static inline void -set_bit(int nr, volatile void *addr) { + // 设置基页的属性为释放的页数 + base->property = n; +c010376e: 8b 45 08 mov 0x8(%ebp),%eax +c0103771: 8b 55 0c mov 0xc(%ebp),%edx +c0103774: 89 50 08 mov %edx,0x8(%eax) + SetPageProperty(base);// 设置页的有效标志 +c0103777: 8b 45 08 mov 0x8(%ebp),%eax +c010377a: 83 c0 04 add $0x4,%eax +c010377d: c7 45 d0 01 00 00 00 movl $0x1,-0x30(%ebp) +c0103784: 89 45 cc mov %eax,-0x34(%ebp) asm volatile ("btsl %1, %0" :"=m" (*(volatile long *)addr) : "Ir" (nr)); -c0103a14: 8b 45 90 mov -0x70(%ebp),%eax -c0103a17: 8b 55 94 mov -0x6c(%ebp),%edx -c0103a1a: 0f ab 10 bts %edx,(%eax) +c0103787: 8b 45 cc mov -0x34(%ebp),%eax +c010378a: 8b 55 d0 mov -0x30(%ebp),%edx +c010378d: 0f ab 10 bts %edx,(%eax) } -c0103a1d: 90 nop - for (i = 0; i < npage; i ++) {// 遍历每一页 -c0103a1e: ff 45 dc incl -0x24(%ebp) -c0103a21: 8b 55 dc mov -0x24(%ebp),%edx -c0103a24: a1 80 bf 12 c0 mov 0xc012bf80,%eax -c0103a29: 39 c2 cmp %eax,%edx -c0103a2b: 72 cd jb c01039fa +c0103790: 90 nop +c0103791: c7 45 d4 e4 bf 12 c0 movl $0xc012bfe4,-0x2c(%ebp) + return listelm->next; +c0103798: 8b 45 d4 mov -0x2c(%ebp),%eax +c010379b: 8b 40 04 mov 0x4(%eax),%eax + // 遍历空闲列表,检查是否需要合并 + list_entry_t *le = list_next(&free_list); +c010379e: 89 45 f0 mov %eax,-0x10(%ebp) + while (le != &free_list) { +c01037a1: e9 00 01 00 00 jmp c01038a6 + p = le2page(le, page_link); +c01037a6: 8b 45 f0 mov -0x10(%ebp),%eax +c01037a9: 83 e8 0c sub $0xc,%eax +c01037ac: 89 45 f4 mov %eax,-0xc(%ebp) +c01037af: 8b 45 f0 mov -0x10(%ebp),%eax +c01037b2: 89 45 c8 mov %eax,-0x38(%ebp) +c01037b5: 8b 45 c8 mov -0x38(%ebp),%eax +c01037b8: 8b 40 04 mov 0x4(%eax),%eax + le = list_next(le); +c01037bb: 89 45 f0 mov %eax,-0x10(%ebp) + // 如果当前页块与释放的页块相邻,合并 + if (base + base->property == p) { +c01037be: 8b 45 08 mov 0x8(%ebp),%eax +c01037c1: 8b 40 08 mov 0x8(%eax),%eax +c01037c4: c1 e0 05 shl $0x5,%eax +c01037c7: 89 c2 mov %eax,%edx +c01037c9: 8b 45 08 mov 0x8(%ebp),%eax +c01037cc: 01 d0 add %edx,%eax +c01037ce: 39 45 f4 cmp %eax,-0xc(%ebp) +c01037d1: 75 5d jne c0103830 + base->property += p->property;// 合并当前页块 +c01037d3: 8b 45 08 mov 0x8(%ebp),%eax +c01037d6: 8b 50 08 mov 0x8(%eax),%edx +c01037d9: 8b 45 f4 mov -0xc(%ebp),%eax +c01037dc: 8b 40 08 mov 0x8(%eax),%eax +c01037df: 01 c2 add %eax,%edx +c01037e1: 8b 45 08 mov 0x8(%ebp),%eax +c01037e4: 89 50 08 mov %edx,0x8(%eax) + ClearPageProperty(p);// 清除合并页的属性 +c01037e7: 8b 45 f4 mov -0xc(%ebp),%eax +c01037ea: 83 c0 04 add $0x4,%eax +c01037ed: c7 45 b8 01 00 00 00 movl $0x1,-0x48(%ebp) +c01037f4: 89 45 b4 mov %eax,-0x4c(%ebp) + asm volatile ("btrl %1, %0" :"=m" (*(volatile long *)addr) : "Ir" (nr)); +c01037f7: 8b 45 b4 mov -0x4c(%ebp),%eax +c01037fa: 8b 55 b8 mov -0x48(%ebp),%edx +c01037fd: 0f b3 10 btr %edx,(%eax) +} +c0103800: 90 nop + list_del(&(p->page_link));// 从空闲列表中删除合并页 +c0103801: 8b 45 f4 mov -0xc(%ebp),%eax +c0103804: 83 c0 0c add $0xc,%eax +c0103807: 89 45 c4 mov %eax,-0x3c(%ebp) + __list_del(listelm->prev, listelm->next); +c010380a: 8b 45 c4 mov -0x3c(%ebp),%eax +c010380d: 8b 40 04 mov 0x4(%eax),%eax +c0103810: 8b 55 c4 mov -0x3c(%ebp),%edx +c0103813: 8b 12 mov (%edx),%edx +c0103815: 89 55 c0 mov %edx,-0x40(%ebp) +c0103818: 89 45 bc mov %eax,-0x44(%ebp) + prev->next = next; +c010381b: 8b 45 c0 mov -0x40(%ebp),%eax +c010381e: 8b 55 bc mov -0x44(%ebp),%edx +c0103821: 89 50 04 mov %edx,0x4(%eax) + next->prev = prev; +c0103824: 8b 45 bc mov -0x44(%ebp),%eax +c0103827: 8b 55 c0 mov -0x40(%ebp),%edx +c010382a: 89 10 mov %edx,(%eax) +} +c010382c: 90 nop +} +c010382d: 90 nop +c010382e: eb 76 jmp c01038a6 + } + else if (p + p->property == base) { +c0103830: 8b 45 f4 mov -0xc(%ebp),%eax +c0103833: 8b 40 08 mov 0x8(%eax),%eax +c0103836: c1 e0 05 shl $0x5,%eax +c0103839: 89 c2 mov %eax,%edx +c010383b: 8b 45 f4 mov -0xc(%ebp),%eax +c010383e: 01 d0 add %edx,%eax +c0103840: 39 45 08 cmp %eax,0x8(%ebp) +c0103843: 75 61 jne c01038a6 + p->property += base->property;// 合并前一个页块 +c0103845: 8b 45 f4 mov -0xc(%ebp),%eax +c0103848: 8b 50 08 mov 0x8(%eax),%edx +c010384b: 8b 45 08 mov 0x8(%ebp),%eax +c010384e: 8b 40 08 mov 0x8(%eax),%eax +c0103851: 01 c2 add %eax,%edx +c0103853: 8b 45 f4 mov -0xc(%ebp),%eax +c0103856: 89 50 08 mov %edx,0x8(%eax) + ClearPageProperty(base);// 清除当前页的属性 +c0103859: 8b 45 08 mov 0x8(%ebp),%eax +c010385c: 83 c0 04 add $0x4,%eax +c010385f: c7 45 a4 01 00 00 00 movl $0x1,-0x5c(%ebp) +c0103866: 89 45 a0 mov %eax,-0x60(%ebp) + asm volatile ("btrl %1, %0" :"=m" (*(volatile long *)addr) : "Ir" (nr)); +c0103869: 8b 45 a0 mov -0x60(%ebp),%eax +c010386c: 8b 55 a4 mov -0x5c(%ebp),%edx +c010386f: 0f b3 10 btr %edx,(%eax) +} +c0103872: 90 nop + base = p;// 更新 base 指针 +c0103873: 8b 45 f4 mov -0xc(%ebp),%eax +c0103876: 89 45 08 mov %eax,0x8(%ebp) + list_del(&(p->page_link));// 从空闲列表中删除当前页 +c0103879: 8b 45 f4 mov -0xc(%ebp),%eax +c010387c: 83 c0 0c add $0xc,%eax +c010387f: 89 45 b0 mov %eax,-0x50(%ebp) + __list_del(listelm->prev, listelm->next); +c0103882: 8b 45 b0 mov -0x50(%ebp),%eax +c0103885: 8b 40 04 mov 0x4(%eax),%eax +c0103888: 8b 55 b0 mov -0x50(%ebp),%edx +c010388b: 8b 12 mov (%edx),%edx +c010388d: 89 55 ac mov %edx,-0x54(%ebp) +c0103890: 89 45 a8 mov %eax,-0x58(%ebp) + prev->next = next; +c0103893: 8b 45 ac mov -0x54(%ebp),%eax +c0103896: 8b 55 a8 mov -0x58(%ebp),%edx +c0103899: 89 50 04 mov %edx,0x4(%eax) + next->prev = prev; +c010389c: 8b 45 a8 mov -0x58(%ebp),%eax +c010389f: 8b 55 ac mov -0x54(%ebp),%edx +c01038a2: 89 10 mov %edx,(%eax) +} +c01038a4: 90 nop +} +c01038a5: 90 nop + while (le != &free_list) { +c01038a6: 81 7d f0 e4 bf 12 c0 cmpl $0xc012bfe4,-0x10(%ebp) +c01038ad: 0f 85 f3 fe ff ff jne c01037a6 + } } - - uintptr_t freemem = PADDR((uintptr_t)pages + sizeof(struct Page) * npage);// 计算可用内存的起始地址 -c0103a2d: a1 80 bf 12 c0 mov 0xc012bf80,%eax -c0103a32: c1 e0 05 shl $0x5,%eax -c0103a35: 89 c2 mov %eax,%edx -c0103a37: a1 b8 e0 12 c0 mov 0xc012e0b8,%eax -c0103a3c: 01 d0 add %edx,%eax -c0103a3e: 89 45 b8 mov %eax,-0x48(%ebp) -c0103a41: 81 7d b8 ff ff ff bf cmpl $0xbfffffff,-0x48(%ebp) -c0103a48: 77 23 ja c0103a6d -c0103a4a: 8b 45 b8 mov -0x48(%ebp),%eax -c0103a4d: 89 44 24 0c mov %eax,0xc(%esp) -c0103a51: c7 44 24 08 64 ac 10 movl $0xc010ac64,0x8(%esp) -c0103a58: c0 -c0103a59: c7 44 24 04 1a 01 00 movl $0x11a,0x4(%esp) -c0103a60: 00 -c0103a61: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0103a68: e8 d6 c9 ff ff call c0100443 <__panic> -c0103a6d: 8b 45 b8 mov -0x48(%ebp),%eax -c0103a70: 05 00 00 00 40 add $0x40000000,%eax -c0103a75: 89 45 b4 mov %eax,-0x4c(%ebp) - - for (i = 0; i < memmap->nr_map; i ++) {// 再次遍历内存映射 -c0103a78: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp) -c0103a7f: e9 4b 01 00 00 jmp c0103bcf - uint64_t begin = memmap->map[i].addr, end = begin + memmap->map[i].size;// 获取每个区域的起始和结束地址 -c0103a84: 8b 4d c4 mov -0x3c(%ebp),%ecx -c0103a87: 8b 55 dc mov -0x24(%ebp),%edx -c0103a8a: 89 d0 mov %edx,%eax -c0103a8c: c1 e0 02 shl $0x2,%eax -c0103a8f: 01 d0 add %edx,%eax -c0103a91: c1 e0 02 shl $0x2,%eax -c0103a94: 01 c8 add %ecx,%eax -c0103a96: 8b 50 08 mov 0x8(%eax),%edx -c0103a99: 8b 40 04 mov 0x4(%eax),%eax -c0103a9c: 89 45 d0 mov %eax,-0x30(%ebp) -c0103a9f: 89 55 d4 mov %edx,-0x2c(%ebp) -c0103aa2: 8b 4d c4 mov -0x3c(%ebp),%ecx -c0103aa5: 8b 55 dc mov -0x24(%ebp),%edx -c0103aa8: 89 d0 mov %edx,%eax -c0103aaa: c1 e0 02 shl $0x2,%eax -c0103aad: 01 d0 add %edx,%eax -c0103aaf: c1 e0 02 shl $0x2,%eax -c0103ab2: 01 c8 add %ecx,%eax -c0103ab4: 8b 48 0c mov 0xc(%eax),%ecx -c0103ab7: 8b 58 10 mov 0x10(%eax),%ebx -c0103aba: 8b 45 d0 mov -0x30(%ebp),%eax -c0103abd: 8b 55 d4 mov -0x2c(%ebp),%edx -c0103ac0: 01 c8 add %ecx,%eax -c0103ac2: 11 da adc %ebx,%edx -c0103ac4: 89 45 c8 mov %eax,-0x38(%ebp) -c0103ac7: 89 55 cc mov %edx,-0x34(%ebp) - if (memmap->map[i].type == E820_ARM) {// 如果区域类型为可用内存 -c0103aca: 8b 4d c4 mov -0x3c(%ebp),%ecx -c0103acd: 8b 55 dc mov -0x24(%ebp),%edx -c0103ad0: 89 d0 mov %edx,%eax -c0103ad2: c1 e0 02 shl $0x2,%eax -c0103ad5: 01 d0 add %edx,%eax -c0103ad7: c1 e0 02 shl $0x2,%eax -c0103ada: 01 c8 add %ecx,%eax -c0103adc: 83 c0 14 add $0x14,%eax -c0103adf: 8b 00 mov (%eax),%eax -c0103ae1: 83 f8 01 cmp $0x1,%eax -c0103ae4: 0f 85 e2 00 00 00 jne c0103bcc - if (begin < freemem) {// 如果起始地址小于可用内存地址 -c0103aea: 8b 45 b4 mov -0x4c(%ebp),%eax -c0103aed: ba 00 00 00 00 mov $0x0,%edx -c0103af2: 8b 4d d4 mov -0x2c(%ebp),%ecx -c0103af5: 39 45 d0 cmp %eax,-0x30(%ebp) -c0103af8: 19 d1 sbb %edx,%ecx -c0103afa: 73 0d jae c0103b09 - begin = freemem;//将起始地址设置为可用内存地址 -c0103afc: 8b 45 b4 mov -0x4c(%ebp),%eax -c0103aff: 89 45 d0 mov %eax,-0x30(%ebp) -c0103b02: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp) - } - if (end > KMEMSIZE) {// 如果结束地址超过内存上限 -c0103b09: ba 00 00 00 38 mov $0x38000000,%edx -c0103b0e: b8 00 00 00 00 mov $0x0,%eax -c0103b13: 3b 55 c8 cmp -0x38(%ebp),%edx -c0103b16: 1b 45 cc sbb -0x34(%ebp),%eax -c0103b19: 73 0e jae c0103b29 - end = KMEMSIZE;// 将其限制为内存上限 -c0103b1b: c7 45 c8 00 00 00 38 movl $0x38000000,-0x38(%ebp) -c0103b22: c7 45 cc 00 00 00 00 movl $0x0,-0x34(%ebp) - } - if (begin < end) {// 如果起始地址小于结束地址 -c0103b29: 8b 45 d0 mov -0x30(%ebp),%eax -c0103b2c: 8b 55 d4 mov -0x2c(%ebp),%edx -c0103b2f: 3b 45 c8 cmp -0x38(%ebp),%eax -c0103b32: 89 d0 mov %edx,%eax -c0103b34: 1b 45 cc sbb -0x34(%ebp),%eax -c0103b37: 0f 83 8f 00 00 00 jae c0103bcc - begin = ROUNDUP(begin, PGSIZE);// 将起始地址对齐到页边界 -c0103b3d: c7 45 b0 00 10 00 00 movl $0x1000,-0x50(%ebp) -c0103b44: 8b 55 d0 mov -0x30(%ebp),%edx -c0103b47: 8b 45 b0 mov -0x50(%ebp),%eax -c0103b4a: 01 d0 add %edx,%eax -c0103b4c: 48 dec %eax -c0103b4d: 89 45 ac mov %eax,-0x54(%ebp) -c0103b50: 8b 45 ac mov -0x54(%ebp),%eax -c0103b53: ba 00 00 00 00 mov $0x0,%edx -c0103b58: f7 75 b0 divl -0x50(%ebp) -c0103b5b: 8b 45 ac mov -0x54(%ebp),%eax -c0103b5e: 29 d0 sub %edx,%eax -c0103b60: ba 00 00 00 00 mov $0x0,%edx -c0103b65: 89 45 d0 mov %eax,-0x30(%ebp) -c0103b68: 89 55 d4 mov %edx,-0x2c(%ebp) - end = ROUNDDOWN(end, PGSIZE);// 将结束地址对齐到页边界 -c0103b6b: 8b 45 c8 mov -0x38(%ebp),%eax -c0103b6e: 89 45 a8 mov %eax,-0x58(%ebp) -c0103b71: 8b 45 a8 mov -0x58(%ebp),%eax -c0103b74: ba 00 00 00 00 mov $0x0,%edx -c0103b79: 89 c3 mov %eax,%ebx -c0103b7b: 81 e3 00 f0 ff ff and $0xfffff000,%ebx -c0103b81: 89 de mov %ebx,%esi -c0103b83: 89 d0 mov %edx,%eax -c0103b85: 83 e0 00 and $0x0,%eax -c0103b88: 89 c7 mov %eax,%edi -c0103b8a: 89 75 c8 mov %esi,-0x38(%ebp) -c0103b8d: 89 7d cc mov %edi,-0x34(%ebp) - if (begin < end) {// 如果调整后的起始地址仍小于结束地址 -c0103b90: 8b 45 d0 mov -0x30(%ebp),%eax -c0103b93: 8b 55 d4 mov -0x2c(%ebp),%edx -c0103b96: 3b 45 c8 cmp -0x38(%ebp),%eax -c0103b99: 89 d0 mov %edx,%eax -c0103b9b: 1b 45 cc sbb -0x34(%ebp),%eax -c0103b9e: 73 2c jae c0103bcc - init_memmap(pa2page(begin), (end - begin) / PGSIZE);// 初始化内存页映射 -c0103ba0: 8b 45 c8 mov -0x38(%ebp),%eax -c0103ba3: 8b 55 cc mov -0x34(%ebp),%edx -c0103ba6: 2b 45 d0 sub -0x30(%ebp),%eax -c0103ba9: 1b 55 d4 sbb -0x2c(%ebp),%edx -c0103bac: 0f ac d0 0c shrd $0xc,%edx,%eax -c0103bb0: c1 ea 0c shr $0xc,%edx -c0103bb3: 89 c3 mov %eax,%ebx -c0103bb5: 8b 45 d0 mov -0x30(%ebp),%eax -c0103bb8: 89 04 24 mov %eax,(%esp) -c0103bbb: e8 94 f8 ff ff call c0103454 -c0103bc0: 89 5c 24 04 mov %ebx,0x4(%esp) -c0103bc4: 89 04 24 mov %eax,(%esp) -c0103bc7: e8 69 fb ff ff call c0103735 - for (i = 0; i < memmap->nr_map; i ++) {// 再次遍历内存映射 -c0103bcc: ff 45 dc incl -0x24(%ebp) -c0103bcf: 8b 45 c4 mov -0x3c(%ebp),%eax -c0103bd2: 8b 00 mov (%eax),%eax -c0103bd4: 39 45 dc cmp %eax,-0x24(%ebp) -c0103bd7: 0f 8c a7 fe ff ff jl c0103a84 - } - } + nr_free += n;// 更新空闲页的计数 +c01038b3: 8b 15 ec bf 12 c0 mov 0xc012bfec,%edx +c01038b9: 8b 45 0c mov 0xc(%ebp),%eax +c01038bc: 01 d0 add %edx,%eax +c01038be: a3 ec bf 12 c0 mov %eax,0xc012bfec +c01038c3: c7 45 9c e4 bf 12 c0 movl $0xc012bfe4,-0x64(%ebp) + return listelm->next; +c01038ca: 8b 45 9c mov -0x64(%ebp),%eax +c01038cd: 8b 40 04 mov 0x4(%eax),%eax + le = list_next(&free_list); +c01038d0: 89 45 f0 mov %eax,-0x10(%ebp) + while (le != &free_list) +c01038d3: eb 66 jmp c010393b + { + p = le2page(le, page_link); +c01038d5: 8b 45 f0 mov -0x10(%ebp),%eax +c01038d8: 83 e8 0c sub $0xc,%eax +c01038db: 89 45 f4 mov %eax,-0xc(%ebp) + if (base + base->property <= p) +c01038de: 8b 45 08 mov 0x8(%ebp),%eax +c01038e1: 8b 40 08 mov 0x8(%eax),%eax +c01038e4: c1 e0 05 shl $0x5,%eax +c01038e7: 89 c2 mov %eax,%edx +c01038e9: 8b 45 08 mov 0x8(%ebp),%eax +c01038ec: 01 d0 add %edx,%eax +c01038ee: 39 45 f4 cmp %eax,-0xc(%ebp) +c01038f1: 72 39 jb c010392c + { + assert(base + base->property != p); +c01038f3: 8b 45 08 mov 0x8(%ebp),%eax +c01038f6: 8b 40 08 mov 0x8(%eax),%eax +c01038f9: c1 e0 05 shl $0x5,%eax +c01038fc: 89 c2 mov %eax,%edx +c01038fe: 8b 45 08 mov 0x8(%ebp),%eax +c0103901: 01 d0 add %edx,%eax +c0103903: 39 45 f4 cmp %eax,-0xc(%ebp) +c0103906: 75 3e jne c0103946 +c0103908: c7 44 24 0c d9 a9 10 movl $0xc010a9d9,0xc(%esp) +c010390f: c0 +c0103910: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103917: c0 +c0103918: c7 44 24 04 ef 00 00 movl $0xef,0x4(%esp) +c010391f: 00 +c0103920: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103927: e8 19 d3 ff ff call c0100c45 <__panic> +c010392c: 8b 45 f0 mov -0x10(%ebp),%eax +c010392f: 89 45 98 mov %eax,-0x68(%ebp) +c0103932: 8b 45 98 mov -0x68(%ebp),%eax +c0103935: 8b 40 04 mov 0x4(%eax),%eax + break; } + le = list_next(le); +c0103938: 89 45 f0 mov %eax,-0x10(%ebp) + while (le != &free_list) +c010393b: 81 7d f0 e4 bf 12 c0 cmpl $0xc012bfe4,-0x10(%ebp) +c0103942: 75 91 jne c01038d5 +c0103944: eb 01 jmp c0103947 + break; +c0103946: 90 nop } + + list_add_before(le, &(base->page_link));// 将释放的页块添加到空闲列表中 +c0103947: 8b 45 08 mov 0x8(%ebp),%eax +c010394a: 8d 50 0c lea 0xc(%eax),%edx +c010394d: 8b 45 f0 mov -0x10(%ebp),%eax +c0103950: 89 45 94 mov %eax,-0x6c(%ebp) +c0103953: 89 55 90 mov %edx,-0x70(%ebp) + __list_add(elm, listelm->prev, listelm); +c0103956: 8b 45 94 mov -0x6c(%ebp),%eax +c0103959: 8b 00 mov (%eax),%eax +c010395b: 8b 55 90 mov -0x70(%ebp),%edx +c010395e: 89 55 8c mov %edx,-0x74(%ebp) +c0103961: 89 45 88 mov %eax,-0x78(%ebp) +c0103964: 8b 45 94 mov -0x6c(%ebp),%eax +c0103967: 89 45 84 mov %eax,-0x7c(%ebp) + prev->next = next->prev = elm; +c010396a: 8b 45 84 mov -0x7c(%ebp),%eax +c010396d: 8b 55 8c mov -0x74(%ebp),%edx +c0103970: 89 10 mov %edx,(%eax) +c0103972: 8b 45 84 mov -0x7c(%ebp),%eax +c0103975: 8b 10 mov (%eax),%edx +c0103977: 8b 45 88 mov -0x78(%ebp),%eax +c010397a: 89 50 04 mov %edx,0x4(%eax) + elm->next = next; +c010397d: 8b 45 8c mov -0x74(%ebp),%eax +c0103980: 8b 55 84 mov -0x7c(%ebp),%edx +c0103983: 89 50 04 mov %edx,0x4(%eax) + elm->prev = prev; +c0103986: 8b 45 8c mov -0x74(%ebp),%eax +c0103989: 8b 55 88 mov -0x78(%ebp),%edx +c010398c: 89 10 mov %edx,(%eax) +} +c010398e: 90 nop } -c0103bdd: 90 nop -c0103bde: 90 nop -c0103bdf: 81 c4 9c 00 00 00 add $0x9c,%esp -c0103be5: 5b pop %ebx -c0103be6: 5e pop %esi -c0103be7: 5f pop %edi -c0103be8: 5d pop %ebp -c0103be9: c3 ret +c010398f: 90 nop +} +c0103990: 90 nop +c0103991: 89 ec mov %ebp,%esp +c0103993: 5d pop %ebp +c0103994: c3 ret -c0103bea : -//la: 需要映射的线性地址(经过 x86 段映射后的地址) -// size: memory size size: 内存大小 -// pa: physical address of this memory pa:该内存的物理地址 -// perm: permission of this memory perm: 该内存的权限 -static void -boot_map_segment(pde_t *pgdir, uintptr_t la, size_t size, uintptr_t pa, uint32_t perm) { -c0103bea: f3 0f 1e fb endbr32 -c0103bee: 55 push %ebp -c0103bef: 89 e5 mov %esp,%ebp -c0103bf1: 83 ec 38 sub $0x38,%esp - // 确保线性地址和物理地址的页偏移相同 - assert(PGOFF(la) == PGOFF(pa)); -c0103bf4: 8b 45 0c mov 0xc(%ebp),%eax -c0103bf7: 33 45 14 xor 0x14(%ebp),%eax -c0103bfa: 25 ff 0f 00 00 and $0xfff,%eax -c0103bff: 85 c0 test %eax,%eax -c0103c01: 74 24 je c0103c27 -c0103c03: c7 44 24 0c 96 ac 10 movl $0xc010ac96,0xc(%esp) -c0103c0a: c0 -c0103c0b: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0103c12: c0 -c0103c13: c7 44 24 04 3b 01 00 movl $0x13b,0x4(%esp) -c0103c1a: 00 -c0103c1b: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0103c22: e8 1c c8 ff ff call c0100443 <__panic> - // 计算需要映射的页数,ROUNDUP 将总大小对齐到下一个页大小的边界 - size_t n = ROUNDUP(size + PGOFF(la), PGSIZE) / PGSIZE; -c0103c27: c7 45 f0 00 10 00 00 movl $0x1000,-0x10(%ebp) -c0103c2e: 8b 45 0c mov 0xc(%ebp),%eax -c0103c31: 25 ff 0f 00 00 and $0xfff,%eax -c0103c36: 89 c2 mov %eax,%edx -c0103c38: 8b 45 10 mov 0x10(%ebp),%eax -c0103c3b: 01 c2 add %eax,%edx -c0103c3d: 8b 45 f0 mov -0x10(%ebp),%eax -c0103c40: 01 d0 add %edx,%eax -c0103c42: 48 dec %eax -c0103c43: 89 45 ec mov %eax,-0x14(%ebp) -c0103c46: 8b 45 ec mov -0x14(%ebp),%eax -c0103c49: ba 00 00 00 00 mov $0x0,%edx -c0103c4e: f7 75 f0 divl -0x10(%ebp) -c0103c51: 8b 45 ec mov -0x14(%ebp),%eax -c0103c54: 29 d0 sub %edx,%eax -c0103c56: c1 e8 0c shr $0xc,%eax -c0103c59: 89 45 f4 mov %eax,-0xc(%ebp) - // 将线性地址向下对齐到页边界 - la = ROUNDDOWN(la, PGSIZE); -c0103c5c: 8b 45 0c mov 0xc(%ebp),%eax -c0103c5f: 89 45 e8 mov %eax,-0x18(%ebp) -c0103c62: 8b 45 e8 mov -0x18(%ebp),%eax -c0103c65: 25 00 f0 ff ff and $0xfffff000,%eax -c0103c6a: 89 45 0c mov %eax,0xc(%ebp) - // 将物理地址向下对齐到页边界 - pa = ROUNDDOWN(pa, PGSIZE); -c0103c6d: 8b 45 14 mov 0x14(%ebp),%eax -c0103c70: 89 45 e4 mov %eax,-0x1c(%ebp) -c0103c73: 8b 45 e4 mov -0x1c(%ebp),%eax -c0103c76: 25 00 f0 ff ff and $0xfffff000,%eax -c0103c7b: 89 45 14 mov %eax,0x14(%ebp) - // 循环遍历每一页,直到映射的页数为零 - for (; n > 0; n --, la += PGSIZE, pa += PGSIZE) { -c0103c7e: eb 68 jmp c0103ce8 - // 获取当前页的页表项指针,如果不存在则创建新的页表项 - pte_t *ptep = get_pte(pgdir, la, 1); -c0103c80: c7 44 24 08 01 00 00 movl $0x1,0x8(%esp) -c0103c87: 00 -c0103c88: 8b 45 0c mov 0xc(%ebp),%eax -c0103c8b: 89 44 24 04 mov %eax,0x4(%esp) -c0103c8f: 8b 45 08 mov 0x8(%ebp),%eax -c0103c92: 89 04 24 mov %eax,(%esp) -c0103c95: e8 8f 01 00 00 call c0103e29 -c0103c9a: 89 45 e0 mov %eax,-0x20(%ebp) - // 确保页表项指针不为空 - assert(ptep != NULL); -c0103c9d: 83 7d e0 00 cmpl $0x0,-0x20(%ebp) -c0103ca1: 75 24 jne c0103cc7 -c0103ca3: c7 44 24 0c c2 ac 10 movl $0xc010acc2,0xc(%esp) -c0103caa: c0 -c0103cab: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0103cb2: c0 -c0103cb3: c7 44 24 04 47 01 00 movl $0x147,0x4(%esp) -c0103cba: 00 -c0103cbb: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0103cc2: e8 7c c7 ff ff call c0100443 <__panic> - // 设置页表项,包含物理地址、存在位和权限 - *ptep = pa | PTE_P | perm; -c0103cc7: 8b 45 14 mov 0x14(%ebp),%eax -c0103cca: 0b 45 18 or 0x18(%ebp),%eax -c0103ccd: 83 c8 01 or $0x1,%eax -c0103cd0: 89 c2 mov %eax,%edx -c0103cd2: 8b 45 e0 mov -0x20(%ebp),%eax -c0103cd5: 89 10 mov %edx,(%eax) - for (; n > 0; n --, la += PGSIZE, pa += PGSIZE) { -c0103cd7: ff 4d f4 decl -0xc(%ebp) -c0103cda: 81 45 0c 00 10 00 00 addl $0x1000,0xc(%ebp) -c0103ce1: 81 45 14 00 10 00 00 addl $0x1000,0x14(%ebp) -c0103ce8: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0103cec: 75 92 jne c0103c80 - } -} -c0103cee: 90 nop -c0103cef: 90 nop -c0103cf0: c9 leave -c0103cf1: c3 ret - -c0103cf2 : -// return value: the kernel virtual address of this allocated page -//note: this function is used to get the memory for PDT(Page Directory Table)&PT(Page Table) -//boot_alloc_page - 使用 pmm->alloc_pages(1) 分配一页内存.返回值: 分配的页面的内核虚拟地址 -//注意: 此函数用于获取页目录表(PDT)和页表(PT)的内存 -static void * -boot_alloc_page(void) { -c0103cf2: f3 0f 1e fb endbr32 -c0103cf6: 55 push %ebp -c0103cf7: 89 e5 mov %esp,%ebp -c0103cf9: 83 ec 28 sub $0x28,%esp - struct Page *p = alloc_page();// 调用分配页面的函数 -c0103cfc: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0103d03: e8 51 fa ff ff call c0103759 -c0103d08: 89 45 f4 mov %eax,-0xc(%ebp) - if (p == NULL) {// 检查分配是否成功 -c0103d0b: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0103d0f: 75 1c jne c0103d2d - panic("boot_alloc_page failed.\n");// 如果分配失败,则触发异常 -c0103d11: c7 44 24 08 cf ac 10 movl $0xc010accf,0x8(%esp) -c0103d18: c0 -c0103d19: c7 44 24 04 56 01 00 movl $0x156,0x4(%esp) -c0103d20: 00 -c0103d21: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0103d28: e8 16 c7 ff ff call c0100443 <__panic> - } - return page2kva(p);// 返回分配页面的内核虚拟地址 -c0103d2d: 8b 45 f4 mov -0xc(%ebp),%eax -c0103d30: 89 04 24 mov %eax,(%esp) -c0103d33: e8 61 f7 ff ff call c0103499 -} -c0103d38: c9 leave -c0103d39: c3 ret - -c0103d3a : -//pmm_init - setup a pmm to manage physical memory, build PDT&PT to setup paging mechanism -// - check the correctness of pmm & paging mechanism, print PDT&PT -//pmm_init - 设置物理内存管理器,构建页目录表(PDT)和页表(PT),以设置分页机制 -// - 检查物理内存管理器和分页机制的正确性,打印页目录表和页表 -void -pmm_init(void) { -c0103d3a: f3 0f 1e fb endbr32 -c0103d3e: 55 push %ebp -c0103d3f: 89 e5 mov %esp,%ebp -c0103d41: 83 ec 38 sub $0x38,%esp - // We've already enabled paging - // 我们已经启用了分页 - boot_cr3 = PADDR(boot_pgdir); -c0103d44: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c0103d49: 89 45 f4 mov %eax,-0xc(%ebp) -c0103d4c: 81 7d f4 ff ff ff bf cmpl $0xbfffffff,-0xc(%ebp) -c0103d53: 77 23 ja c0103d78 -c0103d55: 8b 45 f4 mov -0xc(%ebp),%eax -c0103d58: 89 44 24 0c mov %eax,0xc(%esp) -c0103d5c: c7 44 24 08 64 ac 10 movl $0xc010ac64,0x8(%esp) -c0103d63: c0 -c0103d64: c7 44 24 04 63 01 00 movl $0x163,0x4(%esp) -c0103d6b: 00 -c0103d6c: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0103d73: e8 cb c6 ff ff call c0100443 <__panic> -c0103d78: 8b 45 f4 mov -0xc(%ebp),%eax -c0103d7b: 05 00 00 00 40 add $0x40000000,%eax -c0103d80: a3 b4 e0 12 c0 mov %eax,0xc012e0b4 - // 我们需要分配/释放物理内存(粒度为 4KB 或其他大小)。 - // 因此在 pmm.h 中定义了物理内存管理器的框架(struct pmm_manager)。 - // 首先,我们应该基于该框架初始化一个物理内存管理器(pmm)。 - // 然后 pmm 可以分配/释放物理内存。 - // 现在,first_fit/best_fit/worst_fit/buddy_system 的 pmm 都可用。 - init_pmm_manager();// 初始化物理内存管理器 -c0103d85: e8 73 f9 ff ff call c01036fd - - // detect physical memory space, reserve already used memory, - // then use pmm->init_memmap to create free page list - // 检测物理内存空间,保留已经使用的内存, - // 然后使用 pmm->init_memmap 创建空闲页面列表 - page_init();// 初始化页面管理 -c0103d8a: e8 9f fa ff ff call c010382e - - //use pmm->check to verify the correctness of the alloc/free function in a pmm - // 使用 pmm->check 验证 pmm 中分配/释放函数的正确性 - check_alloc_page();// 检查页面分配功能 -c0103d8f: e8 c7 04 00 00 call c010425b - - check_pgdir();// 检查页目录的状态 -c0103d94: e8 e5 04 00 00 call c010427e - - // recursively insert boot_pgdir in itself - // to form a virtual page table at virtual address VPT - // 递归地将 boot_pgdir 插入到自身中 - // 在虚拟地址 VPT 处形成虚拟页表 - boot_pgdir[PDX(VPT)] = PADDR(boot_pgdir) | PTE_P | PTE_W;// 设置页目录项,映射自身 -c0103d99: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c0103d9e: 89 45 f0 mov %eax,-0x10(%ebp) -c0103da1: 81 7d f0 ff ff ff bf cmpl $0xbfffffff,-0x10(%ebp) -c0103da8: 77 23 ja c0103dcd -c0103daa: 8b 45 f0 mov -0x10(%ebp),%eax -c0103dad: 89 44 24 0c mov %eax,0xc(%esp) -c0103db1: c7 44 24 08 64 ac 10 movl $0xc010ac64,0x8(%esp) -c0103db8: c0 -c0103db9: c7 44 24 04 83 01 00 movl $0x183,0x4(%esp) -c0103dc0: 00 -c0103dc1: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0103dc8: e8 76 c6 ff ff call c0100443 <__panic> -c0103dcd: 8b 45 f0 mov -0x10(%ebp),%eax -c0103dd0: 8d 90 00 00 00 40 lea 0x40000000(%eax),%edx -c0103dd6: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c0103ddb: 05 ac 0f 00 00 add $0xfac,%eax -c0103de0: 83 ca 03 or $0x3,%edx -c0103de3: 89 10 mov %edx,(%eax) - - // map all physical memory to linear memory with base linear addr KERNBASE - // linear_addr KERNBASE ~ KERNBASE + KMEMSIZE = phy_addr 0 ~ KMEMSIZE - // 将所有物理内存映射到线性内存,基地址为 KERNBASE - // 线性地址 KERNBASE ~ KERNBASE + KMEMSIZE = 物理地址 0 ~ KMEMSIZE - boot_map_segment(boot_pgdir, KERNBASE, KMEMSIZE, 0, PTE_W);// 映射物理内存 -c0103de5: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c0103dea: c7 44 24 10 02 00 00 movl $0x2,0x10(%esp) -c0103df1: 00 -c0103df2: c7 44 24 0c 00 00 00 movl $0x0,0xc(%esp) -c0103df9: 00 -c0103dfa: c7 44 24 08 00 00 00 movl $0x38000000,0x8(%esp) -c0103e01: 38 -c0103e02: c7 44 24 04 00 00 00 movl $0xc0000000,0x4(%esp) -c0103e09: c0 -c0103e0a: 89 04 24 mov %eax,(%esp) -c0103e0d: e8 d8 fd ff ff call c0103bea - // then set kernel stack (ss:esp) in TSS, setup TSS in gdt, load TSS - // 由于我们正在使用引导加载程序的 GDT, - // 我们应该重新加载 GDT(第二次,也是最后一次),以获取用户段和 TSS - // 映射虚拟地址 0 ~ 4G = 线性地址 0 ~ 4G - // 然后在 TSS 中设置内核栈 (ss:esp),在 gdt 中设置 TSS,加载 TSS - gdt_init();// 初始化全局描述符表 -c0103e12: e8 f8 f7 ff ff call c010360f - - //now the basic virtual memory map(see memalyout.h) is established. - //check the correctness of the basic virtual memory map. - // 现在基本的虚拟内存映射(见 memlayout.h)已建立。 - // 检查基础虚拟内存映射的正确性。 - check_boot_pgdir(); // 检查页目录的正确性 -c0103e17: e8 02 0b 00 00 call c010491e - - print_pgdir(); // 打印页目录表 -c0103e1c: e8 87 0f 00 00 call c0104da8 - kmalloc_init(); -c0103e21: e8 b9 28 00 00 call c01066df - -} -c0103e26: 90 nop -c0103e27: c9 leave -c0103e28: c3 ret - -c0103e29 : -// pgdir: 页目录的内核虚拟基地址 -// la: 需要映射的线性地址 -// create: 一个逻辑值,决定是否为页表分配一页 -// 返回值:该 PTE 的内核虚拟地址 -pte_t * -get_pte(pde_t *pgdir, uintptr_t la, bool create) { -c0103e29: f3 0f 1e fb endbr32 -c0103e2d: 55 push %ebp -c0103e2e: 89 e5 mov %esp,%ebp -c0103e30: 83 ec 38 sub $0x38,%esp - // (7) set page directory entry's permission - } - return NULL; // (8) return page table entry -#endif - // (1) 找到页目录项 - pde_t *pdep = &pgdir[PDX(la)];// 使用 PDX 宏获取页目录索引 -c0103e33: 8b 45 0c mov 0xc(%ebp),%eax -c0103e36: c1 e8 16 shr $0x16,%eax -c0103e39: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx -c0103e40: 8b 45 08 mov 0x8(%ebp),%eax -c0103e43: 01 d0 add %edx,%eax -c0103e45: 89 45 f4 mov %eax,-0xc(%ebp) - // (2) 检查页目录项是否存在 - if (!(*pdep & PTE_P)) {// 如果页目录项的存在位 PTE_P 没有被设置 -c0103e48: 8b 45 f4 mov -0xc(%ebp),%eax -c0103e4b: 8b 00 mov (%eax),%eax -c0103e4d: 83 e0 01 and $0x1,%eax -c0103e50: 85 c0 test %eax,%eax -c0103e52: 0f 85 af 00 00 00 jne c0103f07 - struct Page *page;// 声明一个指针,用于指向新分配的页面 - // 检查是否允许创建新页表,或者分配页表失败 - if (!create || (page = alloc_page()) == NULL) {// 如果不允许创建或分配失败 -c0103e58: 83 7d 10 00 cmpl $0x0,0x10(%ebp) -c0103e5c: 74 15 je c0103e73 -c0103e5e: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0103e65: e8 ef f8 ff ff call c0103759 -c0103e6a: 89 45 f0 mov %eax,-0x10(%ebp) -c0103e6d: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c0103e71: 75 0a jne c0103e7d - return NULL;// 返回 NULL,表示无法获取页表 -c0103e73: b8 00 00 00 00 mov $0x0,%eax -c0103e78: e9 e7 00 00 00 jmp c0103f64 - } - // 设置新分配页面的引用计数为 1 - set_page_ref(page, 1); -c0103e7d: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c0103e84: 00 -c0103e85: 8b 45 f0 mov -0x10(%ebp),%eax -c0103e88: 89 04 24 mov %eax,(%esp) -c0103e8b: e8 bd f6 ff ff call c010354d - uintptr_t pa = page2pa(page);// 获取新分配页面的物理地址 -c0103e90: 8b 45 f0 mov -0x10(%ebp),%eax -c0103e93: 89 04 24 mov %eax,(%esp) -c0103e96: e8 a3 f5 ff ff call c010343e -c0103e9b: 89 45 ec mov %eax,-0x14(%ebp) - memset(KADDR(pa), 0, PGSIZE);// 清空新分配的页表内容,初始化为零 -c0103e9e: 8b 45 ec mov -0x14(%ebp),%eax -c0103ea1: 89 45 e8 mov %eax,-0x18(%ebp) -c0103ea4: 8b 45 e8 mov -0x18(%ebp),%eax -c0103ea7: c1 e8 0c shr $0xc,%eax -c0103eaa: 89 45 e4 mov %eax,-0x1c(%ebp) -c0103ead: a1 80 bf 12 c0 mov 0xc012bf80,%eax -c0103eb2: 39 45 e4 cmp %eax,-0x1c(%ebp) -c0103eb5: 72 23 jb c0103eda -c0103eb7: 8b 45 e8 mov -0x18(%ebp),%eax -c0103eba: 89 44 24 0c mov %eax,0xc(%esp) -c0103ebe: c7 44 24 08 c0 ab 10 movl $0xc010abc0,0x8(%esp) -c0103ec5: c0 -c0103ec6: c7 44 24 04 dd 01 00 movl $0x1dd,0x4(%esp) -c0103ecd: 00 -c0103ece: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0103ed5: e8 69 c5 ff ff call c0100443 <__panic> -c0103eda: 8b 45 e8 mov -0x18(%ebp),%eax -c0103edd: 2d 00 00 00 40 sub $0x40000000,%eax -c0103ee2: c7 44 24 08 00 10 00 movl $0x1000,0x8(%esp) -c0103ee9: 00 -c0103eea: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c0103ef1: 00 -c0103ef2: 89 04 24 mov %eax,(%esp) -c0103ef5: e8 5a 5a 00 00 call c0109954 - // 更新页目录项,设置物理地址和权限位 - *pdep = pa | PTE_U | PTE_W | PTE_P;// 将物理地址和权限位(用户可访问、可写、有效)合并设置 -c0103efa: 8b 45 ec mov -0x14(%ebp),%eax -c0103efd: 83 c8 07 or $0x7,%eax -c0103f00: 89 c2 mov %eax,%edx -c0103f02: 8b 45 f4 mov -0xc(%ebp),%eax -c0103f05: 89 10 mov %edx,(%eax) - } - // 返回指定线性地址 la 对应的页表项的内核虚拟地址 - return &((pte_t *)KADDR(PDE_ADDR(*pdep)))[PTX(la)];// 计算并返回页表项的指针 -c0103f07: 8b 45 f4 mov -0xc(%ebp),%eax -c0103f0a: 8b 00 mov (%eax),%eax -c0103f0c: 25 00 f0 ff ff and $0xfffff000,%eax -c0103f11: 89 45 e0 mov %eax,-0x20(%ebp) -c0103f14: 8b 45 e0 mov -0x20(%ebp),%eax -c0103f17: c1 e8 0c shr $0xc,%eax -c0103f1a: 89 45 dc mov %eax,-0x24(%ebp) -c0103f1d: a1 80 bf 12 c0 mov 0xc012bf80,%eax -c0103f22: 39 45 dc cmp %eax,-0x24(%ebp) -c0103f25: 72 23 jb c0103f4a -c0103f27: 8b 45 e0 mov -0x20(%ebp),%eax -c0103f2a: 89 44 24 0c mov %eax,0xc(%esp) -c0103f2e: c7 44 24 08 c0 ab 10 movl $0xc010abc0,0x8(%esp) -c0103f35: c0 -c0103f36: c7 44 24 04 e2 01 00 movl $0x1e2,0x4(%esp) -c0103f3d: 00 -c0103f3e: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0103f45: e8 f9 c4 ff ff call c0100443 <__panic> -c0103f4a: 8b 45 e0 mov -0x20(%ebp),%eax -c0103f4d: 2d 00 00 00 40 sub $0x40000000,%eax -c0103f52: 89 c2 mov %eax,%edx -c0103f54: 8b 45 0c mov 0xc(%ebp),%eax -c0103f57: c1 e8 0c shr $0xc,%eax -c0103f5a: 25 ff 03 00 00 and $0x3ff,%eax -c0103f5f: c1 e0 02 shl $0x2,%eax -c0103f62: 01 d0 add %edx,%eax -} -c0103f64: c9 leave -c0103f65: c3 ret - -c0103f66 : - -//get_page - get related Page struct for linear address la using PDT pgdir -// get_page - 获取与线性地址 la 相关的 Page 结构体,使用页目录 pgdir -struct Page * -get_page(pde_t *pgdir, uintptr_t la, pte_t **ptep_store) { -c0103f66: f3 0f 1e fb endbr32 -c0103f6a: 55 push %ebp -c0103f6b: 89 e5 mov %esp,%ebp -c0103f6d: 83 ec 28 sub $0x28,%esp - // 调用 get_pte 函数获取对应线性地址 la 的页表项指针 - pte_t *ptep = get_pte(pgdir, la, 0); -c0103f70: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c0103f77: 00 -c0103f78: 8b 45 0c mov 0xc(%ebp),%eax -c0103f7b: 89 44 24 04 mov %eax,0x4(%esp) -c0103f7f: 8b 45 08 mov 0x8(%ebp),%eax -c0103f82: 89 04 24 mov %eax,(%esp) -c0103f85: e8 9f fe ff ff call c0103e29 -c0103f8a: 89 45 f4 mov %eax,-0xc(%ebp) - // 如果 ptep_store 指针不为 NULL,将 ptep 存储到 ptep_store 指向的位置 - if (ptep_store != NULL) { -c0103f8d: 83 7d 10 00 cmpl $0x0,0x10(%ebp) -c0103f91: 74 08 je c0103f9b - *ptep_store = ptep; // 存储当前页表项的指针 -c0103f93: 8b 45 10 mov 0x10(%ebp),%eax -c0103f96: 8b 55 f4 mov -0xc(%ebp),%edx -c0103f99: 89 10 mov %edx,(%eax) - } - // 检查 ptep 是否有效以及页表项的存在位 PTE_P 是否被设置 - if (ptep != NULL && *ptep & PTE_P) { -c0103f9b: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0103f9f: 74 1b je c0103fbc -c0103fa1: 8b 45 f4 mov -0xc(%ebp),%eax -c0103fa4: 8b 00 mov (%eax),%eax -c0103fa6: 83 e0 01 and $0x1,%eax -c0103fa9: 85 c0 test %eax,%eax -c0103fab: 74 0f je c0103fbc - // 返回与页表项对应的 Page 结构体 - return pte2page(*ptep);// 将页表项转换为对应的 Page 结构 -c0103fad: 8b 45 f4 mov -0xc(%ebp),%eax -c0103fb0: 8b 00 mov (%eax),%eax -c0103fb2: 89 04 24 mov %eax,(%esp) -c0103fb5: e8 33 f5 ff ff call c01034ed -c0103fba: eb 05 jmp c0103fc1 - } - // 如果未找到有效的页,返回 NULL - return NULL; -c0103fbc: b8 00 00 00 00 mov $0x0,%eax -} -c0103fc1: c9 leave -c0103fc2: c3 ret - -c0103fc3 : - -//page_remove_pte - free an Page sturct which is related linear address la -// - and clean(invalidate) pte which is related linear address la -//note: PT is changed, so the TLB need to be invalidate -static inline void -page_remove_pte(pde_t *pgdir, uintptr_t la, pte_t *ptep) { -c0103fc3: 55 push %ebp -c0103fc4: 89 e5 mov %esp,%ebp -c0103fc6: 83 ec 28 sub $0x28,%esp - //(4) and free this page when page reference reachs 0 - //(5) clear second page table entry - //(6) flush tlb - } -#endif - if (*ptep & PTE_P) { -c0103fc9: 8b 45 10 mov 0x10(%ebp),%eax -c0103fcc: 8b 00 mov (%eax),%eax -c0103fce: 83 e0 01 and $0x1,%eax -c0103fd1: 85 c0 test %eax,%eax -c0103fd3: 74 4d je c0104022 - struct Page *page = pte2page(*ptep);// 找到对应的物理页 -c0103fd5: 8b 45 10 mov 0x10(%ebp),%eax -c0103fd8: 8b 00 mov (%eax),%eax -c0103fda: 89 04 24 mov %eax,(%esp) -c0103fdd: e8 0b f5 ff ff call c01034ed -c0103fe2: 89 45 f4 mov %eax,-0xc(%ebp) - // 减少物理页的引用计数,如果引用计数为零,释放该物理页 - if (page_ref_dec(page) == 0) { -c0103fe5: 8b 45 f4 mov -0xc(%ebp),%eax -c0103fe8: 89 04 24 mov %eax,(%esp) -c0103feb: e8 82 f5 ff ff call c0103572 -c0103ff0: 85 c0 test %eax,%eax -c0103ff2: 75 13 jne c0104007 - free_page(page); -c0103ff4: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c0103ffb: 00 -c0103ffc: 8b 45 f4 mov -0xc(%ebp),%eax -c0103fff: 89 04 24 mov %eax,(%esp) -c0104002: e8 c1 f7 ff ff call c01037c8 - } - *ptep = 0;// 清除页表项 -c0104007: 8b 45 10 mov 0x10(%ebp),%eax -c010400a: c7 00 00 00 00 00 movl $0x0,(%eax) - tlb_invalidate(pgdir, la);// 刷新 TLB -c0104010: 8b 45 0c mov 0xc(%ebp),%eax -c0104013: 89 44 24 04 mov %eax,0x4(%esp) -c0104017: 8b 45 08 mov 0x8(%ebp),%eax -c010401a: 89 04 24 mov %eax,(%esp) -c010401d: e8 09 01 00 00 call c010412b - } -} -c0104022: 90 nop -c0104023: c9 leave -c0104024: c3 ret - -c0104025 : - -//page_remove - free an Page which is related linear address la and has an validated pte -//移除一个虚拟地址对应的页面 -void -page_remove(pde_t *pgdir, uintptr_t la) { -c0104025: f3 0f 1e fb endbr32 -c0104029: 55 push %ebp -c010402a: 89 e5 mov %esp,%ebp -c010402c: 83 ec 28 sub $0x28,%esp - //调用 get_pte 函数获取给定虚拟地址 la 对应的页表项指针 ptep。 - pte_t *ptep = get_pte(pgdir, la, 0); -c010402f: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c0104036: 00 -c0104037: 8b 45 0c mov 0xc(%ebp),%eax -c010403a: 89 44 24 04 mov %eax,0x4(%esp) -c010403e: 8b 45 08 mov 0x8(%ebp),%eax -c0104041: 89 04 24 mov %eax,(%esp) -c0104044: e8 e0 fd ff ff call c0103e29 -c0104049: 89 45 f4 mov %eax,-0xc(%ebp) - //如果 ptep 不为 NULL,则调用 page_remove_pte 函数移除该页表项。 - if (ptep != NULL) { -c010404c: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0104050: 74 19 je c010406b - page_remove_pte(pgdir, la, ptep); -c0104052: 8b 45 f4 mov -0xc(%ebp),%eax -c0104055: 89 44 24 08 mov %eax,0x8(%esp) -c0104059: 8b 45 0c mov 0xc(%ebp),%eax -c010405c: 89 44 24 04 mov %eax,0x4(%esp) -c0104060: 8b 45 08 mov 0x8(%ebp),%eax -c0104063: 89 04 24 mov %eax,(%esp) -c0104066: e8 58 ff ff ff call c0103fc3 - } -} -c010406b: 90 nop -c010406c: c9 leave -c010406d: c3 ret - -c010406e : -// perm: the permission of this Page which is setted in related pte -// return value: always 0 -//note: PT is changed, so the TLB need to be invalidate -//将一个页面插入到页表中。 -int -page_insert(pde_t *pgdir, struct Page *page, uintptr_t la, uint32_t perm) { -c010406e: f3 0f 1e fb endbr32 -c0104072: 55 push %ebp -c0104073: 89 e5 mov %esp,%ebp -c0104075: 83 ec 28 sub $0x28,%esp - //通过 get_pte 函数获取指定虚拟地址 la 对应的页表项指针 ptep。 - pte_t *ptep = get_pte(pgdir, la, 1); -c0104078: c7 44 24 08 01 00 00 movl $0x1,0x8(%esp) -c010407f: 00 -c0104080: 8b 45 10 mov 0x10(%ebp),%eax -c0104083: 89 44 24 04 mov %eax,0x4(%esp) -c0104087: 8b 45 08 mov 0x8(%ebp),%eax -c010408a: 89 04 24 mov %eax,(%esp) -c010408d: e8 97 fd ff ff call c0103e29 -c0104092: 89 45 f4 mov %eax,-0xc(%ebp) - //如果 ptep 为 NULL,表示内存分配失败,返回 -E_NO_MEM。 - if (ptep == NULL) { -c0104095: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0104099: 75 0a jne c01040a5 - return -E_NO_MEM; -c010409b: b8 fc ff ff ff mov $0xfffffffc,%eax -c01040a0: e9 84 00 00 00 jmp c0104129 - } - //调用 page_ref_inc 增加页面的引用计数。 - page_ref_inc(page); -c01040a5: 8b 45 0c mov 0xc(%ebp),%eax -c01040a8: 89 04 24 mov %eax,(%esp) -c01040ab: e8 ab f4 ff ff call c010355b - //如果页表项已存在且指向当前页面,则减少页面引用计数。 - if (*ptep & PTE_P) { -c01040b0: 8b 45 f4 mov -0xc(%ebp),%eax -c01040b3: 8b 00 mov (%eax),%eax -c01040b5: 83 e0 01 and $0x1,%eax -c01040b8: 85 c0 test %eax,%eax -c01040ba: 74 3e je c01040fa - struct Page *p = pte2page(*ptep); -c01040bc: 8b 45 f4 mov -0xc(%ebp),%eax -c01040bf: 8b 00 mov (%eax),%eax -c01040c1: 89 04 24 mov %eax,(%esp) -c01040c4: e8 24 f4 ff ff call c01034ed -c01040c9: 89 45 f0 mov %eax,-0x10(%ebp) - if (p == page) { -c01040cc: 8b 45 f0 mov -0x10(%ebp),%eax -c01040cf: 3b 45 0c cmp 0xc(%ebp),%eax -c01040d2: 75 0d jne c01040e1 - page_ref_dec(page); -c01040d4: 8b 45 0c mov 0xc(%ebp),%eax -c01040d7: 89 04 24 mov %eax,(%esp) -c01040da: e8 93 f4 ff ff call c0103572 -c01040df: eb 19 jmp c01040fa - } - //如果页表项已存在但指向其他页面,则调用 page_remove_pte 移除旧的页表项。 - else { - page_remove_pte(pgdir, la, ptep); -c01040e1: 8b 45 f4 mov -0xc(%ebp),%eax -c01040e4: 89 44 24 08 mov %eax,0x8(%esp) -c01040e8: 8b 45 10 mov 0x10(%ebp),%eax -c01040eb: 89 44 24 04 mov %eax,0x4(%esp) -c01040ef: 8b 45 08 mov 0x8(%ebp),%eax -c01040f2: 89 04 24 mov %eax,(%esp) -c01040f5: e8 c9 fe ff ff call c0103fc3 - } - } - *ptep = page2pa(page) | PTE_P | perm; -c01040fa: 8b 45 0c mov 0xc(%ebp),%eax -c01040fd: 89 04 24 mov %eax,(%esp) -c0104100: e8 39 f3 ff ff call c010343e -c0104105: 0b 45 14 or 0x14(%ebp),%eax -c0104108: 83 c8 01 or $0x1,%eax -c010410b: 89 c2 mov %eax,%edx -c010410d: 8b 45 f4 mov -0xc(%ebp),%eax -c0104110: 89 10 mov %edx,(%eax) - tlb_invalidate(pgdir, la);//刷新 TLB -c0104112: 8b 45 10 mov 0x10(%ebp),%eax -c0104115: 89 44 24 04 mov %eax,0x4(%esp) -c0104119: 8b 45 08 mov 0x8(%ebp),%eax -c010411c: 89 04 24 mov %eax,(%esp) -c010411f: e8 07 00 00 00 call c010412b - return 0; -c0104124: b8 00 00 00 00 mov $0x0,%eax -} -c0104129: c9 leave -c010412a: c3 ret - -c010412b : - -// invalidate a TLB entry, but only if the page tables being -// edited are the ones currently in use by the processor. -//无效化指定地址的TLB条目 -void -tlb_invalidate(pde_t *pgdir, uintptr_t la) { -c010412b: f3 0f 1e fb endbr32 -c010412f: 55 push %ebp -c0104130: 89 e5 mov %esp,%ebp -c0104132: 83 ec 28 sub $0x28,%esp -} - -static inline uintptr_t -rcr3(void) { - uintptr_t cr3; - asm volatile ("mov %%cr3, %0" : "=r" (cr3) :: "memory"); -c0104135: 0f 20 d8 mov %cr3,%eax -c0104138: 89 45 f0 mov %eax,-0x10(%ebp) - return cr3; -c010413b: 8b 55 f0 mov -0x10(%ebp),%edx - //检查当前页目录地址是否与传入的页目录地址相同。 - if (rcr3() == PADDR(pgdir)) { -c010413e: 8b 45 08 mov 0x8(%ebp),%eax -c0104141: 89 45 f4 mov %eax,-0xc(%ebp) -c0104144: 81 7d f4 ff ff ff bf cmpl $0xbfffffff,-0xc(%ebp) -c010414b: 77 23 ja c0104170 -c010414d: 8b 45 f4 mov -0xc(%ebp),%eax -c0104150: 89 44 24 0c mov %eax,0xc(%esp) -c0104154: c7 44 24 08 64 ac 10 movl $0xc010ac64,0x8(%esp) -c010415b: c0 -c010415c: c7 44 24 04 56 02 00 movl $0x256,0x4(%esp) -c0104163: 00 -c0104164: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c010416b: e8 d3 c2 ff ff call c0100443 <__panic> -c0104170: 8b 45 f4 mov -0xc(%ebp),%eax -c0104173: 05 00 00 00 40 add $0x40000000,%eax -c0104178: 39 d0 cmp %edx,%eax -c010417a: 75 0d jne c0104189 - //如果相同,则调用 invlpg 函数无效化指定线性地址的TLB条目。 - invlpg((void *)la); -c010417c: 8b 45 0c mov 0xc(%ebp),%eax -c010417f: 89 45 ec mov %eax,-0x14(%ebp) -} - -static inline void -invlpg(void *addr) { - asm volatile ("invlpg (%0)" :: "r" (addr) : "memory"); -c0104182: 8b 45 ec mov -0x14(%ebp),%eax -c0104185: 0f 01 38 invlpg (%eax) -} -c0104188: 90 nop - } -} -c0104189: 90 nop -c010418a: c9 leave -c010418b: c3 ret - -c010418c : -// pgdir_alloc_page - call alloc_page & page_insert functions to -// - allocate a page size memory & setup an addr map -// - pa<->la with linear address la and the PDT pgdir -//参数包括页目录指针 pgdir、线性地址 la 和权限 perm。 -struct Page * -pgdir_alloc_page(pde_t *pgdir, uintptr_t la, uint32_t perm) { -c010418c: f3 0f 1e fb endbr32 -c0104190: 55 push %ebp -c0104191: 89 e5 mov %esp,%ebp -c0104193: 83 ec 28 sub $0x28,%esp - struct Page *page = alloc_page();//分配一个新的页面存储在 page 指针中 -c0104196: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c010419d: e8 b7 f5 ff ff call c0103759 -c01041a2: 89 45 f4 mov %eax,-0xc(%ebp) - if (page != NULL) {//检查 page 是否不为 NULL,即分配是否成功。 -c01041a5: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c01041a9: 0f 84 a7 00 00 00 je c0104256 - if (page_insert(pgdir, page, la, perm) != 0) {//将页面插入到指定的线性地址 la 处。 -c01041af: 8b 45 10 mov 0x10(%ebp),%eax -c01041b2: 89 44 24 0c mov %eax,0xc(%esp) -c01041b6: 8b 45 0c mov 0xc(%ebp),%eax -c01041b9: 89 44 24 08 mov %eax,0x8(%esp) -c01041bd: 8b 45 f4 mov -0xc(%ebp),%eax -c01041c0: 89 44 24 04 mov %eax,0x4(%esp) -c01041c4: 8b 45 08 mov 0x8(%ebp),%eax -c01041c7: 89 04 24 mov %eax,(%esp) -c01041ca: e8 9f fe ff ff call c010406e -c01041cf: 85 c0 test %eax,%eax -c01041d1: 74 1a je c01041ed - free_page(page);//释放分配的页面。 -c01041d3: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c01041da: 00 -c01041db: 8b 45 f4 mov -0xc(%ebp),%eax -c01041de: 89 04 24 mov %eax,(%esp) -c01041e1: e8 e2 f5 ff ff call c01037c8 - return NULL;//返回 NULL,表示页面插入失败。 -c01041e6: b8 00 00 00 00 mov $0x0,%eax -c01041eb: eb 6c jmp c0104259 - } - if (swap_init_ok){//检查交换区是否已初始化成功 -c01041ed: a1 14 c0 12 c0 mov 0xc012c014,%eax -c01041f2: 85 c0 test %eax,%eax -c01041f4: 74 60 je c0104256 - //将页面映射到交换区。 - swap_map_swappable(check_mm_struct, la, page, 0); -c01041f6: a1 c4 e0 12 c0 mov 0xc012e0c4,%eax -c01041fb: c7 44 24 0c 00 00 00 movl $0x0,0xc(%esp) -c0104202: 00 -c0104203: 8b 55 f4 mov -0xc(%ebp),%edx -c0104206: 89 54 24 08 mov %edx,0x8(%esp) -c010420a: 8b 55 0c mov 0xc(%ebp),%edx -c010420d: 89 54 24 04 mov %edx,0x4(%esp) -c0104211: 89 04 24 mov %eax,(%esp) -c0104214: e8 d0 28 00 00 call c0106ae9 - //设置页面的虚拟地址 pra_vaddr 为 la - page->pra_vaddr=la; -c0104219: 8b 45 f4 mov -0xc(%ebp),%eax -c010421c: 8b 55 0c mov 0xc(%ebp),%edx -c010421f: 89 50 1c mov %edx,0x1c(%eax) - //断言页面的引用计数为1,确保页面没有被其他地方引用。 - assert(page_ref(page) == 1); -c0104222: 8b 45 f4 mov -0xc(%ebp),%eax -c0104225: 89 04 24 mov %eax,(%esp) -c0104228: e8 16 f3 ff ff call c0103543 -c010422d: 83 f8 01 cmp $0x1,%eax -c0104230: 74 24 je c0104256 -c0104232: c7 44 24 0c e8 ac 10 movl $0xc010ace8,0xc(%esp) -c0104239: c0 -c010423a: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104241: c0 -c0104242: c7 44 24 04 6e 02 00 movl $0x26e,0x4(%esp) -c0104249: 00 -c010424a: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104251: e8 ed c1 ff ff call c0100443 <__panic> - //cprintf("get No. %d page: pra_vaddr %x, pra_link.prev %x, pra_link_next %x in pgdir_alloc_page\n", (page-pages), page->pra_vaddr,page->pra_page_link.prev, page->pra_page_link.next); - } - - } - - return page; -c0104256: 8b 45 f4 mov -0xc(%ebp),%eax -} -c0104259: c9 leave -c010425a: c3 ret - -c010425b : - -static void -check_alloc_page(void) { -c010425b: f3 0f 1e fb endbr32 -c010425f: 55 push %ebp -c0104260: 89 e5 mov %esp,%ebp -c0104262: 83 ec 18 sub $0x18,%esp - //调用内存管理器的 check 方法,用于检查内存分配是否正常。 - pmm_manager->check(); -c0104265: a1 b0 e0 12 c0 mov 0xc012e0b0,%eax -c010426a: 8b 40 18 mov 0x18(%eax),%eax -c010426d: ff d0 call *%eax - cprintf("check_alloc_page() succeeded!\n"); -c010426f: c7 04 24 fc ac 10 c0 movl $0xc010acfc,(%esp) -c0104276: e8 5c c0 ff ff call c01002d7 -} -c010427b: 90 nop -c010427c: c9 leave -c010427d: c3 ret - -c010427e : - -//用于验证页目录和页表的正确性。 -static void -check_pgdir(void) { -c010427e: f3 0f 1e fb endbr32 -c0104282: 55 push %ebp -c0104283: 89 e5 mov %esp,%ebp -c0104285: 83 ec 38 sub $0x38,%esp - //确保内存页面数量在合理范围内 - assert(npage <= KMEMSIZE / PGSIZE); -c0104288: a1 80 bf 12 c0 mov 0xc012bf80,%eax -c010428d: 3d 00 80 03 00 cmp $0x38000,%eax -c0104292: 76 24 jbe c01042b8 -c0104294: c7 44 24 0c 1b ad 10 movl $0xc010ad1b,0xc(%esp) -c010429b: c0 -c010429c: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c01042a3: c0 -c01042a4: c7 44 24 04 82 02 00 movl $0x282,0x4(%esp) -c01042ab: 00 -c01042ac: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c01042b3: e8 8b c1 ff ff call c0100443 <__panic> - //确保页目录不为空且对齐, - assert(boot_pgdir != NULL && (uint32_t)PGOFF(boot_pgdir) == 0); -c01042b8: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c01042bd: 85 c0 test %eax,%eax -c01042bf: 74 0e je c01042cf -c01042c1: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c01042c6: 25 ff 0f 00 00 and $0xfff,%eax -c01042cb: 85 c0 test %eax,%eax -c01042cd: 74 24 je c01042f3 -c01042cf: c7 44 24 0c 38 ad 10 movl $0xc010ad38,0xc(%esp) -c01042d6: c0 -c01042d7: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c01042de: c0 -c01042df: c7 44 24 04 84 02 00 movl $0x284,0x4(%esp) -c01042e6: 00 -c01042e7: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c01042ee: e8 50 c1 ff ff call c0100443 <__panic> - //确保虚拟地址 0x0 没有映射任何页面 - assert(get_page(boot_pgdir, 0x0, NULL) == NULL); -c01042f3: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c01042f8: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c01042ff: 00 -c0104300: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c0104307: 00 -c0104308: 89 04 24 mov %eax,(%esp) -c010430b: e8 56 fc ff ff call c0103f66 -c0104310: 85 c0 test %eax,%eax -c0104312: 74 24 je c0104338 -c0104314: c7 44 24 0c 70 ad 10 movl $0xc010ad70,0xc(%esp) -c010431b: c0 -c010431c: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104323: c0 -c0104324: c7 44 24 04 86 02 00 movl $0x286,0x4(%esp) -c010432b: 00 -c010432c: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104333: e8 0b c1 ff ff call c0100443 <__panic> - - //定义两个页面指针 p1 和 p2 - struct Page *p1, *p2; - //分配一个页面 p1 - p1 = alloc_page(); -c0104338: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c010433f: e8 15 f4 ff ff call c0103759 -c0104344: 89 45 f4 mov %eax,-0xc(%ebp) - //将 p1 插入到虚拟地址 0x0 - assert(page_insert(boot_pgdir, p1, 0x0, 0) == 0); -c0104347: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c010434c: c7 44 24 0c 00 00 00 movl $0x0,0xc(%esp) -c0104353: 00 -c0104354: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c010435b: 00 -c010435c: 8b 55 f4 mov -0xc(%ebp),%edx -c010435f: 89 54 24 04 mov %edx,0x4(%esp) -c0104363: 89 04 24 mov %eax,(%esp) -c0104366: e8 03 fd ff ff call c010406e -c010436b: 85 c0 test %eax,%eax -c010436d: 74 24 je c0104393 -c010436f: c7 44 24 0c 98 ad 10 movl $0xc010ad98,0xc(%esp) -c0104376: c0 -c0104377: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c010437e: c0 -c010437f: c7 44 24 04 8d 02 00 movl $0x28d,0x4(%esp) -c0104386: 00 -c0104387: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c010438e: e8 b0 c0 ff ff call c0100443 <__panic> - - // 获取虚拟地址 0x0 对应的页表项指针 - pte_t *ptep; - assert((ptep = get_pte(boot_pgdir, 0x0, 0)) != NULL); -c0104393: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c0104398: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c010439f: 00 -c01043a0: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c01043a7: 00 -c01043a8: 89 04 24 mov %eax,(%esp) -c01043ab: e8 79 fa ff ff call c0103e29 -c01043b0: 89 45 f0 mov %eax,-0x10(%ebp) -c01043b3: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c01043b7: 75 24 jne c01043dd -c01043b9: c7 44 24 0c c4 ad 10 movl $0xc010adc4,0xc(%esp) -c01043c0: c0 -c01043c1: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c01043c8: c0 -c01043c9: c7 44 24 04 91 02 00 movl $0x291,0x4(%esp) -c01043d0: 00 -c01043d1: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c01043d8: e8 66 c0 ff ff call c0100443 <__panic> - // 验证页表项对应的页面是 p1 - assert(pte2page(*ptep) == p1); -c01043dd: 8b 45 f0 mov -0x10(%ebp),%eax -c01043e0: 8b 00 mov (%eax),%eax -c01043e2: 89 04 24 mov %eax,(%esp) -c01043e5: e8 03 f1 ff ff call c01034ed -c01043ea: 39 45 f4 cmp %eax,-0xc(%ebp) -c01043ed: 74 24 je c0104413 -c01043ef: c7 44 24 0c f1 ad 10 movl $0xc010adf1,0xc(%esp) -c01043f6: c0 -c01043f7: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c01043fe: c0 -c01043ff: c7 44 24 04 93 02 00 movl $0x293,0x4(%esp) -c0104406: 00 -c0104407: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c010440e: e8 30 c0 ff ff call c0100443 <__panic> - // 验证 p1 的引用计数为 1 - assert(page_ref(p1) == 1); -c0104413: 8b 45 f4 mov -0xc(%ebp),%eax -c0104416: 89 04 24 mov %eax,(%esp) -c0104419: e8 25 f1 ff ff call c0103543 -c010441e: 83 f8 01 cmp $0x1,%eax -c0104421: 74 24 je c0104447 -c0104423: c7 44 24 0c 07 ae 10 movl $0xc010ae07,0xc(%esp) -c010442a: c0 -c010442b: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104432: c0 -c0104433: c7 44 24 04 95 02 00 movl $0x295,0x4(%esp) -c010443a: 00 -c010443b: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104442: e8 fc bf ff ff call c0100443 <__panic> - // 获取虚拟地址 PGSIZE 对应的页表项指针 - ptep = &((pte_t *)KADDR(PDE_ADDR(boot_pgdir[0])))[1]; -c0104447: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c010444c: 8b 00 mov (%eax),%eax -c010444e: 25 00 f0 ff ff and $0xfffff000,%eax -c0104453: 89 45 ec mov %eax,-0x14(%ebp) -c0104456: 8b 45 ec mov -0x14(%ebp),%eax -c0104459: c1 e8 0c shr $0xc,%eax -c010445c: 89 45 e8 mov %eax,-0x18(%ebp) -c010445f: a1 80 bf 12 c0 mov 0xc012bf80,%eax -c0104464: 39 45 e8 cmp %eax,-0x18(%ebp) -c0104467: 72 23 jb c010448c -c0104469: 8b 45 ec mov -0x14(%ebp),%eax -c010446c: 89 44 24 0c mov %eax,0xc(%esp) -c0104470: c7 44 24 08 c0 ab 10 movl $0xc010abc0,0x8(%esp) -c0104477: c0 -c0104478: c7 44 24 04 97 02 00 movl $0x297,0x4(%esp) -c010447f: 00 -c0104480: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104487: e8 b7 bf ff ff call c0100443 <__panic> -c010448c: 8b 45 ec mov -0x14(%ebp),%eax -c010448f: 2d 00 00 00 40 sub $0x40000000,%eax -c0104494: 83 c0 04 add $0x4,%eax -c0104497: 89 45 f0 mov %eax,-0x10(%ebp) - assert(get_pte(boot_pgdir, PGSIZE, 0) == ptep); -c010449a: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c010449f: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c01044a6: 00 -c01044a7: c7 44 24 04 00 10 00 movl $0x1000,0x4(%esp) -c01044ae: 00 -c01044af: 89 04 24 mov %eax,(%esp) -c01044b2: e8 72 f9 ff ff call c0103e29 -c01044b7: 39 45 f0 cmp %eax,-0x10(%ebp) -c01044ba: 74 24 je c01044e0 -c01044bc: c7 44 24 0c 1c ae 10 movl $0xc010ae1c,0xc(%esp) -c01044c3: c0 -c01044c4: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c01044cb: c0 -c01044cc: c7 44 24 04 98 02 00 movl $0x298,0x4(%esp) -c01044d3: 00 -c01044d4: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c01044db: e8 63 bf ff ff call c0100443 <__panic> - // 分配一个页面 p2 - p2 = alloc_page(); -c01044e0: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c01044e7: e8 6d f2 ff ff call c0103759 -c01044ec: 89 45 e4 mov %eax,-0x1c(%ebp) - // 将 p2 插入到虚拟地址 PGSIZE,并设置用户和写权限 - assert(page_insert(boot_pgdir, p2, PGSIZE, PTE_U | PTE_W) == 0); -c01044ef: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c01044f4: c7 44 24 0c 06 00 00 movl $0x6,0xc(%esp) -c01044fb: 00 -c01044fc: c7 44 24 08 00 10 00 movl $0x1000,0x8(%esp) -c0104503: 00 -c0104504: 8b 55 e4 mov -0x1c(%ebp),%edx -c0104507: 89 54 24 04 mov %edx,0x4(%esp) -c010450b: 89 04 24 mov %eax,(%esp) -c010450e: e8 5b fb ff ff call c010406e -c0104513: 85 c0 test %eax,%eax -c0104515: 74 24 je c010453b -c0104517: c7 44 24 0c 44 ae 10 movl $0xc010ae44,0xc(%esp) -c010451e: c0 -c010451f: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104526: c0 -c0104527: c7 44 24 04 9c 02 00 movl $0x29c,0x4(%esp) -c010452e: 00 -c010452f: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104536: e8 08 bf ff ff call c0100443 <__panic> - // 获取虚拟地址 PGSIZE 对应的页表项指针 - assert((ptep = get_pte(boot_pgdir, PGSIZE, 0)) != NULL); -c010453b: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c0104540: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c0104547: 00 -c0104548: c7 44 24 04 00 10 00 movl $0x1000,0x4(%esp) -c010454f: 00 -c0104550: 89 04 24 mov %eax,(%esp) -c0104553: e8 d1 f8 ff ff call c0103e29 -c0104558: 89 45 f0 mov %eax,-0x10(%ebp) -c010455b: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c010455f: 75 24 jne c0104585 -c0104561: c7 44 24 0c 7c ae 10 movl $0xc010ae7c,0xc(%esp) -c0104568: c0 -c0104569: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104570: c0 -c0104571: c7 44 24 04 9e 02 00 movl $0x29e,0x4(%esp) -c0104578: 00 -c0104579: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104580: e8 be be ff ff call c0100443 <__panic> - // 验证页表项设置了用户权限 - assert(*ptep & PTE_U); -c0104585: 8b 45 f0 mov -0x10(%ebp),%eax -c0104588: 8b 00 mov (%eax),%eax -c010458a: 83 e0 04 and $0x4,%eax -c010458d: 85 c0 test %eax,%eax -c010458f: 75 24 jne c01045b5 -c0104591: c7 44 24 0c ac ae 10 movl $0xc010aeac,0xc(%esp) -c0104598: c0 -c0104599: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c01045a0: c0 -c01045a1: c7 44 24 04 a0 02 00 movl $0x2a0,0x4(%esp) -c01045a8: 00 -c01045a9: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c01045b0: e8 8e be ff ff call c0100443 <__panic> - // 验证页表项设置了写权限 - assert(*ptep & PTE_W); -c01045b5: 8b 45 f0 mov -0x10(%ebp),%eax -c01045b8: 8b 00 mov (%eax),%eax -c01045ba: 83 e0 02 and $0x2,%eax -c01045bd: 85 c0 test %eax,%eax -c01045bf: 75 24 jne c01045e5 -c01045c1: c7 44 24 0c ba ae 10 movl $0xc010aeba,0xc(%esp) -c01045c8: c0 -c01045c9: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c01045d0: c0 -c01045d1: c7 44 24 04 a2 02 00 movl $0x2a2,0x4(%esp) -c01045d8: 00 -c01045d9: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c01045e0: e8 5e be ff ff call c0100443 <__panic> - // 验证页目录项设置了用户权限 - assert(boot_pgdir[0] & PTE_U); -c01045e5: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c01045ea: 8b 00 mov (%eax),%eax -c01045ec: 83 e0 04 and $0x4,%eax -c01045ef: 85 c0 test %eax,%eax -c01045f1: 75 24 jne c0104617 -c01045f3: c7 44 24 0c c8 ae 10 movl $0xc010aec8,0xc(%esp) -c01045fa: c0 -c01045fb: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104602: c0 -c0104603: c7 44 24 04 a4 02 00 movl $0x2a4,0x4(%esp) -c010460a: 00 -c010460b: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104612: e8 2c be ff ff call c0100443 <__panic> - // 验证 p2 的引用计数为 1 - assert(page_ref(p2) == 1); -c0104617: 8b 45 e4 mov -0x1c(%ebp),%eax -c010461a: 89 04 24 mov %eax,(%esp) -c010461d: e8 21 ef ff ff call c0103543 -c0104622: 83 f8 01 cmp $0x1,%eax -c0104625: 74 24 je c010464b -c0104627: c7 44 24 0c de ae 10 movl $0xc010aede,0xc(%esp) -c010462e: c0 -c010462f: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104636: c0 -c0104637: c7 44 24 04 a6 02 00 movl $0x2a6,0x4(%esp) -c010463e: 00 -c010463f: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104646: e8 f8 bd ff ff call c0100443 <__panic> - - // 将 p1 插入到虚拟地址 PGSIZE,替换掉 p2 - assert(page_insert(boot_pgdir, p1, PGSIZE, 0) == 0); -c010464b: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c0104650: c7 44 24 0c 00 00 00 movl $0x0,0xc(%esp) -c0104657: 00 -c0104658: c7 44 24 08 00 10 00 movl $0x1000,0x8(%esp) -c010465f: 00 -c0104660: 8b 55 f4 mov -0xc(%ebp),%edx -c0104663: 89 54 24 04 mov %edx,0x4(%esp) -c0104667: 89 04 24 mov %eax,(%esp) -c010466a: e8 ff f9 ff ff call c010406e -c010466f: 85 c0 test %eax,%eax -c0104671: 74 24 je c0104697 -c0104673: c7 44 24 0c f0 ae 10 movl $0xc010aef0,0xc(%esp) -c010467a: c0 -c010467b: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104682: c0 -c0104683: c7 44 24 04 a9 02 00 movl $0x2a9,0x4(%esp) -c010468a: 00 -c010468b: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104692: e8 ac bd ff ff call c0100443 <__panic> - // 验证 p1 的引用计数增加到 2 - assert(page_ref(p1) == 2); -c0104697: 8b 45 f4 mov -0xc(%ebp),%eax -c010469a: 89 04 24 mov %eax,(%esp) -c010469d: e8 a1 ee ff ff call c0103543 -c01046a2: 83 f8 02 cmp $0x2,%eax -c01046a5: 74 24 je c01046cb -c01046a7: c7 44 24 0c 1c af 10 movl $0xc010af1c,0xc(%esp) -c01046ae: c0 -c01046af: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c01046b6: c0 -c01046b7: c7 44 24 04 ab 02 00 movl $0x2ab,0x4(%esp) -c01046be: 00 -c01046bf: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c01046c6: e8 78 bd ff ff call c0100443 <__panic> - // 验证 p2 的引用计数减少到 0 - assert(page_ref(p2) == 0); -c01046cb: 8b 45 e4 mov -0x1c(%ebp),%eax -c01046ce: 89 04 24 mov %eax,(%esp) -c01046d1: e8 6d ee ff ff call c0103543 -c01046d6: 85 c0 test %eax,%eax -c01046d8: 74 24 je c01046fe -c01046da: c7 44 24 0c 2e af 10 movl $0xc010af2e,0xc(%esp) -c01046e1: c0 -c01046e2: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c01046e9: c0 -c01046ea: c7 44 24 04 ad 02 00 movl $0x2ad,0x4(%esp) -c01046f1: 00 -c01046f2: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c01046f9: e8 45 bd ff ff call c0100443 <__panic> - // 获取虚拟地址 PGSIZE 对应的页表项指针 - assert((ptep = get_pte(boot_pgdir, PGSIZE, 0)) != NULL); -c01046fe: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c0104703: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c010470a: 00 -c010470b: c7 44 24 04 00 10 00 movl $0x1000,0x4(%esp) -c0104712: 00 -c0104713: 89 04 24 mov %eax,(%esp) -c0104716: e8 0e f7 ff ff call c0103e29 -c010471b: 89 45 f0 mov %eax,-0x10(%ebp) -c010471e: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c0104722: 75 24 jne c0104748 -c0104724: c7 44 24 0c 7c ae 10 movl $0xc010ae7c,0xc(%esp) -c010472b: c0 -c010472c: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104733: c0 -c0104734: c7 44 24 04 af 02 00 movl $0x2af,0x4(%esp) -c010473b: 00 -c010473c: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104743: e8 fb bc ff ff call c0100443 <__panic> - // 验证页表项对应的页面是 p1 - assert(pte2page(*ptep) == p1); -c0104748: 8b 45 f0 mov -0x10(%ebp),%eax -c010474b: 8b 00 mov (%eax),%eax -c010474d: 89 04 24 mov %eax,(%esp) -c0104750: e8 98 ed ff ff call c01034ed -c0104755: 39 45 f4 cmp %eax,-0xc(%ebp) -c0104758: 74 24 je c010477e -c010475a: c7 44 24 0c f1 ad 10 movl $0xc010adf1,0xc(%esp) -c0104761: c0 -c0104762: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104769: c0 -c010476a: c7 44 24 04 b1 02 00 movl $0x2b1,0x4(%esp) -c0104771: 00 -c0104772: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104779: e8 c5 bc ff ff call c0100443 <__panic> - // 验证页表项没有设置用户权限 - assert((*ptep & PTE_U) == 0); -c010477e: 8b 45 f0 mov -0x10(%ebp),%eax -c0104781: 8b 00 mov (%eax),%eax -c0104783: 83 e0 04 and $0x4,%eax -c0104786: 85 c0 test %eax,%eax -c0104788: 74 24 je c01047ae -c010478a: c7 44 24 0c 40 af 10 movl $0xc010af40,0xc(%esp) -c0104791: c0 -c0104792: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104799: c0 -c010479a: c7 44 24 04 b3 02 00 movl $0x2b3,0x4(%esp) -c01047a1: 00 -c01047a2: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c01047a9: e8 95 bc ff ff call c0100443 <__panic> - - //移除虚拟地址 0x0 的映射, - page_remove(boot_pgdir, 0x0); -c01047ae: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c01047b3: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c01047ba: 00 -c01047bb: 89 04 24 mov %eax,(%esp) -c01047be: e8 62 f8 ff ff call c0104025 - //验证 p1 的引用计数减少到 1。 - assert(page_ref(p1) == 1); -c01047c3: 8b 45 f4 mov -0xc(%ebp),%eax -c01047c6: 89 04 24 mov %eax,(%esp) -c01047c9: e8 75 ed ff ff call c0103543 -c01047ce: 83 f8 01 cmp $0x1,%eax -c01047d1: 74 24 je c01047f7 -c01047d3: c7 44 24 0c 07 ae 10 movl $0xc010ae07,0xc(%esp) -c01047da: c0 -c01047db: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c01047e2: c0 -c01047e3: c7 44 24 04 b8 02 00 movl $0x2b8,0x4(%esp) -c01047ea: 00 -c01047eb: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c01047f2: e8 4c bc ff ff call c0100443 <__panic> - //验证 p2 的引用计数减少到 0 - assert(page_ref(p2) == 0); -c01047f7: 8b 45 e4 mov -0x1c(%ebp),%eax -c01047fa: 89 04 24 mov %eax,(%esp) -c01047fd: e8 41 ed ff ff call c0103543 -c0104802: 85 c0 test %eax,%eax -c0104804: 74 24 je c010482a -c0104806: c7 44 24 0c 2e af 10 movl $0xc010af2e,0xc(%esp) -c010480d: c0 -c010480e: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104815: c0 -c0104816: c7 44 24 04 ba 02 00 movl $0x2ba,0x4(%esp) -c010481d: 00 -c010481e: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104825: e8 19 bc ff ff call c0100443 <__panic> - - //移除虚拟地址 PGSIZE 的映射, - page_remove(boot_pgdir, PGSIZE); -c010482a: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c010482f: c7 44 24 04 00 10 00 movl $0x1000,0x4(%esp) -c0104836: 00 -c0104837: 89 04 24 mov %eax,(%esp) -c010483a: e8 e6 f7 ff ff call c0104025 - //验证 p1 的引用计数减少到 0 - assert(page_ref(p1) == 0); -c010483f: 8b 45 f4 mov -0xc(%ebp),%eax -c0104842: 89 04 24 mov %eax,(%esp) -c0104845: e8 f9 ec ff ff call c0103543 -c010484a: 85 c0 test %eax,%eax -c010484c: 74 24 je c0104872 -c010484e: c7 44 24 0c 55 af 10 movl $0xc010af55,0xc(%esp) -c0104855: c0 -c0104856: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c010485d: c0 -c010485e: c7 44 24 04 bf 02 00 movl $0x2bf,0x4(%esp) -c0104865: 00 -c0104866: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c010486d: e8 d1 bb ff ff call c0100443 <__panic> - //验证 p2 的引用计数减少到 0 - assert(page_ref(p2) == 0); -c0104872: 8b 45 e4 mov -0x1c(%ebp),%eax -c0104875: 89 04 24 mov %eax,(%esp) -c0104878: e8 c6 ec ff ff call c0103543 -c010487d: 85 c0 test %eax,%eax -c010487f: 74 24 je c01048a5 -c0104881: c7 44 24 0c 2e af 10 movl $0xc010af2e,0xc(%esp) -c0104888: c0 -c0104889: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104890: c0 -c0104891: c7 44 24 04 c1 02 00 movl $0x2c1,0x4(%esp) -c0104898: 00 -c0104899: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c01048a0: e8 9e bb ff ff call c0100443 <__panic> - - //验证页目录的第一页表的引用计数为 1。 - assert(page_ref(pde2page(boot_pgdir[0])) == 1); -c01048a5: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c01048aa: 8b 00 mov (%eax),%eax -c01048ac: 89 04 24 mov %eax,(%esp) -c01048af: e8 77 ec ff ff call c010352b -c01048b4: 89 04 24 mov %eax,(%esp) -c01048b7: e8 87 ec ff ff call c0103543 -c01048bc: 83 f8 01 cmp $0x1,%eax -c01048bf: 74 24 je c01048e5 -c01048c1: c7 44 24 0c 68 af 10 movl $0xc010af68,0xc(%esp) -c01048c8: c0 -c01048c9: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c01048d0: c0 -c01048d1: c7 44 24 04 c4 02 00 movl $0x2c4,0x4(%esp) -c01048d8: 00 -c01048d9: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c01048e0: e8 5e bb ff ff call c0100443 <__panic> - //释放页目录的第一页表 - free_page(pde2page(boot_pgdir[0])); -c01048e5: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c01048ea: 8b 00 mov (%eax),%eax -c01048ec: 89 04 24 mov %eax,(%esp) -c01048ef: e8 37 ec ff ff call c010352b -c01048f4: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c01048fb: 00 -c01048fc: 89 04 24 mov %eax,(%esp) -c01048ff: e8 c4 ee ff ff call c01037c8 - //清空页目录的第一页表 - boot_pgdir[0] = 0; -c0104904: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c0104909: c7 00 00 00 00 00 movl $0x0,(%eax) +c0103995 : - cprintf("check_pgdir() succeeded!\n"); -c010490f: c7 04 24 8f af 10 c0 movl $0xc010af8f,(%esp) -c0104916: e8 bc b9 ff ff call c01002d7 +//用于返回当前系统中可用的空闲页的数量。 +static size_t +default_nr_free_pages(void) { +c0103995: 55 push %ebp +c0103996: 89 e5 mov %esp,%ebp + return nr_free;// 返回当前空闲页的数量 +c0103998: a1 ec bf 12 c0 mov 0xc012bfec,%eax } -c010491b: 90 nop -c010491c: c9 leave -c010491d: c3 ret +c010399d: 5d pop %ebp +c010399e: c3 ret -c010491e : +c010399f : -//检查内核页表 boot_pgdir 的正确性 +//basic_check 函数用于测试内存分配和释放的基本功能, +//确保在不同情况下内存管理系统的正确性,包括分配、释放、合并和引用计数等操作。 static void -check_boot_pgdir(void) { -c010491e: f3 0f 1e fb endbr32 -c0104922: 55 push %ebp -c0104923: 89 e5 mov %esp,%ebp -c0104925: 83 ec 38 sub $0x38,%esp - pte_t *ptep;// 定义一个指向页表项的指针 - int i; - for (i = 0; i < npage; i += PGSIZE) {// 遍历所有页面 -c0104928: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) -c010492f: e9 ca 00 00 00 jmp c01049fe - // 获取第 i 个页面的页表项,并确保其不为空 - assert((ptep = get_pte(boot_pgdir, (uintptr_t)KADDR(i), 0)) != NULL); -c0104934: 8b 45 f4 mov -0xc(%ebp),%eax -c0104937: 89 45 e4 mov %eax,-0x1c(%ebp) -c010493a: 8b 45 e4 mov -0x1c(%ebp),%eax -c010493d: c1 e8 0c shr $0xc,%eax -c0104940: 89 45 e0 mov %eax,-0x20(%ebp) -c0104943: a1 80 bf 12 c0 mov 0xc012bf80,%eax -c0104948: 39 45 e0 cmp %eax,-0x20(%ebp) -c010494b: 72 23 jb c0104970 -c010494d: 8b 45 e4 mov -0x1c(%ebp),%eax -c0104950: 89 44 24 0c mov %eax,0xc(%esp) -c0104954: c7 44 24 08 c0 ab 10 movl $0xc010abc0,0x8(%esp) -c010495b: c0 -c010495c: c7 44 24 04 d4 02 00 movl $0x2d4,0x4(%esp) -c0104963: 00 -c0104964: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c010496b: e8 d3 ba ff ff call c0100443 <__panic> -c0104970: 8b 45 e4 mov -0x1c(%ebp),%eax -c0104973: 2d 00 00 00 40 sub $0x40000000,%eax -c0104978: 89 c2 mov %eax,%edx -c010497a: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c010497f: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c0104986: 00 -c0104987: 89 54 24 04 mov %edx,0x4(%esp) -c010498b: 89 04 24 mov %eax,(%esp) -c010498e: e8 96 f4 ff ff call c0103e29 -c0104993: 89 45 dc mov %eax,-0x24(%ebp) -c0104996: 83 7d dc 00 cmpl $0x0,-0x24(%ebp) -c010499a: 75 24 jne c01049c0 -c010499c: c7 44 24 0c ac af 10 movl $0xc010afac,0xc(%esp) -c01049a3: c0 -c01049a4: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c01049ab: c0 -c01049ac: c7 44 24 04 d4 02 00 movl $0x2d4,0x4(%esp) -c01049b3: 00 -c01049b4: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c01049bb: e8 83 ba ff ff call c0100443 <__panic> - // 验证页表项的物理地址是否正确 - assert(PTE_ADDR(*ptep) == i); -c01049c0: 8b 45 dc mov -0x24(%ebp),%eax -c01049c3: 8b 00 mov (%eax),%eax -c01049c5: 25 00 f0 ff ff and $0xfffff000,%eax -c01049ca: 89 c2 mov %eax,%edx -c01049cc: 8b 45 f4 mov -0xc(%ebp),%eax -c01049cf: 39 c2 cmp %eax,%edx -c01049d1: 74 24 je c01049f7 -c01049d3: c7 44 24 0c e9 af 10 movl $0xc010afe9,0xc(%esp) -c01049da: c0 -c01049db: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c01049e2: c0 -c01049e3: c7 44 24 04 d6 02 00 movl $0x2d6,0x4(%esp) -c01049ea: 00 -c01049eb: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c01049f2: e8 4c ba ff ff call c0100443 <__panic> - for (i = 0; i < npage; i += PGSIZE) {// 遍历所有页面 -c01049f7: 81 45 f4 00 10 00 00 addl $0x1000,-0xc(%ebp) -c01049fe: 8b 55 f4 mov -0xc(%ebp),%edx -c0104a01: a1 80 bf 12 c0 mov 0xc012bf80,%eax -c0104a06: 39 c2 cmp %eax,%edx -c0104a08: 0f 82 26 ff ff ff jb c0104934 - } - // 验证页目录项的物理地址是否正确 - assert(PDE_ADDR(boot_pgdir[PDX(VPT)]) == PADDR(boot_pgdir)); -c0104a0e: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c0104a13: 05 ac 0f 00 00 add $0xfac,%eax -c0104a18: 8b 00 mov (%eax),%eax -c0104a1a: 25 00 f0 ff ff and $0xfffff000,%eax -c0104a1f: 89 c2 mov %eax,%edx -c0104a21: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c0104a26: 89 45 f0 mov %eax,-0x10(%ebp) -c0104a29: 81 7d f0 ff ff ff bf cmpl $0xbfffffff,-0x10(%ebp) -c0104a30: 77 23 ja c0104a55 -c0104a32: 8b 45 f0 mov -0x10(%ebp),%eax -c0104a35: 89 44 24 0c mov %eax,0xc(%esp) -c0104a39: c7 44 24 08 64 ac 10 movl $0xc010ac64,0x8(%esp) -c0104a40: c0 -c0104a41: c7 44 24 04 d9 02 00 movl $0x2d9,0x4(%esp) -c0104a48: 00 -c0104a49: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104a50: e8 ee b9 ff ff call c0100443 <__panic> -c0104a55: 8b 45 f0 mov -0x10(%ebp),%eax -c0104a58: 05 00 00 00 40 add $0x40000000,%eax -c0104a5d: 39 d0 cmp %edx,%eax -c0104a5f: 74 24 je c0104a85 -c0104a61: c7 44 24 0c 00 b0 10 movl $0xc010b000,0xc(%esp) -c0104a68: c0 -c0104a69: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104a70: c0 -c0104a71: c7 44 24 04 d9 02 00 movl $0x2d9,0x4(%esp) -c0104a78: 00 -c0104a79: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104a80: e8 be b9 ff ff call c0100443 <__panic> - - assert(boot_pgdir[0] == 0);// 确保页目录的第一个项为0 -c0104a85: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c0104a8a: 8b 00 mov (%eax),%eax -c0104a8c: 85 c0 test %eax,%eax -c0104a8e: 74 24 je c0104ab4 -c0104a90: c7 44 24 0c 34 b0 10 movl $0xc010b034,0xc(%esp) -c0104a97: c0 -c0104a98: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104a9f: c0 -c0104aa0: c7 44 24 04 db 02 00 movl $0x2db,0x4(%esp) -c0104aa7: 00 -c0104aa8: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104aaf: e8 8f b9 ff ff call c0100443 <__panic> - - struct Page *p;// 定义一个指向页面的指针 - p = alloc_page();// 分配一个页面 -c0104ab4: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0104abb: e8 99 ec ff ff call c0103759 -c0104ac0: 89 45 ec mov %eax,-0x14(%ebp) - // 将页面插入到虚拟地址 0x100,并确保操作成功 - assert(page_insert(boot_pgdir, p, 0x100, PTE_W) == 0); -c0104ac3: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c0104ac8: c7 44 24 0c 02 00 00 movl $0x2,0xc(%esp) -c0104acf: 00 -c0104ad0: c7 44 24 08 00 01 00 movl $0x100,0x8(%esp) -c0104ad7: 00 -c0104ad8: 8b 55 ec mov -0x14(%ebp),%edx -c0104adb: 89 54 24 04 mov %edx,0x4(%esp) -c0104adf: 89 04 24 mov %eax,(%esp) -c0104ae2: e8 87 f5 ff ff call c010406e -c0104ae7: 85 c0 test %eax,%eax -c0104ae9: 74 24 je c0104b0f -c0104aeb: c7 44 24 0c 48 b0 10 movl $0xc010b048,0xc(%esp) -c0104af2: c0 -c0104af3: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104afa: c0 -c0104afb: c7 44 24 04 e0 02 00 movl $0x2e0,0x4(%esp) -c0104b02: 00 -c0104b03: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104b0a: e8 34 b9 ff ff call c0100443 <__panic> - assert(page_ref(p) == 1);// 验证页面的引用计数为1 -c0104b0f: 8b 45 ec mov -0x14(%ebp),%eax -c0104b12: 89 04 24 mov %eax,(%esp) -c0104b15: e8 29 ea ff ff call c0103543 -c0104b1a: 83 f8 01 cmp $0x1,%eax -c0104b1d: 74 24 je c0104b43 -c0104b1f: c7 44 24 0c 76 b0 10 movl $0xc010b076,0xc(%esp) -c0104b26: c0 -c0104b27: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104b2e: c0 -c0104b2f: c7 44 24 04 e1 02 00 movl $0x2e1,0x4(%esp) -c0104b36: 00 -c0104b37: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104b3e: e8 00 b9 ff ff call c0100443 <__panic> - // 将页面插入到虚拟地址 0x100 + PGSIZE,并确保操作成功 - assert(page_insert(boot_pgdir, p, 0x100 + PGSIZE, PTE_W) == 0); -c0104b43: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c0104b48: c7 44 24 0c 02 00 00 movl $0x2,0xc(%esp) -c0104b4f: 00 -c0104b50: c7 44 24 08 00 11 00 movl $0x1100,0x8(%esp) -c0104b57: 00 -c0104b58: 8b 55 ec mov -0x14(%ebp),%edx -c0104b5b: 89 54 24 04 mov %edx,0x4(%esp) -c0104b5f: 89 04 24 mov %eax,(%esp) -c0104b62: e8 07 f5 ff ff call c010406e -c0104b67: 85 c0 test %eax,%eax -c0104b69: 74 24 je c0104b8f -c0104b6b: c7 44 24 0c 88 b0 10 movl $0xc010b088,0xc(%esp) -c0104b72: c0 -c0104b73: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104b7a: c0 -c0104b7b: c7 44 24 04 e3 02 00 movl $0x2e3,0x4(%esp) -c0104b82: 00 -c0104b83: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104b8a: e8 b4 b8 ff ff call c0100443 <__panic> - assert(page_ref(p) == 2);// 验证页面的引用计数为2 -c0104b8f: 8b 45 ec mov -0x14(%ebp),%eax -c0104b92: 89 04 24 mov %eax,(%esp) -c0104b95: e8 a9 e9 ff ff call c0103543 -c0104b9a: 83 f8 02 cmp $0x2,%eax -c0104b9d: 74 24 je c0104bc3 -c0104b9f: c7 44 24 0c bf b0 10 movl $0xc010b0bf,0xc(%esp) -c0104ba6: c0 -c0104ba7: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104bae: c0 -c0104baf: c7 44 24 04 e4 02 00 movl $0x2e4,0x4(%esp) -c0104bb6: 00 -c0104bb7: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104bbe: e8 80 b8 ff ff call c0100443 <__panic> +basic_check(void) { +c010399f: 55 push %ebp +c01039a0: 89 e5 mov %esp,%ebp +c01039a2: 83 ec 48 sub $0x48,%esp + struct Page *p0, *p1, *p2; + p0 = p1 = p2 = NULL; +c01039a5: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) +c01039ac: 8b 45 f4 mov -0xc(%ebp),%eax +c01039af: 89 45 f0 mov %eax,-0x10(%ebp) +c01039b2: 8b 45 f0 mov -0x10(%ebp),%eax +c01039b5: 89 45 ec mov %eax,-0x14(%ebp) + // 分配三个页面 + assert((p0 = alloc_page()) != NULL); +c01039b8: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c01039bf: e8 17 16 00 00 call c0104fdb +c01039c4: 89 45 ec mov %eax,-0x14(%ebp) +c01039c7: 83 7d ec 00 cmpl $0x0,-0x14(%ebp) +c01039cb: 75 24 jne c01039f1 +c01039cd: c7 44 24 0c f4 a9 10 movl $0xc010a9f4,0xc(%esp) +c01039d4: c0 +c01039d5: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c01039dc: c0 +c01039dd: c7 44 24 04 05 01 00 movl $0x105,0x4(%esp) +c01039e4: 00 +c01039e5: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c01039ec: e8 54 d2 ff ff call c0100c45 <__panic> + assert((p1 = alloc_page()) != NULL); +c01039f1: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c01039f8: e8 de 15 00 00 call c0104fdb +c01039fd: 89 45 f0 mov %eax,-0x10(%ebp) +c0103a00: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) +c0103a04: 75 24 jne c0103a2a +c0103a06: c7 44 24 0c 10 aa 10 movl $0xc010aa10,0xc(%esp) +c0103a0d: c0 +c0103a0e: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103a15: c0 +c0103a16: c7 44 24 04 06 01 00 movl $0x106,0x4(%esp) +c0103a1d: 00 +c0103a1e: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103a25: e8 1b d2 ff ff call c0100c45 <__panic> + assert((p2 = alloc_page()) != NULL); +c0103a2a: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c0103a31: e8 a5 15 00 00 call c0104fdb +c0103a36: 89 45 f4 mov %eax,-0xc(%ebp) +c0103a39: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0103a3d: 75 24 jne c0103a63 +c0103a3f: c7 44 24 0c 2c aa 10 movl $0xc010aa2c,0xc(%esp) +c0103a46: c0 +c0103a47: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103a4e: c0 +c0103a4f: c7 44 24 04 07 01 00 movl $0x107,0x4(%esp) +c0103a56: 00 +c0103a57: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103a5e: e8 e2 d1 ff ff call c0100c45 <__panic> + // 确保所有分配的页面是不同的 + assert(p0 != p1 && p0 != p2 && p1 != p2); +c0103a63: 8b 45 ec mov -0x14(%ebp),%eax +c0103a66: 3b 45 f0 cmp -0x10(%ebp),%eax +c0103a69: 74 10 je c0103a7b +c0103a6b: 8b 45 ec mov -0x14(%ebp),%eax +c0103a6e: 3b 45 f4 cmp -0xc(%ebp),%eax +c0103a71: 74 08 je c0103a7b +c0103a73: 8b 45 f0 mov -0x10(%ebp),%eax +c0103a76: 3b 45 f4 cmp -0xc(%ebp),%eax +c0103a79: 75 24 jne c0103a9f +c0103a7b: c7 44 24 0c 48 aa 10 movl $0xc010aa48,0xc(%esp) +c0103a82: c0 +c0103a83: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103a8a: c0 +c0103a8b: c7 44 24 04 09 01 00 movl $0x109,0x4(%esp) +c0103a92: 00 +c0103a93: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103a9a: e8 a6 d1 ff ff call c0100c45 <__panic> + // 确保页面的引用计数为 0 + assert(page_ref(p0) == 0 && page_ref(p1) == 0 && page_ref(p2) == 0); +c0103a9f: 8b 45 ec mov -0x14(%ebp),%eax +c0103aa2: 89 04 24 mov %eax,(%esp) +c0103aa5: e8 b9 f8 ff ff call c0103363 +c0103aaa: 85 c0 test %eax,%eax +c0103aac: 75 1e jne c0103acc +c0103aae: 8b 45 f0 mov -0x10(%ebp),%eax +c0103ab1: 89 04 24 mov %eax,(%esp) +c0103ab4: e8 aa f8 ff ff call c0103363 +c0103ab9: 85 c0 test %eax,%eax +c0103abb: 75 0f jne c0103acc +c0103abd: 8b 45 f4 mov -0xc(%ebp),%eax +c0103ac0: 89 04 24 mov %eax,(%esp) +c0103ac3: e8 9b f8 ff ff call c0103363 +c0103ac8: 85 c0 test %eax,%eax +c0103aca: 74 24 je c0103af0 +c0103acc: c7 44 24 0c 6c aa 10 movl $0xc010aa6c,0xc(%esp) +c0103ad3: c0 +c0103ad4: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103adb: c0 +c0103adc: c7 44 24 04 0b 01 00 movl $0x10b,0x4(%esp) +c0103ae3: 00 +c0103ae4: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103aeb: e8 55 d1 ff ff call c0100c45 <__panic> + // 确保页面地址在合法范围内 + assert(page2pa(p0) < npage * PGSIZE); +c0103af0: 8b 45 ec mov -0x14(%ebp),%eax +c0103af3: 89 04 24 mov %eax,(%esp) +c0103af6: e8 50 f8 ff ff call c010334b +c0103afb: 8b 15 04 c0 12 c0 mov 0xc012c004,%edx +c0103b01: c1 e2 0c shl $0xc,%edx +c0103b04: 39 d0 cmp %edx,%eax +c0103b06: 72 24 jb c0103b2c +c0103b08: c7 44 24 0c a8 aa 10 movl $0xc010aaa8,0xc(%esp) +c0103b0f: c0 +c0103b10: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103b17: c0 +c0103b18: c7 44 24 04 0d 01 00 movl $0x10d,0x4(%esp) +c0103b1f: 00 +c0103b20: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103b27: e8 19 d1 ff ff call c0100c45 <__panic> + assert(page2pa(p1) < npage * PGSIZE); +c0103b2c: 8b 45 f0 mov -0x10(%ebp),%eax +c0103b2f: 89 04 24 mov %eax,(%esp) +c0103b32: e8 14 f8 ff ff call c010334b +c0103b37: 8b 15 04 c0 12 c0 mov 0xc012c004,%edx +c0103b3d: c1 e2 0c shl $0xc,%edx +c0103b40: 39 d0 cmp %edx,%eax +c0103b42: 72 24 jb c0103b68 +c0103b44: c7 44 24 0c c5 aa 10 movl $0xc010aac5,0xc(%esp) +c0103b4b: c0 +c0103b4c: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103b53: c0 +c0103b54: c7 44 24 04 0e 01 00 movl $0x10e,0x4(%esp) +c0103b5b: 00 +c0103b5c: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103b63: e8 dd d0 ff ff call c0100c45 <__panic> + assert(page2pa(p2) < npage * PGSIZE); +c0103b68: 8b 45 f4 mov -0xc(%ebp),%eax +c0103b6b: 89 04 24 mov %eax,(%esp) +c0103b6e: e8 d8 f7 ff ff call c010334b +c0103b73: 8b 15 04 c0 12 c0 mov 0xc012c004,%edx +c0103b79: c1 e2 0c shl $0xc,%edx +c0103b7c: 39 d0 cmp %edx,%eax +c0103b7e: 72 24 jb c0103ba4 +c0103b80: c7 44 24 0c e2 aa 10 movl $0xc010aae2,0xc(%esp) +c0103b87: c0 +c0103b88: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103b8f: c0 +c0103b90: c7 44 24 04 0f 01 00 movl $0x10f,0x4(%esp) +c0103b97: 00 +c0103b98: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103b9f: e8 a1 d0 ff ff call c0100c45 <__panic> + // 保存当前的空闲页面链表和数量 + list_entry_t free_list_store = free_list; +c0103ba4: a1 e4 bf 12 c0 mov 0xc012bfe4,%eax +c0103ba9: 8b 15 e8 bf 12 c0 mov 0xc012bfe8,%edx +c0103baf: 89 45 d0 mov %eax,-0x30(%ebp) +c0103bb2: 89 55 d4 mov %edx,-0x2c(%ebp) +c0103bb5: c7 45 dc e4 bf 12 c0 movl $0xc012bfe4,-0x24(%ebp) + elm->prev = elm->next = elm; +c0103bbc: 8b 45 dc mov -0x24(%ebp),%eax +c0103bbf: 8b 55 dc mov -0x24(%ebp),%edx +c0103bc2: 89 50 04 mov %edx,0x4(%eax) +c0103bc5: 8b 45 dc mov -0x24(%ebp),%eax +c0103bc8: 8b 50 04 mov 0x4(%eax),%edx +c0103bcb: 8b 45 dc mov -0x24(%ebp),%eax +c0103bce: 89 10 mov %edx,(%eax) +} +c0103bd0: 90 nop +c0103bd1: c7 45 e0 e4 bf 12 c0 movl $0xc012bfe4,-0x20(%ebp) + return list->next == list; +c0103bd8: 8b 45 e0 mov -0x20(%ebp),%eax +c0103bdb: 8b 40 04 mov 0x4(%eax),%eax +c0103bde: 39 45 e0 cmp %eax,-0x20(%ebp) +c0103be1: 0f 94 c0 sete %al +c0103be4: 0f b6 c0 movzbl %al,%eax + list_init(&free_list);// 初始化空闲列表 + assert(list_empty(&free_list));// 确保空闲列表为空 +c0103be7: 85 c0 test %eax,%eax +c0103be9: 75 24 jne c0103c0f +c0103beb: c7 44 24 0c ff aa 10 movl $0xc010aaff,0xc(%esp) +c0103bf2: c0 +c0103bf3: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103bfa: c0 +c0103bfb: c7 44 24 04 13 01 00 movl $0x113,0x4(%esp) +c0103c02: 00 +c0103c03: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103c0a: e8 36 d0 ff ff call c0100c45 <__panic> - const char *str = "ucore: Hello world!!";// 定义一个字符串 -c0104bc3: c7 45 e8 d0 b0 10 c0 movl $0xc010b0d0,-0x18(%ebp) - strcpy((void *)0x100, str);// 将字符串复制到虚拟地址 0x100 -c0104bca: 8b 45 e8 mov -0x18(%ebp),%eax -c0104bcd: 89 44 24 04 mov %eax,0x4(%esp) -c0104bd1: c7 04 24 00 01 00 00 movl $0x100,(%esp) -c0104bd8: e8 93 4a 00 00 call c0109670 - // 验证两个映射地址的数据是否一致 - assert(strcmp((void *)0x100, (void *)(0x100 + PGSIZE)) == 0); -c0104bdd: c7 44 24 04 00 11 00 movl $0x1100,0x4(%esp) -c0104be4: 00 -c0104be5: c7 04 24 00 01 00 00 movl $0x100,(%esp) -c0104bec: e8 fd 4a 00 00 call c01096ee -c0104bf1: 85 c0 test %eax,%eax -c0104bf3: 74 24 je c0104c19 -c0104bf5: c7 44 24 0c e8 b0 10 movl $0xc010b0e8,0xc(%esp) -c0104bfc: c0 -c0104bfd: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104c04: c0 -c0104c05: c7 44 24 04 e9 02 00 movl $0x2e9,0x4(%esp) -c0104c0c: 00 -c0104c0d: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104c14: e8 2a b8 ff ff call c0100443 <__panic> - // 在页面的 0x100 偏移处设置字符串结束符 - *(char *)(page2kva(p) + 0x100) = '\0'; -c0104c19: 8b 45 ec mov -0x14(%ebp),%eax -c0104c1c: 89 04 24 mov %eax,(%esp) -c0104c1f: e8 75 e8 ff ff call c0103499 -c0104c24: 05 00 01 00 00 add $0x100,%eax -c0104c29: c6 00 00 movb $0x0,(%eax) - assert(strlen((const char *)0x100) == 0);// 验证字符串长度为0 -c0104c2c: c7 04 24 00 01 00 00 movl $0x100,(%esp) -c0104c33: e8 da 49 00 00 call c0109612 -c0104c38: 85 c0 test %eax,%eax -c0104c3a: 74 24 je c0104c60 -c0104c3c: c7 44 24 0c 20 b1 10 movl $0xc010b120,0xc(%esp) -c0104c43: c0 -c0104c44: c7 44 24 08 ad ac 10 movl $0xc010acad,0x8(%esp) -c0104c4b: c0 -c0104c4c: c7 44 24 04 ec 02 00 movl $0x2ec,0x4(%esp) -c0104c53: 00 -c0104c54: c7 04 24 88 ac 10 c0 movl $0xc010ac88,(%esp) -c0104c5b: e8 e3 b7 ff ff call c0100443 <__panic> + unsigned int nr_free_store = nr_free;// 保存当前空闲页数量 +c0103c0f: a1 ec bf 12 c0 mov 0xc012bfec,%eax +c0103c14: 89 45 e8 mov %eax,-0x18(%ebp) + nr_free = 0;// 将空闲页数量设为 0 +c0103c17: c7 05 ec bf 12 c0 00 movl $0x0,0xc012bfec +c0103c1e: 00 00 00 + // 请求分配页面,但当前没有空闲页面 + assert(alloc_page() == NULL); +c0103c21: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c0103c28: e8 ae 13 00 00 call c0104fdb +c0103c2d: 85 c0 test %eax,%eax +c0103c2f: 74 24 je c0103c55 +c0103c31: c7 44 24 0c 16 ab 10 movl $0xc010ab16,0xc(%esp) +c0103c38: c0 +c0103c39: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103c40: c0 +c0103c41: c7 44 24 04 18 01 00 movl $0x118,0x4(%esp) +c0103c48: 00 +c0103c49: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103c50: e8 f0 cf ff ff call c0100c45 <__panic> + // 释放之前分配的页面 + free_page(p0); +c0103c55: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c0103c5c: 00 +c0103c5d: 8b 45 ec mov -0x14(%ebp),%eax +c0103c60: 89 04 24 mov %eax,(%esp) +c0103c63: e8 e0 13 00 00 call c0105048 + free_page(p1); +c0103c68: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c0103c6f: 00 +c0103c70: 8b 45 f0 mov -0x10(%ebp),%eax +c0103c73: 89 04 24 mov %eax,(%esp) +c0103c76: e8 cd 13 00 00 call c0105048 + free_page(p2); +c0103c7b: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c0103c82: 00 +c0103c83: 8b 45 f4 mov -0xc(%ebp),%eax +c0103c86: 89 04 24 mov %eax,(%esp) +c0103c89: e8 ba 13 00 00 call c0105048 + assert(nr_free == 3);// 确保释放后空闲页数量为 3 +c0103c8e: a1 ec bf 12 c0 mov 0xc012bfec,%eax +c0103c93: 83 f8 03 cmp $0x3,%eax +c0103c96: 74 24 je c0103cbc +c0103c98: c7 44 24 0c 2b ab 10 movl $0xc010ab2b,0xc(%esp) +c0103c9f: c0 +c0103ca0: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103ca7: c0 +c0103ca8: c7 44 24 04 1d 01 00 movl $0x11d,0x4(%esp) +c0103caf: 00 +c0103cb0: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103cb7: e8 89 cf ff ff call c0100c45 <__panic> + // 再次分配三个页面 + assert((p0 = alloc_page()) != NULL); +c0103cbc: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c0103cc3: e8 13 13 00 00 call c0104fdb +c0103cc8: 89 45 ec mov %eax,-0x14(%ebp) +c0103ccb: 83 7d ec 00 cmpl $0x0,-0x14(%ebp) +c0103ccf: 75 24 jne c0103cf5 +c0103cd1: c7 44 24 0c f4 a9 10 movl $0xc010a9f4,0xc(%esp) +c0103cd8: c0 +c0103cd9: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103ce0: c0 +c0103ce1: c7 44 24 04 1f 01 00 movl $0x11f,0x4(%esp) +c0103ce8: 00 +c0103ce9: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103cf0: e8 50 cf ff ff call c0100c45 <__panic> + assert((p1 = alloc_page()) != NULL); +c0103cf5: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c0103cfc: e8 da 12 00 00 call c0104fdb +c0103d01: 89 45 f0 mov %eax,-0x10(%ebp) +c0103d04: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) +c0103d08: 75 24 jne c0103d2e +c0103d0a: c7 44 24 0c 10 aa 10 movl $0xc010aa10,0xc(%esp) +c0103d11: c0 +c0103d12: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103d19: c0 +c0103d1a: c7 44 24 04 20 01 00 movl $0x120,0x4(%esp) +c0103d21: 00 +c0103d22: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103d29: e8 17 cf ff ff call c0100c45 <__panic> + assert((p2 = alloc_page()) != NULL); +c0103d2e: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c0103d35: e8 a1 12 00 00 call c0104fdb +c0103d3a: 89 45 f4 mov %eax,-0xc(%ebp) +c0103d3d: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0103d41: 75 24 jne c0103d67 +c0103d43: c7 44 24 0c 2c aa 10 movl $0xc010aa2c,0xc(%esp) +c0103d4a: c0 +c0103d4b: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103d52: c0 +c0103d53: c7 44 24 04 21 01 00 movl $0x121,0x4(%esp) +c0103d5a: 00 +c0103d5b: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103d62: e8 de ce ff ff call c0100c45 <__panic> + // 测试空闲页面是否不足 + assert(alloc_page() == NULL); +c0103d67: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c0103d6e: e8 68 12 00 00 call c0104fdb +c0103d73: 85 c0 test %eax,%eax +c0103d75: 74 24 je c0103d9b +c0103d77: c7 44 24 0c 16 ab 10 movl $0xc010ab16,0xc(%esp) +c0103d7e: c0 +c0103d7f: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103d86: c0 +c0103d87: c7 44 24 04 23 01 00 movl $0x123,0x4(%esp) +c0103d8e: 00 +c0103d8f: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103d96: e8 aa ce ff ff call c0100c45 <__panic> + // 释放 p0,并检查空闲列表 + free_page(p0); +c0103d9b: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c0103da2: 00 +c0103da3: 8b 45 ec mov -0x14(%ebp),%eax +c0103da6: 89 04 24 mov %eax,(%esp) +c0103da9: e8 9a 12 00 00 call c0105048 +c0103dae: c7 45 d8 e4 bf 12 c0 movl $0xc012bfe4,-0x28(%ebp) +c0103db5: 8b 45 d8 mov -0x28(%ebp),%eax +c0103db8: 8b 40 04 mov 0x4(%eax),%eax +c0103dbb: 39 45 d8 cmp %eax,-0x28(%ebp) +c0103dbe: 0f 94 c0 sete %al +c0103dc1: 0f b6 c0 movzbl %al,%eax + assert(!list_empty(&free_list));// 确保空闲列表不为空 +c0103dc4: 85 c0 test %eax,%eax +c0103dc6: 74 24 je c0103dec +c0103dc8: c7 44 24 0c 38 ab 10 movl $0xc010ab38,0xc(%esp) +c0103dcf: c0 +c0103dd0: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103dd7: c0 +c0103dd8: c7 44 24 04 26 01 00 movl $0x126,0x4(%esp) +c0103ddf: 00 +c0103de0: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103de7: e8 59 ce ff ff call c0100c45 <__panic> - free_page(p);// 释放页面 p -c0104c60: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c0104c67: 00 -c0104c68: 8b 45 ec mov -0x14(%ebp),%eax -c0104c6b: 89 04 24 mov %eax,(%esp) -c0104c6e: e8 55 eb ff ff call c01037c8 - free_page(pde2page(boot_pgdir[0]));// 释放页目录项对应的页面 -c0104c73: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c0104c78: 8b 00 mov (%eax),%eax -c0104c7a: 89 04 24 mov %eax,(%esp) -c0104c7d: e8 a9 e8 ff ff call c010352b -c0104c82: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c0104c89: 00 -c0104c8a: 89 04 24 mov %eax,(%esp) -c0104c8d: e8 36 eb ff ff call c01037c8 - boot_pgdir[0] = 0;// 将页目录的第一个项设为0 -c0104c92: a1 e0 89 12 c0 mov 0xc01289e0,%eax -c0104c97: c7 00 00 00 00 00 movl $0x0,(%eax) + struct Page *p; + // 重新分配 p0,确保取回的是相同的页面 + assert((p = alloc_page()) == p0); +c0103dec: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c0103df3: e8 e3 11 00 00 call c0104fdb +c0103df8: 89 45 e4 mov %eax,-0x1c(%ebp) +c0103dfb: 8b 45 e4 mov -0x1c(%ebp),%eax +c0103dfe: 3b 45 ec cmp -0x14(%ebp),%eax +c0103e01: 74 24 je c0103e27 +c0103e03: c7 44 24 0c 50 ab 10 movl $0xc010ab50,0xc(%esp) +c0103e0a: c0 +c0103e0b: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103e12: c0 +c0103e13: c7 44 24 04 2a 01 00 movl $0x12a,0x4(%esp) +c0103e1a: 00 +c0103e1b: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103e22: e8 1e ce ff ff call c0100c45 <__panic> + assert(alloc_page() == NULL);// 确保没有更多的页面可分配 +c0103e27: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c0103e2e: e8 a8 11 00 00 call c0104fdb +c0103e33: 85 c0 test %eax,%eax +c0103e35: 74 24 je c0103e5b +c0103e37: c7 44 24 0c 16 ab 10 movl $0xc010ab16,0xc(%esp) +c0103e3e: c0 +c0103e3f: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103e46: c0 +c0103e47: c7 44 24 04 2b 01 00 movl $0x12b,0x4(%esp) +c0103e4e: 00 +c0103e4f: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103e56: e8 ea cd ff ff call c0100c45 <__panic> - cprintf("check_boot_pgdir() succeeded!\n");// 输出成功信息 -c0104c9d: c7 04 24 44 b1 10 c0 movl $0xc010b144,(%esp) -c0104ca4: e8 2e b6 ff ff call c01002d7 + assert(nr_free == 0);// 确保当前空闲页面数量为 0 +c0103e5b: a1 ec bf 12 c0 mov 0xc012bfec,%eax +c0103e60: 85 c0 test %eax,%eax +c0103e62: 74 24 je c0103e88 +c0103e64: c7 44 24 0c 69 ab 10 movl $0xc010ab69,0xc(%esp) +c0103e6b: c0 +c0103e6c: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103e73: c0 +c0103e74: c7 44 24 04 2d 01 00 movl $0x12d,0x4(%esp) +c0103e7b: 00 +c0103e7c: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103e83: e8 bd cd ff ff call c0100c45 <__panic> + // 恢复之前的空闲页面链表和数量 + free_list = free_list_store; +c0103e88: 8b 45 d0 mov -0x30(%ebp),%eax +c0103e8b: 8b 55 d4 mov -0x2c(%ebp),%edx +c0103e8e: a3 e4 bf 12 c0 mov %eax,0xc012bfe4 +c0103e93: 89 15 e8 bf 12 c0 mov %edx,0xc012bfe8 + nr_free = nr_free_store; +c0103e99: 8b 45 e8 mov -0x18(%ebp),%eax +c0103e9c: a3 ec bf 12 c0 mov %eax,0xc012bfec + // 释放最后的页面 + free_page(p); +c0103ea1: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c0103ea8: 00 +c0103ea9: 8b 45 e4 mov -0x1c(%ebp),%eax +c0103eac: 89 04 24 mov %eax,(%esp) +c0103eaf: e8 94 11 00 00 call c0105048 + free_page(p1); +c0103eb4: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c0103ebb: 00 +c0103ebc: 8b 45 f0 mov -0x10(%ebp),%eax +c0103ebf: 89 04 24 mov %eax,(%esp) +c0103ec2: e8 81 11 00 00 call c0105048 + free_page(p2); +c0103ec7: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c0103ece: 00 +c0103ecf: 8b 45 f4 mov -0xc(%ebp),%eax +c0103ed2: 89 04 24 mov %eax,(%esp) +c0103ed5: e8 6e 11 00 00 call c0105048 } -c0104ca9: 90 nop -c0104caa: c9 leave -c0104cab: c3 ret +c0103eda: 90 nop +c0103edb: 89 ec mov %ebp,%esp +c0103edd: 5d pop %ebp +c0103ede: c3 ret -c0104cac : - -//perm2str - use string 'u,r,w,-' to present the permission -static const char * -perm2str(int perm) { -c0104cac: f3 0f 1e fb endbr32 -c0104cb0: 55 push %ebp -c0104cb1: 89 e5 mov %esp,%ebp - //定义一个静态字符数组 str,长度为4 - static char str[4]; - //如果 perm 与 PTE_U 按位与的结果不为0,则 str[0] 设置为 'u',否则设置为 '-' - str[0] = (perm & PTE_U) ? 'u' : '-'; -c0104cb3: 8b 45 08 mov 0x8(%ebp),%eax -c0104cb6: 83 e0 04 and $0x4,%eax -c0104cb9: 85 c0 test %eax,%eax -c0104cbb: 74 04 je c0104cc1 -c0104cbd: b0 75 mov $0x75,%al -c0104cbf: eb 02 jmp c0104cc3 -c0104cc1: b0 2d mov $0x2d,%al -c0104cc3: a2 08 c0 12 c0 mov %al,0xc012c008 - //str[1] 始终设置为 'r' - str[1] = 'r'; -c0104cc8: c6 05 09 c0 12 c0 72 movb $0x72,0xc012c009 - //如果 perm 与 PTE_W 按位与的结果不为0,则 str[2] 设置为 'w',否则设置为 '-' - str[2] = (perm & PTE_W) ? 'w' : '-'; -c0104ccf: 8b 45 08 mov 0x8(%ebp),%eax -c0104cd2: 83 e0 02 and $0x2,%eax -c0104cd5: 85 c0 test %eax,%eax -c0104cd7: 74 04 je c0104cdd -c0104cd9: b0 77 mov $0x77,%al -c0104cdb: eb 02 jmp c0104cdf -c0104cdd: b0 2d mov $0x2d,%al -c0104cdf: a2 0a c0 12 c0 mov %al,0xc012c00a - //str[3] 设置为字符串结束符 \0 - str[3] = '\0'; -c0104ce4: c6 05 0b c0 12 c0 00 movb $0x0,0xc012c00b - return str; -c0104ceb: b8 08 c0 12 c0 mov $0xc012c008,%eax -} -c0104cf0: 5d pop %ebp -c0104cf1: c3 ret +c0103edf : -c0104cf2 : -// left_store: the pointer of the high side of table's next range -// right_store: the pointer of the low side of table's next range -// return value: 0 - not a invalid item range, perm - a valid item range with perm permission -//从页表中获取指定范围内的有效项,并根据权限进行处理。 -static int -get_pgtable_items(size_t left, size_t right, size_t start, uintptr_t *table, size_t *left_store, size_t *right_store) { -c0104cf2: f3 0f 1e fb endbr32 -c0104cf6: 55 push %ebp -c0104cf7: 89 e5 mov %esp,%ebp -c0104cf9: 83 ec 10 sub $0x10,%esp - if (start >= right) {// 检查起始索引是否超出右边界 -c0104cfc: 8b 45 10 mov 0x10(%ebp),%eax -c0104cff: 3b 45 0c cmp 0xc(%ebp),%eax -c0104d02: 72 0d jb c0104d11 - return 0;// 如果超出右边界,返回0 -c0104d04: b8 00 00 00 00 mov $0x0,%eax -c0104d09: e9 98 00 00 00 jmp c0104da6 - } - while (start < right && !(table[start] & PTE_P)) {// 查找第一个有效项(PTE_P位为1的项) - start ++;// 索引递增 -c0104d0e: ff 45 10 incl 0x10(%ebp) - while (start < right && !(table[start] & PTE_P)) {// 查找第一个有效项(PTE_P位为1的项) -c0104d11: 8b 45 10 mov 0x10(%ebp),%eax -c0104d14: 3b 45 0c cmp 0xc(%ebp),%eax -c0104d17: 73 18 jae c0104d31 -c0104d19: 8b 45 10 mov 0x10(%ebp),%eax -c0104d1c: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx -c0104d23: 8b 45 14 mov 0x14(%ebp),%eax -c0104d26: 01 d0 add %edx,%eax -c0104d28: 8b 00 mov (%eax),%eax -c0104d2a: 83 e0 01 and $0x1,%eax -c0104d2d: 85 c0 test %eax,%eax -c0104d2f: 74 dd je c0104d0e - } - if (start < right) {// 检查是否找到有效项 -c0104d31: 8b 45 10 mov 0x10(%ebp),%eax -c0104d34: 3b 45 0c cmp 0xc(%ebp),%eax -c0104d37: 73 68 jae c0104da1 - if (left_store != NULL) {// 如果left_store不为NULL -c0104d39: 83 7d 18 00 cmpl $0x0,0x18(%ebp) -c0104d3d: 74 08 je c0104d47 - *left_store = start;// 记录左边界索引 -c0104d3f: 8b 45 18 mov 0x18(%ebp),%eax -c0104d42: 8b 55 10 mov 0x10(%ebp),%edx -c0104d45: 89 10 mov %edx,(%eax) - } - int perm = (table[start ++] & PTE_USER);// 获取当前项的用户权限位并递增索引 -c0104d47: 8b 45 10 mov 0x10(%ebp),%eax -c0104d4a: 8d 50 01 lea 0x1(%eax),%edx -c0104d4d: 89 55 10 mov %edx,0x10(%ebp) -c0104d50: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx -c0104d57: 8b 45 14 mov 0x14(%ebp),%eax -c0104d5a: 01 d0 add %edx,%eax -c0104d5c: 8b 00 mov (%eax),%eax -c0104d5e: 83 e0 07 and $0x7,%eax -c0104d61: 89 45 fc mov %eax,-0x4(%ebp) - while (start < right && (table[start] & PTE_USER) == perm) {// 查找具有相同用户权限的连续项 -c0104d64: eb 03 jmp c0104d69 - start ++;// 索引递增 -c0104d66: ff 45 10 incl 0x10(%ebp) - while (start < right && (table[start] & PTE_USER) == perm) {// 查找具有相同用户权限的连续项 -c0104d69: 8b 45 10 mov 0x10(%ebp),%eax -c0104d6c: 3b 45 0c cmp 0xc(%ebp),%eax -c0104d6f: 73 1d jae c0104d8e -c0104d71: 8b 45 10 mov 0x10(%ebp),%eax -c0104d74: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx -c0104d7b: 8b 45 14 mov 0x14(%ebp),%eax -c0104d7e: 01 d0 add %edx,%eax -c0104d80: 8b 00 mov (%eax),%eax -c0104d82: 83 e0 07 and $0x7,%eax -c0104d85: 89 c2 mov %eax,%edx -c0104d87: 8b 45 fc mov -0x4(%ebp),%eax -c0104d8a: 39 c2 cmp %eax,%edx -c0104d8c: 74 d8 je c0104d66 - } - if (right_store != NULL) {// 如果right_store不为NULL -c0104d8e: 83 7d 1c 00 cmpl $0x0,0x1c(%ebp) -c0104d92: 74 08 je c0104d9c - *right_store = start;// 记录右边界索引 -c0104d94: 8b 45 1c mov 0x1c(%ebp),%eax -c0104d97: 8b 55 10 mov 0x10(%ebp),%edx -c0104d9a: 89 10 mov %edx,(%eax) - } - return perm;// 返回用户权限位 -c0104d9c: 8b 45 fc mov -0x4(%ebp),%eax -c0104d9f: eb 05 jmp c0104da6 +// LAB2: below code is used to check the first fit allocation algorithm (your EXERCISE 1) +// NOTICE: You SHOULD NOT CHANGE basic_check, default_check functions! +static void +default_check(void) { +c0103edf: 55 push %ebp +c0103ee0: 89 e5 mov %esp,%ebp +c0103ee2: 81 ec 98 00 00 00 sub $0x98,%esp + int count = 0, total = 0; +c0103ee8: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) +c0103eef: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%ebp) + list_entry_t *le = &free_list; +c0103ef6: c7 45 ec e4 bf 12 c0 movl $0xc012bfe4,-0x14(%ebp) + // 遍历空闲列表,计算空闲页面的数量和总属性值 + while ((le = list_next(le)) != &free_list) { +c0103efd: eb 6a jmp c0103f69 + struct Page *p = le2page(le, page_link); +c0103eff: 8b 45 ec mov -0x14(%ebp),%eax +c0103f02: 83 e8 0c sub $0xc,%eax +c0103f05: 89 45 d4 mov %eax,-0x2c(%ebp) + assert(PageProperty(p));// 确保每个页面的属性是有效的 +c0103f08: 8b 45 d4 mov -0x2c(%ebp),%eax +c0103f0b: 83 c0 04 add $0x4,%eax +c0103f0e: c7 45 d0 01 00 00 00 movl $0x1,-0x30(%ebp) +c0103f15: 89 45 cc mov %eax,-0x34(%ebp) + asm volatile ("btl %2, %1; sbbl %0,%0" : "=r" (oldbit) : "m" (*(volatile long *)addr), "Ir" (nr)); +c0103f18: 8b 45 cc mov -0x34(%ebp),%eax +c0103f1b: 8b 55 d0 mov -0x30(%ebp),%edx +c0103f1e: 0f a3 10 bt %edx,(%eax) +c0103f21: 19 c0 sbb %eax,%eax +c0103f23: 89 45 c8 mov %eax,-0x38(%ebp) + return oldbit != 0; +c0103f26: 83 7d c8 00 cmpl $0x0,-0x38(%ebp) +c0103f2a: 0f 95 c0 setne %al +c0103f2d: 0f b6 c0 movzbl %al,%eax +c0103f30: 85 c0 test %eax,%eax +c0103f32: 75 24 jne c0103f58 +c0103f34: c7 44 24 0c 76 ab 10 movl $0xc010ab76,0xc(%esp) +c0103f3b: c0 +c0103f3c: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103f43: c0 +c0103f44: c7 44 24 04 40 01 00 movl $0x140,0x4(%esp) +c0103f4b: 00 +c0103f4c: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103f53: e8 ed cc ff ff call c0100c45 <__panic> + count ++, total += p->property;// 累加页面属性 +c0103f58: ff 45 f4 incl -0xc(%ebp) +c0103f5b: 8b 45 d4 mov -0x2c(%ebp),%eax +c0103f5e: 8b 50 08 mov 0x8(%eax),%edx +c0103f61: 8b 45 f0 mov -0x10(%ebp),%eax +c0103f64: 01 d0 add %edx,%eax +c0103f66: 89 45 f0 mov %eax,-0x10(%ebp) +c0103f69: 8b 45 ec mov -0x14(%ebp),%eax +c0103f6c: 89 45 c4 mov %eax,-0x3c(%ebp) + return listelm->next; +c0103f6f: 8b 45 c4 mov -0x3c(%ebp),%eax +c0103f72: 8b 40 04 mov 0x4(%eax),%eax + while ((le = list_next(le)) != &free_list) { +c0103f75: 89 45 ec mov %eax,-0x14(%ebp) +c0103f78: 81 7d ec e4 bf 12 c0 cmpl $0xc012bfe4,-0x14(%ebp) +c0103f7f: 0f 85 7a ff ff ff jne c0103eff } - return 0;// 如果未找到有效项,返回0 -c0104da1: b8 00 00 00 00 mov $0x0,%eax -} -c0104da6: c9 leave -c0104da7: c3 ret + // 确保总属性值与空闲页面数量匹配 + assert(total == nr_free_pages()); +c0103f85: e8 f3 10 00 00 call c010507d +c0103f8a: 8b 55 f0 mov -0x10(%ebp),%edx +c0103f8d: 39 d0 cmp %edx,%eax +c0103f8f: 74 24 je c0103fb5 +c0103f91: c7 44 24 0c 86 ab 10 movl $0xc010ab86,0xc(%esp) +c0103f98: c0 +c0103f99: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103fa0: c0 +c0103fa1: c7 44 24 04 44 01 00 movl $0x144,0x4(%esp) +c0103fa8: 00 +c0103fa9: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103fb0: e8 90 cc ff ff call c0100c45 <__panic> + // 调用 basic_check 以验证基本的内存管理功能 + basic_check(); +c0103fb5: e8 e5 f9 ff ff call c010399f + // 分配 5 个页面 + struct Page *p0 = alloc_pages(5), *p1, *p2; +c0103fba: c7 04 24 05 00 00 00 movl $0x5,(%esp) +c0103fc1: e8 15 10 00 00 call c0104fdb +c0103fc6: 89 45 e8 mov %eax,-0x18(%ebp) + assert(p0 != NULL);// 确保成功分配 +c0103fc9: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) +c0103fcd: 75 24 jne c0103ff3 +c0103fcf: c7 44 24 0c 9f ab 10 movl $0xc010ab9f,0xc(%esp) +c0103fd6: c0 +c0103fd7: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0103fde: c0 +c0103fdf: c7 44 24 04 49 01 00 movl $0x149,0x4(%esp) +c0103fe6: 00 +c0103fe7: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0103fee: e8 52 cc ff ff call c0100c45 <__panic> + assert(!PageProperty(p0));// 确保分配的页面不带属性 +c0103ff3: 8b 45 e8 mov -0x18(%ebp),%eax +c0103ff6: 83 c0 04 add $0x4,%eax +c0103ff9: c7 45 c0 01 00 00 00 movl $0x1,-0x40(%ebp) +c0104000: 89 45 bc mov %eax,-0x44(%ebp) + asm volatile ("btl %2, %1; sbbl %0,%0" : "=r" (oldbit) : "m" (*(volatile long *)addr), "Ir" (nr)); +c0104003: 8b 45 bc mov -0x44(%ebp),%eax +c0104006: 8b 55 c0 mov -0x40(%ebp),%edx +c0104009: 0f a3 10 bt %edx,(%eax) +c010400c: 19 c0 sbb %eax,%eax +c010400e: 89 45 b8 mov %eax,-0x48(%ebp) + return oldbit != 0; +c0104011: 83 7d b8 00 cmpl $0x0,-0x48(%ebp) +c0104015: 0f 95 c0 setne %al +c0104018: 0f b6 c0 movzbl %al,%eax +c010401b: 85 c0 test %eax,%eax +c010401d: 74 24 je c0104043 +c010401f: c7 44 24 0c aa ab 10 movl $0xc010abaa,0xc(%esp) +c0104026: c0 +c0104027: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c010402e: c0 +c010402f: c7 44 24 04 4a 01 00 movl $0x14a,0x4(%esp) +c0104036: 00 +c0104037: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c010403e: e8 02 cc ff ff call c0100c45 <__panic> + // 初始化并检查空闲列表 + list_entry_t free_list_store = free_list; +c0104043: a1 e4 bf 12 c0 mov 0xc012bfe4,%eax +c0104048: 8b 15 e8 bf 12 c0 mov 0xc012bfe8,%edx +c010404e: 89 45 80 mov %eax,-0x80(%ebp) +c0104051: 89 55 84 mov %edx,-0x7c(%ebp) +c0104054: c7 45 b0 e4 bf 12 c0 movl $0xc012bfe4,-0x50(%ebp) + elm->prev = elm->next = elm; +c010405b: 8b 45 b0 mov -0x50(%ebp),%eax +c010405e: 8b 55 b0 mov -0x50(%ebp),%edx +c0104061: 89 50 04 mov %edx,0x4(%eax) +c0104064: 8b 45 b0 mov -0x50(%ebp),%eax +c0104067: 8b 50 04 mov 0x4(%eax),%edx +c010406a: 8b 45 b0 mov -0x50(%ebp),%eax +c010406d: 89 10 mov %edx,(%eax) +} +c010406f: 90 nop +c0104070: c7 45 b4 e4 bf 12 c0 movl $0xc012bfe4,-0x4c(%ebp) + return list->next == list; +c0104077: 8b 45 b4 mov -0x4c(%ebp),%eax +c010407a: 8b 40 04 mov 0x4(%eax),%eax +c010407d: 39 45 b4 cmp %eax,-0x4c(%ebp) +c0104080: 0f 94 c0 sete %al +c0104083: 0f b6 c0 movzbl %al,%eax + list_init(&free_list); + assert(list_empty(&free_list));// 确保空闲列表为空 +c0104086: 85 c0 test %eax,%eax +c0104088: 75 24 jne c01040ae +c010408a: c7 44 24 0c ff aa 10 movl $0xc010aaff,0xc(%esp) +c0104091: c0 +c0104092: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0104099: c0 +c010409a: c7 44 24 04 4e 01 00 movl $0x14e,0x4(%esp) +c01040a1: 00 +c01040a2: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c01040a9: e8 97 cb ff ff call c0100c45 <__panic> + assert(alloc_page() == NULL);// 确保没有页面可分配 +c01040ae: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c01040b5: e8 21 0f 00 00 call c0104fdb +c01040ba: 85 c0 test %eax,%eax +c01040bc: 74 24 je c01040e2 +c01040be: c7 44 24 0c 16 ab 10 movl $0xc010ab16,0xc(%esp) +c01040c5: c0 +c01040c6: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c01040cd: c0 +c01040ce: c7 44 24 04 4f 01 00 movl $0x14f,0x4(%esp) +c01040d5: 00 +c01040d6: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c01040dd: e8 63 cb ff ff call c0100c45 <__panic> -c0104da8 : + unsigned int nr_free_store = nr_free;// 保存当前空闲页数 +c01040e2: a1 ec bf 12 c0 mov 0xc012bfec,%eax +c01040e7: 89 45 e4 mov %eax,-0x1c(%ebp) + nr_free = 0;// 将空闲页数设为 0 +c01040ea: c7 05 ec bf 12 c0 00 movl $0x0,0xc012bfec +c01040f1: 00 00 00 + // 释放 3 个页面并确保分配页面时没有足够的空闲页 + free_pages(p0 + 2, 3); +c01040f4: 8b 45 e8 mov -0x18(%ebp),%eax +c01040f7: 83 c0 40 add $0x40,%eax +c01040fa: c7 44 24 04 03 00 00 movl $0x3,0x4(%esp) +c0104101: 00 +c0104102: 89 04 24 mov %eax,(%esp) +c0104105: e8 3e 0f 00 00 call c0105048 + assert(alloc_pages(4) == NULL);// 确保无法分配 4 个页面 +c010410a: c7 04 24 04 00 00 00 movl $0x4,(%esp) +c0104111: e8 c5 0e 00 00 call c0104fdb +c0104116: 85 c0 test %eax,%eax +c0104118: 74 24 je c010413e +c010411a: c7 44 24 0c bc ab 10 movl $0xc010abbc,0xc(%esp) +c0104121: c0 +c0104122: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0104129: c0 +c010412a: c7 44 24 04 55 01 00 movl $0x155,0x4(%esp) +c0104131: 00 +c0104132: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0104139: e8 07 cb ff ff call c0100c45 <__panic> + assert(PageProperty(p0 + 2) && p0[2].property == 3);// 检查页面属性 +c010413e: 8b 45 e8 mov -0x18(%ebp),%eax +c0104141: 83 c0 40 add $0x40,%eax +c0104144: 83 c0 04 add $0x4,%eax +c0104147: c7 45 ac 01 00 00 00 movl $0x1,-0x54(%ebp) +c010414e: 89 45 a8 mov %eax,-0x58(%ebp) + asm volatile ("btl %2, %1; sbbl %0,%0" : "=r" (oldbit) : "m" (*(volatile long *)addr), "Ir" (nr)); +c0104151: 8b 45 a8 mov -0x58(%ebp),%eax +c0104154: 8b 55 ac mov -0x54(%ebp),%edx +c0104157: 0f a3 10 bt %edx,(%eax) +c010415a: 19 c0 sbb %eax,%eax +c010415c: 89 45 a4 mov %eax,-0x5c(%ebp) + return oldbit != 0; +c010415f: 83 7d a4 00 cmpl $0x0,-0x5c(%ebp) +c0104163: 0f 95 c0 setne %al +c0104166: 0f b6 c0 movzbl %al,%eax +c0104169: 85 c0 test %eax,%eax +c010416b: 74 0e je c010417b +c010416d: 8b 45 e8 mov -0x18(%ebp),%eax +c0104170: 83 c0 40 add $0x40,%eax +c0104173: 8b 40 08 mov 0x8(%eax),%eax +c0104176: 83 f8 03 cmp $0x3,%eax +c0104179: 74 24 je c010419f +c010417b: c7 44 24 0c d4 ab 10 movl $0xc010abd4,0xc(%esp) +c0104182: c0 +c0104183: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c010418a: c0 +c010418b: c7 44 24 04 56 01 00 movl $0x156,0x4(%esp) +c0104192: 00 +c0104193: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c010419a: e8 a6 ca ff ff call c0100c45 <__panic> + assert((p1 = alloc_pages(3)) != NULL);// 再次分配 3 个页面 +c010419f: c7 04 24 03 00 00 00 movl $0x3,(%esp) +c01041a6: e8 30 0e 00 00 call c0104fdb +c01041ab: 89 45 e0 mov %eax,-0x20(%ebp) +c01041ae: 83 7d e0 00 cmpl $0x0,-0x20(%ebp) +c01041b2: 75 24 jne c01041d8 +c01041b4: c7 44 24 0c 00 ac 10 movl $0xc010ac00,0xc(%esp) +c01041bb: c0 +c01041bc: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c01041c3: c0 +c01041c4: c7 44 24 04 57 01 00 movl $0x157,0x4(%esp) +c01041cb: 00 +c01041cc: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c01041d3: e8 6d ca ff ff call c0100c45 <__panic> + assert(alloc_page() == NULL);// 确保没有页面可分配 +c01041d8: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c01041df: e8 f7 0d 00 00 call c0104fdb +c01041e4: 85 c0 test %eax,%eax +c01041e6: 74 24 je c010420c +c01041e8: c7 44 24 0c 16 ab 10 movl $0xc010ab16,0xc(%esp) +c01041ef: c0 +c01041f0: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c01041f7: c0 +c01041f8: c7 44 24 04 58 01 00 movl $0x158,0x4(%esp) +c01041ff: 00 +c0104200: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0104207: e8 39 ca ff ff call c0100c45 <__panic> + assert(p0 + 2 == p1);// 确保分配的页面是释放的页面 +c010420c: 8b 45 e8 mov -0x18(%ebp),%eax +c010420f: 83 c0 40 add $0x40,%eax +c0104212: 39 45 e0 cmp %eax,-0x20(%ebp) +c0104215: 74 24 je c010423b +c0104217: c7 44 24 0c 1e ac 10 movl $0xc010ac1e,0xc(%esp) +c010421e: c0 +c010421f: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0104226: c0 +c0104227: c7 44 24 04 59 01 00 movl $0x159,0x4(%esp) +c010422e: 00 +c010422f: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0104236: e8 0a ca ff ff call c0100c45 <__panic> -//print_pgdir - print the PDT&PT -void -print_pgdir(void) { -c0104da8: f3 0f 1e fb endbr32 -c0104dac: 55 push %ebp -c0104dad: 89 e5 mov %esp,%ebp -c0104daf: 57 push %edi -c0104db0: 56 push %esi -c0104db1: 53 push %ebx -c0104db2: 83 ec 4c sub $0x4c,%esp - cprintf("-------------------- BEGIN --------------------\n"); -c0104db5: c7 04 24 64 b1 10 c0 movl $0xc010b164,(%esp) -c0104dbc: e8 16 b5 ff ff call c01002d7 - // 定义变量 left, right 和 perm - size_t left, right = 0, perm; -c0104dc1: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp) - // 遍历页目录项 - while ((perm = get_pgtable_items(0, NPDEENTRY, right, vpd, &left, &right)) != 0) { -c0104dc8: e9 fa 00 00 00 jmp c0104ec7 - // 打印页目录项的信息 - cprintf("PDE(%03x) %08x-%08x %08x %s\n", right - left, -c0104dcd: 8b 45 e4 mov -0x1c(%ebp),%eax -c0104dd0: 89 04 24 mov %eax,(%esp) -c0104dd3: e8 d4 fe ff ff call c0104cac - left * PTSIZE, right * PTSIZE, (right - left) * PTSIZE, perm2str(perm)); -c0104dd8: 8b 4d dc mov -0x24(%ebp),%ecx -c0104ddb: 8b 55 e0 mov -0x20(%ebp),%edx -c0104dde: 29 d1 sub %edx,%ecx -c0104de0: 89 ca mov %ecx,%edx - cprintf("PDE(%03x) %08x-%08x %08x %s\n", right - left, -c0104de2: 89 d6 mov %edx,%esi -c0104de4: c1 e6 16 shl $0x16,%esi -c0104de7: 8b 55 dc mov -0x24(%ebp),%edx -c0104dea: 89 d3 mov %edx,%ebx -c0104dec: c1 e3 16 shl $0x16,%ebx -c0104def: 8b 55 e0 mov -0x20(%ebp),%edx -c0104df2: 89 d1 mov %edx,%ecx -c0104df4: c1 e1 16 shl $0x16,%ecx -c0104df7: 8b 7d dc mov -0x24(%ebp),%edi -c0104dfa: 8b 55 e0 mov -0x20(%ebp),%edx -c0104dfd: 29 d7 sub %edx,%edi -c0104dff: 89 fa mov %edi,%edx -c0104e01: 89 44 24 14 mov %eax,0x14(%esp) -c0104e05: 89 74 24 10 mov %esi,0x10(%esp) -c0104e09: 89 5c 24 0c mov %ebx,0xc(%esp) -c0104e0d: 89 4c 24 08 mov %ecx,0x8(%esp) -c0104e11: 89 54 24 04 mov %edx,0x4(%esp) -c0104e15: c7 04 24 95 b1 10 c0 movl $0xc010b195,(%esp) -c0104e1c: e8 b6 b4 ff ff call c01002d7 - // 计算页表项的起始和结束索引 - size_t l, r = left * NPTEENTRY; -c0104e21: 8b 45 e0 mov -0x20(%ebp),%eax -c0104e24: c1 e0 0a shl $0xa,%eax -c0104e27: 89 45 d4 mov %eax,-0x2c(%ebp) - // 遍历页表项 - while ((perm = get_pgtable_items(left * NPTEENTRY, right * NPTEENTRY, r, vpt, &l, &r)) != 0) { -c0104e2a: eb 54 jmp c0104e80 - // 打印页表项的信息 - cprintf(" |-- PTE(%05x) %08x-%08x %08x %s\n", r - l, -c0104e2c: 8b 45 e4 mov -0x1c(%ebp),%eax -c0104e2f: 89 04 24 mov %eax,(%esp) -c0104e32: e8 75 fe ff ff call c0104cac - l * PGSIZE, r * PGSIZE, (r - l) * PGSIZE, perm2str(perm)); -c0104e37: 8b 4d d4 mov -0x2c(%ebp),%ecx -c0104e3a: 8b 55 d8 mov -0x28(%ebp),%edx -c0104e3d: 29 d1 sub %edx,%ecx -c0104e3f: 89 ca mov %ecx,%edx - cprintf(" |-- PTE(%05x) %08x-%08x %08x %s\n", r - l, -c0104e41: 89 d6 mov %edx,%esi -c0104e43: c1 e6 0c shl $0xc,%esi -c0104e46: 8b 55 d4 mov -0x2c(%ebp),%edx -c0104e49: 89 d3 mov %edx,%ebx -c0104e4b: c1 e3 0c shl $0xc,%ebx -c0104e4e: 8b 55 d8 mov -0x28(%ebp),%edx -c0104e51: 89 d1 mov %edx,%ecx -c0104e53: c1 e1 0c shl $0xc,%ecx -c0104e56: 8b 7d d4 mov -0x2c(%ebp),%edi -c0104e59: 8b 55 d8 mov -0x28(%ebp),%edx -c0104e5c: 29 d7 sub %edx,%edi -c0104e5e: 89 fa mov %edi,%edx -c0104e60: 89 44 24 14 mov %eax,0x14(%esp) -c0104e64: 89 74 24 10 mov %esi,0x10(%esp) -c0104e68: 89 5c 24 0c mov %ebx,0xc(%esp) -c0104e6c: 89 4c 24 08 mov %ecx,0x8(%esp) -c0104e70: 89 54 24 04 mov %edx,0x4(%esp) -c0104e74: c7 04 24 b4 b1 10 c0 movl $0xc010b1b4,(%esp) -c0104e7b: e8 57 b4 ff ff call c01002d7 - while ((perm = get_pgtable_items(left * NPTEENTRY, right * NPTEENTRY, r, vpt, &l, &r)) != 0) { -c0104e80: be 00 00 c0 fa mov $0xfac00000,%esi -c0104e85: 8b 45 d4 mov -0x2c(%ebp),%eax -c0104e88: 8b 55 dc mov -0x24(%ebp),%edx -c0104e8b: 89 d3 mov %edx,%ebx -c0104e8d: c1 e3 0a shl $0xa,%ebx -c0104e90: 8b 55 e0 mov -0x20(%ebp),%edx -c0104e93: 89 d1 mov %edx,%ecx -c0104e95: c1 e1 0a shl $0xa,%ecx -c0104e98: 8d 55 d4 lea -0x2c(%ebp),%edx -c0104e9b: 89 54 24 14 mov %edx,0x14(%esp) -c0104e9f: 8d 55 d8 lea -0x28(%ebp),%edx -c0104ea2: 89 54 24 10 mov %edx,0x10(%esp) -c0104ea6: 89 74 24 0c mov %esi,0xc(%esp) -c0104eaa: 89 44 24 08 mov %eax,0x8(%esp) -c0104eae: 89 5c 24 04 mov %ebx,0x4(%esp) -c0104eb2: 89 0c 24 mov %ecx,(%esp) -c0104eb5: e8 38 fe ff ff call c0104cf2 -c0104eba: 89 45 e4 mov %eax,-0x1c(%ebp) -c0104ebd: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) -c0104ec1: 0f 85 65 ff ff ff jne c0104e2c - while ((perm = get_pgtable_items(0, NPDEENTRY, right, vpd, &left, &right)) != 0) { -c0104ec7: b9 00 b0 fe fa mov $0xfafeb000,%ecx -c0104ecc: 8b 45 dc mov -0x24(%ebp),%eax -c0104ecf: 8d 55 dc lea -0x24(%ebp),%edx -c0104ed2: 89 54 24 14 mov %edx,0x14(%esp) -c0104ed6: 8d 55 e0 lea -0x20(%ebp),%edx -c0104ed9: 89 54 24 10 mov %edx,0x10(%esp) -c0104edd: 89 4c 24 0c mov %ecx,0xc(%esp) -c0104ee1: 89 44 24 08 mov %eax,0x8(%esp) -c0104ee5: c7 44 24 04 00 04 00 movl $0x400,0x4(%esp) -c0104eec: 00 -c0104eed: c7 04 24 00 00 00 00 movl $0x0,(%esp) -c0104ef4: e8 f9 fd ff ff call c0104cf2 -c0104ef9: 89 45 e4 mov %eax,-0x1c(%ebp) -c0104efc: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) -c0104f00: 0f 85 c7 fe ff ff jne c0104dcd - } - } - cprintf("--------------------- END ---------------------\n"); -c0104f06: c7 04 24 d8 b1 10 c0 movl $0xc010b1d8,(%esp) -c0104f0d: e8 c5 b3 ff ff call c01002d7 -} -c0104f12: 90 nop -c0104f13: 83 c4 4c add $0x4c,%esp -c0104f16: 5b pop %ebx -c0104f17: 5e pop %esi -c0104f18: 5f pop %edi -c0104f19: 5d pop %ebp -c0104f1a: c3 ret - -c0104f1b <_fifo_init_mm>: - * (2) _fifo_init_mm: init pra_list_head and let mm->sm_priv point to the addr of pra_list_head. - * Now, From the memory control struct mm_struct, we can access FIFO PRA - */ -static int -_fifo_init_mm(struct mm_struct *mm) -{ -c0104f1b: f3 0f 1e fb endbr32 -c0104f1f: 55 push %ebp -c0104f20: 89 e5 mov %esp,%ebp -c0104f22: 83 ec 10 sub $0x10,%esp -c0104f25: c7 45 fc bc e0 12 c0 movl $0xc012e0bc,-0x4(%ebp) - * list_init - initialize a new entry - * @elm: new entry to be initialized - * */ -static inline void -list_init(list_entry_t *elm) { - elm->prev = elm->next = elm; -c0104f2c: 8b 45 fc mov -0x4(%ebp),%eax -c0104f2f: 8b 55 fc mov -0x4(%ebp),%edx -c0104f32: 89 50 04 mov %edx,0x4(%eax) -c0104f35: 8b 45 fc mov -0x4(%ebp),%eax -c0104f38: 8b 50 04 mov 0x4(%eax),%edx -c0104f3b: 8b 45 fc mov -0x4(%ebp),%eax -c0104f3e: 89 10 mov %edx,(%eax) -} -c0104f40: 90 nop - //初始化一个链表头 pra_list_head - list_init(&pra_list_head); - //将 mm 结构中的 sm_priv 字段指向这个链表头 - mm->sm_priv = &pra_list_head; -c0104f41: 8b 45 08 mov 0x8(%ebp),%eax -c0104f44: c7 40 14 bc e0 12 c0 movl $0xc012e0bc,0x14(%eax) - //cprintf(" mm->sm_priv %x in fifo_init_mm\n",mm->sm_priv); - //返回 0 表示成功 - return 0; -c0104f4b: b8 00 00 00 00 mov $0x0,%eax + p2 = p0 + 1;// 设置 p2 为 p0 的下一个页面 +c010423b: 8b 45 e8 mov -0x18(%ebp),%eax +c010423e: 83 c0 20 add $0x20,%eax +c0104241: 89 45 dc mov %eax,-0x24(%ebp) + free_page(p0);// 释放 p0 页面 +c0104244: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c010424b: 00 +c010424c: 8b 45 e8 mov -0x18(%ebp),%eax +c010424f: 89 04 24 mov %eax,(%esp) +c0104252: e8 f1 0d 00 00 call c0105048 + free_pages(p1, 3);// 释放 p1 指向的页面 +c0104257: c7 44 24 04 03 00 00 movl $0x3,0x4(%esp) +c010425e: 00 +c010425f: 8b 45 e0 mov -0x20(%ebp),%eax +c0104262: 89 04 24 mov %eax,(%esp) +c0104265: e8 de 0d 00 00 call c0105048 + assert(PageProperty(p0) && p0->property == 1);// 检查 p0 属性 +c010426a: 8b 45 e8 mov -0x18(%ebp),%eax +c010426d: 83 c0 04 add $0x4,%eax +c0104270: c7 45 a0 01 00 00 00 movl $0x1,-0x60(%ebp) +c0104277: 89 45 9c mov %eax,-0x64(%ebp) + asm volatile ("btl %2, %1; sbbl %0,%0" : "=r" (oldbit) : "m" (*(volatile long *)addr), "Ir" (nr)); +c010427a: 8b 45 9c mov -0x64(%ebp),%eax +c010427d: 8b 55 a0 mov -0x60(%ebp),%edx +c0104280: 0f a3 10 bt %edx,(%eax) +c0104283: 19 c0 sbb %eax,%eax +c0104285: 89 45 98 mov %eax,-0x68(%ebp) + return oldbit != 0; +c0104288: 83 7d 98 00 cmpl $0x0,-0x68(%ebp) +c010428c: 0f 95 c0 setne %al +c010428f: 0f b6 c0 movzbl %al,%eax +c0104292: 85 c0 test %eax,%eax +c0104294: 74 0b je c01042a1 +c0104296: 8b 45 e8 mov -0x18(%ebp),%eax +c0104299: 8b 40 08 mov 0x8(%eax),%eax +c010429c: 83 f8 01 cmp $0x1,%eax +c010429f: 74 24 je c01042c5 +c01042a1: c7 44 24 0c 2c ac 10 movl $0xc010ac2c,0xc(%esp) +c01042a8: c0 +c01042a9: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c01042b0: c0 +c01042b1: c7 44 24 04 5e 01 00 movl $0x15e,0x4(%esp) +c01042b8: 00 +c01042b9: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c01042c0: e8 80 c9 ff ff call c0100c45 <__panic> + assert(PageProperty(p1) && p1->property == 3);// 检查 p1 属性 +c01042c5: 8b 45 e0 mov -0x20(%ebp),%eax +c01042c8: 83 c0 04 add $0x4,%eax +c01042cb: c7 45 94 01 00 00 00 movl $0x1,-0x6c(%ebp) +c01042d2: 89 45 90 mov %eax,-0x70(%ebp) + asm volatile ("btl %2, %1; sbbl %0,%0" : "=r" (oldbit) : "m" (*(volatile long *)addr), "Ir" (nr)); +c01042d5: 8b 45 90 mov -0x70(%ebp),%eax +c01042d8: 8b 55 94 mov -0x6c(%ebp),%edx +c01042db: 0f a3 10 bt %edx,(%eax) +c01042de: 19 c0 sbb %eax,%eax +c01042e0: 89 45 8c mov %eax,-0x74(%ebp) + return oldbit != 0; +c01042e3: 83 7d 8c 00 cmpl $0x0,-0x74(%ebp) +c01042e7: 0f 95 c0 setne %al +c01042ea: 0f b6 c0 movzbl %al,%eax +c01042ed: 85 c0 test %eax,%eax +c01042ef: 74 0b je c01042fc +c01042f1: 8b 45 e0 mov -0x20(%ebp),%eax +c01042f4: 8b 40 08 mov 0x8(%eax),%eax +c01042f7: 83 f8 03 cmp $0x3,%eax +c01042fa: 74 24 je c0104320 +c01042fc: c7 44 24 0c 54 ac 10 movl $0xc010ac54,0xc(%esp) +c0104303: c0 +c0104304: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c010430b: c0 +c010430c: c7 44 24 04 5f 01 00 movl $0x15f,0x4(%esp) +c0104313: 00 +c0104314: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c010431b: e8 25 c9 ff ff call c0100c45 <__panic> + // 确保重分配的页面是之前释放的页面 + assert((p0 = alloc_page()) == p2 - 1); +c0104320: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c0104327: e8 af 0c 00 00 call c0104fdb +c010432c: 89 45 e8 mov %eax,-0x18(%ebp) +c010432f: 8b 45 dc mov -0x24(%ebp),%eax +c0104332: 83 e8 20 sub $0x20,%eax +c0104335: 39 45 e8 cmp %eax,-0x18(%ebp) +c0104338: 74 24 je c010435e +c010433a: c7 44 24 0c 7a ac 10 movl $0xc010ac7a,0xc(%esp) +c0104341: c0 +c0104342: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0104349: c0 +c010434a: c7 44 24 04 61 01 00 movl $0x161,0x4(%esp) +c0104351: 00 +c0104352: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0104359: e8 e7 c8 ff ff call c0100c45 <__panic> + free_page(p0);// 释放分配的页面 +c010435e: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c0104365: 00 +c0104366: 8b 45 e8 mov -0x18(%ebp),%eax +c0104369: 89 04 24 mov %eax,(%esp) +c010436c: e8 d7 0c 00 00 call c0105048 + assert((p0 = alloc_pages(2)) == p2 + 1);// 分配 2 个页面并检查 +c0104371: c7 04 24 02 00 00 00 movl $0x2,(%esp) +c0104378: e8 5e 0c 00 00 call c0104fdb +c010437d: 89 45 e8 mov %eax,-0x18(%ebp) +c0104380: 8b 45 dc mov -0x24(%ebp),%eax +c0104383: 83 c0 20 add $0x20,%eax +c0104386: 39 45 e8 cmp %eax,-0x18(%ebp) +c0104389: 74 24 je c01043af +c010438b: c7 44 24 0c 98 ac 10 movl $0xc010ac98,0xc(%esp) +c0104392: c0 +c0104393: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c010439a: c0 +c010439b: c7 44 24 04 63 01 00 movl $0x163,0x4(%esp) +c01043a2: 00 +c01043a3: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c01043aa: e8 96 c8 ff ff call c0100c45 <__panic> + // 释放页面并检查空闲状态 + free_pages(p0, 2); +c01043af: c7 44 24 04 02 00 00 movl $0x2,0x4(%esp) +c01043b6: 00 +c01043b7: 8b 45 e8 mov -0x18(%ebp),%eax +c01043ba: 89 04 24 mov %eax,(%esp) +c01043bd: e8 86 0c 00 00 call c0105048 + free_page(p2); +c01043c2: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c01043c9: 00 +c01043ca: 8b 45 dc mov -0x24(%ebp),%eax +c01043cd: 89 04 24 mov %eax,(%esp) +c01043d0: e8 73 0c 00 00 call c0105048 + // 再次分配 5 个页面 + assert((p0 = alloc_pages(5)) != NULL); +c01043d5: c7 04 24 05 00 00 00 movl $0x5,(%esp) +c01043dc: e8 fa 0b 00 00 call c0104fdb +c01043e1: 89 45 e8 mov %eax,-0x18(%ebp) +c01043e4: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) +c01043e8: 75 24 jne c010440e +c01043ea: c7 44 24 0c b8 ac 10 movl $0xc010acb8,0xc(%esp) +c01043f1: c0 +c01043f2: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c01043f9: c0 +c01043fa: c7 44 24 04 68 01 00 movl $0x168,0x4(%esp) +c0104401: 00 +c0104402: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0104409: e8 37 c8 ff ff call c0100c45 <__panic> + assert(alloc_page() == NULL);// 确保没有额外页面可分配 +c010440e: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c0104415: e8 c1 0b 00 00 call c0104fdb +c010441a: 85 c0 test %eax,%eax +c010441c: 74 24 je c0104442 +c010441e: c7 44 24 0c 16 ab 10 movl $0xc010ab16,0xc(%esp) +c0104425: c0 +c0104426: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c010442d: c0 +c010442e: c7 44 24 04 69 01 00 movl $0x169,0x4(%esp) +c0104435: 00 +c0104436: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c010443d: e8 03 c8 ff ff call c0100c45 <__panic> + + assert(nr_free == 0);// 确保空闲页数为 0 +c0104442: a1 ec bf 12 c0 mov 0xc012bfec,%eax +c0104447: 85 c0 test %eax,%eax +c0104449: 74 24 je c010446f +c010444b: c7 44 24 0c 69 ab 10 movl $0xc010ab69,0xc(%esp) +c0104452: c0 +c0104453: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c010445a: c0 +c010445b: c7 44 24 04 6b 01 00 movl $0x16b,0x4(%esp) +c0104462: 00 +c0104463: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c010446a: e8 d6 c7 ff ff call c0100c45 <__panic> + nr_free = nr_free_store;// 恢复空闲页数 +c010446f: 8b 45 e4 mov -0x1c(%ebp),%eax +c0104472: a3 ec bf 12 c0 mov %eax,0xc012bfec + // 恢复空闲列表状态 + free_list = free_list_store; +c0104477: 8b 45 80 mov -0x80(%ebp),%eax +c010447a: 8b 55 84 mov -0x7c(%ebp),%edx +c010447d: a3 e4 bf 12 c0 mov %eax,0xc012bfe4 +c0104482: 89 15 e8 bf 12 c0 mov %edx,0xc012bfe8 + free_pages(p0, 5);// 释放所有分配的页面 +c0104488: c7 44 24 04 05 00 00 movl $0x5,0x4(%esp) +c010448f: 00 +c0104490: 8b 45 e8 mov -0x18(%ebp),%eax +c0104493: 89 04 24 mov %eax,(%esp) +c0104496: e8 ad 0b 00 00 call c0105048 + // 验证空闲列表的一致性 + le = &free_list; +c010449b: c7 45 ec e4 bf 12 c0 movl $0xc012bfe4,-0x14(%ebp) + while ((le = list_next(le)) != &free_list) { +c01044a2: eb 1c jmp c01044c0 + struct Page *p = le2page(le, page_link); +c01044a4: 8b 45 ec mov -0x14(%ebp),%eax +c01044a7: 83 e8 0c sub $0xc,%eax +c01044aa: 89 45 d8 mov %eax,-0x28(%ebp) + count --, total -= p->property; +c01044ad: ff 4d f4 decl -0xc(%ebp) +c01044b0: 8b 55 f0 mov -0x10(%ebp),%edx +c01044b3: 8b 45 d8 mov -0x28(%ebp),%eax +c01044b6: 8b 48 08 mov 0x8(%eax),%ecx +c01044b9: 89 d0 mov %edx,%eax +c01044bb: 29 c8 sub %ecx,%eax +c01044bd: 89 45 f0 mov %eax,-0x10(%ebp) +c01044c0: 8b 45 ec mov -0x14(%ebp),%eax +c01044c3: 89 45 88 mov %eax,-0x78(%ebp) + return listelm->next; +c01044c6: 8b 45 88 mov -0x78(%ebp),%eax +c01044c9: 8b 40 04 mov 0x4(%eax),%eax + while ((le = list_next(le)) != &free_list) { +c01044cc: 89 45 ec mov %eax,-0x14(%ebp) +c01044cf: 81 7d ec e4 bf 12 c0 cmpl $0xc012bfe4,-0x14(%ebp) +c01044d6: 75 cc jne c01044a4 + } + assert(count == 0);// 确保所有页面都已处理 +c01044d8: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c01044dc: 74 24 je c0104502 +c01044de: c7 44 24 0c d6 ac 10 movl $0xc010acd6,0xc(%esp) +c01044e5: c0 +c01044e6: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c01044ed: c0 +c01044ee: c7 44 24 04 76 01 00 movl $0x176,0x4(%esp) +c01044f5: 00 +c01044f6: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c01044fd: e8 43 c7 ff ff call c0100c45 <__panic> + assert(total == 0);// 确保总属性值为 0 +c0104502: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) +c0104506: 74 24 je c010452c +c0104508: c7 44 24 0c e1 ac 10 movl $0xc010ace1,0xc(%esp) +c010450f: c0 +c0104510: c7 44 24 08 76 a9 10 movl $0xc010a976,0x8(%esp) +c0104517: c0 +c0104518: c7 44 24 04 77 01 00 movl $0x177,0x4(%esp) +c010451f: 00 +c0104520: c7 04 24 8b a9 10 c0 movl $0xc010a98b,(%esp) +c0104527: e8 19 c7 ff ff call c0100c45 <__panic> +} +c010452c: 90 nop +c010452d: 89 ec mov %ebp,%esp +c010452f: 5d pop %ebp +c0104530: c3 ret + +c0104531 <__intr_save>: +__intr_save(void) { +c0104531: 55 push %ebp +c0104532: 89 e5 mov %esp,%ebp +c0104534: 83 ec 18 sub $0x18,%esp + asm volatile ("pushfl; popl %0" : "=r" (eflags)); +c0104537: 9c pushf +c0104538: 58 pop %eax +c0104539: 89 45 f4 mov %eax,-0xc(%ebp) + return eflags; +c010453c: 8b 45 f4 mov -0xc(%ebp),%eax + if (read_eflags() & FL_IF) { +c010453f: 25 00 02 00 00 and $0x200,%eax +c0104544: 85 c0 test %eax,%eax +c0104546: 74 0c je c0104554 <__intr_save+0x23> + intr_disable(); +c0104548: e8 ae d9 ff ff call c0101efb + return 1; +c010454d: b8 01 00 00 00 mov $0x1,%eax +c0104552: eb 05 jmp c0104559 <__intr_save+0x28> + return 0; +c0104554: b8 00 00 00 00 mov $0x0,%eax } -c0104f50: c9 leave -c0104f51: c3 ret +c0104559: 89 ec mov %ebp,%esp +c010455b: 5d pop %ebp +c010455c: c3 ret -c0104f52 <_fifo_map_swappable>: -/* - * (3)_fifo_map_swappable: According FIFO PRA, we should link the most recent arrival page at the back of pra_list_head qeueue - */ -static int -_fifo_map_swappable(struct mm_struct *mm, uintptr_t addr, struct Page *page, int swap_in) -{ -c0104f52: f3 0f 1e fb endbr32 -c0104f56: 55 push %ebp -c0104f57: 89 e5 mov %esp,%ebp -c0104f59: 83 ec 48 sub $0x48,%esp - //获取 mm_struct 结构中的 sm_priv 指针, - //并将其转换为 list_entry_t 类型的链表头指针 head - list_entry_t *head=(list_entry_t*) mm->sm_priv; -c0104f5c: 8b 45 08 mov 0x8(%ebp),%eax -c0104f5f: 8b 40 14 mov 0x14(%eax),%eax -c0104f62: 89 45 f4 mov %eax,-0xc(%ebp) - list_entry_t *entry=&(page->pra_page_link); -c0104f65: 8b 45 10 mov 0x10(%ebp),%eax -c0104f68: 83 c0 14 add $0x14,%eax -c0104f6b: 89 45 f0 mov %eax,-0x10(%ebp) - - assert(entry != NULL && head != NULL); -c0104f6e: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c0104f72: 74 06 je c0104f7a <_fifo_map_swappable+0x28> -c0104f74: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0104f78: 75 24 jne c0104f9e <_fifo_map_swappable+0x4c> -c0104f7a: c7 44 24 0c 0c b2 10 movl $0xc010b20c,0xc(%esp) -c0104f81: c0 -c0104f82: c7 44 24 08 2a b2 10 movl $0xc010b22a,0x8(%esp) -c0104f89: c0 -c0104f8a: c7 44 24 04 37 00 00 movl $0x37,0x4(%esp) -c0104f91: 00 -c0104f92: c7 04 24 3f b2 10 c0 movl $0xc010b23f,(%esp) -c0104f99: e8 a5 b4 ff ff call c0100443 <__panic> -c0104f9e: 8b 45 f4 mov -0xc(%ebp),%eax -c0104fa1: 89 45 ec mov %eax,-0x14(%ebp) -c0104fa4: 8b 45 f0 mov -0x10(%ebp),%eax -c0104fa7: 89 45 e8 mov %eax,-0x18(%ebp) -c0104faa: 8b 45 ec mov -0x14(%ebp),%eax -c0104fad: 89 45 e4 mov %eax,-0x1c(%ebp) -c0104fb0: 8b 45 e8 mov -0x18(%ebp),%eax -c0104fb3: 89 45 e0 mov %eax,-0x20(%ebp) - * Insert the new element @elm *after* the element @listelm which - * is already in the list. - * */ -static inline void -list_add_after(list_entry_t *listelm, list_entry_t *elm) { - __list_add(elm, listelm, listelm->next); -c0104fb6: 8b 45 e4 mov -0x1c(%ebp),%eax -c0104fb9: 8b 40 04 mov 0x4(%eax),%eax -c0104fbc: 8b 55 e0 mov -0x20(%ebp),%edx -c0104fbf: 89 55 dc mov %edx,-0x24(%ebp) -c0104fc2: 8b 55 e4 mov -0x1c(%ebp),%edx -c0104fc5: 89 55 d8 mov %edx,-0x28(%ebp) -c0104fc8: 89 45 d4 mov %eax,-0x2c(%ebp) - * This is only for internal list manipulation where we know - * the prev/next entries already! - * */ -static inline void -__list_add(list_entry_t *elm, list_entry_t *prev, list_entry_t *next) { - prev->next = next->prev = elm; -c0104fcb: 8b 45 d4 mov -0x2c(%ebp),%eax -c0104fce: 8b 55 dc mov -0x24(%ebp),%edx -c0104fd1: 89 10 mov %edx,(%eax) -c0104fd3: 8b 45 d4 mov -0x2c(%ebp),%eax -c0104fd6: 8b 10 mov (%eax),%edx -c0104fd8: 8b 45 d8 mov -0x28(%ebp),%eax -c0104fdb: 89 50 04 mov %edx,0x4(%eax) - elm->next = next; -c0104fde: 8b 45 dc mov -0x24(%ebp),%eax -c0104fe1: 8b 55 d4 mov -0x2c(%ebp),%edx -c0104fe4: 89 50 04 mov %edx,0x4(%eax) - elm->prev = prev; -c0104fe7: 8b 45 dc mov -0x24(%ebp),%eax -c0104fea: 8b 55 d8 mov -0x28(%ebp),%edx -c0104fed: 89 10 mov %edx,(%eax) +c010455d <__intr_restore>: +__intr_restore(bool flag) { +c010455d: 55 push %ebp +c010455e: 89 e5 mov %esp,%ebp +c0104560: 83 ec 08 sub $0x8,%esp + if (flag) { +c0104563: 83 7d 08 00 cmpl $0x0,0x8(%ebp) +c0104567: 74 05 je c010456e <__intr_restore+0x11> + intr_enable(); +c0104569: e8 85 d9 ff ff call c0101ef3 } -c0104fef: 90 nop +c010456e: 90 nop +c010456f: 89 ec mov %ebp,%esp +c0104571: 5d pop %ebp +c0104572: c3 ret + +c0104573 : +page2ppn(struct Page *page) { +c0104573: 55 push %ebp +c0104574: 89 e5 mov %esp,%ebp + return page - pages; +c0104576: 8b 15 00 c0 12 c0 mov 0xc012c000,%edx +c010457c: 8b 45 08 mov 0x8(%ebp),%eax +c010457f: 29 d0 sub %edx,%eax +c0104581: c1 f8 05 sar $0x5,%eax } -c0104ff0: 90 nop +c0104584: 5d pop %ebp +c0104585: c3 ret + +c0104586 : +page2pa(struct Page *page) { +c0104586: 55 push %ebp +c0104587: 89 e5 mov %esp,%ebp +c0104589: 83 ec 04 sub $0x4,%esp + return page2ppn(page) << PGSHIFT; +c010458c: 8b 45 08 mov 0x8(%ebp),%eax +c010458f: 89 04 24 mov %eax,(%esp) +c0104592: e8 dc ff ff ff call c0104573 +c0104597: c1 e0 0c shl $0xc,%eax } -c0104ff1: 90 nop - //record the page access situlation - /*LAB3 EXERCISE 2: YOUR CODE*/ - //(1)link the most recent arrival page at the back of the pra_list_head qeueue. - //将最近到达的页面链接到 pra_list_head 队列的末尾 - list_add(head, entry); - return 0; -c0104ff2: b8 00 00 00 00 mov $0x0,%eax +c010459a: 89 ec mov %ebp,%esp +c010459c: 5d pop %ebp +c010459d: c3 ret + +c010459e : +pa2page(uintptr_t pa) { +c010459e: 55 push %ebp +c010459f: 89 e5 mov %esp,%ebp +c01045a1: 83 ec 18 sub $0x18,%esp + if (PPN(pa) >= npage) { +c01045a4: 8b 45 08 mov 0x8(%ebp),%eax +c01045a7: c1 e8 0c shr $0xc,%eax +c01045aa: 89 c2 mov %eax,%edx +c01045ac: a1 04 c0 12 c0 mov 0xc012c004,%eax +c01045b1: 39 c2 cmp %eax,%edx +c01045b3: 72 1c jb c01045d1 + panic("pa2page called with invalid pa"); +c01045b5: c7 44 24 08 1c ad 10 movl $0xc010ad1c,0x8(%esp) +c01045bc: c0 +c01045bd: c7 44 24 04 5f 00 00 movl $0x5f,0x4(%esp) +c01045c4: 00 +c01045c5: c7 04 24 3b ad 10 c0 movl $0xc010ad3b,(%esp) +c01045cc: e8 74 c6 ff ff call c0100c45 <__panic> + return &pages[PPN(pa)]; +c01045d1: 8b 15 00 c0 12 c0 mov 0xc012c000,%edx +c01045d7: 8b 45 08 mov 0x8(%ebp),%eax +c01045da: c1 e8 0c shr $0xc,%eax +c01045dd: c1 e0 05 shl $0x5,%eax +c01045e0: 01 d0 add %edx,%eax } -c0104ff7: c9 leave -c0104ff8: c3 ret +c01045e2: 89 ec mov %ebp,%esp +c01045e4: 5d pop %ebp +c01045e5: c3 ret -c0104ff9 <_fifo_swap_out_victim>: - * - * @return 返回0表示成功,其他值表示失败。 - */ -static int -_fifo_swap_out_victim(struct mm_struct *mm, struct Page ** ptr_page, int in_tick) +c01045e6 : +page2kva(struct Page *page) { +c01045e6: 55 push %ebp +c01045e7: 89 e5 mov %esp,%ebp +c01045e9: 83 ec 28 sub $0x28,%esp + return KADDR(page2pa(page)); +c01045ec: 8b 45 08 mov 0x8(%ebp),%eax +c01045ef: 89 04 24 mov %eax,(%esp) +c01045f2: e8 8f ff ff ff call c0104586 +c01045f7: 89 45 f4 mov %eax,-0xc(%ebp) +c01045fa: 8b 45 f4 mov -0xc(%ebp),%eax +c01045fd: c1 e8 0c shr $0xc,%eax +c0104600: 89 45 f0 mov %eax,-0x10(%ebp) +c0104603: a1 04 c0 12 c0 mov 0xc012c004,%eax +c0104608: 39 45 f0 cmp %eax,-0x10(%ebp) +c010460b: 72 23 jb c0104630 +c010460d: 8b 45 f4 mov -0xc(%ebp),%eax +c0104610: 89 44 24 0c mov %eax,0xc(%esp) +c0104614: c7 44 24 08 4c ad 10 movl $0xc010ad4c,0x8(%esp) +c010461b: c0 +c010461c: c7 44 24 04 66 00 00 movl $0x66,0x4(%esp) +c0104623: 00 +c0104624: c7 04 24 3b ad 10 c0 movl $0xc010ad3b,(%esp) +c010462b: e8 15 c6 ff ff call c0100c45 <__panic> +c0104630: 8b 45 f4 mov -0xc(%ebp),%eax +c0104633: 2d 00 00 00 40 sub $0x40000000,%eax +} +c0104638: 89 ec mov %ebp,%esp +c010463a: 5d pop %ebp +c010463b: c3 ret + +c010463c : +kva2page(void *kva) { +c010463c: 55 push %ebp +c010463d: 89 e5 mov %esp,%ebp +c010463f: 83 ec 28 sub $0x28,%esp + return pa2page(PADDR(kva)); +c0104642: 8b 45 08 mov 0x8(%ebp),%eax +c0104645: 89 45 f4 mov %eax,-0xc(%ebp) +c0104648: 81 7d f4 ff ff ff bf cmpl $0xbfffffff,-0xc(%ebp) +c010464f: 77 23 ja c0104674 +c0104651: 8b 45 f4 mov -0xc(%ebp),%eax +c0104654: 89 44 24 0c mov %eax,0xc(%esp) +c0104658: c7 44 24 08 70 ad 10 movl $0xc010ad70,0x8(%esp) +c010465f: c0 +c0104660: c7 44 24 04 6b 00 00 movl $0x6b,0x4(%esp) +c0104667: 00 +c0104668: c7 04 24 3b ad 10 c0 movl $0xc010ad3b,(%esp) +c010466f: e8 d1 c5 ff ff call c0100c45 <__panic> +c0104674: 8b 45 f4 mov -0xc(%ebp),%eax +c0104677: 05 00 00 00 40 add $0x40000000,%eax +c010467c: 89 04 24 mov %eax,(%esp) +c010467f: e8 1a ff ff ff call c010459e +} +c0104684: 89 ec mov %ebp,%esp +c0104686: 5d pop %ebp +c0104687: c3 ret + +c0104688 <__slob_get_free_pages>: +static slob_t *slobfree = &arena; +static bigblock_t *bigblocks; + + +static void* __slob_get_free_pages(gfp_t gfp, int order) { -c0104ff9: f3 0f 1e fb endbr32 -c0104ffd: 55 push %ebp -c0104ffe: 89 e5 mov %esp,%ebp -c0105000: 83 ec 38 sub $0x38,%esp - list_entry_t *head=(list_entry_t*) mm->sm_priv; -c0105003: 8b 45 08 mov 0x8(%ebp),%eax -c0105006: 8b 40 14 mov 0x14(%eax),%eax -c0105009: 89 45 f4 mov %eax,-0xc(%ebp) - assert(head != NULL); -c010500c: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0105010: 75 24 jne c0105036 <_fifo_swap_out_victim+0x3d> -c0105012: c7 44 24 0c 53 b2 10 movl $0xc010b253,0xc(%esp) -c0105019: c0 -c010501a: c7 44 24 08 2a b2 10 movl $0xc010b22a,0x8(%esp) -c0105021: c0 -c0105022: c7 44 24 04 50 00 00 movl $0x50,0x4(%esp) -c0105029: 00 -c010502a: c7 04 24 3f b2 10 c0 movl $0xc010b23f,(%esp) -c0105031: e8 0d b4 ff ff call c0100443 <__panic> - assert(in_tick==0); -c0105036: 83 7d 10 00 cmpl $0x0,0x10(%ebp) -c010503a: 74 24 je c0105060 <_fifo_swap_out_victim+0x67> -c010503c: c7 44 24 0c 60 b2 10 movl $0xc010b260,0xc(%esp) -c0105043: c0 -c0105044: c7 44 24 08 2a b2 10 movl $0xc010b22a,0x8(%esp) -c010504b: c0 -c010504c: c7 44 24 04 51 00 00 movl $0x51,0x4(%esp) -c0105053: 00 -c0105054: c7 04 24 3f b2 10 c0 movl $0xc010b23f,(%esp) -c010505b: e8 e3 b3 ff ff call c0100443 <__panic> - /* Select the victim */ - /*LAB3 EXERCISE 2: YOUR CODE*/ - //(1) unlink the earliest arrival page in front of pra_list_head qeueue - //(2) assign the value of *ptr_page to the addr of this page - //head->prev 获取链表中最先到达的页面 - list_entry_t *le = head->prev; -c0105060: 8b 45 f4 mov -0xc(%ebp),%eax -c0105063: 8b 00 mov (%eax),%eax -c0105065: 89 45 f0 mov %eax,-0x10(%ebp) - assert(head!=le); -c0105068: 8b 45 f4 mov -0xc(%ebp),%eax -c010506b: 3b 45 f0 cmp -0x10(%ebp),%eax -c010506e: 75 24 jne c0105094 <_fifo_swap_out_victim+0x9b> -c0105070: c7 44 24 0c 6b b2 10 movl $0xc010b26b,0xc(%esp) -c0105077: c0 -c0105078: c7 44 24 08 2a b2 10 movl $0xc010b22a,0x8(%esp) -c010507f: c0 -c0105080: c7 44 24 04 58 00 00 movl $0x58,0x4(%esp) -c0105087: 00 -c0105088: c7 04 24 3f b2 10 c0 movl $0xc010b23f,(%esp) -c010508f: e8 af b3 ff ff call c0100443 <__panic> - struct Page *p = le2page(le, pra_page_link); -c0105094: 8b 45 f0 mov -0x10(%ebp),%eax -c0105097: 83 e8 14 sub $0x14,%eax -c010509a: 89 45 ec mov %eax,-0x14(%ebp) -c010509d: 8b 45 f0 mov -0x10(%ebp),%eax -c01050a0: 89 45 e8 mov %eax,-0x18(%ebp) - __list_del(listelm->prev, listelm->next); -c01050a3: 8b 45 e8 mov -0x18(%ebp),%eax -c01050a6: 8b 40 04 mov 0x4(%eax),%eax -c01050a9: 8b 55 e8 mov -0x18(%ebp),%edx -c01050ac: 8b 12 mov (%edx),%edx -c01050ae: 89 55 e4 mov %edx,-0x1c(%ebp) -c01050b1: 89 45 e0 mov %eax,-0x20(%ebp) - * This is only for internal list manipulation where we know - * the prev/next entries already! - * */ -static inline void -__list_del(list_entry_t *prev, list_entry_t *next) { - prev->next = next; -c01050b4: 8b 45 e4 mov -0x1c(%ebp),%eax -c01050b7: 8b 55 e0 mov -0x20(%ebp),%edx -c01050ba: 89 50 04 mov %edx,0x4(%eax) - next->prev = prev; -c01050bd: 8b 45 e0 mov -0x20(%ebp),%eax -c01050c0: 8b 55 e4 mov -0x1c(%ebp),%edx -c01050c3: 89 10 mov %edx,(%eax) -} -c01050c5: 90 nop -} -c01050c6: 90 nop - //使用 list_del 函数将该页面从链表中移除。 - list_del(le); - assert(p != NULL); -c01050c7: 83 7d ec 00 cmpl $0x0,-0x14(%ebp) -c01050cb: 75 24 jne c01050f1 <_fifo_swap_out_victim+0xf8> -c01050cd: c7 44 24 0c 74 b2 10 movl $0xc010b274,0xc(%esp) -c01050d4: c0 -c01050d5: c7 44 24 08 2a b2 10 movl $0xc010b22a,0x8(%esp) -c01050dc: c0 -c01050dd: c7 44 24 04 5c 00 00 movl $0x5c,0x4(%esp) -c01050e4: 00 -c01050e5: c7 04 24 3f b2 10 c0 movl $0xc010b23f,(%esp) -c01050ec: e8 52 b3 ff ff call c0100443 <__panic> - //将移除的页面指针赋值给 *ptr_page - *ptr_page = p; -c01050f1: 8b 45 0c mov 0xc(%ebp),%eax -c01050f4: 8b 55 ec mov -0x14(%ebp),%edx -c01050f7: 89 10 mov %edx,(%eax) - - return 0; -c01050f9: b8 00 00 00 00 mov $0x0,%eax +c0104688: 55 push %ebp +c0104689: 89 e5 mov %esp,%ebp +c010468b: 83 ec 28 sub $0x28,%esp + struct Page * page = alloc_pages(1 << order); +c010468e: 8b 45 0c mov 0xc(%ebp),%eax +c0104691: ba 01 00 00 00 mov $0x1,%edx +c0104696: 88 c1 mov %al,%cl +c0104698: d3 e2 shl %cl,%edx +c010469a: 89 d0 mov %edx,%eax +c010469c: 89 04 24 mov %eax,(%esp) +c010469f: e8 37 09 00 00 call c0104fdb +c01046a4: 89 45 f4 mov %eax,-0xc(%ebp) + if(!page) +c01046a7: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c01046ab: 75 07 jne c01046b4 <__slob_get_free_pages+0x2c> + return NULL; +c01046ad: b8 00 00 00 00 mov $0x0,%eax +c01046b2: eb 0b jmp c01046bf <__slob_get_free_pages+0x37> + return page2kva(page); +c01046b4: 8b 45 f4 mov -0xc(%ebp),%eax +c01046b7: 89 04 24 mov %eax,(%esp) +c01046ba: e8 27 ff ff ff call c01045e6 } -c01050fe: c9 leave -c01050ff: c3 ret +c01046bf: 89 ec mov %ebp,%esp +c01046c1: 5d pop %ebp +c01046c2: c3 ret -c0105100 <_fifo_check_swap>: - * - * 返回值: - * - 0: 表示所有检查均通过。 - */ -static int -_fifo_check_swap(void) { -c0105100: f3 0f 1e fb endbr32 -c0105104: 55 push %ebp -c0105105: 89 e5 mov %esp,%ebp -c0105107: 83 ec 18 sub $0x18,%esp - // 写入虚拟页 c 并检查页面故障数 - cprintf("write Virt Page c in fifo_check_swap\n"); -c010510a: c7 04 24 80 b2 10 c0 movl $0xc010b280,(%esp) -c0105111: e8 c1 b1 ff ff call c01002d7 - *(unsigned char *)0x3000 = 0x0c; -c0105116: b8 00 30 00 00 mov $0x3000,%eax -c010511b: c6 00 0c movb $0xc,(%eax) - assert(pgfault_num==4); -c010511e: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c0105123: 83 f8 04 cmp $0x4,%eax -c0105126: 74 24 je c010514c <_fifo_check_swap+0x4c> -c0105128: c7 44 24 0c a6 b2 10 movl $0xc010b2a6,0xc(%esp) -c010512f: c0 -c0105130: c7 44 24 08 2a b2 10 movl $0xc010b22a,0x8(%esp) -c0105137: c0 -c0105138: c7 44 24 04 70 00 00 movl $0x70,0x4(%esp) -c010513f: 00 -c0105140: c7 04 24 3f b2 10 c0 movl $0xc010b23f,(%esp) -c0105147: e8 f7 b2 ff ff call c0100443 <__panic> +c01046c3 <__slob_free_pages>: - // 写入虚拟页 a 并检查页面故障数 - cprintf("write Virt Page a in fifo_check_swap\n"); -c010514c: c7 04 24 b8 b2 10 c0 movl $0xc010b2b8,(%esp) -c0105153: e8 7f b1 ff ff call c01002d7 - *(unsigned char *)0x1000 = 0x0a; -c0105158: b8 00 10 00 00 mov $0x1000,%eax -c010515d: c6 00 0a movb $0xa,(%eax) - assert(pgfault_num==4); -c0105160: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c0105165: 83 f8 04 cmp $0x4,%eax -c0105168: 74 24 je c010518e <_fifo_check_swap+0x8e> -c010516a: c7 44 24 0c a6 b2 10 movl $0xc010b2a6,0xc(%esp) -c0105171: c0 -c0105172: c7 44 24 08 2a b2 10 movl $0xc010b22a,0x8(%esp) -c0105179: c0 -c010517a: c7 44 24 04 75 00 00 movl $0x75,0x4(%esp) -c0105181: 00 -c0105182: c7 04 24 3f b2 10 c0 movl $0xc010b23f,(%esp) -c0105189: e8 b5 b2 ff ff call c0100443 <__panic> +#define __slob_get_free_page(gfp) __slob_get_free_pages(gfp, 0) - // 写入虚拟页 d 并检查页面故障数 - cprintf("write Virt Page d in fifo_check_swap\n"); -c010518e: c7 04 24 e0 b2 10 c0 movl $0xc010b2e0,(%esp) -c0105195: e8 3d b1 ff ff call c01002d7 - *(unsigned char *)0x4000 = 0x0d; -c010519a: b8 00 40 00 00 mov $0x4000,%eax -c010519f: c6 00 0d movb $0xd,(%eax) - assert(pgfault_num==4); -c01051a2: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c01051a7: 83 f8 04 cmp $0x4,%eax -c01051aa: 74 24 je c01051d0 <_fifo_check_swap+0xd0> -c01051ac: c7 44 24 0c a6 b2 10 movl $0xc010b2a6,0xc(%esp) -c01051b3: c0 -c01051b4: c7 44 24 08 2a b2 10 movl $0xc010b22a,0x8(%esp) -c01051bb: c0 -c01051bc: c7 44 24 04 7a 00 00 movl $0x7a,0x4(%esp) -c01051c3: 00 -c01051c4: c7 04 24 3f b2 10 c0 movl $0xc010b23f,(%esp) -c01051cb: e8 73 b2 ff ff call c0100443 <__panic> +static inline void __slob_free_pages(unsigned long kva, int order) +{ +c01046c3: 55 push %ebp +c01046c4: 89 e5 mov %esp,%ebp +c01046c6: 83 ec 18 sub $0x18,%esp +c01046c9: 89 5d fc mov %ebx,-0x4(%ebp) + free_pages(kva2page(kva), 1 << order); +c01046cc: 8b 45 0c mov 0xc(%ebp),%eax +c01046cf: ba 01 00 00 00 mov $0x1,%edx +c01046d4: 88 c1 mov %al,%cl +c01046d6: d3 e2 shl %cl,%edx +c01046d8: 89 d0 mov %edx,%eax +c01046da: 89 c3 mov %eax,%ebx +c01046dc: 8b 45 08 mov 0x8(%ebp),%eax +c01046df: 89 04 24 mov %eax,(%esp) +c01046e2: e8 55 ff ff ff call c010463c +c01046e7: 89 5c 24 04 mov %ebx,0x4(%esp) +c01046eb: 89 04 24 mov %eax,(%esp) +c01046ee: e8 55 09 00 00 call c0105048 +} +c01046f3: 90 nop +c01046f4: 8b 5d fc mov -0x4(%ebp),%ebx +c01046f7: 89 ec mov %ebp,%esp +c01046f9: 5d pop %ebp +c01046fa: c3 ret + +c01046fb : - // 写入虚拟页 b 并检查页面故障数 - cprintf("write Virt Page b in fifo_check_swap\n"); -c01051d0: c7 04 24 08 b3 10 c0 movl $0xc010b308,(%esp) -c01051d7: e8 fb b0 ff ff call c01002d7 - *(unsigned char *)0x2000 = 0x0b; -c01051dc: b8 00 20 00 00 mov $0x2000,%eax -c01051e1: c6 00 0b movb $0xb,(%eax) - assert(pgfault_num==4); -c01051e4: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c01051e9: 83 f8 04 cmp $0x4,%eax -c01051ec: 74 24 je c0105212 <_fifo_check_swap+0x112> -c01051ee: c7 44 24 0c a6 b2 10 movl $0xc010b2a6,0xc(%esp) -c01051f5: c0 -c01051f6: c7 44 24 08 2a b2 10 movl $0xc010b22a,0x8(%esp) -c01051fd: c0 -c01051fe: c7 44 24 04 7f 00 00 movl $0x7f,0x4(%esp) -c0105205: 00 -c0105206: c7 04 24 3f b2 10 c0 movl $0xc010b23f,(%esp) -c010520d: e8 31 b2 ff ff call c0100443 <__panic> +static void slob_free(void *b, int size); - // 写入虚拟页 e 并检查页面故障数 - cprintf("write Virt Page e in fifo_check_swap\n"); -c0105212: c7 04 24 30 b3 10 c0 movl $0xc010b330,(%esp) -c0105219: e8 b9 b0 ff ff call c01002d7 - *(unsigned char *)0x5000 = 0x0e; -c010521e: b8 00 50 00 00 mov $0x5000,%eax -c0105223: c6 00 0e movb $0xe,(%eax) - assert(pgfault_num==5); -c0105226: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c010522b: 83 f8 05 cmp $0x5,%eax -c010522e: 74 24 je c0105254 <_fifo_check_swap+0x154> -c0105230: c7 44 24 0c 56 b3 10 movl $0xc010b356,0xc(%esp) -c0105237: c0 -c0105238: c7 44 24 08 2a b2 10 movl $0xc010b22a,0x8(%esp) -c010523f: c0 -c0105240: c7 44 24 04 84 00 00 movl $0x84,0x4(%esp) -c0105247: 00 -c0105248: c7 04 24 3f b2 10 c0 movl $0xc010b23f,(%esp) -c010524f: e8 ef b1 ff ff call c0100443 <__panic> +static void *slob_alloc(size_t size, gfp_t gfp, int align) +{ +c01046fb: 55 push %ebp +c01046fc: 89 e5 mov %esp,%ebp +c01046fe: 83 ec 38 sub $0x38,%esp + assert( (size + SLOB_UNIT) < PAGE_SIZE ); +c0104701: 8b 45 08 mov 0x8(%ebp),%eax +c0104704: 83 c0 08 add $0x8,%eax +c0104707: 3d ff 0f 00 00 cmp $0xfff,%eax +c010470c: 76 24 jbe c0104732 +c010470e: c7 44 24 0c 94 ad 10 movl $0xc010ad94,0xc(%esp) +c0104715: c0 +c0104716: c7 44 24 08 b3 ad 10 movl $0xc010adb3,0x8(%esp) +c010471d: c0 +c010471e: c7 44 24 04 64 00 00 movl $0x64,0x4(%esp) +c0104725: 00 +c0104726: c7 04 24 c8 ad 10 c0 movl $0xc010adc8,(%esp) +c010472d: e8 13 c5 ff ff call c0100c45 <__panic> - // 再次写入虚拟页 b 并检查页面故障数 - cprintf("write Virt Page b in fifo_check_swap\n"); -c0105254: c7 04 24 08 b3 10 c0 movl $0xc010b308,(%esp) -c010525b: e8 77 b0 ff ff call c01002d7 - *(unsigned char *)0x2000 = 0x0b; -c0105260: b8 00 20 00 00 mov $0x2000,%eax -c0105265: c6 00 0b movb $0xb,(%eax) - assert(pgfault_num==5); -c0105268: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c010526d: 83 f8 05 cmp $0x5,%eax -c0105270: 74 24 je c0105296 <_fifo_check_swap+0x196> -c0105272: c7 44 24 0c 56 b3 10 movl $0xc010b356,0xc(%esp) -c0105279: c0 -c010527a: c7 44 24 08 2a b2 10 movl $0xc010b22a,0x8(%esp) -c0105281: c0 -c0105282: c7 44 24 04 89 00 00 movl $0x89,0x4(%esp) -c0105289: 00 -c010528a: c7 04 24 3f b2 10 c0 movl $0xc010b23f,(%esp) -c0105291: e8 ad b1 ff ff call c0100443 <__panic> + slob_t *prev, *cur, *aligned = 0; +c0104732: c7 45 ec 00 00 00 00 movl $0x0,-0x14(%ebp) + int delta = 0, units = SLOB_UNITS(size); +c0104739: c7 45 e8 00 00 00 00 movl $0x0,-0x18(%ebp) +c0104740: 8b 45 08 mov 0x8(%ebp),%eax +c0104743: 83 c0 07 add $0x7,%eax +c0104746: c1 e8 03 shr $0x3,%eax +c0104749: 89 45 e0 mov %eax,-0x20(%ebp) + unsigned long flags; - // 再次写入虚拟页 a 并检查页面故障数 - cprintf("write Virt Page a in fifo_check_swap\n"); -c0105296: c7 04 24 b8 b2 10 c0 movl $0xc010b2b8,(%esp) -c010529d: e8 35 b0 ff ff call c01002d7 - *(unsigned char *)0x1000 = 0x0a; -c01052a2: b8 00 10 00 00 mov $0x1000,%eax -c01052a7: c6 00 0a movb $0xa,(%eax) - assert(pgfault_num==6); -c01052aa: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c01052af: 83 f8 06 cmp $0x6,%eax -c01052b2: 74 24 je c01052d8 <_fifo_check_swap+0x1d8> -c01052b4: c7 44 24 0c 65 b3 10 movl $0xc010b365,0xc(%esp) -c01052bb: c0 -c01052bc: c7 44 24 08 2a b2 10 movl $0xc010b22a,0x8(%esp) -c01052c3: c0 -c01052c4: c7 44 24 04 8e 00 00 movl $0x8e,0x4(%esp) -c01052cb: 00 -c01052cc: c7 04 24 3f b2 10 c0 movl $0xc010b23f,(%esp) -c01052d3: e8 6b b1 ff ff call c0100443 <__panic> + spin_lock_irqsave(&slob_lock, flags); +c010474c: e8 e0 fd ff ff call c0104531 <__intr_save> +c0104751: 89 45 e4 mov %eax,-0x1c(%ebp) + prev = slobfree; +c0104754: a1 e8 89 12 c0 mov 0xc01289e8,%eax +c0104759: 89 45 f4 mov %eax,-0xc(%ebp) + for (cur = prev->next; ; prev = cur, cur = cur->next) { +c010475c: 8b 45 f4 mov -0xc(%ebp),%eax +c010475f: 8b 40 04 mov 0x4(%eax),%eax +c0104762: 89 45 f0 mov %eax,-0x10(%ebp) + if (align) { +c0104765: 83 7d 10 00 cmpl $0x0,0x10(%ebp) +c0104769: 74 21 je c010478c + aligned = (slob_t *)ALIGN((unsigned long)cur, align); +c010476b: 8b 55 f0 mov -0x10(%ebp),%edx +c010476e: 8b 45 10 mov 0x10(%ebp),%eax +c0104771: 01 d0 add %edx,%eax +c0104773: 8d 50 ff lea -0x1(%eax),%edx +c0104776: 8b 45 10 mov 0x10(%ebp),%eax +c0104779: f7 d8 neg %eax +c010477b: 21 d0 and %edx,%eax +c010477d: 89 45 ec mov %eax,-0x14(%ebp) + delta = aligned - cur; +c0104780: 8b 45 ec mov -0x14(%ebp),%eax +c0104783: 2b 45 f0 sub -0x10(%ebp),%eax +c0104786: c1 f8 03 sar $0x3,%eax +c0104789: 89 45 e8 mov %eax,-0x18(%ebp) + } + if (cur->units >= units + delta) { /* room enough? */ +c010478c: 8b 45 f0 mov -0x10(%ebp),%eax +c010478f: 8b 00 mov (%eax),%eax +c0104791: 8b 4d e0 mov -0x20(%ebp),%ecx +c0104794: 8b 55 e8 mov -0x18(%ebp),%edx +c0104797: 01 ca add %ecx,%edx +c0104799: 39 d0 cmp %edx,%eax +c010479b: 0f 8c aa 00 00 00 jl c010484b + if (delta) { /* need to fragment head to align? */ +c01047a1: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) +c01047a5: 74 38 je c01047df + aligned->units = cur->units - delta; +c01047a7: 8b 45 f0 mov -0x10(%ebp),%eax +c01047aa: 8b 00 mov (%eax),%eax +c01047ac: 2b 45 e8 sub -0x18(%ebp),%eax +c01047af: 89 c2 mov %eax,%edx +c01047b1: 8b 45 ec mov -0x14(%ebp),%eax +c01047b4: 89 10 mov %edx,(%eax) + aligned->next = cur->next; +c01047b6: 8b 45 f0 mov -0x10(%ebp),%eax +c01047b9: 8b 50 04 mov 0x4(%eax),%edx +c01047bc: 8b 45 ec mov -0x14(%ebp),%eax +c01047bf: 89 50 04 mov %edx,0x4(%eax) + cur->next = aligned; +c01047c2: 8b 45 f0 mov -0x10(%ebp),%eax +c01047c5: 8b 55 ec mov -0x14(%ebp),%edx +c01047c8: 89 50 04 mov %edx,0x4(%eax) + cur->units = delta; +c01047cb: 8b 45 f0 mov -0x10(%ebp),%eax +c01047ce: 8b 55 e8 mov -0x18(%ebp),%edx +c01047d1: 89 10 mov %edx,(%eax) + prev = cur; +c01047d3: 8b 45 f0 mov -0x10(%ebp),%eax +c01047d6: 89 45 f4 mov %eax,-0xc(%ebp) + cur = aligned; +c01047d9: 8b 45 ec mov -0x14(%ebp),%eax +c01047dc: 89 45 f0 mov %eax,-0x10(%ebp) + } - // 再次写入虚拟页 b 并检查页面故障数 - cprintf("write Virt Page b in fifo_check_swap\n"); -c01052d8: c7 04 24 08 b3 10 c0 movl $0xc010b308,(%esp) -c01052df: e8 f3 af ff ff call c01002d7 - *(unsigned char *)0x2000 = 0x0b; -c01052e4: b8 00 20 00 00 mov $0x2000,%eax -c01052e9: c6 00 0b movb $0xb,(%eax) - assert(pgfault_num==7); -c01052ec: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c01052f1: 83 f8 07 cmp $0x7,%eax -c01052f4: 74 24 je c010531a <_fifo_check_swap+0x21a> -c01052f6: c7 44 24 0c 74 b3 10 movl $0xc010b374,0xc(%esp) -c01052fd: c0 -c01052fe: c7 44 24 08 2a b2 10 movl $0xc010b22a,0x8(%esp) -c0105305: c0 -c0105306: c7 44 24 04 93 00 00 movl $0x93,0x4(%esp) -c010530d: 00 -c010530e: c7 04 24 3f b2 10 c0 movl $0xc010b23f,(%esp) -c0105315: e8 29 b1 ff ff call c0100443 <__panic> + if (cur->units == units) /* exact fit? */ +c01047df: 8b 45 f0 mov -0x10(%ebp),%eax +c01047e2: 8b 00 mov (%eax),%eax +c01047e4: 39 45 e0 cmp %eax,-0x20(%ebp) +c01047e7: 75 0e jne c01047f7 + prev->next = cur->next; /* unlink */ +c01047e9: 8b 45 f0 mov -0x10(%ebp),%eax +c01047ec: 8b 50 04 mov 0x4(%eax),%edx +c01047ef: 8b 45 f4 mov -0xc(%ebp),%eax +c01047f2: 89 50 04 mov %edx,0x4(%eax) +c01047f5: eb 3c jmp c0104833 + else { /* fragment */ + prev->next = cur + units; +c01047f7: 8b 45 e0 mov -0x20(%ebp),%eax +c01047fa: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx +c0104801: 8b 45 f0 mov -0x10(%ebp),%eax +c0104804: 01 c2 add %eax,%edx +c0104806: 8b 45 f4 mov -0xc(%ebp),%eax +c0104809: 89 50 04 mov %edx,0x4(%eax) + prev->next->units = cur->units - units; +c010480c: 8b 45 f0 mov -0x10(%ebp),%eax +c010480f: 8b 10 mov (%eax),%edx +c0104811: 8b 45 f4 mov -0xc(%ebp),%eax +c0104814: 8b 40 04 mov 0x4(%eax),%eax +c0104817: 2b 55 e0 sub -0x20(%ebp),%edx +c010481a: 89 10 mov %edx,(%eax) + prev->next->next = cur->next; +c010481c: 8b 45 f4 mov -0xc(%ebp),%eax +c010481f: 8b 40 04 mov 0x4(%eax),%eax +c0104822: 8b 55 f0 mov -0x10(%ebp),%edx +c0104825: 8b 52 04 mov 0x4(%edx),%edx +c0104828: 89 50 04 mov %edx,0x4(%eax) + cur->units = units; +c010482b: 8b 45 f0 mov -0x10(%ebp),%eax +c010482e: 8b 55 e0 mov -0x20(%ebp),%edx +c0104831: 89 10 mov %edx,(%eax) + } - // 再次写入虚拟页 c 并检查页面故障数 - cprintf("write Virt Page c in fifo_check_swap\n"); -c010531a: c7 04 24 80 b2 10 c0 movl $0xc010b280,(%esp) -c0105321: e8 b1 af ff ff call c01002d7 - *(unsigned char *)0x3000 = 0x0c; -c0105326: b8 00 30 00 00 mov $0x3000,%eax -c010532b: c6 00 0c movb $0xc,(%eax) - assert(pgfault_num==8); -c010532e: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c0105333: 83 f8 08 cmp $0x8,%eax -c0105336: 74 24 je c010535c <_fifo_check_swap+0x25c> -c0105338: c7 44 24 0c 83 b3 10 movl $0xc010b383,0xc(%esp) -c010533f: c0 -c0105340: c7 44 24 08 2a b2 10 movl $0xc010b22a,0x8(%esp) -c0105347: c0 -c0105348: c7 44 24 04 98 00 00 movl $0x98,0x4(%esp) -c010534f: 00 -c0105350: c7 04 24 3f b2 10 c0 movl $0xc010b23f,(%esp) -c0105357: e8 e7 b0 ff ff call c0100443 <__panic> + slobfree = prev; +c0104833: 8b 45 f4 mov -0xc(%ebp),%eax +c0104836: a3 e8 89 12 c0 mov %eax,0xc01289e8 + spin_unlock_irqrestore(&slob_lock, flags); +c010483b: 8b 45 e4 mov -0x1c(%ebp),%eax +c010483e: 89 04 24 mov %eax,(%esp) +c0104841: e8 17 fd ff ff call c010455d <__intr_restore> + return cur; +c0104846: 8b 45 f0 mov -0x10(%ebp),%eax +c0104849: eb 7f jmp c01048ca + } + if (cur == slobfree) { +c010484b: a1 e8 89 12 c0 mov 0xc01289e8,%eax +c0104850: 39 45 f0 cmp %eax,-0x10(%ebp) +c0104853: 75 61 jne c01048b6 + spin_unlock_irqrestore(&slob_lock, flags); +c0104855: 8b 45 e4 mov -0x1c(%ebp),%eax +c0104858: 89 04 24 mov %eax,(%esp) +c010485b: e8 fd fc ff ff call c010455d <__intr_restore> - // 再次写入虚拟页 d 并检查页面故障数 - cprintf("write Virt Page d in fifo_check_swap\n"); -c010535c: c7 04 24 e0 b2 10 c0 movl $0xc010b2e0,(%esp) -c0105363: e8 6f af ff ff call c01002d7 - *(unsigned char *)0x4000 = 0x0d; -c0105368: b8 00 40 00 00 mov $0x4000,%eax -c010536d: c6 00 0d movb $0xd,(%eax) - assert(pgfault_num==9); -c0105370: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c0105375: 83 f8 09 cmp $0x9,%eax -c0105378: 74 24 je c010539e <_fifo_check_swap+0x29e> -c010537a: c7 44 24 0c 92 b3 10 movl $0xc010b392,0xc(%esp) -c0105381: c0 -c0105382: c7 44 24 08 2a b2 10 movl $0xc010b22a,0x8(%esp) -c0105389: c0 -c010538a: c7 44 24 04 9d 00 00 movl $0x9d,0x4(%esp) -c0105391: 00 -c0105392: c7 04 24 3f b2 10 c0 movl $0xc010b23f,(%esp) -c0105399: e8 a5 b0 ff ff call c0100443 <__panic> + if (size == PAGE_SIZE) /* trying to shrink arena? */ +c0104860: 81 7d 08 00 10 00 00 cmpl $0x1000,0x8(%ebp) +c0104867: 75 07 jne c0104870 + return 0; +c0104869: b8 00 00 00 00 mov $0x0,%eax +c010486e: eb 5a jmp c01048ca - // 再次写入虚拟页 e 并检查页面故障数 - cprintf("write Virt Page e in fifo_check_swap\n"); -c010539e: c7 04 24 30 b3 10 c0 movl $0xc010b330,(%esp) -c01053a5: e8 2d af ff ff call c01002d7 - *(unsigned char *)0x5000 = 0x0e; -c01053aa: b8 00 50 00 00 mov $0x5000,%eax -c01053af: c6 00 0e movb $0xe,(%eax) - assert(pgfault_num==10); -c01053b2: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c01053b7: 83 f8 0a cmp $0xa,%eax -c01053ba: 74 24 je c01053e0 <_fifo_check_swap+0x2e0> -c01053bc: c7 44 24 0c a1 b3 10 movl $0xc010b3a1,0xc(%esp) -c01053c3: c0 -c01053c4: c7 44 24 08 2a b2 10 movl $0xc010b22a,0x8(%esp) -c01053cb: c0 -c01053cc: c7 44 24 04 a2 00 00 movl $0xa2,0x4(%esp) -c01053d3: 00 -c01053d4: c7 04 24 3f b2 10 c0 movl $0xc010b23f,(%esp) -c01053db: e8 63 b0 ff ff call c0100443 <__panic> + cur = (slob_t *)__slob_get_free_page(gfp); +c0104870: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c0104877: 00 +c0104878: 8b 45 0c mov 0xc(%ebp),%eax +c010487b: 89 04 24 mov %eax,(%esp) +c010487e: e8 05 fe ff ff call c0104688 <__slob_get_free_pages> +c0104883: 89 45 f0 mov %eax,-0x10(%ebp) + if (!cur) +c0104886: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) +c010488a: 75 07 jne c0104893 + return 0; +c010488c: b8 00 00 00 00 mov $0x0,%eax +c0104891: eb 37 jmp c01048ca - // 再次写入虚拟页 a 并检查页面故障数 - cprintf("write Virt Page a in fifo_check_swap\n"); -c01053e0: c7 04 24 b8 b2 10 c0 movl $0xc010b2b8,(%esp) -c01053e7: e8 eb ae ff ff call c01002d7 - assert(*(unsigned char *)0x1000 == 0x0a); -c01053ec: b8 00 10 00 00 mov $0x1000,%eax -c01053f1: 0f b6 00 movzbl (%eax),%eax -c01053f4: 3c 0a cmp $0xa,%al -c01053f6: 74 24 je c010541c <_fifo_check_swap+0x31c> -c01053f8: c7 44 24 0c b4 b3 10 movl $0xc010b3b4,0xc(%esp) -c01053ff: c0 -c0105400: c7 44 24 08 2a b2 10 movl $0xc010b22a,0x8(%esp) -c0105407: c0 -c0105408: c7 44 24 04 a6 00 00 movl $0xa6,0x4(%esp) -c010540f: 00 -c0105410: c7 04 24 3f b2 10 c0 movl $0xc010b23f,(%esp) -c0105417: e8 27 b0 ff ff call c0100443 <__panic> - *(unsigned char *)0x1000 = 0x0a; -c010541c: b8 00 10 00 00 mov $0x1000,%eax -c0105421: c6 00 0a movb $0xa,(%eax) - assert(pgfault_num==11); -c0105424: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c0105429: 83 f8 0b cmp $0xb,%eax -c010542c: 74 24 je c0105452 <_fifo_check_swap+0x352> -c010542e: c7 44 24 0c d5 b3 10 movl $0xc010b3d5,0xc(%esp) -c0105435: c0 -c0105436: c7 44 24 08 2a b2 10 movl $0xc010b22a,0x8(%esp) -c010543d: c0 -c010543e: c7 44 24 04 a8 00 00 movl $0xa8,0x4(%esp) -c0105445: 00 -c0105446: c7 04 24 3f b2 10 c0 movl $0xc010b23f,(%esp) -c010544d: e8 f1 af ff ff call c0100443 <__panic> - return 0; -c0105452: b8 00 00 00 00 mov $0x0,%eax + slob_free(cur, PAGE_SIZE); +c0104893: c7 44 24 04 00 10 00 movl $0x1000,0x4(%esp) +c010489a: 00 +c010489b: 8b 45 f0 mov -0x10(%ebp),%eax +c010489e: 89 04 24 mov %eax,(%esp) +c01048a1: e8 28 00 00 00 call c01048ce + spin_lock_irqsave(&slob_lock, flags); +c01048a6: e8 86 fc ff ff call c0104531 <__intr_save> +c01048ab: 89 45 e4 mov %eax,-0x1c(%ebp) + cur = slobfree; +c01048ae: a1 e8 89 12 c0 mov 0xc01289e8,%eax +c01048b3: 89 45 f0 mov %eax,-0x10(%ebp) + for (cur = prev->next; ; prev = cur, cur = cur->next) { +c01048b6: 8b 45 f0 mov -0x10(%ebp),%eax +c01048b9: 89 45 f4 mov %eax,-0xc(%ebp) +c01048bc: 8b 45 f0 mov -0x10(%ebp),%eax +c01048bf: 8b 40 04 mov 0x4(%eax),%eax +c01048c2: 89 45 f0 mov %eax,-0x10(%ebp) + if (align) { +c01048c5: e9 9b fe ff ff jmp c0104765 + } + } +} +c01048ca: 89 ec mov %ebp,%esp +c01048cc: 5d pop %ebp +c01048cd: c3 ret + +c01048ce : + +static void slob_free(void *block, int size) +{ +c01048ce: 55 push %ebp +c01048cf: 89 e5 mov %esp,%ebp +c01048d1: 83 ec 28 sub $0x28,%esp + slob_t *cur, *b = (slob_t *)block; +c01048d4: 8b 45 08 mov 0x8(%ebp),%eax +c01048d7: 89 45 f0 mov %eax,-0x10(%ebp) + unsigned long flags; + + if (!block) +c01048da: 83 7d 08 00 cmpl $0x0,0x8(%ebp) +c01048de: 0f 84 01 01 00 00 je c01049e5 + return; + + if (size) +c01048e4: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) +c01048e8: 74 10 je c01048fa + b->units = SLOB_UNITS(size); +c01048ea: 8b 45 0c mov 0xc(%ebp),%eax +c01048ed: 83 c0 07 add $0x7,%eax +c01048f0: c1 e8 03 shr $0x3,%eax +c01048f3: 89 c2 mov %eax,%edx +c01048f5: 8b 45 f0 mov -0x10(%ebp),%eax +c01048f8: 89 10 mov %edx,(%eax) + + /* Find reinsertion point */ + spin_lock_irqsave(&slob_lock, flags); +c01048fa: e8 32 fc ff ff call c0104531 <__intr_save> +c01048ff: 89 45 ec mov %eax,-0x14(%ebp) + for (cur = slobfree; !(b > cur && b < cur->next); cur = cur->next) +c0104902: a1 e8 89 12 c0 mov 0xc01289e8,%eax +c0104907: 89 45 f4 mov %eax,-0xc(%ebp) +c010490a: eb 27 jmp c0104933 + if (cur >= cur->next && (b > cur || b < cur->next)) +c010490c: 8b 45 f4 mov -0xc(%ebp),%eax +c010490f: 8b 40 04 mov 0x4(%eax),%eax +c0104912: 39 45 f4 cmp %eax,-0xc(%ebp) +c0104915: 72 13 jb c010492a +c0104917: 8b 45 f0 mov -0x10(%ebp),%eax +c010491a: 3b 45 f4 cmp -0xc(%ebp),%eax +c010491d: 77 27 ja c0104946 +c010491f: 8b 45 f4 mov -0xc(%ebp),%eax +c0104922: 8b 40 04 mov 0x4(%eax),%eax +c0104925: 39 45 f0 cmp %eax,-0x10(%ebp) +c0104928: 72 1c jb c0104946 + for (cur = slobfree; !(b > cur && b < cur->next); cur = cur->next) +c010492a: 8b 45 f4 mov -0xc(%ebp),%eax +c010492d: 8b 40 04 mov 0x4(%eax),%eax +c0104930: 89 45 f4 mov %eax,-0xc(%ebp) +c0104933: 8b 45 f0 mov -0x10(%ebp),%eax +c0104936: 3b 45 f4 cmp -0xc(%ebp),%eax +c0104939: 76 d1 jbe c010490c +c010493b: 8b 45 f4 mov -0xc(%ebp),%eax +c010493e: 8b 40 04 mov 0x4(%eax),%eax +c0104941: 39 45 f0 cmp %eax,-0x10(%ebp) +c0104944: 73 c6 jae c010490c + break; + + if (b + b->units == cur->next) { +c0104946: 8b 45 f0 mov -0x10(%ebp),%eax +c0104949: 8b 00 mov (%eax),%eax +c010494b: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx +c0104952: 8b 45 f0 mov -0x10(%ebp),%eax +c0104955: 01 c2 add %eax,%edx +c0104957: 8b 45 f4 mov -0xc(%ebp),%eax +c010495a: 8b 40 04 mov 0x4(%eax),%eax +c010495d: 39 c2 cmp %eax,%edx +c010495f: 75 25 jne c0104986 + b->units += cur->next->units; +c0104961: 8b 45 f0 mov -0x10(%ebp),%eax +c0104964: 8b 10 mov (%eax),%edx +c0104966: 8b 45 f4 mov -0xc(%ebp),%eax +c0104969: 8b 40 04 mov 0x4(%eax),%eax +c010496c: 8b 00 mov (%eax),%eax +c010496e: 01 c2 add %eax,%edx +c0104970: 8b 45 f0 mov -0x10(%ebp),%eax +c0104973: 89 10 mov %edx,(%eax) + b->next = cur->next->next; +c0104975: 8b 45 f4 mov -0xc(%ebp),%eax +c0104978: 8b 40 04 mov 0x4(%eax),%eax +c010497b: 8b 50 04 mov 0x4(%eax),%edx +c010497e: 8b 45 f0 mov -0x10(%ebp),%eax +c0104981: 89 50 04 mov %edx,0x4(%eax) +c0104984: eb 0c jmp c0104992 + } else + b->next = cur->next; +c0104986: 8b 45 f4 mov -0xc(%ebp),%eax +c0104989: 8b 50 04 mov 0x4(%eax),%edx +c010498c: 8b 45 f0 mov -0x10(%ebp),%eax +c010498f: 89 50 04 mov %edx,0x4(%eax) + + if (cur + cur->units == b) { +c0104992: 8b 45 f4 mov -0xc(%ebp),%eax +c0104995: 8b 00 mov (%eax),%eax +c0104997: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx +c010499e: 8b 45 f4 mov -0xc(%ebp),%eax +c01049a1: 01 d0 add %edx,%eax +c01049a3: 39 45 f0 cmp %eax,-0x10(%ebp) +c01049a6: 75 1f jne c01049c7 + cur->units += b->units; +c01049a8: 8b 45 f4 mov -0xc(%ebp),%eax +c01049ab: 8b 10 mov (%eax),%edx +c01049ad: 8b 45 f0 mov -0x10(%ebp),%eax +c01049b0: 8b 00 mov (%eax),%eax +c01049b2: 01 c2 add %eax,%edx +c01049b4: 8b 45 f4 mov -0xc(%ebp),%eax +c01049b7: 89 10 mov %edx,(%eax) + cur->next = b->next; +c01049b9: 8b 45 f0 mov -0x10(%ebp),%eax +c01049bc: 8b 50 04 mov 0x4(%eax),%edx +c01049bf: 8b 45 f4 mov -0xc(%ebp),%eax +c01049c2: 89 50 04 mov %edx,0x4(%eax) +c01049c5: eb 09 jmp c01049d0 + } else + cur->next = b; +c01049c7: 8b 45 f4 mov -0xc(%ebp),%eax +c01049ca: 8b 55 f0 mov -0x10(%ebp),%edx +c01049cd: 89 50 04 mov %edx,0x4(%eax) + + slobfree = cur; +c01049d0: 8b 45 f4 mov -0xc(%ebp),%eax +c01049d3: a3 e8 89 12 c0 mov %eax,0xc01289e8 + + spin_unlock_irqrestore(&slob_lock, flags); +c01049d8: 8b 45 ec mov -0x14(%ebp),%eax +c01049db: 89 04 24 mov %eax,(%esp) +c01049de: e8 7a fb ff ff call c010455d <__intr_restore> +c01049e3: eb 01 jmp c01049e6 + return; +c01049e5: 90 nop } -c0105457: c9 leave -c0105458: c3 ret +c01049e6: 89 ec mov %ebp,%esp +c01049e8: 5d pop %ebp +c01049e9: c3 ret -c0105459 <_fifo_init>: +c01049ea : -static int -_fifo_init(void) -{ -c0105459: f3 0f 1e fb endbr32 -c010545d: 55 push %ebp -c010545e: 89 e5 mov %esp,%ebp - return 0; -c0105460: b8 00 00 00 00 mov $0x0,%eax + +void +slob_init(void) { +c01049ea: 55 push %ebp +c01049eb: 89 e5 mov %esp,%ebp +c01049ed: 83 ec 18 sub $0x18,%esp + cprintf("use SLOB allocator\n"); +c01049f0: c7 04 24 da ad 10 c0 movl $0xc010adda,(%esp) +c01049f7: e8 7c b9 ff ff call c0100378 } -c0105465: 5d pop %ebp -c0105466: c3 ret +c01049fc: 90 nop +c01049fd: 89 ec mov %ebp,%esp +c01049ff: 5d pop %ebp +c0104a00: c3 ret -c0105467 <_fifo_set_unswappable>: +c0104a01 : -static int -_fifo_set_unswappable(struct mm_struct *mm, uintptr_t addr) -{ -c0105467: f3 0f 1e fb endbr32 -c010546b: 55 push %ebp -c010546c: 89 e5 mov %esp,%ebp - return 0; -c010546e: b8 00 00 00 00 mov $0x0,%eax +inline void +kmalloc_init(void) { +c0104a01: 55 push %ebp +c0104a02: 89 e5 mov %esp,%ebp +c0104a04: 83 ec 18 sub $0x18,%esp + slob_init(); +c0104a07: e8 de ff ff ff call c01049ea + cprintf("kmalloc_init() succeeded!\n"); +c0104a0c: c7 04 24 ee ad 10 c0 movl $0xc010adee,(%esp) +c0104a13: e8 60 b9 ff ff call c0100378 } -c0105473: 5d pop %ebp -c0105474: c3 ret +c0104a18: 90 nop +c0104a19: 89 ec mov %ebp,%esp +c0104a1b: 5d pop %ebp +c0104a1c: c3 ret -c0105475 <_fifo_tick_event>: +c0104a1d : -static int -_fifo_tick_event(struct mm_struct *mm) -{ return 0; } -c0105475: f3 0f 1e fb endbr32 -c0105479: 55 push %ebp -c010547a: 89 e5 mov %esp,%ebp -c010547c: b8 00 00 00 00 mov $0x0,%eax -c0105481: 5d pop %ebp -c0105482: c3 ret - -c0105483 : -pa2page(uintptr_t pa) { -c0105483: 55 push %ebp -c0105484: 89 e5 mov %esp,%ebp -c0105486: 83 ec 18 sub $0x18,%esp - if (PPN(pa) >= npage) { -c0105489: 8b 45 08 mov 0x8(%ebp),%eax -c010548c: c1 e8 0c shr $0xc,%eax -c010548f: 89 c2 mov %eax,%edx -c0105491: a1 80 bf 12 c0 mov 0xc012bf80,%eax -c0105496: 39 c2 cmp %eax,%edx -c0105498: 72 1c jb c01054b6 - panic("pa2page called with invalid pa"); -c010549a: c7 44 24 08 f8 b3 10 movl $0xc010b3f8,0x8(%esp) -c01054a1: c0 -c01054a2: c7 44 24 04 5f 00 00 movl $0x5f,0x4(%esp) -c01054a9: 00 -c01054aa: c7 04 24 17 b4 10 c0 movl $0xc010b417,(%esp) -c01054b1: e8 8d af ff ff call c0100443 <__panic> - return &pages[PPN(pa)]; -c01054b6: a1 b8 e0 12 c0 mov 0xc012e0b8,%eax -c01054bb: 8b 55 08 mov 0x8(%ebp),%edx -c01054be: c1 ea 0c shr $0xc,%edx -c01054c1: c1 e2 05 shl $0x5,%edx -c01054c4: 01 d0 add %edx,%eax +size_t +slob_allocated(void) { +c0104a1d: 55 push %ebp +c0104a1e: 89 e5 mov %esp,%ebp + return 0; +c0104a20: b8 00 00 00 00 mov $0x0,%eax } -c01054c6: c9 leave -c01054c7: c3 ret +c0104a25: 5d pop %ebp +c0104a26: c3 ret -c01054c8 : -pde2page(pde_t pde) { -c01054c8: 55 push %ebp -c01054c9: 89 e5 mov %esp,%ebp -c01054cb: 83 ec 18 sub $0x18,%esp - return pa2page(PDE_ADDR(pde)); -c01054ce: 8b 45 08 mov 0x8(%ebp),%eax -c01054d1: 25 00 f0 ff ff and $0xfffff000,%eax -c01054d6: 89 04 24 mov %eax,(%esp) -c01054d9: e8 a5 ff ff ff call c0105483 -} -c01054de: c9 leave -c01054df: c3 ret +c0104a27 : -c01054e0 : - * 它包括内存映射列表、页目录、映射缓存等重要信息 - * - * @return 分配并初始化后的`mm_struct`结构体指针,如果分配失败则返回NULL - */ -struct mm_struct * -mm_create(void) { -c01054e0: f3 0f 1e fb endbr32 -c01054e4: 55 push %ebp -c01054e5: 89 e5 mov %esp,%ebp -c01054e7: 83 ec 28 sub $0x28,%esp - // 分配一个mm_struct结构体的空间 - struct mm_struct *mm = kmalloc(sizeof(struct mm_struct)); -c01054ea: c7 04 24 18 00 00 00 movl $0x18,(%esp) -c01054f1: e8 40 13 00 00 call c0106836 -c01054f6: 89 45 f4 mov %eax,-0xc(%ebp) - // 检查是否成功分配了内存 - if (mm != NULL) { -c01054f9: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c01054fd: 74 59 je c0105558 - // 初始化内存映射列表 - list_init(&(mm->mmap_list)); -c01054ff: 8b 45 f4 mov -0xc(%ebp),%eax -c0105502: 89 45 f0 mov %eax,-0x10(%ebp) - elm->prev = elm->next = elm; -c0105505: 8b 45 f0 mov -0x10(%ebp),%eax -c0105508: 8b 55 f0 mov -0x10(%ebp),%edx -c010550b: 89 50 04 mov %edx,0x4(%eax) -c010550e: 8b 45 f0 mov -0x10(%ebp),%eax -c0105511: 8b 50 04 mov 0x4(%eax),%edx -c0105514: 8b 45 f0 mov -0x10(%ebp),%eax -c0105517: 89 10 mov %edx,(%eax) -} -c0105519: 90 nop - // 设置映射缓存为NULL,表示尚未缓存任何映射 - mm->mmap_cache = NULL; -c010551a: 8b 45 f4 mov -0xc(%ebp),%eax -c010551d: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax) - // 设置页目录为NULL,表示尚未分配页目录 - mm->pgdir = NULL; -c0105524: 8b 45 f4 mov -0xc(%ebp),%eax -c0105527: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax) - // 初始化映射计数为0,表示尚未创建任何内存映射 - mm->map_count = 0; -c010552e: 8b 45 f4 mov -0xc(%ebp),%eax -c0105531: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax) - // 如果交换空间初始化成功,则为当前内存管理结构体进行交换空间初始化 - if (swap_init_ok) swap_init_mm(mm); -c0105538: a1 14 c0 12 c0 mov 0xc012c014,%eax -c010553d: 85 c0 test %eax,%eax -c010553f: 74 0d je c010554e -c0105541: 8b 45 f4 mov -0xc(%ebp),%eax -c0105544: 89 04 24 mov %eax,(%esp) -c0105547: e8 65 15 00 00 call c0106ab1 -c010554c: eb 0a jmp c0105558 - else mm->sm_priv = NULL; -c010554e: 8b 45 f4 mov -0xc(%ebp),%eax -c0105551: c7 40 14 00 00 00 00 movl $0x0,0x14(%eax) - } - // 返回分配并初始化后的内存管理结构体指针 - return mm; -c0105558: 8b 45 f4 mov -0xc(%ebp),%eax +size_t +kallocated(void) { +c0104a27: 55 push %ebp +c0104a28: 89 e5 mov %esp,%ebp + return slob_allocated(); +c0104a2a: e8 ee ff ff ff call c0104a1d } -c010555b: c9 leave -c010555c: c3 ret +c0104a2f: 5d pop %ebp +c0104a30: c3 ret -c010555d : - * @param vm_flags 虚拟内存区域的标志,表示内存区域的权限和特性。 - * - * @return 返回指向新创建的vma_struct结构体的指针,如果内存分配失败,则返回NULL。 - */ -struct vma_struct * -vma_create(uintptr_t vm_start, uintptr_t vm_end, uint32_t vm_flags) { -c010555d: f3 0f 1e fb endbr32 -c0105561: 55 push %ebp -c0105562: 89 e5 mov %esp,%ebp -c0105564: 83 ec 28 sub $0x28,%esp - // 分配vma_struct结构体所需的内存空间 - struct vma_struct *vma = kmalloc(sizeof(struct vma_struct)); -c0105567: c7 04 24 18 00 00 00 movl $0x18,(%esp) -c010556e: e8 c3 12 00 00 call c0106836 -c0105573: 89 45 f4 mov %eax,-0xc(%ebp) - // 检查内存是否成功分配 - if (vma != NULL) { -c0105576: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c010557a: 74 1b je c0105597 - // 初始化vma_struct的成员变量 - vma->vm_start = vm_start; -c010557c: 8b 45 f4 mov -0xc(%ebp),%eax -c010557f: 8b 55 08 mov 0x8(%ebp),%edx -c0105582: 89 50 04 mov %edx,0x4(%eax) - vma->vm_end = vm_end; -c0105585: 8b 45 f4 mov -0xc(%ebp),%eax -c0105588: 8b 55 0c mov 0xc(%ebp),%edx -c010558b: 89 50 08 mov %edx,0x8(%eax) - vma->vm_flags = vm_flags; -c010558e: 8b 45 f4 mov -0xc(%ebp),%eax -c0105591: 8b 55 10 mov 0x10(%ebp),%edx -c0105594: 89 50 0c mov %edx,0xc(%eax) - } - // 返回指向新创建的vma_struct结构体的指针,或在内存分配失败时返回NULL - return vma; -c0105597: 8b 45 f4 mov -0xc(%ebp),%eax -} -c010559a: c9 leave -c010559b: c3 ret +c0104a31 : -c010559c : - * 此函数首先检查mmap_cache是否包含所需的VMA,以加速查找过程 - * 如果mmap_cache未命中,则遍历VMA列表,直到找到包含给定地址的VMA或确定不存在这样的VMA - * 如果找到了合适的VMA,它将更新mmap_cache以供后续查找使用 - */ -struct vma_struct * -find_vma(struct mm_struct *mm, uintptr_t addr) { -c010559c: f3 0f 1e fb endbr32 -c01055a0: 55 push %ebp -c01055a1: 89 e5 mov %esp,%ebp -c01055a3: 83 ec 20 sub $0x20,%esp - struct vma_struct *vma = NULL;// 初始化VMA指针为NULL -c01055a6: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) - if (mm != NULL) {// 检查传入的内存描述符是否有效 -c01055ad: 83 7d 08 00 cmpl $0x0,0x8(%ebp) -c01055b1: 0f 84 95 00 00 00 je c010564c - // 检查mmap_cache是否包含所需的VMA - vma = mm->mmap_cache; -c01055b7: 8b 45 08 mov 0x8(%ebp),%eax -c01055ba: 8b 40 08 mov 0x8(%eax),%eax -c01055bd: 89 45 fc mov %eax,-0x4(%ebp) - if (!(vma != NULL && vma->vm_start <= addr && vma->vm_end > addr)) { -c01055c0: 83 7d fc 00 cmpl $0x0,-0x4(%ebp) -c01055c4: 74 16 je c01055dc -c01055c6: 8b 45 fc mov -0x4(%ebp),%eax -c01055c9: 8b 40 04 mov 0x4(%eax),%eax -c01055cc: 39 45 0c cmp %eax,0xc(%ebp) -c01055cf: 72 0b jb c01055dc -c01055d1: 8b 45 fc mov -0x4(%ebp),%eax -c01055d4: 8b 40 08 mov 0x8(%eax),%eax -c01055d7: 39 45 0c cmp %eax,0xc(%ebp) -c01055da: 72 61 jb c010563d - // 如果mmap_cache未命中,则开始遍历VMA列表 - bool found = 0;// 初始化找到标志为0 -c01055dc: c7 45 f8 00 00 00 00 movl $0x0,-0x8(%ebp) - // 获取VMA列表的头指针 - list_entry_t *list = &(mm->mmap_list), *le = list; -c01055e3: 8b 45 08 mov 0x8(%ebp),%eax -c01055e6: 89 45 f0 mov %eax,-0x10(%ebp) -c01055e9: 8b 45 f0 mov -0x10(%ebp),%eax -c01055ec: 89 45 f4 mov %eax,-0xc(%ebp) - while ((le = list_next(le)) != list) { // 遍历VMA列表 -c01055ef: eb 28 jmp c0105619 - vma = le2vma(le, list_link);// 将链表项转换为VMA结构 -c01055f1: 8b 45 f4 mov -0xc(%ebp),%eax -c01055f4: 83 e8 10 sub $0x10,%eax -c01055f7: 89 45 fc mov %eax,-0x4(%ebp) - // 检查当前VMA是否包含给定地址 - if (vma->vm_start<=addr && addr < vma->vm_end) { -c01055fa: 8b 45 fc mov -0x4(%ebp),%eax -c01055fd: 8b 40 04 mov 0x4(%eax),%eax -c0105600: 39 45 0c cmp %eax,0xc(%ebp) -c0105603: 72 14 jb c0105619 -c0105605: 8b 45 fc mov -0x4(%ebp),%eax -c0105608: 8b 40 08 mov 0x8(%eax),%eax -c010560b: 39 45 0c cmp %eax,0xc(%ebp) -c010560e: 73 09 jae c0105619 - found = 1;// 找到合适的VMA -c0105610: c7 45 f8 01 00 00 00 movl $0x1,-0x8(%ebp) - break;// 结束循环 -c0105617: eb 17 jmp c0105630 -c0105619: 8b 45 f4 mov -0xc(%ebp),%eax -c010561c: 89 45 ec mov %eax,-0x14(%ebp) - return listelm->next; -c010561f: 8b 45 ec mov -0x14(%ebp),%eax -c0105622: 8b 40 04 mov 0x4(%eax),%eax - while ((le = list_next(le)) != list) { // 遍历VMA列表 -c0105625: 89 45 f4 mov %eax,-0xc(%ebp) -c0105628: 8b 45 f4 mov -0xc(%ebp),%eax -c010562b: 3b 45 f0 cmp -0x10(%ebp),%eax -c010562e: 75 c1 jne c01055f1 - } - } - if (!found) {// 如果未找到合适的VMA -c0105630: 83 7d f8 00 cmpl $0x0,-0x8(%ebp) -c0105634: 75 07 jne c010563d - vma = NULL;// 将VMA指针设置为NULL -c0105636: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) - } - } - // 如果找到了合适的VMA,更新mmap_cache - if (vma != NULL) { -c010563d: 83 7d fc 00 cmpl $0x0,-0x4(%ebp) -c0105641: 74 09 je c010564c - mm->mmap_cache = vma;// 更新mmap_cache以加速后续查找 -c0105643: 8b 45 08 mov 0x8(%ebp),%eax -c0105646: 8b 55 fc mov -0x4(%ebp),%edx -c0105649: 89 50 08 mov %edx,0x8(%eax) - } - } - return vma; -c010564c: 8b 45 fc mov -0x4(%ebp),%eax +static int find_order(int size) +{ +c0104a31: 55 push %ebp +c0104a32: 89 e5 mov %esp,%ebp +c0104a34: 83 ec 10 sub $0x10,%esp + int order = 0; +c0104a37: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) + for ( ; size > 4096 ; size >>=1) +c0104a3e: eb 06 jmp c0104a46 + order++; +c0104a40: ff 45 fc incl -0x4(%ebp) + for ( ; size > 4096 ; size >>=1) +c0104a43: d1 7d 08 sarl 0x8(%ebp) +c0104a46: 81 7d 08 00 10 00 00 cmpl $0x1000,0x8(%ebp) +c0104a4d: 7f f1 jg c0104a40 + return order; +c0104a4f: 8b 45 fc mov -0x4(%ebp),%eax } -c010564f: c9 leave -c0105650: c3 ret +c0104a52: 89 ec mov %ebp,%esp +c0104a54: 5d pop %ebp +c0104a55: c3 ret -c0105651 : - * - * @param prev 指向前一个虚拟内存区域(VMA)的结构体指针 - * @param next 指向后一个虚拟内存区域(VMA)的结构体指针 - */ -static inline void -check_vma_overlap(struct vma_struct *prev, struct vma_struct *next) { -c0105651: 55 push %ebp -c0105652: 89 e5 mov %esp,%ebp -c0105654: 83 ec 18 sub $0x18,%esp - assert(prev->vm_start < prev->vm_end);// 确保前一个VMA的地址范围是有效的 -c0105657: 8b 45 08 mov 0x8(%ebp),%eax -c010565a: 8b 50 04 mov 0x4(%eax),%edx -c010565d: 8b 45 08 mov 0x8(%ebp),%eax -c0105660: 8b 40 08 mov 0x8(%eax),%eax -c0105663: 39 c2 cmp %eax,%edx -c0105665: 72 24 jb c010568b -c0105667: c7 44 24 0c 25 b4 10 movl $0xc010b425,0xc(%esp) -c010566e: c0 -c010566f: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c0105676: c0 -c0105677: c7 44 24 04 a0 00 00 movl $0xa0,0x4(%esp) -c010567e: 00 -c010567f: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c0105686: e8 b8 ad ff ff call c0100443 <__panic> - assert(prev->vm_end <= next->vm_start);// 确保两个VMA之间没有重叠 -c010568b: 8b 45 08 mov 0x8(%ebp),%eax -c010568e: 8b 50 08 mov 0x8(%eax),%edx -c0105691: 8b 45 0c mov 0xc(%ebp),%eax -c0105694: 8b 40 04 mov 0x4(%eax),%eax -c0105697: 39 c2 cmp %eax,%edx -c0105699: 76 24 jbe c01056bf -c010569b: c7 44 24 0c 68 b4 10 movl $0xc010b468,0xc(%esp) -c01056a2: c0 -c01056a3: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c01056aa: c0 -c01056ab: c7 44 24 04 a1 00 00 movl $0xa1,0x4(%esp) -c01056b2: 00 -c01056b3: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c01056ba: e8 84 ad ff ff call c0100443 <__panic> - assert(next->vm_start < next->vm_end);// 确保后一个VMA的地址范围是有效的 -c01056bf: 8b 45 0c mov 0xc(%ebp),%eax -c01056c2: 8b 50 04 mov 0x4(%eax),%edx -c01056c5: 8b 45 0c mov 0xc(%ebp),%eax -c01056c8: 8b 40 08 mov 0x8(%eax),%eax -c01056cb: 39 c2 cmp %eax,%edx -c01056cd: 72 24 jb c01056f3 -c01056cf: c7 44 24 0c 87 b4 10 movl $0xc010b487,0xc(%esp) -c01056d6: c0 -c01056d7: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c01056de: c0 -c01056df: c7 44 24 04 a2 00 00 movl $0xa2,0x4(%esp) -c01056e6: 00 -c01056e7: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c01056ee: e8 50 ad ff ff call c0100443 <__panic> -} -c01056f3: 90 nop -c01056f4: c9 leave -c01056f5: c3 ret - -c01056f6 : - * - * @param mm 指向内存描述符结构 `struct mm_struct` 的指针,表示一个进程的内存空间。 - * @param vma 指向要插入的VMA结构 `struct vma_struct` 的指针,描述一个内存区域。 - */ -void -insert_vma_struct(struct mm_struct *mm, struct vma_struct *vma) { -c01056f6: f3 0f 1e fb endbr32 -c01056fa: 55 push %ebp -c01056fb: 89 e5 mov %esp,%ebp -c01056fd: 83 ec 48 sub $0x48,%esp - // 断言VMA结构的起始地址小于结束地址,确保VMA结构的有效性。 - assert(vma->vm_start < vma->vm_end); -c0105700: 8b 45 0c mov 0xc(%ebp),%eax -c0105703: 8b 50 04 mov 0x4(%eax),%edx -c0105706: 8b 45 0c mov 0xc(%ebp),%eax -c0105709: 8b 40 08 mov 0x8(%eax),%eax -c010570c: 39 c2 cmp %eax,%edx -c010570e: 72 24 jb c0105734 -c0105710: c7 44 24 0c a5 b4 10 movl $0xc010b4a5,0xc(%esp) -c0105717: c0 -c0105718: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c010571f: c0 -c0105720: c7 44 24 04 b3 00 00 movl $0xb3,0x4(%esp) -c0105727: 00 -c0105728: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c010572f: e8 0f ad ff ff call c0100443 <__panic> - // 指向内存描述符中的VMA链表。 - list_entry_t *list = &(mm->mmap_list); -c0105734: 8b 45 08 mov 0x8(%ebp),%eax -c0105737: 89 45 ec mov %eax,-0x14(%ebp) - // 遍历链表以找到新VMA结构的正确插入位置。 - list_entry_t *le_prev = list, *le_next; -c010573a: 8b 45 ec mov -0x14(%ebp),%eax -c010573d: 89 45 f4 mov %eax,-0xc(%ebp) +c0104a56 <__kmalloc>: - list_entry_t *le = list; -c0105740: 8b 45 ec mov -0x14(%ebp),%eax -c0105743: 89 45 f0 mov %eax,-0x10(%ebp) - // 遍历链表以找到新VMA结构的正确插入位置 - while ((le = list_next(le)) != list) { -c0105746: eb 1f jmp c0105767 - struct vma_struct *mmap_prev = le2vma(le, list_link); -c0105748: 8b 45 f0 mov -0x10(%ebp),%eax -c010574b: 83 e8 10 sub $0x10,%eax -c010574e: 89 45 e8 mov %eax,-0x18(%ebp) - // 如果当前VMA的起始地址大于新VMA的起始地址,则跳出循环 - if (mmap_prev->vm_start > vma->vm_start) { -c0105751: 8b 45 e8 mov -0x18(%ebp),%eax -c0105754: 8b 50 04 mov 0x4(%eax),%edx -c0105757: 8b 45 0c mov 0xc(%ebp),%eax -c010575a: 8b 40 04 mov 0x4(%eax),%eax -c010575d: 39 c2 cmp %eax,%edx -c010575f: 77 1f ja c0105780 - break; - } - le_prev = le; -c0105761: 8b 45 f0 mov -0x10(%ebp),%eax -c0105764: 89 45 f4 mov %eax,-0xc(%ebp) -c0105767: 8b 45 f0 mov -0x10(%ebp),%eax -c010576a: 89 45 e0 mov %eax,-0x20(%ebp) -c010576d: 8b 45 e0 mov -0x20(%ebp),%eax -c0105770: 8b 40 04 mov 0x4(%eax),%eax - while ((le = list_next(le)) != list) { -c0105773: 89 45 f0 mov %eax,-0x10(%ebp) -c0105776: 8b 45 f0 mov -0x10(%ebp),%eax -c0105779: 3b 45 ec cmp -0x14(%ebp),%eax -c010577c: 75 ca jne c0105748 -c010577e: eb 01 jmp c0105781 - break; -c0105780: 90 nop -c0105781: 8b 45 f4 mov -0xc(%ebp),%eax -c0105784: 89 45 dc mov %eax,-0x24(%ebp) -c0105787: 8b 45 dc mov -0x24(%ebp),%eax -c010578a: 8b 40 04 mov 0x4(%eax),%eax - } - // 获取下一个链表项 - le_next = list_next(le_prev); -c010578d: 89 45 e4 mov %eax,-0x1c(%ebp) +static void *__kmalloc(size_t size, gfp_t gfp) +{ +c0104a56: 55 push %ebp +c0104a57: 89 e5 mov %esp,%ebp +c0104a59: 83 ec 28 sub $0x28,%esp + slob_t *m; + bigblock_t *bb; + unsigned long flags; - /* check overlap */ - // 检查前一个VMA结构是否与新VMA结构重叠 - if (le_prev != list) { -c0105790: 8b 45 f4 mov -0xc(%ebp),%eax -c0105793: 3b 45 ec cmp -0x14(%ebp),%eax -c0105796: 74 15 je c01057ad - check_vma_overlap(le2vma(le_prev, list_link), vma); -c0105798: 8b 45 f4 mov -0xc(%ebp),%eax -c010579b: 8d 50 f0 lea -0x10(%eax),%edx -c010579e: 8b 45 0c mov 0xc(%ebp),%eax -c01057a1: 89 44 24 04 mov %eax,0x4(%esp) -c01057a5: 89 14 24 mov %edx,(%esp) -c01057a8: e8 a4 fe ff ff call c0105651 - } - // 检查下一个VMA结构是否与新VMA结构重叠 - if (le_next != list) { -c01057ad: 8b 45 e4 mov -0x1c(%ebp),%eax -c01057b0: 3b 45 ec cmp -0x14(%ebp),%eax -c01057b3: 74 15 je c01057ca - check_vma_overlap(vma, le2vma(le_next, list_link)); -c01057b5: 8b 45 e4 mov -0x1c(%ebp),%eax -c01057b8: 83 e8 10 sub $0x10,%eax -c01057bb: 89 44 24 04 mov %eax,0x4(%esp) -c01057bf: 8b 45 0c mov 0xc(%ebp),%eax -c01057c2: 89 04 24 mov %eax,(%esp) -c01057c5: e8 87 fe ff ff call c0105651 - } - // 设置VMA结构所属的内存描述符 - vma->vm_mm = mm; -c01057ca: 8b 45 0c mov 0xc(%ebp),%eax -c01057cd: 8b 55 08 mov 0x8(%ebp),%edx -c01057d0: 89 10 mov %edx,(%eax) - // 将新VMA结构插入链表 - list_add_after(le_prev, &(vma->list_link)); -c01057d2: 8b 45 0c mov 0xc(%ebp),%eax -c01057d5: 8d 50 10 lea 0x10(%eax),%edx -c01057d8: 8b 45 f4 mov -0xc(%ebp),%eax -c01057db: 89 45 d8 mov %eax,-0x28(%ebp) -c01057de: 89 55 d4 mov %edx,-0x2c(%ebp) - __list_add(elm, listelm, listelm->next); -c01057e1: 8b 45 d8 mov -0x28(%ebp),%eax -c01057e4: 8b 40 04 mov 0x4(%eax),%eax -c01057e7: 8b 55 d4 mov -0x2c(%ebp),%edx -c01057ea: 89 55 d0 mov %edx,-0x30(%ebp) -c01057ed: 8b 55 d8 mov -0x28(%ebp),%edx -c01057f0: 89 55 cc mov %edx,-0x34(%ebp) -c01057f3: 89 45 c8 mov %eax,-0x38(%ebp) - prev->next = next->prev = elm; -c01057f6: 8b 45 c8 mov -0x38(%ebp),%eax -c01057f9: 8b 55 d0 mov -0x30(%ebp),%edx -c01057fc: 89 10 mov %edx,(%eax) -c01057fe: 8b 45 c8 mov -0x38(%ebp),%eax -c0105801: 8b 10 mov (%eax),%edx -c0105803: 8b 45 cc mov -0x34(%ebp),%eax -c0105806: 89 50 04 mov %edx,0x4(%eax) - elm->next = next; -c0105809: 8b 45 d0 mov -0x30(%ebp),%eax -c010580c: 8b 55 c8 mov -0x38(%ebp),%edx -c010580f: 89 50 04 mov %edx,0x4(%eax) - elm->prev = prev; -c0105812: 8b 45 d0 mov -0x30(%ebp),%eax -c0105815: 8b 55 cc mov -0x34(%ebp),%edx -c0105818: 89 10 mov %edx,(%eax) -} -c010581a: 90 nop -} -c010581b: 90 nop - // 增加内存描述符中的映射计数 - mm->map_count ++; -c010581c: 8b 45 08 mov 0x8(%ebp),%eax -c010581f: 8b 40 10 mov 0x10(%eax),%eax -c0105822: 8d 50 01 lea 0x1(%eax),%edx -c0105825: 8b 45 08 mov 0x8(%ebp),%eax -c0105828: 89 50 10 mov %edx,0x10(%eax) -} -c010582b: 90 nop -c010582c: c9 leave -c010582d: c3 ret + if (size < PAGE_SIZE - SLOB_UNIT) { +c0104a5c: 81 7d 08 f7 0f 00 00 cmpl $0xff7,0x8(%ebp) +c0104a63: 77 3b ja c0104aa0 <__kmalloc+0x4a> + m = slob_alloc(size + SLOB_UNIT, gfp, 0); +c0104a65: 8b 45 08 mov 0x8(%ebp),%eax +c0104a68: 8d 50 08 lea 0x8(%eax),%edx +c0104a6b: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c0104a72: 00 +c0104a73: 8b 45 0c mov 0xc(%ebp),%eax +c0104a76: 89 44 24 04 mov %eax,0x4(%esp) +c0104a7a: 89 14 24 mov %edx,(%esp) +c0104a7d: e8 79 fc ff ff call c01046fb +c0104a82: 89 45 ec mov %eax,-0x14(%ebp) + return m ? (void *)(m + 1) : 0; +c0104a85: 83 7d ec 00 cmpl $0x0,-0x14(%ebp) +c0104a89: 74 0b je c0104a96 <__kmalloc+0x40> +c0104a8b: 8b 45 ec mov -0x14(%ebp),%eax +c0104a8e: 83 c0 08 add $0x8,%eax +c0104a91: e9 b0 00 00 00 jmp c0104b46 <__kmalloc+0xf0> +c0104a96: b8 00 00 00 00 mov $0x0,%eax +c0104a9b: e9 a6 00 00 00 jmp c0104b46 <__kmalloc+0xf0> + } -c010582e : - * 此函数遍历并销毁与内存管理结构(mm_struct)关联的所有虚拟内存区域(VMA), - * 然后释放内存管理结构本身所占用的内存。这样做是为了确保在销毁内存管理结构之前, - * 所有相关的资源都被正确地释放。 - */ -void -mm_destroy(struct mm_struct *mm) { -c010582e: f3 0f 1e fb endbr32 -c0105832: 55 push %ebp -c0105833: 89 e5 mov %esp,%ebp -c0105835: 83 ec 38 sub $0x38,%esp - // 获取内存映射列表的头指针 - list_entry_t *list = &(mm->mmap_list), *le; -c0105838: 8b 45 08 mov 0x8(%ebp),%eax -c010583b: 89 45 f4 mov %eax,-0xc(%ebp) - // 遍历内存映射列表,直到回到起点 - while ((le = list_next(list)) != list) { -c010583e: eb 40 jmp c0105880 -c0105840: 8b 45 f0 mov -0x10(%ebp),%eax -c0105843: 89 45 ec mov %eax,-0x14(%ebp) - __list_del(listelm->prev, listelm->next); -c0105846: 8b 45 ec mov -0x14(%ebp),%eax -c0105849: 8b 40 04 mov 0x4(%eax),%eax -c010584c: 8b 55 ec mov -0x14(%ebp),%edx -c010584f: 8b 12 mov (%edx),%edx -c0105851: 89 55 e8 mov %edx,-0x18(%ebp) -c0105854: 89 45 e4 mov %eax,-0x1c(%ebp) - prev->next = next; -c0105857: 8b 45 e8 mov -0x18(%ebp),%eax -c010585a: 8b 55 e4 mov -0x1c(%ebp),%edx -c010585d: 89 50 04 mov %edx,0x4(%eax) - next->prev = prev; -c0105860: 8b 45 e4 mov -0x1c(%ebp),%eax -c0105863: 8b 55 e8 mov -0x18(%ebp),%edx -c0105866: 89 10 mov %edx,(%eax) -} -c0105868: 90 nop -} -c0105869: 90 nop - // 从列表中删除当前虚拟内存区域的项 - list_del(le); - // 释放虚拟内存区域结构的内存 - kfree(le2vma(le, list_link),sizeof(struct vma_struct)); //kfree vma -c010586a: 8b 45 f0 mov -0x10(%ebp),%eax -c010586d: 83 e8 10 sub $0x10,%eax -c0105870: c7 44 24 04 18 00 00 movl $0x18,0x4(%esp) -c0105877: 00 -c0105878: 89 04 24 mov %eax,(%esp) -c010587b: e8 d5 0f 00 00 call c0106855 -c0105880: 8b 45 f4 mov -0xc(%ebp),%eax -c0105883: 89 45 e0 mov %eax,-0x20(%ebp) - return listelm->next; -c0105886: 8b 45 e0 mov -0x20(%ebp),%eax -c0105889: 8b 40 04 mov 0x4(%eax),%eax - while ((le = list_next(list)) != list) { -c010588c: 89 45 f0 mov %eax,-0x10(%ebp) -c010588f: 8b 45 f0 mov -0x10(%ebp),%eax -c0105892: 3b 45 f4 cmp -0xc(%ebp),%eax -c0105895: 75 a9 jne c0105840 - } - // 释放内存管理结构本身的内存 - kfree(mm, sizeof(struct mm_struct)); //kfree mm -c0105897: c7 44 24 04 18 00 00 movl $0x18,0x4(%esp) -c010589e: 00 -c010589f: 8b 45 08 mov 0x8(%ebp),%eax -c01058a2: 89 04 24 mov %eax,(%esp) -c01058a5: e8 ab 0f 00 00 call c0106855 - // 将指针设置为NULL,表示该结构已被销毁 - mm=NULL; -c01058aa: c7 45 08 00 00 00 00 movl $0x0,0x8(%ebp) -} -c01058b1: 90 nop -c01058b2: c9 leave -c01058b3: c3 ret + bb = slob_alloc(sizeof(bigblock_t), gfp, 0); +c0104aa0: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c0104aa7: 00 +c0104aa8: 8b 45 0c mov 0xc(%ebp),%eax +c0104aab: 89 44 24 04 mov %eax,0x4(%esp) +c0104aaf: c7 04 24 0c 00 00 00 movl $0xc,(%esp) +c0104ab6: e8 40 fc ff ff call c01046fb +c0104abb: 89 45 f4 mov %eax,-0xc(%ebp) + if (!bb) +c0104abe: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0104ac2: 75 07 jne c0104acb <__kmalloc+0x75> + return 0; +c0104ac4: b8 00 00 00 00 mov $0x0,%eax +c0104ac9: eb 7b jmp c0104b46 <__kmalloc+0xf0> -c01058b4 : -/** - * 初始化虚拟内存管理(VMM)系统。 - * 此函数通过执行一系列检查来确保VMM系统可以正确初始化和运行。 - */ -void -vmm_init(void) { -c01058b4: f3 0f 1e fb endbr32 -c01058b8: 55 push %ebp -c01058b9: 89 e5 mov %esp,%ebp -c01058bb: 83 ec 08 sub $0x8,%esp - // 检查VMM系统的状态和环境,以确保其能够正常工作。 - check_vmm(); -c01058be: e8 03 00 00 00 call c01058c6 -} -c01058c3: 90 nop -c01058c4: c9 leave -c01058c5: c3 ret + bb->order = find_order(size); +c0104acb: 8b 45 08 mov 0x8(%ebp),%eax +c0104ace: 89 04 24 mov %eax,(%esp) +c0104ad1: e8 5b ff ff ff call c0104a31 +c0104ad6: 8b 55 f4 mov -0xc(%ebp),%edx +c0104ad9: 89 02 mov %eax,(%edx) + bb->pages = (void *)__slob_get_free_pages(gfp, bb->order); +c0104adb: 8b 45 f4 mov -0xc(%ebp),%eax +c0104ade: 8b 00 mov (%eax),%eax +c0104ae0: 89 44 24 04 mov %eax,0x4(%esp) +c0104ae4: 8b 45 0c mov 0xc(%ebp),%eax +c0104ae7: 89 04 24 mov %eax,(%esp) +c0104aea: e8 99 fb ff ff call c0104688 <__slob_get_free_pages> +c0104aef: 8b 55 f4 mov -0xc(%ebp),%edx +c0104af2: 89 42 04 mov %eax,0x4(%edx) -c01058c6 : - * 此函数的目的是确保虚拟内存管理系统的正确性通过检查内存区域结构(VMA)、页面故障处理以及免费页面计数的 consistency 来实现 - * 它首先保存当前的免费页面数量,然后执行与 VMA 和页面故障相关的检查,最后确认免费页面数量未发生变化 - * 这是为了确保在检查过程中,内存状态没有因为错误或意外的修改而改变,从而验证内存管理的正确性 - */ -static void -check_vmm(void) { -c01058c6: f3 0f 1e fb endbr32 -c01058ca: 55 push %ebp -c01058cb: 89 e5 mov %esp,%ebp -c01058cd: 83 ec 28 sub $0x28,%esp - // 保存当前的免费页面数量,用于后续的 consistency 检查 - size_t nr_free_pages_store = nr_free_pages(); -c01058d0: e8 2a df ff ff call c01037ff -c01058d5: 89 45 f4 mov %eax,-0xc(%ebp) - // 检查虚拟内存区域(VMA)结构的正确性 - check_vma_struct(); -c01058d8: e8 42 00 00 00 call c010591f - // 检查页面故障处理的正确性 - check_pgfault(); -c01058dd: e8 d3 04 00 00 call c0105db5 - // 确保在检查过程中免费页面数量未发生变化,表明内存管理操作是正确的 - assert(nr_free_pages_store == nr_free_pages()); -c01058e2: e8 18 df ff ff call c01037ff -c01058e7: 39 45 f4 cmp %eax,-0xc(%ebp) -c01058ea: 74 24 je c0105910 -c01058ec: c7 44 24 0c c4 b4 10 movl $0xc010b4c4,0xc(%esp) -c01058f3: c0 -c01058f4: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c01058fb: c0 -c01058fc: c7 44 24 04 0e 01 00 movl $0x10e,0x4(%esp) -c0105903: 00 -c0105904: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c010590b: e8 33 ab ff ff call c0100443 <__panic> - // 如果所有检查都通过,输出成功信息 - cprintf("check_vmm() succeeded.\n"); -c0105910: c7 04 24 eb b4 10 c0 movl $0xc010b4eb,(%esp) -c0105917: e8 bb a9 ff ff call c01002d7 + if (bb->pages) { +c0104af5: 8b 45 f4 mov -0xc(%ebp),%eax +c0104af8: 8b 40 04 mov 0x4(%eax),%eax +c0104afb: 85 c0 test %eax,%eax +c0104afd: 74 2f je c0104b2e <__kmalloc+0xd8> + spin_lock_irqsave(&block_lock, flags); +c0104aff: e8 2d fa ff ff call c0104531 <__intr_save> +c0104b04: 89 45 f0 mov %eax,-0x10(%ebp) + bb->next = bigblocks; +c0104b07: 8b 15 f0 bf 12 c0 mov 0xc012bff0,%edx +c0104b0d: 8b 45 f4 mov -0xc(%ebp),%eax +c0104b10: 89 50 08 mov %edx,0x8(%eax) + bigblocks = bb; +c0104b13: 8b 45 f4 mov -0xc(%ebp),%eax +c0104b16: a3 f0 bf 12 c0 mov %eax,0xc012bff0 + spin_unlock_irqrestore(&block_lock, flags); +c0104b1b: 8b 45 f0 mov -0x10(%ebp),%eax +c0104b1e: 89 04 24 mov %eax,(%esp) +c0104b21: e8 37 fa ff ff call c010455d <__intr_restore> + return bb->pages; +c0104b26: 8b 45 f4 mov -0xc(%ebp),%eax +c0104b29: 8b 40 04 mov 0x4(%eax),%eax +c0104b2c: eb 18 jmp c0104b46 <__kmalloc+0xf0> + } + + slob_free(bb, sizeof(bigblock_t)); +c0104b2e: c7 44 24 04 0c 00 00 movl $0xc,0x4(%esp) +c0104b35: 00 +c0104b36: 8b 45 f4 mov -0xc(%ebp),%eax +c0104b39: 89 04 24 mov %eax,(%esp) +c0104b3c: e8 8d fd ff ff call c01048ce + return 0; +c0104b41: b8 00 00 00 00 mov $0x0,%eax } -c010591c: 90 nop -c010591d: c9 leave -c010591e: c3 ret +c0104b46: 89 ec mov %ebp,%esp +c0104b48: 5d pop %ebp +c0104b49: c3 ret -c010591f : +c0104b4a : -//测试虚拟内存区域(VMA)结构的创建、插入和查找功能。 -static void -check_vma_struct(void) { -c010591f: f3 0f 1e fb endbr32 -c0105923: 55 push %ebp -c0105924: 89 e5 mov %esp,%ebp -c0105926: 83 ec 68 sub $0x68,%esp - // 记录当前空闲页面数量 - size_t nr_free_pages_store = nr_free_pages(); -c0105929: e8 d1 de ff ff call c01037ff -c010592e: 89 45 ec mov %eax,-0x14(%ebp) +void * +kmalloc(size_t size) +{ +c0104b4a: 55 push %ebp +c0104b4b: 89 e5 mov %esp,%ebp +c0104b4d: 83 ec 18 sub $0x18,%esp + return __kmalloc(size, 0); +c0104b50: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c0104b57: 00 +c0104b58: 8b 45 08 mov 0x8(%ebp),%eax +c0104b5b: 89 04 24 mov %eax,(%esp) +c0104b5e: e8 f3 fe ff ff call c0104a56 <__kmalloc> +} +c0104b63: 89 ec mov %ebp,%esp +c0104b65: 5d pop %ebp +c0104b66: c3 ret - struct mm_struct *mm = mm_create();// 创建内存管理结构 mm -c0105931: e8 aa fb ff ff call c01054e0 -c0105936: 89 45 e8 mov %eax,-0x18(%ebp) - assert(mm != NULL);// 确保 mm 不为 NULL -c0105939: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) -c010593d: 75 24 jne c0105963 -c010593f: c7 44 24 0c 03 b5 10 movl $0xc010b503,0xc(%esp) -c0105946: c0 -c0105947: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c010594e: c0 -c010594f: c7 44 24 04 1a 01 00 movl $0x11a,0x4(%esp) -c0105956: 00 -c0105957: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c010595e: e8 e0 aa ff ff call c0100443 <__panic> +c0104b67 : - int step1 = 10, step2 = step1 * 10;// 定义两个步骤的步数 -c0105963: c7 45 e4 0a 00 00 00 movl $0xa,-0x1c(%ebp) -c010596a: 8b 55 e4 mov -0x1c(%ebp),%edx -c010596d: 89 d0 mov %edx,%eax -c010596f: c1 e0 02 shl $0x2,%eax -c0105972: 01 d0 add %edx,%eax -c0105974: 01 c0 add %eax,%eax -c0105976: 89 45 e0 mov %eax,-0x20(%ebp) - int i; - for (i = step1; i >= 1; i --) {// 第一步:创建并插入10个VMA -c0105979: 8b 45 e4 mov -0x1c(%ebp),%eax -c010597c: 89 45 f4 mov %eax,-0xc(%ebp) -c010597f: eb 6f jmp c01059f0 - // 创建 VMA 结构 - struct vma_struct *vma = vma_create(i * 5, i * 5 + 2, 0); -c0105981: 8b 55 f4 mov -0xc(%ebp),%edx -c0105984: 89 d0 mov %edx,%eax -c0105986: c1 e0 02 shl $0x2,%eax -c0105989: 01 d0 add %edx,%eax -c010598b: 83 c0 02 add $0x2,%eax -c010598e: 89 c1 mov %eax,%ecx -c0105990: 8b 55 f4 mov -0xc(%ebp),%edx -c0105993: 89 d0 mov %edx,%eax -c0105995: c1 e0 02 shl $0x2,%eax -c0105998: 01 d0 add %edx,%eax -c010599a: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c01059a1: 00 -c01059a2: 89 4c 24 04 mov %ecx,0x4(%esp) -c01059a6: 89 04 24 mov %eax,(%esp) -c01059a9: e8 af fb ff ff call c010555d -c01059ae: 89 45 bc mov %eax,-0x44(%ebp) - assert(vma != NULL);// 确保 VMA 不为 NULL -c01059b1: 83 7d bc 00 cmpl $0x0,-0x44(%ebp) -c01059b5: 75 24 jne c01059db -c01059b7: c7 44 24 0c 0e b5 10 movl $0xc010b50e,0xc(%esp) -c01059be: c0 -c01059bf: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c01059c6: c0 -c01059c7: c7 44 24 04 22 01 00 movl $0x122,0x4(%esp) -c01059ce: 00 -c01059cf: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c01059d6: e8 68 aa ff ff call c0100443 <__panic> - insert_vma_struct(mm, vma); //将 VMA 插入到 mm 中 -c01059db: 8b 45 bc mov -0x44(%ebp),%eax -c01059de: 89 44 24 04 mov %eax,0x4(%esp) -c01059e2: 8b 45 e8 mov -0x18(%ebp),%eax -c01059e5: 89 04 24 mov %eax,(%esp) -c01059e8: e8 09 fd ff ff call c01056f6 - for (i = step1; i >= 1; i --) {// 第一步:创建并插入10个VMA -c01059ed: ff 4d f4 decl -0xc(%ebp) -c01059f0: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c01059f4: 7f 8b jg c0105981 - } +void kfree(void *block) +{ +c0104b67: 55 push %ebp +c0104b68: 89 e5 mov %esp,%ebp +c0104b6a: 83 ec 28 sub $0x28,%esp + bigblock_t *bb, **last = &bigblocks; +c0104b6d: c7 45 f0 f0 bf 12 c0 movl $0xc012bff0,-0x10(%ebp) + unsigned long flags; - for (i = step1 + 1; i <= step2; i ++) {// 第二步:创建并插入90个VMA -c01059f6: 8b 45 e4 mov -0x1c(%ebp),%eax -c01059f9: 40 inc %eax -c01059fa: 89 45 f4 mov %eax,-0xc(%ebp) -c01059fd: eb 6f jmp c0105a6e - // 创建 VMA 结构 - struct vma_struct *vma = vma_create(i * 5, i * 5 + 2, 0); -c01059ff: 8b 55 f4 mov -0xc(%ebp),%edx -c0105a02: 89 d0 mov %edx,%eax -c0105a04: c1 e0 02 shl $0x2,%eax -c0105a07: 01 d0 add %edx,%eax -c0105a09: 83 c0 02 add $0x2,%eax -c0105a0c: 89 c1 mov %eax,%ecx -c0105a0e: 8b 55 f4 mov -0xc(%ebp),%edx -c0105a11: 89 d0 mov %edx,%eax -c0105a13: c1 e0 02 shl $0x2,%eax -c0105a16: 01 d0 add %edx,%eax -c0105a18: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c0105a1f: 00 -c0105a20: 89 4c 24 04 mov %ecx,0x4(%esp) -c0105a24: 89 04 24 mov %eax,(%esp) -c0105a27: e8 31 fb ff ff call c010555d -c0105a2c: 89 45 c0 mov %eax,-0x40(%ebp) - assert(vma != NULL);// 确保 VMA 不为 NULL -c0105a2f: 83 7d c0 00 cmpl $0x0,-0x40(%ebp) -c0105a33: 75 24 jne c0105a59 -c0105a35: c7 44 24 0c 0e b5 10 movl $0xc010b50e,0xc(%esp) -c0105a3c: c0 -c0105a3d: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c0105a44: c0 -c0105a45: c7 44 24 04 29 01 00 movl $0x129,0x4(%esp) -c0105a4c: 00 -c0105a4d: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c0105a54: e8 ea a9 ff ff call c0100443 <__panic> - insert_vma_struct(mm, vma);// 将 VMA 插入到 mm 中 -c0105a59: 8b 45 c0 mov -0x40(%ebp),%eax -c0105a5c: 89 44 24 04 mov %eax,0x4(%esp) -c0105a60: 8b 45 e8 mov -0x18(%ebp),%eax -c0105a63: 89 04 24 mov %eax,(%esp) -c0105a66: e8 8b fc ff ff call c01056f6 - for (i = step1 + 1; i <= step2; i ++) {// 第二步:创建并插入90个VMA -c0105a6b: ff 45 f4 incl -0xc(%ebp) -c0105a6e: 8b 45 f4 mov -0xc(%ebp),%eax -c0105a71: 3b 45 e0 cmp -0x20(%ebp),%eax -c0105a74: 7e 89 jle c01059ff - } - // 获取 VMA 链表的第一个节点 - list_entry_t *le = list_next(&(mm->mmap_list)); -c0105a76: 8b 45 e8 mov -0x18(%ebp),%eax -c0105a79: 89 45 b8 mov %eax,-0x48(%ebp) -c0105a7c: 8b 45 b8 mov -0x48(%ebp),%eax -c0105a7f: 8b 40 04 mov 0x4(%eax),%eax -c0105a82: 89 45 f0 mov %eax,-0x10(%ebp) + if (!block) +c0104b74: 83 7d 08 00 cmpl $0x0,0x8(%ebp) +c0104b78: 0f 84 a3 00 00 00 je c0104c21 + return; - for (i = 1; i <= step2; i ++) {// 验证插入顺序 -c0105a85: c7 45 f4 01 00 00 00 movl $0x1,-0xc(%ebp) -c0105a8c: e9 96 00 00 00 jmp c0105b27 - assert(le != &(mm->mmap_list));// 确保节点不为空 -c0105a91: 8b 45 e8 mov -0x18(%ebp),%eax -c0105a94: 39 45 f0 cmp %eax,-0x10(%ebp) -c0105a97: 75 24 jne c0105abd -c0105a99: c7 44 24 0c 1a b5 10 movl $0xc010b51a,0xc(%esp) -c0105aa0: c0 -c0105aa1: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c0105aa8: c0 -c0105aa9: c7 44 24 04 30 01 00 movl $0x130,0x4(%esp) -c0105ab0: 00 -c0105ab1: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c0105ab8: e8 86 a9 ff ff call c0100443 <__panic> - struct vma_struct *mmap = le2vma(le, list_link);// 将链表节点转换为 VMA 结构 -c0105abd: 8b 45 f0 mov -0x10(%ebp),%eax -c0105ac0: 83 e8 10 sub $0x10,%eax -c0105ac3: 89 45 c4 mov %eax,-0x3c(%ebp) - // 确认 VMA 的起始和结束地址 - assert(mmap->vm_start == i * 5 && mmap->vm_end == i * 5 + 2); -c0105ac6: 8b 45 c4 mov -0x3c(%ebp),%eax -c0105ac9: 8b 48 04 mov 0x4(%eax),%ecx -c0105acc: 8b 55 f4 mov -0xc(%ebp),%edx -c0105acf: 89 d0 mov %edx,%eax -c0105ad1: c1 e0 02 shl $0x2,%eax -c0105ad4: 01 d0 add %edx,%eax -c0105ad6: 39 c1 cmp %eax,%ecx -c0105ad8: 75 17 jne c0105af1 -c0105ada: 8b 45 c4 mov -0x3c(%ebp),%eax -c0105add: 8b 48 08 mov 0x8(%eax),%ecx -c0105ae0: 8b 55 f4 mov -0xc(%ebp),%edx -c0105ae3: 89 d0 mov %edx,%eax -c0105ae5: c1 e0 02 shl $0x2,%eax -c0105ae8: 01 d0 add %edx,%eax -c0105aea: 83 c0 02 add $0x2,%eax -c0105aed: 39 c1 cmp %eax,%ecx -c0105aef: 74 24 je c0105b15 -c0105af1: c7 44 24 0c 34 b5 10 movl $0xc010b534,0xc(%esp) -c0105af8: c0 -c0105af9: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c0105b00: c0 -c0105b01: c7 44 24 04 33 01 00 movl $0x133,0x4(%esp) -c0105b08: 00 -c0105b09: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c0105b10: e8 2e a9 ff ff call c0100443 <__panic> -c0105b15: 8b 45 f0 mov -0x10(%ebp),%eax -c0105b18: 89 45 b4 mov %eax,-0x4c(%ebp) -c0105b1b: 8b 45 b4 mov -0x4c(%ebp),%eax -c0105b1e: 8b 40 04 mov 0x4(%eax),%eax - le = list_next(le);// 移动到下一个节点 -c0105b21: 89 45 f0 mov %eax,-0x10(%ebp) - for (i = 1; i <= step2; i ++) {// 验证插入顺序 -c0105b24: ff 45 f4 incl -0xc(%ebp) -c0105b27: 8b 45 f4 mov -0xc(%ebp),%eax -c0105b2a: 3b 45 e0 cmp -0x20(%ebp),%eax -c0105b2d: 0f 8e 5e ff ff ff jle c0105a91 - } + if (!((unsigned long)block & (PAGE_SIZE-1))) { +c0104b7e: 8b 45 08 mov 0x8(%ebp),%eax +c0104b81: 25 ff 0f 00 00 and $0xfff,%eax +c0104b86: 85 c0 test %eax,%eax +c0104b88: 75 7f jne c0104c09 + /* might be on the big block list */ + spin_lock_irqsave(&block_lock, flags); +c0104b8a: e8 a2 f9 ff ff call c0104531 <__intr_save> +c0104b8f: 89 45 ec mov %eax,-0x14(%ebp) + for (bb = bigblocks; bb; last = &bb->next, bb = bb->next) { +c0104b92: a1 f0 bf 12 c0 mov 0xc012bff0,%eax +c0104b97: 89 45 f4 mov %eax,-0xc(%ebp) +c0104b9a: eb 5c jmp c0104bf8 + if (bb->pages == block) { +c0104b9c: 8b 45 f4 mov -0xc(%ebp),%eax +c0104b9f: 8b 40 04 mov 0x4(%eax),%eax +c0104ba2: 39 45 08 cmp %eax,0x8(%ebp) +c0104ba5: 75 3f jne c0104be6 + *last = bb->next; +c0104ba7: 8b 45 f4 mov -0xc(%ebp),%eax +c0104baa: 8b 50 08 mov 0x8(%eax),%edx +c0104bad: 8b 45 f0 mov -0x10(%ebp),%eax +c0104bb0: 89 10 mov %edx,(%eax) + spin_unlock_irqrestore(&block_lock, flags); +c0104bb2: 8b 45 ec mov -0x14(%ebp),%eax +c0104bb5: 89 04 24 mov %eax,(%esp) +c0104bb8: e8 a0 f9 ff ff call c010455d <__intr_restore> + __slob_free_pages((unsigned long)block, bb->order); +c0104bbd: 8b 45 f4 mov -0xc(%ebp),%eax +c0104bc0: 8b 10 mov (%eax),%edx +c0104bc2: 8b 45 08 mov 0x8(%ebp),%eax +c0104bc5: 89 54 24 04 mov %edx,0x4(%esp) +c0104bc9: 89 04 24 mov %eax,(%esp) +c0104bcc: e8 f2 fa ff ff call c01046c3 <__slob_free_pages> + slob_free(bb, sizeof(bigblock_t)); +c0104bd1: c7 44 24 04 0c 00 00 movl $0xc,0x4(%esp) +c0104bd8: 00 +c0104bd9: 8b 45 f4 mov -0xc(%ebp),%eax +c0104bdc: 89 04 24 mov %eax,(%esp) +c0104bdf: e8 ea fc ff ff call c01048ce + return; +c0104be4: eb 3c jmp c0104c22 + for (bb = bigblocks; bb; last = &bb->next, bb = bb->next) { +c0104be6: 8b 45 f4 mov -0xc(%ebp),%eax +c0104be9: 83 c0 08 add $0x8,%eax +c0104bec: 89 45 f0 mov %eax,-0x10(%ebp) +c0104bef: 8b 45 f4 mov -0xc(%ebp),%eax +c0104bf2: 8b 40 08 mov 0x8(%eax),%eax +c0104bf5: 89 45 f4 mov %eax,-0xc(%ebp) +c0104bf8: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0104bfc: 75 9e jne c0104b9c + } + } + spin_unlock_irqrestore(&block_lock, flags); +c0104bfe: 8b 45 ec mov -0x14(%ebp),%eax +c0104c01: 89 04 24 mov %eax,(%esp) +c0104c04: e8 54 f9 ff ff call c010455d <__intr_restore> + } - for (i = 5; i <= 5 * step2; i +=5) {// 查找特定地址范围内的 VMA -c0105b33: c7 45 f4 05 00 00 00 movl $0x5,-0xc(%ebp) -c0105b3a: e9 cb 01 00 00 jmp c0105d0a - struct vma_struct *vma1 = find_vma(mm, i);// 查找地址 i 处的 VMA -c0105b3f: 8b 45 f4 mov -0xc(%ebp),%eax -c0105b42: 89 44 24 04 mov %eax,0x4(%esp) -c0105b46: 8b 45 e8 mov -0x18(%ebp),%eax -c0105b49: 89 04 24 mov %eax,(%esp) -c0105b4c: e8 4b fa ff ff call c010559c -c0105b51: 89 45 d8 mov %eax,-0x28(%ebp) - assert(vma1 != NULL);// 确保找到 VMA -c0105b54: 83 7d d8 00 cmpl $0x0,-0x28(%ebp) -c0105b58: 75 24 jne c0105b7e -c0105b5a: c7 44 24 0c 69 b5 10 movl $0xc010b569,0xc(%esp) -c0105b61: c0 -c0105b62: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c0105b69: c0 -c0105b6a: c7 44 24 04 39 01 00 movl $0x139,0x4(%esp) -c0105b71: 00 -c0105b72: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c0105b79: e8 c5 a8 ff ff call c0100443 <__panic> - // 查找地址 i + 1 处的 VMA - struct vma_struct *vma2 = find_vma(mm, i+1); -c0105b7e: 8b 45 f4 mov -0xc(%ebp),%eax -c0105b81: 40 inc %eax -c0105b82: 89 44 24 04 mov %eax,0x4(%esp) -c0105b86: 8b 45 e8 mov -0x18(%ebp),%eax -c0105b89: 89 04 24 mov %eax,(%esp) -c0105b8c: e8 0b fa ff ff call c010559c -c0105b91: 89 45 d4 mov %eax,-0x2c(%ebp) - assert(vma2 != NULL);// 确保找到 VMA -c0105b94: 83 7d d4 00 cmpl $0x0,-0x2c(%ebp) -c0105b98: 75 24 jne c0105bbe -c0105b9a: c7 44 24 0c 76 b5 10 movl $0xc010b576,0xc(%esp) -c0105ba1: c0 -c0105ba2: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c0105ba9: c0 -c0105baa: c7 44 24 04 3c 01 00 movl $0x13c,0x4(%esp) -c0105bb1: 00 -c0105bb2: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c0105bb9: e8 85 a8 ff ff call c0100443 <__panic> - // 查找地址 i + 2 处的 VMA - struct vma_struct *vma3 = find_vma(mm, i+2); -c0105bbe: 8b 45 f4 mov -0xc(%ebp),%eax -c0105bc1: 83 c0 02 add $0x2,%eax -c0105bc4: 89 44 24 04 mov %eax,0x4(%esp) -c0105bc8: 8b 45 e8 mov -0x18(%ebp),%eax -c0105bcb: 89 04 24 mov %eax,(%esp) -c0105bce: e8 c9 f9 ff ff call c010559c -c0105bd3: 89 45 d0 mov %eax,-0x30(%ebp) - assert(vma3 == NULL);// 确保未找到 VMA -c0105bd6: 83 7d d0 00 cmpl $0x0,-0x30(%ebp) -c0105bda: 74 24 je c0105c00 -c0105bdc: c7 44 24 0c 83 b5 10 movl $0xc010b583,0xc(%esp) -c0105be3: c0 -c0105be4: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c0105beb: c0 -c0105bec: c7 44 24 04 3f 01 00 movl $0x13f,0x4(%esp) -c0105bf3: 00 -c0105bf4: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c0105bfb: e8 43 a8 ff ff call c0100443 <__panic> - // 查找地址 i + 3 处的 VMA - struct vma_struct *vma4 = find_vma(mm, i+3); -c0105c00: 8b 45 f4 mov -0xc(%ebp),%eax -c0105c03: 83 c0 03 add $0x3,%eax -c0105c06: 89 44 24 04 mov %eax,0x4(%esp) -c0105c0a: 8b 45 e8 mov -0x18(%ebp),%eax -c0105c0d: 89 04 24 mov %eax,(%esp) -c0105c10: e8 87 f9 ff ff call c010559c -c0105c15: 89 45 cc mov %eax,-0x34(%ebp) - assert(vma4 == NULL);// 确保未找到 VMA -c0105c18: 83 7d cc 00 cmpl $0x0,-0x34(%ebp) -c0105c1c: 74 24 je c0105c42 -c0105c1e: c7 44 24 0c 90 b5 10 movl $0xc010b590,0xc(%esp) -c0105c25: c0 -c0105c26: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c0105c2d: c0 -c0105c2e: c7 44 24 04 42 01 00 movl $0x142,0x4(%esp) -c0105c35: 00 -c0105c36: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c0105c3d: e8 01 a8 ff ff call c0100443 <__panic> - // 查找地址 i + 4 处的 VMA - struct vma_struct *vma5 = find_vma(mm, i+4); -c0105c42: 8b 45 f4 mov -0xc(%ebp),%eax -c0105c45: 83 c0 04 add $0x4,%eax -c0105c48: 89 44 24 04 mov %eax,0x4(%esp) -c0105c4c: 8b 45 e8 mov -0x18(%ebp),%eax -c0105c4f: 89 04 24 mov %eax,(%esp) -c0105c52: e8 45 f9 ff ff call c010559c -c0105c57: 89 45 c8 mov %eax,-0x38(%ebp) - assert(vma5 == NULL);// 确保未找到 VMA -c0105c5a: 83 7d c8 00 cmpl $0x0,-0x38(%ebp) -c0105c5e: 74 24 je c0105c84 -c0105c60: c7 44 24 0c 9d b5 10 movl $0xc010b59d,0xc(%esp) -c0105c67: c0 -c0105c68: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c0105c6f: c0 -c0105c70: c7 44 24 04 45 01 00 movl $0x145,0x4(%esp) -c0105c77: 00 -c0105c78: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c0105c7f: e8 bf a7 ff ff call c0100443 <__panic> - // 确认 VMA1 的起始和结束地址 - assert(vma1->vm_start == i && vma1->vm_end == i + 2); -c0105c84: 8b 45 d8 mov -0x28(%ebp),%eax -c0105c87: 8b 50 04 mov 0x4(%eax),%edx -c0105c8a: 8b 45 f4 mov -0xc(%ebp),%eax -c0105c8d: 39 c2 cmp %eax,%edx -c0105c8f: 75 10 jne c0105ca1 -c0105c91: 8b 45 d8 mov -0x28(%ebp),%eax -c0105c94: 8b 40 08 mov 0x8(%eax),%eax -c0105c97: 8b 55 f4 mov -0xc(%ebp),%edx -c0105c9a: 83 c2 02 add $0x2,%edx -c0105c9d: 39 d0 cmp %edx,%eax -c0105c9f: 74 24 je c0105cc5 -c0105ca1: c7 44 24 0c ac b5 10 movl $0xc010b5ac,0xc(%esp) -c0105ca8: c0 -c0105ca9: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c0105cb0: c0 -c0105cb1: c7 44 24 04 47 01 00 movl $0x147,0x4(%esp) -c0105cb8: 00 -c0105cb9: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c0105cc0: e8 7e a7 ff ff call c0100443 <__panic> - // 确认 VMA2 的起始和结束地址 - assert(vma2->vm_start == i && vma2->vm_end == i + 2); -c0105cc5: 8b 45 d4 mov -0x2c(%ebp),%eax -c0105cc8: 8b 50 04 mov 0x4(%eax),%edx -c0105ccb: 8b 45 f4 mov -0xc(%ebp),%eax -c0105cce: 39 c2 cmp %eax,%edx -c0105cd0: 75 10 jne c0105ce2 -c0105cd2: 8b 45 d4 mov -0x2c(%ebp),%eax -c0105cd5: 8b 40 08 mov 0x8(%eax),%eax -c0105cd8: 8b 55 f4 mov -0xc(%ebp),%edx -c0105cdb: 83 c2 02 add $0x2,%edx -c0105cde: 39 d0 cmp %edx,%eax -c0105ce0: 74 24 je c0105d06 -c0105ce2: c7 44 24 0c dc b5 10 movl $0xc010b5dc,0xc(%esp) -c0105ce9: c0 -c0105cea: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c0105cf1: c0 -c0105cf2: c7 44 24 04 49 01 00 movl $0x149,0x4(%esp) -c0105cf9: 00 -c0105cfa: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c0105d01: e8 3d a7 ff ff call c0100443 <__panic> - for (i = 5; i <= 5 * step2; i +=5) {// 查找特定地址范围内的 VMA -c0105d06: 83 45 f4 05 addl $0x5,-0xc(%ebp) -c0105d0a: 8b 55 e0 mov -0x20(%ebp),%edx -c0105d0d: 89 d0 mov %edx,%eax -c0105d0f: c1 e0 02 shl $0x2,%eax -c0105d12: 01 d0 add %edx,%eax -c0105d14: 39 45 f4 cmp %eax,-0xc(%ebp) -c0105d17: 0f 8e 22 fe ff ff jle c0105b3f - } - // 检查小于5的地址范围内是否存在 VMA - for (i =4; i>=0; i--) { -c0105d1d: c7 45 f4 04 00 00 00 movl $0x4,-0xc(%ebp) -c0105d24: eb 6f jmp c0105d95 - // 查找地址 i 处的 VMA - struct vma_struct *vma_below_5= find_vma(mm,i); -c0105d26: 8b 45 f4 mov -0xc(%ebp),%eax -c0105d29: 89 44 24 04 mov %eax,0x4(%esp) -c0105d2d: 8b 45 e8 mov -0x18(%ebp),%eax -c0105d30: 89 04 24 mov %eax,(%esp) -c0105d33: e8 64 f8 ff ff call c010559c -c0105d38: 89 45 dc mov %eax,-0x24(%ebp) - if (vma_below_5 != NULL ) {// 如果找到 VMA -c0105d3b: 83 7d dc 00 cmpl $0x0,-0x24(%ebp) -c0105d3f: 74 27 je c0105d68 - cprintf("vma_below_5: i %x, start %x, end %x\n",i, vma_below_5->vm_start, vma_below_5->vm_end); -c0105d41: 8b 45 dc mov -0x24(%ebp),%eax -c0105d44: 8b 50 08 mov 0x8(%eax),%edx -c0105d47: 8b 45 dc mov -0x24(%ebp),%eax -c0105d4a: 8b 40 04 mov 0x4(%eax),%eax -c0105d4d: 89 54 24 0c mov %edx,0xc(%esp) -c0105d51: 89 44 24 08 mov %eax,0x8(%esp) -c0105d55: 8b 45 f4 mov -0xc(%ebp),%eax -c0105d58: 89 44 24 04 mov %eax,0x4(%esp) -c0105d5c: c7 04 24 0c b6 10 c0 movl $0xc010b60c,(%esp) -c0105d63: e8 6f a5 ff ff call c01002d7 - } - assert(vma_below_5 == NULL);// 确保未找到 VMA -c0105d68: 83 7d dc 00 cmpl $0x0,-0x24(%ebp) -c0105d6c: 74 24 je c0105d92 -c0105d6e: c7 44 24 0c 31 b6 10 movl $0xc010b631,0xc(%esp) -c0105d75: c0 -c0105d76: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c0105d7d: c0 -c0105d7e: c7 44 24 04 52 01 00 movl $0x152,0x4(%esp) -c0105d85: 00 -c0105d86: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c0105d8d: e8 b1 a6 ff ff call c0100443 <__panic> - for (i =4; i>=0; i--) { -c0105d92: ff 4d f4 decl -0xc(%ebp) -c0105d95: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0105d99: 79 8b jns c0105d26 - } + slob_free((slob_t *)block - 1, 0); +c0104c09: 8b 45 08 mov 0x8(%ebp),%eax +c0104c0c: 83 e8 08 sub $0x8,%eax +c0104c0f: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c0104c16: 00 +c0104c17: 89 04 24 mov %eax,(%esp) +c0104c1a: e8 af fc ff ff call c01048ce + return; +c0104c1f: eb 01 jmp c0104c22 + return; +c0104c21: 90 nop +} +c0104c22: 89 ec mov %ebp,%esp +c0104c24: 5d pop %ebp +c0104c25: c3 ret - mm_destroy(mm);// 销毁 mm 结构 -c0105d9b: 8b 45 e8 mov -0x18(%ebp),%eax -c0105d9e: 89 04 24 mov %eax,(%esp) -c0105da1: e8 88 fa ff ff call c010582e +c0104c26 : - // 确保释放的页面数量与初始记录一致 - //assert(nr_free_pages_store == nr_free_pages()); - // 输出成功信息 - cprintf("check_vma_struct() succeeded!\n"); -c0105da6: c7 04 24 48 b6 10 c0 movl $0xc010b648,(%esp) -c0105dad: e8 25 a5 ff ff call c01002d7 + +unsigned int ksize(const void *block) +{ +c0104c26: 55 push %ebp +c0104c27: 89 e5 mov %esp,%ebp +c0104c29: 83 ec 28 sub $0x28,%esp + bigblock_t *bb; + unsigned long flags; + + if (!block) +c0104c2c: 83 7d 08 00 cmpl $0x0,0x8(%ebp) +c0104c30: 75 07 jne c0104c39 + return 0; +c0104c32: b8 00 00 00 00 mov $0x0,%eax +c0104c37: eb 6b jmp c0104ca4 + + if (!((unsigned long)block & (PAGE_SIZE-1))) { +c0104c39: 8b 45 08 mov 0x8(%ebp),%eax +c0104c3c: 25 ff 0f 00 00 and $0xfff,%eax +c0104c41: 85 c0 test %eax,%eax +c0104c43: 75 54 jne c0104c99 + spin_lock_irqsave(&block_lock, flags); +c0104c45: e8 e7 f8 ff ff call c0104531 <__intr_save> +c0104c4a: 89 45 f0 mov %eax,-0x10(%ebp) + for (bb = bigblocks; bb; bb = bb->next) +c0104c4d: a1 f0 bf 12 c0 mov 0xc012bff0,%eax +c0104c52: 89 45 f4 mov %eax,-0xc(%ebp) +c0104c55: eb 31 jmp c0104c88 + if (bb->pages == block) { +c0104c57: 8b 45 f4 mov -0xc(%ebp),%eax +c0104c5a: 8b 40 04 mov 0x4(%eax),%eax +c0104c5d: 39 45 08 cmp %eax,0x8(%ebp) +c0104c60: 75 1d jne c0104c7f + spin_unlock_irqrestore(&slob_lock, flags); +c0104c62: 8b 45 f0 mov -0x10(%ebp),%eax +c0104c65: 89 04 24 mov %eax,(%esp) +c0104c68: e8 f0 f8 ff ff call c010455d <__intr_restore> + return PAGE_SIZE << bb->order; +c0104c6d: 8b 45 f4 mov -0xc(%ebp),%eax +c0104c70: 8b 00 mov (%eax),%eax +c0104c72: ba 00 10 00 00 mov $0x1000,%edx +c0104c77: 88 c1 mov %al,%cl +c0104c79: d3 e2 shl %cl,%edx +c0104c7b: 89 d0 mov %edx,%eax +c0104c7d: eb 25 jmp c0104ca4 + for (bb = bigblocks; bb; bb = bb->next) +c0104c7f: 8b 45 f4 mov -0xc(%ebp),%eax +c0104c82: 8b 40 08 mov 0x8(%eax),%eax +c0104c85: 89 45 f4 mov %eax,-0xc(%ebp) +c0104c88: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0104c8c: 75 c9 jne c0104c57 + } + spin_unlock_irqrestore(&block_lock, flags); +c0104c8e: 8b 45 f0 mov -0x10(%ebp),%eax +c0104c91: 89 04 24 mov %eax,(%esp) +c0104c94: e8 c4 f8 ff ff call c010455d <__intr_restore> + } + + return ((slob_t *)block - 1)->units * SLOB_UNIT; +c0104c99: 8b 45 08 mov 0x8(%ebp),%eax +c0104c9c: 83 e8 08 sub $0x8,%eax +c0104c9f: 8b 00 mov (%eax),%eax +c0104ca1: c1 e0 03 shl $0x3,%eax } -c0105db2: 90 nop -c0105db3: c9 leave -c0105db4: c3 ret +c0104ca4: 89 ec mov %ebp,%esp +c0104ca6: 5d pop %ebp +c0104ca7: c3 ret -c0105db5 : -struct mm_struct *check_mm_struct; +c0104ca8 : +page2ppn(struct Page *page) { +c0104ca8: 55 push %ebp +c0104ca9: 89 e5 mov %esp,%ebp + return page - pages; +c0104cab: 8b 15 00 c0 12 c0 mov 0xc012c000,%edx +c0104cb1: 8b 45 08 mov 0x8(%ebp),%eax +c0104cb4: 29 d0 sub %edx,%eax +c0104cb6: c1 f8 05 sar $0x5,%eax +} +c0104cb9: 5d pop %ebp +c0104cba: c3 ret -// check_pgfault - check correctness of pgfault handler -// 检查页故障处理的正确性 -static void -check_pgfault(void) { -c0105db5: f3 0f 1e fb endbr32 -c0105db9: 55 push %ebp -c0105dba: 89 e5 mov %esp,%ebp -c0105dbc: 83 ec 38 sub $0x38,%esp - // 保存当前空闲页面的数量,用于后续检查 - size_t nr_free_pages_store = nr_free_pages(); -c0105dbf: e8 3b da ff ff call c01037ff -c0105dc4: 89 45 ec mov %eax,-0x14(%ebp) - // 创建内存管理结构体 - check_mm_struct = mm_create(); -c0105dc7: e8 14 f7 ff ff call c01054e0 -c0105dcc: a3 c4 e0 12 c0 mov %eax,0xc012e0c4 - // 确保内存管理结构体创建成功 - assert(check_mm_struct != NULL); -c0105dd1: a1 c4 e0 12 c0 mov 0xc012e0c4,%eax -c0105dd6: 85 c0 test %eax,%eax -c0105dd8: 75 24 jne c0105dfe -c0105dda: c7 44 24 0c 67 b6 10 movl $0xc010b667,0xc(%esp) -c0105de1: c0 -c0105de2: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c0105de9: c0 -c0105dea: c7 44 24 04 68 01 00 movl $0x168,0x4(%esp) -c0105df1: 00 -c0105df2: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c0105df9: e8 45 a6 ff ff call c0100443 <__panic> - // 将新创建的内存管理结构体赋值给局部变量mm - struct mm_struct *mm = check_mm_struct; -c0105dfe: a1 c4 e0 12 c0 mov 0xc012e0c4,%eax -c0105e03: 89 45 e8 mov %eax,-0x18(%ebp) - // 将引导程序的页目录复制到新创建的内存管理结构体中 - pde_t *pgdir = mm->pgdir = boot_pgdir; -c0105e06: 8b 15 e0 89 12 c0 mov 0xc01289e0,%edx -c0105e0c: 8b 45 e8 mov -0x18(%ebp),%eax -c0105e0f: 89 50 0c mov %edx,0xc(%eax) -c0105e12: 8b 45 e8 mov -0x18(%ebp),%eax -c0105e15: 8b 40 0c mov 0xc(%eax),%eax -c0105e18: 89 45 e4 mov %eax,-0x1c(%ebp) - // 确保页目录的第0项是空的 - assert(pgdir[0] == 0); -c0105e1b: 8b 45 e4 mov -0x1c(%ebp),%eax -c0105e1e: 8b 00 mov (%eax),%eax -c0105e20: 85 c0 test %eax,%eax -c0105e22: 74 24 je c0105e48 -c0105e24: c7 44 24 0c 7f b6 10 movl $0xc010b67f,0xc(%esp) -c0105e2b: c0 -c0105e2c: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c0105e33: c0 -c0105e34: c7 44 24 04 6e 01 00 movl $0x16e,0x4(%esp) -c0105e3b: 00 -c0105e3c: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c0105e43: e8 fb a5 ff ff call c0100443 <__panic> - // 创建一个虚拟内存区域结构体,具有写权限 - struct vma_struct *vma = vma_create(0, PTSIZE, VM_WRITE); -c0105e48: c7 44 24 08 02 00 00 movl $0x2,0x8(%esp) -c0105e4f: 00 -c0105e50: c7 44 24 04 00 00 40 movl $0x400000,0x4(%esp) -c0105e57: 00 -c0105e58: c7 04 24 00 00 00 00 movl $0x0,(%esp) -c0105e5f: e8 f9 f6 ff ff call c010555d -c0105e64: 89 45 e0 mov %eax,-0x20(%ebp) - // 确保虚拟内存区域结构体创建成功 - assert(vma != NULL); -c0105e67: 83 7d e0 00 cmpl $0x0,-0x20(%ebp) -c0105e6b: 75 24 jne c0105e91 -c0105e6d: c7 44 24 0c 0e b5 10 movl $0xc010b50e,0xc(%esp) -c0105e74: c0 -c0105e75: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c0105e7c: c0 -c0105e7d: c7 44 24 04 72 01 00 movl $0x172,0x4(%esp) -c0105e84: 00 -c0105e85: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c0105e8c: e8 b2 a5 ff ff call c0100443 <__panic> - // 将虚拟内存区域结构体插入到内存管理结构体中 - insert_vma_struct(mm, vma); -c0105e91: 8b 45 e0 mov -0x20(%ebp),%eax -c0105e94: 89 44 24 04 mov %eax,0x4(%esp) -c0105e98: 8b 45 e8 mov -0x18(%ebp),%eax -c0105e9b: 89 04 24 mov %eax,(%esp) -c0105e9e: e8 53 f8 ff ff call c01056f6 - // 定义一个地址,用于访问虚拟内存 - uintptr_t addr = 0x100; -c0105ea3: c7 45 dc 00 01 00 00 movl $0x100,-0x24(%ebp) - // 确保通过该地址可以找到之前插入的虚拟内存区域 - assert(find_vma(mm, addr) == vma); -c0105eaa: 8b 45 dc mov -0x24(%ebp),%eax -c0105ead: 89 44 24 04 mov %eax,0x4(%esp) -c0105eb1: 8b 45 e8 mov -0x18(%ebp),%eax -c0105eb4: 89 04 24 mov %eax,(%esp) -c0105eb7: e8 e0 f6 ff ff call c010559c -c0105ebc: 39 45 e0 cmp %eax,-0x20(%ebp) -c0105ebf: 74 24 je c0105ee5 -c0105ec1: c7 44 24 0c 8d b6 10 movl $0xc010b68d,0xc(%esp) -c0105ec8: c0 -c0105ec9: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c0105ed0: c0 -c0105ed1: c7 44 24 04 78 01 00 movl $0x178,0x4(%esp) -c0105ed8: 00 -c0105ed9: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c0105ee0: e8 5e a5 ff ff call c0100443 <__panic> - // 初始化一个累加器,用于校验写入的数据 - int i, sum = 0; -c0105ee5: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%ebp) - // 写入数据到虚拟内存,并累加 - for (i = 0; i < 100; i ++) { -c0105eec: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) -c0105ef3: eb 16 jmp c0105f0b - *(char *)(addr + i) = i; -c0105ef5: 8b 55 f4 mov -0xc(%ebp),%edx -c0105ef8: 8b 45 dc mov -0x24(%ebp),%eax -c0105efb: 01 d0 add %edx,%eax -c0105efd: 8b 55 f4 mov -0xc(%ebp),%edx -c0105f00: 88 10 mov %dl,(%eax) - sum += i; -c0105f02: 8b 45 f4 mov -0xc(%ebp),%eax -c0105f05: 01 45 f0 add %eax,-0x10(%ebp) - for (i = 0; i < 100; i ++) { -c0105f08: ff 45 f4 incl -0xc(%ebp) -c0105f0b: 83 7d f4 63 cmpl $0x63,-0xc(%ebp) -c0105f0f: 7e e4 jle c0105ef5 - } - // 读取虚拟内存中的数据,并减去,最终结果应为0 - for (i = 0; i < 100; i ++) { -c0105f11: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) -c0105f18: eb 14 jmp c0105f2e - sum -= *(char *)(addr + i); -c0105f1a: 8b 55 f4 mov -0xc(%ebp),%edx -c0105f1d: 8b 45 dc mov -0x24(%ebp),%eax -c0105f20: 01 d0 add %edx,%eax -c0105f22: 0f b6 00 movzbl (%eax),%eax -c0105f25: 0f be c0 movsbl %al,%eax -c0105f28: 29 45 f0 sub %eax,-0x10(%ebp) - for (i = 0; i < 100; i ++) { -c0105f2b: ff 45 f4 incl -0xc(%ebp) -c0105f2e: 83 7d f4 63 cmpl $0x63,-0xc(%ebp) -c0105f32: 7e e6 jle c0105f1a - } - // 确保累加器的值为0,证明数据读写正确 - assert(sum == 0); -c0105f34: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c0105f38: 74 24 je c0105f5e -c0105f3a: c7 44 24 0c a7 b6 10 movl $0xc010b6a7,0xc(%esp) -c0105f41: c0 -c0105f42: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c0105f49: c0 -c0105f4a: c7 44 24 04 85 01 00 movl $0x185,0x4(%esp) -c0105f51: 00 -c0105f52: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c0105f59: e8 e5 a4 ff ff call c0100443 <__panic> - // 移除页目录中的相应页面 - page_remove(pgdir, ROUNDDOWN(addr, PGSIZE)); -c0105f5e: 8b 45 dc mov -0x24(%ebp),%eax -c0105f61: 89 45 d8 mov %eax,-0x28(%ebp) -c0105f64: 8b 45 d8 mov -0x28(%ebp),%eax -c0105f67: 25 00 f0 ff ff and $0xfffff000,%eax -c0105f6c: 89 44 24 04 mov %eax,0x4(%esp) -c0105f70: 8b 45 e4 mov -0x1c(%ebp),%eax -c0105f73: 89 04 24 mov %eax,(%esp) -c0105f76: e8 aa e0 ff ff call c0104025 - // 释放第0项页目录对应的页面 - free_page(pde2page(pgdir[0])); -c0105f7b: 8b 45 e4 mov -0x1c(%ebp),%eax -c0105f7e: 8b 00 mov (%eax),%eax -c0105f80: 89 04 24 mov %eax,(%esp) -c0105f83: e8 40 f5 ff ff call c01054c8 -c0105f88: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c0105f8f: 00 -c0105f90: 89 04 24 mov %eax,(%esp) -c0105f93: e8 30 d8 ff ff call c01037c8 - // 将页目录的第0项设置为空 - pgdir[0] = 0; -c0105f98: 8b 45 e4 mov -0x1c(%ebp),%eax -c0105f9b: c7 00 00 00 00 00 movl $0x0,(%eax) - // 将内存管理结构体中的页目录设置为空 - mm->pgdir = NULL; -c0105fa1: 8b 45 e8 mov -0x18(%ebp),%eax -c0105fa4: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax) - // 销毁内存管理结构体 - mm_destroy(mm); -c0105fab: 8b 45 e8 mov -0x18(%ebp),%eax -c0105fae: 89 04 24 mov %eax,(%esp) -c0105fb1: e8 78 f8 ff ff call c010582e - // 将检查用的内存管理结构体设置为空 - check_mm_struct = NULL; -c0105fb6: c7 05 c4 e0 12 c0 00 movl $0x0,0xc012e0c4 -c0105fbd: 00 00 00 - // 确保空闲页面的数量没有变化,证明内存管理正确 - assert(nr_free_pages_store == nr_free_pages()); -c0105fc0: e8 3a d8 ff ff call c01037ff -c0105fc5: 39 45 ec cmp %eax,-0x14(%ebp) -c0105fc8: 74 24 je c0105fee -c0105fca: c7 44 24 0c c4 b4 10 movl $0xc010b4c4,0xc(%esp) -c0105fd1: c0 -c0105fd2: c7 44 24 08 43 b4 10 movl $0xc010b443,0x8(%esp) -c0105fd9: c0 -c0105fda: c7 44 24 04 93 01 00 movl $0x193,0x4(%esp) -c0105fe1: 00 -c0105fe2: c7 04 24 58 b4 10 c0 movl $0xc010b458,(%esp) -c0105fe9: e8 55 a4 ff ff call c0100443 <__panic> - // 打印成功信息 - cprintf("check_pgfault() succeeded!\n"); -c0105fee: c7 04 24 b0 b6 10 c0 movl $0xc010b6b0,(%esp) -c0105ff5: e8 dd a2 ff ff call c01002d7 +c0104cbb : +page2pa(struct Page *page) { +c0104cbb: 55 push %ebp +c0104cbc: 89 e5 mov %esp,%ebp +c0104cbe: 83 ec 04 sub $0x4,%esp + return page2ppn(page) << PGSHIFT; +c0104cc1: 8b 45 08 mov 0x8(%ebp),%eax +c0104cc4: 89 04 24 mov %eax,(%esp) +c0104cc7: e8 dc ff ff ff call c0104ca8 +c0104ccc: c1 e0 0c shl $0xc,%eax } -c0105ffa: 90 nop -c0105ffb: c9 leave -c0105ffc: c3 ret +c0104ccf: 89 ec mov %ebp,%esp +c0104cd1: 5d pop %ebp +c0104cd2: c3 ret -c0105ffd : - * @param addr 引发页面错误的线性地址。 - * - * @return 成功返回0,失败返回负错误码。 - */ -int -do_pgfault(struct mm_struct *mm, uint32_t error_code, uintptr_t addr) { -c0105ffd: f3 0f 1e fb endbr32 -c0106001: 55 push %ebp -c0106002: 89 e5 mov %esp,%ebp -c0106004: 83 ec 38 sub $0x38,%esp - int ret = -E_INVAL;// 初始化返回值为无效错误 -c0106007: c7 45 f4 fd ff ff ff movl $0xfffffffd,-0xc(%ebp) - //try to find a vma which include addr - // 尝试找到包含 addr 的 vma - struct vma_struct *vma = find_vma(mm, addr); -c010600e: 8b 45 10 mov 0x10(%ebp),%eax -c0106011: 89 44 24 04 mov %eax,0x4(%esp) -c0106015: 8b 45 08 mov 0x8(%ebp),%eax -c0106018: 89 04 24 mov %eax,(%esp) -c010601b: e8 7c f5 ff ff call c010559c -c0106020: 89 45 ec mov %eax,-0x14(%ebp) +c0104cd3 : +pa2page(uintptr_t pa) { +c0104cd3: 55 push %ebp +c0104cd4: 89 e5 mov %esp,%ebp +c0104cd6: 83 ec 18 sub $0x18,%esp + if (PPN(pa) >= npage) { +c0104cd9: 8b 45 08 mov 0x8(%ebp),%eax +c0104cdc: c1 e8 0c shr $0xc,%eax +c0104cdf: 89 c2 mov %eax,%edx +c0104ce1: a1 04 c0 12 c0 mov 0xc012c004,%eax +c0104ce6: 39 c2 cmp %eax,%edx +c0104ce8: 72 1c jb c0104d06 + panic("pa2page called with invalid pa"); +c0104cea: c7 44 24 08 0c ae 10 movl $0xc010ae0c,0x8(%esp) +c0104cf1: c0 +c0104cf2: c7 44 24 04 5f 00 00 movl $0x5f,0x4(%esp) +c0104cf9: 00 +c0104cfa: c7 04 24 2b ae 10 c0 movl $0xc010ae2b,(%esp) +c0104d01: e8 3f bf ff ff call c0100c45 <__panic> + return &pages[PPN(pa)]; +c0104d06: 8b 15 00 c0 12 c0 mov 0xc012c000,%edx +c0104d0c: 8b 45 08 mov 0x8(%ebp),%eax +c0104d0f: c1 e8 0c shr $0xc,%eax +c0104d12: c1 e0 05 shl $0x5,%eax +c0104d15: 01 d0 add %edx,%eax +} +c0104d17: 89 ec mov %ebp,%esp +c0104d19: 5d pop %ebp +c0104d1a: c3 ret - pgfault_num++;// 增加页面错误计数 -c0106023: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c0106028: 40 inc %eax -c0106029: a3 0c c0 12 c0 mov %eax,0xc012c00c - // 检查 addr 是否在 mm 的 vma 范围内 - //If the addr is in the range of a mm's vma? - if (vma == NULL || vma->vm_start > addr) { -c010602e: 83 7d ec 00 cmpl $0x0,-0x14(%ebp) -c0106032: 74 0b je c010603f -c0106034: 8b 45 ec mov -0x14(%ebp),%eax -c0106037: 8b 40 04 mov 0x4(%eax),%eax -c010603a: 39 45 10 cmp %eax,0x10(%ebp) -c010603d: 73 18 jae c0106057 - cprintf("not valid addr %x, and can not find it in vma\n", addr); -c010603f: 8b 45 10 mov 0x10(%ebp),%eax -c0106042: 89 44 24 04 mov %eax,0x4(%esp) -c0106046: c7 04 24 cc b6 10 c0 movl $0xc010b6cc,(%esp) -c010604d: e8 85 a2 ff ff call c01002d7 - goto failed;// 跳转到错误处理部分 -c0106052: e9 ba 01 00 00 jmp c0106211 - } - //check the error_code - // 检查错误代码 - switch (error_code & 3) { -c0106057: 8b 45 0c mov 0xc(%ebp),%eax -c010605a: 83 e0 03 and $0x3,%eax -c010605d: 85 c0 test %eax,%eax -c010605f: 74 34 je c0106095 -c0106061: 83 f8 01 cmp $0x1,%eax -c0106064: 74 1e je c0106084 - default: - /* 默认错误代码标志:3 (W/R=1, P=1): 写操作,存在 */ - /* error code flag : default is 3 ( W/R=1, P=1): write, present */ - case 2: /* error code flag : (W/R=1, P=0): write, not present */ - /* 错误代码标志:(W/R=1, P=0): 写操作,不存在 */ - if (!(vma->vm_flags & VM_WRITE)) { -c0106066: 8b 45 ec mov -0x14(%ebp),%eax -c0106069: 8b 40 0c mov 0xc(%eax),%eax -c010606c: 83 e0 02 and $0x2,%eax -c010606f: 85 c0 test %eax,%eax -c0106071: 75 40 jne c01060b3 - cprintf("do_pgfault failed: error code flag = write AND not present, but the addr's vma cannot write\n"); -c0106073: c7 04 24 fc b6 10 c0 movl $0xc010b6fc,(%esp) -c010607a: e8 58 a2 ff ff call c01002d7 - goto failed;// 跳转到错误处理部分 -c010607f: e9 8d 01 00 00 jmp c0106211 - } - break; - case 1: /* error code flag : (W/R=0, P=1): read, present */ - /* 错误代码标志:(W/R=0, P=1): 读操作,存在 */ - cprintf("do_pgfault failed: error code flag = read AND present\n"); -c0106084: c7 04 24 5c b7 10 c0 movl $0xc010b75c,(%esp) -c010608b: e8 47 a2 ff ff call c01002d7 - goto failed;// 跳转到错误处理部分 -c0106090: e9 7c 01 00 00 jmp c0106211 - case 0: /* error code flag : (W/R=0, P=0): read, not present */ - /* 错误代码标志:(W/R=0, P=0): 读操作,不存在 */ - if (!(vma->vm_flags & (VM_READ | VM_EXEC))) { -c0106095: 8b 45 ec mov -0x14(%ebp),%eax -c0106098: 8b 40 0c mov 0xc(%eax),%eax -c010609b: 83 e0 05 and $0x5,%eax -c010609e: 85 c0 test %eax,%eax -c01060a0: 75 12 jne c01060b4 - cprintf("do_pgfault failed: error code flag = read AND not present, but the addr's vma cannot read or exec\n"); -c01060a2: c7 04 24 94 b7 10 c0 movl $0xc010b794,(%esp) -c01060a9: e8 29 a2 ff ff call c01002d7 - goto failed;// 跳转到错误处理部分 -c01060ae: e9 5e 01 00 00 jmp c0106211 - break; -c01060b3: 90 nop - /* 如果 (写入已存在的地址) 或 - * (写入不存在的地址且地址可写) 或 - * (读取不存在的地址且地址可读) - * 则继续处理 - */ - uint32_t perm = PTE_U;// 初始化权限标志为用户可访问 -c01060b4: c7 45 f0 04 00 00 00 movl $0x4,-0x10(%ebp) - if (vma->vm_flags & VM_WRITE) { -c01060bb: 8b 45 ec mov -0x14(%ebp),%eax -c01060be: 8b 40 0c mov 0xc(%eax),%eax -c01060c1: 83 e0 02 and $0x2,%eax -c01060c4: 85 c0 test %eax,%eax -c01060c6: 74 04 je c01060cc - perm |= PTE_W;// 如果 vma 可写,则设置写权限 -c01060c8: 83 4d f0 02 orl $0x2,-0x10(%ebp) - } - addr = ROUNDDOWN(addr, PGSIZE);// 将地址对齐到页边界 -c01060cc: 8b 45 10 mov 0x10(%ebp),%eax -c01060cf: 89 45 e8 mov %eax,-0x18(%ebp) -c01060d2: 8b 45 e8 mov -0x18(%ebp),%eax -c01060d5: 25 00 f0 ff ff and $0xfffff000,%eax -c01060da: 89 45 10 mov %eax,0x10(%ebp) +c0104d1b : +page2kva(struct Page *page) { +c0104d1b: 55 push %ebp +c0104d1c: 89 e5 mov %esp,%ebp +c0104d1e: 83 ec 28 sub $0x28,%esp + return KADDR(page2pa(page)); +c0104d21: 8b 45 08 mov 0x8(%ebp),%eax +c0104d24: 89 04 24 mov %eax,(%esp) +c0104d27: e8 8f ff ff ff call c0104cbb +c0104d2c: 89 45 f4 mov %eax,-0xc(%ebp) +c0104d2f: 8b 45 f4 mov -0xc(%ebp),%eax +c0104d32: c1 e8 0c shr $0xc,%eax +c0104d35: 89 45 f0 mov %eax,-0x10(%ebp) +c0104d38: a1 04 c0 12 c0 mov 0xc012c004,%eax +c0104d3d: 39 45 f0 cmp %eax,-0x10(%ebp) +c0104d40: 72 23 jb c0104d65 +c0104d42: 8b 45 f4 mov -0xc(%ebp),%eax +c0104d45: 89 44 24 0c mov %eax,0xc(%esp) +c0104d49: c7 44 24 08 3c ae 10 movl $0xc010ae3c,0x8(%esp) +c0104d50: c0 +c0104d51: c7 44 24 04 66 00 00 movl $0x66,0x4(%esp) +c0104d58: 00 +c0104d59: c7 04 24 2b ae 10 c0 movl $0xc010ae2b,(%esp) +c0104d60: e8 e0 be ff ff call c0100c45 <__panic> +c0104d65: 8b 45 f4 mov -0xc(%ebp),%eax +c0104d68: 2d 00 00 00 40 sub $0x40000000,%eax +} +c0104d6d: 89 ec mov %ebp,%esp +c0104d6f: 5d pop %ebp +c0104d70: c3 ret + +c0104d71 : +pte2page(pte_t pte) { +c0104d71: 55 push %ebp +c0104d72: 89 e5 mov %esp,%ebp +c0104d74: 83 ec 18 sub $0x18,%esp + if (!(pte & PTE_P)) { +c0104d77: 8b 45 08 mov 0x8(%ebp),%eax +c0104d7a: 83 e0 01 and $0x1,%eax +c0104d7d: 85 c0 test %eax,%eax +c0104d7f: 75 1c jne c0104d9d + panic("pte2page called with invalid pte"); +c0104d81: c7 44 24 08 60 ae 10 movl $0xc010ae60,0x8(%esp) +c0104d88: c0 +c0104d89: c7 44 24 04 71 00 00 movl $0x71,0x4(%esp) +c0104d90: 00 +c0104d91: c7 04 24 2b ae 10 c0 movl $0xc010ae2b,(%esp) +c0104d98: e8 a8 be ff ff call c0100c45 <__panic> + return pa2page(PTE_ADDR(pte)); +c0104d9d: 8b 45 08 mov 0x8(%ebp),%eax +c0104da0: 25 00 f0 ff ff and $0xfffff000,%eax +c0104da5: 89 04 24 mov %eax,(%esp) +c0104da8: e8 26 ff ff ff call c0104cd3 +} +c0104dad: 89 ec mov %ebp,%esp +c0104daf: 5d pop %ebp +c0104db0: c3 ret + +c0104db1 : +pde2page(pde_t pde) { +c0104db1: 55 push %ebp +c0104db2: 89 e5 mov %esp,%ebp +c0104db4: 83 ec 18 sub $0x18,%esp + return pa2page(PDE_ADDR(pde)); +c0104db7: 8b 45 08 mov 0x8(%ebp),%eax +c0104dba: 25 00 f0 ff ff and $0xfffff000,%eax +c0104dbf: 89 04 24 mov %eax,(%esp) +c0104dc2: e8 0c ff ff ff call c0104cd3 +} +c0104dc7: 89 ec mov %ebp,%esp +c0104dc9: 5d pop %ebp +c0104dca: c3 ret - ret = -E_NO_MEM;// 初始化返回值为内存不足错误 -c01060dd: c7 45 f4 fc ff ff ff movl $0xfffffffc,-0xc(%ebp) +c0104dcb : +page_ref(struct Page *page) { +c0104dcb: 55 push %ebp +c0104dcc: 89 e5 mov %esp,%ebp + return page->ref; +c0104dce: 8b 45 08 mov 0x8(%ebp),%eax +c0104dd1: 8b 00 mov (%eax),%eax +} +c0104dd3: 5d pop %ebp +c0104dd4: c3 ret - pte_t *ptep=NULL; -c01060e4: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) -#endif - // try to find a pte, if pte's PT(Page Table) isn't existed, then create a PT. - // (notice the 3th parameter '1') - // 尝试找到一个页表项 pte,如果包含该 pte 的页表不存在,则创建一个页表。 - // 注意第三个参数 '1' 表示如果需要,可以创建新的页表。 - if ((ptep = get_pte(mm->pgdir, addr, 1)) == NULL) { -c01060eb: 8b 45 08 mov 0x8(%ebp),%eax -c01060ee: 8b 40 0c mov 0xc(%eax),%eax -c01060f1: c7 44 24 08 01 00 00 movl $0x1,0x8(%esp) -c01060f8: 00 -c01060f9: 8b 55 10 mov 0x10(%ebp),%edx -c01060fc: 89 54 24 04 mov %edx,0x4(%esp) -c0106100: 89 04 24 mov %eax,(%esp) -c0106103: e8 21 dd ff ff call c0103e29 -c0106108: 89 45 e4 mov %eax,-0x1c(%ebp) -c010610b: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) -c010610f: 75 11 jne c0106122 - cprintf("get_pte in do_pgfault failed\n");// 输出错误信息 -c0106111: c7 04 24 f7 b7 10 c0 movl $0xc010b7f7,(%esp) -c0106118: e8 ba a1 ff ff call c01002d7 - goto failed;// 跳转到错误处理部分 -c010611d: e9 ef 00 00 00 jmp c0106211 - } - // 如果页表项 pte 的物理地址不存在,则分配一页内存并映射物理地址与逻辑地址 - if (*ptep == 0) { // if the phy addr isn't exist, then alloc a page & map the phy addr with logical addr -c0106122: 8b 45 e4 mov -0x1c(%ebp),%eax -c0106125: 8b 00 mov (%eax),%eax -c0106127: 85 c0 test %eax,%eax -c0106129: 75 35 jne c0106160 - if (pgdir_alloc_page(mm->pgdir, addr, perm) == NULL) { -c010612b: 8b 45 08 mov 0x8(%ebp),%eax -c010612e: 8b 40 0c mov 0xc(%eax),%eax -c0106131: 8b 55 f0 mov -0x10(%ebp),%edx -c0106134: 89 54 24 08 mov %edx,0x8(%esp) -c0106138: 8b 55 10 mov 0x10(%ebp),%edx -c010613b: 89 54 24 04 mov %edx,0x4(%esp) -c010613f: 89 04 24 mov %eax,(%esp) -c0106142: e8 45 e0 ff ff call c010418c -c0106147: 85 c0 test %eax,%eax -c0106149: 0f 85 bb 00 00 00 jne c010620a - cprintf("pgdir_alloc_page in do_pgfault failed\n");// 输出错误信息 -c010614f: c7 04 24 18 b8 10 c0 movl $0xc010b818,(%esp) -c0106156: e8 7c a1 ff ff call c01002d7 - goto failed;// 跳转到错误处理部分 -c010615b: e9 b1 00 00 00 jmp c0106211 - } - else { // if this pte is a swap entry, then load data from disk to a page with phy addr - // and call page_insert to map the phy addr with logical addr - // 如果页表项 pte 是一个交换项,则从磁盘加载数据到 - //一个具有物理地址的页面,并映射物理地址与逻辑地址 - if(swap_init_ok) {// 检查交换初始化是否成功 -c0106160: a1 14 c0 12 c0 mov 0xc012c014,%eax -c0106165: 85 c0 test %eax,%eax -c0106167: 0f 84 86 00 00 00 je c01061f3 - struct Page *page=NULL;// 声明一个页面指针 -c010616d: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp) - if ((ret = swap_in(mm, addr, &page)) != 0) { -c0106174: 8d 45 e0 lea -0x20(%ebp),%eax -c0106177: 89 44 24 08 mov %eax,0x8(%esp) -c010617b: 8b 45 10 mov 0x10(%ebp),%eax -c010617e: 89 44 24 04 mov %eax,0x4(%esp) -c0106182: 8b 45 08 mov 0x8(%ebp),%eax -c0106185: 89 04 24 mov %eax,(%esp) -c0106188: e8 2a 0b 00 00 call c0106cb7 -c010618d: 89 45 f4 mov %eax,-0xc(%ebp) -c0106190: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0106194: 74 0e je c01061a4 - cprintf("swap_in in do_pgfault failed\n"); -c0106196: c7 04 24 3f b8 10 c0 movl $0xc010b83f,(%esp) -c010619d: e8 35 a1 ff ff call c01002d7 -c01061a2: eb 6d jmp c0106211 - goto failed; - } - page_insert(mm->pgdir, page, addr, perm);// 设置物理地址与逻辑地址的映射 -c01061a4: 8b 55 e0 mov -0x20(%ebp),%edx -c01061a7: 8b 45 08 mov 0x8(%ebp),%eax -c01061aa: 8b 40 0c mov 0xc(%eax),%eax -c01061ad: 8b 4d f0 mov -0x10(%ebp),%ecx -c01061b0: 89 4c 24 0c mov %ecx,0xc(%esp) -c01061b4: 8b 4d 10 mov 0x10(%ebp),%ecx -c01061b7: 89 4c 24 08 mov %ecx,0x8(%esp) -c01061bb: 89 54 24 04 mov %edx,0x4(%esp) -c01061bf: 89 04 24 mov %eax,(%esp) -c01061c2: e8 a7 de ff ff call c010406e - swap_map_swappable(mm, addr, page, 1);// 设置页面可交换 -c01061c7: 8b 45 e0 mov -0x20(%ebp),%eax -c01061ca: c7 44 24 0c 01 00 00 movl $0x1,0xc(%esp) -c01061d1: 00 -c01061d2: 89 44 24 08 mov %eax,0x8(%esp) -c01061d6: 8b 45 10 mov 0x10(%ebp),%eax -c01061d9: 89 44 24 04 mov %eax,0x4(%esp) -c01061dd: 8b 45 08 mov 0x8(%ebp),%eax -c01061e0: 89 04 24 mov %eax,(%esp) -c01061e3: e8 01 09 00 00 call c0106ae9 - page->pra_vaddr = addr;// 记录页面的虚拟地址 -c01061e8: 8b 45 e0 mov -0x20(%ebp),%eax -c01061eb: 8b 55 10 mov 0x10(%ebp),%edx -c01061ee: 89 50 1c mov %edx,0x1c(%eax) -c01061f1: eb 17 jmp c010620a - } - else { - cprintf("no swap_init_ok but ptep is %x, failed\n",*ptep); -c01061f3: 8b 45 e4 mov -0x1c(%ebp),%eax -c01061f6: 8b 00 mov (%eax),%eax -c01061f8: 89 44 24 04 mov %eax,0x4(%esp) -c01061fc: c7 04 24 60 b8 10 c0 movl $0xc010b860,(%esp) -c0106203: e8 cf a0 ff ff call c01002d7 - goto failed;// 跳转到错误处理部分 -c0106208: eb 07 jmp c0106211 - } - } - ret = 0;// 设置返回值为成功 -c010620a: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) -failed: - return ret;// 返回结果 -c0106211: 8b 45 f4 mov -0xc(%ebp),%eax +c0104dd5 : +set_page_ref(struct Page *page, int val) { +c0104dd5: 55 push %ebp +c0104dd6: 89 e5 mov %esp,%ebp + page->ref = val; +c0104dd8: 8b 45 08 mov 0x8(%ebp),%eax +c0104ddb: 8b 55 0c mov 0xc(%ebp),%edx +c0104dde: 89 10 mov %edx,(%eax) +} +c0104de0: 90 nop +c0104de1: 5d pop %ebp +c0104de2: c3 ret + +c0104de3 : + +static inline int +page_ref_inc(struct Page *page) { +c0104de3: 55 push %ebp +c0104de4: 89 e5 mov %esp,%ebp + page->ref += 1; +c0104de6: 8b 45 08 mov 0x8(%ebp),%eax +c0104de9: 8b 00 mov (%eax),%eax +c0104deb: 8d 50 01 lea 0x1(%eax),%edx +c0104dee: 8b 45 08 mov 0x8(%ebp),%eax +c0104df1: 89 10 mov %edx,(%eax) + return page->ref; +c0104df3: 8b 45 08 mov 0x8(%ebp),%eax +c0104df6: 8b 00 mov (%eax),%eax +} +c0104df8: 5d pop %ebp +c0104df9: c3 ret + +c0104dfa : + +static inline int +page_ref_dec(struct Page *page) { +c0104dfa: 55 push %ebp +c0104dfb: 89 e5 mov %esp,%ebp + page->ref -= 1; +c0104dfd: 8b 45 08 mov 0x8(%ebp),%eax +c0104e00: 8b 00 mov (%eax),%eax +c0104e02: 8d 50 ff lea -0x1(%eax),%edx +c0104e05: 8b 45 08 mov 0x8(%ebp),%eax +c0104e08: 89 10 mov %edx,(%eax) + return page->ref; +c0104e0a: 8b 45 08 mov 0x8(%ebp),%eax +c0104e0d: 8b 00 mov (%eax),%eax } -c0106214: c9 leave -c0106215: c3 ret +c0104e0f: 5d pop %ebp +c0104e10: c3 ret -c0106216 <__intr_save>: +c0104e11 <__intr_save>: __intr_save(void) { -c0106216: 55 push %ebp -c0106217: 89 e5 mov %esp,%ebp -c0106219: 83 ec 18 sub $0x18,%esp +c0104e11: 55 push %ebp +c0104e12: 89 e5 mov %esp,%ebp +c0104e14: 83 ec 18 sub $0x18,%esp asm volatile ("pushfl; popl %0" : "=r" (eflags)); -c010621c: 9c pushf -c010621d: 58 pop %eax -c010621e: 89 45 f4 mov %eax,-0xc(%ebp) +c0104e17: 9c pushf +c0104e18: 58 pop %eax +c0104e19: 89 45 f4 mov %eax,-0xc(%ebp) return eflags; -c0106221: 8b 45 f4 mov -0xc(%ebp),%eax +c0104e1c: 8b 45 f4 mov -0xc(%ebp),%eax if (read_eflags() & FL_IF) { -c0106224: 25 00 02 00 00 and $0x200,%eax -c0106229: 85 c0 test %eax,%eax -c010622b: 74 0c je c0106239 <__intr_save+0x23> +c0104e1f: 25 00 02 00 00 and $0x200,%eax +c0104e24: 85 c0 test %eax,%eax +c0104e26: 74 0c je c0104e34 <__intr_save+0x23> intr_disable(); -c010622d: e8 22 bf ff ff call c0102154 +c0104e28: e8 ce d0 ff ff call c0101efb return 1; -c0106232: b8 01 00 00 00 mov $0x1,%eax -c0106237: eb 05 jmp c010623e <__intr_save+0x28> +c0104e2d: b8 01 00 00 00 mov $0x1,%eax +c0104e32: eb 05 jmp c0104e39 <__intr_save+0x28> return 0; -c0106239: b8 00 00 00 00 mov $0x0,%eax +c0104e34: b8 00 00 00 00 mov $0x0,%eax } -c010623e: c9 leave -c010623f: c3 ret +c0104e39: 89 ec mov %ebp,%esp +c0104e3b: 5d pop %ebp +c0104e3c: c3 ret -c0106240 <__intr_restore>: +c0104e3d <__intr_restore>: __intr_restore(bool flag) { -c0106240: 55 push %ebp -c0106241: 89 e5 mov %esp,%ebp -c0106243: 83 ec 08 sub $0x8,%esp +c0104e3d: 55 push %ebp +c0104e3e: 89 e5 mov %esp,%ebp +c0104e40: 83 ec 08 sub $0x8,%esp if (flag) { -c0106246: 83 7d 08 00 cmpl $0x0,0x8(%ebp) -c010624a: 74 05 je c0106251 <__intr_restore+0x11> +c0104e43: 83 7d 08 00 cmpl $0x0,0x8(%ebp) +c0104e47: 74 05 je c0104e4e <__intr_restore+0x11> intr_enable(); -c010624c: e8 f7 be ff ff call c0102148 +c0104e49: e8 a5 d0 ff ff call c0101ef3 } -c0106251: 90 nop -c0106252: c9 leave -c0106253: c3 ret +c0104e4e: 90 nop +c0104e4f: 89 ec mov %ebp,%esp +c0104e51: 5d pop %ebp +c0104e52: c3 ret -c0106254 : -page2ppn(struct Page *page) { -c0106254: 55 push %ebp -c0106255: 89 e5 mov %esp,%ebp - return page - pages; -c0106257: a1 b8 e0 12 c0 mov 0xc012e0b8,%eax -c010625c: 8b 55 08 mov 0x8(%ebp),%edx -c010625f: 29 c2 sub %eax,%edx -c0106261: 89 d0 mov %edx,%eax -c0106263: c1 f8 05 sar $0x5,%eax +c0104e53 : + * data/code segement registers for kernel. + * lgdt - 加载全局描述符表寄存器并重置内核的数据/代码段寄存器。 + * */ +//定义了一个静态内联函数 lgdt,接收一个指向伪描述符(struct pseudodesc)的指针 pd +static inline void +lgdt(struct pseudodesc *pd) { +c0104e53: 55 push %ebp +c0104e54: 89 e5 mov %esp,%ebp + //这行汇编代码使用 lgdt 指令加载 GDT。%0 被替换为指向 pd 的指针,告诉处理器 GDT 的地址。 + asm volatile ("lgdt (%0)" :: "r" (pd)); +c0104e56: 8b 45 08 mov 0x8(%ebp),%eax +c0104e59: 0f 01 10 lgdtl (%eax) + asm volatile ("movw %%ax, %%gs" :: "a" (USER_DS));//将 USER_DS(用户数据段)的值移动到 gs 段寄存器。 +c0104e5c: b8 23 00 00 00 mov $0x23,%eax +c0104e61: 8e e8 mov %eax,%gs + asm volatile ("movw %%ax, %%fs" :: "a" (USER_DS));//将 USER_DS 的值移动到 fs 段寄存器。 +c0104e63: b8 23 00 00 00 mov $0x23,%eax +c0104e68: 8e e0 mov %eax,%fs + asm volatile ("movw %%ax, %%es" :: "a" (KERNEL_DS));//将 KERNEL_DS(内核数据段)的值移动到 es 段寄存器。 +c0104e6a: b8 10 00 00 00 mov $0x10,%eax +c0104e6f: 8e c0 mov %eax,%es + asm volatile ("movw %%ax, %%ds" :: "a" (KERNEL_DS));//将 KERNEL_DS 的值移动到 ds 段寄存器 +c0104e71: b8 10 00 00 00 mov $0x10,%eax +c0104e76: 8e d8 mov %eax,%ds + asm volatile ("movw %%ax, %%ss" :: "a" (KERNEL_DS));//将 KERNEL_DS 的值移动到 ss 段寄存器 +c0104e78: b8 10 00 00 00 mov $0x10,%eax +c0104e7d: 8e d0 mov %eax,%ss + // reload cs + //通过 ljmp 指令重新加载代码段寄存器 cs,并跳转到标签 1。 + asm volatile ("ljmp %0, $1f\n 1:\n" :: "i" (KERNEL_CS)); +c0104e7f: ea 86 4e 10 c0 08 00 ljmp $0x8,$0xc0104e86 } -c0106266: 5d pop %ebp -c0106267: c3 ret +c0104e86: 90 nop +c0104e87: 5d pop %ebp +c0104e88: c3 ret -c0106268 : -page2pa(struct Page *page) { -c0106268: 55 push %ebp -c0106269: 89 e5 mov %esp,%ebp -c010626b: 83 ec 04 sub $0x4,%esp - return page2ppn(page) << PGSHIFT; -c010626e: 8b 45 08 mov 0x8(%ebp),%eax -c0106271: 89 04 24 mov %eax,(%esp) -c0106274: e8 db ff ff ff call c0106254 -c0106279: c1 e0 0c shl $0xc,%eax +c0104e89 : + * load_esp0 - 修改默认任务状态段中的 ESP0,以便在从用户态陷入内核态时能够使用不同的内核栈。 + * */ +//uintptr_t esp0:这是新的堆栈指针,通常指向内核栈的顶部。 +//修改当前任务状态段(TSS)中的 ESP0 值。ESP0 是在从用户态切换到内核态时,CPU 使用的内核栈指针。 +void +load_esp0(uintptr_t esp0) { +c0104e89: 55 push %ebp +c0104e8a: 89 e5 mov %esp,%ebp + ts.ts_esp0 = esp0; +c0104e8c: 8b 45 08 mov 0x8(%ebp),%eax +c0104e8f: a3 24 c0 12 c0 mov %eax,0xc012c024 } -c010627c: c9 leave -c010627d: c3 ret +c0104e94: 90 nop +c0104e95: 5d pop %ebp +c0104e96: c3 ret -c010627e : -pa2page(uintptr_t pa) { -c010627e: 55 push %ebp -c010627f: 89 e5 mov %esp,%ebp -c0106281: 83 ec 18 sub $0x18,%esp - if (PPN(pa) >= npage) { -c0106284: 8b 45 08 mov 0x8(%ebp),%eax -c0106287: c1 e8 0c shr $0xc,%eax -c010628a: 89 c2 mov %eax,%edx -c010628c: a1 80 bf 12 c0 mov 0xc012bf80,%eax -c0106291: 39 c2 cmp %eax,%edx -c0106293: 72 1c jb c01062b1 - panic("pa2page called with invalid pa"); -c0106295: c7 44 24 08 88 b8 10 movl $0xc010b888,0x8(%esp) -c010629c: c0 -c010629d: c7 44 24 04 5f 00 00 movl $0x5f,0x4(%esp) -c01062a4: 00 -c01062a5: c7 04 24 a7 b8 10 c0 movl $0xc010b8a7,(%esp) -c01062ac: e8 92 a1 ff ff call c0100443 <__panic> - return &pages[PPN(pa)]; -c01062b1: a1 b8 e0 12 c0 mov 0xc012e0b8,%eax -c01062b6: 8b 55 08 mov 0x8(%ebp),%edx -c01062b9: c1 ea 0c shr $0xc,%edx -c01062bc: c1 e2 05 shl $0x5,%edx -c01062bf: 01 d0 add %edx,%eax +c0104e97 : + +/* gdt_init - initialize the default GDT and TSS */ +/* gdt_init - 初始化默认的 GDT 和 TSS */ +static void +gdt_init(void) { +c0104e97: 55 push %ebp +c0104e98: 89 e5 mov %esp,%ebp +c0104e9a: 83 ec 14 sub $0x14,%esp + // 设置启动内核栈和默认的 SS0 + // set boot kernel stack and default SS0 + load_esp0((uintptr_t)bootstacktop); +c0104e9d: b8 00 80 12 c0 mov $0xc0128000,%eax +c0104ea2: 89 04 24 mov %eax,(%esp) +c0104ea5: e8 df ff ff ff call c0104e89 + ts.ts_ss0 = KERNEL_DS; +c0104eaa: 66 c7 05 28 c0 12 c0 movw $0x10,0xc012c028 +c0104eb1: 10 00 + // 初始化 GDT 中的 TSS 字段 + // initialize the TSS filed of the gdt + gdt[SEG_TSS] = SEGTSS(STS_T32A, (uintptr_t)&ts, sizeof(ts), DPL_KERNEL); +c0104eb3: 66 c7 05 48 8a 12 c0 movw $0x68,0xc0128a48 +c0104eba: 68 00 +c0104ebc: b8 20 c0 12 c0 mov $0xc012c020,%eax +c0104ec1: 0f b7 c0 movzwl %ax,%eax +c0104ec4: 66 a3 4a 8a 12 c0 mov %ax,0xc0128a4a +c0104eca: b8 20 c0 12 c0 mov $0xc012c020,%eax +c0104ecf: c1 e8 10 shr $0x10,%eax +c0104ed2: a2 4c 8a 12 c0 mov %al,0xc0128a4c +c0104ed7: 0f b6 05 4d 8a 12 c0 movzbl 0xc0128a4d,%eax +c0104ede: 24 f0 and $0xf0,%al +c0104ee0: 0c 09 or $0x9,%al +c0104ee2: a2 4d 8a 12 c0 mov %al,0xc0128a4d +c0104ee7: 0f b6 05 4d 8a 12 c0 movzbl 0xc0128a4d,%eax +c0104eee: 24 ef and $0xef,%al +c0104ef0: a2 4d 8a 12 c0 mov %al,0xc0128a4d +c0104ef5: 0f b6 05 4d 8a 12 c0 movzbl 0xc0128a4d,%eax +c0104efc: 24 9f and $0x9f,%al +c0104efe: a2 4d 8a 12 c0 mov %al,0xc0128a4d +c0104f03: 0f b6 05 4d 8a 12 c0 movzbl 0xc0128a4d,%eax +c0104f0a: 0c 80 or $0x80,%al +c0104f0c: a2 4d 8a 12 c0 mov %al,0xc0128a4d +c0104f11: 0f b6 05 4e 8a 12 c0 movzbl 0xc0128a4e,%eax +c0104f18: 24 f0 and $0xf0,%al +c0104f1a: a2 4e 8a 12 c0 mov %al,0xc0128a4e +c0104f1f: 0f b6 05 4e 8a 12 c0 movzbl 0xc0128a4e,%eax +c0104f26: 24 ef and $0xef,%al +c0104f28: a2 4e 8a 12 c0 mov %al,0xc0128a4e +c0104f2d: 0f b6 05 4e 8a 12 c0 movzbl 0xc0128a4e,%eax +c0104f34: 24 df and $0xdf,%al +c0104f36: a2 4e 8a 12 c0 mov %al,0xc0128a4e +c0104f3b: 0f b6 05 4e 8a 12 c0 movzbl 0xc0128a4e,%eax +c0104f42: 0c 40 or $0x40,%al +c0104f44: a2 4e 8a 12 c0 mov %al,0xc0128a4e +c0104f49: 0f b6 05 4e 8a 12 c0 movzbl 0xc0128a4e,%eax +c0104f50: 24 7f and $0x7f,%al +c0104f52: a2 4e 8a 12 c0 mov %al,0xc0128a4e +c0104f57: b8 20 c0 12 c0 mov $0xc012c020,%eax +c0104f5c: c1 e8 18 shr $0x18,%eax +c0104f5f: a2 4f 8a 12 c0 mov %al,0xc0128a4f + // 使用lgdt加载全局描述符表,更新所有段寄存器 + // reload all segment registers + lgdt(&gdt_pd); +c0104f64: c7 04 24 50 8a 12 c0 movl $0xc0128a50,(%esp) +c0104f6b: e8 e3 fe ff ff call c0104e53 +c0104f70: 66 c7 45 fe 28 00 movw $0x28,-0x2(%ebp) + asm volatile ("ltr %0" :: "r" (sel) : "memory"); +c0104f76: 0f b7 45 fe movzwl -0x2(%ebp),%eax +c0104f7a: 0f 00 d8 ltr %ax +} +c0104f7d: 90 nop + // 加载 TSS,使 CPU 在进行特权级切换时能够正确使用 TSS。 + // load the TSS + ltr(GD_TSS); } -c01062c1: c9 leave -c01062c2: c3 ret +c0104f7e: 90 nop +c0104f7f: 89 ec mov %ebp,%esp +c0104f81: 5d pop %ebp +c0104f82: c3 ret -c01062c3 : -page2kva(struct Page *page) { -c01062c3: 55 push %ebp -c01062c4: 89 e5 mov %esp,%ebp -c01062c6: 83 ec 28 sub $0x28,%esp - return KADDR(page2pa(page)); -c01062c9: 8b 45 08 mov 0x8(%ebp),%eax -c01062cc: 89 04 24 mov %eax,(%esp) -c01062cf: e8 94 ff ff ff call c0106268 -c01062d4: 89 45 f4 mov %eax,-0xc(%ebp) -c01062d7: 8b 45 f4 mov -0xc(%ebp),%eax -c01062da: c1 e8 0c shr $0xc,%eax -c01062dd: 89 45 f0 mov %eax,-0x10(%ebp) -c01062e0: a1 80 bf 12 c0 mov 0xc012bf80,%eax -c01062e5: 39 45 f0 cmp %eax,-0x10(%ebp) -c01062e8: 72 23 jb c010630d -c01062ea: 8b 45 f4 mov -0xc(%ebp),%eax -c01062ed: 89 44 24 0c mov %eax,0xc(%esp) -c01062f1: c7 44 24 08 b8 b8 10 movl $0xc010b8b8,0x8(%esp) -c01062f8: c0 -c01062f9: c7 44 24 04 66 00 00 movl $0x66,0x4(%esp) -c0106300: 00 -c0106301: c7 04 24 a7 b8 10 c0 movl $0xc010b8a7,(%esp) -c0106308: e8 36 a1 ff ff call c0100443 <__panic> -c010630d: 8b 45 f4 mov -0xc(%ebp),%eax -c0106310: 2d 00 00 00 40 sub $0x40000000,%eax -} -c0106315: c9 leave -c0106316: c3 ret - -c0106317 : -kva2page(void *kva) { -c0106317: 55 push %ebp -c0106318: 89 e5 mov %esp,%ebp -c010631a: 83 ec 28 sub $0x28,%esp - return pa2page(PADDR(kva)); -c010631d: 8b 45 08 mov 0x8(%ebp),%eax -c0106320: 89 45 f4 mov %eax,-0xc(%ebp) -c0106323: 81 7d f4 ff ff ff bf cmpl $0xbfffffff,-0xc(%ebp) -c010632a: 77 23 ja c010634f -c010632c: 8b 45 f4 mov -0xc(%ebp),%eax -c010632f: 89 44 24 0c mov %eax,0xc(%esp) -c0106333: c7 44 24 08 dc b8 10 movl $0xc010b8dc,0x8(%esp) -c010633a: c0 -c010633b: c7 44 24 04 6b 00 00 movl $0x6b,0x4(%esp) -c0106342: 00 -c0106343: c7 04 24 a7 b8 10 c0 movl $0xc010b8a7,(%esp) -c010634a: e8 f4 a0 ff ff call c0100443 <__panic> -c010634f: 8b 45 f4 mov -0xc(%ebp),%eax -c0106352: 05 00 00 00 40 add $0x40000000,%eax -c0106357: 89 04 24 mov %eax,(%esp) -c010635a: e8 1f ff ff ff call c010627e -} -c010635f: c9 leave -c0106360: c3 ret - -c0106361 <__slob_get_free_pages>: -static slob_t *slobfree = &arena; -static bigblock_t *bigblocks; +c0104f83 : +//init_pmm_manager - initialize a pmm_manager instance +//初始化一个 pmm_manager 实例 +static void +init_pmm_manager(void) { +c0104f83: 55 push %ebp +c0104f84: 89 e5 mov %esp,%ebp +c0104f86: 83 ec 18 sub $0x18,%esp + //将 pmm_manager 指向默认的 PMM 管理器实例。 + pmm_manager = &default_pmm_manager; +c0104f89: c7 05 0c c0 12 c0 00 movl $0xc010ad00,0xc012c00c +c0104f90: ad 10 c0 + //使用 cprintf 打印当前内存管理器的名称。 + cprintf("memory management: %s\n", pmm_manager->name); +c0104f93: a1 0c c0 12 c0 mov 0xc012c00c,%eax +c0104f98: 8b 00 mov (%eax),%eax +c0104f9a: 89 44 24 04 mov %eax,0x4(%esp) +c0104f9e: c7 04 24 8c ae 10 c0 movl $0xc010ae8c,(%esp) +c0104fa5: e8 ce b3 ff ff call c0100378 + //调用 PMM 管理器的初始化函数,以设置和准备内存管理的相关数据结构。 + pmm_manager->init(); +c0104faa: a1 0c c0 12 c0 mov 0xc012c00c,%eax +c0104faf: 8b 40 04 mov 0x4(%eax),%eax +c0104fb2: ff d0 call *%eax +} +c0104fb4: 90 nop +c0104fb5: 89 ec mov %ebp,%esp +c0104fb7: 5d pop %ebp +c0104fb8: c3 ret -static void* __slob_get_free_pages(gfp_t gfp, int order) -{ -c0106361: f3 0f 1e fb endbr32 -c0106365: 55 push %ebp -c0106366: 89 e5 mov %esp,%ebp -c0106368: 83 ec 28 sub $0x28,%esp - struct Page * page = alloc_pages(1 << order); -c010636b: 8b 45 0c mov 0xc(%ebp),%eax -c010636e: ba 01 00 00 00 mov $0x1,%edx -c0106373: 88 c1 mov %al,%cl -c0106375: d3 e2 shl %cl,%edx -c0106377: 89 d0 mov %edx,%eax -c0106379: 89 04 24 mov %eax,(%esp) -c010637c: e8 d8 d3 ff ff call c0103759 -c0106381: 89 45 f4 mov %eax,-0xc(%ebp) - if(!page) -c0106384: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0106388: 75 07 jne c0106391 <__slob_get_free_pages+0x30> - return NULL; -c010638a: b8 00 00 00 00 mov $0x0,%eax -c010638f: eb 0b jmp c010639c <__slob_get_free_pages+0x3b> - return page2kva(page); -c0106391: 8b 45 f4 mov -0xc(%ebp),%eax -c0106394: 89 04 24 mov %eax,(%esp) -c0106397: e8 27 ff ff ff call c01062c3 +c0104fb9 : + +//init_memmap - call pmm->init_memmap to build Page struct for free memory +// init_memmap - 调用 pmm->init_memmap 构建空闲内存的 Page 结构 +//struct Page *base:指向内存页的基础地址。 size_t n:要初始化的页数。 +static void +init_memmap(struct Page *base, size_t n) { +c0104fb9: 55 push %ebp +c0104fba: 89 e5 mov %esp,%ebp +c0104fbc: 83 ec 18 sub $0x18,%esp + pmm_manager->init_memmap(base, n); +c0104fbf: a1 0c c0 12 c0 mov 0xc012c00c,%eax +c0104fc4: 8b 40 08 mov 0x8(%eax),%eax +c0104fc7: 8b 55 0c mov 0xc(%ebp),%edx +c0104fca: 89 54 24 04 mov %edx,0x4(%esp) +c0104fce: 8b 55 08 mov 0x8(%ebp),%edx +c0104fd1: 89 14 24 mov %edx,(%esp) +c0104fd4: ff d0 call *%eax +} +c0104fd6: 90 nop +c0104fd7: 89 ec mov %ebp,%esp +c0104fd9: 5d pop %ebp +c0104fda: c3 ret + +c0104fdb : + +//alloc_pages - call pmm->alloc_pages to allocate a continuous n*PAGESIZE memory +// alloc_pages - 调用 pmm->alloc_pages 分配连续的 n*PAGESIZE 内存 +struct Page * +alloc_pages(size_t n) { +c0104fdb: 55 push %ebp +c0104fdc: 89 e5 mov %esp,%ebp +c0104fde: 83 ec 28 sub $0x28,%esp + struct Page *page=NULL; +c0104fe1: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) + bool intr_flag; + //使用 local_intr_save 保存当前的中断状态,以避免在分配内存时发生中断。 + while (1) + { + local_intr_save(intr_flag); +c0104fe8: e8 24 fe ff ff call c0104e11 <__intr_save> +c0104fed: 89 45 f0 mov %eax,-0x10(%ebp) + { + page = pmm_manager->alloc_pages(n);//尝试分配 n 个页面。 +c0104ff0: a1 0c c0 12 c0 mov 0xc012c00c,%eax +c0104ff5: 8b 40 0c mov 0xc(%eax),%eax +c0104ff8: 8b 55 08 mov 0x8(%ebp),%edx +c0104ffb: 89 14 24 mov %edx,(%esp) +c0104ffe: ff d0 call *%eax +c0105000: 89 45 f4 mov %eax,-0xc(%ebp) + } + local_intr_restore(intr_flag); +c0105003: 8b 45 f0 mov -0x10(%ebp),%eax +c0105006: 89 04 24 mov %eax,(%esp) +c0105009: e8 2f fe ff ff call c0104e3d <__intr_restore> + + if (page != NULL || n > 1 || swap_init_ok == 0) break; +c010500e: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0105012: 75 2d jne c0105041 +c0105014: 83 7d 08 01 cmpl $0x1,0x8(%ebp) +c0105018: 77 27 ja c0105041 +c010501a: a1 a4 c0 12 c0 mov 0xc012c0a4,%eax +c010501f: 85 c0 test %eax,%eax +c0105021: 74 1e je c0105041 + + extern struct mm_struct *check_mm_struct; + //cprintf("page %x, call swap_out in alloc_pages %d\n",page, n); + swap_out(check_mm_struct, n, 0); +c0105023: 8b 55 08 mov 0x8(%ebp),%edx +c0105026: a1 6c c1 12 c0 mov 0xc012c16c,%eax +c010502b: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c0105032: 00 +c0105033: 89 54 24 04 mov %edx,0x4(%esp) +c0105037: 89 04 24 mov %eax,(%esp) +c010503a: e8 c5 18 00 00 call c0106904 + { +c010503f: eb a7 jmp c0104fe8 + } + //cprintf("n %d,get page %x, No %d in alloc_pages\n",n,page,(page-pages)); + return page; +c0105041: 8b 45 f4 mov -0xc(%ebp),%eax +} +c0105044: 89 ec mov %ebp,%esp +c0105046: 5d pop %ebp +c0105047: c3 ret + +c0105048 : + +//free_pages - call pmm->free_pages to free a continuous n*PAGESIZE memory +// free_pages - 调用 pmm->free_pages 释放连续的 n*PAGESIZE 内存 +//struct Page *base:指向要释放的内存页的基础地址。size_t n:要释放的页数。 +void +free_pages(struct Page *base, size_t n) { +c0105048: 55 push %ebp +c0105049: 89 e5 mov %esp,%ebp +c010504b: 83 ec 28 sub $0x28,%esp + bool intr_flag; + //使用 local_intr_save 保存当前的中断状态,以避免在释放内存时发生中断。 + local_intr_save(intr_flag); +c010504e: e8 be fd ff ff call c0104e11 <__intr_save> +c0105053: 89 45 f4 mov %eax,-0xc(%ebp) + { + //调用物理内存管理器的 free_pages 函数释放 n 页的内存。 + pmm_manager->free_pages(base, n); +c0105056: a1 0c c0 12 c0 mov 0xc012c00c,%eax +c010505b: 8b 40 10 mov 0x10(%eax),%eax +c010505e: 8b 55 0c mov 0xc(%ebp),%edx +c0105061: 89 54 24 04 mov %edx,0x4(%esp) +c0105065: 8b 55 08 mov 0x8(%ebp),%edx +c0105068: 89 14 24 mov %edx,(%esp) +c010506b: ff d0 call *%eax + } + local_intr_restore(intr_flag); +c010506d: 8b 45 f4 mov -0xc(%ebp),%eax +c0105070: 89 04 24 mov %eax,(%esp) +c0105073: e8 c5 fd ff ff call c0104e3d <__intr_restore> +} +c0105078: 90 nop +c0105079: 89 ec mov %ebp,%esp +c010507b: 5d pop %ebp +c010507c: c3 ret + +c010507d : + +//nr_free_pages - call pmm->nr_free_pages to get the size (nr*PAGESIZE) +//of current free memory +// nr_free_pages - 调用 pmm->nr_free_pages 获取当前空闲内存的大小 (nr * PAGESIZE) +size_t +nr_free_pages(void) { +c010507d: 55 push %ebp +c010507e: 89 e5 mov %esp,%ebp +c0105080: 83 ec 28 sub $0x28,%esp + size_t ret;// 定义变量 ret 用于存储返回的空闲内存大小 + bool intr_flag;// 定义变量 intr_flag 用于保存中断状态 + local_intr_save(intr_flag);// 保存当前中断状态,并禁用中断 +c0105083: e8 89 fd ff ff call c0104e11 <__intr_save> +c0105088: 89 45 f4 mov %eax,-0xc(%ebp) + { + ret = pmm_manager->nr_free_pages();// 调用物理内存管理器的函数获取空闲内存页数 +c010508b: a1 0c c0 12 c0 mov 0xc012c00c,%eax +c0105090: 8b 40 14 mov 0x14(%eax),%eax +c0105093: ff d0 call *%eax +c0105095: 89 45 f0 mov %eax,-0x10(%ebp) + } + local_intr_restore(intr_flag);// 恢复之前保存的中断状态 +c0105098: 8b 45 f4 mov -0xc(%ebp),%eax +c010509b: 89 04 24 mov %eax,(%esp) +c010509e: e8 9a fd ff ff call c0104e3d <__intr_restore> + return ret;// 返回空闲内存的大小 +c01050a3: 8b 45 f0 mov -0x10(%ebp),%eax +} +c01050a6: 89 ec mov %ebp,%esp +c01050a8: 5d pop %ebp +c01050a9: c3 ret + +c01050aa : + +/* pmm_init - initialize the physical memory management */ +/* pmm_init - 初始化物理内存管理 */ +static void +page_init(void) { +c01050aa: 55 push %ebp +c01050ab: 89 e5 mov %esp,%ebp +c01050ad: 57 push %edi +c01050ae: 56 push %esi +c01050af: 53 push %ebx +c01050b0: 81 ec 9c 00 00 00 sub $0x9c,%esp + // 获取物理内存映射信息,存于特定地址 + struct e820map *memmap = (struct e820map *)(0x8000 + KERNBASE); +c01050b6: c7 45 c4 00 80 00 c0 movl $0xc0008000,-0x3c(%ebp) + uint64_t maxpa = 0;// 初始化最大物理地址为0 +c01050bd: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp) +c01050c4: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) + + cprintf("e820map:\n");// 打印“e820map”标题 +c01050cb: c7 04 24 a3 ae 10 c0 movl $0xc010aea3,(%esp) +c01050d2: e8 a1 b2 ff ff call c0100378 + int i; + for (i = 0; i < memmap->nr_map; i ++) {// 遍历内存映射数组 +c01050d7: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp) +c01050de: e9 0c 01 00 00 jmp c01051ef + uint64_t begin = memmap->map[i].addr, end = begin + memmap->map[i].size;// 获取每个区域的起始和结束地址 +c01050e3: 8b 4d c4 mov -0x3c(%ebp),%ecx +c01050e6: 8b 55 dc mov -0x24(%ebp),%edx +c01050e9: 89 d0 mov %edx,%eax +c01050eb: c1 e0 02 shl $0x2,%eax +c01050ee: 01 d0 add %edx,%eax +c01050f0: c1 e0 02 shl $0x2,%eax +c01050f3: 01 c8 add %ecx,%eax +c01050f5: 8b 50 08 mov 0x8(%eax),%edx +c01050f8: 8b 40 04 mov 0x4(%eax),%eax +c01050fb: 89 45 a0 mov %eax,-0x60(%ebp) +c01050fe: 89 55 a4 mov %edx,-0x5c(%ebp) +c0105101: 8b 4d c4 mov -0x3c(%ebp),%ecx +c0105104: 8b 55 dc mov -0x24(%ebp),%edx +c0105107: 89 d0 mov %edx,%eax +c0105109: c1 e0 02 shl $0x2,%eax +c010510c: 01 d0 add %edx,%eax +c010510e: c1 e0 02 shl $0x2,%eax +c0105111: 01 c8 add %ecx,%eax +c0105113: 8b 48 0c mov 0xc(%eax),%ecx +c0105116: 8b 58 10 mov 0x10(%eax),%ebx +c0105119: 8b 45 a0 mov -0x60(%ebp),%eax +c010511c: 8b 55 a4 mov -0x5c(%ebp),%edx +c010511f: 01 c8 add %ecx,%eax +c0105121: 11 da adc %ebx,%edx +c0105123: 89 45 98 mov %eax,-0x68(%ebp) +c0105126: 89 55 9c mov %edx,-0x64(%ebp) + cprintf(" memory: %08llx, [%08llx, %08llx], type = %d.\n",// 打印内存区域的信息 +c0105129: 8b 4d c4 mov -0x3c(%ebp),%ecx +c010512c: 8b 55 dc mov -0x24(%ebp),%edx +c010512f: 89 d0 mov %edx,%eax +c0105131: c1 e0 02 shl $0x2,%eax +c0105134: 01 d0 add %edx,%eax +c0105136: c1 e0 02 shl $0x2,%eax +c0105139: 01 c8 add %ecx,%eax +c010513b: 83 c0 14 add $0x14,%eax +c010513e: 8b 00 mov (%eax),%eax +c0105140: 89 85 7c ff ff ff mov %eax,-0x84(%ebp) +c0105146: 8b 45 98 mov -0x68(%ebp),%eax +c0105149: 8b 55 9c mov -0x64(%ebp),%edx +c010514c: 83 c0 ff add $0xffffffff,%eax +c010514f: 83 d2 ff adc $0xffffffff,%edx +c0105152: 89 c6 mov %eax,%esi +c0105154: 89 d7 mov %edx,%edi +c0105156: 8b 4d c4 mov -0x3c(%ebp),%ecx +c0105159: 8b 55 dc mov -0x24(%ebp),%edx +c010515c: 89 d0 mov %edx,%eax +c010515e: c1 e0 02 shl $0x2,%eax +c0105161: 01 d0 add %edx,%eax +c0105163: c1 e0 02 shl $0x2,%eax +c0105166: 01 c8 add %ecx,%eax +c0105168: 8b 48 0c mov 0xc(%eax),%ecx +c010516b: 8b 58 10 mov 0x10(%eax),%ebx +c010516e: 8b 85 7c ff ff ff mov -0x84(%ebp),%eax +c0105174: 89 44 24 1c mov %eax,0x1c(%esp) +c0105178: 89 74 24 14 mov %esi,0x14(%esp) +c010517c: 89 7c 24 18 mov %edi,0x18(%esp) +c0105180: 8b 45 a0 mov -0x60(%ebp),%eax +c0105183: 8b 55 a4 mov -0x5c(%ebp),%edx +c0105186: 89 44 24 0c mov %eax,0xc(%esp) +c010518a: 89 54 24 10 mov %edx,0x10(%esp) +c010518e: 89 4c 24 04 mov %ecx,0x4(%esp) +c0105192: 89 5c 24 08 mov %ebx,0x8(%esp) +c0105196: c7 04 24 b0 ae 10 c0 movl $0xc010aeb0,(%esp) +c010519d: e8 d6 b1 ff ff call c0100378 + memmap->map[i].size, begin, end - 1, memmap->map[i].type); + if (memmap->map[i].type == E820_ARM) {// 检查内存类型是否为可用内存 +c01051a2: 8b 4d c4 mov -0x3c(%ebp),%ecx +c01051a5: 8b 55 dc mov -0x24(%ebp),%edx +c01051a8: 89 d0 mov %edx,%eax +c01051aa: c1 e0 02 shl $0x2,%eax +c01051ad: 01 d0 add %edx,%eax +c01051af: c1 e0 02 shl $0x2,%eax +c01051b2: 01 c8 add %ecx,%eax +c01051b4: 83 c0 14 add $0x14,%eax +c01051b7: 8b 00 mov (%eax),%eax +c01051b9: 83 f8 01 cmp $0x1,%eax +c01051bc: 75 2e jne c01051ec + if (maxpa < end && begin < KMEMSIZE) {// 检查当前区域是否在有效范围内 +c01051be: 8b 45 e0 mov -0x20(%ebp),%eax +c01051c1: 8b 55 e4 mov -0x1c(%ebp),%edx +c01051c4: 3b 45 98 cmp -0x68(%ebp),%eax +c01051c7: 89 d0 mov %edx,%eax +c01051c9: 1b 45 9c sbb -0x64(%ebp),%eax +c01051cc: 73 1e jae c01051ec +c01051ce: ba ff ff ff 37 mov $0x37ffffff,%edx +c01051d3: b8 00 00 00 00 mov $0x0,%eax +c01051d8: 3b 55 a0 cmp -0x60(%ebp),%edx +c01051db: 1b 45 a4 sbb -0x5c(%ebp),%eax +c01051de: 72 0c jb c01051ec + maxpa = end;// 更新最大物理地址 +c01051e0: 8b 45 98 mov -0x68(%ebp),%eax +c01051e3: 8b 55 9c mov -0x64(%ebp),%edx +c01051e6: 89 45 e0 mov %eax,-0x20(%ebp) +c01051e9: 89 55 e4 mov %edx,-0x1c(%ebp) + for (i = 0; i < memmap->nr_map; i ++) {// 遍历内存映射数组 +c01051ec: ff 45 dc incl -0x24(%ebp) +c01051ef: 8b 45 c4 mov -0x3c(%ebp),%eax +c01051f2: 8b 00 mov (%eax),%eax +c01051f4: 39 45 dc cmp %eax,-0x24(%ebp) +c01051f7: 0f 8c e6 fe ff ff jl c01050e3 + } + } + } + if (maxpa > KMEMSIZE) {// 如果最大物理地址超过了预定义的内存上限 +c01051fd: ba 00 00 00 38 mov $0x38000000,%edx +c0105202: b8 00 00 00 00 mov $0x0,%eax +c0105207: 3b 55 e0 cmp -0x20(%ebp),%edx +c010520a: 1b 45 e4 sbb -0x1c(%ebp),%eax +c010520d: 73 0e jae c010521d + maxpa = KMEMSIZE;// 将其限制为内存上限 +c010520f: c7 45 e0 00 00 00 38 movl $0x38000000,-0x20(%ebp) +c0105216: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) + } + + extern char end[];// 引入全局变量 end,指向内存的结束位置 + + npage = maxpa / PGSIZE;// 计算可用页数 +c010521d: 8b 45 e0 mov -0x20(%ebp),%eax +c0105220: 8b 55 e4 mov -0x1c(%ebp),%edx +c0105223: 0f ac d0 0c shrd $0xc,%edx,%eax +c0105227: c1 ea 0c shr $0xc,%edx +c010522a: a3 04 c0 12 c0 mov %eax,0xc012c004 + pages = (struct Page *)ROUNDUP((void *)end, PGSIZE);// 将 end 对齐到页边界,指向页结构数组的开头 +c010522f: c7 45 c0 00 10 00 00 movl $0x1000,-0x40(%ebp) +c0105236: b8 b4 e1 12 c0 mov $0xc012e1b4,%eax +c010523b: 8d 50 ff lea -0x1(%eax),%edx +c010523e: 8b 45 c0 mov -0x40(%ebp),%eax +c0105241: 01 d0 add %edx,%eax +c0105243: 89 45 bc mov %eax,-0x44(%ebp) +c0105246: 8b 45 bc mov -0x44(%ebp),%eax +c0105249: ba 00 00 00 00 mov $0x0,%edx +c010524e: f7 75 c0 divl -0x40(%ebp) +c0105251: 8b 45 bc mov -0x44(%ebp),%eax +c0105254: 29 d0 sub %edx,%eax +c0105256: a3 00 c0 12 c0 mov %eax,0xc012c000 + + for (i = 0; i < npage; i ++) {// 遍历每一页 +c010525b: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp) +c0105262: eb 28 jmp c010528c + SetPageReserved(pages + i);// 将每一页标记为保留状态 +c0105264: 8b 15 00 c0 12 c0 mov 0xc012c000,%edx +c010526a: 8b 45 dc mov -0x24(%ebp),%eax +c010526d: c1 e0 05 shl $0x5,%eax +c0105270: 01 d0 add %edx,%eax +c0105272: 83 c0 04 add $0x4,%eax +c0105275: c7 45 94 00 00 00 00 movl $0x0,-0x6c(%ebp) +c010527c: 89 45 90 mov %eax,-0x70(%ebp) + asm volatile ("btsl %1, %0" :"=m" (*(volatile long *)addr) : "Ir" (nr)); +c010527f: 8b 45 90 mov -0x70(%ebp),%eax +c0105282: 8b 55 94 mov -0x6c(%ebp),%edx +c0105285: 0f ab 10 bts %edx,(%eax) +} +c0105288: 90 nop + for (i = 0; i < npage; i ++) {// 遍历每一页 +c0105289: ff 45 dc incl -0x24(%ebp) +c010528c: 8b 55 dc mov -0x24(%ebp),%edx +c010528f: a1 04 c0 12 c0 mov 0xc012c004,%eax +c0105294: 39 c2 cmp %eax,%edx +c0105296: 72 cc jb c0105264 + } + + uintptr_t freemem = PADDR((uintptr_t)pages + sizeof(struct Page) * npage);// 计算可用内存的起始地址 +c0105298: a1 04 c0 12 c0 mov 0xc012c004,%eax +c010529d: c1 e0 05 shl $0x5,%eax +c01052a0: 89 c2 mov %eax,%edx +c01052a2: a1 00 c0 12 c0 mov 0xc012c000,%eax +c01052a7: 01 d0 add %edx,%eax +c01052a9: 89 45 b8 mov %eax,-0x48(%ebp) +c01052ac: 81 7d b8 ff ff ff bf cmpl $0xbfffffff,-0x48(%ebp) +c01052b3: 77 23 ja c01052d8 +c01052b5: 8b 45 b8 mov -0x48(%ebp),%eax +c01052b8: 89 44 24 0c mov %eax,0xc(%esp) +c01052bc: c7 44 24 08 e0 ae 10 movl $0xc010aee0,0x8(%esp) +c01052c3: c0 +c01052c4: c7 44 24 04 1a 01 00 movl $0x11a,0x4(%esp) +c01052cb: 00 +c01052cc: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c01052d3: e8 6d b9 ff ff call c0100c45 <__panic> +c01052d8: 8b 45 b8 mov -0x48(%ebp),%eax +c01052db: 05 00 00 00 40 add $0x40000000,%eax +c01052e0: 89 45 b4 mov %eax,-0x4c(%ebp) + + for (i = 0; i < memmap->nr_map; i ++) {// 再次遍历内存映射 +c01052e3: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp) +c01052ea: e9 53 01 00 00 jmp c0105442 + uint64_t begin = memmap->map[i].addr, end = begin + memmap->map[i].size;// 获取每个区域的起始和结束地址 +c01052ef: 8b 4d c4 mov -0x3c(%ebp),%ecx +c01052f2: 8b 55 dc mov -0x24(%ebp),%edx +c01052f5: 89 d0 mov %edx,%eax +c01052f7: c1 e0 02 shl $0x2,%eax +c01052fa: 01 d0 add %edx,%eax +c01052fc: c1 e0 02 shl $0x2,%eax +c01052ff: 01 c8 add %ecx,%eax +c0105301: 8b 50 08 mov 0x8(%eax),%edx +c0105304: 8b 40 04 mov 0x4(%eax),%eax +c0105307: 89 45 d0 mov %eax,-0x30(%ebp) +c010530a: 89 55 d4 mov %edx,-0x2c(%ebp) +c010530d: 8b 4d c4 mov -0x3c(%ebp),%ecx +c0105310: 8b 55 dc mov -0x24(%ebp),%edx +c0105313: 89 d0 mov %edx,%eax +c0105315: c1 e0 02 shl $0x2,%eax +c0105318: 01 d0 add %edx,%eax +c010531a: c1 e0 02 shl $0x2,%eax +c010531d: 01 c8 add %ecx,%eax +c010531f: 8b 48 0c mov 0xc(%eax),%ecx +c0105322: 8b 58 10 mov 0x10(%eax),%ebx +c0105325: 8b 45 d0 mov -0x30(%ebp),%eax +c0105328: 8b 55 d4 mov -0x2c(%ebp),%edx +c010532b: 01 c8 add %ecx,%eax +c010532d: 11 da adc %ebx,%edx +c010532f: 89 45 c8 mov %eax,-0x38(%ebp) +c0105332: 89 55 cc mov %edx,-0x34(%ebp) + if (memmap->map[i].type == E820_ARM) {// 如果区域类型为可用内存 +c0105335: 8b 4d c4 mov -0x3c(%ebp),%ecx +c0105338: 8b 55 dc mov -0x24(%ebp),%edx +c010533b: 89 d0 mov %edx,%eax +c010533d: c1 e0 02 shl $0x2,%eax +c0105340: 01 d0 add %edx,%eax +c0105342: c1 e0 02 shl $0x2,%eax +c0105345: 01 c8 add %ecx,%eax +c0105347: 83 c0 14 add $0x14,%eax +c010534a: 8b 00 mov (%eax),%eax +c010534c: 83 f8 01 cmp $0x1,%eax +c010534f: 0f 85 ea 00 00 00 jne c010543f + if (begin < freemem) {// 如果起始地址小于可用内存地址 +c0105355: 8b 45 b4 mov -0x4c(%ebp),%eax +c0105358: ba 00 00 00 00 mov $0x0,%edx +c010535d: 8b 4d d4 mov -0x2c(%ebp),%ecx +c0105360: 39 45 d0 cmp %eax,-0x30(%ebp) +c0105363: 19 d1 sbb %edx,%ecx +c0105365: 73 0d jae c0105374 + begin = freemem;//将起始地址设置为可用内存地址 +c0105367: 8b 45 b4 mov -0x4c(%ebp),%eax +c010536a: 89 45 d0 mov %eax,-0x30(%ebp) +c010536d: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp) + } + if (end > KMEMSIZE) {// 如果结束地址超过内存上限 +c0105374: ba 00 00 00 38 mov $0x38000000,%edx +c0105379: b8 00 00 00 00 mov $0x0,%eax +c010537e: 3b 55 c8 cmp -0x38(%ebp),%edx +c0105381: 1b 45 cc sbb -0x34(%ebp),%eax +c0105384: 73 0e jae c0105394 + end = KMEMSIZE;// 将其限制为内存上限 +c0105386: c7 45 c8 00 00 00 38 movl $0x38000000,-0x38(%ebp) +c010538d: c7 45 cc 00 00 00 00 movl $0x0,-0x34(%ebp) + } + if (begin < end) {// 如果起始地址小于结束地址 +c0105394: 8b 45 d0 mov -0x30(%ebp),%eax +c0105397: 8b 55 d4 mov -0x2c(%ebp),%edx +c010539a: 3b 45 c8 cmp -0x38(%ebp),%eax +c010539d: 89 d0 mov %edx,%eax +c010539f: 1b 45 cc sbb -0x34(%ebp),%eax +c01053a2: 0f 83 97 00 00 00 jae c010543f + begin = ROUNDUP(begin, PGSIZE);// 将起始地址对齐到页边界 +c01053a8: c7 45 b0 00 10 00 00 movl $0x1000,-0x50(%ebp) +c01053af: 8b 55 d0 mov -0x30(%ebp),%edx +c01053b2: 8b 45 b0 mov -0x50(%ebp),%eax +c01053b5: 01 d0 add %edx,%eax +c01053b7: 48 dec %eax +c01053b8: 89 45 ac mov %eax,-0x54(%ebp) +c01053bb: 8b 45 ac mov -0x54(%ebp),%eax +c01053be: ba 00 00 00 00 mov $0x0,%edx +c01053c3: f7 75 b0 divl -0x50(%ebp) +c01053c6: 8b 45 ac mov -0x54(%ebp),%eax +c01053c9: 29 d0 sub %edx,%eax +c01053cb: ba 00 00 00 00 mov $0x0,%edx +c01053d0: 89 45 d0 mov %eax,-0x30(%ebp) +c01053d3: 89 55 d4 mov %edx,-0x2c(%ebp) + end = ROUNDDOWN(end, PGSIZE);// 将结束地址对齐到页边界 +c01053d6: 8b 45 c8 mov -0x38(%ebp),%eax +c01053d9: 89 45 a8 mov %eax,-0x58(%ebp) +c01053dc: 8b 45 a8 mov -0x58(%ebp),%eax +c01053df: ba 00 00 00 00 mov $0x0,%edx +c01053e4: 89 c7 mov %eax,%edi +c01053e6: 81 e7 00 f0 ff ff and $0xfffff000,%edi +c01053ec: 89 7d 80 mov %edi,-0x80(%ebp) +c01053ef: 89 d0 mov %edx,%eax +c01053f1: 83 e0 00 and $0x0,%eax +c01053f4: 89 45 84 mov %eax,-0x7c(%ebp) +c01053f7: 8b 45 80 mov -0x80(%ebp),%eax +c01053fa: 8b 55 84 mov -0x7c(%ebp),%edx +c01053fd: 89 45 c8 mov %eax,-0x38(%ebp) +c0105400: 89 55 cc mov %edx,-0x34(%ebp) + if (begin < end) {// 如果调整后的起始地址仍小于结束地址 +c0105403: 8b 45 d0 mov -0x30(%ebp),%eax +c0105406: 8b 55 d4 mov -0x2c(%ebp),%edx +c0105409: 3b 45 c8 cmp -0x38(%ebp),%eax +c010540c: 89 d0 mov %edx,%eax +c010540e: 1b 45 cc sbb -0x34(%ebp),%eax +c0105411: 73 2c jae c010543f + init_memmap(pa2page(begin), (end - begin) / PGSIZE);// 初始化内存页映射 +c0105413: 8b 45 c8 mov -0x38(%ebp),%eax +c0105416: 8b 55 cc mov -0x34(%ebp),%edx +c0105419: 2b 45 d0 sub -0x30(%ebp),%eax +c010541c: 1b 55 d4 sbb -0x2c(%ebp),%edx +c010541f: 0f ac d0 0c shrd $0xc,%edx,%eax +c0105423: c1 ea 0c shr $0xc,%edx +c0105426: 89 c3 mov %eax,%ebx +c0105428: 8b 45 d0 mov -0x30(%ebp),%eax +c010542b: 89 04 24 mov %eax,(%esp) +c010542e: e8 a0 f8 ff ff call c0104cd3 +c0105433: 89 5c 24 04 mov %ebx,0x4(%esp) +c0105437: 89 04 24 mov %eax,(%esp) +c010543a: e8 7a fb ff ff call c0104fb9 + for (i = 0; i < memmap->nr_map; i ++) {// 再次遍历内存映射 +c010543f: ff 45 dc incl -0x24(%ebp) +c0105442: 8b 45 c4 mov -0x3c(%ebp),%eax +c0105445: 8b 00 mov (%eax),%eax +c0105447: 39 45 dc cmp %eax,-0x24(%ebp) +c010544a: 0f 8c 9f fe ff ff jl c01052ef + } + } + } + } } -c010639c: c9 leave -c010639d: c3 ret - -c010639e <__slob_free_pages>: +c0105450: 90 nop +c0105451: 90 nop +c0105452: 81 c4 9c 00 00 00 add $0x9c,%esp +c0105458: 5b pop %ebx +c0105459: 5e pop %esi +c010545a: 5f pop %edi +c010545b: 5d pop %ebp +c010545c: c3 ret -#define __slob_get_free_page(gfp) __slob_get_free_pages(gfp, 0) +c010545d : +//la: 需要映射的线性地址(经过 x86 段映射后的地址) +// size: memory size size: 内存大小 +// pa: physical address of this memory pa:该内存的物理地址 +// perm: permission of this memory perm: 该内存的权限 +static void +boot_map_segment(pde_t *pgdir, uintptr_t la, size_t size, uintptr_t pa, uint32_t perm) { +c010545d: 55 push %ebp +c010545e: 89 e5 mov %esp,%ebp +c0105460: 83 ec 38 sub $0x38,%esp + // 确保线性地址和物理地址的页偏移相同 + assert(PGOFF(la) == PGOFF(pa)); +c0105463: 8b 45 0c mov 0xc(%ebp),%eax +c0105466: 33 45 14 xor 0x14(%ebp),%eax +c0105469: 25 ff 0f 00 00 and $0xfff,%eax +c010546e: 85 c0 test %eax,%eax +c0105470: 74 24 je c0105496 +c0105472: c7 44 24 0c 12 af 10 movl $0xc010af12,0xc(%esp) +c0105479: c0 +c010547a: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105481: c0 +c0105482: c7 44 24 04 3b 01 00 movl $0x13b,0x4(%esp) +c0105489: 00 +c010548a: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105491: e8 af b7 ff ff call c0100c45 <__panic> + // 计算需要映射的页数,ROUNDUP 将总大小对齐到下一个页大小的边界 + size_t n = ROUNDUP(size + PGOFF(la), PGSIZE) / PGSIZE; +c0105496: c7 45 f0 00 10 00 00 movl $0x1000,-0x10(%ebp) +c010549d: 8b 45 0c mov 0xc(%ebp),%eax +c01054a0: 25 ff 0f 00 00 and $0xfff,%eax +c01054a5: 89 c2 mov %eax,%edx +c01054a7: 8b 45 10 mov 0x10(%ebp),%eax +c01054aa: 01 c2 add %eax,%edx +c01054ac: 8b 45 f0 mov -0x10(%ebp),%eax +c01054af: 01 d0 add %edx,%eax +c01054b1: 48 dec %eax +c01054b2: 89 45 ec mov %eax,-0x14(%ebp) +c01054b5: 8b 45 ec mov -0x14(%ebp),%eax +c01054b8: ba 00 00 00 00 mov $0x0,%edx +c01054bd: f7 75 f0 divl -0x10(%ebp) +c01054c0: 8b 45 ec mov -0x14(%ebp),%eax +c01054c3: 29 d0 sub %edx,%eax +c01054c5: c1 e8 0c shr $0xc,%eax +c01054c8: 89 45 f4 mov %eax,-0xc(%ebp) + // 将线性地址向下对齐到页边界 + la = ROUNDDOWN(la, PGSIZE); +c01054cb: 8b 45 0c mov 0xc(%ebp),%eax +c01054ce: 89 45 e8 mov %eax,-0x18(%ebp) +c01054d1: 8b 45 e8 mov -0x18(%ebp),%eax +c01054d4: 25 00 f0 ff ff and $0xfffff000,%eax +c01054d9: 89 45 0c mov %eax,0xc(%ebp) + // 将物理地址向下对齐到页边界 + pa = ROUNDDOWN(pa, PGSIZE); +c01054dc: 8b 45 14 mov 0x14(%ebp),%eax +c01054df: 89 45 e4 mov %eax,-0x1c(%ebp) +c01054e2: 8b 45 e4 mov -0x1c(%ebp),%eax +c01054e5: 25 00 f0 ff ff and $0xfffff000,%eax +c01054ea: 89 45 14 mov %eax,0x14(%ebp) + // 循环遍历每一页,直到映射的页数为零 + for (; n > 0; n --, la += PGSIZE, pa += PGSIZE) { +c01054ed: eb 68 jmp c0105557 + // 获取当前页的页表项指针,如果不存在则创建新的页表项 + pte_t *ptep = get_pte(pgdir, la, 1); +c01054ef: c7 44 24 08 01 00 00 movl $0x1,0x8(%esp) +c01054f6: 00 +c01054f7: 8b 45 0c mov 0xc(%ebp),%eax +c01054fa: 89 44 24 04 mov %eax,0x4(%esp) +c01054fe: 8b 45 08 mov 0x8(%ebp),%eax +c0105501: 89 04 24 mov %eax,(%esp) +c0105504: e8 8d 01 00 00 call c0105696 +c0105509: 89 45 e0 mov %eax,-0x20(%ebp) + // 确保页表项指针不为空 + assert(ptep != NULL); +c010550c: 83 7d e0 00 cmpl $0x0,-0x20(%ebp) +c0105510: 75 24 jne c0105536 +c0105512: c7 44 24 0c 3e af 10 movl $0xc010af3e,0xc(%esp) +c0105519: c0 +c010551a: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105521: c0 +c0105522: c7 44 24 04 47 01 00 movl $0x147,0x4(%esp) +c0105529: 00 +c010552a: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105531: e8 0f b7 ff ff call c0100c45 <__panic> + // 设置页表项,包含物理地址、存在位和权限 + *ptep = pa | PTE_P | perm; +c0105536: 8b 45 14 mov 0x14(%ebp),%eax +c0105539: 0b 45 18 or 0x18(%ebp),%eax +c010553c: 83 c8 01 or $0x1,%eax +c010553f: 89 c2 mov %eax,%edx +c0105541: 8b 45 e0 mov -0x20(%ebp),%eax +c0105544: 89 10 mov %edx,(%eax) + for (; n > 0; n --, la += PGSIZE, pa += PGSIZE) { +c0105546: ff 4d f4 decl -0xc(%ebp) +c0105549: 81 45 0c 00 10 00 00 addl $0x1000,0xc(%ebp) +c0105550: 81 45 14 00 10 00 00 addl $0x1000,0x14(%ebp) +c0105557: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c010555b: 75 92 jne c01054ef + } +} +c010555d: 90 nop +c010555e: 90 nop +c010555f: 89 ec mov %ebp,%esp +c0105561: 5d pop %ebp +c0105562: c3 ret -static inline void __slob_free_pages(unsigned long kva, int order) -{ -c010639e: 55 push %ebp -c010639f: 89 e5 mov %esp,%ebp -c01063a1: 53 push %ebx -c01063a2: 83 ec 14 sub $0x14,%esp - free_pages(kva2page(kva), 1 << order); -c01063a5: 8b 45 0c mov 0xc(%ebp),%eax -c01063a8: ba 01 00 00 00 mov $0x1,%edx -c01063ad: 88 c1 mov %al,%cl -c01063af: d3 e2 shl %cl,%edx -c01063b1: 89 d0 mov %edx,%eax -c01063b3: 89 c3 mov %eax,%ebx -c01063b5: 8b 45 08 mov 0x8(%ebp),%eax -c01063b8: 89 04 24 mov %eax,(%esp) -c01063bb: e8 57 ff ff ff call c0106317 -c01063c0: 89 5c 24 04 mov %ebx,0x4(%esp) -c01063c4: 89 04 24 mov %eax,(%esp) -c01063c7: e8 fc d3 ff ff call c01037c8 -} -c01063cc: 90 nop -c01063cd: 83 c4 14 add $0x14,%esp -c01063d0: 5b pop %ebx -c01063d1: 5d pop %ebp -c01063d2: c3 ret - -c01063d3 : +c0105563 : +// return value: the kernel virtual address of this allocated page +//note: this function is used to get the memory for PDT(Page Directory Table)&PT(Page Table) +//boot_alloc_page - 使用 pmm->alloc_pages(1) 分配一页内存.返回值: 分配的页面的内核虚拟地址 +//注意: 此函数用于获取页目录表(PDT)和页表(PT)的内存 +static void * +boot_alloc_page(void) { +c0105563: 55 push %ebp +c0105564: 89 e5 mov %esp,%ebp +c0105566: 83 ec 28 sub $0x28,%esp + struct Page *p = alloc_page();// 调用分配页面的函数 +c0105569: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c0105570: e8 66 fa ff ff call c0104fdb +c0105575: 89 45 f4 mov %eax,-0xc(%ebp) + if (p == NULL) {// 检查分配是否成功 +c0105578: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c010557c: 75 1c jne c010559a + panic("boot_alloc_page failed.\n");// 如果分配失败,则触发异常 +c010557e: c7 44 24 08 4b af 10 movl $0xc010af4b,0x8(%esp) +c0105585: c0 +c0105586: c7 44 24 04 56 01 00 movl $0x156,0x4(%esp) +c010558d: 00 +c010558e: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105595: e8 ab b6 ff ff call c0100c45 <__panic> + } + return page2kva(p);// 返回分配页面的内核虚拟地址 +c010559a: 8b 45 f4 mov -0xc(%ebp),%eax +c010559d: 89 04 24 mov %eax,(%esp) +c01055a0: e8 76 f7 ff ff call c0104d1b +} +c01055a5: 89 ec mov %ebp,%esp +c01055a7: 5d pop %ebp +c01055a8: c3 ret -static void slob_free(void *b, int size); +c01055a9 : +//pmm_init - setup a pmm to manage physical memory, build PDT&PT to setup paging mechanism +// - check the correctness of pmm & paging mechanism, print PDT&PT +//pmm_init - 设置物理内存管理器,构建页目录表(PDT)和页表(PT),以设置分页机制 +// - 检查物理内存管理器和分页机制的正确性,打印页目录表和页表 +void +pmm_init(void) { +c01055a9: 55 push %ebp +c01055aa: 89 e5 mov %esp,%ebp +c01055ac: 83 ec 38 sub $0x38,%esp + // We've already enabled paging + // 我们已经启用了分页 + boot_cr3 = PADDR(boot_pgdir); +c01055af: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c01055b4: 89 45 f4 mov %eax,-0xc(%ebp) +c01055b7: 81 7d f4 ff ff ff bf cmpl $0xbfffffff,-0xc(%ebp) +c01055be: 77 23 ja c01055e3 +c01055c0: 8b 45 f4 mov -0xc(%ebp),%eax +c01055c3: 89 44 24 0c mov %eax,0xc(%esp) +c01055c7: c7 44 24 08 e0 ae 10 movl $0xc010aee0,0x8(%esp) +c01055ce: c0 +c01055cf: c7 44 24 04 63 01 00 movl $0x163,0x4(%esp) +c01055d6: 00 +c01055d7: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c01055de: e8 62 b6 ff ff call c0100c45 <__panic> +c01055e3: 8b 45 f4 mov -0xc(%ebp),%eax +c01055e6: 05 00 00 00 40 add $0x40000000,%eax +c01055eb: a3 08 c0 12 c0 mov %eax,0xc012c008 + // 我们需要分配/释放物理内存(粒度为 4KB 或其他大小)。 + // 因此在 pmm.h 中定义了物理内存管理器的框架(struct pmm_manager)。 + // 首先,我们应该基于该框架初始化一个物理内存管理器(pmm)。 + // 然后 pmm 可以分配/释放物理内存。 + // 现在,first_fit/best_fit/worst_fit/buddy_system 的 pmm 都可用。 + init_pmm_manager();// 初始化物理内存管理器 +c01055f0: e8 8e f9 ff ff call c0104f83 -static void *slob_alloc(size_t size, gfp_t gfp, int align) -{ -c01063d3: f3 0f 1e fb endbr32 -c01063d7: 55 push %ebp -c01063d8: 89 e5 mov %esp,%ebp -c01063da: 83 ec 38 sub $0x38,%esp - assert( (size + SLOB_UNIT) < PAGE_SIZE ); -c01063dd: 8b 45 08 mov 0x8(%ebp),%eax -c01063e0: 83 c0 08 add $0x8,%eax -c01063e3: 3d ff 0f 00 00 cmp $0xfff,%eax -c01063e8: 76 24 jbe c010640e -c01063ea: c7 44 24 0c 00 b9 10 movl $0xc010b900,0xc(%esp) -c01063f1: c0 -c01063f2: c7 44 24 08 1f b9 10 movl $0xc010b91f,0x8(%esp) -c01063f9: c0 -c01063fa: c7 44 24 04 64 00 00 movl $0x64,0x4(%esp) -c0106401: 00 -c0106402: c7 04 24 34 b9 10 c0 movl $0xc010b934,(%esp) -c0106409: e8 35 a0 ff ff call c0100443 <__panic> + // detect physical memory space, reserve already used memory, + // then use pmm->init_memmap to create free page list + // 检测物理内存空间,保留已经使用的内存, + // 然后使用 pmm->init_memmap 创建空闲页面列表 + page_init();// 初始化页面管理 +c01055f5: e8 b0 fa ff ff call c01050aa - slob_t *prev, *cur, *aligned = 0; -c010640e: c7 45 ec 00 00 00 00 movl $0x0,-0x14(%ebp) - int delta = 0, units = SLOB_UNITS(size); -c0106415: c7 45 e8 00 00 00 00 movl $0x0,-0x18(%ebp) -c010641c: 8b 45 08 mov 0x8(%ebp),%eax -c010641f: 83 c0 07 add $0x7,%eax -c0106422: c1 e8 03 shr $0x3,%eax -c0106425: 89 45 e0 mov %eax,-0x20(%ebp) - unsigned long flags; + //use pmm->check to verify the correctness of the alloc/free function in a pmm + // 使用 pmm->check 验证 pmm 中分配/释放函数的正确性 + check_alloc_page();// 检查页面分配功能 +c01055fa: e8 bf 04 00 00 call c0105abe - spin_lock_irqsave(&slob_lock, flags); -c0106428: e8 e9 fd ff ff call c0106216 <__intr_save> -c010642d: 89 45 e4 mov %eax,-0x1c(%ebp) - prev = slobfree; -c0106430: a1 68 8a 12 c0 mov 0xc0128a68,%eax -c0106435: 89 45 f4 mov %eax,-0xc(%ebp) - for (cur = prev->next; ; prev = cur, cur = cur->next) { -c0106438: 8b 45 f4 mov -0xc(%ebp),%eax -c010643b: 8b 40 04 mov 0x4(%eax),%eax -c010643e: 89 45 f0 mov %eax,-0x10(%ebp) - if (align) { -c0106441: 83 7d 10 00 cmpl $0x0,0x10(%ebp) -c0106445: 74 21 je c0106468 - aligned = (slob_t *)ALIGN((unsigned long)cur, align); -c0106447: 8b 55 f0 mov -0x10(%ebp),%edx -c010644a: 8b 45 10 mov 0x10(%ebp),%eax -c010644d: 01 d0 add %edx,%eax -c010644f: 8d 50 ff lea -0x1(%eax),%edx -c0106452: 8b 45 10 mov 0x10(%ebp),%eax -c0106455: f7 d8 neg %eax -c0106457: 21 d0 and %edx,%eax -c0106459: 89 45 ec mov %eax,-0x14(%ebp) - delta = aligned - cur; -c010645c: 8b 45 ec mov -0x14(%ebp),%eax -c010645f: 2b 45 f0 sub -0x10(%ebp),%eax -c0106462: c1 f8 03 sar $0x3,%eax -c0106465: 89 45 e8 mov %eax,-0x18(%ebp) - } - if (cur->units >= units + delta) { /* room enough? */ -c0106468: 8b 45 f0 mov -0x10(%ebp),%eax -c010646b: 8b 00 mov (%eax),%eax -c010646d: 8b 4d e0 mov -0x20(%ebp),%ecx -c0106470: 8b 55 e8 mov -0x18(%ebp),%edx -c0106473: 01 ca add %ecx,%edx -c0106475: 39 d0 cmp %edx,%eax -c0106477: 0f 8c aa 00 00 00 jl c0106527 - if (delta) { /* need to fragment head to align? */ -c010647d: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) -c0106481: 74 38 je c01064bb - aligned->units = cur->units - delta; -c0106483: 8b 45 f0 mov -0x10(%ebp),%eax -c0106486: 8b 00 mov (%eax),%eax -c0106488: 2b 45 e8 sub -0x18(%ebp),%eax -c010648b: 89 c2 mov %eax,%edx -c010648d: 8b 45 ec mov -0x14(%ebp),%eax -c0106490: 89 10 mov %edx,(%eax) - aligned->next = cur->next; -c0106492: 8b 45 f0 mov -0x10(%ebp),%eax -c0106495: 8b 50 04 mov 0x4(%eax),%edx -c0106498: 8b 45 ec mov -0x14(%ebp),%eax -c010649b: 89 50 04 mov %edx,0x4(%eax) - cur->next = aligned; -c010649e: 8b 45 f0 mov -0x10(%ebp),%eax -c01064a1: 8b 55 ec mov -0x14(%ebp),%edx -c01064a4: 89 50 04 mov %edx,0x4(%eax) - cur->units = delta; -c01064a7: 8b 45 f0 mov -0x10(%ebp),%eax -c01064aa: 8b 55 e8 mov -0x18(%ebp),%edx -c01064ad: 89 10 mov %edx,(%eax) - prev = cur; -c01064af: 8b 45 f0 mov -0x10(%ebp),%eax -c01064b2: 89 45 f4 mov %eax,-0xc(%ebp) - cur = aligned; -c01064b5: 8b 45 ec mov -0x14(%ebp),%eax -c01064b8: 89 45 f0 mov %eax,-0x10(%ebp) - } + check_pgdir();// 检查页目录的状态 +c01055ff: e8 db 04 00 00 call c0105adf - if (cur->units == units) /* exact fit? */ -c01064bb: 8b 45 f0 mov -0x10(%ebp),%eax -c01064be: 8b 00 mov (%eax),%eax -c01064c0: 39 45 e0 cmp %eax,-0x20(%ebp) -c01064c3: 75 0e jne c01064d3 - prev->next = cur->next; /* unlink */ -c01064c5: 8b 45 f0 mov -0x10(%ebp),%eax -c01064c8: 8b 50 04 mov 0x4(%eax),%edx -c01064cb: 8b 45 f4 mov -0xc(%ebp),%eax -c01064ce: 89 50 04 mov %edx,0x4(%eax) -c01064d1: eb 3c jmp c010650f - else { /* fragment */ - prev->next = cur + units; -c01064d3: 8b 45 e0 mov -0x20(%ebp),%eax -c01064d6: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx -c01064dd: 8b 45 f0 mov -0x10(%ebp),%eax -c01064e0: 01 c2 add %eax,%edx -c01064e2: 8b 45 f4 mov -0xc(%ebp),%eax -c01064e5: 89 50 04 mov %edx,0x4(%eax) - prev->next->units = cur->units - units; -c01064e8: 8b 45 f0 mov -0x10(%ebp),%eax -c01064eb: 8b 10 mov (%eax),%edx -c01064ed: 8b 45 f4 mov -0xc(%ebp),%eax -c01064f0: 8b 40 04 mov 0x4(%eax),%eax -c01064f3: 2b 55 e0 sub -0x20(%ebp),%edx -c01064f6: 89 10 mov %edx,(%eax) - prev->next->next = cur->next; -c01064f8: 8b 45 f4 mov -0xc(%ebp),%eax -c01064fb: 8b 40 04 mov 0x4(%eax),%eax -c01064fe: 8b 55 f0 mov -0x10(%ebp),%edx -c0106501: 8b 52 04 mov 0x4(%edx),%edx -c0106504: 89 50 04 mov %edx,0x4(%eax) - cur->units = units; -c0106507: 8b 45 f0 mov -0x10(%ebp),%eax -c010650a: 8b 55 e0 mov -0x20(%ebp),%edx -c010650d: 89 10 mov %edx,(%eax) - } + // recursively insert boot_pgdir in itself + // to form a virtual page table at virtual address VPT + // 递归地将 boot_pgdir 插入到自身中 + // 在虚拟地址 VPT 处形成虚拟页表 + boot_pgdir[PDX(VPT)] = PADDR(boot_pgdir) | PTE_P | PTE_W;// 设置页目录项,映射自身 +c0105604: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0105609: 89 45 f0 mov %eax,-0x10(%ebp) +c010560c: 81 7d f0 ff ff ff bf cmpl $0xbfffffff,-0x10(%ebp) +c0105613: 77 23 ja c0105638 +c0105615: 8b 45 f0 mov -0x10(%ebp),%eax +c0105618: 89 44 24 0c mov %eax,0xc(%esp) +c010561c: c7 44 24 08 e0 ae 10 movl $0xc010aee0,0x8(%esp) +c0105623: c0 +c0105624: c7 44 24 04 83 01 00 movl $0x183,0x4(%esp) +c010562b: 00 +c010562c: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105633: e8 0d b6 ff ff call c0100c45 <__panic> +c0105638: 8b 45 f0 mov -0x10(%ebp),%eax +c010563b: 8d 90 00 00 00 40 lea 0x40000000(%eax),%edx +c0105641: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0105646: 05 ac 0f 00 00 add $0xfac,%eax +c010564b: 83 ca 03 or $0x3,%edx +c010564e: 89 10 mov %edx,(%eax) - slobfree = prev; -c010650f: 8b 45 f4 mov -0xc(%ebp),%eax -c0106512: a3 68 8a 12 c0 mov %eax,0xc0128a68 - spin_unlock_irqrestore(&slob_lock, flags); -c0106517: 8b 45 e4 mov -0x1c(%ebp),%eax -c010651a: 89 04 24 mov %eax,(%esp) -c010651d: e8 1e fd ff ff call c0106240 <__intr_restore> - return cur; -c0106522: 8b 45 f0 mov -0x10(%ebp),%eax -c0106525: eb 7f jmp c01065a6 - } - if (cur == slobfree) { -c0106527: a1 68 8a 12 c0 mov 0xc0128a68,%eax -c010652c: 39 45 f0 cmp %eax,-0x10(%ebp) -c010652f: 75 61 jne c0106592 - spin_unlock_irqrestore(&slob_lock, flags); -c0106531: 8b 45 e4 mov -0x1c(%ebp),%eax -c0106534: 89 04 24 mov %eax,(%esp) -c0106537: e8 04 fd ff ff call c0106240 <__intr_restore> + // map all physical memory to linear memory with base linear addr KERNBASE + // linear_addr KERNBASE ~ KERNBASE + KMEMSIZE = phy_addr 0 ~ KMEMSIZE + // 将所有物理内存映射到线性内存,基地址为 KERNBASE + // 线性地址 KERNBASE ~ KERNBASE + KMEMSIZE = 物理地址 0 ~ KMEMSIZE + boot_map_segment(boot_pgdir, KERNBASE, KMEMSIZE, 0, PTE_W);// 映射物理内存 +c0105650: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0105655: c7 44 24 10 02 00 00 movl $0x2,0x10(%esp) +c010565c: 00 +c010565d: c7 44 24 0c 00 00 00 movl $0x0,0xc(%esp) +c0105664: 00 +c0105665: c7 44 24 08 00 00 00 movl $0x38000000,0x8(%esp) +c010566c: 38 +c010566d: c7 44 24 04 00 00 00 movl $0xc0000000,0x4(%esp) +c0105674: c0 +c0105675: 89 04 24 mov %eax,(%esp) +c0105678: e8 e0 fd ff ff call c010545d + // then set kernel stack (ss:esp) in TSS, setup TSS in gdt, load TSS + // 由于我们正在使用引导加载程序的 GDT, + // 我们应该重新加载 GDT(第二次,也是最后一次),以获取用户段和 TSS + // 映射虚拟地址 0 ~ 4G = 线性地址 0 ~ 4G + // 然后在 TSS 中设置内核栈 (ss:esp),在 gdt 中设置 TSS,加载 TSS + gdt_init();// 初始化全局描述符表 +c010567d: e8 15 f8 ff ff call c0104e97 - if (size == PAGE_SIZE) /* trying to shrink arena? */ -c010653c: 81 7d 08 00 10 00 00 cmpl $0x1000,0x8(%ebp) -c0106543: 75 07 jne c010654c - return 0; -c0106545: b8 00 00 00 00 mov $0x0,%eax -c010654a: eb 5a jmp c01065a6 + //now the basic virtual memory map(see memalyout.h) is established. + //check the correctness of the basic virtual memory map. + // 现在基本的虚拟内存映射(见 memlayout.h)已建立。 + // 检查基础虚拟内存映射的正确性。 + check_boot_pgdir(); // 检查页目录的正确性 +c0105682: e8 f6 0a 00 00 call c010617d - cur = (slob_t *)__slob_get_free_page(gfp); -c010654c: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c0106553: 00 -c0106554: 8b 45 0c mov 0xc(%ebp),%eax -c0106557: 89 04 24 mov %eax,(%esp) -c010655a: e8 02 fe ff ff call c0106361 <__slob_get_free_pages> -c010655f: 89 45 f0 mov %eax,-0x10(%ebp) - if (!cur) -c0106562: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c0106566: 75 07 jne c010656f - return 0; -c0106568: b8 00 00 00 00 mov $0x0,%eax -c010656d: eb 37 jmp c01065a6 + print_pgdir(); // 打印页目录表 +c0105687: e8 73 0f 00 00 call c01065ff + kmalloc_init(); +c010568c: e8 70 f3 ff ff call c0104a01 - slob_free(cur, PAGE_SIZE); -c010656f: c7 44 24 04 00 10 00 movl $0x1000,0x4(%esp) -c0106576: 00 -c0106577: 8b 45 f0 mov -0x10(%ebp),%eax -c010657a: 89 04 24 mov %eax,(%esp) -c010657d: e8 26 00 00 00 call c01065a8 - spin_lock_irqsave(&slob_lock, flags); -c0106582: e8 8f fc ff ff call c0106216 <__intr_save> -c0106587: 89 45 e4 mov %eax,-0x1c(%ebp) - cur = slobfree; -c010658a: a1 68 8a 12 c0 mov 0xc0128a68,%eax -c010658f: 89 45 f0 mov %eax,-0x10(%ebp) - for (cur = prev->next; ; prev = cur, cur = cur->next) { -c0106592: 8b 45 f0 mov -0x10(%ebp),%eax -c0106595: 89 45 f4 mov %eax,-0xc(%ebp) -c0106598: 8b 45 f0 mov -0x10(%ebp),%eax -c010659b: 8b 40 04 mov 0x4(%eax),%eax -c010659e: 89 45 f0 mov %eax,-0x10(%ebp) - if (align) { -c01065a1: e9 9b fe ff ff jmp c0106441 - } - } } -c01065a6: c9 leave -c01065a7: c3 ret - -c01065a8 : - -static void slob_free(void *block, int size) -{ -c01065a8: f3 0f 1e fb endbr32 -c01065ac: 55 push %ebp -c01065ad: 89 e5 mov %esp,%ebp -c01065af: 83 ec 28 sub $0x28,%esp - slob_t *cur, *b = (slob_t *)block; -c01065b2: 8b 45 08 mov 0x8(%ebp),%eax -c01065b5: 89 45 f0 mov %eax,-0x10(%ebp) - unsigned long flags; +c0105691: 90 nop +c0105692: 89 ec mov %ebp,%esp +c0105694: 5d pop %ebp +c0105695: c3 ret - if (!block) -c01065b8: 83 7d 08 00 cmpl $0x0,0x8(%ebp) -c01065bc: 0f 84 01 01 00 00 je c01066c3 - return; +c0105696 : +// pgdir: 页目录的内核虚拟基地址 +// la: 需要映射的线性地址 +// create: 一个逻辑值,决定是否为页表分配一页 +// 返回值:该 PTE 的内核虚拟地址 +pte_t * +get_pte(pde_t *pgdir, uintptr_t la, bool create) { +c0105696: 55 push %ebp +c0105697: 89 e5 mov %esp,%ebp +c0105699: 83 ec 38 sub $0x38,%esp + // (7) set page directory entry's permission + } + return NULL; // (8) return page table entry +#endif + // (1) 找到页目录项 + pde_t *pdep = &pgdir[PDX(la)];// 使用 PDX 宏获取页目录索引 +c010569c: 8b 45 0c mov 0xc(%ebp),%eax +c010569f: c1 e8 16 shr $0x16,%eax +c01056a2: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx +c01056a9: 8b 45 08 mov 0x8(%ebp),%eax +c01056ac: 01 d0 add %edx,%eax +c01056ae: 89 45 f4 mov %eax,-0xc(%ebp) + // (2) 检查页目录项是否存在 + if (!(*pdep & PTE_P)) {// 如果页目录项的存在位 PTE_P 没有被设置 +c01056b1: 8b 45 f4 mov -0xc(%ebp),%eax +c01056b4: 8b 00 mov (%eax),%eax +c01056b6: 83 e0 01 and $0x1,%eax +c01056b9: 85 c0 test %eax,%eax +c01056bb: 0f 85 af 00 00 00 jne c0105770 + struct Page *page;// 声明一个指针,用于指向新分配的页面 + // 检查是否允许创建新页表,或者分配页表失败 + if (!create || (page = alloc_page()) == NULL) {// 如果不允许创建或分配失败 +c01056c1: 83 7d 10 00 cmpl $0x0,0x10(%ebp) +c01056c5: 74 15 je c01056dc +c01056c7: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c01056ce: e8 08 f9 ff ff call c0104fdb +c01056d3: 89 45 f0 mov %eax,-0x10(%ebp) +c01056d6: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) +c01056da: 75 0a jne c01056e6 + return NULL;// 返回 NULL,表示无法获取页表 +c01056dc: b8 00 00 00 00 mov $0x0,%eax +c01056e1: e9 e7 00 00 00 jmp c01057cd + } + // 设置新分配页面的引用计数为 1 + set_page_ref(page, 1); +c01056e6: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c01056ed: 00 +c01056ee: 8b 45 f0 mov -0x10(%ebp),%eax +c01056f1: 89 04 24 mov %eax,(%esp) +c01056f4: e8 dc f6 ff ff call c0104dd5 + uintptr_t pa = page2pa(page);// 获取新分配页面的物理地址 +c01056f9: 8b 45 f0 mov -0x10(%ebp),%eax +c01056fc: 89 04 24 mov %eax,(%esp) +c01056ff: e8 b7 f5 ff ff call c0104cbb +c0105704: 89 45 ec mov %eax,-0x14(%ebp) + memset(KADDR(pa), 0, PGSIZE);// 清空新分配的页表内容,初始化为零 +c0105707: 8b 45 ec mov -0x14(%ebp),%eax +c010570a: 89 45 e8 mov %eax,-0x18(%ebp) +c010570d: 8b 45 e8 mov -0x18(%ebp),%eax +c0105710: c1 e8 0c shr $0xc,%eax +c0105713: 89 45 e4 mov %eax,-0x1c(%ebp) +c0105716: a1 04 c0 12 c0 mov 0xc012c004,%eax +c010571b: 39 45 e4 cmp %eax,-0x1c(%ebp) +c010571e: 72 23 jb c0105743 +c0105720: 8b 45 e8 mov -0x18(%ebp),%eax +c0105723: 89 44 24 0c mov %eax,0xc(%esp) +c0105727: c7 44 24 08 3c ae 10 movl $0xc010ae3c,0x8(%esp) +c010572e: c0 +c010572f: c7 44 24 04 dd 01 00 movl $0x1dd,0x4(%esp) +c0105736: 00 +c0105737: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c010573e: e8 02 b5 ff ff call c0100c45 <__panic> +c0105743: 8b 45 e8 mov -0x18(%ebp),%eax +c0105746: 2d 00 00 00 40 sub $0x40000000,%eax +c010574b: c7 44 24 08 00 10 00 movl $0x1000,0x8(%esp) +c0105752: 00 +c0105753: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c010575a: 00 +c010575b: 89 04 24 mov %eax,(%esp) +c010575e: e8 81 47 00 00 call c0109ee4 + // 更新页目录项,设置物理地址和权限位 + *pdep = pa | PTE_U | PTE_W | PTE_P;// 将物理地址和权限位(用户可访问、可写、有效)合并设置 +c0105763: 8b 45 ec mov -0x14(%ebp),%eax +c0105766: 83 c8 07 or $0x7,%eax +c0105769: 89 c2 mov %eax,%edx +c010576b: 8b 45 f4 mov -0xc(%ebp),%eax +c010576e: 89 10 mov %edx,(%eax) + } + // 返回指定线性地址 la 对应的页表项的内核虚拟地址 + return &((pte_t *)KADDR(PDE_ADDR(*pdep)))[PTX(la)];// 计算并返回页表项的指针 +c0105770: 8b 45 f4 mov -0xc(%ebp),%eax +c0105773: 8b 00 mov (%eax),%eax +c0105775: 25 00 f0 ff ff and $0xfffff000,%eax +c010577a: 89 45 e0 mov %eax,-0x20(%ebp) +c010577d: 8b 45 e0 mov -0x20(%ebp),%eax +c0105780: c1 e8 0c shr $0xc,%eax +c0105783: 89 45 dc mov %eax,-0x24(%ebp) +c0105786: a1 04 c0 12 c0 mov 0xc012c004,%eax +c010578b: 39 45 dc cmp %eax,-0x24(%ebp) +c010578e: 72 23 jb c01057b3 +c0105790: 8b 45 e0 mov -0x20(%ebp),%eax +c0105793: 89 44 24 0c mov %eax,0xc(%esp) +c0105797: c7 44 24 08 3c ae 10 movl $0xc010ae3c,0x8(%esp) +c010579e: c0 +c010579f: c7 44 24 04 e2 01 00 movl $0x1e2,0x4(%esp) +c01057a6: 00 +c01057a7: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c01057ae: e8 92 b4 ff ff call c0100c45 <__panic> +c01057b3: 8b 45 e0 mov -0x20(%ebp),%eax +c01057b6: 2d 00 00 00 40 sub $0x40000000,%eax +c01057bb: 89 c2 mov %eax,%edx +c01057bd: 8b 45 0c mov 0xc(%ebp),%eax +c01057c0: c1 e8 0c shr $0xc,%eax +c01057c3: 25 ff 03 00 00 and $0x3ff,%eax +c01057c8: c1 e0 02 shl $0x2,%eax +c01057cb: 01 d0 add %edx,%eax +} +c01057cd: 89 ec mov %ebp,%esp +c01057cf: 5d pop %ebp +c01057d0: c3 ret + +c01057d1 : - if (size) -c01065c2: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) -c01065c6: 74 10 je c01065d8 - b->units = SLOB_UNITS(size); -c01065c8: 8b 45 0c mov 0xc(%ebp),%eax -c01065cb: 83 c0 07 add $0x7,%eax -c01065ce: c1 e8 03 shr $0x3,%eax -c01065d1: 89 c2 mov %eax,%edx -c01065d3: 8b 45 f0 mov -0x10(%ebp),%eax -c01065d6: 89 10 mov %edx,(%eax) +//get_page - get related Page struct for linear address la using PDT pgdir +// get_page - 获取与线性地址 la 相关的 Page 结构体,使用页目录 pgdir +struct Page * +get_page(pde_t *pgdir, uintptr_t la, pte_t **ptep_store) { +c01057d1: 55 push %ebp +c01057d2: 89 e5 mov %esp,%ebp +c01057d4: 83 ec 28 sub $0x28,%esp + // 调用 get_pte 函数获取对应线性地址 la 的页表项指针 + pte_t *ptep = get_pte(pgdir, la, 0); +c01057d7: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c01057de: 00 +c01057df: 8b 45 0c mov 0xc(%ebp),%eax +c01057e2: 89 44 24 04 mov %eax,0x4(%esp) +c01057e6: 8b 45 08 mov 0x8(%ebp),%eax +c01057e9: 89 04 24 mov %eax,(%esp) +c01057ec: e8 a5 fe ff ff call c0105696 +c01057f1: 89 45 f4 mov %eax,-0xc(%ebp) + // 如果 ptep_store 指针不为 NULL,将 ptep 存储到 ptep_store 指向的位置 + if (ptep_store != NULL) { +c01057f4: 83 7d 10 00 cmpl $0x0,0x10(%ebp) +c01057f8: 74 08 je c0105802 + *ptep_store = ptep; // 存储当前页表项的指针 +c01057fa: 8b 45 10 mov 0x10(%ebp),%eax +c01057fd: 8b 55 f4 mov -0xc(%ebp),%edx +c0105800: 89 10 mov %edx,(%eax) + } + // 检查 ptep 是否有效以及页表项的存在位 PTE_P 是否被设置 + if (ptep != NULL && *ptep & PTE_P) { +c0105802: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0105806: 74 1b je c0105823 +c0105808: 8b 45 f4 mov -0xc(%ebp),%eax +c010580b: 8b 00 mov (%eax),%eax +c010580d: 83 e0 01 and $0x1,%eax +c0105810: 85 c0 test %eax,%eax +c0105812: 74 0f je c0105823 + // 返回与页表项对应的 Page 结构体 + return pte2page(*ptep);// 将页表项转换为对应的 Page 结构 +c0105814: 8b 45 f4 mov -0xc(%ebp),%eax +c0105817: 8b 00 mov (%eax),%eax +c0105819: 89 04 24 mov %eax,(%esp) +c010581c: e8 50 f5 ff ff call c0104d71 +c0105821: eb 05 jmp c0105828 + } + // 如果未找到有效的页,返回 NULL + return NULL; +c0105823: b8 00 00 00 00 mov $0x0,%eax +} +c0105828: 89 ec mov %ebp,%esp +c010582a: 5d pop %ebp +c010582b: c3 ret - /* Find reinsertion point */ - spin_lock_irqsave(&slob_lock, flags); -c01065d8: e8 39 fc ff ff call c0106216 <__intr_save> -c01065dd: 89 45 ec mov %eax,-0x14(%ebp) - for (cur = slobfree; !(b > cur && b < cur->next); cur = cur->next) -c01065e0: a1 68 8a 12 c0 mov 0xc0128a68,%eax -c01065e5: 89 45 f4 mov %eax,-0xc(%ebp) -c01065e8: eb 27 jmp c0106611 - if (cur >= cur->next && (b > cur || b < cur->next)) -c01065ea: 8b 45 f4 mov -0xc(%ebp),%eax -c01065ed: 8b 40 04 mov 0x4(%eax),%eax -c01065f0: 39 45 f4 cmp %eax,-0xc(%ebp) -c01065f3: 72 13 jb c0106608 -c01065f5: 8b 45 f0 mov -0x10(%ebp),%eax -c01065f8: 3b 45 f4 cmp -0xc(%ebp),%eax -c01065fb: 77 27 ja c0106624 -c01065fd: 8b 45 f4 mov -0xc(%ebp),%eax -c0106600: 8b 40 04 mov 0x4(%eax),%eax -c0106603: 39 45 f0 cmp %eax,-0x10(%ebp) -c0106606: 72 1c jb c0106624 - for (cur = slobfree; !(b > cur && b < cur->next); cur = cur->next) -c0106608: 8b 45 f4 mov -0xc(%ebp),%eax -c010660b: 8b 40 04 mov 0x4(%eax),%eax -c010660e: 89 45 f4 mov %eax,-0xc(%ebp) -c0106611: 8b 45 f0 mov -0x10(%ebp),%eax -c0106614: 3b 45 f4 cmp -0xc(%ebp),%eax -c0106617: 76 d1 jbe c01065ea -c0106619: 8b 45 f4 mov -0xc(%ebp),%eax -c010661c: 8b 40 04 mov 0x4(%eax),%eax -c010661f: 39 45 f0 cmp %eax,-0x10(%ebp) -c0106622: 73 c6 jae c01065ea - break; +c010582c : - if (b + b->units == cur->next) { -c0106624: 8b 45 f0 mov -0x10(%ebp),%eax -c0106627: 8b 00 mov (%eax),%eax -c0106629: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx -c0106630: 8b 45 f0 mov -0x10(%ebp),%eax -c0106633: 01 c2 add %eax,%edx -c0106635: 8b 45 f4 mov -0xc(%ebp),%eax -c0106638: 8b 40 04 mov 0x4(%eax),%eax -c010663b: 39 c2 cmp %eax,%edx -c010663d: 75 25 jne c0106664 - b->units += cur->next->units; -c010663f: 8b 45 f0 mov -0x10(%ebp),%eax -c0106642: 8b 10 mov (%eax),%edx -c0106644: 8b 45 f4 mov -0xc(%ebp),%eax -c0106647: 8b 40 04 mov 0x4(%eax),%eax -c010664a: 8b 00 mov (%eax),%eax -c010664c: 01 c2 add %eax,%edx -c010664e: 8b 45 f0 mov -0x10(%ebp),%eax -c0106651: 89 10 mov %edx,(%eax) - b->next = cur->next->next; -c0106653: 8b 45 f4 mov -0xc(%ebp),%eax -c0106656: 8b 40 04 mov 0x4(%eax),%eax -c0106659: 8b 50 04 mov 0x4(%eax),%edx -c010665c: 8b 45 f0 mov -0x10(%ebp),%eax -c010665f: 89 50 04 mov %edx,0x4(%eax) -c0106662: eb 0c jmp c0106670 - } else - b->next = cur->next; -c0106664: 8b 45 f4 mov -0xc(%ebp),%eax -c0106667: 8b 50 04 mov 0x4(%eax),%edx -c010666a: 8b 45 f0 mov -0x10(%ebp),%eax -c010666d: 89 50 04 mov %edx,0x4(%eax) +//page_remove_pte - free an Page sturct which is related linear address la +// - and clean(invalidate) pte which is related linear address la +//note: PT is changed, so the TLB need to be invalidate +static inline void +page_remove_pte(pde_t *pgdir, uintptr_t la, pte_t *ptep) { +c010582c: 55 push %ebp +c010582d: 89 e5 mov %esp,%ebp +c010582f: 83 ec 28 sub $0x28,%esp + //(4) and free this page when page reference reachs 0 + //(5) clear second page table entry + //(6) flush tlb + } +#endif + if (*ptep & PTE_P) { +c0105832: 8b 45 10 mov 0x10(%ebp),%eax +c0105835: 8b 00 mov (%eax),%eax +c0105837: 83 e0 01 and $0x1,%eax +c010583a: 85 c0 test %eax,%eax +c010583c: 74 4d je c010588b + struct Page *page = pte2page(*ptep);// 找到对应的物理页 +c010583e: 8b 45 10 mov 0x10(%ebp),%eax +c0105841: 8b 00 mov (%eax),%eax +c0105843: 89 04 24 mov %eax,(%esp) +c0105846: e8 26 f5 ff ff call c0104d71 +c010584b: 89 45 f4 mov %eax,-0xc(%ebp) + // 减少物理页的引用计数,如果引用计数为零,释放该物理页 + if (page_ref_dec(page) == 0) { +c010584e: 8b 45 f4 mov -0xc(%ebp),%eax +c0105851: 89 04 24 mov %eax,(%esp) +c0105854: e8 a1 f5 ff ff call c0104dfa +c0105859: 85 c0 test %eax,%eax +c010585b: 75 13 jne c0105870 + free_page(page); +c010585d: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c0105864: 00 +c0105865: 8b 45 f4 mov -0xc(%ebp),%eax +c0105868: 89 04 24 mov %eax,(%esp) +c010586b: e8 d8 f7 ff ff call c0105048 + } + *ptep = 0;// 清除页表项 +c0105870: 8b 45 10 mov 0x10(%ebp),%eax +c0105873: c7 00 00 00 00 00 movl $0x0,(%eax) + tlb_invalidate(pgdir, la);// 刷新 TLB +c0105879: 8b 45 0c mov 0xc(%ebp),%eax +c010587c: 89 44 24 04 mov %eax,0x4(%esp) +c0105880: 8b 45 08 mov 0x8(%ebp),%eax +c0105883: 89 04 24 mov %eax,(%esp) +c0105886: e8 07 01 00 00 call c0105992 + } +} +c010588b: 90 nop +c010588c: 89 ec mov %ebp,%esp +c010588e: 5d pop %ebp +c010588f: c3 ret - if (cur + cur->units == b) { -c0106670: 8b 45 f4 mov -0xc(%ebp),%eax -c0106673: 8b 00 mov (%eax),%eax -c0106675: 8d 14 c5 00 00 00 00 lea 0x0(,%eax,8),%edx -c010667c: 8b 45 f4 mov -0xc(%ebp),%eax -c010667f: 01 d0 add %edx,%eax -c0106681: 39 45 f0 cmp %eax,-0x10(%ebp) -c0106684: 75 1f jne c01066a5 - cur->units += b->units; -c0106686: 8b 45 f4 mov -0xc(%ebp),%eax -c0106689: 8b 10 mov (%eax),%edx -c010668b: 8b 45 f0 mov -0x10(%ebp),%eax -c010668e: 8b 00 mov (%eax),%eax -c0106690: 01 c2 add %eax,%edx -c0106692: 8b 45 f4 mov -0xc(%ebp),%eax -c0106695: 89 10 mov %edx,(%eax) - cur->next = b->next; -c0106697: 8b 45 f0 mov -0x10(%ebp),%eax -c010669a: 8b 50 04 mov 0x4(%eax),%edx -c010669d: 8b 45 f4 mov -0xc(%ebp),%eax -c01066a0: 89 50 04 mov %edx,0x4(%eax) -c01066a3: eb 09 jmp c01066ae - } else - cur->next = b; -c01066a5: 8b 45 f4 mov -0xc(%ebp),%eax -c01066a8: 8b 55 f0 mov -0x10(%ebp),%edx -c01066ab: 89 50 04 mov %edx,0x4(%eax) +c0105890 : - slobfree = cur; -c01066ae: 8b 45 f4 mov -0xc(%ebp),%eax -c01066b1: a3 68 8a 12 c0 mov %eax,0xc0128a68 +//page_remove - free an Page which is related linear address la and has an validated pte +//移除一个虚拟地址对应的页面 +void +page_remove(pde_t *pgdir, uintptr_t la) { +c0105890: 55 push %ebp +c0105891: 89 e5 mov %esp,%ebp +c0105893: 83 ec 28 sub $0x28,%esp + //调用 get_pte 函数获取给定虚拟地址 la 对应的页表项指针 ptep。 + pte_t *ptep = get_pte(pgdir, la, 0); +c0105896: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c010589d: 00 +c010589e: 8b 45 0c mov 0xc(%ebp),%eax +c01058a1: 89 44 24 04 mov %eax,0x4(%esp) +c01058a5: 8b 45 08 mov 0x8(%ebp),%eax +c01058a8: 89 04 24 mov %eax,(%esp) +c01058ab: e8 e6 fd ff ff call c0105696 +c01058b0: 89 45 f4 mov %eax,-0xc(%ebp) + //如果 ptep 不为 NULL,则调用 page_remove_pte 函数移除该页表项。 + if (ptep != NULL) { +c01058b3: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c01058b7: 74 19 je c01058d2 + page_remove_pte(pgdir, la, ptep); +c01058b9: 8b 45 f4 mov -0xc(%ebp),%eax +c01058bc: 89 44 24 08 mov %eax,0x8(%esp) +c01058c0: 8b 45 0c mov 0xc(%ebp),%eax +c01058c3: 89 44 24 04 mov %eax,0x4(%esp) +c01058c7: 8b 45 08 mov 0x8(%ebp),%eax +c01058ca: 89 04 24 mov %eax,(%esp) +c01058cd: e8 5a ff ff ff call c010582c + } +} +c01058d2: 90 nop +c01058d3: 89 ec mov %ebp,%esp +c01058d5: 5d pop %ebp +c01058d6: c3 ret - spin_unlock_irqrestore(&slob_lock, flags); -c01066b6: 8b 45 ec mov -0x14(%ebp),%eax -c01066b9: 89 04 24 mov %eax,(%esp) -c01066bc: e8 7f fb ff ff call c0106240 <__intr_restore> -c01066c1: eb 01 jmp c01066c4 - return; -c01066c3: 90 nop +c01058d7 : +// perm: the permission of this Page which is setted in related pte +// return value: always 0 +//note: PT is changed, so the TLB need to be invalidate +//将一个页面插入到页表中。 +int +page_insert(pde_t *pgdir, struct Page *page, uintptr_t la, uint32_t perm) { +c01058d7: 55 push %ebp +c01058d8: 89 e5 mov %esp,%ebp +c01058da: 83 ec 28 sub $0x28,%esp + //通过 get_pte 函数获取指定虚拟地址 la 对应的页表项指针 ptep。 + pte_t *ptep = get_pte(pgdir, la, 1); +c01058dd: c7 44 24 08 01 00 00 movl $0x1,0x8(%esp) +c01058e4: 00 +c01058e5: 8b 45 10 mov 0x10(%ebp),%eax +c01058e8: 89 44 24 04 mov %eax,0x4(%esp) +c01058ec: 8b 45 08 mov 0x8(%ebp),%eax +c01058ef: 89 04 24 mov %eax,(%esp) +c01058f2: e8 9f fd ff ff call c0105696 +c01058f7: 89 45 f4 mov %eax,-0xc(%ebp) + //如果 ptep 为 NULL,表示内存分配失败,返回 -E_NO_MEM。 + if (ptep == NULL) { +c01058fa: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c01058fe: 75 0a jne c010590a + return -E_NO_MEM; +c0105900: b8 fc ff ff ff mov $0xfffffffc,%eax +c0105905: e9 84 00 00 00 jmp c010598e + } + //调用 page_ref_inc 增加页面的引用计数。 + page_ref_inc(page); +c010590a: 8b 45 0c mov 0xc(%ebp),%eax +c010590d: 89 04 24 mov %eax,(%esp) +c0105910: e8 ce f4 ff ff call c0104de3 + //如果页表项已存在且指向当前页面,则减少页面引用计数。 + if (*ptep & PTE_P) { +c0105915: 8b 45 f4 mov -0xc(%ebp),%eax +c0105918: 8b 00 mov (%eax),%eax +c010591a: 83 e0 01 and $0x1,%eax +c010591d: 85 c0 test %eax,%eax +c010591f: 74 3e je c010595f + struct Page *p = pte2page(*ptep); +c0105921: 8b 45 f4 mov -0xc(%ebp),%eax +c0105924: 8b 00 mov (%eax),%eax +c0105926: 89 04 24 mov %eax,(%esp) +c0105929: e8 43 f4 ff ff call c0104d71 +c010592e: 89 45 f0 mov %eax,-0x10(%ebp) + if (p == page) { +c0105931: 8b 45 f0 mov -0x10(%ebp),%eax +c0105934: 3b 45 0c cmp 0xc(%ebp),%eax +c0105937: 75 0d jne c0105946 + page_ref_dec(page); +c0105939: 8b 45 0c mov 0xc(%ebp),%eax +c010593c: 89 04 24 mov %eax,(%esp) +c010593f: e8 b6 f4 ff ff call c0104dfa +c0105944: eb 19 jmp c010595f + } + //如果页表项已存在但指向其他页面,则调用 page_remove_pte 移除旧的页表项。 + else { + page_remove_pte(pgdir, la, ptep); +c0105946: 8b 45 f4 mov -0xc(%ebp),%eax +c0105949: 89 44 24 08 mov %eax,0x8(%esp) +c010594d: 8b 45 10 mov 0x10(%ebp),%eax +c0105950: 89 44 24 04 mov %eax,0x4(%esp) +c0105954: 8b 45 08 mov 0x8(%ebp),%eax +c0105957: 89 04 24 mov %eax,(%esp) +c010595a: e8 cd fe ff ff call c010582c + } + } + *ptep = page2pa(page) | PTE_P | perm; +c010595f: 8b 45 0c mov 0xc(%ebp),%eax +c0105962: 89 04 24 mov %eax,(%esp) +c0105965: e8 51 f3 ff ff call c0104cbb +c010596a: 0b 45 14 or 0x14(%ebp),%eax +c010596d: 83 c8 01 or $0x1,%eax +c0105970: 89 c2 mov %eax,%edx +c0105972: 8b 45 f4 mov -0xc(%ebp),%eax +c0105975: 89 10 mov %edx,(%eax) + tlb_invalidate(pgdir, la);//刷新 TLB +c0105977: 8b 45 10 mov 0x10(%ebp),%eax +c010597a: 89 44 24 04 mov %eax,0x4(%esp) +c010597e: 8b 45 08 mov 0x8(%ebp),%eax +c0105981: 89 04 24 mov %eax,(%esp) +c0105984: e8 09 00 00 00 call c0105992 + return 0; +c0105989: b8 00 00 00 00 mov $0x0,%eax } -c01066c4: c9 leave -c01066c5: c3 ret - -c01066c6 : - +c010598e: 89 ec mov %ebp,%esp +c0105990: 5d pop %ebp +c0105991: c3 ret +c0105992 : +// invalidate a TLB entry, but only if the page tables being +// edited are the ones currently in use by the processor. +//无效化指定地址的TLB条目 void -slob_init(void) { -c01066c6: f3 0f 1e fb endbr32 -c01066ca: 55 push %ebp -c01066cb: 89 e5 mov %esp,%ebp -c01066cd: 83 ec 18 sub $0x18,%esp - cprintf("use SLOB allocator\n"); -c01066d0: c7 04 24 46 b9 10 c0 movl $0xc010b946,(%esp) -c01066d7: e8 fb 9b ff ff call c01002d7 +tlb_invalidate(pde_t *pgdir, uintptr_t la) { +c0105992: 55 push %ebp +c0105993: 89 e5 mov %esp,%ebp +c0105995: 83 ec 28 sub $0x28,%esp } -c01066dc: 90 nop -c01066dd: c9 leave -c01066de: c3 ret - -c01066df : -inline void -kmalloc_init(void) { -c01066df: f3 0f 1e fb endbr32 -c01066e3: 55 push %ebp -c01066e4: 89 e5 mov %esp,%ebp -c01066e6: 83 ec 18 sub $0x18,%esp - slob_init(); -c01066e9: e8 d8 ff ff ff call c01066c6 - cprintf("kmalloc_init() succeeded!\n"); -c01066ee: c7 04 24 5a b9 10 c0 movl $0xc010b95a,(%esp) -c01066f5: e8 dd 9b ff ff call c01002d7 +static inline uintptr_t +rcr3(void) { + uintptr_t cr3; + asm volatile ("mov %%cr3, %0" : "=r" (cr3) :: "memory"); +c0105998: 0f 20 d8 mov %cr3,%eax +c010599b: 89 45 f0 mov %eax,-0x10(%ebp) + return cr3; +c010599e: 8b 55 f0 mov -0x10(%ebp),%edx + //检查当前页目录地址是否与传入的页目录地址相同。 + if (rcr3() == PADDR(pgdir)) { +c01059a1: 8b 45 08 mov 0x8(%ebp),%eax +c01059a4: 89 45 f4 mov %eax,-0xc(%ebp) +c01059a7: 81 7d f4 ff ff ff bf cmpl $0xbfffffff,-0xc(%ebp) +c01059ae: 77 23 ja c01059d3 +c01059b0: 8b 45 f4 mov -0xc(%ebp),%eax +c01059b3: 89 44 24 0c mov %eax,0xc(%esp) +c01059b7: c7 44 24 08 e0 ae 10 movl $0xc010aee0,0x8(%esp) +c01059be: c0 +c01059bf: c7 44 24 04 56 02 00 movl $0x256,0x4(%esp) +c01059c6: 00 +c01059c7: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c01059ce: e8 72 b2 ff ff call c0100c45 <__panic> +c01059d3: 8b 45 f4 mov -0xc(%ebp),%eax +c01059d6: 05 00 00 00 40 add $0x40000000,%eax +c01059db: 39 d0 cmp %edx,%eax +c01059dd: 75 0d jne c01059ec + //如果相同,则调用 invlpg 函数无效化指定线性地址的TLB条目。 + invlpg((void *)la); +c01059df: 8b 45 0c mov 0xc(%ebp),%eax +c01059e2: 89 45 ec mov %eax,-0x14(%ebp) } -c01066fa: 90 nop -c01066fb: c9 leave -c01066fc: c3 ret -c01066fd : - -size_t -slob_allocated(void) { -c01066fd: f3 0f 1e fb endbr32 -c0106701: 55 push %ebp -c0106702: 89 e5 mov %esp,%ebp - return 0; -c0106704: b8 00 00 00 00 mov $0x0,%eax +static inline void +invlpg(void *addr) { + asm volatile ("invlpg (%0)" :: "r" (addr) : "memory"); +c01059e5: 8b 45 ec mov -0x14(%ebp),%eax +c01059e8: 0f 01 38 invlpg (%eax) } -c0106709: 5d pop %ebp -c010670a: c3 ret - -c010670b : - -size_t -kallocated(void) { -c010670b: f3 0f 1e fb endbr32 -c010670f: 55 push %ebp -c0106710: 89 e5 mov %esp,%ebp - return slob_allocated(); -c0106712: e8 e6 ff ff ff call c01066fd +c01059eb: 90 nop + } } -c0106717: 5d pop %ebp -c0106718: c3 ret +c01059ec: 90 nop +c01059ed: 89 ec mov %ebp,%esp +c01059ef: 5d pop %ebp +c01059f0: c3 ret + +c01059f1 : +// pgdir_alloc_page - call alloc_page & page_insert functions to +// - allocate a page size memory & setup an addr map +// - pa<->la with linear address la and the PDT pgdir +//参数包括页目录指针 pgdir、线性地址 la 和权限 perm。 +struct Page * +pgdir_alloc_page(pde_t *pgdir, uintptr_t la, uint32_t perm) { +c01059f1: 55 push %ebp +c01059f2: 89 e5 mov %esp,%ebp +c01059f4: 83 ec 28 sub $0x28,%esp + struct Page *page = alloc_page();//分配一个新的页面存储在 page 指针中 +c01059f7: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c01059fe: e8 d8 f5 ff ff call c0104fdb +c0105a03: 89 45 f4 mov %eax,-0xc(%ebp) + if (page != NULL) {//检查 page 是否不为 NULL,即分配是否成功。 +c0105a06: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0105a0a: 0f 84 a7 00 00 00 je c0105ab7 + if (page_insert(pgdir, page, la, perm) != 0) {//将页面插入到指定的线性地址 la 处。 +c0105a10: 8b 45 10 mov 0x10(%ebp),%eax +c0105a13: 89 44 24 0c mov %eax,0xc(%esp) +c0105a17: 8b 45 0c mov 0xc(%ebp),%eax +c0105a1a: 89 44 24 08 mov %eax,0x8(%esp) +c0105a1e: 8b 45 f4 mov -0xc(%ebp),%eax +c0105a21: 89 44 24 04 mov %eax,0x4(%esp) +c0105a25: 8b 45 08 mov 0x8(%ebp),%eax +c0105a28: 89 04 24 mov %eax,(%esp) +c0105a2b: e8 a7 fe ff ff call c01058d7 +c0105a30: 85 c0 test %eax,%eax +c0105a32: 74 1a je c0105a4e + free_page(page);//释放分配的页面。 +c0105a34: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c0105a3b: 00 +c0105a3c: 8b 45 f4 mov -0xc(%ebp),%eax +c0105a3f: 89 04 24 mov %eax,(%esp) +c0105a42: e8 01 f6 ff ff call c0105048 + return NULL;//返回 NULL,表示页面插入失败。 +c0105a47: b8 00 00 00 00 mov $0x0,%eax +c0105a4c: eb 6c jmp c0105aba + } + if (swap_init_ok){//检查交换区是否已初始化成功 +c0105a4e: a1 a4 c0 12 c0 mov 0xc012c0a4,%eax +c0105a53: 85 c0 test %eax,%eax +c0105a55: 74 60 je c0105ab7 + //将页面映射到交换区。 + swap_map_swappable(check_mm_struct, la, page, 0); +c0105a57: a1 6c c1 12 c0 mov 0xc012c16c,%eax +c0105a5c: c7 44 24 0c 00 00 00 movl $0x0,0xc(%esp) +c0105a63: 00 +c0105a64: 8b 55 f4 mov -0xc(%ebp),%edx +c0105a67: 89 54 24 08 mov %edx,0x8(%esp) +c0105a6b: 8b 55 0c mov 0xc(%ebp),%edx +c0105a6e: 89 54 24 04 mov %edx,0x4(%esp) +c0105a72: 89 04 24 mov %eax,(%esp) +c0105a75: e8 3a 0e 00 00 call c01068b4 + //设置页面的虚拟地址 pra_vaddr 为 la + page->pra_vaddr=la; +c0105a7a: 8b 45 f4 mov -0xc(%ebp),%eax +c0105a7d: 8b 55 0c mov 0xc(%ebp),%edx +c0105a80: 89 50 1c mov %edx,0x1c(%eax) + //断言页面的引用计数为1,确保页面没有被其他地方引用。 + assert(page_ref(page) == 1); +c0105a83: 8b 45 f4 mov -0xc(%ebp),%eax +c0105a86: 89 04 24 mov %eax,(%esp) +c0105a89: e8 3d f3 ff ff call c0104dcb +c0105a8e: 83 f8 01 cmp $0x1,%eax +c0105a91: 74 24 je c0105ab7 +c0105a93: c7 44 24 0c 64 af 10 movl $0xc010af64,0xc(%esp) +c0105a9a: c0 +c0105a9b: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105aa2: c0 +c0105aa3: c7 44 24 04 6e 02 00 movl $0x26e,0x4(%esp) +c0105aaa: 00 +c0105aab: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105ab2: e8 8e b1 ff ff call c0100c45 <__panic> + //cprintf("get No. %d page: pra_vaddr %x, pra_link.prev %x, pra_link_next %x in pgdir_alloc_page\n", (page-pages), page->pra_vaddr,page->pra_page_link.prev, page->pra_page_link.next); + } -c0106719 : + } -static int find_order(int size) -{ -c0106719: f3 0f 1e fb endbr32 -c010671d: 55 push %ebp -c010671e: 89 e5 mov %esp,%ebp -c0106720: 83 ec 10 sub $0x10,%esp - int order = 0; -c0106723: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) - for ( ; size > 4096 ; size >>=1) -c010672a: eb 06 jmp c0106732 - order++; -c010672c: ff 45 fc incl -0x4(%ebp) - for ( ; size > 4096 ; size >>=1) -c010672f: d1 7d 08 sarl 0x8(%ebp) -c0106732: 81 7d 08 00 10 00 00 cmpl $0x1000,0x8(%ebp) -c0106739: 7f f1 jg c010672c - return order; -c010673b: 8b 45 fc mov -0x4(%ebp),%eax + return page; +c0105ab7: 8b 45 f4 mov -0xc(%ebp),%eax } -c010673e: c9 leave -c010673f: c3 ret +c0105aba: 89 ec mov %ebp,%esp +c0105abc: 5d pop %ebp +c0105abd: c3 ret -c0106740 <__kmalloc>: - -static void *__kmalloc(size_t size, gfp_t gfp) -{ -c0106740: f3 0f 1e fb endbr32 -c0106744: 55 push %ebp -c0106745: 89 e5 mov %esp,%ebp -c0106747: 83 ec 28 sub $0x28,%esp - slob_t *m; - bigblock_t *bb; - unsigned long flags; +c0105abe : - if (size < PAGE_SIZE - SLOB_UNIT) { -c010674a: 81 7d 08 f7 0f 00 00 cmpl $0xff7,0x8(%ebp) -c0106751: 77 3b ja c010678e <__kmalloc+0x4e> - m = slob_alloc(size + SLOB_UNIT, gfp, 0); -c0106753: 8b 45 08 mov 0x8(%ebp),%eax -c0106756: 8d 50 08 lea 0x8(%eax),%edx -c0106759: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c0106760: 00 -c0106761: 8b 45 0c mov 0xc(%ebp),%eax -c0106764: 89 44 24 04 mov %eax,0x4(%esp) -c0106768: 89 14 24 mov %edx,(%esp) -c010676b: e8 63 fc ff ff call c01063d3 -c0106770: 89 45 ec mov %eax,-0x14(%ebp) - return m ? (void *)(m + 1) : 0; -c0106773: 83 7d ec 00 cmpl $0x0,-0x14(%ebp) -c0106777: 74 0b je c0106784 <__kmalloc+0x44> -c0106779: 8b 45 ec mov -0x14(%ebp),%eax -c010677c: 83 c0 08 add $0x8,%eax -c010677f: e9 b0 00 00 00 jmp c0106834 <__kmalloc+0xf4> -c0106784: b8 00 00 00 00 mov $0x0,%eax -c0106789: e9 a6 00 00 00 jmp c0106834 <__kmalloc+0xf4> - } +static void +check_alloc_page(void) { +c0105abe: 55 push %ebp +c0105abf: 89 e5 mov %esp,%ebp +c0105ac1: 83 ec 18 sub $0x18,%esp + //调用内存管理器的 check 方法,用于检查内存分配是否正常。 + pmm_manager->check(); +c0105ac4: a1 0c c0 12 c0 mov 0xc012c00c,%eax +c0105ac9: 8b 40 18 mov 0x18(%eax),%eax +c0105acc: ff d0 call *%eax + cprintf("check_alloc_page() succeeded!\n"); +c0105ace: c7 04 24 78 af 10 c0 movl $0xc010af78,(%esp) +c0105ad5: e8 9e a8 ff ff call c0100378 +} +c0105ada: 90 nop +c0105adb: 89 ec mov %ebp,%esp +c0105add: 5d pop %ebp +c0105ade: c3 ret - bb = slob_alloc(sizeof(bigblock_t), gfp, 0); -c010678e: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c0106795: 00 -c0106796: 8b 45 0c mov 0xc(%ebp),%eax -c0106799: 89 44 24 04 mov %eax,0x4(%esp) -c010679d: c7 04 24 0c 00 00 00 movl $0xc,(%esp) -c01067a4: e8 2a fc ff ff call c01063d3 -c01067a9: 89 45 f4 mov %eax,-0xc(%ebp) - if (!bb) -c01067ac: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c01067b0: 75 07 jne c01067b9 <__kmalloc+0x79> - return 0; -c01067b2: b8 00 00 00 00 mov $0x0,%eax -c01067b7: eb 7b jmp c0106834 <__kmalloc+0xf4> +c0105adf : - bb->order = find_order(size); -c01067b9: 8b 45 08 mov 0x8(%ebp),%eax -c01067bc: 89 04 24 mov %eax,(%esp) -c01067bf: e8 55 ff ff ff call c0106719 -c01067c4: 8b 55 f4 mov -0xc(%ebp),%edx -c01067c7: 89 02 mov %eax,(%edx) - bb->pages = (void *)__slob_get_free_pages(gfp, bb->order); -c01067c9: 8b 45 f4 mov -0xc(%ebp),%eax -c01067cc: 8b 00 mov (%eax),%eax -c01067ce: 89 44 24 04 mov %eax,0x4(%esp) -c01067d2: 8b 45 0c mov 0xc(%ebp),%eax -c01067d5: 89 04 24 mov %eax,(%esp) -c01067d8: e8 84 fb ff ff call c0106361 <__slob_get_free_pages> -c01067dd: 8b 55 f4 mov -0xc(%ebp),%edx -c01067e0: 89 42 04 mov %eax,0x4(%edx) +//用于验证页目录和页表的正确性。 +static void +check_pgdir(void) { +c0105adf: 55 push %ebp +c0105ae0: 89 e5 mov %esp,%ebp +c0105ae2: 83 ec 38 sub $0x38,%esp + //确保内存页面数量在合理范围内 + assert(npage <= KMEMSIZE / PGSIZE); +c0105ae5: a1 04 c0 12 c0 mov 0xc012c004,%eax +c0105aea: 3d 00 80 03 00 cmp $0x38000,%eax +c0105aef: 76 24 jbe c0105b15 +c0105af1: c7 44 24 0c 97 af 10 movl $0xc010af97,0xc(%esp) +c0105af8: c0 +c0105af9: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105b00: c0 +c0105b01: c7 44 24 04 82 02 00 movl $0x282,0x4(%esp) +c0105b08: 00 +c0105b09: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105b10: e8 30 b1 ff ff call c0100c45 <__panic> + //确保页目录不为空且对齐, + assert(boot_pgdir != NULL && (uint32_t)PGOFF(boot_pgdir) == 0); +c0105b15: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0105b1a: 85 c0 test %eax,%eax +c0105b1c: 74 0e je c0105b2c +c0105b1e: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0105b23: 25 ff 0f 00 00 and $0xfff,%eax +c0105b28: 85 c0 test %eax,%eax +c0105b2a: 74 24 je c0105b50 +c0105b2c: c7 44 24 0c b4 af 10 movl $0xc010afb4,0xc(%esp) +c0105b33: c0 +c0105b34: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105b3b: c0 +c0105b3c: c7 44 24 04 84 02 00 movl $0x284,0x4(%esp) +c0105b43: 00 +c0105b44: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105b4b: e8 f5 b0 ff ff call c0100c45 <__panic> + //确保虚拟地址 0x0 没有映射任何页面 + assert(get_page(boot_pgdir, 0x0, NULL) == NULL); +c0105b50: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0105b55: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c0105b5c: 00 +c0105b5d: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c0105b64: 00 +c0105b65: 89 04 24 mov %eax,(%esp) +c0105b68: e8 64 fc ff ff call c01057d1 +c0105b6d: 85 c0 test %eax,%eax +c0105b6f: 74 24 je c0105b95 +c0105b71: c7 44 24 0c ec af 10 movl $0xc010afec,0xc(%esp) +c0105b78: c0 +c0105b79: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105b80: c0 +c0105b81: c7 44 24 04 86 02 00 movl $0x286,0x4(%esp) +c0105b88: 00 +c0105b89: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105b90: e8 b0 b0 ff ff call c0100c45 <__panic> + + //定义两个页面指针 p1 和 p2 + struct Page *p1, *p2; + //分配一个页面 p1 + p1 = alloc_page(); +c0105b95: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c0105b9c: e8 3a f4 ff ff call c0104fdb +c0105ba1: 89 45 f4 mov %eax,-0xc(%ebp) + //将 p1 插入到虚拟地址 0x0 + assert(page_insert(boot_pgdir, p1, 0x0, 0) == 0); +c0105ba4: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0105ba9: c7 44 24 0c 00 00 00 movl $0x0,0xc(%esp) +c0105bb0: 00 +c0105bb1: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c0105bb8: 00 +c0105bb9: 8b 55 f4 mov -0xc(%ebp),%edx +c0105bbc: 89 54 24 04 mov %edx,0x4(%esp) +c0105bc0: 89 04 24 mov %eax,(%esp) +c0105bc3: e8 0f fd ff ff call c01058d7 +c0105bc8: 85 c0 test %eax,%eax +c0105bca: 74 24 je c0105bf0 +c0105bcc: c7 44 24 0c 14 b0 10 movl $0xc010b014,0xc(%esp) +c0105bd3: c0 +c0105bd4: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105bdb: c0 +c0105bdc: c7 44 24 04 8d 02 00 movl $0x28d,0x4(%esp) +c0105be3: 00 +c0105be4: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105beb: e8 55 b0 ff ff call c0100c45 <__panic> - if (bb->pages) { -c01067e3: 8b 45 f4 mov -0xc(%ebp),%eax -c01067e6: 8b 40 04 mov 0x4(%eax),%eax -c01067e9: 85 c0 test %eax,%eax -c01067eb: 74 2f je c010681c <__kmalloc+0xdc> - spin_lock_irqsave(&block_lock, flags); -c01067ed: e8 24 fa ff ff call c0106216 <__intr_save> -c01067f2: 89 45 f0 mov %eax,-0x10(%ebp) - bb->next = bigblocks; -c01067f5: 8b 15 10 c0 12 c0 mov 0xc012c010,%edx -c01067fb: 8b 45 f4 mov -0xc(%ebp),%eax -c01067fe: 89 50 08 mov %edx,0x8(%eax) - bigblocks = bb; -c0106801: 8b 45 f4 mov -0xc(%ebp),%eax -c0106804: a3 10 c0 12 c0 mov %eax,0xc012c010 - spin_unlock_irqrestore(&block_lock, flags); -c0106809: 8b 45 f0 mov -0x10(%ebp),%eax -c010680c: 89 04 24 mov %eax,(%esp) -c010680f: e8 2c fa ff ff call c0106240 <__intr_restore> - return bb->pages; -c0106814: 8b 45 f4 mov -0xc(%ebp),%eax -c0106817: 8b 40 04 mov 0x4(%eax),%eax -c010681a: eb 18 jmp c0106834 <__kmalloc+0xf4> - } + // 获取虚拟地址 0x0 对应的页表项指针 + pte_t *ptep; + assert((ptep = get_pte(boot_pgdir, 0x0, 0)) != NULL); +c0105bf0: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0105bf5: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c0105bfc: 00 +c0105bfd: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c0105c04: 00 +c0105c05: 89 04 24 mov %eax,(%esp) +c0105c08: e8 89 fa ff ff call c0105696 +c0105c0d: 89 45 f0 mov %eax,-0x10(%ebp) +c0105c10: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) +c0105c14: 75 24 jne c0105c3a +c0105c16: c7 44 24 0c 40 b0 10 movl $0xc010b040,0xc(%esp) +c0105c1d: c0 +c0105c1e: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105c25: c0 +c0105c26: c7 44 24 04 91 02 00 movl $0x291,0x4(%esp) +c0105c2d: 00 +c0105c2e: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105c35: e8 0b b0 ff ff call c0100c45 <__panic> + // 验证页表项对应的页面是 p1 + assert(pte2page(*ptep) == p1); +c0105c3a: 8b 45 f0 mov -0x10(%ebp),%eax +c0105c3d: 8b 00 mov (%eax),%eax +c0105c3f: 89 04 24 mov %eax,(%esp) +c0105c42: e8 2a f1 ff ff call c0104d71 +c0105c47: 39 45 f4 cmp %eax,-0xc(%ebp) +c0105c4a: 74 24 je c0105c70 +c0105c4c: c7 44 24 0c 6d b0 10 movl $0xc010b06d,0xc(%esp) +c0105c53: c0 +c0105c54: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105c5b: c0 +c0105c5c: c7 44 24 04 93 02 00 movl $0x293,0x4(%esp) +c0105c63: 00 +c0105c64: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105c6b: e8 d5 af ff ff call c0100c45 <__panic> + // 验证 p1 的引用计数为 1 + assert(page_ref(p1) == 1); +c0105c70: 8b 45 f4 mov -0xc(%ebp),%eax +c0105c73: 89 04 24 mov %eax,(%esp) +c0105c76: e8 50 f1 ff ff call c0104dcb +c0105c7b: 83 f8 01 cmp $0x1,%eax +c0105c7e: 74 24 je c0105ca4 +c0105c80: c7 44 24 0c 83 b0 10 movl $0xc010b083,0xc(%esp) +c0105c87: c0 +c0105c88: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105c8f: c0 +c0105c90: c7 44 24 04 95 02 00 movl $0x295,0x4(%esp) +c0105c97: 00 +c0105c98: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105c9f: e8 a1 af ff ff call c0100c45 <__panic> + // 获取虚拟地址 PGSIZE 对应的页表项指针 + ptep = &((pte_t *)KADDR(PDE_ADDR(boot_pgdir[0])))[1]; +c0105ca4: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0105ca9: 8b 00 mov (%eax),%eax +c0105cab: 25 00 f0 ff ff and $0xfffff000,%eax +c0105cb0: 89 45 ec mov %eax,-0x14(%ebp) +c0105cb3: 8b 45 ec mov -0x14(%ebp),%eax +c0105cb6: c1 e8 0c shr $0xc,%eax +c0105cb9: 89 45 e8 mov %eax,-0x18(%ebp) +c0105cbc: a1 04 c0 12 c0 mov 0xc012c004,%eax +c0105cc1: 39 45 e8 cmp %eax,-0x18(%ebp) +c0105cc4: 72 23 jb c0105ce9 +c0105cc6: 8b 45 ec mov -0x14(%ebp),%eax +c0105cc9: 89 44 24 0c mov %eax,0xc(%esp) +c0105ccd: c7 44 24 08 3c ae 10 movl $0xc010ae3c,0x8(%esp) +c0105cd4: c0 +c0105cd5: c7 44 24 04 97 02 00 movl $0x297,0x4(%esp) +c0105cdc: 00 +c0105cdd: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105ce4: e8 5c af ff ff call c0100c45 <__panic> +c0105ce9: 8b 45 ec mov -0x14(%ebp),%eax +c0105cec: 2d 00 00 00 40 sub $0x40000000,%eax +c0105cf1: 83 c0 04 add $0x4,%eax +c0105cf4: 89 45 f0 mov %eax,-0x10(%ebp) + assert(get_pte(boot_pgdir, PGSIZE, 0) == ptep); +c0105cf7: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0105cfc: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c0105d03: 00 +c0105d04: c7 44 24 04 00 10 00 movl $0x1000,0x4(%esp) +c0105d0b: 00 +c0105d0c: 89 04 24 mov %eax,(%esp) +c0105d0f: e8 82 f9 ff ff call c0105696 +c0105d14: 39 45 f0 cmp %eax,-0x10(%ebp) +c0105d17: 74 24 je c0105d3d +c0105d19: c7 44 24 0c 98 b0 10 movl $0xc010b098,0xc(%esp) +c0105d20: c0 +c0105d21: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105d28: c0 +c0105d29: c7 44 24 04 98 02 00 movl $0x298,0x4(%esp) +c0105d30: 00 +c0105d31: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105d38: e8 08 af ff ff call c0100c45 <__panic> + // 分配一个页面 p2 + p2 = alloc_page(); +c0105d3d: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c0105d44: e8 92 f2 ff ff call c0104fdb +c0105d49: 89 45 e4 mov %eax,-0x1c(%ebp) + // 将 p2 插入到虚拟地址 PGSIZE,并设置用户和写权限 + assert(page_insert(boot_pgdir, p2, PGSIZE, PTE_U | PTE_W) == 0); +c0105d4c: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0105d51: c7 44 24 0c 06 00 00 movl $0x6,0xc(%esp) +c0105d58: 00 +c0105d59: c7 44 24 08 00 10 00 movl $0x1000,0x8(%esp) +c0105d60: 00 +c0105d61: 8b 55 e4 mov -0x1c(%ebp),%edx +c0105d64: 89 54 24 04 mov %edx,0x4(%esp) +c0105d68: 89 04 24 mov %eax,(%esp) +c0105d6b: e8 67 fb ff ff call c01058d7 +c0105d70: 85 c0 test %eax,%eax +c0105d72: 74 24 je c0105d98 +c0105d74: c7 44 24 0c c0 b0 10 movl $0xc010b0c0,0xc(%esp) +c0105d7b: c0 +c0105d7c: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105d83: c0 +c0105d84: c7 44 24 04 9c 02 00 movl $0x29c,0x4(%esp) +c0105d8b: 00 +c0105d8c: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105d93: e8 ad ae ff ff call c0100c45 <__panic> + // 获取虚拟地址 PGSIZE 对应的页表项指针 + assert((ptep = get_pte(boot_pgdir, PGSIZE, 0)) != NULL); +c0105d98: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0105d9d: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c0105da4: 00 +c0105da5: c7 44 24 04 00 10 00 movl $0x1000,0x4(%esp) +c0105dac: 00 +c0105dad: 89 04 24 mov %eax,(%esp) +c0105db0: e8 e1 f8 ff ff call c0105696 +c0105db5: 89 45 f0 mov %eax,-0x10(%ebp) +c0105db8: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) +c0105dbc: 75 24 jne c0105de2 +c0105dbe: c7 44 24 0c f8 b0 10 movl $0xc010b0f8,0xc(%esp) +c0105dc5: c0 +c0105dc6: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105dcd: c0 +c0105dce: c7 44 24 04 9e 02 00 movl $0x29e,0x4(%esp) +c0105dd5: 00 +c0105dd6: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105ddd: e8 63 ae ff ff call c0100c45 <__panic> + // 验证页表项设置了用户权限 + assert(*ptep & PTE_U); +c0105de2: 8b 45 f0 mov -0x10(%ebp),%eax +c0105de5: 8b 00 mov (%eax),%eax +c0105de7: 83 e0 04 and $0x4,%eax +c0105dea: 85 c0 test %eax,%eax +c0105dec: 75 24 jne c0105e12 +c0105dee: c7 44 24 0c 28 b1 10 movl $0xc010b128,0xc(%esp) +c0105df5: c0 +c0105df6: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105dfd: c0 +c0105dfe: c7 44 24 04 a0 02 00 movl $0x2a0,0x4(%esp) +c0105e05: 00 +c0105e06: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105e0d: e8 33 ae ff ff call c0100c45 <__panic> + // 验证页表项设置了写权限 + assert(*ptep & PTE_W); +c0105e12: 8b 45 f0 mov -0x10(%ebp),%eax +c0105e15: 8b 00 mov (%eax),%eax +c0105e17: 83 e0 02 and $0x2,%eax +c0105e1a: 85 c0 test %eax,%eax +c0105e1c: 75 24 jne c0105e42 +c0105e1e: c7 44 24 0c 36 b1 10 movl $0xc010b136,0xc(%esp) +c0105e25: c0 +c0105e26: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105e2d: c0 +c0105e2e: c7 44 24 04 a2 02 00 movl $0x2a2,0x4(%esp) +c0105e35: 00 +c0105e36: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105e3d: e8 03 ae ff ff call c0100c45 <__panic> + // 验证页目录项设置了用户权限 + assert(boot_pgdir[0] & PTE_U); +c0105e42: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0105e47: 8b 00 mov (%eax),%eax +c0105e49: 83 e0 04 and $0x4,%eax +c0105e4c: 85 c0 test %eax,%eax +c0105e4e: 75 24 jne c0105e74 +c0105e50: c7 44 24 0c 44 b1 10 movl $0xc010b144,0xc(%esp) +c0105e57: c0 +c0105e58: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105e5f: c0 +c0105e60: c7 44 24 04 a4 02 00 movl $0x2a4,0x4(%esp) +c0105e67: 00 +c0105e68: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105e6f: e8 d1 ad ff ff call c0100c45 <__panic> + // 验证 p2 的引用计数为 1 + assert(page_ref(p2) == 1); +c0105e74: 8b 45 e4 mov -0x1c(%ebp),%eax +c0105e77: 89 04 24 mov %eax,(%esp) +c0105e7a: e8 4c ef ff ff call c0104dcb +c0105e7f: 83 f8 01 cmp $0x1,%eax +c0105e82: 74 24 je c0105ea8 +c0105e84: c7 44 24 0c 5a b1 10 movl $0xc010b15a,0xc(%esp) +c0105e8b: c0 +c0105e8c: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105e93: c0 +c0105e94: c7 44 24 04 a6 02 00 movl $0x2a6,0x4(%esp) +c0105e9b: 00 +c0105e9c: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105ea3: e8 9d ad ff ff call c0100c45 <__panic> - slob_free(bb, sizeof(bigblock_t)); -c010681c: c7 44 24 04 0c 00 00 movl $0xc,0x4(%esp) -c0106823: 00 -c0106824: 8b 45 f4 mov -0xc(%ebp),%eax -c0106827: 89 04 24 mov %eax,(%esp) -c010682a: e8 79 fd ff ff call c01065a8 - return 0; -c010682f: b8 00 00 00 00 mov $0x0,%eax -} -c0106834: c9 leave -c0106835: c3 ret + // 将 p1 插入到虚拟地址 PGSIZE,替换掉 p2 + assert(page_insert(boot_pgdir, p1, PGSIZE, 0) == 0); +c0105ea8: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0105ead: c7 44 24 0c 00 00 00 movl $0x0,0xc(%esp) +c0105eb4: 00 +c0105eb5: c7 44 24 08 00 10 00 movl $0x1000,0x8(%esp) +c0105ebc: 00 +c0105ebd: 8b 55 f4 mov -0xc(%ebp),%edx +c0105ec0: 89 54 24 04 mov %edx,0x4(%esp) +c0105ec4: 89 04 24 mov %eax,(%esp) +c0105ec7: e8 0b fa ff ff call c01058d7 +c0105ecc: 85 c0 test %eax,%eax +c0105ece: 74 24 je c0105ef4 +c0105ed0: c7 44 24 0c 6c b1 10 movl $0xc010b16c,0xc(%esp) +c0105ed7: c0 +c0105ed8: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105edf: c0 +c0105ee0: c7 44 24 04 a9 02 00 movl $0x2a9,0x4(%esp) +c0105ee7: 00 +c0105ee8: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105eef: e8 51 ad ff ff call c0100c45 <__panic> + // 验证 p1 的引用计数增加到 2 + assert(page_ref(p1) == 2); +c0105ef4: 8b 45 f4 mov -0xc(%ebp),%eax +c0105ef7: 89 04 24 mov %eax,(%esp) +c0105efa: e8 cc ee ff ff call c0104dcb +c0105eff: 83 f8 02 cmp $0x2,%eax +c0105f02: 74 24 je c0105f28 +c0105f04: c7 44 24 0c 98 b1 10 movl $0xc010b198,0xc(%esp) +c0105f0b: c0 +c0105f0c: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105f13: c0 +c0105f14: c7 44 24 04 ab 02 00 movl $0x2ab,0x4(%esp) +c0105f1b: 00 +c0105f1c: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105f23: e8 1d ad ff ff call c0100c45 <__panic> + // 验证 p2 的引用计数减少到 0 + assert(page_ref(p2) == 0); +c0105f28: 8b 45 e4 mov -0x1c(%ebp),%eax +c0105f2b: 89 04 24 mov %eax,(%esp) +c0105f2e: e8 98 ee ff ff call c0104dcb +c0105f33: 85 c0 test %eax,%eax +c0105f35: 74 24 je c0105f5b +c0105f37: c7 44 24 0c aa b1 10 movl $0xc010b1aa,0xc(%esp) +c0105f3e: c0 +c0105f3f: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105f46: c0 +c0105f47: c7 44 24 04 ad 02 00 movl $0x2ad,0x4(%esp) +c0105f4e: 00 +c0105f4f: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105f56: e8 ea ac ff ff call c0100c45 <__panic> + // 获取虚拟地址 PGSIZE 对应的页表项指针 + assert((ptep = get_pte(boot_pgdir, PGSIZE, 0)) != NULL); +c0105f5b: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0105f60: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c0105f67: 00 +c0105f68: c7 44 24 04 00 10 00 movl $0x1000,0x4(%esp) +c0105f6f: 00 +c0105f70: 89 04 24 mov %eax,(%esp) +c0105f73: e8 1e f7 ff ff call c0105696 +c0105f78: 89 45 f0 mov %eax,-0x10(%ebp) +c0105f7b: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) +c0105f7f: 75 24 jne c0105fa5 +c0105f81: c7 44 24 0c f8 b0 10 movl $0xc010b0f8,0xc(%esp) +c0105f88: c0 +c0105f89: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105f90: c0 +c0105f91: c7 44 24 04 af 02 00 movl $0x2af,0x4(%esp) +c0105f98: 00 +c0105f99: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105fa0: e8 a0 ac ff ff call c0100c45 <__panic> + // 验证页表项对应的页面是 p1 + assert(pte2page(*ptep) == p1); +c0105fa5: 8b 45 f0 mov -0x10(%ebp),%eax +c0105fa8: 8b 00 mov (%eax),%eax +c0105faa: 89 04 24 mov %eax,(%esp) +c0105fad: e8 bf ed ff ff call c0104d71 +c0105fb2: 39 45 f4 cmp %eax,-0xc(%ebp) +c0105fb5: 74 24 je c0105fdb +c0105fb7: c7 44 24 0c 6d b0 10 movl $0xc010b06d,0xc(%esp) +c0105fbe: c0 +c0105fbf: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105fc6: c0 +c0105fc7: c7 44 24 04 b1 02 00 movl $0x2b1,0x4(%esp) +c0105fce: 00 +c0105fcf: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0105fd6: e8 6a ac ff ff call c0100c45 <__panic> + // 验证页表项没有设置用户权限 + assert((*ptep & PTE_U) == 0); +c0105fdb: 8b 45 f0 mov -0x10(%ebp),%eax +c0105fde: 8b 00 mov (%eax),%eax +c0105fe0: 83 e0 04 and $0x4,%eax +c0105fe3: 85 c0 test %eax,%eax +c0105fe5: 74 24 je c010600b +c0105fe7: c7 44 24 0c bc b1 10 movl $0xc010b1bc,0xc(%esp) +c0105fee: c0 +c0105fef: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0105ff6: c0 +c0105ff7: c7 44 24 04 b3 02 00 movl $0x2b3,0x4(%esp) +c0105ffe: 00 +c0105fff: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0106006: e8 3a ac ff ff call c0100c45 <__panic> + + //移除虚拟地址 0x0 的映射, + page_remove(boot_pgdir, 0x0); +c010600b: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0106010: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c0106017: 00 +c0106018: 89 04 24 mov %eax,(%esp) +c010601b: e8 70 f8 ff ff call c0105890 + //验证 p1 的引用计数减少到 1。 + assert(page_ref(p1) == 1); +c0106020: 8b 45 f4 mov -0xc(%ebp),%eax +c0106023: 89 04 24 mov %eax,(%esp) +c0106026: e8 a0 ed ff ff call c0104dcb +c010602b: 83 f8 01 cmp $0x1,%eax +c010602e: 74 24 je c0106054 +c0106030: c7 44 24 0c 83 b0 10 movl $0xc010b083,0xc(%esp) +c0106037: c0 +c0106038: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c010603f: c0 +c0106040: c7 44 24 04 b8 02 00 movl $0x2b8,0x4(%esp) +c0106047: 00 +c0106048: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c010604f: e8 f1 ab ff ff call c0100c45 <__panic> + //验证 p2 的引用计数减少到 0 + assert(page_ref(p2) == 0); +c0106054: 8b 45 e4 mov -0x1c(%ebp),%eax +c0106057: 89 04 24 mov %eax,(%esp) +c010605a: e8 6c ed ff ff call c0104dcb +c010605f: 85 c0 test %eax,%eax +c0106061: 74 24 je c0106087 +c0106063: c7 44 24 0c aa b1 10 movl $0xc010b1aa,0xc(%esp) +c010606a: c0 +c010606b: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0106072: c0 +c0106073: c7 44 24 04 ba 02 00 movl $0x2ba,0x4(%esp) +c010607a: 00 +c010607b: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0106082: e8 be ab ff ff call c0100c45 <__panic> -c0106836 : + //移除虚拟地址 PGSIZE 的映射, + page_remove(boot_pgdir, PGSIZE); +c0106087: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c010608c: c7 44 24 04 00 10 00 movl $0x1000,0x4(%esp) +c0106093: 00 +c0106094: 89 04 24 mov %eax,(%esp) +c0106097: e8 f4 f7 ff ff call c0105890 + //验证 p1 的引用计数减少到 0 + assert(page_ref(p1) == 0); +c010609c: 8b 45 f4 mov -0xc(%ebp),%eax +c010609f: 89 04 24 mov %eax,(%esp) +c01060a2: e8 24 ed ff ff call c0104dcb +c01060a7: 85 c0 test %eax,%eax +c01060a9: 74 24 je c01060cf +c01060ab: c7 44 24 0c d1 b1 10 movl $0xc010b1d1,0xc(%esp) +c01060b2: c0 +c01060b3: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c01060ba: c0 +c01060bb: c7 44 24 04 bf 02 00 movl $0x2bf,0x4(%esp) +c01060c2: 00 +c01060c3: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c01060ca: e8 76 ab ff ff call c0100c45 <__panic> + //验证 p2 的引用计数减少到 0 + assert(page_ref(p2) == 0); +c01060cf: 8b 45 e4 mov -0x1c(%ebp),%eax +c01060d2: 89 04 24 mov %eax,(%esp) +c01060d5: e8 f1 ec ff ff call c0104dcb +c01060da: 85 c0 test %eax,%eax +c01060dc: 74 24 je c0106102 +c01060de: c7 44 24 0c aa b1 10 movl $0xc010b1aa,0xc(%esp) +c01060e5: c0 +c01060e6: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c01060ed: c0 +c01060ee: c7 44 24 04 c1 02 00 movl $0x2c1,0x4(%esp) +c01060f5: 00 +c01060f6: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c01060fd: e8 43 ab ff ff call c0100c45 <__panic> + + //验证页目录的第一页表的引用计数为 1。 + assert(page_ref(pde2page(boot_pgdir[0])) == 1); +c0106102: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0106107: 8b 00 mov (%eax),%eax +c0106109: 89 04 24 mov %eax,(%esp) +c010610c: e8 a0 ec ff ff call c0104db1 +c0106111: 89 04 24 mov %eax,(%esp) +c0106114: e8 b2 ec ff ff call c0104dcb +c0106119: 83 f8 01 cmp $0x1,%eax +c010611c: 74 24 je c0106142 +c010611e: c7 44 24 0c e4 b1 10 movl $0xc010b1e4,0xc(%esp) +c0106125: c0 +c0106126: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c010612d: c0 +c010612e: c7 44 24 04 c4 02 00 movl $0x2c4,0x4(%esp) +c0106135: 00 +c0106136: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c010613d: e8 03 ab ff ff call c0100c45 <__panic> + //释放页目录的第一页表 + free_page(pde2page(boot_pgdir[0])); +c0106142: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0106147: 8b 00 mov (%eax),%eax +c0106149: 89 04 24 mov %eax,(%esp) +c010614c: e8 60 ec ff ff call c0104db1 +c0106151: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c0106158: 00 +c0106159: 89 04 24 mov %eax,(%esp) +c010615c: e8 e7 ee ff ff call c0105048 + //清空页目录的第一页表 + boot_pgdir[0] = 0; +c0106161: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0106166: c7 00 00 00 00 00 movl $0x0,(%eax) -void * -kmalloc(size_t size) -{ -c0106836: f3 0f 1e fb endbr32 -c010683a: 55 push %ebp -c010683b: 89 e5 mov %esp,%ebp -c010683d: 83 ec 18 sub $0x18,%esp - return __kmalloc(size, 0); -c0106840: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c0106847: 00 -c0106848: 8b 45 08 mov 0x8(%ebp),%eax -c010684b: 89 04 24 mov %eax,(%esp) -c010684e: e8 ed fe ff ff call c0106740 <__kmalloc> + cprintf("check_pgdir() succeeded!\n"); +c010616c: c7 04 24 0b b2 10 c0 movl $0xc010b20b,(%esp) +c0106173: e8 00 a2 ff ff call c0100378 } -c0106853: c9 leave -c0106854: c3 ret - -c0106855 : +c0106178: 90 nop +c0106179: 89 ec mov %ebp,%esp +c010617b: 5d pop %ebp +c010617c: c3 ret +c010617d : -void kfree(void *block) -{ -c0106855: f3 0f 1e fb endbr32 -c0106859: 55 push %ebp -c010685a: 89 e5 mov %esp,%ebp -c010685c: 83 ec 28 sub $0x28,%esp - bigblock_t *bb, **last = &bigblocks; -c010685f: c7 45 f0 10 c0 12 c0 movl $0xc012c010,-0x10(%ebp) - unsigned long flags; - - if (!block) -c0106866: 83 7d 08 00 cmpl $0x0,0x8(%ebp) -c010686a: 0f 84 a3 00 00 00 je c0106913 - return; +//检查内核页表 boot_pgdir 的正确性 +static void +check_boot_pgdir(void) { +c010617d: 55 push %ebp +c010617e: 89 e5 mov %esp,%ebp +c0106180: 83 ec 38 sub $0x38,%esp + pte_t *ptep;// 定义一个指向页表项的指针 + int i; + for (i = 0; i < npage; i += PGSIZE) {// 遍历所有页面 +c0106183: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) +c010618a: e9 ca 00 00 00 jmp c0106259 + // 获取第 i 个页面的页表项,并确保其不为空 + assert((ptep = get_pte(boot_pgdir, (uintptr_t)KADDR(i), 0)) != NULL); +c010618f: 8b 45 f4 mov -0xc(%ebp),%eax +c0106192: 89 45 e4 mov %eax,-0x1c(%ebp) +c0106195: 8b 45 e4 mov -0x1c(%ebp),%eax +c0106198: c1 e8 0c shr $0xc,%eax +c010619b: 89 45 e0 mov %eax,-0x20(%ebp) +c010619e: a1 04 c0 12 c0 mov 0xc012c004,%eax +c01061a3: 39 45 e0 cmp %eax,-0x20(%ebp) +c01061a6: 72 23 jb c01061cb +c01061a8: 8b 45 e4 mov -0x1c(%ebp),%eax +c01061ab: 89 44 24 0c mov %eax,0xc(%esp) +c01061af: c7 44 24 08 3c ae 10 movl $0xc010ae3c,0x8(%esp) +c01061b6: c0 +c01061b7: c7 44 24 04 d4 02 00 movl $0x2d4,0x4(%esp) +c01061be: 00 +c01061bf: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c01061c6: e8 7a aa ff ff call c0100c45 <__panic> +c01061cb: 8b 45 e4 mov -0x1c(%ebp),%eax +c01061ce: 2d 00 00 00 40 sub $0x40000000,%eax +c01061d3: 89 c2 mov %eax,%edx +c01061d5: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c01061da: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c01061e1: 00 +c01061e2: 89 54 24 04 mov %edx,0x4(%esp) +c01061e6: 89 04 24 mov %eax,(%esp) +c01061e9: e8 a8 f4 ff ff call c0105696 +c01061ee: 89 45 dc mov %eax,-0x24(%ebp) +c01061f1: 83 7d dc 00 cmpl $0x0,-0x24(%ebp) +c01061f5: 75 24 jne c010621b +c01061f7: c7 44 24 0c 28 b2 10 movl $0xc010b228,0xc(%esp) +c01061fe: c0 +c01061ff: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0106206: c0 +c0106207: c7 44 24 04 d4 02 00 movl $0x2d4,0x4(%esp) +c010620e: 00 +c010620f: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0106216: e8 2a aa ff ff call c0100c45 <__panic> + // 验证页表项的物理地址是否正确 + assert(PTE_ADDR(*ptep) == i); +c010621b: 8b 45 dc mov -0x24(%ebp),%eax +c010621e: 8b 00 mov (%eax),%eax +c0106220: 25 00 f0 ff ff and $0xfffff000,%eax +c0106225: 89 c2 mov %eax,%edx +c0106227: 8b 45 f4 mov -0xc(%ebp),%eax +c010622a: 39 c2 cmp %eax,%edx +c010622c: 74 24 je c0106252 +c010622e: c7 44 24 0c 65 b2 10 movl $0xc010b265,0xc(%esp) +c0106235: c0 +c0106236: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c010623d: c0 +c010623e: c7 44 24 04 d6 02 00 movl $0x2d6,0x4(%esp) +c0106245: 00 +c0106246: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c010624d: e8 f3 a9 ff ff call c0100c45 <__panic> + for (i = 0; i < npage; i += PGSIZE) {// 遍历所有页面 +c0106252: 81 45 f4 00 10 00 00 addl $0x1000,-0xc(%ebp) +c0106259: 8b 55 f4 mov -0xc(%ebp),%edx +c010625c: a1 04 c0 12 c0 mov 0xc012c004,%eax +c0106261: 39 c2 cmp %eax,%edx +c0106263: 0f 82 26 ff ff ff jb c010618f + } + // 验证页目录项的物理地址是否正确 + assert(PDE_ADDR(boot_pgdir[PDX(VPT)]) == PADDR(boot_pgdir)); +c0106269: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c010626e: 05 ac 0f 00 00 add $0xfac,%eax +c0106273: 8b 00 mov (%eax),%eax +c0106275: 25 00 f0 ff ff and $0xfffff000,%eax +c010627a: 89 c2 mov %eax,%edx +c010627c: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0106281: 89 45 f0 mov %eax,-0x10(%ebp) +c0106284: 81 7d f0 ff ff ff bf cmpl $0xbfffffff,-0x10(%ebp) +c010628b: 77 23 ja c01062b0 +c010628d: 8b 45 f0 mov -0x10(%ebp),%eax +c0106290: 89 44 24 0c mov %eax,0xc(%esp) +c0106294: c7 44 24 08 e0 ae 10 movl $0xc010aee0,0x8(%esp) +c010629b: c0 +c010629c: c7 44 24 04 d9 02 00 movl $0x2d9,0x4(%esp) +c01062a3: 00 +c01062a4: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c01062ab: e8 95 a9 ff ff call c0100c45 <__panic> +c01062b0: 8b 45 f0 mov -0x10(%ebp),%eax +c01062b3: 05 00 00 00 40 add $0x40000000,%eax +c01062b8: 39 d0 cmp %edx,%eax +c01062ba: 74 24 je c01062e0 +c01062bc: c7 44 24 0c 7c b2 10 movl $0xc010b27c,0xc(%esp) +c01062c3: c0 +c01062c4: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c01062cb: c0 +c01062cc: c7 44 24 04 d9 02 00 movl $0x2d9,0x4(%esp) +c01062d3: 00 +c01062d4: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c01062db: e8 65 a9 ff ff call c0100c45 <__panic> - if (!((unsigned long)block & (PAGE_SIZE-1))) { -c0106870: 8b 45 08 mov 0x8(%ebp),%eax -c0106873: 25 ff 0f 00 00 and $0xfff,%eax -c0106878: 85 c0 test %eax,%eax -c010687a: 75 7f jne c01068fb - /* might be on the big block list */ - spin_lock_irqsave(&block_lock, flags); -c010687c: e8 95 f9 ff ff call c0106216 <__intr_save> -c0106881: 89 45 ec mov %eax,-0x14(%ebp) - for (bb = bigblocks; bb; last = &bb->next, bb = bb->next) { -c0106884: a1 10 c0 12 c0 mov 0xc012c010,%eax -c0106889: 89 45 f4 mov %eax,-0xc(%ebp) -c010688c: eb 5c jmp c01068ea - if (bb->pages == block) { -c010688e: 8b 45 f4 mov -0xc(%ebp),%eax -c0106891: 8b 40 04 mov 0x4(%eax),%eax -c0106894: 39 45 08 cmp %eax,0x8(%ebp) -c0106897: 75 3f jne c01068d8 - *last = bb->next; -c0106899: 8b 45 f4 mov -0xc(%ebp),%eax -c010689c: 8b 50 08 mov 0x8(%eax),%edx -c010689f: 8b 45 f0 mov -0x10(%ebp),%eax -c01068a2: 89 10 mov %edx,(%eax) - spin_unlock_irqrestore(&block_lock, flags); -c01068a4: 8b 45 ec mov -0x14(%ebp),%eax -c01068a7: 89 04 24 mov %eax,(%esp) -c01068aa: e8 91 f9 ff ff call c0106240 <__intr_restore> - __slob_free_pages((unsigned long)block, bb->order); -c01068af: 8b 45 f4 mov -0xc(%ebp),%eax -c01068b2: 8b 10 mov (%eax),%edx -c01068b4: 8b 45 08 mov 0x8(%ebp),%eax -c01068b7: 89 54 24 04 mov %edx,0x4(%esp) -c01068bb: 89 04 24 mov %eax,(%esp) -c01068be: e8 db fa ff ff call c010639e <__slob_free_pages> - slob_free(bb, sizeof(bigblock_t)); -c01068c3: c7 44 24 04 0c 00 00 movl $0xc,0x4(%esp) -c01068ca: 00 -c01068cb: 8b 45 f4 mov -0xc(%ebp),%eax -c01068ce: 89 04 24 mov %eax,(%esp) -c01068d1: e8 d2 fc ff ff call c01065a8 - return; -c01068d6: eb 3c jmp c0106914 - for (bb = bigblocks; bb; last = &bb->next, bb = bb->next) { -c01068d8: 8b 45 f4 mov -0xc(%ebp),%eax -c01068db: 83 c0 08 add $0x8,%eax -c01068de: 89 45 f0 mov %eax,-0x10(%ebp) -c01068e1: 8b 45 f4 mov -0xc(%ebp),%eax -c01068e4: 8b 40 08 mov 0x8(%eax),%eax -c01068e7: 89 45 f4 mov %eax,-0xc(%ebp) -c01068ea: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c01068ee: 75 9e jne c010688e - } - } - spin_unlock_irqrestore(&block_lock, flags); -c01068f0: 8b 45 ec mov -0x14(%ebp),%eax -c01068f3: 89 04 24 mov %eax,(%esp) -c01068f6: e8 45 f9 ff ff call c0106240 <__intr_restore> - } + assert(boot_pgdir[0] == 0);// 确保页目录的第一个项为0 +c01062e0: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c01062e5: 8b 00 mov (%eax),%eax +c01062e7: 85 c0 test %eax,%eax +c01062e9: 74 24 je c010630f +c01062eb: c7 44 24 0c b0 b2 10 movl $0xc010b2b0,0xc(%esp) +c01062f2: c0 +c01062f3: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c01062fa: c0 +c01062fb: c7 44 24 04 db 02 00 movl $0x2db,0x4(%esp) +c0106302: 00 +c0106303: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c010630a: e8 36 a9 ff ff call c0100c45 <__panic> - slob_free((slob_t *)block - 1, 0); -c01068fb: 8b 45 08 mov 0x8(%ebp),%eax -c01068fe: 83 e8 08 sub $0x8,%eax -c0106901: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c0106908: 00 -c0106909: 89 04 24 mov %eax,(%esp) -c010690c: e8 97 fc ff ff call c01065a8 - return; -c0106911: eb 01 jmp c0106914 - return; -c0106913: 90 nop -} -c0106914: c9 leave -c0106915: c3 ret + struct Page *p;// 定义一个指向页面的指针 + p = alloc_page();// 分配一个页面 +c010630f: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c0106316: e8 c0 ec ff ff call c0104fdb +c010631b: 89 45 ec mov %eax,-0x14(%ebp) + // 将页面插入到虚拟地址 0x100,并确保操作成功 + assert(page_insert(boot_pgdir, p, 0x100, PTE_W) == 0); +c010631e: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c0106323: c7 44 24 0c 02 00 00 movl $0x2,0xc(%esp) +c010632a: 00 +c010632b: c7 44 24 08 00 01 00 movl $0x100,0x8(%esp) +c0106332: 00 +c0106333: 8b 55 ec mov -0x14(%ebp),%edx +c0106336: 89 54 24 04 mov %edx,0x4(%esp) +c010633a: 89 04 24 mov %eax,(%esp) +c010633d: e8 95 f5 ff ff call c01058d7 +c0106342: 85 c0 test %eax,%eax +c0106344: 74 24 je c010636a +c0106346: c7 44 24 0c c4 b2 10 movl $0xc010b2c4,0xc(%esp) +c010634d: c0 +c010634e: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0106355: c0 +c0106356: c7 44 24 04 e0 02 00 movl $0x2e0,0x4(%esp) +c010635d: 00 +c010635e: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0106365: e8 db a8 ff ff call c0100c45 <__panic> + assert(page_ref(p) == 1);// 验证页面的引用计数为1 +c010636a: 8b 45 ec mov -0x14(%ebp),%eax +c010636d: 89 04 24 mov %eax,(%esp) +c0106370: e8 56 ea ff ff call c0104dcb +c0106375: 83 f8 01 cmp $0x1,%eax +c0106378: 74 24 je c010639e +c010637a: c7 44 24 0c f2 b2 10 movl $0xc010b2f2,0xc(%esp) +c0106381: c0 +c0106382: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0106389: c0 +c010638a: c7 44 24 04 e1 02 00 movl $0x2e1,0x4(%esp) +c0106391: 00 +c0106392: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0106399: e8 a7 a8 ff ff call c0100c45 <__panic> + // 将页面插入到虚拟地址 0x100 + PGSIZE,并确保操作成功 + assert(page_insert(boot_pgdir, p, 0x100 + PGSIZE, PTE_W) == 0); +c010639e: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c01063a3: c7 44 24 0c 02 00 00 movl $0x2,0xc(%esp) +c01063aa: 00 +c01063ab: c7 44 24 08 00 11 00 movl $0x1100,0x8(%esp) +c01063b2: 00 +c01063b3: 8b 55 ec mov -0x14(%ebp),%edx +c01063b6: 89 54 24 04 mov %edx,0x4(%esp) +c01063ba: 89 04 24 mov %eax,(%esp) +c01063bd: e8 15 f5 ff ff call c01058d7 +c01063c2: 85 c0 test %eax,%eax +c01063c4: 74 24 je c01063ea +c01063c6: c7 44 24 0c 04 b3 10 movl $0xc010b304,0xc(%esp) +c01063cd: c0 +c01063ce: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c01063d5: c0 +c01063d6: c7 44 24 04 e3 02 00 movl $0x2e3,0x4(%esp) +c01063dd: 00 +c01063de: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c01063e5: e8 5b a8 ff ff call c0100c45 <__panic> + assert(page_ref(p) == 2);// 验证页面的引用计数为2 +c01063ea: 8b 45 ec mov -0x14(%ebp),%eax +c01063ed: 89 04 24 mov %eax,(%esp) +c01063f0: e8 d6 e9 ff ff call c0104dcb +c01063f5: 83 f8 02 cmp $0x2,%eax +c01063f8: 74 24 je c010641e +c01063fa: c7 44 24 0c 3b b3 10 movl $0xc010b33b,0xc(%esp) +c0106401: c0 +c0106402: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c0106409: c0 +c010640a: c7 44 24 04 e4 02 00 movl $0x2e4,0x4(%esp) +c0106411: 00 +c0106412: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c0106419: e8 27 a8 ff ff call c0100c45 <__panic> -c0106916 : + const char *str = "ucore: Hello world!!";// 定义一个字符串 +c010641e: c7 45 e8 4c b3 10 c0 movl $0xc010b34c,-0x18(%ebp) + strcpy((void *)0x100, str);// 将字符串复制到虚拟地址 0x100 +c0106425: 8b 45 e8 mov -0x18(%ebp),%eax +c0106428: 89 44 24 04 mov %eax,0x4(%esp) +c010642c: c7 04 24 00 01 00 00 movl $0x100,(%esp) +c0106433: e8 dc 37 00 00 call c0109c14 + // 验证两个映射地址的数据是否一致 + assert(strcmp((void *)0x100, (void *)(0x100 + PGSIZE)) == 0); +c0106438: c7 44 24 04 00 11 00 movl $0x1100,0x4(%esp) +c010643f: 00 +c0106440: c7 04 24 00 01 00 00 movl $0x100,(%esp) +c0106447: e8 40 38 00 00 call c0109c8c +c010644c: 85 c0 test %eax,%eax +c010644e: 74 24 je c0106474 +c0106450: c7 44 24 0c 64 b3 10 movl $0xc010b364,0xc(%esp) +c0106457: c0 +c0106458: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c010645f: c0 +c0106460: c7 44 24 04 e9 02 00 movl $0x2e9,0x4(%esp) +c0106467: 00 +c0106468: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c010646f: e8 d1 a7 ff ff call c0100c45 <__panic> + // 在页面的 0x100 偏移处设置字符串结束符 + *(char *)(page2kva(p) + 0x100) = '\0'; +c0106474: 8b 45 ec mov -0x14(%ebp),%eax +c0106477: 89 04 24 mov %eax,(%esp) +c010647a: e8 9c e8 ff ff call c0104d1b +c010647f: 05 00 01 00 00 add $0x100,%eax +c0106484: c6 00 00 movb $0x0,(%eax) + assert(strlen((const char *)0x100) == 0);// 验证字符串长度为0 +c0106487: c7 04 24 00 01 00 00 movl $0x100,(%esp) +c010648e: e8 27 37 00 00 call c0109bba +c0106493: 85 c0 test %eax,%eax +c0106495: 74 24 je c01064bb +c0106497: c7 44 24 0c 9c b3 10 movl $0xc010b39c,0xc(%esp) +c010649e: c0 +c010649f: c7 44 24 08 29 af 10 movl $0xc010af29,0x8(%esp) +c01064a6: c0 +c01064a7: c7 44 24 04 ec 02 00 movl $0x2ec,0x4(%esp) +c01064ae: 00 +c01064af: c7 04 24 04 af 10 c0 movl $0xc010af04,(%esp) +c01064b6: e8 8a a7 ff ff call c0100c45 <__panic> + free_page(p);// 释放页面 p +c01064bb: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c01064c2: 00 +c01064c3: 8b 45 ec mov -0x14(%ebp),%eax +c01064c6: 89 04 24 mov %eax,(%esp) +c01064c9: e8 7a eb ff ff call c0105048 + free_page(pde2page(boot_pgdir[0]));// 释放页目录项对应的页面 +c01064ce: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c01064d3: 8b 00 mov (%eax),%eax +c01064d5: 89 04 24 mov %eax,(%esp) +c01064d8: e8 d4 e8 ff ff call c0104db1 +c01064dd: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c01064e4: 00 +c01064e5: 89 04 24 mov %eax,(%esp) +c01064e8: e8 5b eb ff ff call c0105048 + boot_pgdir[0] = 0;// 将页目录的第一个项设为0 +c01064ed: a1 00 8a 12 c0 mov 0xc0128a00,%eax +c01064f2: c7 00 00 00 00 00 movl $0x0,(%eax) -unsigned int ksize(const void *block) -{ -c0106916: f3 0f 1e fb endbr32 -c010691a: 55 push %ebp -c010691b: 89 e5 mov %esp,%ebp -c010691d: 83 ec 28 sub $0x28,%esp - bigblock_t *bb; - unsigned long flags; + cprintf("check_boot_pgdir() succeeded!\n");// 输出成功信息 +c01064f8: c7 04 24 c0 b3 10 c0 movl $0xc010b3c0,(%esp) +c01064ff: e8 74 9e ff ff call c0100378 +} +c0106504: 90 nop +c0106505: 89 ec mov %ebp,%esp +c0106507: 5d pop %ebp +c0106508: c3 ret - if (!block) -c0106920: 83 7d 08 00 cmpl $0x0,0x8(%ebp) -c0106924: 75 07 jne c010692d - return 0; -c0106926: b8 00 00 00 00 mov $0x0,%eax -c010692b: eb 6b jmp c0106998 +c0106509 : - if (!((unsigned long)block & (PAGE_SIZE-1))) { -c010692d: 8b 45 08 mov 0x8(%ebp),%eax -c0106930: 25 ff 0f 00 00 and $0xfff,%eax -c0106935: 85 c0 test %eax,%eax -c0106937: 75 54 jne c010698d - spin_lock_irqsave(&block_lock, flags); -c0106939: e8 d8 f8 ff ff call c0106216 <__intr_save> -c010693e: 89 45 f0 mov %eax,-0x10(%ebp) - for (bb = bigblocks; bb; bb = bb->next) -c0106941: a1 10 c0 12 c0 mov 0xc012c010,%eax -c0106946: 89 45 f4 mov %eax,-0xc(%ebp) -c0106949: eb 31 jmp c010697c - if (bb->pages == block) { -c010694b: 8b 45 f4 mov -0xc(%ebp),%eax -c010694e: 8b 40 04 mov 0x4(%eax),%eax -c0106951: 39 45 08 cmp %eax,0x8(%ebp) -c0106954: 75 1d jne c0106973 - spin_unlock_irqrestore(&slob_lock, flags); -c0106956: 8b 45 f0 mov -0x10(%ebp),%eax -c0106959: 89 04 24 mov %eax,(%esp) -c010695c: e8 df f8 ff ff call c0106240 <__intr_restore> - return PAGE_SIZE << bb->order; -c0106961: 8b 45 f4 mov -0xc(%ebp),%eax -c0106964: 8b 00 mov (%eax),%eax -c0106966: ba 00 10 00 00 mov $0x1000,%edx -c010696b: 88 c1 mov %al,%cl -c010696d: d3 e2 shl %cl,%edx -c010696f: 89 d0 mov %edx,%eax -c0106971: eb 25 jmp c0106998 - for (bb = bigblocks; bb; bb = bb->next) -c0106973: 8b 45 f4 mov -0xc(%ebp),%eax -c0106976: 8b 40 08 mov 0x8(%eax),%eax -c0106979: 89 45 f4 mov %eax,-0xc(%ebp) -c010697c: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0106980: 75 c9 jne c010694b - } - spin_unlock_irqrestore(&block_lock, flags); -c0106982: 8b 45 f0 mov -0x10(%ebp),%eax -c0106985: 89 04 24 mov %eax,(%esp) -c0106988: e8 b3 f8 ff ff call c0106240 <__intr_restore> - } +//perm2str - use string 'u,r,w,-' to present the permission +static const char * +perm2str(int perm) { +c0106509: 55 push %ebp +c010650a: 89 e5 mov %esp,%ebp + //定义一个静态字符数组 str,长度为4 + static char str[4]; + //如果 perm 与 PTE_U 按位与的结果不为0,则 str[0] 设置为 'u',否则设置为 '-' + str[0] = (perm & PTE_U) ? 'u' : '-'; +c010650c: 8b 45 08 mov 0x8(%ebp),%eax +c010650f: 83 e0 04 and $0x4,%eax +c0106512: 85 c0 test %eax,%eax +c0106514: 74 04 je c010651a +c0106516: b0 75 mov $0x75,%al +c0106518: eb 02 jmp c010651c +c010651a: b0 2d mov $0x2d,%al +c010651c: a2 88 c0 12 c0 mov %al,0xc012c088 + //str[1] 始终设置为 'r' + str[1] = 'r'; +c0106521: c6 05 89 c0 12 c0 72 movb $0x72,0xc012c089 + //如果 perm 与 PTE_W 按位与的结果不为0,则 str[2] 设置为 'w',否则设置为 '-' + str[2] = (perm & PTE_W) ? 'w' : '-'; +c0106528: 8b 45 08 mov 0x8(%ebp),%eax +c010652b: 83 e0 02 and $0x2,%eax +c010652e: 85 c0 test %eax,%eax +c0106530: 74 04 je c0106536 +c0106532: b0 77 mov $0x77,%al +c0106534: eb 02 jmp c0106538 +c0106536: b0 2d mov $0x2d,%al +c0106538: a2 8a c0 12 c0 mov %al,0xc012c08a + //str[3] 设置为字符串结束符 \0 + str[3] = '\0'; +c010653d: c6 05 8b c0 12 c0 00 movb $0x0,0xc012c08b + return str; +c0106544: b8 88 c0 12 c0 mov $0xc012c088,%eax +} +c0106549: 5d pop %ebp +c010654a: c3 ret - return ((slob_t *)block - 1)->units * SLOB_UNIT; -c010698d: 8b 45 08 mov 0x8(%ebp),%eax -c0106990: 83 e8 08 sub $0x8,%eax -c0106993: 8b 00 mov (%eax),%eax -c0106995: c1 e0 03 shl $0x3,%eax +c010654b : +// left_store: the pointer of the high side of table's next range +// right_store: the pointer of the low side of table's next range +// return value: 0 - not a invalid item range, perm - a valid item range with perm permission +//从页表中获取指定范围内的有效项,并根据权限进行处理。 +static int +get_pgtable_items(size_t left, size_t right, size_t start, uintptr_t *table, size_t *left_store, size_t *right_store) { +c010654b: 55 push %ebp +c010654c: 89 e5 mov %esp,%ebp +c010654e: 83 ec 10 sub $0x10,%esp + if (start >= right) {// 检查起始索引是否超出右边界 +c0106551: 8b 45 10 mov 0x10(%ebp),%eax +c0106554: 3b 45 0c cmp 0xc(%ebp),%eax +c0106557: 72 0d jb c0106566 + return 0;// 如果超出右边界,返回0 +c0106559: b8 00 00 00 00 mov $0x0,%eax +c010655e: e9 98 00 00 00 jmp c01065fb + } + while (start < right && !(table[start] & PTE_P)) {// 查找第一个有效项(PTE_P位为1的项) + start ++;// 索引递增 +c0106563: ff 45 10 incl 0x10(%ebp) + while (start < right && !(table[start] & PTE_P)) {// 查找第一个有效项(PTE_P位为1的项) +c0106566: 8b 45 10 mov 0x10(%ebp),%eax +c0106569: 3b 45 0c cmp 0xc(%ebp),%eax +c010656c: 73 18 jae c0106586 +c010656e: 8b 45 10 mov 0x10(%ebp),%eax +c0106571: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx +c0106578: 8b 45 14 mov 0x14(%ebp),%eax +c010657b: 01 d0 add %edx,%eax +c010657d: 8b 00 mov (%eax),%eax +c010657f: 83 e0 01 and $0x1,%eax +c0106582: 85 c0 test %eax,%eax +c0106584: 74 dd je c0106563 + } + if (start < right) {// 检查是否找到有效项 +c0106586: 8b 45 10 mov 0x10(%ebp),%eax +c0106589: 3b 45 0c cmp 0xc(%ebp),%eax +c010658c: 73 68 jae c01065f6 + if (left_store != NULL) {// 如果left_store不为NULL +c010658e: 83 7d 18 00 cmpl $0x0,0x18(%ebp) +c0106592: 74 08 je c010659c + *left_store = start;// 记录左边界索引 +c0106594: 8b 45 18 mov 0x18(%ebp),%eax +c0106597: 8b 55 10 mov 0x10(%ebp),%edx +c010659a: 89 10 mov %edx,(%eax) + } + int perm = (table[start ++] & PTE_USER);// 获取当前项的用户权限位并递增索引 +c010659c: 8b 45 10 mov 0x10(%ebp),%eax +c010659f: 8d 50 01 lea 0x1(%eax),%edx +c01065a2: 89 55 10 mov %edx,0x10(%ebp) +c01065a5: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx +c01065ac: 8b 45 14 mov 0x14(%ebp),%eax +c01065af: 01 d0 add %edx,%eax +c01065b1: 8b 00 mov (%eax),%eax +c01065b3: 83 e0 07 and $0x7,%eax +c01065b6: 89 45 fc mov %eax,-0x4(%ebp) + while (start < right && (table[start] & PTE_USER) == perm) {// 查找具有相同用户权限的连续项 +c01065b9: eb 03 jmp c01065be + start ++;// 索引递增 +c01065bb: ff 45 10 incl 0x10(%ebp) + while (start < right && (table[start] & PTE_USER) == perm) {// 查找具有相同用户权限的连续项 +c01065be: 8b 45 10 mov 0x10(%ebp),%eax +c01065c1: 3b 45 0c cmp 0xc(%ebp),%eax +c01065c4: 73 1d jae c01065e3 +c01065c6: 8b 45 10 mov 0x10(%ebp),%eax +c01065c9: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx +c01065d0: 8b 45 14 mov 0x14(%ebp),%eax +c01065d3: 01 d0 add %edx,%eax +c01065d5: 8b 00 mov (%eax),%eax +c01065d7: 83 e0 07 and $0x7,%eax +c01065da: 89 c2 mov %eax,%edx +c01065dc: 8b 45 fc mov -0x4(%ebp),%eax +c01065df: 39 c2 cmp %eax,%edx +c01065e1: 74 d8 je c01065bb + } + if (right_store != NULL) {// 如果right_store不为NULL +c01065e3: 83 7d 1c 00 cmpl $0x0,0x1c(%ebp) +c01065e7: 74 08 je c01065f1 + *right_store = start;// 记录右边界索引 +c01065e9: 8b 45 1c mov 0x1c(%ebp),%eax +c01065ec: 8b 55 10 mov 0x10(%ebp),%edx +c01065ef: 89 10 mov %edx,(%eax) + } + return perm;// 返回用户权限位 +c01065f1: 8b 45 fc mov -0x4(%ebp),%eax +c01065f4: eb 05 jmp c01065fb + } + return 0;// 如果未找到有效项,返回0 +c01065f6: b8 00 00 00 00 mov $0x0,%eax } -c0106998: c9 leave -c0106999: c3 ret +c01065fb: 89 ec mov %ebp,%esp +c01065fd: 5d pop %ebp +c01065fe: c3 ret + +c01065ff : -c010699a : +//print_pgdir - print the PDT&PT +void +print_pgdir(void) { +c01065ff: 55 push %ebp +c0106600: 89 e5 mov %esp,%ebp +c0106602: 57 push %edi +c0106603: 56 push %esi +c0106604: 53 push %ebx +c0106605: 83 ec 4c sub $0x4c,%esp + cprintf("-------------------- BEGIN --------------------\n"); +c0106608: c7 04 24 e0 b3 10 c0 movl $0xc010b3e0,(%esp) +c010660f: e8 64 9d ff ff call c0100378 + // 定义变量 left, right 和 perm + size_t left, right = 0, perm; +c0106614: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp) + // 遍历页目录项 + while ((perm = get_pgtable_items(0, NPDEENTRY, right, vpd, &left, &right)) != 0) { +c010661b: e9 f2 00 00 00 jmp c0106712 + // 打印页目录项的信息 + cprintf("PDE(%03x) %08x-%08x %08x %s\n", right - left, +c0106620: 8b 45 e4 mov -0x1c(%ebp),%eax +c0106623: 89 04 24 mov %eax,(%esp) +c0106626: e8 de fe ff ff call c0106509 + left * PTSIZE, right * PTSIZE, (right - left) * PTSIZE, perm2str(perm)); +c010662b: 8b 55 dc mov -0x24(%ebp),%edx +c010662e: 8b 4d e0 mov -0x20(%ebp),%ecx +c0106631: 29 ca sub %ecx,%edx + cprintf("PDE(%03x) %08x-%08x %08x %s\n", right - left, +c0106633: 89 d6 mov %edx,%esi +c0106635: c1 e6 16 shl $0x16,%esi +c0106638: 8b 55 dc mov -0x24(%ebp),%edx +c010663b: 89 d3 mov %edx,%ebx +c010663d: c1 e3 16 shl $0x16,%ebx +c0106640: 8b 55 e0 mov -0x20(%ebp),%edx +c0106643: 89 d1 mov %edx,%ecx +c0106645: c1 e1 16 shl $0x16,%ecx +c0106648: 8b 55 dc mov -0x24(%ebp),%edx +c010664b: 8b 7d e0 mov -0x20(%ebp),%edi +c010664e: 29 fa sub %edi,%edx +c0106650: 89 44 24 14 mov %eax,0x14(%esp) +c0106654: 89 74 24 10 mov %esi,0x10(%esp) +c0106658: 89 5c 24 0c mov %ebx,0xc(%esp) +c010665c: 89 4c 24 08 mov %ecx,0x8(%esp) +c0106660: 89 54 24 04 mov %edx,0x4(%esp) +c0106664: c7 04 24 11 b4 10 c0 movl $0xc010b411,(%esp) +c010666b: e8 08 9d ff ff call c0100378 + // 计算页表项的起始和结束索引 + size_t l, r = left * NPTEENTRY; +c0106670: 8b 45 e0 mov -0x20(%ebp),%eax +c0106673: c1 e0 0a shl $0xa,%eax +c0106676: 89 45 d4 mov %eax,-0x2c(%ebp) + // 遍历页表项 + while ((perm = get_pgtable_items(left * NPTEENTRY, right * NPTEENTRY, r, vpt, &l, &r)) != 0) { +c0106679: eb 50 jmp c01066cb + // 打印页表项的信息 + cprintf(" |-- PTE(%05x) %08x-%08x %08x %s\n", r - l, +c010667b: 8b 45 e4 mov -0x1c(%ebp),%eax +c010667e: 89 04 24 mov %eax,(%esp) +c0106681: e8 83 fe ff ff call c0106509 + l * PGSIZE, r * PGSIZE, (r - l) * PGSIZE, perm2str(perm)); +c0106686: 8b 55 d4 mov -0x2c(%ebp),%edx +c0106689: 8b 4d d8 mov -0x28(%ebp),%ecx +c010668c: 29 ca sub %ecx,%edx + cprintf(" |-- PTE(%05x) %08x-%08x %08x %s\n", r - l, +c010668e: 89 d6 mov %edx,%esi +c0106690: c1 e6 0c shl $0xc,%esi +c0106693: 8b 55 d4 mov -0x2c(%ebp),%edx +c0106696: 89 d3 mov %edx,%ebx +c0106698: c1 e3 0c shl $0xc,%ebx +c010669b: 8b 55 d8 mov -0x28(%ebp),%edx +c010669e: 89 d1 mov %edx,%ecx +c01066a0: c1 e1 0c shl $0xc,%ecx +c01066a3: 8b 55 d4 mov -0x2c(%ebp),%edx +c01066a6: 8b 7d d8 mov -0x28(%ebp),%edi +c01066a9: 29 fa sub %edi,%edx +c01066ab: 89 44 24 14 mov %eax,0x14(%esp) +c01066af: 89 74 24 10 mov %esi,0x10(%esp) +c01066b3: 89 5c 24 0c mov %ebx,0xc(%esp) +c01066b7: 89 4c 24 08 mov %ecx,0x8(%esp) +c01066bb: 89 54 24 04 mov %edx,0x4(%esp) +c01066bf: c7 04 24 30 b4 10 c0 movl $0xc010b430,(%esp) +c01066c6: e8 ad 9c ff ff call c0100378 + while ((perm = get_pgtable_items(left * NPTEENTRY, right * NPTEENTRY, r, vpt, &l, &r)) != 0) { +c01066cb: be 00 00 c0 fa mov $0xfac00000,%esi +c01066d0: 8b 45 d4 mov -0x2c(%ebp),%eax +c01066d3: 8b 55 dc mov -0x24(%ebp),%edx +c01066d6: 89 d3 mov %edx,%ebx +c01066d8: c1 e3 0a shl $0xa,%ebx +c01066db: 8b 55 e0 mov -0x20(%ebp),%edx +c01066de: 89 d1 mov %edx,%ecx +c01066e0: c1 e1 0a shl $0xa,%ecx +c01066e3: 8d 55 d4 lea -0x2c(%ebp),%edx +c01066e6: 89 54 24 14 mov %edx,0x14(%esp) +c01066ea: 8d 55 d8 lea -0x28(%ebp),%edx +c01066ed: 89 54 24 10 mov %edx,0x10(%esp) +c01066f1: 89 74 24 0c mov %esi,0xc(%esp) +c01066f5: 89 44 24 08 mov %eax,0x8(%esp) +c01066f9: 89 5c 24 04 mov %ebx,0x4(%esp) +c01066fd: 89 0c 24 mov %ecx,(%esp) +c0106700: e8 46 fe ff ff call c010654b +c0106705: 89 45 e4 mov %eax,-0x1c(%ebp) +c0106708: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) +c010670c: 0f 85 69 ff ff ff jne c010667b + while ((perm = get_pgtable_items(0, NPDEENTRY, right, vpd, &left, &right)) != 0) { +c0106712: b9 00 b0 fe fa mov $0xfafeb000,%ecx +c0106717: 8b 45 dc mov -0x24(%ebp),%eax +c010671a: 8d 55 dc lea -0x24(%ebp),%edx +c010671d: 89 54 24 14 mov %edx,0x14(%esp) +c0106721: 8d 55 e0 lea -0x20(%ebp),%edx +c0106724: 89 54 24 10 mov %edx,0x10(%esp) +c0106728: 89 4c 24 0c mov %ecx,0xc(%esp) +c010672c: 89 44 24 08 mov %eax,0x8(%esp) +c0106730: c7 44 24 04 00 04 00 movl $0x400,0x4(%esp) +c0106737: 00 +c0106738: c7 04 24 00 00 00 00 movl $0x0,(%esp) +c010673f: e8 07 fe ff ff call c010654b +c0106744: 89 45 e4 mov %eax,-0x1c(%ebp) +c0106747: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) +c010674b: 0f 85 cf fe ff ff jne c0106620 + } + } + cprintf("--------------------- END ---------------------\n"); +c0106751: c7 04 24 54 b4 10 c0 movl $0xc010b454,(%esp) +c0106758: e8 1b 9c ff ff call c0100378 +} +c010675d: 90 nop +c010675e: 83 c4 4c add $0x4c,%esp +c0106761: 5b pop %ebx +c0106762: 5e pop %esi +c0106763: 5f pop %edi +c0106764: 5d pop %ebp +c0106765: c3 ret + +c0106766 : pa2page(uintptr_t pa) { -c010699a: 55 push %ebp -c010699b: 89 e5 mov %esp,%ebp -c010699d: 83 ec 18 sub $0x18,%esp +c0106766: 55 push %ebp +c0106767: 89 e5 mov %esp,%ebp +c0106769: 83 ec 18 sub $0x18,%esp if (PPN(pa) >= npage) { -c01069a0: 8b 45 08 mov 0x8(%ebp),%eax -c01069a3: c1 e8 0c shr $0xc,%eax -c01069a6: 89 c2 mov %eax,%edx -c01069a8: a1 80 bf 12 c0 mov 0xc012bf80,%eax -c01069ad: 39 c2 cmp %eax,%edx -c01069af: 72 1c jb c01069cd +c010676c: 8b 45 08 mov 0x8(%ebp),%eax +c010676f: c1 e8 0c shr $0xc,%eax +c0106772: 89 c2 mov %eax,%edx +c0106774: a1 04 c0 12 c0 mov 0xc012c004,%eax +c0106779: 39 c2 cmp %eax,%edx +c010677b: 72 1c jb c0106799 panic("pa2page called with invalid pa"); -c01069b1: c7 44 24 08 78 b9 10 movl $0xc010b978,0x8(%esp) -c01069b8: c0 -c01069b9: c7 44 24 04 5f 00 00 movl $0x5f,0x4(%esp) -c01069c0: 00 -c01069c1: c7 04 24 97 b9 10 c0 movl $0xc010b997,(%esp) -c01069c8: e8 76 9a ff ff call c0100443 <__panic> +c010677d: c7 44 24 08 88 b4 10 movl $0xc010b488,0x8(%esp) +c0106784: c0 +c0106785: c7 44 24 04 5f 00 00 movl $0x5f,0x4(%esp) +c010678c: 00 +c010678d: c7 04 24 a7 b4 10 c0 movl $0xc010b4a7,(%esp) +c0106794: e8 ac a4 ff ff call c0100c45 <__panic> return &pages[PPN(pa)]; -c01069cd: a1 b8 e0 12 c0 mov 0xc012e0b8,%eax -c01069d2: 8b 55 08 mov 0x8(%ebp),%edx -c01069d5: c1 ea 0c shr $0xc,%edx -c01069d8: c1 e2 05 shl $0x5,%edx -c01069db: 01 d0 add %edx,%eax +c0106799: 8b 15 00 c0 12 c0 mov 0xc012c000,%edx +c010679f: 8b 45 08 mov 0x8(%ebp),%eax +c01067a2: c1 e8 0c shr $0xc,%eax +c01067a5: c1 e0 05 shl $0x5,%eax +c01067a8: 01 d0 add %edx,%eax } -c01069dd: c9 leave -c01069de: c3 ret +c01067aa: 89 ec mov %ebp,%esp +c01067ac: 5d pop %ebp +c01067ad: c3 ret -c01069df : +c01067ae : pte2page(pte_t pte) { -c01069df: 55 push %ebp -c01069e0: 89 e5 mov %esp,%ebp -c01069e2: 83 ec 18 sub $0x18,%esp +c01067ae: 55 push %ebp +c01067af: 89 e5 mov %esp,%ebp +c01067b1: 83 ec 18 sub $0x18,%esp if (!(pte & PTE_P)) { -c01069e5: 8b 45 08 mov 0x8(%ebp),%eax -c01069e8: 83 e0 01 and $0x1,%eax -c01069eb: 85 c0 test %eax,%eax -c01069ed: 75 1c jne c0106a0b +c01067b4: 8b 45 08 mov 0x8(%ebp),%eax +c01067b7: 83 e0 01 and $0x1,%eax +c01067ba: 85 c0 test %eax,%eax +c01067bc: 75 1c jne c01067da panic("pte2page called with invalid pte"); -c01069ef: c7 44 24 08 a8 b9 10 movl $0xc010b9a8,0x8(%esp) -c01069f6: c0 -c01069f7: c7 44 24 04 71 00 00 movl $0x71,0x4(%esp) -c01069fe: 00 -c01069ff: c7 04 24 97 b9 10 c0 movl $0xc010b997,(%esp) -c0106a06: e8 38 9a ff ff call c0100443 <__panic> +c01067be: c7 44 24 08 b8 b4 10 movl $0xc010b4b8,0x8(%esp) +c01067c5: c0 +c01067c6: c7 44 24 04 71 00 00 movl $0x71,0x4(%esp) +c01067cd: 00 +c01067ce: c7 04 24 a7 b4 10 c0 movl $0xc010b4a7,(%esp) +c01067d5: e8 6b a4 ff ff call c0100c45 <__panic> return pa2page(PTE_ADDR(pte)); -c0106a0b: 8b 45 08 mov 0x8(%ebp),%eax -c0106a0e: 25 00 f0 ff ff and $0xfffff000,%eax -c0106a13: 89 04 24 mov %eax,(%esp) -c0106a16: e8 7f ff ff ff call c010699a +c01067da: 8b 45 08 mov 0x8(%ebp),%eax +c01067dd: 25 00 f0 ff ff and $0xfffff000,%eax +c01067e2: 89 04 24 mov %eax,(%esp) +c01067e5: e8 7c ff ff ff call c0106766 } -c0106a1b: c9 leave -c0106a1c: c3 ret +c01067ea: 89 ec mov %ebp,%esp +c01067ec: 5d pop %ebp +c01067ed: c3 ret -c0106a1d : +c01067ee : static void check_swap(void); int swap_init(void) { -c0106a1d: f3 0f 1e fb endbr32 -c0106a21: 55 push %ebp -c0106a22: 89 e5 mov %esp,%ebp -c0106a24: 83 ec 28 sub $0x28,%esp +c01067ee: 55 push %ebp +c01067ef: 89 e5 mov %esp,%ebp +c01067f1: 83 ec 28 sub $0x28,%esp // 初始化交换文件系统 swapfs_init(); -c0106a27: e8 18 1e 00 00 call c0108844 +c01067f4: e8 a7 1e 00 00 call c01086a0 // 检查最大交换偏移量是否在合法范围内 if (!(1024 <= max_swap_offset && max_swap_offset < MAX_SWAP_OFFSET_LIMIT)) -c0106a2c: a1 7c e1 12 c0 mov 0xc012e17c,%eax -c0106a31: 3d ff 03 00 00 cmp $0x3ff,%eax -c0106a36: 76 0c jbe c0106a44 -c0106a38: a1 7c e1 12 c0 mov 0xc012e17c,%eax -c0106a3d: 3d ff ff ff 00 cmp $0xffffff,%eax -c0106a42: 76 25 jbe c0106a69 +c01067f9: a1 a0 c0 12 c0 mov 0xc012c0a0,%eax +c01067fe: 3d ff 03 00 00 cmp $0x3ff,%eax +c0106803: 76 0c jbe c0106811 +c0106805: a1 a0 c0 12 c0 mov 0xc012c0a0,%eax +c010680a: 3d ff ff ff 00 cmp $0xffffff,%eax +c010680f: 76 25 jbe c0106836 { // 如果最大交换偏移量不合法,输出错误信息并panic panic("bad max_swap_offset %08x.\n", max_swap_offset); -c0106a44: a1 7c e1 12 c0 mov 0xc012e17c,%eax -c0106a49: 89 44 24 0c mov %eax,0xc(%esp) -c0106a4d: c7 44 24 08 c9 b9 10 movl $0xc010b9c9,0x8(%esp) -c0106a54: c0 -c0106a55: c7 44 24 04 28 00 00 movl $0x28,0x4(%esp) -c0106a5c: 00 -c0106a5d: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0106a64: e8 da 99 ff ff call c0100443 <__panic> +c0106811: a1 a0 c0 12 c0 mov 0xc012c0a0,%eax +c0106816: 89 44 24 0c mov %eax,0xc(%esp) +c010681a: c7 44 24 08 d9 b4 10 movl $0xc010b4d9,0x8(%esp) +c0106821: c0 +c0106822: c7 44 24 04 28 00 00 movl $0x28,0x4(%esp) +c0106829: 00 +c010682a: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106831: e8 0f a4 ff ff call c0100c45 <__panic> } // 选择并设置交换管理器为FIFO(先进先出)策略 sm = &swap_manager_fifo; -c0106a69: c7 05 1c c0 12 c0 40 movl $0xc0128a40,0xc012c01c -c0106a70: 8a 12 c0 +c0106836: c7 05 60 c1 12 c0 60 movl $0xc0128a60,0xc012c160 +c010683d: 8a 12 c0 // 调用选定交换管理器的初始化函数 int r = sm->init(); -c0106a73: a1 1c c0 12 c0 mov 0xc012c01c,%eax -c0106a78: 8b 40 04 mov 0x4(%eax),%eax -c0106a7b: ff d0 call *%eax -c0106a7d: 89 45 f4 mov %eax,-0xc(%ebp) +c0106840: a1 60 c1 12 c0 mov 0xc012c160,%eax +c0106845: 8b 40 04 mov 0x4(%eax),%eax +c0106848: ff d0 call *%eax +c010684a: 89 45 f4 mov %eax,-0xc(%ebp) // 如果交换管理器初始化成功 if (r == 0) -c0106a80: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0106a84: 75 26 jne c0106aac +c010684d: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0106851: 75 26 jne c0106879 { // 标记交换空间初始化为成功 swap_init_ok = 1; -c0106a86: c7 05 14 c0 12 c0 01 movl $0x1,0xc012c014 -c0106a8d: 00 00 00 +c0106853: c7 05 a4 c0 12 c0 01 movl $0x1,0xc012c0a4 +c010685a: 00 00 00 cprintf("SWAP: manager = %s\n", sm->name); -c0106a90: a1 1c c0 12 c0 mov 0xc012c01c,%eax -c0106a95: 8b 00 mov (%eax),%eax -c0106a97: 89 44 24 04 mov %eax,0x4(%esp) -c0106a9b: c7 04 24 f3 b9 10 c0 movl $0xc010b9f3,(%esp) -c0106aa2: e8 30 98 ff ff call c01002d7 +c010685d: a1 60 c1 12 c0 mov 0xc012c160,%eax +c0106862: 8b 00 mov (%eax),%eax +c0106864: 89 44 24 04 mov %eax,0x4(%esp) +c0106868: c7 04 24 03 b5 10 c0 movl $0xc010b503,(%esp) +c010686f: e8 04 9b ff ff call c0100378 // 检查交换空间状态 check_swap(); -c0106aa7: e8 b6 04 00 00 call c0106f62 +c0106874: e8 b0 04 00 00 call c0106d29 } // 返回初始化结果 return r; -c0106aac: 8b 45 f4 mov -0xc(%ebp),%eax +c0106879: 8b 45 f4 mov -0xc(%ebp),%eax } -c0106aaf: c9 leave -c0106ab0: c3 ret +c010687c: 89 ec mov %ebp,%esp +c010687e: 5d pop %ebp +c010687f: c3 ret -c0106ab1 : +c0106880 : int swap_init_mm(struct mm_struct *mm) { -c0106ab1: f3 0f 1e fb endbr32 -c0106ab5: 55 push %ebp -c0106ab6: 89 e5 mov %esp,%ebp -c0106ab8: 83 ec 18 sub $0x18,%esp +c0106880: 55 push %ebp +c0106881: 89 e5 mov %esp,%ebp +c0106883: 83 ec 18 sub $0x18,%esp //调用 sm 结构体中的 init_mm 函数,并将 mm 作为参数传递 return sm->init_mm(mm); -c0106abb: a1 1c c0 12 c0 mov 0xc012c01c,%eax -c0106ac0: 8b 40 08 mov 0x8(%eax),%eax -c0106ac3: 8b 55 08 mov 0x8(%ebp),%edx -c0106ac6: 89 14 24 mov %edx,(%esp) -c0106ac9: ff d0 call *%eax +c0106886: a1 60 c1 12 c0 mov 0xc012c160,%eax +c010688b: 8b 40 08 mov 0x8(%eax),%eax +c010688e: 8b 55 08 mov 0x8(%ebp),%edx +c0106891: 89 14 24 mov %edx,(%esp) +c0106894: ff d0 call *%eax } -c0106acb: c9 leave -c0106acc: c3 ret +c0106896: 89 ec mov %ebp,%esp +c0106898: 5d pop %ebp +c0106899: c3 ret -c0106acd : +c010689a : * * 返回值: sm->tick_event(mm)的返回值 */ int swap_tick_event(struct mm_struct *mm) { -c0106acd: f3 0f 1e fb endbr32 -c0106ad1: 55 push %ebp -c0106ad2: 89 e5 mov %esp,%ebp -c0106ad4: 83 ec 18 sub $0x18,%esp +c010689a: 55 push %ebp +c010689b: 89 e5 mov %esp,%ebp +c010689d: 83 ec 18 sub $0x18,%esp return sm->tick_event(mm); -c0106ad7: a1 1c c0 12 c0 mov 0xc012c01c,%eax -c0106adc: 8b 40 0c mov 0xc(%eax),%eax -c0106adf: 8b 55 08 mov 0x8(%ebp),%edx -c0106ae2: 89 14 24 mov %edx,(%esp) -c0106ae5: ff d0 call *%eax +c01068a0: a1 60 c1 12 c0 mov 0xc012c160,%eax +c01068a5: 8b 40 0c mov 0xc(%eax),%eax +c01068a8: 8b 55 08 mov 0x8(%ebp),%edx +c01068ab: 89 14 24 mov %edx,(%esp) +c01068ae: ff d0 call *%eax } -c0106ae7: c9 leave -c0106ae8: c3 ret +c01068b0: 89 ec mov %ebp,%esp +c01068b2: 5d pop %ebp +c01068b3: c3 ret -c0106ae9 : +c01068b4 : * 此函数的作用是作为交换操作的接口,根据swap_in参数决定是将页面交换入还是交换出 * 它实际上调用了结构体sm中定义的map_swappable函数,因此具体的操作逻辑依赖于该函数的实现 */ int swap_map_swappable(struct mm_struct *mm, uintptr_t addr, struct Page *page, int swap_in) { -c0106ae9: f3 0f 1e fb endbr32 -c0106aed: 55 push %ebp -c0106aee: 89 e5 mov %esp,%ebp -c0106af0: 83 ec 18 sub $0x18,%esp +c01068b4: 55 push %ebp +c01068b5: 89 e5 mov %esp,%ebp +c01068b7: 83 ec 18 sub $0x18,%esp return sm->map_swappable(mm, addr, page, swap_in); -c0106af3: a1 1c c0 12 c0 mov 0xc012c01c,%eax -c0106af8: 8b 40 10 mov 0x10(%eax),%eax -c0106afb: 8b 55 14 mov 0x14(%ebp),%edx -c0106afe: 89 54 24 0c mov %edx,0xc(%esp) -c0106b02: 8b 55 10 mov 0x10(%ebp),%edx -c0106b05: 89 54 24 08 mov %edx,0x8(%esp) -c0106b09: 8b 55 0c mov 0xc(%ebp),%edx -c0106b0c: 89 54 24 04 mov %edx,0x4(%esp) -c0106b10: 8b 55 08 mov 0x8(%ebp),%edx -c0106b13: 89 14 24 mov %edx,(%esp) -c0106b16: ff d0 call *%eax -} -c0106b18: c9 leave -c0106b19: c3 ret - -c0106b1a : +c01068ba: a1 60 c1 12 c0 mov 0xc012c160,%eax +c01068bf: 8b 40 10 mov 0x10(%eax),%eax +c01068c2: 8b 55 14 mov 0x14(%ebp),%edx +c01068c5: 89 54 24 0c mov %edx,0xc(%esp) +c01068c9: 8b 55 10 mov 0x10(%ebp),%edx +c01068cc: 89 54 24 08 mov %edx,0x8(%esp) +c01068d0: 8b 55 0c mov 0xc(%ebp),%edx +c01068d3: 89 54 24 04 mov %edx,0x4(%esp) +c01068d7: 8b 55 08 mov 0x8(%ebp),%edx +c01068da: 89 14 24 mov %edx,(%esp) +c01068dd: ff d0 call *%eax +} +c01068df: 89 ec mov %ebp,%esp +c01068e1: 5d pop %ebp +c01068e2: c3 ret + +c01068e3 : * 此函数通过调用sm->set_unswappable方法来实现,其主要目的是防止指定的内存区域被交换到磁盘, * 通常用于那些需要常驻内存不能被交换出的特殊页面。成功时返回0,失败时返回非零值。 */ int swap_set_unswappable(struct mm_struct *mm, uintptr_t addr) { -c0106b1a: f3 0f 1e fb endbr32 -c0106b1e: 55 push %ebp -c0106b1f: 89 e5 mov %esp,%ebp -c0106b21: 83 ec 18 sub $0x18,%esp +c01068e3: 55 push %ebp +c01068e4: 89 e5 mov %esp,%ebp +c01068e6: 83 ec 18 sub $0x18,%esp return sm->set_unswappable(mm, addr); -c0106b24: a1 1c c0 12 c0 mov 0xc012c01c,%eax -c0106b29: 8b 40 14 mov 0x14(%eax),%eax -c0106b2c: 8b 55 0c mov 0xc(%ebp),%edx -c0106b2f: 89 54 24 04 mov %edx,0x4(%esp) -c0106b33: 8b 55 08 mov 0x8(%ebp),%edx -c0106b36: 89 14 24 mov %edx,(%esp) -c0106b39: ff d0 call *%eax -} -c0106b3b: c9 leave -c0106b3c: c3 ret - -c0106b3d : +c01068e9: a1 60 c1 12 c0 mov 0xc012c160,%eax +c01068ee: 8b 40 14 mov 0x14(%eax),%eax +c01068f1: 8b 55 0c mov 0xc(%ebp),%edx +c01068f4: 89 54 24 04 mov %edx,0x4(%esp) +c01068f8: 8b 55 08 mov 0x8(%ebp),%edx +c01068fb: 89 14 24 mov %edx,(%esp) +c01068fe: ff d0 call *%eax +} +c0106900: 89 ec mov %ebp,%esp +c0106902: 5d pop %ebp +c0106903: c3 ret + +c0106904 : * 此函数通过选择 victim 页面并将其内容写入到交换空间中,来实现内存中页面的交换出操作。 * 它主要用于内存压力较大时,释放内存空间,确保系统稳定运行。 */ int swap_out(struct mm_struct *mm, int n, int in_tick) { -c0106b3d: f3 0f 1e fb endbr32 -c0106b41: 55 push %ebp -c0106b42: 89 e5 mov %esp,%ebp -c0106b44: 83 ec 38 sub $0x38,%esp +c0106904: 55 push %ebp +c0106905: 89 e5 mov %esp,%ebp +c0106907: 83 ec 38 sub $0x38,%esp int i; for (i = 0; i != n; ++ i)// 循环 n 次,每次处理一个页面 -c0106b47: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) -c0106b4e: e9 53 01 00 00 jmp c0106ca6 +c010690a: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) +c0106911: e9 53 01 00 00 jmp c0106a69 uintptr_t v; // 用于存储页面的虚拟地址 //struct Page **ptr_page=NULL; struct Page *page; // 用于存储选中的页面 // cprintf("i %d, SWAP: call swap_out_victim\n",i); // 调用 swap_out_victim 函数选择一个 victim 页面 int r = sm->swap_out_victim(mm, &page, in_tick); -c0106b53: a1 1c c0 12 c0 mov 0xc012c01c,%eax -c0106b58: 8b 40 18 mov 0x18(%eax),%eax -c0106b5b: 8b 55 10 mov 0x10(%ebp),%edx -c0106b5e: 89 54 24 08 mov %edx,0x8(%esp) -c0106b62: 8d 55 e4 lea -0x1c(%ebp),%edx -c0106b65: 89 54 24 04 mov %edx,0x4(%esp) -c0106b69: 8b 55 08 mov 0x8(%ebp),%edx -c0106b6c: 89 14 24 mov %edx,(%esp) -c0106b6f: ff d0 call *%eax -c0106b71: 89 45 f0 mov %eax,-0x10(%ebp) +c0106916: a1 60 c1 12 c0 mov 0xc012c160,%eax +c010691b: 8b 40 18 mov 0x18(%eax),%eax +c010691e: 8b 55 10 mov 0x10(%ebp),%edx +c0106921: 89 54 24 08 mov %edx,0x8(%esp) +c0106925: 8d 55 e4 lea -0x1c(%ebp),%edx +c0106928: 89 54 24 04 mov %edx,0x4(%esp) +c010692c: 8b 55 08 mov 0x8(%ebp),%edx +c010692f: 89 14 24 mov %edx,(%esp) +c0106932: ff d0 call *%eax +c0106934: 89 45 f0 mov %eax,-0x10(%ebp) if (r != 0) {// 如果选择失败 -c0106b74: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c0106b78: 74 18 je c0106b92 +c0106937: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) +c010693b: 74 18 je c0106955 cprintf("i %d, swap_out: call swap_out_victim failed\n",i);// 输出错误信息 -c0106b7a: 8b 45 f4 mov -0xc(%ebp),%eax -c0106b7d: 89 44 24 04 mov %eax,0x4(%esp) -c0106b81: c7 04 24 08 ba 10 c0 movl $0xc010ba08,(%esp) -c0106b88: e8 4a 97 ff ff call c01002d7 -c0106b8d: e9 20 01 00 00 jmp c0106cb2 +c010693d: 8b 45 f4 mov -0xc(%ebp),%eax +c0106940: 89 44 24 04 mov %eax,0x4(%esp) +c0106944: c7 04 24 18 b5 10 c0 movl $0xc010b518,(%esp) +c010694b: e8 28 9a ff ff call c0100378 +c0106950: e9 20 01 00 00 jmp c0106a75 } //assert(!PageReserved(page)); //cprintf("SWAP: choose victim page 0x%08x\n", page); v=page->pra_vaddr; // 获取页面的虚拟地址 -c0106b92: 8b 45 e4 mov -0x1c(%ebp),%eax -c0106b95: 8b 40 1c mov 0x1c(%eax),%eax -c0106b98: 89 45 ec mov %eax,-0x14(%ebp) +c0106955: 8b 45 e4 mov -0x1c(%ebp),%eax +c0106958: 8b 40 1c mov 0x1c(%eax),%eax +c010695b: 89 45 ec mov %eax,-0x14(%ebp) pte_t *ptep = get_pte(mm->pgdir, v, 0); // 获取页面表项指针 -c0106b9b: 8b 45 08 mov 0x8(%ebp),%eax -c0106b9e: 8b 40 0c mov 0xc(%eax),%eax -c0106ba1: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c0106ba8: 00 -c0106ba9: 8b 55 ec mov -0x14(%ebp),%edx -c0106bac: 89 54 24 04 mov %edx,0x4(%esp) -c0106bb0: 89 04 24 mov %eax,(%esp) -c0106bb3: e8 71 d2 ff ff call c0103e29 -c0106bb8: 89 45 e8 mov %eax,-0x18(%ebp) +c010695e: 8b 45 08 mov 0x8(%ebp),%eax +c0106961: 8b 40 0c mov 0xc(%eax),%eax +c0106964: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c010696b: 00 +c010696c: 8b 55 ec mov -0x14(%ebp),%edx +c010696f: 89 54 24 04 mov %edx,0x4(%esp) +c0106973: 89 04 24 mov %eax,(%esp) +c0106976: e8 1b ed ff ff call c0105696 +c010697b: 89 45 e8 mov %eax,-0x18(%ebp) assert((*ptep & PTE_P) != 0); // 断言页面在物理内存中存在 -c0106bbb: 8b 45 e8 mov -0x18(%ebp),%eax -c0106bbe: 8b 00 mov (%eax),%eax -c0106bc0: 83 e0 01 and $0x1,%eax -c0106bc3: 85 c0 test %eax,%eax -c0106bc5: 75 24 jne c0106beb -c0106bc7: c7 44 24 0c 35 ba 10 movl $0xc010ba35,0xc(%esp) -c0106bce: c0 -c0106bcf: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0106bd6: c0 -c0106bd7: c7 44 24 04 9b 00 00 movl $0x9b,0x4(%esp) -c0106bde: 00 -c0106bdf: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0106be6: e8 58 98 ff ff call c0100443 <__panic> +c010697e: 8b 45 e8 mov -0x18(%ebp),%eax +c0106981: 8b 00 mov (%eax),%eax +c0106983: 83 e0 01 and $0x1,%eax +c0106986: 85 c0 test %eax,%eax +c0106988: 75 24 jne c01069ae +c010698a: c7 44 24 0c 45 b5 10 movl $0xc010b545,0xc(%esp) +c0106991: c0 +c0106992: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106999: c0 +c010699a: c7 44 24 04 9b 00 00 movl $0x9b,0x4(%esp) +c01069a1: 00 +c01069a2: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c01069a9: e8 97 a2 ff ff call c0100c45 <__panic> if (swapfs_write( (page->pra_vaddr/PGSIZE+1)<<8, page) != 0) {// 将页面内容写入交换文件 -c0106beb: 8b 45 e4 mov -0x1c(%ebp),%eax -c0106bee: 8b 55 e4 mov -0x1c(%ebp),%edx -c0106bf1: 8b 52 1c mov 0x1c(%edx),%edx -c0106bf4: c1 ea 0c shr $0xc,%edx -c0106bf7: 42 inc %edx -c0106bf8: c1 e2 08 shl $0x8,%edx -c0106bfb: 89 44 24 04 mov %eax,0x4(%esp) -c0106bff: 89 14 24 mov %edx,(%esp) -c0106c02: e8 00 1d 00 00 call c0108907 -c0106c07: 85 c0 test %eax,%eax -c0106c09: 74 34 je c0106c3f +c01069ae: 8b 45 e4 mov -0x1c(%ebp),%eax +c01069b1: 8b 55 e4 mov -0x1c(%ebp),%edx +c01069b4: 8b 52 1c mov 0x1c(%edx),%edx +c01069b7: c1 ea 0c shr $0xc,%edx +c01069ba: 42 inc %edx +c01069bb: c1 e2 08 shl $0x8,%edx +c01069be: 89 44 24 04 mov %eax,0x4(%esp) +c01069c2: 89 14 24 mov %edx,(%esp) +c01069c5: e8 95 1d 00 00 call c010875f +c01069ca: 85 c0 test %eax,%eax +c01069cc: 74 34 je c0106a02 cprintf("SWAP: failed to save\n");// 如果写入失败,输出错误信息 -c0106c0b: c7 04 24 5f ba 10 c0 movl $0xc010ba5f,(%esp) -c0106c12: e8 c0 96 ff ff call c01002d7 +c01069ce: c7 04 24 6f b5 10 c0 movl $0xc010b56f,(%esp) +c01069d5: e8 9e 99 ff ff call c0100378 sm->map_swappable(mm, v, page, 0);// 标记页面为不可交换 -c0106c17: a1 1c c0 12 c0 mov 0xc012c01c,%eax -c0106c1c: 8b 40 10 mov 0x10(%eax),%eax -c0106c1f: 8b 55 e4 mov -0x1c(%ebp),%edx -c0106c22: c7 44 24 0c 00 00 00 movl $0x0,0xc(%esp) -c0106c29: 00 -c0106c2a: 89 54 24 08 mov %edx,0x8(%esp) -c0106c2e: 8b 55 ec mov -0x14(%ebp),%edx -c0106c31: 89 54 24 04 mov %edx,0x4(%esp) -c0106c35: 8b 55 08 mov 0x8(%ebp),%edx -c0106c38: 89 14 24 mov %edx,(%esp) -c0106c3b: ff d0 call *%eax -c0106c3d: eb 64 jmp c0106ca3 +c01069da: a1 60 c1 12 c0 mov 0xc012c160,%eax +c01069df: 8b 40 10 mov 0x10(%eax),%eax +c01069e2: 8b 55 e4 mov -0x1c(%ebp),%edx +c01069e5: c7 44 24 0c 00 00 00 movl $0x0,0xc(%esp) +c01069ec: 00 +c01069ed: 89 54 24 08 mov %edx,0x8(%esp) +c01069f1: 8b 55 ec mov -0x14(%ebp),%edx +c01069f4: 89 54 24 04 mov %edx,0x4(%esp) +c01069f8: 8b 55 08 mov 0x8(%ebp),%edx +c01069fb: 89 14 24 mov %edx,(%esp) +c01069fe: ff d0 call *%eax +c0106a00: eb 64 jmp c0106a66 continue; } else { cprintf("swap_out: i %d, store page in vaddr 0x%x to disk swap entry %d\n", i, v, page->pra_vaddr/PGSIZE+1); -c0106c3f: 8b 45 e4 mov -0x1c(%ebp),%eax -c0106c42: 8b 40 1c mov 0x1c(%eax),%eax -c0106c45: c1 e8 0c shr $0xc,%eax -c0106c48: 40 inc %eax -c0106c49: 89 44 24 0c mov %eax,0xc(%esp) -c0106c4d: 8b 45 ec mov -0x14(%ebp),%eax -c0106c50: 89 44 24 08 mov %eax,0x8(%esp) -c0106c54: 8b 45 f4 mov -0xc(%ebp),%eax -c0106c57: 89 44 24 04 mov %eax,0x4(%esp) -c0106c5b: c7 04 24 78 ba 10 c0 movl $0xc010ba78,(%esp) -c0106c62: e8 70 96 ff ff call c01002d7 +c0106a02: 8b 45 e4 mov -0x1c(%ebp),%eax +c0106a05: 8b 40 1c mov 0x1c(%eax),%eax +c0106a08: c1 e8 0c shr $0xc,%eax +c0106a0b: 40 inc %eax +c0106a0c: 89 44 24 0c mov %eax,0xc(%esp) +c0106a10: 8b 45 ec mov -0x14(%ebp),%eax +c0106a13: 89 44 24 08 mov %eax,0x8(%esp) +c0106a17: 8b 45 f4 mov -0xc(%ebp),%eax +c0106a1a: 89 44 24 04 mov %eax,0x4(%esp) +c0106a1e: c7 04 24 88 b5 10 c0 movl $0xc010b588,(%esp) +c0106a25: e8 4e 99 ff ff call c0100378 *ptep = (page->pra_vaddr/PGSIZE+1)<<8; // 更新页面表项,标记页面已交换到磁盘 -c0106c67: 8b 45 e4 mov -0x1c(%ebp),%eax -c0106c6a: 8b 40 1c mov 0x1c(%eax),%eax -c0106c6d: c1 e8 0c shr $0xc,%eax -c0106c70: 40 inc %eax -c0106c71: c1 e0 08 shl $0x8,%eax -c0106c74: 89 c2 mov %eax,%edx -c0106c76: 8b 45 e8 mov -0x18(%ebp),%eax -c0106c79: 89 10 mov %edx,(%eax) +c0106a2a: 8b 45 e4 mov -0x1c(%ebp),%eax +c0106a2d: 8b 40 1c mov 0x1c(%eax),%eax +c0106a30: c1 e8 0c shr $0xc,%eax +c0106a33: 40 inc %eax +c0106a34: c1 e0 08 shl $0x8,%eax +c0106a37: 89 c2 mov %eax,%edx +c0106a39: 8b 45 e8 mov -0x18(%ebp),%eax +c0106a3c: 89 10 mov %edx,(%eax) free_page(page); // 释放页面 -c0106c7b: 8b 45 e4 mov -0x1c(%ebp),%eax -c0106c7e: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c0106c85: 00 -c0106c86: 89 04 24 mov %eax,(%esp) -c0106c89: e8 3a cb ff ff call c01037c8 +c0106a3e: 8b 45 e4 mov -0x1c(%ebp),%eax +c0106a41: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c0106a48: 00 +c0106a49: 89 04 24 mov %eax,(%esp) +c0106a4c: e8 f7 e5 ff ff call c0105048 } tlb_invalidate(mm->pgdir, v); // 使 TLB 中对应的条目失效 -c0106c8e: 8b 45 08 mov 0x8(%ebp),%eax -c0106c91: 8b 40 0c mov 0xc(%eax),%eax -c0106c94: 8b 55 ec mov -0x14(%ebp),%edx -c0106c97: 89 54 24 04 mov %edx,0x4(%esp) -c0106c9b: 89 04 24 mov %eax,(%esp) -c0106c9e: e8 88 d4 ff ff call c010412b +c0106a51: 8b 45 08 mov 0x8(%ebp),%eax +c0106a54: 8b 40 0c mov 0xc(%eax),%eax +c0106a57: 8b 55 ec mov -0x14(%ebp),%edx +c0106a5a: 89 54 24 04 mov %edx,0x4(%esp) +c0106a5e: 89 04 24 mov %eax,(%esp) +c0106a61: e8 2c ef ff ff call c0105992 for (i = 0; i != n; ++ i)// 循环 n 次,每次处理一个页面 -c0106ca3: ff 45 f4 incl -0xc(%ebp) -c0106ca6: 8b 45 f4 mov -0xc(%ebp),%eax -c0106ca9: 3b 45 0c cmp 0xc(%ebp),%eax -c0106cac: 0f 85 a1 fe ff ff jne c0106b53 +c0106a66: ff 45 f4 incl -0xc(%ebp) +c0106a69: 8b 45 f4 mov -0xc(%ebp),%eax +c0106a6c: 3b 45 0c cmp 0xc(%ebp),%eax +c0106a6f: 0f 85 a1 fe ff ff jne c0106916 } return i; // 返回实际交换出的页面数量 -c0106cb2: 8b 45 f4 mov -0xc(%ebp),%eax +c0106a75: 8b 45 f4 mov -0xc(%ebp),%eax } -c0106cb5: c9 leave -c0106cb6: c3 ret +c0106a78: 89 ec mov %ebp,%esp +c0106a7a: 5d pop %ebp +c0106a7b: c3 ret -c0106cb7 : +c0106a7c : //实现一个页交换功能。 int swap_in(struct mm_struct *mm, uintptr_t addr, struct Page **ptr_result) { -c0106cb7: f3 0f 1e fb endbr32 -c0106cbb: 55 push %ebp -c0106cbc: 89 e5 mov %esp,%ebp -c0106cbe: 83 ec 28 sub $0x28,%esp +c0106a7c: 55 push %ebp +c0106a7d: 89 e5 mov %esp,%ebp +c0106a7f: 83 ec 28 sub $0x28,%esp //分配一个新的页面result struct Page *result = alloc_page(); -c0106cc1: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0106cc8: e8 8c ca ff ff call c0103759 -c0106ccd: 89 45 f4 mov %eax,-0xc(%ebp) +c0106a82: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c0106a89: e8 4d e5 ff ff call c0104fdb +c0106a8e: 89 45 f4 mov %eax,-0xc(%ebp) assert(result!=NULL); -c0106cd0: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0106cd4: 75 24 jne c0106cfa -c0106cd6: c7 44 24 0c b8 ba 10 movl $0xc010bab8,0xc(%esp) -c0106cdd: c0 -c0106cde: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0106ce5: c0 -c0106ce6: c7 44 24 04 b3 00 00 movl $0xb3,0x4(%esp) -c0106ced: 00 -c0106cee: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0106cf5: e8 49 97 ff ff call c0100443 <__panic> +c0106a91: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0106a95: 75 24 jne c0106abb +c0106a97: c7 44 24 0c c8 b5 10 movl $0xc010b5c8,0xc(%esp) +c0106a9e: c0 +c0106a9f: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106aa6: c0 +c0106aa7: c7 44 24 04 b3 00 00 movl $0xb3,0x4(%esp) +c0106aae: 00 +c0106aaf: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106ab6: e8 8a a1 ff ff call c0100c45 <__panic> //获取虚拟地址 addr 对应的页表项指针 ptep pte_t *ptep = get_pte(mm->pgdir, addr, 0); -c0106cfa: 8b 45 08 mov 0x8(%ebp),%eax -c0106cfd: 8b 40 0c mov 0xc(%eax),%eax -c0106d00: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c0106d07: 00 -c0106d08: 8b 55 0c mov 0xc(%ebp),%edx -c0106d0b: 89 54 24 04 mov %edx,0x4(%esp) -c0106d0f: 89 04 24 mov %eax,(%esp) -c0106d12: e8 12 d1 ff ff call c0103e29 -c0106d17: 89 45 f0 mov %eax,-0x10(%ebp) +c0106abb: 8b 45 08 mov 0x8(%ebp),%eax +c0106abe: 8b 40 0c mov 0xc(%eax),%eax +c0106ac1: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c0106ac8: 00 +c0106ac9: 8b 55 0c mov 0xc(%ebp),%edx +c0106acc: 89 54 24 04 mov %edx,0x4(%esp) +c0106ad0: 89 04 24 mov %eax,(%esp) +c0106ad3: e8 be eb ff ff call c0105696 +c0106ad8: 89 45 f0 mov %eax,-0x10(%ebp) // cprintf("SWAP: load ptep %x swap entry %d to vaddr 0x%08x, page %x, No %d\n", ptep, (*ptep)>>8, addr, result, (result-pages)); int r; //从交换文件中读取数据到新分配的页面 result 中 if ((r = swapfs_read((*ptep), result)) != 0) -c0106d1a: 8b 45 f0 mov -0x10(%ebp),%eax -c0106d1d: 8b 00 mov (%eax),%eax -c0106d1f: 8b 55 f4 mov -0xc(%ebp),%edx -c0106d22: 89 54 24 04 mov %edx,0x4(%esp) -c0106d26: 89 04 24 mov %eax,(%esp) -c0106d29: e8 63 1b 00 00 call c0108891 -c0106d2e: 89 45 ec mov %eax,-0x14(%ebp) -c0106d31: 83 7d ec 00 cmpl $0x0,-0x14(%ebp) -c0106d35: 74 2a je c0106d61 +c0106adb: 8b 45 f0 mov -0x10(%ebp),%eax +c0106ade: 8b 00 mov (%eax),%eax +c0106ae0: 8b 55 f4 mov -0xc(%ebp),%edx +c0106ae3: 89 54 24 04 mov %edx,0x4(%esp) +c0106ae7: 89 04 24 mov %eax,(%esp) +c0106aea: e8 fc 1b 00 00 call c01086eb +c0106aef: 89 45 ec mov %eax,-0x14(%ebp) +c0106af2: 83 7d ec 00 cmpl $0x0,-0x14(%ebp) +c0106af6: 74 2a je c0106b22 { assert(r!=0); -c0106d37: 83 7d ec 00 cmpl $0x0,-0x14(%ebp) -c0106d3b: 75 24 jne c0106d61 -c0106d3d: c7 44 24 0c c5 ba 10 movl $0xc010bac5,0xc(%esp) -c0106d44: c0 -c0106d45: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0106d4c: c0 -c0106d4d: c7 44 24 04 bc 00 00 movl $0xbc,0x4(%esp) -c0106d54: 00 -c0106d55: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0106d5c: e8 e2 96 ff ff call c0100443 <__panic> +c0106af8: 83 7d ec 00 cmpl $0x0,-0x14(%ebp) +c0106afc: 75 24 jne c0106b22 +c0106afe: c7 44 24 0c d5 b5 10 movl $0xc010b5d5,0xc(%esp) +c0106b05: c0 +c0106b06: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106b0d: c0 +c0106b0e: c7 44 24 04 bc 00 00 movl $0xbc,0x4(%esp) +c0106b15: 00 +c0106b16: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106b1d: e8 23 a1 ff ff call c0100c45 <__panic> } cprintf("swap_in: load disk swap entry %d with swap_page in vadr 0x%x\n", (*ptep)>>8, addr); -c0106d61: 8b 45 f0 mov -0x10(%ebp),%eax -c0106d64: 8b 00 mov (%eax),%eax -c0106d66: c1 e8 08 shr $0x8,%eax -c0106d69: 89 c2 mov %eax,%edx -c0106d6b: 8b 45 0c mov 0xc(%ebp),%eax -c0106d6e: 89 44 24 08 mov %eax,0x8(%esp) -c0106d72: 89 54 24 04 mov %edx,0x4(%esp) -c0106d76: c7 04 24 cc ba 10 c0 movl $0xc010bacc,(%esp) -c0106d7d: e8 55 95 ff ff call c01002d7 +c0106b22: 8b 45 f0 mov -0x10(%ebp),%eax +c0106b25: 8b 00 mov (%eax),%eax +c0106b27: c1 e8 08 shr $0x8,%eax +c0106b2a: 89 c2 mov %eax,%edx +c0106b2c: 8b 45 0c mov 0xc(%ebp),%eax +c0106b2f: 89 44 24 08 mov %eax,0x8(%esp) +c0106b33: 89 54 24 04 mov %edx,0x4(%esp) +c0106b37: c7 04 24 dc b5 10 c0 movl $0xc010b5dc,(%esp) +c0106b3e: e8 35 98 ff ff call c0100378 *ptr_result=result; -c0106d82: 8b 45 10 mov 0x10(%ebp),%eax -c0106d85: 8b 55 f4 mov -0xc(%ebp),%edx -c0106d88: 89 10 mov %edx,(%eax) +c0106b43: 8b 45 10 mov 0x10(%ebp),%eax +c0106b46: 8b 55 f4 mov -0xc(%ebp),%edx +c0106b49: 89 10 mov %edx,(%eax) return 0; -c0106d8a: b8 00 00 00 00 mov $0x0,%eax +c0106b4b: b8 00 00 00 00 mov $0x0,%eax } -c0106d8f: c9 leave -c0106d90: c3 ret +c0106b50: 89 ec mov %ebp,%esp +c0106b52: 5d pop %ebp +c0106b53: c3 ret -c0106d91 : +c0106b54 : * 通过向特定内存地址写入数据,并检查页面故障次数是否符合预期,来验证页面管理机制的正确性。 * 此函数没有输入参数和返回值。 */ static inline void check_content_set(void) { -c0106d91: 55 push %ebp -c0106d92: 89 e5 mov %esp,%ebp -c0106d94: 83 ec 18 sub $0x18,%esp +c0106b54: 55 push %ebp +c0106b55: 89 e5 mov %esp,%ebp +c0106b57: 83 ec 18 sub $0x18,%esp *(unsigned char *)0x1000 = 0x0a; -c0106d97: b8 00 10 00 00 mov $0x1000,%eax -c0106d9c: c6 00 0a movb $0xa,(%eax) +c0106b5a: b8 00 10 00 00 mov $0x1000,%eax +c0106b5f: c6 00 0a movb $0xa,(%eax) assert(pgfault_num==1); -c0106d9f: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c0106da4: 83 f8 01 cmp $0x1,%eax -c0106da7: 74 24 je c0106dcd -c0106da9: c7 44 24 0c 0a bb 10 movl $0xc010bb0a,0xc(%esp) -c0106db0: c0 -c0106db1: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0106db8: c0 -c0106db9: c7 44 24 04 cd 00 00 movl $0xcd,0x4(%esp) -c0106dc0: 00 -c0106dc1: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0106dc8: e8 76 96 ff ff call c0100443 <__panic> +c0106b62: a1 70 c1 12 c0 mov 0xc012c170,%eax +c0106b67: 83 f8 01 cmp $0x1,%eax +c0106b6a: 74 24 je c0106b90 +c0106b6c: c7 44 24 0c 1a b6 10 movl $0xc010b61a,0xc(%esp) +c0106b73: c0 +c0106b74: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106b7b: c0 +c0106b7c: c7 44 24 04 cd 00 00 movl $0xcd,0x4(%esp) +c0106b83: 00 +c0106b84: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106b8b: e8 b5 a0 ff ff call c0100c45 <__panic> *(unsigned char *)0x1010 = 0x0a; -c0106dcd: b8 10 10 00 00 mov $0x1010,%eax -c0106dd2: c6 00 0a movb $0xa,(%eax) +c0106b90: b8 10 10 00 00 mov $0x1010,%eax +c0106b95: c6 00 0a movb $0xa,(%eax) assert(pgfault_num==1); -c0106dd5: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c0106dda: 83 f8 01 cmp $0x1,%eax -c0106ddd: 74 24 je c0106e03 -c0106ddf: c7 44 24 0c 0a bb 10 movl $0xc010bb0a,0xc(%esp) -c0106de6: c0 -c0106de7: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0106dee: c0 -c0106def: c7 44 24 04 cf 00 00 movl $0xcf,0x4(%esp) -c0106df6: 00 -c0106df7: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0106dfe: e8 40 96 ff ff call c0100443 <__panic> +c0106b98: a1 70 c1 12 c0 mov 0xc012c170,%eax +c0106b9d: 83 f8 01 cmp $0x1,%eax +c0106ba0: 74 24 je c0106bc6 +c0106ba2: c7 44 24 0c 1a b6 10 movl $0xc010b61a,0xc(%esp) +c0106ba9: c0 +c0106baa: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106bb1: c0 +c0106bb2: c7 44 24 04 cf 00 00 movl $0xcf,0x4(%esp) +c0106bb9: 00 +c0106bba: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106bc1: e8 7f a0 ff ff call c0100c45 <__panic> *(unsigned char *)0x2000 = 0x0b; -c0106e03: b8 00 20 00 00 mov $0x2000,%eax -c0106e08: c6 00 0b movb $0xb,(%eax) +c0106bc6: b8 00 20 00 00 mov $0x2000,%eax +c0106bcb: c6 00 0b movb $0xb,(%eax) assert(pgfault_num==2); -c0106e0b: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c0106e10: 83 f8 02 cmp $0x2,%eax -c0106e13: 74 24 je c0106e39 -c0106e15: c7 44 24 0c 19 bb 10 movl $0xc010bb19,0xc(%esp) -c0106e1c: c0 -c0106e1d: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0106e24: c0 -c0106e25: c7 44 24 04 d1 00 00 movl $0xd1,0x4(%esp) -c0106e2c: 00 -c0106e2d: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0106e34: e8 0a 96 ff ff call c0100443 <__panic> +c0106bce: a1 70 c1 12 c0 mov 0xc012c170,%eax +c0106bd3: 83 f8 02 cmp $0x2,%eax +c0106bd6: 74 24 je c0106bfc +c0106bd8: c7 44 24 0c 29 b6 10 movl $0xc010b629,0xc(%esp) +c0106bdf: c0 +c0106be0: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106be7: c0 +c0106be8: c7 44 24 04 d1 00 00 movl $0xd1,0x4(%esp) +c0106bef: 00 +c0106bf0: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106bf7: e8 49 a0 ff ff call c0100c45 <__panic> *(unsigned char *)0x2010 = 0x0b; -c0106e39: b8 10 20 00 00 mov $0x2010,%eax -c0106e3e: c6 00 0b movb $0xb,(%eax) +c0106bfc: b8 10 20 00 00 mov $0x2010,%eax +c0106c01: c6 00 0b movb $0xb,(%eax) assert(pgfault_num==2); -c0106e41: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c0106e46: 83 f8 02 cmp $0x2,%eax -c0106e49: 74 24 je c0106e6f -c0106e4b: c7 44 24 0c 19 bb 10 movl $0xc010bb19,0xc(%esp) -c0106e52: c0 -c0106e53: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0106e5a: c0 -c0106e5b: c7 44 24 04 d3 00 00 movl $0xd3,0x4(%esp) -c0106e62: 00 -c0106e63: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0106e6a: e8 d4 95 ff ff call c0100443 <__panic> +c0106c04: a1 70 c1 12 c0 mov 0xc012c170,%eax +c0106c09: 83 f8 02 cmp $0x2,%eax +c0106c0c: 74 24 je c0106c32 +c0106c0e: c7 44 24 0c 29 b6 10 movl $0xc010b629,0xc(%esp) +c0106c15: c0 +c0106c16: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106c1d: c0 +c0106c1e: c7 44 24 04 d3 00 00 movl $0xd3,0x4(%esp) +c0106c25: 00 +c0106c26: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106c2d: e8 13 a0 ff ff call c0100c45 <__panic> *(unsigned char *)0x3000 = 0x0c; -c0106e6f: b8 00 30 00 00 mov $0x3000,%eax -c0106e74: c6 00 0c movb $0xc,(%eax) +c0106c32: b8 00 30 00 00 mov $0x3000,%eax +c0106c37: c6 00 0c movb $0xc,(%eax) assert(pgfault_num==3); -c0106e77: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c0106e7c: 83 f8 03 cmp $0x3,%eax -c0106e7f: 74 24 je c0106ea5 -c0106e81: c7 44 24 0c 28 bb 10 movl $0xc010bb28,0xc(%esp) -c0106e88: c0 -c0106e89: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0106e90: c0 -c0106e91: c7 44 24 04 d5 00 00 movl $0xd5,0x4(%esp) -c0106e98: 00 -c0106e99: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0106ea0: e8 9e 95 ff ff call c0100443 <__panic> +c0106c3a: a1 70 c1 12 c0 mov 0xc012c170,%eax +c0106c3f: 83 f8 03 cmp $0x3,%eax +c0106c42: 74 24 je c0106c68 +c0106c44: c7 44 24 0c 38 b6 10 movl $0xc010b638,0xc(%esp) +c0106c4b: c0 +c0106c4c: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106c53: c0 +c0106c54: c7 44 24 04 d5 00 00 movl $0xd5,0x4(%esp) +c0106c5b: 00 +c0106c5c: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106c63: e8 dd 9f ff ff call c0100c45 <__panic> *(unsigned char *)0x3010 = 0x0c; -c0106ea5: b8 10 30 00 00 mov $0x3010,%eax -c0106eaa: c6 00 0c movb $0xc,(%eax) +c0106c68: b8 10 30 00 00 mov $0x3010,%eax +c0106c6d: c6 00 0c movb $0xc,(%eax) assert(pgfault_num==3); -c0106ead: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c0106eb2: 83 f8 03 cmp $0x3,%eax -c0106eb5: 74 24 je c0106edb -c0106eb7: c7 44 24 0c 28 bb 10 movl $0xc010bb28,0xc(%esp) -c0106ebe: c0 -c0106ebf: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0106ec6: c0 -c0106ec7: c7 44 24 04 d7 00 00 movl $0xd7,0x4(%esp) -c0106ece: 00 -c0106ecf: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0106ed6: e8 68 95 ff ff call c0100443 <__panic> +c0106c70: a1 70 c1 12 c0 mov 0xc012c170,%eax +c0106c75: 83 f8 03 cmp $0x3,%eax +c0106c78: 74 24 je c0106c9e +c0106c7a: c7 44 24 0c 38 b6 10 movl $0xc010b638,0xc(%esp) +c0106c81: c0 +c0106c82: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106c89: c0 +c0106c8a: c7 44 24 04 d7 00 00 movl $0xd7,0x4(%esp) +c0106c91: 00 +c0106c92: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106c99: e8 a7 9f ff ff call c0100c45 <__panic> *(unsigned char *)0x4000 = 0x0d; -c0106edb: b8 00 40 00 00 mov $0x4000,%eax -c0106ee0: c6 00 0d movb $0xd,(%eax) +c0106c9e: b8 00 40 00 00 mov $0x4000,%eax +c0106ca3: c6 00 0d movb $0xd,(%eax) assert(pgfault_num==4); -c0106ee3: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c0106ee8: 83 f8 04 cmp $0x4,%eax -c0106eeb: 74 24 je c0106f11 -c0106eed: c7 44 24 0c 37 bb 10 movl $0xc010bb37,0xc(%esp) -c0106ef4: c0 -c0106ef5: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0106efc: c0 -c0106efd: c7 44 24 04 d9 00 00 movl $0xd9,0x4(%esp) -c0106f04: 00 -c0106f05: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0106f0c: e8 32 95 ff ff call c0100443 <__panic> +c0106ca6: a1 70 c1 12 c0 mov 0xc012c170,%eax +c0106cab: 83 f8 04 cmp $0x4,%eax +c0106cae: 74 24 je c0106cd4 +c0106cb0: c7 44 24 0c 47 b6 10 movl $0xc010b647,0xc(%esp) +c0106cb7: c0 +c0106cb8: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106cbf: c0 +c0106cc0: c7 44 24 04 d9 00 00 movl $0xd9,0x4(%esp) +c0106cc7: 00 +c0106cc8: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106ccf: e8 71 9f ff ff call c0100c45 <__panic> *(unsigned char *)0x4010 = 0x0d; -c0106f11: b8 10 40 00 00 mov $0x4010,%eax -c0106f16: c6 00 0d movb $0xd,(%eax) +c0106cd4: b8 10 40 00 00 mov $0x4010,%eax +c0106cd9: c6 00 0d movb $0xd,(%eax) assert(pgfault_num==4); -c0106f19: a1 0c c0 12 c0 mov 0xc012c00c,%eax -c0106f1e: 83 f8 04 cmp $0x4,%eax -c0106f21: 74 24 je c0106f47 -c0106f23: c7 44 24 0c 37 bb 10 movl $0xc010bb37,0xc(%esp) -c0106f2a: c0 -c0106f2b: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0106f32: c0 -c0106f33: c7 44 24 04 db 00 00 movl $0xdb,0x4(%esp) -c0106f3a: 00 -c0106f3b: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0106f42: e8 fc 94 ff ff call c0100443 <__panic> -} -c0106f47: 90 nop -c0106f48: c9 leave -c0106f49: c3 ret - -c0106f4a : +c0106cdc: a1 70 c1 12 c0 mov 0xc012c170,%eax +c0106ce1: 83 f8 04 cmp $0x4,%eax +c0106ce4: 74 24 je c0106d0a +c0106ce6: c7 44 24 0c 47 b6 10 movl $0xc010b647,0xc(%esp) +c0106ced: c0 +c0106cee: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106cf5: c0 +c0106cf6: c7 44 24 04 db 00 00 movl $0xdb,0x4(%esp) +c0106cfd: 00 +c0106cfe: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106d05: e8 3b 9f ff ff call c0100c45 <__panic> +} +c0106d0a: 90 nop +c0106d0b: 89 ec mov %ebp,%esp +c0106d0d: 5d pop %ebp +c0106d0e: c3 ret + +c0106d0f : * * @return int 返回权限检查的结果,非零表示成功,零表示失败 */ static inline int check_content_access(void) { -c0106f4a: 55 push %ebp -c0106f4b: 89 e5 mov %esp,%ebp -c0106f4d: 83 ec 18 sub $0x18,%esp +c0106d0f: 55 push %ebp +c0106d10: 89 e5 mov %esp,%ebp +c0106d12: 83 ec 18 sub $0x18,%esp // 调用swap管理器的检查方法,并将结果返回 int ret = sm->check_swap(); -c0106f50: a1 1c c0 12 c0 mov 0xc012c01c,%eax -c0106f55: 8b 40 1c mov 0x1c(%eax),%eax -c0106f58: ff d0 call *%eax -c0106f5a: 89 45 f4 mov %eax,-0xc(%ebp) +c0106d15: a1 60 c1 12 c0 mov 0xc012c160,%eax +c0106d1a: 8b 40 1c mov 0x1c(%eax),%eax +c0106d1d: ff d0 call *%eax +c0106d1f: 89 45 f4 mov %eax,-0xc(%ebp) return ret; -c0106f5d: 8b 45 f4 mov -0xc(%ebp),%eax +c0106d22: 8b 45 f4 mov -0xc(%ebp),%eax } -c0106f60: c9 leave -c0106f61: c3 ret +c0106d25: 89 ec mov %ebp,%esp +c0106d27: 5d pop %ebp +c0106d28: c3 ret -c0106f62 : +c0106d29 : #define nr_free (free_area.nr_free) // 检查交换机制的正确性,通过模拟页面替换算法 static void check_swap(void) { -c0106f62: f3 0f 1e fb endbr32 -c0106f66: 55 push %ebp -c0106f67: 89 e5 mov %esp,%ebp -c0106f69: 83 ec 78 sub $0x78,%esp +c0106d29: 55 push %ebp +c0106d2a: 89 e5 mov %esp,%ebp +c0106d2c: 83 ec 78 sub $0x78,%esp //backup mem env// 备份内存环境,确保检查后没有页面丢失 int ret, count = 0, total = 0, i; -c0106f6c: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) -c0106f73: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%ebp) +c0106d2f: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) +c0106d36: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%ebp) list_entry_t *le = &free_list; -c0106f7a: c7 45 e8 a4 e1 12 c0 movl $0xc012e1a4,-0x18(%ebp) +c0106d3d: c7 45 e8 e4 bf 12 c0 movl $0xc012bfe4,-0x18(%ebp) while ((le = list_next(le)) != &free_list) { -c0106f81: eb 6a jmp c0106fed +c0106d44: eb 6a jmp c0106db0 struct Page *p = le2page(le, page_link);// 将链表条目转换为页面结构 -c0106f83: 8b 45 e8 mov -0x18(%ebp),%eax -c0106f86: 83 e8 0c sub $0xc,%eax -c0106f89: 89 45 c8 mov %eax,-0x38(%ebp) +c0106d46: 8b 45 e8 mov -0x18(%ebp),%eax +c0106d49: 83 e8 0c sub $0xc,%eax +c0106d4c: 89 45 c8 mov %eax,-0x38(%ebp) assert(PageProperty(p));// 断言页面属性有效 -c0106f8c: 8b 45 c8 mov -0x38(%ebp),%eax -c0106f8f: 83 c0 04 add $0x4,%eax -c0106f92: c7 45 c4 01 00 00 00 movl $0x1,-0x3c(%ebp) -c0106f99: 89 45 c0 mov %eax,-0x40(%ebp) - * @addr: the address to count from - * */ -static inline bool -test_bit(int nr, volatile void *addr) { - int oldbit; +c0106d4f: 8b 45 c8 mov -0x38(%ebp),%eax +c0106d52: 83 c0 04 add $0x4,%eax +c0106d55: c7 45 c4 01 00 00 00 movl $0x1,-0x3c(%ebp) +c0106d5c: 89 45 c0 mov %eax,-0x40(%ebp) asm volatile ("btl %2, %1; sbbl %0,%0" : "=r" (oldbit) : "m" (*(volatile long *)addr), "Ir" (nr)); -c0106f9c: 8b 45 c0 mov -0x40(%ebp),%eax -c0106f9f: 8b 55 c4 mov -0x3c(%ebp),%edx -c0106fa2: 0f a3 10 bt %edx,(%eax) -c0106fa5: 19 c0 sbb %eax,%eax -c0106fa7: 89 45 bc mov %eax,-0x44(%ebp) +c0106d5f: 8b 45 c0 mov -0x40(%ebp),%eax +c0106d62: 8b 55 c4 mov -0x3c(%ebp),%edx +c0106d65: 0f a3 10 bt %edx,(%eax) +c0106d68: 19 c0 sbb %eax,%eax +c0106d6a: 89 45 bc mov %eax,-0x44(%ebp) return oldbit != 0; -c0106faa: 83 7d bc 00 cmpl $0x0,-0x44(%ebp) -c0106fae: 0f 95 c0 setne %al -c0106fb1: 0f b6 c0 movzbl %al,%eax -c0106fb4: 85 c0 test %eax,%eax -c0106fb6: 75 24 jne c0106fdc -c0106fb8: c7 44 24 0c 46 bb 10 movl $0xc010bb46,0xc(%esp) -c0106fbf: c0 -c0106fc0: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0106fc7: c0 -c0106fc8: c7 44 24 04 00 01 00 movl $0x100,0x4(%esp) -c0106fcf: 00 -c0106fd0: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0106fd7: e8 67 94 ff ff call c0100443 <__panic> +c0106d6d: 83 7d bc 00 cmpl $0x0,-0x44(%ebp) +c0106d71: 0f 95 c0 setne %al +c0106d74: 0f b6 c0 movzbl %al,%eax +c0106d77: 85 c0 test %eax,%eax +c0106d79: 75 24 jne c0106d9f +c0106d7b: c7 44 24 0c 56 b6 10 movl $0xc010b656,0xc(%esp) +c0106d82: c0 +c0106d83: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106d8a: c0 +c0106d8b: c7 44 24 04 00 01 00 movl $0x100,0x4(%esp) +c0106d92: 00 +c0106d93: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106d9a: e8 a6 9e ff ff call c0100c45 <__panic> count ++, total += p->property;// 统计页面数量和属性总和 -c0106fdc: ff 45 f4 incl -0xc(%ebp) -c0106fdf: 8b 45 c8 mov -0x38(%ebp),%eax -c0106fe2: 8b 50 08 mov 0x8(%eax),%edx -c0106fe5: 8b 45 f0 mov -0x10(%ebp),%eax -c0106fe8: 01 d0 add %edx,%eax -c0106fea: 89 45 f0 mov %eax,-0x10(%ebp) -c0106fed: 8b 45 e8 mov -0x18(%ebp),%eax -c0106ff0: 89 45 b8 mov %eax,-0x48(%ebp) -c0106ff3: 8b 45 b8 mov -0x48(%ebp),%eax -c0106ff6: 8b 40 04 mov 0x4(%eax),%eax +c0106d9f: ff 45 f4 incl -0xc(%ebp) +c0106da2: 8b 45 c8 mov -0x38(%ebp),%eax +c0106da5: 8b 50 08 mov 0x8(%eax),%edx +c0106da8: 8b 45 f0 mov -0x10(%ebp),%eax +c0106dab: 01 d0 add %edx,%eax +c0106dad: 89 45 f0 mov %eax,-0x10(%ebp) +c0106db0: 8b 45 e8 mov -0x18(%ebp),%eax +c0106db3: 89 45 b8 mov %eax,-0x48(%ebp) +c0106db6: 8b 45 b8 mov -0x48(%ebp),%eax +c0106db9: 8b 40 04 mov 0x4(%eax),%eax while ((le = list_next(le)) != &free_list) { -c0106ff9: 89 45 e8 mov %eax,-0x18(%ebp) -c0106ffc: 81 7d e8 a4 e1 12 c0 cmpl $0xc012e1a4,-0x18(%ebp) -c0107003: 0f 85 7a ff ff ff jne c0106f83 +c0106dbc: 89 45 e8 mov %eax,-0x18(%ebp) +c0106dbf: 81 7d e8 e4 bf 12 c0 cmpl $0xc012bfe4,-0x18(%ebp) +c0106dc6: 0f 85 7a ff ff ff jne c0106d46 } assert(total == nr_free_pages());// 断言统计的属性总和与空闲页面数一致 -c0107009: e8 f1 c7 ff ff call c01037ff -c010700e: 8b 55 f0 mov -0x10(%ebp),%edx -c0107011: 39 d0 cmp %edx,%eax -c0107013: 74 24 je c0107039 -c0107015: c7 44 24 0c 56 bb 10 movl $0xc010bb56,0xc(%esp) -c010701c: c0 -c010701d: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0107024: c0 -c0107025: c7 44 24 04 03 01 00 movl $0x103,0x4(%esp) -c010702c: 00 -c010702d: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0107034: e8 0a 94 ff ff call c0100443 <__panic> +c0106dcc: e8 ac e2 ff ff call c010507d +c0106dd1: 8b 55 f0 mov -0x10(%ebp),%edx +c0106dd4: 39 d0 cmp %edx,%eax +c0106dd6: 74 24 je c0106dfc +c0106dd8: c7 44 24 0c 66 b6 10 movl $0xc010b666,0xc(%esp) +c0106ddf: c0 +c0106de0: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106de7: c0 +c0106de8: c7 44 24 04 03 01 00 movl $0x103,0x4(%esp) +c0106def: 00 +c0106df0: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106df7: e8 49 9e ff ff call c0100c45 <__panic> cprintf("BEGIN check_swap: count %d, total %d\n",count,total);// 打印初始状态 -c0107039: 8b 45 f0 mov -0x10(%ebp),%eax -c010703c: 89 44 24 08 mov %eax,0x8(%esp) -c0107040: 8b 45 f4 mov -0xc(%ebp),%eax -c0107043: 89 44 24 04 mov %eax,0x4(%esp) -c0107047: c7 04 24 70 bb 10 c0 movl $0xc010bb70,(%esp) -c010704e: e8 84 92 ff ff call c01002d7 +c0106dfc: 8b 45 f0 mov -0x10(%ebp),%eax +c0106dff: 89 44 24 08 mov %eax,0x8(%esp) +c0106e03: 8b 45 f4 mov -0xc(%ebp),%eax +c0106e06: 89 44 24 04 mov %eax,0x4(%esp) +c0106e0a: c7 04 24 80 b6 10 c0 movl $0xc010b680,(%esp) +c0106e11: e8 62 95 ff ff call c0100378 //now we set the phy pages env // 设置物理页面环境 struct mm_struct *mm = mm_create();// 创建内存管理结构 -c0107053: e8 88 e4 ff ff call c01054e0 -c0107058: 89 45 e4 mov %eax,-0x1c(%ebp) +c0106e16: e8 1e 0b 00 00 call c0107939 +c0106e1b: 89 45 e4 mov %eax,-0x1c(%ebp) assert(mm != NULL); // 断言内存管理结构创建成功 -c010705b: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) -c010705f: 75 24 jne c0107085 -c0107061: c7 44 24 0c 96 bb 10 movl $0xc010bb96,0xc(%esp) -c0107068: c0 -c0107069: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0107070: c0 -c0107071: c7 44 24 04 08 01 00 movl $0x108,0x4(%esp) -c0107078: 00 -c0107079: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0107080: e8 be 93 ff ff call c0100443 <__panic> +c0106e1e: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) +c0106e22: 75 24 jne c0106e48 +c0106e24: c7 44 24 0c a6 b6 10 movl $0xc010b6a6,0xc(%esp) +c0106e2b: c0 +c0106e2c: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106e33: c0 +c0106e34: c7 44 24 04 08 01 00 movl $0x108,0x4(%esp) +c0106e3b: 00 +c0106e3c: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106e43: e8 fd 9d ff ff call c0100c45 <__panic> extern struct mm_struct *check_mm_struct;// 声明外部变量 assert(check_mm_struct == NULL);// 断言外部变量为空 -c0107085: a1 c4 e0 12 c0 mov 0xc012e0c4,%eax -c010708a: 85 c0 test %eax,%eax -c010708c: 74 24 je c01070b2 -c010708e: c7 44 24 0c a1 bb 10 movl $0xc010bba1,0xc(%esp) -c0107095: c0 -c0107096: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c010709d: c0 -c010709e: c7 44 24 04 0b 01 00 movl $0x10b,0x4(%esp) -c01070a5: 00 -c01070a6: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c01070ad: e8 91 93 ff ff call c0100443 <__panic> +c0106e48: a1 6c c1 12 c0 mov 0xc012c16c,%eax +c0106e4d: 85 c0 test %eax,%eax +c0106e4f: 74 24 je c0106e75 +c0106e51: c7 44 24 0c b1 b6 10 movl $0xc010b6b1,0xc(%esp) +c0106e58: c0 +c0106e59: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106e60: c0 +c0106e61: c7 44 24 04 0b 01 00 movl $0x10b,0x4(%esp) +c0106e68: 00 +c0106e69: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106e70: e8 d0 9d ff ff call c0100c45 <__panic> // 将新创建的内存管理结构赋值给外部变量 check_mm_struct = mm; -c01070b2: 8b 45 e4 mov -0x1c(%ebp),%eax -c01070b5: a3 c4 e0 12 c0 mov %eax,0xc012e0c4 +c0106e75: 8b 45 e4 mov -0x1c(%ebp),%eax +c0106e78: a3 6c c1 12 c0 mov %eax,0xc012c16c pde_t *pgdir = mm->pgdir = boot_pgdir;// 设置页目录 -c01070ba: 8b 15 e0 89 12 c0 mov 0xc01289e0,%edx -c01070c0: 8b 45 e4 mov -0x1c(%ebp),%eax -c01070c3: 89 50 0c mov %edx,0xc(%eax) -c01070c6: 8b 45 e4 mov -0x1c(%ebp),%eax -c01070c9: 8b 40 0c mov 0xc(%eax),%eax -c01070cc: 89 45 e0 mov %eax,-0x20(%ebp) +c0106e7d: 8b 15 00 8a 12 c0 mov 0xc0128a00,%edx +c0106e83: 8b 45 e4 mov -0x1c(%ebp),%eax +c0106e86: 89 50 0c mov %edx,0xc(%eax) +c0106e89: 8b 45 e4 mov -0x1c(%ebp),%eax +c0106e8c: 8b 40 0c mov 0xc(%eax),%eax +c0106e8f: 89 45 e0 mov %eax,-0x20(%ebp) assert(pgdir[0] == 0);// 断言页目录的第一个条目为空 -c01070cf: 8b 45 e0 mov -0x20(%ebp),%eax -c01070d2: 8b 00 mov (%eax),%eax -c01070d4: 85 c0 test %eax,%eax -c01070d6: 74 24 je c01070fc -c01070d8: c7 44 24 0c b9 bb 10 movl $0xc010bbb9,0xc(%esp) -c01070df: c0 -c01070e0: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c01070e7: c0 -c01070e8: c7 44 24 04 11 01 00 movl $0x111,0x4(%esp) -c01070ef: 00 -c01070f0: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c01070f7: e8 47 93 ff ff call c0100443 <__panic> +c0106e92: 8b 45 e0 mov -0x20(%ebp),%eax +c0106e95: 8b 00 mov (%eax),%eax +c0106e97: 85 c0 test %eax,%eax +c0106e99: 74 24 je c0106ebf +c0106e9b: c7 44 24 0c c9 b6 10 movl $0xc010b6c9,0xc(%esp) +c0106ea2: c0 +c0106ea3: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106eaa: c0 +c0106eab: c7 44 24 04 11 01 00 movl $0x111,0x4(%esp) +c0106eb2: 00 +c0106eb3: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106eba: e8 86 9d ff ff call c0100c45 <__panic> // 创建虚拟内存区域 struct vma_struct *vma = vma_create(BEING_CHECK_VALID_VADDR, CHECK_VALID_VADDR, VM_WRITE | VM_READ); -c01070fc: c7 44 24 08 03 00 00 movl $0x3,0x8(%esp) -c0107103: 00 -c0107104: c7 44 24 04 00 60 00 movl $0x6000,0x4(%esp) -c010710b: 00 -c010710c: c7 04 24 00 10 00 00 movl $0x1000,(%esp) -c0107113: e8 45 e4 ff ff call c010555d -c0107118: 89 45 dc mov %eax,-0x24(%ebp) +c0106ebf: c7 44 24 08 03 00 00 movl $0x3,0x8(%esp) +c0106ec6: 00 +c0106ec7: c7 44 24 04 00 60 00 movl $0x6000,0x4(%esp) +c0106ece: 00 +c0106ecf: c7 04 24 00 10 00 00 movl $0x1000,(%esp) +c0106ed6: e8 d9 0a 00 00 call c01079b4 +c0106edb: 89 45 dc mov %eax,-0x24(%ebp) assert(vma != NULL);// 断言虚拟内存区域创建成功 -c010711b: 83 7d dc 00 cmpl $0x0,-0x24(%ebp) -c010711f: 75 24 jne c0107145 -c0107121: c7 44 24 0c c7 bb 10 movl $0xc010bbc7,0xc(%esp) -c0107128: c0 -c0107129: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0107130: c0 -c0107131: c7 44 24 04 15 01 00 movl $0x115,0x4(%esp) -c0107138: 00 -c0107139: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0107140: e8 fe 92 ff ff call c0100443 <__panic> +c0106ede: 83 7d dc 00 cmpl $0x0,-0x24(%ebp) +c0106ee2: 75 24 jne c0106f08 +c0106ee4: c7 44 24 0c d7 b6 10 movl $0xc010b6d7,0xc(%esp) +c0106eeb: c0 +c0106eec: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106ef3: c0 +c0106ef4: c7 44 24 04 15 01 00 movl $0x115,0x4(%esp) +c0106efb: 00 +c0106efc: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106f03: e8 3d 9d ff ff call c0100c45 <__panic> // 插入虚拟内存区域到内存管理结构 insert_vma_struct(mm, vma); -c0107145: 8b 45 dc mov -0x24(%ebp),%eax -c0107148: 89 44 24 04 mov %eax,0x4(%esp) -c010714c: 8b 45 e4 mov -0x1c(%ebp),%eax -c010714f: 89 04 24 mov %eax,(%esp) -c0107152: e8 9f e5 ff ff call c01056f6 +c0106f08: 8b 45 dc mov -0x24(%ebp),%eax +c0106f0b: 89 44 24 04 mov %eax,0x4(%esp) +c0106f0f: 8b 45 e4 mov -0x1c(%ebp),%eax +c0106f12: 89 04 24 mov %eax,(%esp) +c0106f15: e8 31 0c 00 00 call c0107b4b //setup the temp Page Table vaddr 0~4MB/ 设置临时页表,用于虚拟地址 0~4MB cprintf("setup Page Table for vaddr 0X1000, so alloc a page\n");// 打印设置页表的信息 -c0107157: c7 04 24 d4 bb 10 c0 movl $0xc010bbd4,(%esp) -c010715e: e8 74 91 ff ff call c01002d7 +c0106f1a: c7 04 24 e4 b6 10 c0 movl $0xc010b6e4,(%esp) +c0106f21: e8 52 94 ff ff call c0100378 pte_t *temp_ptep=NULL; -c0107163: c7 45 d8 00 00 00 00 movl $0x0,-0x28(%ebp) +c0106f26: c7 45 d8 00 00 00 00 movl $0x0,-0x28(%ebp) temp_ptep = get_pte(mm->pgdir, BEING_CHECK_VALID_VADDR, 1);// 获取页表项 -c010716a: 8b 45 e4 mov -0x1c(%ebp),%eax -c010716d: 8b 40 0c mov 0xc(%eax),%eax -c0107170: c7 44 24 08 01 00 00 movl $0x1,0x8(%esp) -c0107177: 00 -c0107178: c7 44 24 04 00 10 00 movl $0x1000,0x4(%esp) -c010717f: 00 -c0107180: 89 04 24 mov %eax,(%esp) -c0107183: e8 a1 cc ff ff call c0103e29 -c0107188: 89 45 d8 mov %eax,-0x28(%ebp) +c0106f2d: 8b 45 e4 mov -0x1c(%ebp),%eax +c0106f30: 8b 40 0c mov 0xc(%eax),%eax +c0106f33: c7 44 24 08 01 00 00 movl $0x1,0x8(%esp) +c0106f3a: 00 +c0106f3b: c7 44 24 04 00 10 00 movl $0x1000,0x4(%esp) +c0106f42: 00 +c0106f43: 89 04 24 mov %eax,(%esp) +c0106f46: e8 4b e7 ff ff call c0105696 +c0106f4b: 89 45 d8 mov %eax,-0x28(%ebp) assert(temp_ptep!= NULL);// 断言获取页表项成功 -c010718b: 83 7d d8 00 cmpl $0x0,-0x28(%ebp) -c010718f: 75 24 jne c01071b5 -c0107191: c7 44 24 0c 08 bc 10 movl $0xc010bc08,0xc(%esp) -c0107198: c0 -c0107199: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c01071a0: c0 -c01071a1: c7 44 24 04 1e 01 00 movl $0x11e,0x4(%esp) -c01071a8: 00 -c01071a9: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c01071b0: e8 8e 92 ff ff call c0100443 <__panic> +c0106f4e: 83 7d d8 00 cmpl $0x0,-0x28(%ebp) +c0106f52: 75 24 jne c0106f78 +c0106f54: c7 44 24 0c 18 b7 10 movl $0xc010b718,0xc(%esp) +c0106f5b: c0 +c0106f5c: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106f63: c0 +c0106f64: c7 44 24 04 1e 01 00 movl $0x11e,0x4(%esp) +c0106f6b: 00 +c0106f6c: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106f73: e8 cd 9c ff ff call c0100c45 <__panic> cprintf("setup Page Table vaddr 0~4MB OVER!\n");// 打印设置页表完成的信息 -c01071b5: c7 04 24 1c bc 10 c0 movl $0xc010bc1c,(%esp) -c01071bc: e8 16 91 ff ff call c01002d7 +c0106f78: c7 04 24 2c b7 10 c0 movl $0xc010b72c,(%esp) +c0106f7f: e8 f4 93 ff ff call c0100378 for (i=0;i +c0106f84: c7 45 ec 00 00 00 00 movl $0x0,-0x14(%ebp) +c0106f8b: e9 a2 00 00 00 jmp c0107032 check_rp[i] = alloc_page();// 分配页面 -c01071cd: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c01071d4: e8 80 c5 ff ff call c0103759 -c01071d9: 8b 55 ec mov -0x14(%ebp),%edx -c01071dc: 89 04 95 e0 e0 12 c0 mov %eax,-0x3fed1f20(,%edx,4) +c0106f90: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c0106f97: e8 3f e0 ff ff call c0104fdb +c0106f9c: 8b 55 ec mov -0x14(%ebp),%edx +c0106f9f: 89 04 95 2c c1 12 c0 mov %eax,-0x3fed3ed4(,%edx,4) assert(check_rp[i] != NULL );// 断言分配页面成功 -c01071e3: 8b 45 ec mov -0x14(%ebp),%eax -c01071e6: 8b 04 85 e0 e0 12 c0 mov -0x3fed1f20(,%eax,4),%eax -c01071ed: 85 c0 test %eax,%eax -c01071ef: 75 24 jne c0107215 -c01071f1: c7 44 24 0c 40 bc 10 movl $0xc010bc40,0xc(%esp) -c01071f8: c0 -c01071f9: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0107200: c0 -c0107201: c7 44 24 04 23 01 00 movl $0x123,0x4(%esp) -c0107208: 00 -c0107209: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0107210: e8 2e 92 ff ff call c0100443 <__panic> +c0106fa6: 8b 45 ec mov -0x14(%ebp),%eax +c0106fa9: 8b 04 85 2c c1 12 c0 mov -0x3fed3ed4(,%eax,4),%eax +c0106fb0: 85 c0 test %eax,%eax +c0106fb2: 75 24 jne c0106fd8 +c0106fb4: c7 44 24 0c 50 b7 10 movl $0xc010b750,0xc(%esp) +c0106fbb: c0 +c0106fbc: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0106fc3: c0 +c0106fc4: c7 44 24 04 23 01 00 movl $0x123,0x4(%esp) +c0106fcb: 00 +c0106fcc: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0106fd3: e8 6d 9c ff ff call c0100c45 <__panic> assert(!PageProperty(check_rp[i]));// 断言页面属性无效 -c0107215: 8b 45 ec mov -0x14(%ebp),%eax -c0107218: 8b 04 85 e0 e0 12 c0 mov -0x3fed1f20(,%eax,4),%eax -c010721f: 83 c0 04 add $0x4,%eax -c0107222: c7 45 b4 01 00 00 00 movl $0x1,-0x4c(%ebp) -c0107229: 89 45 b0 mov %eax,-0x50(%ebp) +c0106fd8: 8b 45 ec mov -0x14(%ebp),%eax +c0106fdb: 8b 04 85 2c c1 12 c0 mov -0x3fed3ed4(,%eax,4),%eax +c0106fe2: 83 c0 04 add $0x4,%eax +c0106fe5: c7 45 b4 01 00 00 00 movl $0x1,-0x4c(%ebp) +c0106fec: 89 45 b0 mov %eax,-0x50(%ebp) asm volatile ("btl %2, %1; sbbl %0,%0" : "=r" (oldbit) : "m" (*(volatile long *)addr), "Ir" (nr)); -c010722c: 8b 45 b0 mov -0x50(%ebp),%eax -c010722f: 8b 55 b4 mov -0x4c(%ebp),%edx -c0107232: 0f a3 10 bt %edx,(%eax) -c0107235: 19 c0 sbb %eax,%eax -c0107237: 89 45 ac mov %eax,-0x54(%ebp) +c0106fef: 8b 45 b0 mov -0x50(%ebp),%eax +c0106ff2: 8b 55 b4 mov -0x4c(%ebp),%edx +c0106ff5: 0f a3 10 bt %edx,(%eax) +c0106ff8: 19 c0 sbb %eax,%eax +c0106ffa: 89 45 ac mov %eax,-0x54(%ebp) return oldbit != 0; -c010723a: 83 7d ac 00 cmpl $0x0,-0x54(%ebp) -c010723e: 0f 95 c0 setne %al -c0107241: 0f b6 c0 movzbl %al,%eax -c0107244: 85 c0 test %eax,%eax -c0107246: 74 24 je c010726c -c0107248: c7 44 24 0c 54 bc 10 movl $0xc010bc54,0xc(%esp) -c010724f: c0 -c0107250: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0107257: c0 -c0107258: c7 44 24 04 24 01 00 movl $0x124,0x4(%esp) -c010725f: 00 -c0107260: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0107267: e8 d7 91 ff ff call c0100443 <__panic> +c0106ffd: 83 7d ac 00 cmpl $0x0,-0x54(%ebp) +c0107001: 0f 95 c0 setne %al +c0107004: 0f b6 c0 movzbl %al,%eax +c0107007: 85 c0 test %eax,%eax +c0107009: 74 24 je c010702f +c010700b: c7 44 24 0c 64 b7 10 movl $0xc010b764,0xc(%esp) +c0107012: c0 +c0107013: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c010701a: c0 +c010701b: c7 44 24 04 24 01 00 movl $0x124,0x4(%esp) +c0107022: 00 +c0107023: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c010702a: e8 16 9c ff ff call c0100c45 <__panic> for (i=0;i +c010702f: ff 45 ec incl -0x14(%ebp) +c0107032: 83 7d ec 03 cmpl $0x3,-0x14(%ebp) +c0107036: 0f 8e 54 ff ff ff jle c0106f90 } list_entry_t free_list_store = free_list;// 保存当前空闲列表 -c0107279: a1 a4 e1 12 c0 mov 0xc012e1a4,%eax -c010727e: 8b 15 a8 e1 12 c0 mov 0xc012e1a8,%edx -c0107284: 89 45 98 mov %eax,-0x68(%ebp) -c0107287: 89 55 9c mov %edx,-0x64(%ebp) -c010728a: c7 45 a4 a4 e1 12 c0 movl $0xc012e1a4,-0x5c(%ebp) +c010703c: a1 e4 bf 12 c0 mov 0xc012bfe4,%eax +c0107041: 8b 15 e8 bf 12 c0 mov 0xc012bfe8,%edx +c0107047: 89 45 98 mov %eax,-0x68(%ebp) +c010704a: 89 55 9c mov %edx,-0x64(%ebp) +c010704d: c7 45 a4 e4 bf 12 c0 movl $0xc012bfe4,-0x5c(%ebp) elm->prev = elm->next = elm; -c0107291: 8b 45 a4 mov -0x5c(%ebp),%eax -c0107294: 8b 55 a4 mov -0x5c(%ebp),%edx -c0107297: 89 50 04 mov %edx,0x4(%eax) -c010729a: 8b 45 a4 mov -0x5c(%ebp),%eax -c010729d: 8b 50 04 mov 0x4(%eax),%edx -c01072a0: 8b 45 a4 mov -0x5c(%ebp),%eax -c01072a3: 89 10 mov %edx,(%eax) -} -c01072a5: 90 nop -c01072a6: c7 45 a8 a4 e1 12 c0 movl $0xc012e1a4,-0x58(%ebp) +c0107054: 8b 45 a4 mov -0x5c(%ebp),%eax +c0107057: 8b 55 a4 mov -0x5c(%ebp),%edx +c010705a: 89 50 04 mov %edx,0x4(%eax) +c010705d: 8b 45 a4 mov -0x5c(%ebp),%eax +c0107060: 8b 50 04 mov 0x4(%eax),%edx +c0107063: 8b 45 a4 mov -0x5c(%ebp),%eax +c0107066: 89 10 mov %edx,(%eax) +} +c0107068: 90 nop +c0107069: c7 45 a8 e4 bf 12 c0 movl $0xc012bfe4,-0x58(%ebp) return list->next == list; -c01072ad: 8b 45 a8 mov -0x58(%ebp),%eax -c01072b0: 8b 40 04 mov 0x4(%eax),%eax -c01072b3: 39 45 a8 cmp %eax,-0x58(%ebp) -c01072b6: 0f 94 c0 sete %al -c01072b9: 0f b6 c0 movzbl %al,%eax +c0107070: 8b 45 a8 mov -0x58(%ebp),%eax +c0107073: 8b 40 04 mov 0x4(%eax),%eax +c0107076: 39 45 a8 cmp %eax,-0x58(%ebp) +c0107079: 0f 94 c0 sete %al +c010707c: 0f b6 c0 movzbl %al,%eax list_init(&free_list);// 初始化空闲列表 assert(list_empty(&free_list));// 断言空闲列表为空 -c01072bc: 85 c0 test %eax,%eax -c01072be: 75 24 jne c01072e4 -c01072c0: c7 44 24 0c 6f bc 10 movl $0xc010bc6f,0xc(%esp) -c01072c7: c0 -c01072c8: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c01072cf: c0 -c01072d0: c7 44 24 04 28 01 00 movl $0x128,0x4(%esp) -c01072d7: 00 -c01072d8: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c01072df: e8 5f 91 ff ff call c0100443 <__panic> +c010707f: 85 c0 test %eax,%eax +c0107081: 75 24 jne c01070a7 +c0107083: c7 44 24 0c 7f b7 10 movl $0xc010b77f,0xc(%esp) +c010708a: c0 +c010708b: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0107092: c0 +c0107093: c7 44 24 04 28 01 00 movl $0x128,0x4(%esp) +c010709a: 00 +c010709b: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c01070a2: e8 9e 9b ff ff call c0100c45 <__panic> //assert(alloc_page() == NULL); unsigned int nr_free_store = nr_free;// 保存当前空闲页面数 -c01072e4: a1 ac e1 12 c0 mov 0xc012e1ac,%eax -c01072e9: 89 45 d4 mov %eax,-0x2c(%ebp) +c01070a7: a1 ec bf 12 c0 mov 0xc012bfec,%eax +c01070ac: 89 45 d4 mov %eax,-0x2c(%ebp) nr_free = 0;// 将空闲页面数设为 0 -c01072ec: c7 05 ac e1 12 c0 00 movl $0x0,0xc012e1ac -c01072f3: 00 00 00 +c01070af: c7 05 ec bf 12 c0 00 movl $0x0,0xc012bfec +c01070b6: 00 00 00 for (i=0;i +c01070b9: c7 45 ec 00 00 00 00 movl $0x0,-0x14(%ebp) +c01070c0: eb 1d jmp c01070df free_pages(check_rp[i],1);// 释放页面 -c01072ff: 8b 45 ec mov -0x14(%ebp),%eax -c0107302: 8b 04 85 e0 e0 12 c0 mov -0x3fed1f20(,%eax,4),%eax -c0107309: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c0107310: 00 -c0107311: 89 04 24 mov %eax,(%esp) -c0107314: e8 af c4 ff ff call c01037c8 +c01070c2: 8b 45 ec mov -0x14(%ebp),%eax +c01070c5: 8b 04 85 2c c1 12 c0 mov -0x3fed3ed4(,%eax,4),%eax +c01070cc: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c01070d3: 00 +c01070d4: 89 04 24 mov %eax,(%esp) +c01070d7: e8 6c df ff ff call c0105048 for (i=0;i +c01070dc: ff 45 ec incl -0x14(%ebp) +c01070df: 83 7d ec 03 cmpl $0x3,-0x14(%ebp) +c01070e3: 7e dd jle c01070c2 } assert(nr_free==CHECK_VALID_PHY_PAGE_NUM);// 断言释放的页面数正确 -c0107322: a1 ac e1 12 c0 mov 0xc012e1ac,%eax -c0107327: 83 f8 04 cmp $0x4,%eax -c010732a: 74 24 je c0107350 -c010732c: c7 44 24 0c 88 bc 10 movl $0xc010bc88,0xc(%esp) -c0107333: c0 -c0107334: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c010733b: c0 -c010733c: c7 44 24 04 31 01 00 movl $0x131,0x4(%esp) -c0107343: 00 -c0107344: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c010734b: e8 f3 90 ff ff call c0100443 <__panic> +c01070e5: a1 ec bf 12 c0 mov 0xc012bfec,%eax +c01070ea: 83 f8 04 cmp $0x4,%eax +c01070ed: 74 24 je c0107113 +c01070ef: c7 44 24 0c 98 b7 10 movl $0xc010b798,0xc(%esp) +c01070f6: c0 +c01070f7: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c01070fe: c0 +c01070ff: c7 44 24 04 31 01 00 movl $0x131,0x4(%esp) +c0107106: 00 +c0107107: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c010710e: e8 32 9b ff ff call c0100c45 <__panic> cprintf("set up init env for check_swap begin!\n");// 打印设置初始环境开始的信息 -c0107350: c7 04 24 ac bc 10 c0 movl $0xc010bcac,(%esp) -c0107357: e8 7b 8f ff ff call c01002d7 +c0107113: c7 04 24 bc b7 10 c0 movl $0xc010b7bc,(%esp) +c010711a: e8 59 92 ff ff call c0100378 //setup initial vir_page<->phy_page environment for page relpacement algorithm // 设置初始虚拟到物理页面环境,用于页面替换算法 pgfault_num=0;// 初始化页面故障数 -c010735c: c7 05 0c c0 12 c0 00 movl $0x0,0xc012c00c -c0107363: 00 00 00 +c010711f: c7 05 70 c1 12 c0 00 movl $0x0,0xc012c170 +c0107126: 00 00 00 check_content_set();// 设置检查内容 -c0107366: e8 26 fa ff ff call c0106d91 +c0107129: e8 26 fa ff ff call c0106b54 assert( nr_free == 0); // 断言空闲页面数为 0 -c010736b: a1 ac e1 12 c0 mov 0xc012e1ac,%eax -c0107370: 85 c0 test %eax,%eax -c0107372: 74 24 je c0107398 -c0107374: c7 44 24 0c d3 bc 10 movl $0xc010bcd3,0xc(%esp) -c010737b: c0 -c010737c: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0107383: c0 -c0107384: c7 44 24 04 3a 01 00 movl $0x13a,0x4(%esp) -c010738b: 00 -c010738c: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0107393: e8 ab 90 ff ff call c0100443 <__panic> +c010712e: a1 ec bf 12 c0 mov 0xc012bfec,%eax +c0107133: 85 c0 test %eax,%eax +c0107135: 74 24 je c010715b +c0107137: c7 44 24 0c e3 b7 10 movl $0xc010b7e3,0xc(%esp) +c010713e: c0 +c010713f: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0107146: c0 +c0107147: c7 44 24 04 3a 01 00 movl $0x13a,0x4(%esp) +c010714e: 00 +c010714f: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0107156: e8 ea 9a ff ff call c0100c45 <__panic> for(i = 0; i +c010715b: c7 45 ec 00 00 00 00 movl $0x0,-0x14(%ebp) +c0107162: eb 25 jmp c0107189 swap_out_seq_no[i]=swap_in_seq_no[i]=-1;// 初始化页面替换序列号 -c01073a1: 8b 45 ec mov -0x14(%ebp),%eax -c01073a4: c7 04 85 00 e1 12 c0 movl $0xffffffff,-0x3fed1f00(,%eax,4) -c01073ab: ff ff ff ff -c01073af: 8b 45 ec mov -0x14(%ebp),%eax -c01073b2: 8b 14 85 00 e1 12 c0 mov -0x3fed1f00(,%eax,4),%edx -c01073b9: 8b 45 ec mov -0x14(%ebp),%eax -c01073bc: 89 14 85 40 e1 12 c0 mov %edx,-0x3fed1ec0(,%eax,4) +c0107164: 8b 45 ec mov -0x14(%ebp),%eax +c0107167: c7 04 85 c0 c0 12 c0 movl $0xffffffff,-0x3fed3f40(,%eax,4) +c010716e: ff ff ff ff +c0107172: 8b 45 ec mov -0x14(%ebp),%eax +c0107175: 8b 14 85 c0 c0 12 c0 mov -0x3fed3f40(,%eax,4),%edx +c010717c: 8b 45 ec mov -0x14(%ebp),%eax +c010717f: 89 14 85 00 c1 12 c0 mov %edx,-0x3fed3f00(,%eax,4) for(i = 0; i +c0107186: ff 45 ec incl -0x14(%ebp) +c0107189: 83 7d ec 09 cmpl $0x9,-0x14(%ebp) +c010718d: 7e d5 jle c0107164 for (i= 0;i +c010718f: c7 45 ec 00 00 00 00 movl $0x0,-0x14(%ebp) +c0107196: e9 e8 00 00 00 jmp c0107283 check_ptep[i]=0; -c01073d8: 8b 45 ec mov -0x14(%ebp),%eax -c01073db: c7 04 85 94 e1 12 c0 movl $0x0,-0x3fed1e6c(,%eax,4) -c01073e2: 00 00 00 00 +c010719b: 8b 45 ec mov -0x14(%ebp),%eax +c010719e: c7 04 85 3c c1 12 c0 movl $0x0,-0x3fed3ec4(,%eax,4) +c01071a5: 00 00 00 00 check_ptep[i] = get_pte(pgdir, (i+1)*0x1000, 0);// 获取页表项 -c01073e6: 8b 45 ec mov -0x14(%ebp),%eax -c01073e9: 40 inc %eax -c01073ea: c1 e0 0c shl $0xc,%eax -c01073ed: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c01073f4: 00 -c01073f5: 89 44 24 04 mov %eax,0x4(%esp) -c01073f9: 8b 45 e0 mov -0x20(%ebp),%eax -c01073fc: 89 04 24 mov %eax,(%esp) -c01073ff: e8 25 ca ff ff call c0103e29 -c0107404: 8b 55 ec mov -0x14(%ebp),%edx -c0107407: 89 04 95 94 e1 12 c0 mov %eax,-0x3fed1e6c(,%edx,4) +c01071a9: 8b 45 ec mov -0x14(%ebp),%eax +c01071ac: 40 inc %eax +c01071ad: c1 e0 0c shl $0xc,%eax +c01071b0: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c01071b7: 00 +c01071b8: 89 44 24 04 mov %eax,0x4(%esp) +c01071bc: 8b 45 e0 mov -0x20(%ebp),%eax +c01071bf: 89 04 24 mov %eax,(%esp) +c01071c2: e8 cf e4 ff ff call c0105696 +c01071c7: 8b 55 ec mov -0x14(%ebp),%edx +c01071ca: 89 04 95 3c c1 12 c0 mov %eax,-0x3fed3ec4(,%edx,4) //cprintf("i %d, check_ptep addr %x, value %x\n", i, check_ptep[i], *check_ptep[i]); assert(check_ptep[i] != NULL);// 断言获取页表项成功 -c010740e: 8b 45 ec mov -0x14(%ebp),%eax -c0107411: 8b 04 85 94 e1 12 c0 mov -0x3fed1e6c(,%eax,4),%eax -c0107418: 85 c0 test %eax,%eax -c010741a: 75 24 jne c0107440 -c010741c: c7 44 24 0c e0 bc 10 movl $0xc010bce0,0xc(%esp) -c0107423: c0 -c0107424: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c010742b: c0 -c010742c: c7 44 24 04 42 01 00 movl $0x142,0x4(%esp) -c0107433: 00 -c0107434: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c010743b: e8 03 90 ff ff call c0100443 <__panic> +c01071d1: 8b 45 ec mov -0x14(%ebp),%eax +c01071d4: 8b 04 85 3c c1 12 c0 mov -0x3fed3ec4(,%eax,4),%eax +c01071db: 85 c0 test %eax,%eax +c01071dd: 75 24 jne c0107203 +c01071df: c7 44 24 0c f0 b7 10 movl $0xc010b7f0,0xc(%esp) +c01071e6: c0 +c01071e7: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c01071ee: c0 +c01071ef: c7 44 24 04 42 01 00 movl $0x142,0x4(%esp) +c01071f6: 00 +c01071f7: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c01071fe: e8 42 9a ff ff call c0100c45 <__panic> assert(pte2page(*check_ptep[i]) == check_rp[i]); // 断言页表项对应的页面正确 -c0107440: 8b 45 ec mov -0x14(%ebp),%eax -c0107443: 8b 04 85 94 e1 12 c0 mov -0x3fed1e6c(,%eax,4),%eax -c010744a: 8b 00 mov (%eax),%eax -c010744c: 89 04 24 mov %eax,(%esp) -c010744f: e8 8b f5 ff ff call c01069df -c0107454: 8b 55 ec mov -0x14(%ebp),%edx -c0107457: 8b 14 95 e0 e0 12 c0 mov -0x3fed1f20(,%edx,4),%edx -c010745e: 39 d0 cmp %edx,%eax -c0107460: 74 24 je c0107486 -c0107462: c7 44 24 0c f8 bc 10 movl $0xc010bcf8,0xc(%esp) -c0107469: c0 -c010746a: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c0107471: c0 -c0107472: c7 44 24 04 43 01 00 movl $0x143,0x4(%esp) -c0107479: 00 -c010747a: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0107481: e8 bd 8f ff ff call c0100443 <__panic> +c0107203: 8b 45 ec mov -0x14(%ebp),%eax +c0107206: 8b 04 85 3c c1 12 c0 mov -0x3fed3ec4(,%eax,4),%eax +c010720d: 8b 00 mov (%eax),%eax +c010720f: 89 04 24 mov %eax,(%esp) +c0107212: e8 97 f5 ff ff call c01067ae +c0107217: 8b 55 ec mov -0x14(%ebp),%edx +c010721a: 8b 14 95 2c c1 12 c0 mov -0x3fed3ed4(,%edx,4),%edx +c0107221: 39 d0 cmp %edx,%eax +c0107223: 74 24 je c0107249 +c0107225: c7 44 24 0c 08 b8 10 movl $0xc010b808,0xc(%esp) +c010722c: c0 +c010722d: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c0107234: c0 +c0107235: c7 44 24 04 43 01 00 movl $0x143,0x4(%esp) +c010723c: 00 +c010723d: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c0107244: e8 fc 99 ff ff call c0100c45 <__panic> assert((*check_ptep[i] & PTE_P)); // 断言页表项有效 -c0107486: 8b 45 ec mov -0x14(%ebp),%eax -c0107489: 8b 04 85 94 e1 12 c0 mov -0x3fed1e6c(,%eax,4),%eax -c0107490: 8b 00 mov (%eax),%eax -c0107492: 83 e0 01 and $0x1,%eax -c0107495: 85 c0 test %eax,%eax -c0107497: 75 24 jne c01074bd -c0107499: c7 44 24 0c 20 bd 10 movl $0xc010bd20,0xc(%esp) -c01074a0: c0 -c01074a1: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c01074a8: c0 -c01074a9: c7 44 24 04 44 01 00 movl $0x144,0x4(%esp) -c01074b0: 00 -c01074b1: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c01074b8: e8 86 8f ff ff call c0100443 <__panic> +c0107249: 8b 45 ec mov -0x14(%ebp),%eax +c010724c: 8b 04 85 3c c1 12 c0 mov -0x3fed3ec4(,%eax,4),%eax +c0107253: 8b 00 mov (%eax),%eax +c0107255: 83 e0 01 and $0x1,%eax +c0107258: 85 c0 test %eax,%eax +c010725a: 75 24 jne c0107280 +c010725c: c7 44 24 0c 30 b8 10 movl $0xc010b830,0xc(%esp) +c0107263: c0 +c0107264: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c010726b: c0 +c010726c: c7 44 24 04 44 01 00 movl $0x144,0x4(%esp) +c0107273: 00 +c0107274: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c010727b: e8 c5 99 ff ff call c0100c45 <__panic> for (i= 0;i +c0107280: ff 45 ec incl -0x14(%ebp) +c0107283: 83 7d ec 03 cmpl $0x3,-0x14(%ebp) +c0107287: 0f 8e 0e ff ff ff jle c010719b } cprintf("set up init env for check_swap over!\n");// 打印设置初始环境完成的信息 -c01074ca: c7 04 24 3c bd 10 c0 movl $0xc010bd3c,(%esp) -c01074d1: e8 01 8e ff ff call c01002d7 +c010728d: c7 04 24 4c b8 10 c0 movl $0xc010b84c,(%esp) +c0107294: e8 df 90 ff ff call c0100378 // now access the virt pages to test page relpacement algorithm ret=check_content_access(); -c01074d6: e8 6f fa ff ff call c0106f4a -c01074db: 89 45 d0 mov %eax,-0x30(%ebp) +c0107299: e8 71 fa ff ff call c0106d0f +c010729e: 89 45 d0 mov %eax,-0x30(%ebp) assert(ret==0); // 断言访问检查成功 -c01074de: 83 7d d0 00 cmpl $0x0,-0x30(%ebp) -c01074e2: 74 24 je c0107508 -c01074e4: c7 44 24 0c 62 bd 10 movl $0xc010bd62,0xc(%esp) -c01074eb: c0 -c01074ec: c7 44 24 08 4a ba 10 movl $0xc010ba4a,0x8(%esp) -c01074f3: c0 -c01074f4: c7 44 24 04 49 01 00 movl $0x149,0x4(%esp) -c01074fb: 00 -c01074fc: c7 04 24 e4 b9 10 c0 movl $0xc010b9e4,(%esp) -c0107503: e8 3b 8f ff ff call c0100443 <__panic> +c01072a1: 83 7d d0 00 cmpl $0x0,-0x30(%ebp) +c01072a5: 74 24 je c01072cb +c01072a7: c7 44 24 0c 72 b8 10 movl $0xc010b872,0xc(%esp) +c01072ae: c0 +c01072af: c7 44 24 08 5a b5 10 movl $0xc010b55a,0x8(%esp) +c01072b6: c0 +c01072b7: c7 44 24 04 49 01 00 movl $0x149,0x4(%esp) +c01072be: 00 +c01072bf: c7 04 24 f4 b4 10 c0 movl $0xc010b4f4,(%esp) +c01072c6: e8 7a 99 ff ff call c0100c45 <__panic> //restore kernel mem env for (i=0;i +c01072cb: c7 45 ec 00 00 00 00 movl $0x0,-0x14(%ebp) +c01072d2: eb 1d jmp c01072f1 free_pages(check_rp[i],1); -c0107511: 8b 45 ec mov -0x14(%ebp),%eax -c0107514: 8b 04 85 e0 e0 12 c0 mov -0x3fed1f20(,%eax,4),%eax -c010751b: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c0107522: 00 -c0107523: 89 04 24 mov %eax,(%esp) -c0107526: e8 9d c2 ff ff call c01037c8 +c01072d4: 8b 45 ec mov -0x14(%ebp),%eax +c01072d7: 8b 04 85 2c c1 12 c0 mov -0x3fed3ed4(,%eax,4),%eax +c01072de: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) +c01072e5: 00 +c01072e6: 89 04 24 mov %eax,(%esp) +c01072e9: e8 5a dd ff ff call c0105048 for (i=0;i +c01072ee: ff 45 ec incl -0x14(%ebp) +c01072f1: 83 7d ec 03 cmpl $0x3,-0x14(%ebp) +c01072f5: 7e dd jle c01072d4 } - //free_page(pte2page(*temp_ptep)); - - mm_destroy(mm);// 销毁内存管理结构 -c0107534: 8b 45 e4 mov -0x1c(%ebp),%eax -c0107537: 89 04 24 mov %eax,(%esp) -c010753a: e8 ef e2 ff ff call c010582e - - nr_free = nr_free_store;// 恢复空闲页面数 -c010753f: 8b 45 d4 mov -0x2c(%ebp),%eax -c0107542: a3 ac e1 12 c0 mov %eax,0xc012e1ac - free_list = free_list_store;// 恢复空闲列表 -c0107547: 8b 45 98 mov -0x68(%ebp),%eax -c010754a: 8b 55 9c mov -0x64(%ebp),%edx -c010754d: a3 a4 e1 12 c0 mov %eax,0xc012e1a4 -c0107552: 89 15 a8 e1 12 c0 mov %edx,0xc012e1a8 + //free_page(pte2page(*temp_ptep)); + + mm_destroy(mm);// 销毁内存管理结构 +c01072f7: 8b 45 e4 mov -0x1c(%ebp),%eax +c01072fa: 89 04 24 mov %eax,(%esp) +c01072fd: e8 7f 09 00 00 call c0107c81 + + nr_free = nr_free_store;// 恢复空闲页面数 +c0107302: 8b 45 d4 mov -0x2c(%ebp),%eax +c0107305: a3 ec bf 12 c0 mov %eax,0xc012bfec + free_list = free_list_store;// 恢复空闲列表 +c010730a: 8b 45 98 mov -0x68(%ebp),%eax +c010730d: 8b 55 9c mov -0x64(%ebp),%edx +c0107310: a3 e4 bf 12 c0 mov %eax,0xc012bfe4 +c0107315: 89 15 e8 bf 12 c0 mov %edx,0xc012bfe8 + + + le = &free_list; +c010731b: c7 45 e8 e4 bf 12 c0 movl $0xc012bfe4,-0x18(%ebp) + while ((le = list_next(le)) != &free_list) { +c0107322: eb 1c jmp c0107340 + struct Page *p = le2page(le, page_link);// 将链表条目转换为页面结构 +c0107324: 8b 45 e8 mov -0x18(%ebp),%eax +c0107327: 83 e8 0c sub $0xc,%eax +c010732a: 89 45 cc mov %eax,-0x34(%ebp) + count --, total -= p->property;// 更新页面数量和属性总和 +c010732d: ff 4d f4 decl -0xc(%ebp) +c0107330: 8b 55 f0 mov -0x10(%ebp),%edx +c0107333: 8b 45 cc mov -0x34(%ebp),%eax +c0107336: 8b 48 08 mov 0x8(%eax),%ecx +c0107339: 89 d0 mov %edx,%eax +c010733b: 29 c8 sub %ecx,%eax +c010733d: 89 45 f0 mov %eax,-0x10(%ebp) +c0107340: 8b 45 e8 mov -0x18(%ebp),%eax +c0107343: 89 45 a0 mov %eax,-0x60(%ebp) + return listelm->next; +c0107346: 8b 45 a0 mov -0x60(%ebp),%eax +c0107349: 8b 40 04 mov 0x4(%eax),%eax + while ((le = list_next(le)) != &free_list) { +c010734c: 89 45 e8 mov %eax,-0x18(%ebp) +c010734f: 81 7d e8 e4 bf 12 c0 cmpl $0xc012bfe4,-0x18(%ebp) +c0107356: 75 cc jne c0107324 + } + cprintf("count is %d, total is %d\n",count,total);// 打印恢复后的状态 +c0107358: 8b 45 f0 mov -0x10(%ebp),%eax +c010735b: 89 44 24 08 mov %eax,0x8(%esp) +c010735f: 8b 45 f4 mov -0xc(%ebp),%eax +c0107362: 89 44 24 04 mov %eax,0x4(%esp) +c0107366: c7 04 24 79 b8 10 c0 movl $0xc010b879,(%esp) +c010736d: e8 06 90 ff ff call c0100378 + //assert(count == 0); + + cprintf("check_swap() succeeded!\n");// 打印检查成功的信息 +c0107372: c7 04 24 93 b8 10 c0 movl $0xc010b893,(%esp) +c0107379: e8 fa 8f ff ff call c0100378 +} +c010737e: 90 nop +c010737f: 89 ec mov %ebp,%esp +c0107381: 5d pop %ebp +c0107382: c3 ret + +c0107383 <_fifo_init_mm>: + * (2) _fifo_init_mm: init pra_list_head and let mm->sm_priv point to the addr of pra_list_head. + * Now, From the memory control struct mm_struct, we can access FIFO PRA + */ +static int +_fifo_init_mm(struct mm_struct *mm) +{ +c0107383: 55 push %ebp +c0107384: 89 e5 mov %esp,%ebp +c0107386: 83 ec 10 sub $0x10,%esp +c0107389: c7 45 fc 64 c1 12 c0 movl $0xc012c164,-0x4(%ebp) + elm->prev = elm->next = elm; +c0107390: 8b 45 fc mov -0x4(%ebp),%eax +c0107393: 8b 55 fc mov -0x4(%ebp),%edx +c0107396: 89 50 04 mov %edx,0x4(%eax) +c0107399: 8b 45 fc mov -0x4(%ebp),%eax +c010739c: 8b 50 04 mov 0x4(%eax),%edx +c010739f: 8b 45 fc mov -0x4(%ebp),%eax +c01073a2: 89 10 mov %edx,(%eax) +} +c01073a4: 90 nop + //初始化一个链表头 pra_list_head + list_init(&pra_list_head); + //将 mm 结构中的 sm_priv 字段指向这个链表头 + mm->sm_priv = &pra_list_head; +c01073a5: 8b 45 08 mov 0x8(%ebp),%eax +c01073a8: c7 40 14 64 c1 12 c0 movl $0xc012c164,0x14(%eax) + //cprintf(" mm->sm_priv %x in fifo_init_mm\n",mm->sm_priv); + //返回 0 表示成功 + return 0; +c01073af: b8 00 00 00 00 mov $0x0,%eax +} +c01073b4: 89 ec mov %ebp,%esp +c01073b6: 5d pop %ebp +c01073b7: c3 ret + +c01073b8 <_fifo_map_swappable>: +/* + * (3)_fifo_map_swappable: According FIFO PRA, we should link the most recent arrival page at the back of pra_list_head qeueue + */ +static int +_fifo_map_swappable(struct mm_struct *mm, uintptr_t addr, struct Page *page, int swap_in) +{ +c01073b8: 55 push %ebp +c01073b9: 89 e5 mov %esp,%ebp +c01073bb: 83 ec 48 sub $0x48,%esp + //获取 mm_struct 结构中的 sm_priv 指针, + //并将其转换为 list_entry_t 类型的链表头指针 head + list_entry_t *head=(list_entry_t*) mm->sm_priv; +c01073be: 8b 45 08 mov 0x8(%ebp),%eax +c01073c1: 8b 40 14 mov 0x14(%eax),%eax +c01073c4: 89 45 f4 mov %eax,-0xc(%ebp) + list_entry_t *entry=&(page->pra_page_link); +c01073c7: 8b 45 10 mov 0x10(%ebp),%eax +c01073ca: 83 c0 14 add $0x14,%eax +c01073cd: 89 45 f0 mov %eax,-0x10(%ebp) + + assert(entry != NULL && head != NULL); +c01073d0: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) +c01073d4: 74 06 je c01073dc <_fifo_map_swappable+0x24> +c01073d6: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c01073da: 75 24 jne c0107400 <_fifo_map_swappable+0x48> +c01073dc: c7 44 24 0c ac b8 10 movl $0xc010b8ac,0xc(%esp) +c01073e3: c0 +c01073e4: c7 44 24 08 ca b8 10 movl $0xc010b8ca,0x8(%esp) +c01073eb: c0 +c01073ec: c7 44 24 04 37 00 00 movl $0x37,0x4(%esp) +c01073f3: 00 +c01073f4: c7 04 24 df b8 10 c0 movl $0xc010b8df,(%esp) +c01073fb: e8 45 98 ff ff call c0100c45 <__panic> +c0107400: 8b 45 f4 mov -0xc(%ebp),%eax +c0107403: 89 45 ec mov %eax,-0x14(%ebp) +c0107406: 8b 45 f0 mov -0x10(%ebp),%eax +c0107409: 89 45 e8 mov %eax,-0x18(%ebp) +c010740c: 8b 45 ec mov -0x14(%ebp),%eax +c010740f: 89 45 e4 mov %eax,-0x1c(%ebp) +c0107412: 8b 45 e8 mov -0x18(%ebp),%eax +c0107415: 89 45 e0 mov %eax,-0x20(%ebp) + __list_add(elm, listelm, listelm->next); +c0107418: 8b 45 e4 mov -0x1c(%ebp),%eax +c010741b: 8b 40 04 mov 0x4(%eax),%eax +c010741e: 8b 55 e0 mov -0x20(%ebp),%edx +c0107421: 89 55 dc mov %edx,-0x24(%ebp) +c0107424: 8b 55 e4 mov -0x1c(%ebp),%edx +c0107427: 89 55 d8 mov %edx,-0x28(%ebp) +c010742a: 89 45 d4 mov %eax,-0x2c(%ebp) + prev->next = next->prev = elm; +c010742d: 8b 45 d4 mov -0x2c(%ebp),%eax +c0107430: 8b 55 dc mov -0x24(%ebp),%edx +c0107433: 89 10 mov %edx,(%eax) +c0107435: 8b 45 d4 mov -0x2c(%ebp),%eax +c0107438: 8b 10 mov (%eax),%edx +c010743a: 8b 45 d8 mov -0x28(%ebp),%eax +c010743d: 89 50 04 mov %edx,0x4(%eax) + elm->next = next; +c0107440: 8b 45 dc mov -0x24(%ebp),%eax +c0107443: 8b 55 d4 mov -0x2c(%ebp),%edx +c0107446: 89 50 04 mov %edx,0x4(%eax) + elm->prev = prev; +c0107449: 8b 45 dc mov -0x24(%ebp),%eax +c010744c: 8b 55 d8 mov -0x28(%ebp),%edx +c010744f: 89 10 mov %edx,(%eax) +} +c0107451: 90 nop +} +c0107452: 90 nop +} +c0107453: 90 nop + //record the page access situlation + /*LAB3 EXERCISE 2: YOUR CODE*/ + //(1)link the most recent arrival page at the back of the pra_list_head qeueue. + //将最近到达的页面链接到 pra_list_head 队列的末尾 + list_add(head, entry); + return 0; +c0107454: b8 00 00 00 00 mov $0x0,%eax +} +c0107459: 89 ec mov %ebp,%esp +c010745b: 5d pop %ebp +c010745c: c3 ret + +c010745d <_fifo_swap_out_victim>: + * + * @return 返回0表示成功,其他值表示失败。 + */ +static int +_fifo_swap_out_victim(struct mm_struct *mm, struct Page ** ptr_page, int in_tick) +{ +c010745d: 55 push %ebp +c010745e: 89 e5 mov %esp,%ebp +c0107460: 83 ec 38 sub $0x38,%esp + list_entry_t *head=(list_entry_t*) mm->sm_priv; +c0107463: 8b 45 08 mov 0x8(%ebp),%eax +c0107466: 8b 40 14 mov 0x14(%eax),%eax +c0107469: 89 45 f4 mov %eax,-0xc(%ebp) + assert(head != NULL); +c010746c: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0107470: 75 24 jne c0107496 <_fifo_swap_out_victim+0x39> +c0107472: c7 44 24 0c f3 b8 10 movl $0xc010b8f3,0xc(%esp) +c0107479: c0 +c010747a: c7 44 24 08 ca b8 10 movl $0xc010b8ca,0x8(%esp) +c0107481: c0 +c0107482: c7 44 24 04 50 00 00 movl $0x50,0x4(%esp) +c0107489: 00 +c010748a: c7 04 24 df b8 10 c0 movl $0xc010b8df,(%esp) +c0107491: e8 af 97 ff ff call c0100c45 <__panic> + assert(in_tick==0); +c0107496: 83 7d 10 00 cmpl $0x0,0x10(%ebp) +c010749a: 74 24 je c01074c0 <_fifo_swap_out_victim+0x63> +c010749c: c7 44 24 0c 00 b9 10 movl $0xc010b900,0xc(%esp) +c01074a3: c0 +c01074a4: c7 44 24 08 ca b8 10 movl $0xc010b8ca,0x8(%esp) +c01074ab: c0 +c01074ac: c7 44 24 04 51 00 00 movl $0x51,0x4(%esp) +c01074b3: 00 +c01074b4: c7 04 24 df b8 10 c0 movl $0xc010b8df,(%esp) +c01074bb: e8 85 97 ff ff call c0100c45 <__panic> + /* Select the victim */ + /*LAB3 EXERCISE 2: YOUR CODE*/ + //(1) unlink the earliest arrival page in front of pra_list_head qeueue + //(2) assign the value of *ptr_page to the addr of this page + //head->prev 获取链表中最先到达的页面 + list_entry_t *le = head->prev; +c01074c0: 8b 45 f4 mov -0xc(%ebp),%eax +c01074c3: 8b 00 mov (%eax),%eax +c01074c5: 89 45 f0 mov %eax,-0x10(%ebp) + assert(head!=le); +c01074c8: 8b 45 f4 mov -0xc(%ebp),%eax +c01074cb: 3b 45 f0 cmp -0x10(%ebp),%eax +c01074ce: 75 24 jne c01074f4 <_fifo_swap_out_victim+0x97> +c01074d0: c7 44 24 0c 0b b9 10 movl $0xc010b90b,0xc(%esp) +c01074d7: c0 +c01074d8: c7 44 24 08 ca b8 10 movl $0xc010b8ca,0x8(%esp) +c01074df: c0 +c01074e0: c7 44 24 04 58 00 00 movl $0x58,0x4(%esp) +c01074e7: 00 +c01074e8: c7 04 24 df b8 10 c0 movl $0xc010b8df,(%esp) +c01074ef: e8 51 97 ff ff call c0100c45 <__panic> + struct Page *p = le2page(le, pra_page_link); +c01074f4: 8b 45 f0 mov -0x10(%ebp),%eax +c01074f7: 83 e8 14 sub $0x14,%eax +c01074fa: 89 45 ec mov %eax,-0x14(%ebp) +c01074fd: 8b 45 f0 mov -0x10(%ebp),%eax +c0107500: 89 45 e8 mov %eax,-0x18(%ebp) + __list_del(listelm->prev, listelm->next); +c0107503: 8b 45 e8 mov -0x18(%ebp),%eax +c0107506: 8b 40 04 mov 0x4(%eax),%eax +c0107509: 8b 55 e8 mov -0x18(%ebp),%edx +c010750c: 8b 12 mov (%edx),%edx +c010750e: 89 55 e4 mov %edx,-0x1c(%ebp) +c0107511: 89 45 e0 mov %eax,-0x20(%ebp) + prev->next = next; +c0107514: 8b 45 e4 mov -0x1c(%ebp),%eax +c0107517: 8b 55 e0 mov -0x20(%ebp),%edx +c010751a: 89 50 04 mov %edx,0x4(%eax) + next->prev = prev; +c010751d: 8b 45 e0 mov -0x20(%ebp),%eax +c0107520: 8b 55 e4 mov -0x1c(%ebp),%edx +c0107523: 89 10 mov %edx,(%eax) +} +c0107525: 90 nop +} +c0107526: 90 nop + //使用 list_del 函数将该页面从链表中移除。 + list_del(le); + assert(p != NULL); +c0107527: 83 7d ec 00 cmpl $0x0,-0x14(%ebp) +c010752b: 75 24 jne c0107551 <_fifo_swap_out_victim+0xf4> +c010752d: c7 44 24 0c 14 b9 10 movl $0xc010b914,0xc(%esp) +c0107534: c0 +c0107535: c7 44 24 08 ca b8 10 movl $0xc010b8ca,0x8(%esp) +c010753c: c0 +c010753d: c7 44 24 04 5c 00 00 movl $0x5c,0x4(%esp) +c0107544: 00 +c0107545: c7 04 24 df b8 10 c0 movl $0xc010b8df,(%esp) +c010754c: e8 f4 96 ff ff call c0100c45 <__panic> + //将移除的页面指针赋值给 *ptr_page + *ptr_page = p; +c0107551: 8b 45 0c mov 0xc(%ebp),%eax +c0107554: 8b 55 ec mov -0x14(%ebp),%edx +c0107557: 89 10 mov %edx,(%eax) + + return 0; +c0107559: b8 00 00 00 00 mov $0x0,%eax +} +c010755e: 89 ec mov %ebp,%esp +c0107560: 5d pop %ebp +c0107561: c3 ret + +c0107562 <_fifo_check_swap>: + * + * 返回值: + * - 0: 表示所有检查均通过。 + */ +static int +_fifo_check_swap(void) { +c0107562: 55 push %ebp +c0107563: 89 e5 mov %esp,%ebp +c0107565: 83 ec 18 sub $0x18,%esp + // 写入虚拟页 c 并检查页面故障数 + cprintf("write Virt Page c in fifo_check_swap\n"); +c0107568: c7 04 24 20 b9 10 c0 movl $0xc010b920,(%esp) +c010756f: e8 04 8e ff ff call c0100378 + *(unsigned char *)0x3000 = 0x0c; +c0107574: b8 00 30 00 00 mov $0x3000,%eax +c0107579: c6 00 0c movb $0xc,(%eax) + assert(pgfault_num==4); +c010757c: a1 70 c1 12 c0 mov 0xc012c170,%eax +c0107581: 83 f8 04 cmp $0x4,%eax +c0107584: 74 24 je c01075aa <_fifo_check_swap+0x48> +c0107586: c7 44 24 0c 46 b9 10 movl $0xc010b946,0xc(%esp) +c010758d: c0 +c010758e: c7 44 24 08 ca b8 10 movl $0xc010b8ca,0x8(%esp) +c0107595: c0 +c0107596: c7 44 24 04 70 00 00 movl $0x70,0x4(%esp) +c010759d: 00 +c010759e: c7 04 24 df b8 10 c0 movl $0xc010b8df,(%esp) +c01075a5: e8 9b 96 ff ff call c0100c45 <__panic> + + // 写入虚拟页 a 并检查页面故障数 + cprintf("write Virt Page a in fifo_check_swap\n"); +c01075aa: c7 04 24 58 b9 10 c0 movl $0xc010b958,(%esp) +c01075b1: e8 c2 8d ff ff call c0100378 + *(unsigned char *)0x1000 = 0x0a; +c01075b6: b8 00 10 00 00 mov $0x1000,%eax +c01075bb: c6 00 0a movb $0xa,(%eax) + assert(pgfault_num==4); +c01075be: a1 70 c1 12 c0 mov 0xc012c170,%eax +c01075c3: 83 f8 04 cmp $0x4,%eax +c01075c6: 74 24 je c01075ec <_fifo_check_swap+0x8a> +c01075c8: c7 44 24 0c 46 b9 10 movl $0xc010b946,0xc(%esp) +c01075cf: c0 +c01075d0: c7 44 24 08 ca b8 10 movl $0xc010b8ca,0x8(%esp) +c01075d7: c0 +c01075d8: c7 44 24 04 75 00 00 movl $0x75,0x4(%esp) +c01075df: 00 +c01075e0: c7 04 24 df b8 10 c0 movl $0xc010b8df,(%esp) +c01075e7: e8 59 96 ff ff call c0100c45 <__panic> + + // 写入虚拟页 d 并检查页面故障数 + cprintf("write Virt Page d in fifo_check_swap\n"); +c01075ec: c7 04 24 80 b9 10 c0 movl $0xc010b980,(%esp) +c01075f3: e8 80 8d ff ff call c0100378 + *(unsigned char *)0x4000 = 0x0d; +c01075f8: b8 00 40 00 00 mov $0x4000,%eax +c01075fd: c6 00 0d movb $0xd,(%eax) + assert(pgfault_num==4); +c0107600: a1 70 c1 12 c0 mov 0xc012c170,%eax +c0107605: 83 f8 04 cmp $0x4,%eax +c0107608: 74 24 je c010762e <_fifo_check_swap+0xcc> +c010760a: c7 44 24 0c 46 b9 10 movl $0xc010b946,0xc(%esp) +c0107611: c0 +c0107612: c7 44 24 08 ca b8 10 movl $0xc010b8ca,0x8(%esp) +c0107619: c0 +c010761a: c7 44 24 04 7a 00 00 movl $0x7a,0x4(%esp) +c0107621: 00 +c0107622: c7 04 24 df b8 10 c0 movl $0xc010b8df,(%esp) +c0107629: e8 17 96 ff ff call c0100c45 <__panic> + + // 写入虚拟页 b 并检查页面故障数 + cprintf("write Virt Page b in fifo_check_swap\n"); +c010762e: c7 04 24 a8 b9 10 c0 movl $0xc010b9a8,(%esp) +c0107635: e8 3e 8d ff ff call c0100378 + *(unsigned char *)0x2000 = 0x0b; +c010763a: b8 00 20 00 00 mov $0x2000,%eax +c010763f: c6 00 0b movb $0xb,(%eax) + assert(pgfault_num==4); +c0107642: a1 70 c1 12 c0 mov 0xc012c170,%eax +c0107647: 83 f8 04 cmp $0x4,%eax +c010764a: 74 24 je c0107670 <_fifo_check_swap+0x10e> +c010764c: c7 44 24 0c 46 b9 10 movl $0xc010b946,0xc(%esp) +c0107653: c0 +c0107654: c7 44 24 08 ca b8 10 movl $0xc010b8ca,0x8(%esp) +c010765b: c0 +c010765c: c7 44 24 04 7f 00 00 movl $0x7f,0x4(%esp) +c0107663: 00 +c0107664: c7 04 24 df b8 10 c0 movl $0xc010b8df,(%esp) +c010766b: e8 d5 95 ff ff call c0100c45 <__panic> + + // 写入虚拟页 e 并检查页面故障数 + cprintf("write Virt Page e in fifo_check_swap\n"); +c0107670: c7 04 24 d0 b9 10 c0 movl $0xc010b9d0,(%esp) +c0107677: e8 fc 8c ff ff call c0100378 + *(unsigned char *)0x5000 = 0x0e; +c010767c: b8 00 50 00 00 mov $0x5000,%eax +c0107681: c6 00 0e movb $0xe,(%eax) + assert(pgfault_num==5); +c0107684: a1 70 c1 12 c0 mov 0xc012c170,%eax +c0107689: 83 f8 05 cmp $0x5,%eax +c010768c: 74 24 je c01076b2 <_fifo_check_swap+0x150> +c010768e: c7 44 24 0c f6 b9 10 movl $0xc010b9f6,0xc(%esp) +c0107695: c0 +c0107696: c7 44 24 08 ca b8 10 movl $0xc010b8ca,0x8(%esp) +c010769d: c0 +c010769e: c7 44 24 04 84 00 00 movl $0x84,0x4(%esp) +c01076a5: 00 +c01076a6: c7 04 24 df b8 10 c0 movl $0xc010b8df,(%esp) +c01076ad: e8 93 95 ff ff call c0100c45 <__panic> + + // 再次写入虚拟页 b 并检查页面故障数 + cprintf("write Virt Page b in fifo_check_swap\n"); +c01076b2: c7 04 24 a8 b9 10 c0 movl $0xc010b9a8,(%esp) +c01076b9: e8 ba 8c ff ff call c0100378 + *(unsigned char *)0x2000 = 0x0b; +c01076be: b8 00 20 00 00 mov $0x2000,%eax +c01076c3: c6 00 0b movb $0xb,(%eax) + assert(pgfault_num==5); +c01076c6: a1 70 c1 12 c0 mov 0xc012c170,%eax +c01076cb: 83 f8 05 cmp $0x5,%eax +c01076ce: 74 24 je c01076f4 <_fifo_check_swap+0x192> +c01076d0: c7 44 24 0c f6 b9 10 movl $0xc010b9f6,0xc(%esp) +c01076d7: c0 +c01076d8: c7 44 24 08 ca b8 10 movl $0xc010b8ca,0x8(%esp) +c01076df: c0 +c01076e0: c7 44 24 04 89 00 00 movl $0x89,0x4(%esp) +c01076e7: 00 +c01076e8: c7 04 24 df b8 10 c0 movl $0xc010b8df,(%esp) +c01076ef: e8 51 95 ff ff call c0100c45 <__panic> + + // 再次写入虚拟页 a 并检查页面故障数 + cprintf("write Virt Page a in fifo_check_swap\n"); +c01076f4: c7 04 24 58 b9 10 c0 movl $0xc010b958,(%esp) +c01076fb: e8 78 8c ff ff call c0100378 + *(unsigned char *)0x1000 = 0x0a; +c0107700: b8 00 10 00 00 mov $0x1000,%eax +c0107705: c6 00 0a movb $0xa,(%eax) + assert(pgfault_num==6); +c0107708: a1 70 c1 12 c0 mov 0xc012c170,%eax +c010770d: 83 f8 06 cmp $0x6,%eax +c0107710: 74 24 je c0107736 <_fifo_check_swap+0x1d4> +c0107712: c7 44 24 0c 05 ba 10 movl $0xc010ba05,0xc(%esp) +c0107719: c0 +c010771a: c7 44 24 08 ca b8 10 movl $0xc010b8ca,0x8(%esp) +c0107721: c0 +c0107722: c7 44 24 04 8e 00 00 movl $0x8e,0x4(%esp) +c0107729: 00 +c010772a: c7 04 24 df b8 10 c0 movl $0xc010b8df,(%esp) +c0107731: e8 0f 95 ff ff call c0100c45 <__panic> + + // 再次写入虚拟页 b 并检查页面故障数 + cprintf("write Virt Page b in fifo_check_swap\n"); +c0107736: c7 04 24 a8 b9 10 c0 movl $0xc010b9a8,(%esp) +c010773d: e8 36 8c ff ff call c0100378 + *(unsigned char *)0x2000 = 0x0b; +c0107742: b8 00 20 00 00 mov $0x2000,%eax +c0107747: c6 00 0b movb $0xb,(%eax) + assert(pgfault_num==7); +c010774a: a1 70 c1 12 c0 mov 0xc012c170,%eax +c010774f: 83 f8 07 cmp $0x7,%eax +c0107752: 74 24 je c0107778 <_fifo_check_swap+0x216> +c0107754: c7 44 24 0c 14 ba 10 movl $0xc010ba14,0xc(%esp) +c010775b: c0 +c010775c: c7 44 24 08 ca b8 10 movl $0xc010b8ca,0x8(%esp) +c0107763: c0 +c0107764: c7 44 24 04 93 00 00 movl $0x93,0x4(%esp) +c010776b: 00 +c010776c: c7 04 24 df b8 10 c0 movl $0xc010b8df,(%esp) +c0107773: e8 cd 94 ff ff call c0100c45 <__panic> + + // 再次写入虚拟页 c 并检查页面故障数 + cprintf("write Virt Page c in fifo_check_swap\n"); +c0107778: c7 04 24 20 b9 10 c0 movl $0xc010b920,(%esp) +c010777f: e8 f4 8b ff ff call c0100378 + *(unsigned char *)0x3000 = 0x0c; +c0107784: b8 00 30 00 00 mov $0x3000,%eax +c0107789: c6 00 0c movb $0xc,(%eax) + assert(pgfault_num==8); +c010778c: a1 70 c1 12 c0 mov 0xc012c170,%eax +c0107791: 83 f8 08 cmp $0x8,%eax +c0107794: 74 24 je c01077ba <_fifo_check_swap+0x258> +c0107796: c7 44 24 0c 23 ba 10 movl $0xc010ba23,0xc(%esp) +c010779d: c0 +c010779e: c7 44 24 08 ca b8 10 movl $0xc010b8ca,0x8(%esp) +c01077a5: c0 +c01077a6: c7 44 24 04 98 00 00 movl $0x98,0x4(%esp) +c01077ad: 00 +c01077ae: c7 04 24 df b8 10 c0 movl $0xc010b8df,(%esp) +c01077b5: e8 8b 94 ff ff call c0100c45 <__panic> + + // 再次写入虚拟页 d 并检查页面故障数 + cprintf("write Virt Page d in fifo_check_swap\n"); +c01077ba: c7 04 24 80 b9 10 c0 movl $0xc010b980,(%esp) +c01077c1: e8 b2 8b ff ff call c0100378 + *(unsigned char *)0x4000 = 0x0d; +c01077c6: b8 00 40 00 00 mov $0x4000,%eax +c01077cb: c6 00 0d movb $0xd,(%eax) + assert(pgfault_num==9); +c01077ce: a1 70 c1 12 c0 mov 0xc012c170,%eax +c01077d3: 83 f8 09 cmp $0x9,%eax +c01077d6: 74 24 je c01077fc <_fifo_check_swap+0x29a> +c01077d8: c7 44 24 0c 32 ba 10 movl $0xc010ba32,0xc(%esp) +c01077df: c0 +c01077e0: c7 44 24 08 ca b8 10 movl $0xc010b8ca,0x8(%esp) +c01077e7: c0 +c01077e8: c7 44 24 04 9d 00 00 movl $0x9d,0x4(%esp) +c01077ef: 00 +c01077f0: c7 04 24 df b8 10 c0 movl $0xc010b8df,(%esp) +c01077f7: e8 49 94 ff ff call c0100c45 <__panic> + + // 再次写入虚拟页 e 并检查页面故障数 + cprintf("write Virt Page e in fifo_check_swap\n"); +c01077fc: c7 04 24 d0 b9 10 c0 movl $0xc010b9d0,(%esp) +c0107803: e8 70 8b ff ff call c0100378 + *(unsigned char *)0x5000 = 0x0e; +c0107808: b8 00 50 00 00 mov $0x5000,%eax +c010780d: c6 00 0e movb $0xe,(%eax) + assert(pgfault_num==10); +c0107810: a1 70 c1 12 c0 mov 0xc012c170,%eax +c0107815: 83 f8 0a cmp $0xa,%eax +c0107818: 74 24 je c010783e <_fifo_check_swap+0x2dc> +c010781a: c7 44 24 0c 41 ba 10 movl $0xc010ba41,0xc(%esp) +c0107821: c0 +c0107822: c7 44 24 08 ca b8 10 movl $0xc010b8ca,0x8(%esp) +c0107829: c0 +c010782a: c7 44 24 04 a2 00 00 movl $0xa2,0x4(%esp) +c0107831: 00 +c0107832: c7 04 24 df b8 10 c0 movl $0xc010b8df,(%esp) +c0107839: e8 07 94 ff ff call c0100c45 <__panic> - - le = &free_list; -c0107558: c7 45 e8 a4 e1 12 c0 movl $0xc012e1a4,-0x18(%ebp) - while ((le = list_next(le)) != &free_list) { -c010755f: eb 1c jmp c010757d - struct Page *p = le2page(le, page_link);// 将链表条目转换为页面结构 -c0107561: 8b 45 e8 mov -0x18(%ebp),%eax -c0107564: 83 e8 0c sub $0xc,%eax -c0107567: 89 45 cc mov %eax,-0x34(%ebp) - count --, total -= p->property;// 更新页面数量和属性总和 -c010756a: ff 4d f4 decl -0xc(%ebp) -c010756d: 8b 55 f0 mov -0x10(%ebp),%edx -c0107570: 8b 45 cc mov -0x34(%ebp),%eax -c0107573: 8b 40 08 mov 0x8(%eax),%eax -c0107576: 29 c2 sub %eax,%edx -c0107578: 89 d0 mov %edx,%eax -c010757a: 89 45 f0 mov %eax,-0x10(%ebp) -c010757d: 8b 45 e8 mov -0x18(%ebp),%eax -c0107580: 89 45 a0 mov %eax,-0x60(%ebp) - return listelm->next; -c0107583: 8b 45 a0 mov -0x60(%ebp),%eax -c0107586: 8b 40 04 mov 0x4(%eax),%eax - while ((le = list_next(le)) != &free_list) { -c0107589: 89 45 e8 mov %eax,-0x18(%ebp) -c010758c: 81 7d e8 a4 e1 12 c0 cmpl $0xc012e1a4,-0x18(%ebp) -c0107593: 75 cc jne c0107561 - } - cprintf("count is %d, total is %d\n",count,total);// 打印恢复后的状态 -c0107595: 8b 45 f0 mov -0x10(%ebp),%eax -c0107598: 89 44 24 08 mov %eax,0x8(%esp) -c010759c: 8b 45 f4 mov -0xc(%ebp),%eax -c010759f: 89 44 24 04 mov %eax,0x4(%esp) -c01075a3: c7 04 24 69 bd 10 c0 movl $0xc010bd69,(%esp) -c01075aa: e8 28 8d ff ff call c01002d7 - //assert(count == 0); - - cprintf("check_swap() succeeded!\n");// 打印检查成功的信息 -c01075af: c7 04 24 83 bd 10 c0 movl $0xc010bd83,(%esp) -c01075b6: e8 1c 8d ff ff call c01002d7 + // 再次写入虚拟页 a 并检查页面故障数 + cprintf("write Virt Page a in fifo_check_swap\n"); +c010783e: c7 04 24 58 b9 10 c0 movl $0xc010b958,(%esp) +c0107845: e8 2e 8b ff ff call c0100378 + assert(*(unsigned char *)0x1000 == 0x0a); +c010784a: b8 00 10 00 00 mov $0x1000,%eax +c010784f: 0f b6 00 movzbl (%eax),%eax +c0107852: 3c 0a cmp $0xa,%al +c0107854: 74 24 je c010787a <_fifo_check_swap+0x318> +c0107856: c7 44 24 0c 54 ba 10 movl $0xc010ba54,0xc(%esp) +c010785d: c0 +c010785e: c7 44 24 08 ca b8 10 movl $0xc010b8ca,0x8(%esp) +c0107865: c0 +c0107866: c7 44 24 04 a6 00 00 movl $0xa6,0x4(%esp) +c010786d: 00 +c010786e: c7 04 24 df b8 10 c0 movl $0xc010b8df,(%esp) +c0107875: e8 cb 93 ff ff call c0100c45 <__panic> + *(unsigned char *)0x1000 = 0x0a; +c010787a: b8 00 10 00 00 mov $0x1000,%eax +c010787f: c6 00 0a movb $0xa,(%eax) + assert(pgfault_num==11); +c0107882: a1 70 c1 12 c0 mov 0xc012c170,%eax +c0107887: 83 f8 0b cmp $0xb,%eax +c010788a: 74 24 je c01078b0 <_fifo_check_swap+0x34e> +c010788c: c7 44 24 0c 75 ba 10 movl $0xc010ba75,0xc(%esp) +c0107893: c0 +c0107894: c7 44 24 08 ca b8 10 movl $0xc010b8ca,0x8(%esp) +c010789b: c0 +c010789c: c7 44 24 04 a8 00 00 movl $0xa8,0x4(%esp) +c01078a3: 00 +c01078a4: c7 04 24 df b8 10 c0 movl $0xc010b8df,(%esp) +c01078ab: e8 95 93 ff ff call c0100c45 <__panic> + return 0; +c01078b0: b8 00 00 00 00 mov $0x0,%eax } -c01075bb: 90 nop -c01075bc: c9 leave -c01075bd: c3 ret +c01078b5: 89 ec mov %ebp,%esp +c01078b7: 5d pop %ebp +c01078b8: c3 ret -c01075be : -page2ppn(struct Page *page) { -c01075be: 55 push %ebp -c01075bf: 89 e5 mov %esp,%ebp - return page - pages; -c01075c1: a1 b8 e0 12 c0 mov 0xc012e0b8,%eax -c01075c6: 8b 55 08 mov 0x8(%ebp),%edx -c01075c9: 29 c2 sub %eax,%edx -c01075cb: 89 d0 mov %edx,%eax -c01075cd: c1 f8 05 sar $0x5,%eax -} -c01075d0: 5d pop %ebp -c01075d1: c3 ret +c01078b9 <_fifo_init>: -c01075d2 : -page2pa(struct Page *page) { -c01075d2: 55 push %ebp -c01075d3: 89 e5 mov %esp,%ebp -c01075d5: 83 ec 04 sub $0x4,%esp - return page2ppn(page) << PGSHIFT; -c01075d8: 8b 45 08 mov 0x8(%ebp),%eax -c01075db: 89 04 24 mov %eax,(%esp) -c01075de: e8 db ff ff ff call c01075be -c01075e3: c1 e0 0c shl $0xc,%eax -} -c01075e6: c9 leave -c01075e7: c3 ret -c01075e8 : -page_ref(struct Page *page) { -c01075e8: 55 push %ebp -c01075e9: 89 e5 mov %esp,%ebp - return page->ref; -c01075eb: 8b 45 08 mov 0x8(%ebp),%eax -c01075ee: 8b 00 mov (%eax),%eax +static int +_fifo_init(void) +{ +c01078b9: 55 push %ebp +c01078ba: 89 e5 mov %esp,%ebp + return 0; +c01078bc: b8 00 00 00 00 mov $0x0,%eax } -c01075f0: 5d pop %ebp -c01075f1: c3 ret +c01078c1: 5d pop %ebp +c01078c2: c3 ret -c01075f2 : -set_page_ref(struct Page *page, int val) { -c01075f2: 55 push %ebp -c01075f3: 89 e5 mov %esp,%ebp - page->ref = val; -c01075f5: 8b 45 08 mov 0x8(%ebp),%eax -c01075f8: 8b 55 0c mov 0xc(%ebp),%edx -c01075fb: 89 10 mov %edx,(%eax) +c01078c3 <_fifo_set_unswappable>: + +static int +_fifo_set_unswappable(struct mm_struct *mm, uintptr_t addr) +{ +c01078c3: 55 push %ebp +c01078c4: 89 e5 mov %esp,%ebp + return 0; +c01078c6: b8 00 00 00 00 mov $0x0,%eax } -c01075fd: 90 nop -c01075fe: 5d pop %ebp -c01075ff: c3 ret +c01078cb: 5d pop %ebp +c01078cc: c3 ret -c0107600 : -#define nr_free (free_area.nr_free) +c01078cd <_fifo_tick_event>: -//free_list` 用于记录空闲内存块,nr_free` 是空闲内存块的总数。 -//用default_init函数来初始化 `free_list`,并将 `nr_free` 设置为 0。 -static void -default_init(void) { -c0107600: f3 0f 1e fb endbr32 -c0107604: 55 push %ebp -c0107605: 89 e5 mov %esp,%ebp -c0107607: 83 ec 10 sub $0x10,%esp -c010760a: c7 45 fc a4 e1 12 c0 movl $0xc012e1a4,-0x4(%ebp) - elm->prev = elm->next = elm; -c0107611: 8b 45 fc mov -0x4(%ebp),%eax -c0107614: 8b 55 fc mov -0x4(%ebp),%edx -c0107617: 89 50 04 mov %edx,0x4(%eax) -c010761a: 8b 45 fc mov -0x4(%ebp),%eax -c010761d: 8b 50 04 mov 0x4(%eax),%edx -c0107620: 8b 45 fc mov -0x4(%ebp),%eax -c0107623: 89 10 mov %edx,(%eax) -} -c0107625: 90 nop - list_init(&free_list); - nr_free = 0; -c0107626: c7 05 ac e1 12 c0 00 movl $0x0,0xc012e1ac -c010762d: 00 00 00 +static int +_fifo_tick_event(struct mm_struct *mm) +{ return 0; } +c01078cd: 55 push %ebp +c01078ce: 89 e5 mov %esp,%ebp +c01078d0: b8 00 00 00 00 mov $0x0,%eax +c01078d5: 5d pop %ebp +c01078d6: c3 ret + +c01078d7 : +pa2page(uintptr_t pa) { +c01078d7: 55 push %ebp +c01078d8: 89 e5 mov %esp,%ebp +c01078da: 83 ec 18 sub $0x18,%esp + if (PPN(pa) >= npage) { +c01078dd: 8b 45 08 mov 0x8(%ebp),%eax +c01078e0: c1 e8 0c shr $0xc,%eax +c01078e3: 89 c2 mov %eax,%edx +c01078e5: a1 04 c0 12 c0 mov 0xc012c004,%eax +c01078ea: 39 c2 cmp %eax,%edx +c01078ec: 72 1c jb c010790a + panic("pa2page called with invalid pa"); +c01078ee: c7 44 24 08 98 ba 10 movl $0xc010ba98,0x8(%esp) +c01078f5: c0 +c01078f6: c7 44 24 04 5f 00 00 movl $0x5f,0x4(%esp) +c01078fd: 00 +c01078fe: c7 04 24 b7 ba 10 c0 movl $0xc010bab7,(%esp) +c0107905: e8 3b 93 ff ff call c0100c45 <__panic> + return &pages[PPN(pa)]; +c010790a: 8b 15 00 c0 12 c0 mov 0xc012c000,%edx +c0107910: 8b 45 08 mov 0x8(%ebp),%eax +c0107913: c1 e8 0c shr $0xc,%eax +c0107916: c1 e0 05 shl $0x5,%eax +c0107919: 01 d0 add %edx,%eax } -c0107630: 90 nop -c0107631: c9 leave -c0107632: c3 ret +c010791b: 89 ec mov %ebp,%esp +c010791d: 5d pop %ebp +c010791e: c3 ret -c0107633 : +c010791f : +pde2page(pde_t pde) { +c010791f: 55 push %ebp +c0107920: 89 e5 mov %esp,%ebp +c0107922: 83 ec 18 sub $0x18,%esp + return pa2page(PDE_ADDR(pde)); +c0107925: 8b 45 08 mov 0x8(%ebp),%eax +c0107928: 25 00 f0 ff ff and $0xfffff000,%eax +c010792d: 89 04 24 mov %eax,(%esp) +c0107930: e8 a2 ff ff ff call c01078d7 +} +c0107935: 89 ec mov %ebp,%esp +c0107937: 5d pop %ebp +c0107938: c3 ret -//用于初始化一段连续的物理页,并将它们加入到空闲内存管理系统中. -//struct Page *base:指向要初始化的页块的起始地址。size_t n:要初始化的页的数量。 -static void -default_init_memmap(struct Page *base, size_t n) { -c0107633: f3 0f 1e fb endbr32 -c0107637: 55 push %ebp -c0107638: 89 e5 mov %esp,%ebp -c010763a: 83 ec 48 sub $0x48,%esp - assert(n > 0);// 确保请求的页数大于零 -c010763d: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) -c0107641: 75 24 jne c0107667 -c0107643: c7 44 24 0c 9c bd 10 movl $0xc010bd9c,0xc(%esp) -c010764a: c0 -c010764b: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0107652: c0 -c0107653: c7 44 24 04 9a 00 00 movl $0x9a,0x4(%esp) -c010765a: 00 -c010765b: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0107662: e8 dc 8d ff ff call c0100443 <__panic> - struct Page *p = base;// 指向当前初始化的页 -c0107667: 8b 45 08 mov 0x8(%ebp),%eax -c010766a: 89 45 f4 mov %eax,-0xc(%ebp) - // 遍历每一页,设置其状态 - for (; p != base + n; p ++) { -c010766d: eb 7d jmp c01076ec - assert(PageReserved(p));//检查每个页是否被标记为“保留”。若没有被保留,函数将抛出错误。 -c010766f: 8b 45 f4 mov -0xc(%ebp),%eax -c0107672: 83 c0 04 add $0x4,%eax -c0107675: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%ebp) -c010767c: 89 45 ec mov %eax,-0x14(%ebp) - asm volatile ("btl %2, %1; sbbl %0,%0" : "=r" (oldbit) : "m" (*(volatile long *)addr), "Ir" (nr)); -c010767f: 8b 45 ec mov -0x14(%ebp),%eax -c0107682: 8b 55 f0 mov -0x10(%ebp),%edx -c0107685: 0f a3 10 bt %edx,(%eax) -c0107688: 19 c0 sbb %eax,%eax -c010768a: 89 45 e8 mov %eax,-0x18(%ebp) - return oldbit != 0; -c010768d: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) -c0107691: 0f 95 c0 setne %al -c0107694: 0f b6 c0 movzbl %al,%eax -c0107697: 85 c0 test %eax,%eax -c0107699: 75 24 jne c01076bf -c010769b: c7 44 24 0c cd bd 10 movl $0xc010bdcd,0xc(%esp) -c01076a2: c0 -c01076a3: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c01076aa: c0 -c01076ab: c7 44 24 04 9e 00 00 movl $0x9e,0x4(%esp) -c01076b2: 00 -c01076b3: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c01076ba: e8 84 8d ff ff call c0100443 <__panic> - p->flags = p->property = 0;//将页的 flags 和 property 字段设置为 0,表示该页未分配、未使用。 -c01076bf: 8b 45 f4 mov -0xc(%ebp),%eax -c01076c2: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax) -c01076c9: 8b 45 f4 mov -0xc(%ebp),%eax -c01076cc: 8b 50 08 mov 0x8(%eax),%edx -c01076cf: 8b 45 f4 mov -0xc(%ebp),%eax -c01076d2: 89 50 04 mov %edx,0x4(%eax) - set_page_ref(p, 0);//将页的引用计数设置为 0,表明没有任何引用指向此页。 -c01076d5: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c01076dc: 00 -c01076dd: 8b 45 f4 mov -0xc(%ebp),%eax -c01076e0: 89 04 24 mov %eax,(%esp) -c01076e3: e8 0a ff ff ff call c01075f2 - for (; p != base + n; p ++) { -c01076e8: 83 45 f4 20 addl $0x20,-0xc(%ebp) -c01076ec: 8b 45 0c mov 0xc(%ebp),%eax -c01076ef: c1 e0 05 shl $0x5,%eax -c01076f2: 89 c2 mov %eax,%edx -c01076f4: 8b 45 08 mov 0x8(%ebp),%eax -c01076f7: 01 d0 add %edx,%eax -c01076f9: 39 45 f4 cmp %eax,-0xc(%ebp) -c01076fc: 0f 85 6d ff ff ff jne c010766f +c0107939 : + * 它包括内存映射列表、页目录、映射缓存等重要信息 + * + * @return 分配并初始化后的`mm_struct`结构体指针,如果分配失败则返回NULL + */ +struct mm_struct * +mm_create(void) { +c0107939: 55 push %ebp +c010793a: 89 e5 mov %esp,%ebp +c010793c: 83 ec 28 sub $0x28,%esp + // 分配一个mm_struct结构体的空间 + struct mm_struct *mm = kmalloc(sizeof(struct mm_struct)); +c010793f: c7 04 24 18 00 00 00 movl $0x18,(%esp) +c0107946: e8 ff d1 ff ff call c0104b4a +c010794b: 89 45 f4 mov %eax,-0xc(%ebp) + // 检查是否成功分配了内存 + if (mm != NULL) { +c010794e: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0107952: 74 59 je c01079ad + // 初始化内存映射列表 + list_init(&(mm->mmap_list)); +c0107954: 8b 45 f4 mov -0xc(%ebp),%eax +c0107957: 89 45 f0 mov %eax,-0x10(%ebp) + elm->prev = elm->next = elm; +c010795a: 8b 45 f0 mov -0x10(%ebp),%eax +c010795d: 8b 55 f0 mov -0x10(%ebp),%edx +c0107960: 89 50 04 mov %edx,0x4(%eax) +c0107963: 8b 45 f0 mov -0x10(%ebp),%eax +c0107966: 8b 50 04 mov 0x4(%eax),%edx +c0107969: 8b 45 f0 mov -0x10(%ebp),%eax +c010796c: 89 10 mov %edx,(%eax) +} +c010796e: 90 nop + // 设置映射缓存为NULL,表示尚未缓存任何映射 + mm->mmap_cache = NULL; +c010796f: 8b 45 f4 mov -0xc(%ebp),%eax +c0107972: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax) + // 设置页目录为NULL,表示尚未分配页目录 + mm->pgdir = NULL; +c0107979: 8b 45 f4 mov -0xc(%ebp),%eax +c010797c: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax) + // 初始化映射计数为0,表示尚未创建任何内存映射 + mm->map_count = 0; +c0107983: 8b 45 f4 mov -0xc(%ebp),%eax +c0107986: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax) + // 如果交换空间初始化成功,则为当前内存管理结构体进行交换空间初始化 + if (swap_init_ok) swap_init_mm(mm); +c010798d: a1 a4 c0 12 c0 mov 0xc012c0a4,%eax +c0107992: 85 c0 test %eax,%eax +c0107994: 74 0d je c01079a3 +c0107996: 8b 45 f4 mov -0xc(%ebp),%eax +c0107999: 89 04 24 mov %eax,(%esp) +c010799c: e8 df ee ff ff call c0106880 +c01079a1: eb 0a jmp c01079ad + else mm->sm_priv = NULL; +c01079a3: 8b 45 f4 mov -0xc(%ebp),%eax +c01079a6: c7 40 14 00 00 00 00 movl $0x0,0x14(%eax) } - // 设置第一个页的 property 为块的总数 - base->property = n; -c0107702: 8b 45 08 mov 0x8(%ebp),%eax -c0107705: 8b 55 0c mov 0xc(%ebp),%edx -c0107708: 89 50 08 mov %edx,0x8(%eax) - SetPageProperty(base);// 设置当前页的有效标志 -c010770b: 8b 45 08 mov 0x8(%ebp),%eax -c010770e: 83 c0 04 add $0x4,%eax -c0107711: c7 45 d0 01 00 00 00 movl $0x1,-0x30(%ebp) -c0107718: 89 45 cc mov %eax,-0x34(%ebp) - asm volatile ("btsl %1, %0" :"=m" (*(volatile long *)addr) : "Ir" (nr)); -c010771b: 8b 45 cc mov -0x34(%ebp),%eax -c010771e: 8b 55 d0 mov -0x30(%ebp),%edx -c0107721: 0f ab 10 bts %edx,(%eax) -} -c0107724: 90 nop - nr_free += n;// 更新空闲页计数 -c0107725: 8b 15 ac e1 12 c0 mov 0xc012e1ac,%edx -c010772b: 8b 45 0c mov 0xc(%ebp),%eax -c010772e: 01 d0 add %edx,%eax -c0107730: a3 ac e1 12 c0 mov %eax,0xc012e1ac - list_add_before(&free_list, &(base->page_link));// 将该块添加到空闲列表中 -c0107735: 8b 45 08 mov 0x8(%ebp),%eax -c0107738: 83 c0 0c add $0xc,%eax -c010773b: c7 45 e4 a4 e1 12 c0 movl $0xc012e1a4,-0x1c(%ebp) -c0107742: 89 45 e0 mov %eax,-0x20(%ebp) - __list_add(elm, listelm->prev, listelm); -c0107745: 8b 45 e4 mov -0x1c(%ebp),%eax -c0107748: 8b 00 mov (%eax),%eax -c010774a: 8b 55 e0 mov -0x20(%ebp),%edx -c010774d: 89 55 dc mov %edx,-0x24(%ebp) -c0107750: 89 45 d8 mov %eax,-0x28(%ebp) -c0107753: 8b 45 e4 mov -0x1c(%ebp),%eax -c0107756: 89 45 d4 mov %eax,-0x2c(%ebp) - prev->next = next->prev = elm; -c0107759: 8b 45 d4 mov -0x2c(%ebp),%eax -c010775c: 8b 55 dc mov -0x24(%ebp),%edx -c010775f: 89 10 mov %edx,(%eax) -c0107761: 8b 45 d4 mov -0x2c(%ebp),%eax -c0107764: 8b 10 mov (%eax),%edx -c0107766: 8b 45 d8 mov -0x28(%ebp),%eax -c0107769: 89 50 04 mov %edx,0x4(%eax) - elm->next = next; -c010776c: 8b 45 dc mov -0x24(%ebp),%eax -c010776f: 8b 55 d4 mov -0x2c(%ebp),%edx -c0107772: 89 50 04 mov %edx,0x4(%eax) - elm->prev = prev; -c0107775: 8b 45 dc mov -0x24(%ebp),%eax -c0107778: 8b 55 d8 mov -0x28(%ebp),%edx -c010777b: 89 10 mov %edx,(%eax) -} -c010777d: 90 nop -} -c010777e: 90 nop + // 返回分配并初始化后的内存管理结构体指针 + return mm; +c01079ad: 8b 45 f4 mov -0xc(%ebp),%eax } -c010777f: 90 nop -c0107780: c9 leave -c0107781: c3 ret +c01079b0: 89 ec mov %ebp,%esp +c01079b2: 5d pop %ebp +c01079b3: c3 ret -c0107782 : - -//用于分配指定数量的连续物理页。该函数实现了首次适应内存分配算法。 -static struct Page * -default_alloc_pages(size_t n) { -c0107782: f3 0f 1e fb endbr32 -c0107786: 55 push %ebp -c0107787: 89 e5 mov %esp,%ebp -c0107789: 83 ec 68 sub $0x68,%esp - assert(n > 0);// 确保请求的页数大于零 -c010778c: 83 7d 08 00 cmpl $0x0,0x8(%ebp) -c0107790: 75 24 jne c01077b6 -c0107792: c7 44 24 0c 9c bd 10 movl $0xc010bd9c,0xc(%esp) -c0107799: c0 -c010779a: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c01077a1: c0 -c01077a2: c7 44 24 04 ac 00 00 movl $0xac,0x4(%esp) -c01077a9: 00 -c01077aa: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c01077b1: e8 8d 8c ff ff call c0100443 <__panic> - if (n > nr_free) {// 检查请求的页数是否超过空闲页数 -c01077b6: a1 ac e1 12 c0 mov 0xc012e1ac,%eax -c01077bb: 39 45 08 cmp %eax,0x8(%ebp) -c01077be: 76 0a jbe c01077ca - return NULL; -c01077c0: b8 00 00 00 00 mov $0x0,%eax -c01077c5: e9 3c 01 00 00 jmp c0107906 +c01079b4 : + * @param vm_flags 虚拟内存区域的标志,表示内存区域的权限和特性。 + * + * @return 返回指向新创建的vma_struct结构体的指针,如果内存分配失败,则返回NULL。 + */ +struct vma_struct * +vma_create(uintptr_t vm_start, uintptr_t vm_end, uint32_t vm_flags) { +c01079b4: 55 push %ebp +c01079b5: 89 e5 mov %esp,%ebp +c01079b7: 83 ec 28 sub $0x28,%esp + // 分配vma_struct结构体所需的内存空间 + struct vma_struct *vma = kmalloc(sizeof(struct vma_struct)); +c01079ba: c7 04 24 18 00 00 00 movl $0x18,(%esp) +c01079c1: e8 84 d1 ff ff call c0104b4a +c01079c6: 89 45 f4 mov %eax,-0xc(%ebp) + // 检查内存是否成功分配 + if (vma != NULL) { +c01079c9: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c01079cd: 74 1b je c01079ea + // 初始化vma_struct的成员变量 + vma->vm_start = vm_start; +c01079cf: 8b 45 f4 mov -0xc(%ebp),%eax +c01079d2: 8b 55 08 mov 0x8(%ebp),%edx +c01079d5: 89 50 04 mov %edx,0x4(%eax) + vma->vm_end = vm_end; +c01079d8: 8b 45 f4 mov -0xc(%ebp),%eax +c01079db: 8b 55 0c mov 0xc(%ebp),%edx +c01079de: 89 50 08 mov %edx,0x8(%eax) + vma->vm_flags = vm_flags; +c01079e1: 8b 45 f4 mov -0xc(%ebp),%eax +c01079e4: 8b 55 10 mov 0x10(%ebp),%edx +c01079e7: 89 50 0c mov %edx,0xc(%eax) } - struct Page *page = NULL;// 初始化分配的页指针 -c01077ca: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) - list_entry_t *le = &free_list;// 初始化链表迭代器 -c01077d1: c7 45 f0 a4 e1 12 c0 movl $0xc012e1a4,-0x10(%ebp) - // 遍历空闲列表,寻找第一个满足条件的块 - while ((le = list_next(le)) != &free_list) { -c01077d8: eb 1c jmp c01077f6 - struct Page *p = le2page(le, page_link);// 将链表节点转换为 Page 结构体 -c01077da: 8b 45 f0 mov -0x10(%ebp),%eax -c01077dd: 83 e8 0c sub $0xc,%eax -c01077e0: 89 45 ec mov %eax,-0x14(%ebp) - if (p->property >= n) {// 检查当前块的页数是否满足请求 -c01077e3: 8b 45 ec mov -0x14(%ebp),%eax -c01077e6: 8b 40 08 mov 0x8(%eax),%eax -c01077e9: 39 45 08 cmp %eax,0x8(%ebp) -c01077ec: 77 08 ja c01077f6 - page = p;// 找到合适的块 -c01077ee: 8b 45 ec mov -0x14(%ebp),%eax -c01077f1: 89 45 f4 mov %eax,-0xc(%ebp) - break;// 退出循环 -c01077f4: eb 18 jmp c010780e -c01077f6: 8b 45 f0 mov -0x10(%ebp),%eax -c01077f9: 89 45 e4 mov %eax,-0x1c(%ebp) + // 返回指向新创建的vma_struct结构体的指针,或在内存分配失败时返回NULL + return vma; +c01079ea: 8b 45 f4 mov -0xc(%ebp),%eax +} +c01079ed: 89 ec mov %ebp,%esp +c01079ef: 5d pop %ebp +c01079f0: c3 ret + +c01079f1 : + * 此函数首先检查mmap_cache是否包含所需的VMA,以加速查找过程 + * 如果mmap_cache未命中,则遍历VMA列表,直到找到包含给定地址的VMA或确定不存在这样的VMA + * 如果找到了合适的VMA,它将更新mmap_cache以供后续查找使用 + */ +struct vma_struct * +find_vma(struct mm_struct *mm, uintptr_t addr) { +c01079f1: 55 push %ebp +c01079f2: 89 e5 mov %esp,%ebp +c01079f4: 83 ec 20 sub $0x20,%esp + struct vma_struct *vma = NULL;// 初始化VMA指针为NULL +c01079f7: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) + if (mm != NULL) {// 检查传入的内存描述符是否有效 +c01079fe: 83 7d 08 00 cmpl $0x0,0x8(%ebp) +c0107a02: 0f 84 95 00 00 00 je c0107a9d + // 检查mmap_cache是否包含所需的VMA + vma = mm->mmap_cache; +c0107a08: 8b 45 08 mov 0x8(%ebp),%eax +c0107a0b: 8b 40 08 mov 0x8(%eax),%eax +c0107a0e: 89 45 fc mov %eax,-0x4(%ebp) + if (!(vma != NULL && vma->vm_start <= addr && vma->vm_end > addr)) { +c0107a11: 83 7d fc 00 cmpl $0x0,-0x4(%ebp) +c0107a15: 74 16 je c0107a2d +c0107a17: 8b 45 fc mov -0x4(%ebp),%eax +c0107a1a: 8b 40 04 mov 0x4(%eax),%eax +c0107a1d: 39 45 0c cmp %eax,0xc(%ebp) +c0107a20: 72 0b jb c0107a2d +c0107a22: 8b 45 fc mov -0x4(%ebp),%eax +c0107a25: 8b 40 08 mov 0x8(%eax),%eax +c0107a28: 39 45 0c cmp %eax,0xc(%ebp) +c0107a2b: 72 61 jb c0107a8e + // 如果mmap_cache未命中,则开始遍历VMA列表 + bool found = 0;// 初始化找到标志为0 +c0107a2d: c7 45 f8 00 00 00 00 movl $0x0,-0x8(%ebp) + // 获取VMA列表的头指针 + list_entry_t *list = &(mm->mmap_list), *le = list; +c0107a34: 8b 45 08 mov 0x8(%ebp),%eax +c0107a37: 89 45 f0 mov %eax,-0x10(%ebp) +c0107a3a: 8b 45 f0 mov -0x10(%ebp),%eax +c0107a3d: 89 45 f4 mov %eax,-0xc(%ebp) + while ((le = list_next(le)) != list) { // 遍历VMA列表 +c0107a40: eb 28 jmp c0107a6a + vma = le2vma(le, list_link);// 将链表项转换为VMA结构 +c0107a42: 8b 45 f4 mov -0xc(%ebp),%eax +c0107a45: 83 e8 10 sub $0x10,%eax +c0107a48: 89 45 fc mov %eax,-0x4(%ebp) + // 检查当前VMA是否包含给定地址 + if (vma->vm_start<=addr && addr < vma->vm_end) { +c0107a4b: 8b 45 fc mov -0x4(%ebp),%eax +c0107a4e: 8b 40 04 mov 0x4(%eax),%eax +c0107a51: 39 45 0c cmp %eax,0xc(%ebp) +c0107a54: 72 14 jb c0107a6a +c0107a56: 8b 45 fc mov -0x4(%ebp),%eax +c0107a59: 8b 40 08 mov 0x8(%eax),%eax +c0107a5c: 39 45 0c cmp %eax,0xc(%ebp) +c0107a5f: 73 09 jae c0107a6a + found = 1;// 找到合适的VMA +c0107a61: c7 45 f8 01 00 00 00 movl $0x1,-0x8(%ebp) + break;// 结束循环 +c0107a68: eb 17 jmp c0107a81 +c0107a6a: 8b 45 f4 mov -0xc(%ebp),%eax +c0107a6d: 89 45 ec mov %eax,-0x14(%ebp) return listelm->next; -c01077fc: 8b 45 e4 mov -0x1c(%ebp),%eax -c01077ff: 8b 40 04 mov 0x4(%eax),%eax - while ((le = list_next(le)) != &free_list) { -c0107802: 89 45 f0 mov %eax,-0x10(%ebp) -c0107805: 81 7d f0 a4 e1 12 c0 cmpl $0xc012e1a4,-0x10(%ebp) -c010780c: 75 cc jne c01077da +c0107a70: 8b 45 ec mov -0x14(%ebp),%eax +c0107a73: 8b 40 04 mov 0x4(%eax),%eax + while ((le = list_next(le)) != list) { // 遍历VMA列表 +c0107a76: 89 45 f4 mov %eax,-0xc(%ebp) +c0107a79: 8b 45 f4 mov -0xc(%ebp),%eax +c0107a7c: 3b 45 f0 cmp -0x10(%ebp),%eax +c0107a7f: 75 c1 jne c0107a42 + } + } + if (!found) {// 如果未找到合适的VMA +c0107a81: 83 7d f8 00 cmpl $0x0,-0x8(%ebp) +c0107a85: 75 07 jne c0107a8e + vma = NULL;// 将VMA指针设置为NULL +c0107a87: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) + } + } + // 如果找到了合适的VMA,更新mmap_cache + if (vma != NULL) { +c0107a8e: 83 7d fc 00 cmpl $0x0,-0x4(%ebp) +c0107a92: 74 09 je c0107a9d + mm->mmap_cache = vma;// 更新mmap_cache以加速后续查找 +c0107a94: 8b 45 08 mov 0x8(%ebp),%eax +c0107a97: 8b 55 fc mov -0x4(%ebp),%edx +c0107a9a: 89 50 08 mov %edx,0x8(%eax) } } - if (page != NULL) {// 如果找到合适的块 -c010780e: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0107812: 0f 84 eb 00 00 00 je c0107903 - //list_del(&(page->page_link));// 从空闲列表中删除该块 - if (page->property > n) { -c0107818: 8b 45 f4 mov -0xc(%ebp),%eax -c010781b: 8b 40 08 mov 0x8(%eax),%eax -c010781e: 39 45 08 cmp %eax,0x8(%ebp) -c0107821: 0f 83 88 00 00 00 jae c01078af - struct Page *p = page + n;// 指向剩余的页 -c0107827: 8b 45 08 mov 0x8(%ebp),%eax -c010782a: c1 e0 05 shl $0x5,%eax -c010782d: 89 c2 mov %eax,%edx -c010782f: 8b 45 f4 mov -0xc(%ebp),%eax -c0107832: 01 d0 add %edx,%eax -c0107834: 89 45 e8 mov %eax,-0x18(%ebp) - p->property = page->property - n;// 更新剩余块的页数 -c0107837: 8b 45 f4 mov -0xc(%ebp),%eax -c010783a: 8b 40 08 mov 0x8(%eax),%eax -c010783d: 2b 45 08 sub 0x8(%ebp),%eax -c0107840: 89 c2 mov %eax,%edx -c0107842: 8b 45 e8 mov -0x18(%ebp),%eax -c0107845: 89 50 08 mov %edx,0x8(%eax) - SetPageProperty(p); -c0107848: 8b 45 e8 mov -0x18(%ebp),%eax -c010784b: 83 c0 04 add $0x4,%eax -c010784e: c7 45 cc 01 00 00 00 movl $0x1,-0x34(%ebp) -c0107855: 89 45 c8 mov %eax,-0x38(%ebp) - asm volatile ("btsl %1, %0" :"=m" (*(volatile long *)addr) : "Ir" (nr)); -c0107858: 8b 45 c8 mov -0x38(%ebp),%eax -c010785b: 8b 55 cc mov -0x34(%ebp),%edx -c010785e: 0f ab 10 bts %edx,(%eax) -} -c0107861: 90 nop - list_add_after(&(page->page_link), &(p->page_link));// 将剩余块添加回空闲列表 -c0107862: 8b 45 e8 mov -0x18(%ebp),%eax -c0107865: 83 c0 0c add $0xc,%eax -c0107868: 8b 55 f4 mov -0xc(%ebp),%edx -c010786b: 83 c2 0c add $0xc,%edx -c010786e: 89 55 e0 mov %edx,-0x20(%ebp) -c0107871: 89 45 dc mov %eax,-0x24(%ebp) - __list_add(elm, listelm, listelm->next); -c0107874: 8b 45 e0 mov -0x20(%ebp),%eax -c0107877: 8b 40 04 mov 0x4(%eax),%eax -c010787a: 8b 55 dc mov -0x24(%ebp),%edx -c010787d: 89 55 d8 mov %edx,-0x28(%ebp) -c0107880: 8b 55 e0 mov -0x20(%ebp),%edx -c0107883: 89 55 d4 mov %edx,-0x2c(%ebp) -c0107886: 89 45 d0 mov %eax,-0x30(%ebp) - prev->next = next->prev = elm; -c0107889: 8b 45 d0 mov -0x30(%ebp),%eax -c010788c: 8b 55 d8 mov -0x28(%ebp),%edx -c010788f: 89 10 mov %edx,(%eax) -c0107891: 8b 45 d0 mov -0x30(%ebp),%eax -c0107894: 8b 10 mov (%eax),%edx -c0107896: 8b 45 d4 mov -0x2c(%ebp),%eax -c0107899: 89 50 04 mov %edx,0x4(%eax) - elm->next = next; -c010789c: 8b 45 d8 mov -0x28(%ebp),%eax -c010789f: 8b 55 d0 mov -0x30(%ebp),%edx -c01078a2: 89 50 04 mov %edx,0x4(%eax) - elm->prev = prev; -c01078a5: 8b 45 d8 mov -0x28(%ebp),%eax -c01078a8: 8b 55 d4 mov -0x2c(%ebp),%edx -c01078ab: 89 10 mov %edx,(%eax) -} -c01078ad: 90 nop -} -c01078ae: 90 nop - } - list_del(&(page->page_link)); -c01078af: 8b 45 f4 mov -0xc(%ebp),%eax -c01078b2: 83 c0 0c add $0xc,%eax -c01078b5: 89 45 bc mov %eax,-0x44(%ebp) - __list_del(listelm->prev, listelm->next); -c01078b8: 8b 45 bc mov -0x44(%ebp),%eax -c01078bb: 8b 40 04 mov 0x4(%eax),%eax -c01078be: 8b 55 bc mov -0x44(%ebp),%edx -c01078c1: 8b 12 mov (%edx),%edx -c01078c3: 89 55 b8 mov %edx,-0x48(%ebp) -c01078c6: 89 45 b4 mov %eax,-0x4c(%ebp) - prev->next = next; -c01078c9: 8b 45 b8 mov -0x48(%ebp),%eax -c01078cc: 8b 55 b4 mov -0x4c(%ebp),%edx -c01078cf: 89 50 04 mov %edx,0x4(%eax) - next->prev = prev; -c01078d2: 8b 45 b4 mov -0x4c(%ebp),%eax -c01078d5: 8b 55 b8 mov -0x48(%ebp),%edx -c01078d8: 89 10 mov %edx,(%eax) -} -c01078da: 90 nop -} -c01078db: 90 nop - nr_free -= n;// 减少空闲页的计数 -c01078dc: a1 ac e1 12 c0 mov 0xc012e1ac,%eax -c01078e1: 2b 45 08 sub 0x8(%ebp),%eax -c01078e4: a3 ac e1 12 c0 mov %eax,0xc012e1ac - ClearPageProperty(page);// 清除已分配页的属性 -c01078e9: 8b 45 f4 mov -0xc(%ebp),%eax -c01078ec: 83 c0 04 add $0x4,%eax -c01078ef: c7 45 c4 01 00 00 00 movl $0x1,-0x3c(%ebp) -c01078f6: 89 45 c0 mov %eax,-0x40(%ebp) - asm volatile ("btrl %1, %0" :"=m" (*(volatile long *)addr) : "Ir" (nr)); -c01078f9: 8b 45 c0 mov -0x40(%ebp),%eax -c01078fc: 8b 55 c4 mov -0x3c(%ebp),%edx -c01078ff: 0f b3 10 btr %edx,(%eax) -} -c0107902: 90 nop - } - return page;// 返回分配的页块 -c0107903: 8b 45 f4 mov -0xc(%ebp),%eax + return vma; +c0107a9d: 8b 45 fc mov -0x4(%ebp),%eax } -c0107906: c9 leave -c0107907: c3 ret +c0107aa0: 89 ec mov %ebp,%esp +c0107aa2: 5d pop %ebp +c0107aa3: c3 ret -c0107908 : +c0107aa4 : + * + * @param prev 指向前一个虚拟内存区域(VMA)的结构体指针 + * @param next 指向后一个虚拟内存区域(VMA)的结构体指针 + */ +static inline void +check_vma_overlap(struct vma_struct *prev, struct vma_struct *next) { +c0107aa4: 55 push %ebp +c0107aa5: 89 e5 mov %esp,%ebp +c0107aa7: 83 ec 18 sub $0x18,%esp + assert(prev->vm_start < prev->vm_end);// 确保前一个VMA的地址范围是有效的 +c0107aaa: 8b 45 08 mov 0x8(%ebp),%eax +c0107aad: 8b 50 04 mov 0x4(%eax),%edx +c0107ab0: 8b 45 08 mov 0x8(%ebp),%eax +c0107ab3: 8b 40 08 mov 0x8(%eax),%eax +c0107ab6: 39 c2 cmp %eax,%edx +c0107ab8: 72 24 jb c0107ade +c0107aba: c7 44 24 0c c5 ba 10 movl $0xc010bac5,0xc(%esp) +c0107ac1: c0 +c0107ac2: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c0107ac9: c0 +c0107aca: c7 44 24 04 a1 00 00 movl $0xa1,0x4(%esp) +c0107ad1: 00 +c0107ad2: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c0107ad9: e8 67 91 ff ff call c0100c45 <__panic> + assert(prev->vm_end <= next->vm_start);// 确保两个VMA之间没有重叠 +c0107ade: 8b 45 08 mov 0x8(%ebp),%eax +c0107ae1: 8b 50 08 mov 0x8(%eax),%edx +c0107ae4: 8b 45 0c mov 0xc(%ebp),%eax +c0107ae7: 8b 40 04 mov 0x4(%eax),%eax +c0107aea: 39 c2 cmp %eax,%edx +c0107aec: 76 24 jbe c0107b12 +c0107aee: c7 44 24 0c 08 bb 10 movl $0xc010bb08,0xc(%esp) +c0107af5: c0 +c0107af6: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c0107afd: c0 +c0107afe: c7 44 24 04 a2 00 00 movl $0xa2,0x4(%esp) +c0107b05: 00 +c0107b06: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c0107b0d: e8 33 91 ff ff call c0100c45 <__panic> + assert(next->vm_start < next->vm_end);// 确保后一个VMA的地址范围是有效的 +c0107b12: 8b 45 0c mov 0xc(%ebp),%eax +c0107b15: 8b 50 04 mov 0x4(%eax),%edx +c0107b18: 8b 45 0c mov 0xc(%ebp),%eax +c0107b1b: 8b 40 08 mov 0x8(%eax),%eax +c0107b1e: 39 c2 cmp %eax,%edx +c0107b20: 72 24 jb c0107b46 +c0107b22: c7 44 24 0c 27 bb 10 movl $0xc010bb27,0xc(%esp) +c0107b29: c0 +c0107b2a: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c0107b31: c0 +c0107b32: c7 44 24 04 a3 00 00 movl $0xa3,0x4(%esp) +c0107b39: 00 +c0107b3a: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c0107b41: e8 ff 90 ff ff call c0100c45 <__panic> +} +c0107b46: 90 nop +c0107b47: 89 ec mov %ebp,%esp +c0107b49: 5d pop %ebp +c0107b4a: c3 ret + +c0107b4b : + * + * @param mm 指向内存描述符结构 `struct mm_struct` 的指针,表示一个进程的内存空间。 + * @param vma 指向要插入的VMA结构 `struct vma_struct` 的指针,描述一个内存区域。 + */ +void +insert_vma_struct(struct mm_struct *mm, struct vma_struct *vma) { +c0107b4b: 55 push %ebp +c0107b4c: 89 e5 mov %esp,%ebp +c0107b4e: 83 ec 48 sub $0x48,%esp + // 断言VMA结构的起始地址小于结束地址,确保VMA结构的有效性。 + assert(vma->vm_start < vma->vm_end); +c0107b51: 8b 45 0c mov 0xc(%ebp),%eax +c0107b54: 8b 50 04 mov 0x4(%eax),%edx +c0107b57: 8b 45 0c mov 0xc(%ebp),%eax +c0107b5a: 8b 40 08 mov 0x8(%eax),%eax +c0107b5d: 39 c2 cmp %eax,%edx +c0107b5f: 72 24 jb c0107b85 +c0107b61: c7 44 24 0c 45 bb 10 movl $0xc010bb45,0xc(%esp) +c0107b68: c0 +c0107b69: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c0107b70: c0 +c0107b71: c7 44 24 04 b4 00 00 movl $0xb4,0x4(%esp) +c0107b78: 00 +c0107b79: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c0107b80: e8 c0 90 ff ff call c0100c45 <__panic> + // 指向内存描述符中的VMA链表。 + list_entry_t *list = &(mm->mmap_list); +c0107b85: 8b 45 08 mov 0x8(%ebp),%eax +c0107b88: 89 45 ec mov %eax,-0x14(%ebp) + // 遍历链表以找到新VMA结构的正确插入位置。 + list_entry_t *le_prev = list, *le_next; +c0107b8b: 8b 45 ec mov -0x14(%ebp),%eax +c0107b8e: 89 45 f4 mov %eax,-0xc(%ebp) -static void -default_free_pages(struct Page *base, size_t n) { -c0107908: f3 0f 1e fb endbr32 -c010790c: 55 push %ebp -c010790d: 89 e5 mov %esp,%ebp -c010790f: 81 ec 98 00 00 00 sub $0x98,%esp - assert(n > 0);// 确保请求释放的页数大于零 -c0107915: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) -c0107919: 75 24 jne c010793f -c010791b: c7 44 24 0c 9c bd 10 movl $0xc010bd9c,0xc(%esp) -c0107922: c0 -c0107923: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c010792a: c0 -c010792b: c7 44 24 04 cb 00 00 movl $0xcb,0x4(%esp) -c0107932: 00 -c0107933: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c010793a: e8 04 8b ff ff call c0100443 <__panic> - struct Page *p = base; -c010793f: 8b 45 08 mov 0x8(%ebp),%eax -c0107942: 89 45 f4 mov %eax,-0xc(%ebp) - // 遍历释放的页,检查状态并重置 - for (; p != base + n; p ++) { -c0107945: e9 9d 00 00 00 jmp c01079e7 - assert(!PageReserved(p) && !PageProperty(p));// 确保页没有被保留并且没有属性 -c010794a: 8b 45 f4 mov -0xc(%ebp),%eax -c010794d: 83 c0 04 add $0x4,%eax -c0107950: c7 45 ec 00 00 00 00 movl $0x0,-0x14(%ebp) -c0107957: 89 45 e8 mov %eax,-0x18(%ebp) - asm volatile ("btl %2, %1; sbbl %0,%0" : "=r" (oldbit) : "m" (*(volatile long *)addr), "Ir" (nr)); -c010795a: 8b 45 e8 mov -0x18(%ebp),%eax -c010795d: 8b 55 ec mov -0x14(%ebp),%edx -c0107960: 0f a3 10 bt %edx,(%eax) -c0107963: 19 c0 sbb %eax,%eax -c0107965: 89 45 e4 mov %eax,-0x1c(%ebp) - return oldbit != 0; -c0107968: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) -c010796c: 0f 95 c0 setne %al -c010796f: 0f b6 c0 movzbl %al,%eax -c0107972: 85 c0 test %eax,%eax -c0107974: 75 2c jne c01079a2 -c0107976: 8b 45 f4 mov -0xc(%ebp),%eax -c0107979: 83 c0 04 add $0x4,%eax -c010797c: c7 45 e0 01 00 00 00 movl $0x1,-0x20(%ebp) -c0107983: 89 45 dc mov %eax,-0x24(%ebp) - asm volatile ("btl %2, %1; sbbl %0,%0" : "=r" (oldbit) : "m" (*(volatile long *)addr), "Ir" (nr)); -c0107986: 8b 45 dc mov -0x24(%ebp),%eax -c0107989: 8b 55 e0 mov -0x20(%ebp),%edx -c010798c: 0f a3 10 bt %edx,(%eax) -c010798f: 19 c0 sbb %eax,%eax -c0107991: 89 45 d8 mov %eax,-0x28(%ebp) - return oldbit != 0; -c0107994: 83 7d d8 00 cmpl $0x0,-0x28(%ebp) -c0107998: 0f 95 c0 setne %al -c010799b: 0f b6 c0 movzbl %al,%eax -c010799e: 85 c0 test %eax,%eax -c01079a0: 74 24 je c01079c6 -c01079a2: c7 44 24 0c e0 bd 10 movl $0xc010bde0,0xc(%esp) -c01079a9: c0 -c01079aa: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c01079b1: c0 -c01079b2: c7 44 24 04 cf 00 00 movl $0xcf,0x4(%esp) -c01079b9: 00 -c01079ba: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c01079c1: e8 7d 8a ff ff call c0100443 <__panic> - p->flags = 0;// 清除 flags 字段 -c01079c6: 8b 45 f4 mov -0xc(%ebp),%eax -c01079c9: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax) - set_page_ref(p, 0);// 清除引用计数 -c01079d0: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c01079d7: 00 -c01079d8: 8b 45 f4 mov -0xc(%ebp),%eax -c01079db: 89 04 24 mov %eax,(%esp) -c01079de: e8 0f fc ff ff call c01075f2 - for (; p != base + n; p ++) { -c01079e3: 83 45 f4 20 addl $0x20,-0xc(%ebp) -c01079e7: 8b 45 0c mov 0xc(%ebp),%eax -c01079ea: c1 e0 05 shl $0x5,%eax -c01079ed: 89 c2 mov %eax,%edx -c01079ef: 8b 45 08 mov 0x8(%ebp),%eax -c01079f2: 01 d0 add %edx,%eax -c01079f4: 39 45 f4 cmp %eax,-0xc(%ebp) -c01079f7: 0f 85 4d ff ff ff jne c010794a + list_entry_t *le = list; +c0107b91: 8b 45 ec mov -0x14(%ebp),%eax +c0107b94: 89 45 f0 mov %eax,-0x10(%ebp) + // 遍历链表以找到新VMA结构的正确插入位置 + while ((le = list_next(le)) != list) { +c0107b97: eb 1f jmp c0107bb8 + struct vma_struct *mmap_prev = le2vma(le, list_link); +c0107b99: 8b 45 f0 mov -0x10(%ebp),%eax +c0107b9c: 83 e8 10 sub $0x10,%eax +c0107b9f: 89 45 e8 mov %eax,-0x18(%ebp) + // 如果当前VMA的起始地址大于新VMA的起始地址,则跳出循环 + if (mmap_prev->vm_start > vma->vm_start) { +c0107ba2: 8b 45 e8 mov -0x18(%ebp),%eax +c0107ba5: 8b 50 04 mov 0x4(%eax),%edx +c0107ba8: 8b 45 0c mov 0xc(%ebp),%eax +c0107bab: 8b 40 04 mov 0x4(%eax),%eax +c0107bae: 39 c2 cmp %eax,%edx +c0107bb0: 77 1f ja c0107bd1 + break; + } + le_prev = le; +c0107bb2: 8b 45 f0 mov -0x10(%ebp),%eax +c0107bb5: 89 45 f4 mov %eax,-0xc(%ebp) +c0107bb8: 8b 45 f0 mov -0x10(%ebp),%eax +c0107bbb: 89 45 e0 mov %eax,-0x20(%ebp) +c0107bbe: 8b 45 e0 mov -0x20(%ebp),%eax +c0107bc1: 8b 40 04 mov 0x4(%eax),%eax + while ((le = list_next(le)) != list) { +c0107bc4: 89 45 f0 mov %eax,-0x10(%ebp) +c0107bc7: 8b 45 f0 mov -0x10(%ebp),%eax +c0107bca: 3b 45 ec cmp -0x14(%ebp),%eax +c0107bcd: 75 ca jne c0107b99 +c0107bcf: eb 01 jmp c0107bd2 + break; +c0107bd1: 90 nop +c0107bd2: 8b 45 f4 mov -0xc(%ebp),%eax +c0107bd5: 89 45 dc mov %eax,-0x24(%ebp) +c0107bd8: 8b 45 dc mov -0x24(%ebp),%eax +c0107bdb: 8b 40 04 mov 0x4(%eax),%eax + } + // 获取下一个链表项 + le_next = list_next(le_prev); +c0107bde: 89 45 e4 mov %eax,-0x1c(%ebp) + + /* check overlap */ + // 检查前一个VMA结构是否与新VMA结构重叠 + if (le_prev != list) { +c0107be1: 8b 45 f4 mov -0xc(%ebp),%eax +c0107be4: 3b 45 ec cmp -0x14(%ebp),%eax +c0107be7: 74 15 je c0107bfe + check_vma_overlap(le2vma(le_prev, list_link), vma); +c0107be9: 8b 45 f4 mov -0xc(%ebp),%eax +c0107bec: 8d 50 f0 lea -0x10(%eax),%edx +c0107bef: 8b 45 0c mov 0xc(%ebp),%eax +c0107bf2: 89 44 24 04 mov %eax,0x4(%esp) +c0107bf6: 89 14 24 mov %edx,(%esp) +c0107bf9: e8 a6 fe ff ff call c0107aa4 } - // 设置基页的属性为释放的页数 - base->property = n; -c01079fd: 8b 45 08 mov 0x8(%ebp),%eax -c0107a00: 8b 55 0c mov 0xc(%ebp),%edx -c0107a03: 89 50 08 mov %edx,0x8(%eax) - SetPageProperty(base);// 设置页的有效标志 -c0107a06: 8b 45 08 mov 0x8(%ebp),%eax -c0107a09: 83 c0 04 add $0x4,%eax -c0107a0c: c7 45 d0 01 00 00 00 movl $0x1,-0x30(%ebp) -c0107a13: 89 45 cc mov %eax,-0x34(%ebp) - asm volatile ("btsl %1, %0" :"=m" (*(volatile long *)addr) : "Ir" (nr)); -c0107a16: 8b 45 cc mov -0x34(%ebp),%eax -c0107a19: 8b 55 d0 mov -0x30(%ebp),%edx -c0107a1c: 0f ab 10 bts %edx,(%eax) -} -c0107a1f: 90 nop -c0107a20: c7 45 d4 a4 e1 12 c0 movl $0xc012e1a4,-0x2c(%ebp) - return listelm->next; -c0107a27: 8b 45 d4 mov -0x2c(%ebp),%eax -c0107a2a: 8b 40 04 mov 0x4(%eax),%eax - // 遍历空闲列表,检查是否需要合并 - list_entry_t *le = list_next(&free_list); -c0107a2d: 89 45 f0 mov %eax,-0x10(%ebp) - while (le != &free_list) { -c0107a30: e9 00 01 00 00 jmp c0107b35 - p = le2page(le, page_link); -c0107a35: 8b 45 f0 mov -0x10(%ebp),%eax -c0107a38: 83 e8 0c sub $0xc,%eax -c0107a3b: 89 45 f4 mov %eax,-0xc(%ebp) -c0107a3e: 8b 45 f0 mov -0x10(%ebp),%eax -c0107a41: 89 45 c8 mov %eax,-0x38(%ebp) -c0107a44: 8b 45 c8 mov -0x38(%ebp),%eax -c0107a47: 8b 40 04 mov 0x4(%eax),%eax - le = list_next(le); -c0107a4a: 89 45 f0 mov %eax,-0x10(%ebp) - // 如果当前页块与释放的页块相邻,合并 - if (base + base->property == p) { -c0107a4d: 8b 45 08 mov 0x8(%ebp),%eax -c0107a50: 8b 40 08 mov 0x8(%eax),%eax -c0107a53: c1 e0 05 shl $0x5,%eax -c0107a56: 89 c2 mov %eax,%edx -c0107a58: 8b 45 08 mov 0x8(%ebp),%eax -c0107a5b: 01 d0 add %edx,%eax -c0107a5d: 39 45 f4 cmp %eax,-0xc(%ebp) -c0107a60: 75 5d jne c0107abf - base->property += p->property;// 合并当前页块 -c0107a62: 8b 45 08 mov 0x8(%ebp),%eax -c0107a65: 8b 50 08 mov 0x8(%eax),%edx -c0107a68: 8b 45 f4 mov -0xc(%ebp),%eax -c0107a6b: 8b 40 08 mov 0x8(%eax),%eax -c0107a6e: 01 c2 add %eax,%edx -c0107a70: 8b 45 08 mov 0x8(%ebp),%eax -c0107a73: 89 50 08 mov %edx,0x8(%eax) - ClearPageProperty(p);// 清除合并页的属性 -c0107a76: 8b 45 f4 mov -0xc(%ebp),%eax -c0107a79: 83 c0 04 add $0x4,%eax -c0107a7c: c7 45 b8 01 00 00 00 movl $0x1,-0x48(%ebp) -c0107a83: 89 45 b4 mov %eax,-0x4c(%ebp) - asm volatile ("btrl %1, %0" :"=m" (*(volatile long *)addr) : "Ir" (nr)); -c0107a86: 8b 45 b4 mov -0x4c(%ebp),%eax -c0107a89: 8b 55 b8 mov -0x48(%ebp),%edx -c0107a8c: 0f b3 10 btr %edx,(%eax) -} -c0107a8f: 90 nop - list_del(&(p->page_link));// 从空闲列表中删除合并页 -c0107a90: 8b 45 f4 mov -0xc(%ebp),%eax -c0107a93: 83 c0 0c add $0xc,%eax -c0107a96: 89 45 c4 mov %eax,-0x3c(%ebp) - __list_del(listelm->prev, listelm->next); -c0107a99: 8b 45 c4 mov -0x3c(%ebp),%eax -c0107a9c: 8b 40 04 mov 0x4(%eax),%eax -c0107a9f: 8b 55 c4 mov -0x3c(%ebp),%edx -c0107aa2: 8b 12 mov (%edx),%edx -c0107aa4: 89 55 c0 mov %edx,-0x40(%ebp) -c0107aa7: 89 45 bc mov %eax,-0x44(%ebp) - prev->next = next; -c0107aaa: 8b 45 c0 mov -0x40(%ebp),%eax -c0107aad: 8b 55 bc mov -0x44(%ebp),%edx -c0107ab0: 89 50 04 mov %edx,0x4(%eax) - next->prev = prev; -c0107ab3: 8b 45 bc mov -0x44(%ebp),%eax -c0107ab6: 8b 55 c0 mov -0x40(%ebp),%edx -c0107ab9: 89 10 mov %edx,(%eax) -} -c0107abb: 90 nop + // 检查下一个VMA结构是否与新VMA结构重叠 + if (le_next != list) { +c0107bfe: 8b 45 e4 mov -0x1c(%ebp),%eax +c0107c01: 3b 45 ec cmp -0x14(%ebp),%eax +c0107c04: 74 15 je c0107c1b + check_vma_overlap(vma, le2vma(le_next, list_link)); +c0107c06: 8b 45 e4 mov -0x1c(%ebp),%eax +c0107c09: 83 e8 10 sub $0x10,%eax +c0107c0c: 89 44 24 04 mov %eax,0x4(%esp) +c0107c10: 8b 45 0c mov 0xc(%ebp),%eax +c0107c13: 89 04 24 mov %eax,(%esp) +c0107c16: e8 89 fe ff ff call c0107aa4 + } + // 设置VMA结构所属的内存描述符 + vma->vm_mm = mm; +c0107c1b: 8b 45 0c mov 0xc(%ebp),%eax +c0107c1e: 8b 55 08 mov 0x8(%ebp),%edx +c0107c21: 89 10 mov %edx,(%eax) + // 将新VMA结构插入链表 + list_add_after(le_prev, &(vma->list_link)); +c0107c23: 8b 45 0c mov 0xc(%ebp),%eax +c0107c26: 8d 50 10 lea 0x10(%eax),%edx +c0107c29: 8b 45 f4 mov -0xc(%ebp),%eax +c0107c2c: 89 45 d8 mov %eax,-0x28(%ebp) +c0107c2f: 89 55 d4 mov %edx,-0x2c(%ebp) + __list_add(elm, listelm, listelm->next); +c0107c32: 8b 45 d8 mov -0x28(%ebp),%eax +c0107c35: 8b 40 04 mov 0x4(%eax),%eax +c0107c38: 8b 55 d4 mov -0x2c(%ebp),%edx +c0107c3b: 89 55 d0 mov %edx,-0x30(%ebp) +c0107c3e: 8b 55 d8 mov -0x28(%ebp),%edx +c0107c41: 89 55 cc mov %edx,-0x34(%ebp) +c0107c44: 89 45 c8 mov %eax,-0x38(%ebp) + prev->next = next->prev = elm; +c0107c47: 8b 45 c8 mov -0x38(%ebp),%eax +c0107c4a: 8b 55 d0 mov -0x30(%ebp),%edx +c0107c4d: 89 10 mov %edx,(%eax) +c0107c4f: 8b 45 c8 mov -0x38(%ebp),%eax +c0107c52: 8b 10 mov (%eax),%edx +c0107c54: 8b 45 cc mov -0x34(%ebp),%eax +c0107c57: 89 50 04 mov %edx,0x4(%eax) + elm->next = next; +c0107c5a: 8b 45 d0 mov -0x30(%ebp),%eax +c0107c5d: 8b 55 c8 mov -0x38(%ebp),%edx +c0107c60: 89 50 04 mov %edx,0x4(%eax) + elm->prev = prev; +c0107c63: 8b 45 d0 mov -0x30(%ebp),%eax +c0107c66: 8b 55 cc mov -0x34(%ebp),%edx +c0107c69: 89 10 mov %edx,(%eax) } -c0107abc: 90 nop -c0107abd: eb 76 jmp c0107b35 - } - else if (p + p->property == base) { -c0107abf: 8b 45 f4 mov -0xc(%ebp),%eax -c0107ac2: 8b 40 08 mov 0x8(%eax),%eax -c0107ac5: c1 e0 05 shl $0x5,%eax -c0107ac8: 89 c2 mov %eax,%edx -c0107aca: 8b 45 f4 mov -0xc(%ebp),%eax -c0107acd: 01 d0 add %edx,%eax -c0107acf: 39 45 08 cmp %eax,0x8(%ebp) -c0107ad2: 75 61 jne c0107b35 - p->property += base->property;// 合并前一个页块 -c0107ad4: 8b 45 f4 mov -0xc(%ebp),%eax -c0107ad7: 8b 50 08 mov 0x8(%eax),%edx -c0107ada: 8b 45 08 mov 0x8(%ebp),%eax -c0107add: 8b 40 08 mov 0x8(%eax),%eax -c0107ae0: 01 c2 add %eax,%edx -c0107ae2: 8b 45 f4 mov -0xc(%ebp),%eax -c0107ae5: 89 50 08 mov %edx,0x8(%eax) - ClearPageProperty(base);// 清除当前页的属性 -c0107ae8: 8b 45 08 mov 0x8(%ebp),%eax -c0107aeb: 83 c0 04 add $0x4,%eax -c0107aee: c7 45 a4 01 00 00 00 movl $0x1,-0x5c(%ebp) -c0107af5: 89 45 a0 mov %eax,-0x60(%ebp) - asm volatile ("btrl %1, %0" :"=m" (*(volatile long *)addr) : "Ir" (nr)); -c0107af8: 8b 45 a0 mov -0x60(%ebp),%eax -c0107afb: 8b 55 a4 mov -0x5c(%ebp),%edx -c0107afe: 0f b3 10 btr %edx,(%eax) +c0107c6b: 90 nop } -c0107b01: 90 nop - base = p;// 更新 base 指针 -c0107b02: 8b 45 f4 mov -0xc(%ebp),%eax -c0107b05: 89 45 08 mov %eax,0x8(%ebp) - list_del(&(p->page_link));// 从空闲列表中删除当前页 -c0107b08: 8b 45 f4 mov -0xc(%ebp),%eax -c0107b0b: 83 c0 0c add $0xc,%eax -c0107b0e: 89 45 b0 mov %eax,-0x50(%ebp) +c0107c6c: 90 nop + // 增加内存描述符中的映射计数 + mm->map_count ++; +c0107c6d: 8b 45 08 mov 0x8(%ebp),%eax +c0107c70: 8b 40 10 mov 0x10(%eax),%eax +c0107c73: 8d 50 01 lea 0x1(%eax),%edx +c0107c76: 8b 45 08 mov 0x8(%ebp),%eax +c0107c79: 89 50 10 mov %edx,0x10(%eax) +} +c0107c7c: 90 nop +c0107c7d: 89 ec mov %ebp,%esp +c0107c7f: 5d pop %ebp +c0107c80: c3 ret + +c0107c81 : + * 此函数遍历并销毁与内存管理结构(mm_struct)关联的所有虚拟内存区域(VMA), + * 然后释放内存管理结构本身所占用的内存。这样做是为了确保在销毁内存管理结构之前, + * 所有相关的资源都被正确地释放。 + */ +void +mm_destroy(struct mm_struct *mm) { +c0107c81: 55 push %ebp +c0107c82: 89 e5 mov %esp,%ebp +c0107c84: 83 ec 38 sub $0x38,%esp + // 获取内存映射列表的头指针 + list_entry_t *list = &(mm->mmap_list), *le; +c0107c87: 8b 45 08 mov 0x8(%ebp),%eax +c0107c8a: 89 45 f4 mov %eax,-0xc(%ebp) + // 遍历内存映射列表,直到回到起点 + while ((le = list_next(list)) != list) { +c0107c8d: eb 38 jmp c0107cc7 +c0107c8f: 8b 45 f0 mov -0x10(%ebp),%eax +c0107c92: 89 45 ec mov %eax,-0x14(%ebp) __list_del(listelm->prev, listelm->next); -c0107b11: 8b 45 b0 mov -0x50(%ebp),%eax -c0107b14: 8b 40 04 mov 0x4(%eax),%eax -c0107b17: 8b 55 b0 mov -0x50(%ebp),%edx -c0107b1a: 8b 12 mov (%edx),%edx -c0107b1c: 89 55 ac mov %edx,-0x54(%ebp) -c0107b1f: 89 45 a8 mov %eax,-0x58(%ebp) +c0107c95: 8b 45 ec mov -0x14(%ebp),%eax +c0107c98: 8b 40 04 mov 0x4(%eax),%eax +c0107c9b: 8b 55 ec mov -0x14(%ebp),%edx +c0107c9e: 8b 12 mov (%edx),%edx +c0107ca0: 89 55 e8 mov %edx,-0x18(%ebp) +c0107ca3: 89 45 e4 mov %eax,-0x1c(%ebp) prev->next = next; -c0107b22: 8b 45 ac mov -0x54(%ebp),%eax -c0107b25: 8b 55 a8 mov -0x58(%ebp),%edx -c0107b28: 89 50 04 mov %edx,0x4(%eax) +c0107ca6: 8b 45 e8 mov -0x18(%ebp),%eax +c0107ca9: 8b 55 e4 mov -0x1c(%ebp),%edx +c0107cac: 89 50 04 mov %edx,0x4(%eax) next->prev = prev; -c0107b2b: 8b 45 a8 mov -0x58(%ebp),%eax -c0107b2e: 8b 55 ac mov -0x54(%ebp),%edx -c0107b31: 89 10 mov %edx,(%eax) +c0107caf: 8b 45 e4 mov -0x1c(%ebp),%eax +c0107cb2: 8b 55 e8 mov -0x18(%ebp),%edx +c0107cb5: 89 10 mov %edx,(%eax) } -c0107b33: 90 nop +c0107cb7: 90 nop } -c0107b34: 90 nop - while (le != &free_list) { -c0107b35: 81 7d f0 a4 e1 12 c0 cmpl $0xc012e1a4,-0x10(%ebp) -c0107b3c: 0f 85 f3 fe ff ff jne c0107a35 - } - } - nr_free += n;// 更新空闲页的计数 -c0107b42: 8b 15 ac e1 12 c0 mov 0xc012e1ac,%edx -c0107b48: 8b 45 0c mov 0xc(%ebp),%eax -c0107b4b: 01 d0 add %edx,%eax -c0107b4d: a3 ac e1 12 c0 mov %eax,0xc012e1ac -c0107b52: c7 45 9c a4 e1 12 c0 movl $0xc012e1a4,-0x64(%ebp) +c0107cb8: 90 nop + // 从列表中删除当前虚拟内存区域的项 + list_del(le); + // 释放虚拟内存区域结构的内存 + kfree(le2vma(le, list_link)); +c0107cb9: 8b 45 f0 mov -0x10(%ebp),%eax +c0107cbc: 83 e8 10 sub $0x10,%eax +c0107cbf: 89 04 24 mov %eax,(%esp) +c0107cc2: e8 a0 ce ff ff call c0104b67 +c0107cc7: 8b 45 f4 mov -0xc(%ebp),%eax +c0107cca: 89 45 e0 mov %eax,-0x20(%ebp) return listelm->next; -c0107b59: 8b 45 9c mov -0x64(%ebp),%eax -c0107b5c: 8b 40 04 mov 0x4(%eax),%eax - le = list_next(&free_list); -c0107b5f: 89 45 f0 mov %eax,-0x10(%ebp) - while (le != &free_list) -c0107b62: eb 66 jmp c0107bca - { - p = le2page(le, page_link); -c0107b64: 8b 45 f0 mov -0x10(%ebp),%eax -c0107b67: 83 e8 0c sub $0xc,%eax -c0107b6a: 89 45 f4 mov %eax,-0xc(%ebp) - if (base + base->property <= p) -c0107b6d: 8b 45 08 mov 0x8(%ebp),%eax -c0107b70: 8b 40 08 mov 0x8(%eax),%eax -c0107b73: c1 e0 05 shl $0x5,%eax -c0107b76: 89 c2 mov %eax,%edx -c0107b78: 8b 45 08 mov 0x8(%ebp),%eax -c0107b7b: 01 d0 add %edx,%eax -c0107b7d: 39 45 f4 cmp %eax,-0xc(%ebp) -c0107b80: 72 39 jb c0107bbb - { - assert(base + base->property != p); -c0107b82: 8b 45 08 mov 0x8(%ebp),%eax -c0107b85: 8b 40 08 mov 0x8(%eax),%eax -c0107b88: c1 e0 05 shl $0x5,%eax -c0107b8b: 89 c2 mov %eax,%edx -c0107b8d: 8b 45 08 mov 0x8(%ebp),%eax -c0107b90: 01 d0 add %edx,%eax -c0107b92: 39 45 f4 cmp %eax,-0xc(%ebp) -c0107b95: 75 3e jne c0107bd5 -c0107b97: c7 44 24 0c 05 be 10 movl $0xc010be05,0xc(%esp) -c0107b9e: c0 -c0107b9f: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0107ba6: c0 -c0107ba7: c7 44 24 04 ef 00 00 movl $0xef,0x4(%esp) -c0107bae: 00 -c0107baf: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0107bb6: e8 88 88 ff ff call c0100443 <__panic> -c0107bbb: 8b 45 f0 mov -0x10(%ebp),%eax -c0107bbe: 89 45 98 mov %eax,-0x68(%ebp) -c0107bc1: 8b 45 98 mov -0x68(%ebp),%eax -c0107bc4: 8b 40 04 mov 0x4(%eax),%eax - break; - } - le = list_next(le); -c0107bc7: 89 45 f0 mov %eax,-0x10(%ebp) - while (le != &free_list) -c0107bca: 81 7d f0 a4 e1 12 c0 cmpl $0xc012e1a4,-0x10(%ebp) -c0107bd1: 75 91 jne c0107b64 -c0107bd3: eb 01 jmp c0107bd6 - break; -c0107bd5: 90 nop +c0107ccd: 8b 45 e0 mov -0x20(%ebp),%eax +c0107cd0: 8b 40 04 mov 0x4(%eax),%eax + while ((le = list_next(list)) != list) { +c0107cd3: 89 45 f0 mov %eax,-0x10(%ebp) +c0107cd6: 8b 45 f0 mov -0x10(%ebp),%eax +c0107cd9: 3b 45 f4 cmp -0xc(%ebp),%eax +c0107cdc: 75 b1 jne c0107c8f + //kfree(le2vma(le, list_link), sizeof(struct vma_struct)); //kfree vma } - - list_add_before(le, &(base->page_link));// 将释放的页块添加到空闲列表中 -c0107bd6: 8b 45 08 mov 0x8(%ebp),%eax -c0107bd9: 8d 50 0c lea 0xc(%eax),%edx -c0107bdc: 8b 45 f0 mov -0x10(%ebp),%eax -c0107bdf: 89 45 94 mov %eax,-0x6c(%ebp) -c0107be2: 89 55 90 mov %edx,-0x70(%ebp) - __list_add(elm, listelm->prev, listelm); -c0107be5: 8b 45 94 mov -0x6c(%ebp),%eax -c0107be8: 8b 00 mov (%eax),%eax -c0107bea: 8b 55 90 mov -0x70(%ebp),%edx -c0107bed: 89 55 8c mov %edx,-0x74(%ebp) -c0107bf0: 89 45 88 mov %eax,-0x78(%ebp) -c0107bf3: 8b 45 94 mov -0x6c(%ebp),%eax -c0107bf6: 89 45 84 mov %eax,-0x7c(%ebp) - prev->next = next->prev = elm; -c0107bf9: 8b 45 84 mov -0x7c(%ebp),%eax -c0107bfc: 8b 55 8c mov -0x74(%ebp),%edx -c0107bff: 89 10 mov %edx,(%eax) -c0107c01: 8b 45 84 mov -0x7c(%ebp),%eax -c0107c04: 8b 10 mov (%eax),%edx -c0107c06: 8b 45 88 mov -0x78(%ebp),%eax -c0107c09: 89 50 04 mov %edx,0x4(%eax) - elm->next = next; -c0107c0c: 8b 45 8c mov -0x74(%ebp),%eax -c0107c0f: 8b 55 84 mov -0x7c(%ebp),%edx -c0107c12: 89 50 04 mov %edx,0x4(%eax) - elm->prev = prev; -c0107c15: 8b 45 8c mov -0x74(%ebp),%eax -c0107c18: 8b 55 88 mov -0x78(%ebp),%edx -c0107c1b: 89 10 mov %edx,(%eax) -} -c0107c1d: 90 nop -} -c0107c1e: 90 nop + // 释放内存管理结构本身的内存 + kfree(mm); //kfree mm +c0107cde: 8b 45 08 mov 0x8(%ebp),%eax +c0107ce1: 89 04 24 mov %eax,(%esp) +c0107ce4: e8 7e ce ff ff call c0104b67 + //kfree(mm, sizeof(struct mm_struct)); //kfree mm + // 将指针设置为NULL,表示该结构已被销毁 + mm=NULL; +c0107ce9: c7 45 08 00 00 00 00 movl $0x0,0x8(%ebp) } -c0107c1f: 90 nop -c0107c20: c9 leave -c0107c21: c3 ret +c0107cf0: 90 nop +c0107cf1: 89 ec mov %ebp,%esp +c0107cf3: 5d pop %ebp +c0107cf4: c3 ret -c0107c22 : +c0107cf5 : +/** + * 初始化虚拟内存管理(VMM)系统。 + * 此函数通过执行一系列检查来确保VMM系统可以正确初始化和运行。 + */ +void +vmm_init(void) { +c0107cf5: 55 push %ebp +c0107cf6: 89 e5 mov %esp,%ebp +c0107cf8: 83 ec 08 sub $0x8,%esp + // 检查VMM系统的状态和环境,以确保其能够正常工作。 + check_vmm(); +c0107cfb: e8 05 00 00 00 call c0107d05 +} +c0107d00: 90 nop +c0107d01: 89 ec mov %ebp,%esp +c0107d03: 5d pop %ebp +c0107d04: c3 ret -//用于返回当前系统中可用的空闲页的数量。 -static size_t -default_nr_free_pages(void) { -c0107c22: f3 0f 1e fb endbr32 -c0107c26: 55 push %ebp -c0107c27: 89 e5 mov %esp,%ebp - return nr_free;// 返回当前空闲页的数量 -c0107c29: a1 ac e1 12 c0 mov 0xc012e1ac,%eax +c0107d05 : + * 此函数的目的是确保虚拟内存管理系统的正确性通过检查内存区域结构(VMA)、页面故障处理以及免费页面计数的 consistency 来实现 + * 它首先保存当前的免费页面数量,然后执行与 VMA 和页面故障相关的检查,最后确认免费页面数量未发生变化 + * 这是为了确保在检查过程中,内存状态没有因为错误或意外的修改而改变,从而验证内存管理的正确性 + */ +static void +check_vmm(void) { +c0107d05: 55 push %ebp +c0107d06: 89 e5 mov %esp,%ebp +c0107d08: 83 ec 28 sub $0x28,%esp + // 保存当前的免费页面数量,用于后续的 consistency 检查 + size_t nr_free_pages_store = nr_free_pages(); +c0107d0b: e8 6d d3 ff ff call c010507d +c0107d10: 89 45 f4 mov %eax,-0xc(%ebp) + // 检查虚拟内存区域(VMA)结构的正确性 + check_vma_struct(); +c0107d13: e8 16 00 00 00 call c0107d2e + // 检查页面故障处理的正确性 + check_pgfault(); +c0107d18: e8 a5 04 00 00 call c01081c2 + // 确保在检查过程中免费页面数量未发生变化,表明内存管理操作是正确的 + // assert(nr_free_pages_store == nr_free_pages()); + // 如果所有检查都通过,输出成功信息 + cprintf("check_vmm() succeeded.\n"); +c0107d1d: c7 04 24 61 bb 10 c0 movl $0xc010bb61,(%esp) +c0107d24: e8 4f 86 ff ff call c0100378 } -c0107c2e: 5d pop %ebp -c0107c2f: c3 ret +c0107d29: 90 nop +c0107d2a: 89 ec mov %ebp,%esp +c0107d2c: 5d pop %ebp +c0107d2d: c3 ret -c0107c30 : +c0107d2e : -//basic_check 函数用于测试内存分配和释放的基本功能, -//确保在不同情况下内存管理系统的正确性,包括分配、释放、合并和引用计数等操作。 +//测试虚拟内存区域(VMA)结构的创建、插入和查找功能。 static void -basic_check(void) { -c0107c30: f3 0f 1e fb endbr32 -c0107c34: 55 push %ebp -c0107c35: 89 e5 mov %esp,%ebp -c0107c37: 83 ec 48 sub $0x48,%esp - struct Page *p0, *p1, *p2; - p0 = p1 = p2 = NULL; -c0107c3a: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) -c0107c41: 8b 45 f4 mov -0xc(%ebp),%eax -c0107c44: 89 45 f0 mov %eax,-0x10(%ebp) -c0107c47: 8b 45 f0 mov -0x10(%ebp),%eax -c0107c4a: 89 45 ec mov %eax,-0x14(%ebp) - // 分配三个页面 - assert((p0 = alloc_page()) != NULL); -c0107c4d: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0107c54: e8 00 bb ff ff call c0103759 -c0107c59: 89 45 ec mov %eax,-0x14(%ebp) -c0107c5c: 83 7d ec 00 cmpl $0x0,-0x14(%ebp) -c0107c60: 75 24 jne c0107c86 -c0107c62: c7 44 24 0c 20 be 10 movl $0xc010be20,0xc(%esp) -c0107c69: c0 -c0107c6a: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0107c71: c0 -c0107c72: c7 44 24 04 05 01 00 movl $0x105,0x4(%esp) -c0107c79: 00 -c0107c7a: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0107c81: e8 bd 87 ff ff call c0100443 <__panic> - assert((p1 = alloc_page()) != NULL); -c0107c86: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0107c8d: e8 c7 ba ff ff call c0103759 -c0107c92: 89 45 f0 mov %eax,-0x10(%ebp) -c0107c95: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c0107c99: 75 24 jne c0107cbf -c0107c9b: c7 44 24 0c 3c be 10 movl $0xc010be3c,0xc(%esp) -c0107ca2: c0 -c0107ca3: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0107caa: c0 -c0107cab: c7 44 24 04 06 01 00 movl $0x106,0x4(%esp) -c0107cb2: 00 -c0107cb3: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0107cba: e8 84 87 ff ff call c0100443 <__panic> - assert((p2 = alloc_page()) != NULL); -c0107cbf: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0107cc6: e8 8e ba ff ff call c0103759 -c0107ccb: 89 45 f4 mov %eax,-0xc(%ebp) -c0107cce: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0107cd2: 75 24 jne c0107cf8 -c0107cd4: c7 44 24 0c 58 be 10 movl $0xc010be58,0xc(%esp) -c0107cdb: c0 -c0107cdc: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0107ce3: c0 -c0107ce4: c7 44 24 04 07 01 00 movl $0x107,0x4(%esp) -c0107ceb: 00 -c0107cec: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0107cf3: e8 4b 87 ff ff call c0100443 <__panic> - // 确保所有分配的页面是不同的 - assert(p0 != p1 && p0 != p2 && p1 != p2); -c0107cf8: 8b 45 ec mov -0x14(%ebp),%eax -c0107cfb: 3b 45 f0 cmp -0x10(%ebp),%eax -c0107cfe: 74 10 je c0107d10 -c0107d00: 8b 45 ec mov -0x14(%ebp),%eax -c0107d03: 3b 45 f4 cmp -0xc(%ebp),%eax -c0107d06: 74 08 je c0107d10 -c0107d08: 8b 45 f0 mov -0x10(%ebp),%eax -c0107d0b: 3b 45 f4 cmp -0xc(%ebp),%eax -c0107d0e: 75 24 jne c0107d34 -c0107d10: c7 44 24 0c 74 be 10 movl $0xc010be74,0xc(%esp) -c0107d17: c0 -c0107d18: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0107d1f: c0 -c0107d20: c7 44 24 04 09 01 00 movl $0x109,0x4(%esp) -c0107d27: 00 -c0107d28: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0107d2f: e8 0f 87 ff ff call c0100443 <__panic> - // 确保页面的引用计数为 0 - assert(page_ref(p0) == 0 && page_ref(p1) == 0 && page_ref(p2) == 0); -c0107d34: 8b 45 ec mov -0x14(%ebp),%eax -c0107d37: 89 04 24 mov %eax,(%esp) -c0107d3a: e8 a9 f8 ff ff call c01075e8 -c0107d3f: 85 c0 test %eax,%eax -c0107d41: 75 1e jne c0107d61 -c0107d43: 8b 45 f0 mov -0x10(%ebp),%eax -c0107d46: 89 04 24 mov %eax,(%esp) -c0107d49: e8 9a f8 ff ff call c01075e8 -c0107d4e: 85 c0 test %eax,%eax -c0107d50: 75 0f jne c0107d61 -c0107d52: 8b 45 f4 mov -0xc(%ebp),%eax -c0107d55: 89 04 24 mov %eax,(%esp) -c0107d58: e8 8b f8 ff ff call c01075e8 -c0107d5d: 85 c0 test %eax,%eax -c0107d5f: 74 24 je c0107d85 -c0107d61: c7 44 24 0c 98 be 10 movl $0xc010be98,0xc(%esp) -c0107d68: c0 -c0107d69: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0107d70: c0 -c0107d71: c7 44 24 04 0b 01 00 movl $0x10b,0x4(%esp) -c0107d78: 00 -c0107d79: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0107d80: e8 be 86 ff ff call c0100443 <__panic> - // 确保页面地址在合法范围内 - assert(page2pa(p0) < npage * PGSIZE); -c0107d85: 8b 45 ec mov -0x14(%ebp),%eax -c0107d88: 89 04 24 mov %eax,(%esp) -c0107d8b: e8 42 f8 ff ff call c01075d2 -c0107d90: 8b 15 80 bf 12 c0 mov 0xc012bf80,%edx -c0107d96: c1 e2 0c shl $0xc,%edx -c0107d99: 39 d0 cmp %edx,%eax -c0107d9b: 72 24 jb c0107dc1 -c0107d9d: c7 44 24 0c d4 be 10 movl $0xc010bed4,0xc(%esp) -c0107da4: c0 -c0107da5: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0107dac: c0 -c0107dad: c7 44 24 04 0d 01 00 movl $0x10d,0x4(%esp) -c0107db4: 00 -c0107db5: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0107dbc: e8 82 86 ff ff call c0100443 <__panic> - assert(page2pa(p1) < npage * PGSIZE); -c0107dc1: 8b 45 f0 mov -0x10(%ebp),%eax -c0107dc4: 89 04 24 mov %eax,(%esp) -c0107dc7: e8 06 f8 ff ff call c01075d2 -c0107dcc: 8b 15 80 bf 12 c0 mov 0xc012bf80,%edx -c0107dd2: c1 e2 0c shl $0xc,%edx -c0107dd5: 39 d0 cmp %edx,%eax -c0107dd7: 72 24 jb c0107dfd -c0107dd9: c7 44 24 0c f1 be 10 movl $0xc010bef1,0xc(%esp) -c0107de0: c0 -c0107de1: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0107de8: c0 -c0107de9: c7 44 24 04 0e 01 00 movl $0x10e,0x4(%esp) -c0107df0: 00 -c0107df1: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0107df8: e8 46 86 ff ff call c0100443 <__panic> - assert(page2pa(p2) < npage * PGSIZE); -c0107dfd: 8b 45 f4 mov -0xc(%ebp),%eax -c0107e00: 89 04 24 mov %eax,(%esp) -c0107e03: e8 ca f7 ff ff call c01075d2 -c0107e08: 8b 15 80 bf 12 c0 mov 0xc012bf80,%edx -c0107e0e: c1 e2 0c shl $0xc,%edx -c0107e11: 39 d0 cmp %edx,%eax -c0107e13: 72 24 jb c0107e39 -c0107e15: c7 44 24 0c 0e bf 10 movl $0xc010bf0e,0xc(%esp) -c0107e1c: c0 -c0107e1d: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0107e24: c0 -c0107e25: c7 44 24 04 0f 01 00 movl $0x10f,0x4(%esp) -c0107e2c: 00 -c0107e2d: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0107e34: e8 0a 86 ff ff call c0100443 <__panic> - // 保存当前的空闲页面链表和数量 - list_entry_t free_list_store = free_list; -c0107e39: a1 a4 e1 12 c0 mov 0xc012e1a4,%eax -c0107e3e: 8b 15 a8 e1 12 c0 mov 0xc012e1a8,%edx -c0107e44: 89 45 d0 mov %eax,-0x30(%ebp) -c0107e47: 89 55 d4 mov %edx,-0x2c(%ebp) -c0107e4a: c7 45 dc a4 e1 12 c0 movl $0xc012e1a4,-0x24(%ebp) - elm->prev = elm->next = elm; -c0107e51: 8b 45 dc mov -0x24(%ebp),%eax -c0107e54: 8b 55 dc mov -0x24(%ebp),%edx -c0107e57: 89 50 04 mov %edx,0x4(%eax) -c0107e5a: 8b 45 dc mov -0x24(%ebp),%eax -c0107e5d: 8b 50 04 mov 0x4(%eax),%edx -c0107e60: 8b 45 dc mov -0x24(%ebp),%eax -c0107e63: 89 10 mov %edx,(%eax) -} -c0107e65: 90 nop -c0107e66: c7 45 e0 a4 e1 12 c0 movl $0xc012e1a4,-0x20(%ebp) - return list->next == list; -c0107e6d: 8b 45 e0 mov -0x20(%ebp),%eax -c0107e70: 8b 40 04 mov 0x4(%eax),%eax -c0107e73: 39 45 e0 cmp %eax,-0x20(%ebp) -c0107e76: 0f 94 c0 sete %al -c0107e79: 0f b6 c0 movzbl %al,%eax - list_init(&free_list);// 初始化空闲列表 - assert(list_empty(&free_list));// 确保空闲列表为空 -c0107e7c: 85 c0 test %eax,%eax -c0107e7e: 75 24 jne c0107ea4 -c0107e80: c7 44 24 0c 2b bf 10 movl $0xc010bf2b,0xc(%esp) -c0107e87: c0 -c0107e88: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0107e8f: c0 -c0107e90: c7 44 24 04 13 01 00 movl $0x113,0x4(%esp) -c0107e97: 00 -c0107e98: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0107e9f: e8 9f 85 ff ff call c0100443 <__panic> +check_vma_struct(void) { +c0107d2e: 55 push %ebp +c0107d2f: 89 e5 mov %esp,%ebp +c0107d31: 83 ec 68 sub $0x68,%esp + // 记录当前空闲页面数量 + size_t nr_free_pages_store = nr_free_pages(); +c0107d34: e8 44 d3 ff ff call c010507d +c0107d39: 89 45 ec mov %eax,-0x14(%ebp) - unsigned int nr_free_store = nr_free;// 保存当前空闲页数量 -c0107ea4: a1 ac e1 12 c0 mov 0xc012e1ac,%eax -c0107ea9: 89 45 e8 mov %eax,-0x18(%ebp) - nr_free = 0;// 将空闲页数量设为 0 -c0107eac: c7 05 ac e1 12 c0 00 movl $0x0,0xc012e1ac -c0107eb3: 00 00 00 - // 请求分配页面,但当前没有空闲页面 - assert(alloc_page() == NULL); -c0107eb6: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0107ebd: e8 97 b8 ff ff call c0103759 -c0107ec2: 85 c0 test %eax,%eax -c0107ec4: 74 24 je c0107eea -c0107ec6: c7 44 24 0c 42 bf 10 movl $0xc010bf42,0xc(%esp) -c0107ecd: c0 -c0107ece: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0107ed5: c0 -c0107ed6: c7 44 24 04 18 01 00 movl $0x118,0x4(%esp) -c0107edd: 00 -c0107ede: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0107ee5: e8 59 85 ff ff call c0100443 <__panic> - // 释放之前分配的页面 - free_page(p0); -c0107eea: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c0107ef1: 00 -c0107ef2: 8b 45 ec mov -0x14(%ebp),%eax -c0107ef5: 89 04 24 mov %eax,(%esp) -c0107ef8: e8 cb b8 ff ff call c01037c8 - free_page(p1); -c0107efd: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c0107f04: 00 -c0107f05: 8b 45 f0 mov -0x10(%ebp),%eax -c0107f08: 89 04 24 mov %eax,(%esp) -c0107f0b: e8 b8 b8 ff ff call c01037c8 - free_page(p2); -c0107f10: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c0107f17: 00 -c0107f18: 8b 45 f4 mov -0xc(%ebp),%eax -c0107f1b: 89 04 24 mov %eax,(%esp) -c0107f1e: e8 a5 b8 ff ff call c01037c8 - assert(nr_free == 3);// 确保释放后空闲页数量为 3 -c0107f23: a1 ac e1 12 c0 mov 0xc012e1ac,%eax -c0107f28: 83 f8 03 cmp $0x3,%eax -c0107f2b: 74 24 je c0107f51 -c0107f2d: c7 44 24 0c 57 bf 10 movl $0xc010bf57,0xc(%esp) -c0107f34: c0 -c0107f35: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0107f3c: c0 -c0107f3d: c7 44 24 04 1d 01 00 movl $0x11d,0x4(%esp) -c0107f44: 00 -c0107f45: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0107f4c: e8 f2 84 ff ff call c0100443 <__panic> - // 再次分配三个页面 - assert((p0 = alloc_page()) != NULL); -c0107f51: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0107f58: e8 fc b7 ff ff call c0103759 -c0107f5d: 89 45 ec mov %eax,-0x14(%ebp) -c0107f60: 83 7d ec 00 cmpl $0x0,-0x14(%ebp) -c0107f64: 75 24 jne c0107f8a -c0107f66: c7 44 24 0c 20 be 10 movl $0xc010be20,0xc(%esp) -c0107f6d: c0 -c0107f6e: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0107f75: c0 -c0107f76: c7 44 24 04 1f 01 00 movl $0x11f,0x4(%esp) -c0107f7d: 00 -c0107f7e: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0107f85: e8 b9 84 ff ff call c0100443 <__panic> - assert((p1 = alloc_page()) != NULL); -c0107f8a: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0107f91: e8 c3 b7 ff ff call c0103759 -c0107f96: 89 45 f0 mov %eax,-0x10(%ebp) -c0107f99: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c0107f9d: 75 24 jne c0107fc3 -c0107f9f: c7 44 24 0c 3c be 10 movl $0xc010be3c,0xc(%esp) -c0107fa6: c0 -c0107fa7: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0107fae: c0 -c0107faf: c7 44 24 04 20 01 00 movl $0x120,0x4(%esp) -c0107fb6: 00 -c0107fb7: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0107fbe: e8 80 84 ff ff call c0100443 <__panic> - assert((p2 = alloc_page()) != NULL); -c0107fc3: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0107fca: e8 8a b7 ff ff call c0103759 -c0107fcf: 89 45 f4 mov %eax,-0xc(%ebp) -c0107fd2: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0107fd6: 75 24 jne c0107ffc -c0107fd8: c7 44 24 0c 58 be 10 movl $0xc010be58,0xc(%esp) -c0107fdf: c0 -c0107fe0: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0107fe7: c0 -c0107fe8: c7 44 24 04 21 01 00 movl $0x121,0x4(%esp) -c0107fef: 00 -c0107ff0: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0107ff7: e8 47 84 ff ff call c0100443 <__panic> - // 测试空闲页面是否不足 - assert(alloc_page() == NULL); -c0107ffc: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0108003: e8 51 b7 ff ff call c0103759 -c0108008: 85 c0 test %eax,%eax -c010800a: 74 24 je c0108030 -c010800c: c7 44 24 0c 42 bf 10 movl $0xc010bf42,0xc(%esp) -c0108013: c0 -c0108014: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c010801b: c0 -c010801c: c7 44 24 04 23 01 00 movl $0x123,0x4(%esp) -c0108023: 00 -c0108024: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c010802b: e8 13 84 ff ff call c0100443 <__panic> - // 释放 p0,并检查空闲列表 - free_page(p0); -c0108030: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c0108037: 00 -c0108038: 8b 45 ec mov -0x14(%ebp),%eax -c010803b: 89 04 24 mov %eax,(%esp) -c010803e: e8 85 b7 ff ff call c01037c8 -c0108043: c7 45 d8 a4 e1 12 c0 movl $0xc012e1a4,-0x28(%ebp) -c010804a: 8b 45 d8 mov -0x28(%ebp),%eax -c010804d: 8b 40 04 mov 0x4(%eax),%eax -c0108050: 39 45 d8 cmp %eax,-0x28(%ebp) -c0108053: 0f 94 c0 sete %al -c0108056: 0f b6 c0 movzbl %al,%eax - assert(!list_empty(&free_list));// 确保空闲列表不为空 -c0108059: 85 c0 test %eax,%eax -c010805b: 74 24 je c0108081 -c010805d: c7 44 24 0c 64 bf 10 movl $0xc010bf64,0xc(%esp) -c0108064: c0 -c0108065: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c010806c: c0 -c010806d: c7 44 24 04 26 01 00 movl $0x126,0x4(%esp) -c0108074: 00 -c0108075: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c010807c: e8 c2 83 ff ff call c0100443 <__panic> + struct mm_struct *mm = mm_create();// 创建内存管理结构 mm +c0107d3c: e8 f8 fb ff ff call c0107939 +c0107d41: 89 45 e8 mov %eax,-0x18(%ebp) + assert(mm != NULL);// 确保 mm 不为 NULL +c0107d44: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) +c0107d48: 75 24 jne c0107d6e +c0107d4a: c7 44 24 0c 79 bb 10 movl $0xc010bb79,0xc(%esp) +c0107d51: c0 +c0107d52: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c0107d59: c0 +c0107d5a: c7 44 24 04 1d 01 00 movl $0x11d,0x4(%esp) +c0107d61: 00 +c0107d62: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c0107d69: e8 d7 8e ff ff call c0100c45 <__panic> - struct Page *p; - // 重新分配 p0,确保取回的是相同的页面 - assert((p = alloc_page()) == p0); -c0108081: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0108088: e8 cc b6 ff ff call c0103759 -c010808d: 89 45 e4 mov %eax,-0x1c(%ebp) -c0108090: 8b 45 e4 mov -0x1c(%ebp),%eax -c0108093: 3b 45 ec cmp -0x14(%ebp),%eax -c0108096: 74 24 je c01080bc -c0108098: c7 44 24 0c 7c bf 10 movl $0xc010bf7c,0xc(%esp) -c010809f: c0 -c01080a0: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c01080a7: c0 -c01080a8: c7 44 24 04 2a 01 00 movl $0x12a,0x4(%esp) -c01080af: 00 -c01080b0: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c01080b7: e8 87 83 ff ff call c0100443 <__panic> - assert(alloc_page() == NULL);// 确保没有更多的页面可分配 -c01080bc: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c01080c3: e8 91 b6 ff ff call c0103759 -c01080c8: 85 c0 test %eax,%eax -c01080ca: 74 24 je c01080f0 -c01080cc: c7 44 24 0c 42 bf 10 movl $0xc010bf42,0xc(%esp) -c01080d3: c0 -c01080d4: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c01080db: c0 -c01080dc: c7 44 24 04 2b 01 00 movl $0x12b,0x4(%esp) -c01080e3: 00 -c01080e4: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c01080eb: e8 53 83 ff ff call c0100443 <__panic> + int step1 = 10, step2 = step1 * 10;// 定义两个步骤的步数 +c0107d6e: c7 45 e4 0a 00 00 00 movl $0xa,-0x1c(%ebp) +c0107d75: 8b 55 e4 mov -0x1c(%ebp),%edx +c0107d78: 89 d0 mov %edx,%eax +c0107d7a: c1 e0 02 shl $0x2,%eax +c0107d7d: 01 d0 add %edx,%eax +c0107d7f: 01 c0 add %eax,%eax +c0107d81: 89 45 e0 mov %eax,-0x20(%ebp) - assert(nr_free == 0);// 确保当前空闲页面数量为 0 -c01080f0: a1 ac e1 12 c0 mov 0xc012e1ac,%eax -c01080f5: 85 c0 test %eax,%eax -c01080f7: 74 24 je c010811d -c01080f9: c7 44 24 0c 95 bf 10 movl $0xc010bf95,0xc(%esp) -c0108100: c0 -c0108101: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0108108: c0 -c0108109: c7 44 24 04 2d 01 00 movl $0x12d,0x4(%esp) -c0108110: 00 -c0108111: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0108118: e8 26 83 ff ff call c0100443 <__panic> - // 恢复之前的空闲页面链表和数量 - free_list = free_list_store; -c010811d: 8b 45 d0 mov -0x30(%ebp),%eax -c0108120: 8b 55 d4 mov -0x2c(%ebp),%edx -c0108123: a3 a4 e1 12 c0 mov %eax,0xc012e1a4 -c0108128: 89 15 a8 e1 12 c0 mov %edx,0xc012e1a8 - nr_free = nr_free_store; -c010812e: 8b 45 e8 mov -0x18(%ebp),%eax -c0108131: a3 ac e1 12 c0 mov %eax,0xc012e1ac - // 释放最后的页面 - free_page(p); -c0108136: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c010813d: 00 -c010813e: 8b 45 e4 mov -0x1c(%ebp),%eax -c0108141: 89 04 24 mov %eax,(%esp) -c0108144: e8 7f b6 ff ff call c01037c8 - free_page(p1); -c0108149: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c0108150: 00 -c0108151: 8b 45 f0 mov -0x10(%ebp),%eax -c0108154: 89 04 24 mov %eax,(%esp) -c0108157: e8 6c b6 ff ff call c01037c8 - free_page(p2); -c010815c: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c0108163: 00 -c0108164: 8b 45 f4 mov -0xc(%ebp),%eax -c0108167: 89 04 24 mov %eax,(%esp) -c010816a: e8 59 b6 ff ff call c01037c8 -} -c010816f: 90 nop -c0108170: c9 leave -c0108171: c3 ret + int i; + for (i = step1; i >= 1; i --) {// 第一步:创建并插入10个VMA +c0107d84: 8b 45 e4 mov -0x1c(%ebp),%eax +c0107d87: 89 45 f4 mov %eax,-0xc(%ebp) +c0107d8a: eb 6f jmp c0107dfb + // 创建 VMA 结构 + struct vma_struct *vma = vma_create(i * 5, i * 5 + 2, 0); +c0107d8c: 8b 55 f4 mov -0xc(%ebp),%edx +c0107d8f: 89 d0 mov %edx,%eax +c0107d91: c1 e0 02 shl $0x2,%eax +c0107d94: 01 d0 add %edx,%eax +c0107d96: 83 c0 02 add $0x2,%eax +c0107d99: 89 c1 mov %eax,%ecx +c0107d9b: 8b 55 f4 mov -0xc(%ebp),%edx +c0107d9e: 89 d0 mov %edx,%eax +c0107da0: c1 e0 02 shl $0x2,%eax +c0107da3: 01 d0 add %edx,%eax +c0107da5: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c0107dac: 00 +c0107dad: 89 4c 24 04 mov %ecx,0x4(%esp) +c0107db1: 89 04 24 mov %eax,(%esp) +c0107db4: e8 fb fb ff ff call c01079b4 +c0107db9: 89 45 bc mov %eax,-0x44(%ebp) + assert(vma != NULL);// 确保 VMA 不为 NULL +c0107dbc: 83 7d bc 00 cmpl $0x0,-0x44(%ebp) +c0107dc0: 75 24 jne c0107de6 +c0107dc2: c7 44 24 0c 84 bb 10 movl $0xc010bb84,0xc(%esp) +c0107dc9: c0 +c0107dca: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c0107dd1: c0 +c0107dd2: c7 44 24 04 25 01 00 movl $0x125,0x4(%esp) +c0107dd9: 00 +c0107dda: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c0107de1: e8 5f 8e ff ff call c0100c45 <__panic> + insert_vma_struct(mm, vma); //将 VMA 插入到 mm 中 +c0107de6: 8b 45 bc mov -0x44(%ebp),%eax +c0107de9: 89 44 24 04 mov %eax,0x4(%esp) +c0107ded: 8b 45 e8 mov -0x18(%ebp),%eax +c0107df0: 89 04 24 mov %eax,(%esp) +c0107df3: e8 53 fd ff ff call c0107b4b + for (i = step1; i >= 1; i --) {// 第一步:创建并插入10个VMA +c0107df8: ff 4d f4 decl -0xc(%ebp) +c0107dfb: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0107dff: 7f 8b jg c0107d8c + } -c0108172 : + for (i = step1 + 1; i <= step2; i ++) {// 第二步:创建并插入90个VMA +c0107e01: 8b 45 e4 mov -0x1c(%ebp),%eax +c0107e04: 40 inc %eax +c0107e05: 89 45 f4 mov %eax,-0xc(%ebp) +c0107e08: eb 6f jmp c0107e79 + // 创建 VMA 结构 + struct vma_struct *vma = vma_create(i * 5, i * 5 + 2, 0); +c0107e0a: 8b 55 f4 mov -0xc(%ebp),%edx +c0107e0d: 89 d0 mov %edx,%eax +c0107e0f: c1 e0 02 shl $0x2,%eax +c0107e12: 01 d0 add %edx,%eax +c0107e14: 83 c0 02 add $0x2,%eax +c0107e17: 89 c1 mov %eax,%ecx +c0107e19: 8b 55 f4 mov -0xc(%ebp),%edx +c0107e1c: 89 d0 mov %edx,%eax +c0107e1e: c1 e0 02 shl $0x2,%eax +c0107e21: 01 d0 add %edx,%eax +c0107e23: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c0107e2a: 00 +c0107e2b: 89 4c 24 04 mov %ecx,0x4(%esp) +c0107e2f: 89 04 24 mov %eax,(%esp) +c0107e32: e8 7d fb ff ff call c01079b4 +c0107e37: 89 45 c0 mov %eax,-0x40(%ebp) + assert(vma != NULL);// 确保 VMA 不为 NULL +c0107e3a: 83 7d c0 00 cmpl $0x0,-0x40(%ebp) +c0107e3e: 75 24 jne c0107e64 +c0107e40: c7 44 24 0c 84 bb 10 movl $0xc010bb84,0xc(%esp) +c0107e47: c0 +c0107e48: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c0107e4f: c0 +c0107e50: c7 44 24 04 2c 01 00 movl $0x12c,0x4(%esp) +c0107e57: 00 +c0107e58: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c0107e5f: e8 e1 8d ff ff call c0100c45 <__panic> + insert_vma_struct(mm, vma);// 将 VMA 插入到 mm 中 +c0107e64: 8b 45 c0 mov -0x40(%ebp),%eax +c0107e67: 89 44 24 04 mov %eax,0x4(%esp) +c0107e6b: 8b 45 e8 mov -0x18(%ebp),%eax +c0107e6e: 89 04 24 mov %eax,(%esp) +c0107e71: e8 d5 fc ff ff call c0107b4b + for (i = step1 + 1; i <= step2; i ++) {// 第二步:创建并插入90个VMA +c0107e76: ff 45 f4 incl -0xc(%ebp) +c0107e79: 8b 45 f4 mov -0xc(%ebp),%eax +c0107e7c: 3b 45 e0 cmp -0x20(%ebp),%eax +c0107e7f: 7e 89 jle c0107e0a + } + // 获取 VMA 链表的第一个节点 + list_entry_t *le = list_next(&(mm->mmap_list)); +c0107e81: 8b 45 e8 mov -0x18(%ebp),%eax +c0107e84: 89 45 b8 mov %eax,-0x48(%ebp) +c0107e87: 8b 45 b8 mov -0x48(%ebp),%eax +c0107e8a: 8b 40 04 mov 0x4(%eax),%eax +c0107e8d: 89 45 f0 mov %eax,-0x10(%ebp) -// LAB2: below code is used to check the first fit allocation algorithm (your EXERCISE 1) -// NOTICE: You SHOULD NOT CHANGE basic_check, default_check functions! -static void -default_check(void) { -c0108172: f3 0f 1e fb endbr32 -c0108176: 55 push %ebp -c0108177: 89 e5 mov %esp,%ebp -c0108179: 81 ec 98 00 00 00 sub $0x98,%esp - int count = 0, total = 0; -c010817f: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) -c0108186: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%ebp) - list_entry_t *le = &free_list; -c010818d: c7 45 ec a4 e1 12 c0 movl $0xc012e1a4,-0x14(%ebp) - // 遍历空闲列表,计算空闲页面的数量和总属性值 - while ((le = list_next(le)) != &free_list) { -c0108194: eb 6a jmp c0108200 - struct Page *p = le2page(le, page_link); -c0108196: 8b 45 ec mov -0x14(%ebp),%eax -c0108199: 83 e8 0c sub $0xc,%eax -c010819c: 89 45 d4 mov %eax,-0x2c(%ebp) - assert(PageProperty(p));// 确保每个页面的属性是有效的 -c010819f: 8b 45 d4 mov -0x2c(%ebp),%eax -c01081a2: 83 c0 04 add $0x4,%eax -c01081a5: c7 45 d0 01 00 00 00 movl $0x1,-0x30(%ebp) -c01081ac: 89 45 cc mov %eax,-0x34(%ebp) - asm volatile ("btl %2, %1; sbbl %0,%0" : "=r" (oldbit) : "m" (*(volatile long *)addr), "Ir" (nr)); -c01081af: 8b 45 cc mov -0x34(%ebp),%eax -c01081b2: 8b 55 d0 mov -0x30(%ebp),%edx -c01081b5: 0f a3 10 bt %edx,(%eax) -c01081b8: 19 c0 sbb %eax,%eax -c01081ba: 89 45 c8 mov %eax,-0x38(%ebp) - return oldbit != 0; -c01081bd: 83 7d c8 00 cmpl $0x0,-0x38(%ebp) -c01081c1: 0f 95 c0 setne %al -c01081c4: 0f b6 c0 movzbl %al,%eax -c01081c7: 85 c0 test %eax,%eax -c01081c9: 75 24 jne c01081ef -c01081cb: c7 44 24 0c a2 bf 10 movl $0xc010bfa2,0xc(%esp) -c01081d2: c0 -c01081d3: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c01081da: c0 -c01081db: c7 44 24 04 40 01 00 movl $0x140,0x4(%esp) -c01081e2: 00 -c01081e3: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c01081ea: e8 54 82 ff ff call c0100443 <__panic> - count ++, total += p->property;// 累加页面属性 -c01081ef: ff 45 f4 incl -0xc(%ebp) -c01081f2: 8b 45 d4 mov -0x2c(%ebp),%eax -c01081f5: 8b 50 08 mov 0x8(%eax),%edx -c01081f8: 8b 45 f0 mov -0x10(%ebp),%eax -c01081fb: 01 d0 add %edx,%eax -c01081fd: 89 45 f0 mov %eax,-0x10(%ebp) -c0108200: 8b 45 ec mov -0x14(%ebp),%eax -c0108203: 89 45 c4 mov %eax,-0x3c(%ebp) - return listelm->next; -c0108206: 8b 45 c4 mov -0x3c(%ebp),%eax -c0108209: 8b 40 04 mov 0x4(%eax),%eax - while ((le = list_next(le)) != &free_list) { -c010820c: 89 45 ec mov %eax,-0x14(%ebp) -c010820f: 81 7d ec a4 e1 12 c0 cmpl $0xc012e1a4,-0x14(%ebp) -c0108216: 0f 85 7a ff ff ff jne c0108196 + for (i = 1; i <= step2; i ++) {// 验证插入顺序 +c0107e90: c7 45 f4 01 00 00 00 movl $0x1,-0xc(%ebp) +c0107e97: e9 96 00 00 00 jmp c0107f32 + assert(le != &(mm->mmap_list));// 确保节点不为空 +c0107e9c: 8b 45 e8 mov -0x18(%ebp),%eax +c0107e9f: 39 45 f0 cmp %eax,-0x10(%ebp) +c0107ea2: 75 24 jne c0107ec8 +c0107ea4: c7 44 24 0c 90 bb 10 movl $0xc010bb90,0xc(%esp) +c0107eab: c0 +c0107eac: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c0107eb3: c0 +c0107eb4: c7 44 24 04 33 01 00 movl $0x133,0x4(%esp) +c0107ebb: 00 +c0107ebc: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c0107ec3: e8 7d 8d ff ff call c0100c45 <__panic> + struct vma_struct *mmap = le2vma(le, list_link);// 将链表节点转换为 VMA 结构 +c0107ec8: 8b 45 f0 mov -0x10(%ebp),%eax +c0107ecb: 83 e8 10 sub $0x10,%eax +c0107ece: 89 45 c4 mov %eax,-0x3c(%ebp) + // 确认 VMA 的起始和结束地址 + assert(mmap->vm_start == i * 5 && mmap->vm_end == i * 5 + 2); +c0107ed1: 8b 45 c4 mov -0x3c(%ebp),%eax +c0107ed4: 8b 48 04 mov 0x4(%eax),%ecx +c0107ed7: 8b 55 f4 mov -0xc(%ebp),%edx +c0107eda: 89 d0 mov %edx,%eax +c0107edc: c1 e0 02 shl $0x2,%eax +c0107edf: 01 d0 add %edx,%eax +c0107ee1: 39 c1 cmp %eax,%ecx +c0107ee3: 75 17 jne c0107efc +c0107ee5: 8b 45 c4 mov -0x3c(%ebp),%eax +c0107ee8: 8b 48 08 mov 0x8(%eax),%ecx +c0107eeb: 8b 55 f4 mov -0xc(%ebp),%edx +c0107eee: 89 d0 mov %edx,%eax +c0107ef0: c1 e0 02 shl $0x2,%eax +c0107ef3: 01 d0 add %edx,%eax +c0107ef5: 83 c0 02 add $0x2,%eax +c0107ef8: 39 c1 cmp %eax,%ecx +c0107efa: 74 24 je c0107f20 +c0107efc: c7 44 24 0c a8 bb 10 movl $0xc010bba8,0xc(%esp) +c0107f03: c0 +c0107f04: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c0107f0b: c0 +c0107f0c: c7 44 24 04 36 01 00 movl $0x136,0x4(%esp) +c0107f13: 00 +c0107f14: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c0107f1b: e8 25 8d ff ff call c0100c45 <__panic> +c0107f20: 8b 45 f0 mov -0x10(%ebp),%eax +c0107f23: 89 45 b4 mov %eax,-0x4c(%ebp) +c0107f26: 8b 45 b4 mov -0x4c(%ebp),%eax +c0107f29: 8b 40 04 mov 0x4(%eax),%eax + le = list_next(le);// 移动到下一个节点 +c0107f2c: 89 45 f0 mov %eax,-0x10(%ebp) + for (i = 1; i <= step2; i ++) {// 验证插入顺序 +c0107f2f: ff 45 f4 incl -0xc(%ebp) +c0107f32: 8b 45 f4 mov -0xc(%ebp),%eax +c0107f35: 3b 45 e0 cmp -0x20(%ebp),%eax +c0107f38: 0f 8e 5e ff ff ff jle c0107e9c + } + + for (i = 5; i <= 5 * step2; i +=5) {// 查找特定地址范围内的 VMA +c0107f3e: c7 45 f4 05 00 00 00 movl $0x5,-0xc(%ebp) +c0107f45: e9 cb 01 00 00 jmp c0108115 + struct vma_struct *vma1 = find_vma(mm, i);// 查找地址 i 处的 VMA +c0107f4a: 8b 45 f4 mov -0xc(%ebp),%eax +c0107f4d: 89 44 24 04 mov %eax,0x4(%esp) +c0107f51: 8b 45 e8 mov -0x18(%ebp),%eax +c0107f54: 89 04 24 mov %eax,(%esp) +c0107f57: e8 95 fa ff ff call c01079f1 +c0107f5c: 89 45 d8 mov %eax,-0x28(%ebp) + assert(vma1 != NULL);// 确保找到 VMA +c0107f5f: 83 7d d8 00 cmpl $0x0,-0x28(%ebp) +c0107f63: 75 24 jne c0107f89 +c0107f65: c7 44 24 0c dd bb 10 movl $0xc010bbdd,0xc(%esp) +c0107f6c: c0 +c0107f6d: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c0107f74: c0 +c0107f75: c7 44 24 04 3c 01 00 movl $0x13c,0x4(%esp) +c0107f7c: 00 +c0107f7d: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c0107f84: e8 bc 8c ff ff call c0100c45 <__panic> + // 查找地址 i + 1 处的 VMA + struct vma_struct *vma2 = find_vma(mm, i+1); +c0107f89: 8b 45 f4 mov -0xc(%ebp),%eax +c0107f8c: 40 inc %eax +c0107f8d: 89 44 24 04 mov %eax,0x4(%esp) +c0107f91: 8b 45 e8 mov -0x18(%ebp),%eax +c0107f94: 89 04 24 mov %eax,(%esp) +c0107f97: e8 55 fa ff ff call c01079f1 +c0107f9c: 89 45 d4 mov %eax,-0x2c(%ebp) + assert(vma2 != NULL);// 确保找到 VMA +c0107f9f: 83 7d d4 00 cmpl $0x0,-0x2c(%ebp) +c0107fa3: 75 24 jne c0107fc9 +c0107fa5: c7 44 24 0c ea bb 10 movl $0xc010bbea,0xc(%esp) +c0107fac: c0 +c0107fad: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c0107fb4: c0 +c0107fb5: c7 44 24 04 3f 01 00 movl $0x13f,0x4(%esp) +c0107fbc: 00 +c0107fbd: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c0107fc4: e8 7c 8c ff ff call c0100c45 <__panic> + // 查找地址 i + 2 处的 VMA + struct vma_struct *vma3 = find_vma(mm, i+2); +c0107fc9: 8b 45 f4 mov -0xc(%ebp),%eax +c0107fcc: 83 c0 02 add $0x2,%eax +c0107fcf: 89 44 24 04 mov %eax,0x4(%esp) +c0107fd3: 8b 45 e8 mov -0x18(%ebp),%eax +c0107fd6: 89 04 24 mov %eax,(%esp) +c0107fd9: e8 13 fa ff ff call c01079f1 +c0107fde: 89 45 d0 mov %eax,-0x30(%ebp) + assert(vma3 == NULL);// 确保未找到 VMA +c0107fe1: 83 7d d0 00 cmpl $0x0,-0x30(%ebp) +c0107fe5: 74 24 je c010800b +c0107fe7: c7 44 24 0c f7 bb 10 movl $0xc010bbf7,0xc(%esp) +c0107fee: c0 +c0107fef: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c0107ff6: c0 +c0107ff7: c7 44 24 04 42 01 00 movl $0x142,0x4(%esp) +c0107ffe: 00 +c0107fff: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c0108006: e8 3a 8c ff ff call c0100c45 <__panic> + // 查找地址 i + 3 处的 VMA + struct vma_struct *vma4 = find_vma(mm, i+3); +c010800b: 8b 45 f4 mov -0xc(%ebp),%eax +c010800e: 83 c0 03 add $0x3,%eax +c0108011: 89 44 24 04 mov %eax,0x4(%esp) +c0108015: 8b 45 e8 mov -0x18(%ebp),%eax +c0108018: 89 04 24 mov %eax,(%esp) +c010801b: e8 d1 f9 ff ff call c01079f1 +c0108020: 89 45 cc mov %eax,-0x34(%ebp) + assert(vma4 == NULL);// 确保未找到 VMA +c0108023: 83 7d cc 00 cmpl $0x0,-0x34(%ebp) +c0108027: 74 24 je c010804d +c0108029: c7 44 24 0c 04 bc 10 movl $0xc010bc04,0xc(%esp) +c0108030: c0 +c0108031: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c0108038: c0 +c0108039: c7 44 24 04 45 01 00 movl $0x145,0x4(%esp) +c0108040: 00 +c0108041: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c0108048: e8 f8 8b ff ff call c0100c45 <__panic> + // 查找地址 i + 4 处的 VMA + struct vma_struct *vma5 = find_vma(mm, i+4); +c010804d: 8b 45 f4 mov -0xc(%ebp),%eax +c0108050: 83 c0 04 add $0x4,%eax +c0108053: 89 44 24 04 mov %eax,0x4(%esp) +c0108057: 8b 45 e8 mov -0x18(%ebp),%eax +c010805a: 89 04 24 mov %eax,(%esp) +c010805d: e8 8f f9 ff ff call c01079f1 +c0108062: 89 45 c8 mov %eax,-0x38(%ebp) + assert(vma5 == NULL);// 确保未找到 VMA +c0108065: 83 7d c8 00 cmpl $0x0,-0x38(%ebp) +c0108069: 74 24 je c010808f +c010806b: c7 44 24 0c 11 bc 10 movl $0xc010bc11,0xc(%esp) +c0108072: c0 +c0108073: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c010807a: c0 +c010807b: c7 44 24 04 48 01 00 movl $0x148,0x4(%esp) +c0108082: 00 +c0108083: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c010808a: e8 b6 8b ff ff call c0100c45 <__panic> + // 确认 VMA1 的起始和结束地址 + assert(vma1->vm_start == i && vma1->vm_end == i + 2); +c010808f: 8b 45 d8 mov -0x28(%ebp),%eax +c0108092: 8b 50 04 mov 0x4(%eax),%edx +c0108095: 8b 45 f4 mov -0xc(%ebp),%eax +c0108098: 39 c2 cmp %eax,%edx +c010809a: 75 10 jne c01080ac +c010809c: 8b 45 d8 mov -0x28(%ebp),%eax +c010809f: 8b 40 08 mov 0x8(%eax),%eax +c01080a2: 8b 55 f4 mov -0xc(%ebp),%edx +c01080a5: 83 c2 02 add $0x2,%edx +c01080a8: 39 d0 cmp %edx,%eax +c01080aa: 74 24 je c01080d0 +c01080ac: c7 44 24 0c 20 bc 10 movl $0xc010bc20,0xc(%esp) +c01080b3: c0 +c01080b4: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c01080bb: c0 +c01080bc: c7 44 24 04 4a 01 00 movl $0x14a,0x4(%esp) +c01080c3: 00 +c01080c4: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c01080cb: e8 75 8b ff ff call c0100c45 <__panic> + // 确认 VMA2 的起始和结束地址 + assert(vma2->vm_start == i && vma2->vm_end == i + 2); +c01080d0: 8b 45 d4 mov -0x2c(%ebp),%eax +c01080d3: 8b 50 04 mov 0x4(%eax),%edx +c01080d6: 8b 45 f4 mov -0xc(%ebp),%eax +c01080d9: 39 c2 cmp %eax,%edx +c01080db: 75 10 jne c01080ed +c01080dd: 8b 45 d4 mov -0x2c(%ebp),%eax +c01080e0: 8b 40 08 mov 0x8(%eax),%eax +c01080e3: 8b 55 f4 mov -0xc(%ebp),%edx +c01080e6: 83 c2 02 add $0x2,%edx +c01080e9: 39 d0 cmp %edx,%eax +c01080eb: 74 24 je c0108111 +c01080ed: c7 44 24 0c 50 bc 10 movl $0xc010bc50,0xc(%esp) +c01080f4: c0 +c01080f5: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c01080fc: c0 +c01080fd: c7 44 24 04 4c 01 00 movl $0x14c,0x4(%esp) +c0108104: 00 +c0108105: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c010810c: e8 34 8b ff ff call c0100c45 <__panic> + for (i = 5; i <= 5 * step2; i +=5) {// 查找特定地址范围内的 VMA +c0108111: 83 45 f4 05 addl $0x5,-0xc(%ebp) +c0108115: 8b 55 e0 mov -0x20(%ebp),%edx +c0108118: 89 d0 mov %edx,%eax +c010811a: c1 e0 02 shl $0x2,%eax +c010811d: 01 d0 add %edx,%eax +c010811f: 39 45 f4 cmp %eax,-0xc(%ebp) +c0108122: 0f 8e 22 fe ff ff jle c0107f4a + } + // 检查小于5的地址范围内是否存在 VMA + for (i =4; i>=0; i--) { +c0108128: c7 45 f4 04 00 00 00 movl $0x4,-0xc(%ebp) +c010812f: eb 6f jmp c01081a0 + // 查找地址 i 处的 VMA + struct vma_struct *vma_below_5= find_vma(mm,i); +c0108131: 8b 45 f4 mov -0xc(%ebp),%eax +c0108134: 89 44 24 04 mov %eax,0x4(%esp) +c0108138: 8b 45 e8 mov -0x18(%ebp),%eax +c010813b: 89 04 24 mov %eax,(%esp) +c010813e: e8 ae f8 ff ff call c01079f1 +c0108143: 89 45 dc mov %eax,-0x24(%ebp) + if (vma_below_5 != NULL ) {// 如果找到 VMA +c0108146: 83 7d dc 00 cmpl $0x0,-0x24(%ebp) +c010814a: 74 27 je c0108173 + cprintf("vma_below_5: i %x, start %x, end %x\n",i, vma_below_5->vm_start, vma_below_5->vm_end); +c010814c: 8b 45 dc mov -0x24(%ebp),%eax +c010814f: 8b 50 08 mov 0x8(%eax),%edx +c0108152: 8b 45 dc mov -0x24(%ebp),%eax +c0108155: 8b 40 04 mov 0x4(%eax),%eax +c0108158: 89 54 24 0c mov %edx,0xc(%esp) +c010815c: 89 44 24 08 mov %eax,0x8(%esp) +c0108160: 8b 45 f4 mov -0xc(%ebp),%eax +c0108163: 89 44 24 04 mov %eax,0x4(%esp) +c0108167: c7 04 24 80 bc 10 c0 movl $0xc010bc80,(%esp) +c010816e: e8 05 82 ff ff call c0100378 + } + assert(vma_below_5 == NULL);// 确保未找到 VMA +c0108173: 83 7d dc 00 cmpl $0x0,-0x24(%ebp) +c0108177: 74 24 je c010819d +c0108179: c7 44 24 0c a5 bc 10 movl $0xc010bca5,0xc(%esp) +c0108180: c0 +c0108181: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c0108188: c0 +c0108189: c7 44 24 04 55 01 00 movl $0x155,0x4(%esp) +c0108190: 00 +c0108191: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c0108198: e8 a8 8a ff ff call c0100c45 <__panic> + for (i =4; i>=0; i--) { +c010819d: ff 4d f4 decl -0xc(%ebp) +c01081a0: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c01081a4: 79 8b jns c0108131 } - // 确保总属性值与空闲页面数量匹配 - assert(total == nr_free_pages()); -c010821c: e8 de b5 ff ff call c01037ff -c0108221: 8b 55 f0 mov -0x10(%ebp),%edx -c0108224: 39 d0 cmp %edx,%eax -c0108226: 74 24 je c010824c -c0108228: c7 44 24 0c b2 bf 10 movl $0xc010bfb2,0xc(%esp) -c010822f: c0 -c0108230: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0108237: c0 -c0108238: c7 44 24 04 44 01 00 movl $0x144,0x4(%esp) -c010823f: 00 -c0108240: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0108247: e8 f7 81 ff ff call c0100443 <__panic> - // 调用 basic_check 以验证基本的内存管理功能 - basic_check(); -c010824c: e8 df f9 ff ff call c0107c30 - // 分配 5 个页面 - struct Page *p0 = alloc_pages(5), *p1, *p2; -c0108251: c7 04 24 05 00 00 00 movl $0x5,(%esp) -c0108258: e8 fc b4 ff ff call c0103759 -c010825d: 89 45 e8 mov %eax,-0x18(%ebp) - assert(p0 != NULL);// 确保成功分配 -c0108260: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) -c0108264: 75 24 jne c010828a -c0108266: c7 44 24 0c cb bf 10 movl $0xc010bfcb,0xc(%esp) -c010826d: c0 -c010826e: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0108275: c0 -c0108276: c7 44 24 04 49 01 00 movl $0x149,0x4(%esp) -c010827d: 00 -c010827e: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0108285: e8 b9 81 ff ff call c0100443 <__panic> - assert(!PageProperty(p0));// 确保分配的页面不带属性 -c010828a: 8b 45 e8 mov -0x18(%ebp),%eax -c010828d: 83 c0 04 add $0x4,%eax -c0108290: c7 45 c0 01 00 00 00 movl $0x1,-0x40(%ebp) -c0108297: 89 45 bc mov %eax,-0x44(%ebp) - asm volatile ("btl %2, %1; sbbl %0,%0" : "=r" (oldbit) : "m" (*(volatile long *)addr), "Ir" (nr)); -c010829a: 8b 45 bc mov -0x44(%ebp),%eax -c010829d: 8b 55 c0 mov -0x40(%ebp),%edx -c01082a0: 0f a3 10 bt %edx,(%eax) -c01082a3: 19 c0 sbb %eax,%eax -c01082a5: 89 45 b8 mov %eax,-0x48(%ebp) - return oldbit != 0; -c01082a8: 83 7d b8 00 cmpl $0x0,-0x48(%ebp) -c01082ac: 0f 95 c0 setne %al -c01082af: 0f b6 c0 movzbl %al,%eax -c01082b2: 85 c0 test %eax,%eax -c01082b4: 74 24 je c01082da -c01082b6: c7 44 24 0c d6 bf 10 movl $0xc010bfd6,0xc(%esp) -c01082bd: c0 -c01082be: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c01082c5: c0 -c01082c6: c7 44 24 04 4a 01 00 movl $0x14a,0x4(%esp) -c01082cd: 00 -c01082ce: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c01082d5: e8 69 81 ff ff call c0100443 <__panic> - // 初始化并检查空闲列表 - list_entry_t free_list_store = free_list; -c01082da: a1 a4 e1 12 c0 mov 0xc012e1a4,%eax -c01082df: 8b 15 a8 e1 12 c0 mov 0xc012e1a8,%edx -c01082e5: 89 45 80 mov %eax,-0x80(%ebp) -c01082e8: 89 55 84 mov %edx,-0x7c(%ebp) -c01082eb: c7 45 b0 a4 e1 12 c0 movl $0xc012e1a4,-0x50(%ebp) - elm->prev = elm->next = elm; -c01082f2: 8b 45 b0 mov -0x50(%ebp),%eax -c01082f5: 8b 55 b0 mov -0x50(%ebp),%edx -c01082f8: 89 50 04 mov %edx,0x4(%eax) -c01082fb: 8b 45 b0 mov -0x50(%ebp),%eax -c01082fe: 8b 50 04 mov 0x4(%eax),%edx -c0108301: 8b 45 b0 mov -0x50(%ebp),%eax -c0108304: 89 10 mov %edx,(%eax) -} -c0108306: 90 nop -c0108307: c7 45 b4 a4 e1 12 c0 movl $0xc012e1a4,-0x4c(%ebp) - return list->next == list; -c010830e: 8b 45 b4 mov -0x4c(%ebp),%eax -c0108311: 8b 40 04 mov 0x4(%eax),%eax -c0108314: 39 45 b4 cmp %eax,-0x4c(%ebp) -c0108317: 0f 94 c0 sete %al -c010831a: 0f b6 c0 movzbl %al,%eax - list_init(&free_list); - assert(list_empty(&free_list));// 确保空闲列表为空 -c010831d: 85 c0 test %eax,%eax -c010831f: 75 24 jne c0108345 -c0108321: c7 44 24 0c 2b bf 10 movl $0xc010bf2b,0xc(%esp) -c0108328: c0 -c0108329: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0108330: c0 -c0108331: c7 44 24 04 4e 01 00 movl $0x14e,0x4(%esp) -c0108338: 00 -c0108339: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0108340: e8 fe 80 ff ff call c0100443 <__panic> - assert(alloc_page() == NULL);// 确保没有页面可分配 -c0108345: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c010834c: e8 08 b4 ff ff call c0103759 -c0108351: 85 c0 test %eax,%eax -c0108353: 74 24 je c0108379 -c0108355: c7 44 24 0c 42 bf 10 movl $0xc010bf42,0xc(%esp) -c010835c: c0 -c010835d: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0108364: c0 -c0108365: c7 44 24 04 4f 01 00 movl $0x14f,0x4(%esp) -c010836c: 00 -c010836d: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0108374: e8 ca 80 ff ff call c0100443 <__panic> - unsigned int nr_free_store = nr_free;// 保存当前空闲页数 -c0108379: a1 ac e1 12 c0 mov 0xc012e1ac,%eax -c010837e: 89 45 e4 mov %eax,-0x1c(%ebp) - nr_free = 0;// 将空闲页数设为 0 -c0108381: c7 05 ac e1 12 c0 00 movl $0x0,0xc012e1ac -c0108388: 00 00 00 - // 释放 3 个页面并确保分配页面时没有足够的空闲页 - free_pages(p0 + 2, 3); -c010838b: 8b 45 e8 mov -0x18(%ebp),%eax -c010838e: 83 c0 40 add $0x40,%eax -c0108391: c7 44 24 04 03 00 00 movl $0x3,0x4(%esp) + mm_destroy(mm);// 销毁 mm 结构 +c01081a6: 8b 45 e8 mov -0x18(%ebp),%eax +c01081a9: 89 04 24 mov %eax,(%esp) +c01081ac: e8 d0 fa ff ff call c0107c81 + + // 确保释放的页面数量与初始记录一致 + // assert(nr_free_pages_store == nr_free_pages()); + // 输出成功信息 + cprintf("check_vma_struct() succeeded!\n"); +c01081b1: c7 04 24 bc bc 10 c0 movl $0xc010bcbc,(%esp) +c01081b8: e8 bb 81 ff ff call c0100378 +} +c01081bd: 90 nop +c01081be: 89 ec mov %ebp,%esp +c01081c0: 5d pop %ebp +c01081c1: c3 ret + +c01081c2 : +struct mm_struct *check_mm_struct; + +// check_pgfault - check correctness of pgfault handler +// 检查页故障处理的正确性 +static void +check_pgfault(void) { +c01081c2: 55 push %ebp +c01081c3: 89 e5 mov %esp,%ebp +c01081c5: 83 ec 38 sub $0x38,%esp + // 保存当前空闲页面的数量,用于后续检查 + size_t nr_free_pages_store = nr_free_pages(); +c01081c8: e8 b0 ce ff ff call c010507d +c01081cd: 89 45 ec mov %eax,-0x14(%ebp) + // 创建内存管理结构体 + check_mm_struct = mm_create(); +c01081d0: e8 64 f7 ff ff call c0107939 +c01081d5: a3 6c c1 12 c0 mov %eax,0xc012c16c + // 确保内存管理结构体创建成功 + assert(check_mm_struct != NULL); +c01081da: a1 6c c1 12 c0 mov 0xc012c16c,%eax +c01081df: 85 c0 test %eax,%eax +c01081e1: 75 24 jne c0108207 +c01081e3: c7 44 24 0c db bc 10 movl $0xc010bcdb,0xc(%esp) +c01081ea: c0 +c01081eb: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c01081f2: c0 +c01081f3: c7 44 24 04 6b 01 00 movl $0x16b,0x4(%esp) +c01081fa: 00 +c01081fb: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c0108202: e8 3e 8a ff ff call c0100c45 <__panic> + // 将新创建的内存管理结构体赋值给局部变量mm + struct mm_struct *mm = check_mm_struct; +c0108207: a1 6c c1 12 c0 mov 0xc012c16c,%eax +c010820c: 89 45 e8 mov %eax,-0x18(%ebp) + // 将引导程序的页目录复制到新创建的内存管理结构体中 + pde_t *pgdir = mm->pgdir = boot_pgdir; +c010820f: 8b 15 00 8a 12 c0 mov 0xc0128a00,%edx +c0108215: 8b 45 e8 mov -0x18(%ebp),%eax +c0108218: 89 50 0c mov %edx,0xc(%eax) +c010821b: 8b 45 e8 mov -0x18(%ebp),%eax +c010821e: 8b 40 0c mov 0xc(%eax),%eax +c0108221: 89 45 e4 mov %eax,-0x1c(%ebp) + // 确保页目录的第0项是空的 + assert(pgdir[0] == 0); +c0108224: 8b 45 e4 mov -0x1c(%ebp),%eax +c0108227: 8b 00 mov (%eax),%eax +c0108229: 85 c0 test %eax,%eax +c010822b: 74 24 je c0108251 +c010822d: c7 44 24 0c f3 bc 10 movl $0xc010bcf3,0xc(%esp) +c0108234: c0 +c0108235: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c010823c: c0 +c010823d: c7 44 24 04 71 01 00 movl $0x171,0x4(%esp) +c0108244: 00 +c0108245: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c010824c: e8 f4 89 ff ff call c0100c45 <__panic> + // 创建一个虚拟内存区域结构体,具有写权限 + struct vma_struct *vma = vma_create(0, PTSIZE, VM_WRITE); +c0108251: c7 44 24 08 02 00 00 movl $0x2,0x8(%esp) +c0108258: 00 +c0108259: c7 44 24 04 00 00 40 movl $0x400000,0x4(%esp) +c0108260: 00 +c0108261: c7 04 24 00 00 00 00 movl $0x0,(%esp) +c0108268: e8 47 f7 ff ff call c01079b4 +c010826d: 89 45 e0 mov %eax,-0x20(%ebp) + // 确保虚拟内存区域结构体创建成功 + assert(vma != NULL); +c0108270: 83 7d e0 00 cmpl $0x0,-0x20(%ebp) +c0108274: 75 24 jne c010829a +c0108276: c7 44 24 0c 84 bb 10 movl $0xc010bb84,0xc(%esp) +c010827d: c0 +c010827e: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c0108285: c0 +c0108286: c7 44 24 04 75 01 00 movl $0x175,0x4(%esp) +c010828d: 00 +c010828e: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c0108295: e8 ab 89 ff ff call c0100c45 <__panic> + // 将虚拟内存区域结构体插入到内存管理结构体中 + insert_vma_struct(mm, vma); +c010829a: 8b 45 e0 mov -0x20(%ebp),%eax +c010829d: 89 44 24 04 mov %eax,0x4(%esp) +c01082a1: 8b 45 e8 mov -0x18(%ebp),%eax +c01082a4: 89 04 24 mov %eax,(%esp) +c01082a7: e8 9f f8 ff ff call c0107b4b + // 定义一个地址,用于访问虚拟内存 + uintptr_t addr = 0x100; +c01082ac: c7 45 dc 00 01 00 00 movl $0x100,-0x24(%ebp) + // 确保通过该地址可以找到之前插入的虚拟内存区域 + assert(find_vma(mm, addr) == vma); +c01082b3: 8b 45 dc mov -0x24(%ebp),%eax +c01082b6: 89 44 24 04 mov %eax,0x4(%esp) +c01082ba: 8b 45 e8 mov -0x18(%ebp),%eax +c01082bd: 89 04 24 mov %eax,(%esp) +c01082c0: e8 2c f7 ff ff call c01079f1 +c01082c5: 39 45 e0 cmp %eax,-0x20(%ebp) +c01082c8: 74 24 je c01082ee +c01082ca: c7 44 24 0c 01 bd 10 movl $0xc010bd01,0xc(%esp) +c01082d1: c0 +c01082d2: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c01082d9: c0 +c01082da: c7 44 24 04 7b 01 00 movl $0x17b,0x4(%esp) +c01082e1: 00 +c01082e2: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c01082e9: e8 57 89 ff ff call c0100c45 <__panic> + // 初始化一个累加器,用于校验写入的数据 + int i, sum = 0; +c01082ee: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%ebp) + // 写入数据到虚拟内存,并累加 + for (i = 0; i < 100; i ++) { +c01082f5: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) +c01082fc: eb 16 jmp c0108314 + *(char *)(addr + i) = i; +c01082fe: 8b 55 f4 mov -0xc(%ebp),%edx +c0108301: 8b 45 dc mov -0x24(%ebp),%eax +c0108304: 01 d0 add %edx,%eax +c0108306: 8b 55 f4 mov -0xc(%ebp),%edx +c0108309: 88 10 mov %dl,(%eax) + sum += i; +c010830b: 8b 45 f4 mov -0xc(%ebp),%eax +c010830e: 01 45 f0 add %eax,-0x10(%ebp) + for (i = 0; i < 100; i ++) { +c0108311: ff 45 f4 incl -0xc(%ebp) +c0108314: 83 7d f4 63 cmpl $0x63,-0xc(%ebp) +c0108318: 7e e4 jle c01082fe + } + // 读取虚拟内存中的数据,并减去,最终结果应为0 + for (i = 0; i < 100; i ++) { +c010831a: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) +c0108321: eb 14 jmp c0108337 + sum -= *(char *)(addr + i); +c0108323: 8b 55 f4 mov -0xc(%ebp),%edx +c0108326: 8b 45 dc mov -0x24(%ebp),%eax +c0108329: 01 d0 add %edx,%eax +c010832b: 0f b6 00 movzbl (%eax),%eax +c010832e: 0f be c0 movsbl %al,%eax +c0108331: 29 45 f0 sub %eax,-0x10(%ebp) + for (i = 0; i < 100; i ++) { +c0108334: ff 45 f4 incl -0xc(%ebp) +c0108337: 83 7d f4 63 cmpl $0x63,-0xc(%ebp) +c010833b: 7e e6 jle c0108323 + } + // 确保累加器的值为0,证明数据读写正确 + assert(sum == 0); +c010833d: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) +c0108341: 74 24 je c0108367 +c0108343: c7 44 24 0c 1b bd 10 movl $0xc010bd1b,0xc(%esp) +c010834a: c0 +c010834b: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c0108352: c0 +c0108353: c7 44 24 04 88 01 00 movl $0x188,0x4(%esp) +c010835a: 00 +c010835b: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c0108362: e8 de 88 ff ff call c0100c45 <__panic> + // 移除页目录中的相应页面 + page_remove(pgdir, ROUNDDOWN(addr, PGSIZE)); +c0108367: 8b 45 dc mov -0x24(%ebp),%eax +c010836a: 89 45 d8 mov %eax,-0x28(%ebp) +c010836d: 8b 45 d8 mov -0x28(%ebp),%eax +c0108370: 25 00 f0 ff ff and $0xfffff000,%eax +c0108375: 89 44 24 04 mov %eax,0x4(%esp) +c0108379: 8b 45 e4 mov -0x1c(%ebp),%eax +c010837c: 89 04 24 mov %eax,(%esp) +c010837f: e8 0c d5 ff ff call c0105890 + // 释放第0项页目录对应的页面 + free_page(pde2page(pgdir[0])); +c0108384: 8b 45 e4 mov -0x1c(%ebp),%eax +c0108387: 8b 00 mov (%eax),%eax +c0108389: 89 04 24 mov %eax,(%esp) +c010838c: e8 8e f5 ff ff call c010791f +c0108391: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) c0108398: 00 c0108399: 89 04 24 mov %eax,(%esp) -c010839c: e8 27 b4 ff ff call c01037c8 - assert(alloc_pages(4) == NULL);// 确保无法分配 4 个页面 -c01083a1: c7 04 24 04 00 00 00 movl $0x4,(%esp) -c01083a8: e8 ac b3 ff ff call c0103759 -c01083ad: 85 c0 test %eax,%eax -c01083af: 74 24 je c01083d5 -c01083b1: c7 44 24 0c e8 bf 10 movl $0xc010bfe8,0xc(%esp) -c01083b8: c0 -c01083b9: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c01083c0: c0 -c01083c1: c7 44 24 04 55 01 00 movl $0x155,0x4(%esp) -c01083c8: 00 -c01083c9: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c01083d0: e8 6e 80 ff ff call c0100443 <__panic> - assert(PageProperty(p0 + 2) && p0[2].property == 3);// 检查页面属性 -c01083d5: 8b 45 e8 mov -0x18(%ebp),%eax -c01083d8: 83 c0 40 add $0x40,%eax -c01083db: 83 c0 04 add $0x4,%eax -c01083de: c7 45 ac 01 00 00 00 movl $0x1,-0x54(%ebp) -c01083e5: 89 45 a8 mov %eax,-0x58(%ebp) - asm volatile ("btl %2, %1; sbbl %0,%0" : "=r" (oldbit) : "m" (*(volatile long *)addr), "Ir" (nr)); -c01083e8: 8b 45 a8 mov -0x58(%ebp),%eax -c01083eb: 8b 55 ac mov -0x54(%ebp),%edx -c01083ee: 0f a3 10 bt %edx,(%eax) -c01083f1: 19 c0 sbb %eax,%eax -c01083f3: 89 45 a4 mov %eax,-0x5c(%ebp) - return oldbit != 0; -c01083f6: 83 7d a4 00 cmpl $0x0,-0x5c(%ebp) -c01083fa: 0f 95 c0 setne %al -c01083fd: 0f b6 c0 movzbl %al,%eax -c0108400: 85 c0 test %eax,%eax -c0108402: 74 0e je c0108412 -c0108404: 8b 45 e8 mov -0x18(%ebp),%eax -c0108407: 83 c0 40 add $0x40,%eax -c010840a: 8b 40 08 mov 0x8(%eax),%eax -c010840d: 83 f8 03 cmp $0x3,%eax -c0108410: 74 24 je c0108436 -c0108412: c7 44 24 0c 00 c0 10 movl $0xc010c000,0xc(%esp) -c0108419: c0 -c010841a: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0108421: c0 -c0108422: c7 44 24 04 56 01 00 movl $0x156,0x4(%esp) -c0108429: 00 -c010842a: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0108431: e8 0d 80 ff ff call c0100443 <__panic> - assert((p1 = alloc_pages(3)) != NULL);// 再次分配 3 个页面 -c0108436: c7 04 24 03 00 00 00 movl $0x3,(%esp) -c010843d: e8 17 b3 ff ff call c0103759 -c0108442: 89 45 e0 mov %eax,-0x20(%ebp) -c0108445: 83 7d e0 00 cmpl $0x0,-0x20(%ebp) -c0108449: 75 24 jne c010846f -c010844b: c7 44 24 0c 2c c0 10 movl $0xc010c02c,0xc(%esp) -c0108452: c0 -c0108453: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c010845a: c0 -c010845b: c7 44 24 04 57 01 00 movl $0x157,0x4(%esp) -c0108462: 00 -c0108463: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c010846a: e8 d4 7f ff ff call c0100443 <__panic> - assert(alloc_page() == NULL);// 确保没有页面可分配 -c010846f: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0108476: e8 de b2 ff ff call c0103759 -c010847b: 85 c0 test %eax,%eax -c010847d: 74 24 je c01084a3 -c010847f: c7 44 24 0c 42 bf 10 movl $0xc010bf42,0xc(%esp) -c0108486: c0 -c0108487: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c010848e: c0 -c010848f: c7 44 24 04 58 01 00 movl $0x158,0x4(%esp) -c0108496: 00 -c0108497: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c010849e: e8 a0 7f ff ff call c0100443 <__panic> - assert(p0 + 2 == p1);// 确保分配的页面是释放的页面 -c01084a3: 8b 45 e8 mov -0x18(%ebp),%eax -c01084a6: 83 c0 40 add $0x40,%eax -c01084a9: 39 45 e0 cmp %eax,-0x20(%ebp) -c01084ac: 74 24 je c01084d2 -c01084ae: c7 44 24 0c 4a c0 10 movl $0xc010c04a,0xc(%esp) -c01084b5: c0 -c01084b6: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c01084bd: c0 -c01084be: c7 44 24 04 59 01 00 movl $0x159,0x4(%esp) -c01084c5: 00 -c01084c6: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c01084cd: e8 71 7f ff ff call c0100443 <__panic> +c010839c: e8 a7 cc ff ff call c0105048 + // 将页目录的第0项设置为空 + pgdir[0] = 0; +c01083a1: 8b 45 e4 mov -0x1c(%ebp),%eax +c01083a4: c7 00 00 00 00 00 movl $0x0,(%eax) + // 将内存管理结构体中的页目录设置为空 + mm->pgdir = NULL; +c01083aa: 8b 45 e8 mov -0x18(%ebp),%eax +c01083ad: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax) + // 销毁内存管理结构体 + mm_destroy(mm); +c01083b4: 8b 45 e8 mov -0x18(%ebp),%eax +c01083b7: 89 04 24 mov %eax,(%esp) +c01083ba: e8 c2 f8 ff ff call c0107c81 + // 将检查用的内存管理结构体设置为空 + check_mm_struct = NULL; +c01083bf: c7 05 6c c1 12 c0 00 movl $0x0,0xc012c16c +c01083c6: 00 00 00 + // 确保空闲页面的数量没有变化,证明内存管理正确 + assert(nr_free_pages_store == nr_free_pages()); +c01083c9: e8 af cc ff ff call c010507d +c01083ce: 39 45 ec cmp %eax,-0x14(%ebp) +c01083d1: 74 24 je c01083f7 +c01083d3: c7 44 24 0c 24 bd 10 movl $0xc010bd24,0xc(%esp) +c01083da: c0 +c01083db: c7 44 24 08 e3 ba 10 movl $0xc010bae3,0x8(%esp) +c01083e2: c0 +c01083e3: c7 44 24 04 96 01 00 movl $0x196,0x4(%esp) +c01083ea: 00 +c01083eb: c7 04 24 f8 ba 10 c0 movl $0xc010baf8,(%esp) +c01083f2: e8 4e 88 ff ff call c0100c45 <__panic> + // 打印成功信息 + cprintf("check_pgfault() succeeded!\n"); +c01083f7: c7 04 24 4b bd 10 c0 movl $0xc010bd4b,(%esp) +c01083fe: e8 75 7f ff ff call c0100378 +} +c0108403: 90 nop +c0108404: 89 ec mov %ebp,%esp +c0108406: 5d pop %ebp +c0108407: c3 ret - p2 = p0 + 1;// 设置 p2 为 p0 的下一个页面 -c01084d2: 8b 45 e8 mov -0x18(%ebp),%eax -c01084d5: 83 c0 20 add $0x20,%eax -c01084d8: 89 45 dc mov %eax,-0x24(%ebp) - free_page(p0);// 释放 p0 页面 -c01084db: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c01084e2: 00 -c01084e3: 8b 45 e8 mov -0x18(%ebp),%eax -c01084e6: 89 04 24 mov %eax,(%esp) -c01084e9: e8 da b2 ff ff call c01037c8 - free_pages(p1, 3);// 释放 p1 指向的页面 -c01084ee: c7 44 24 04 03 00 00 movl $0x3,0x4(%esp) -c01084f5: 00 -c01084f6: 8b 45 e0 mov -0x20(%ebp),%eax -c01084f9: 89 04 24 mov %eax,(%esp) -c01084fc: e8 c7 b2 ff ff call c01037c8 - assert(PageProperty(p0) && p0->property == 1);// 检查 p0 属性 -c0108501: 8b 45 e8 mov -0x18(%ebp),%eax -c0108504: 83 c0 04 add $0x4,%eax -c0108507: c7 45 a0 01 00 00 00 movl $0x1,-0x60(%ebp) -c010850e: 89 45 9c mov %eax,-0x64(%ebp) - asm volatile ("btl %2, %1; sbbl %0,%0" : "=r" (oldbit) : "m" (*(volatile long *)addr), "Ir" (nr)); -c0108511: 8b 45 9c mov -0x64(%ebp),%eax -c0108514: 8b 55 a0 mov -0x60(%ebp),%edx -c0108517: 0f a3 10 bt %edx,(%eax) -c010851a: 19 c0 sbb %eax,%eax -c010851c: 89 45 98 mov %eax,-0x68(%ebp) - return oldbit != 0; -c010851f: 83 7d 98 00 cmpl $0x0,-0x68(%ebp) -c0108523: 0f 95 c0 setne %al -c0108526: 0f b6 c0 movzbl %al,%eax -c0108529: 85 c0 test %eax,%eax -c010852b: 74 0b je c0108538 -c010852d: 8b 45 e8 mov -0x18(%ebp),%eax -c0108530: 8b 40 08 mov 0x8(%eax),%eax -c0108533: 83 f8 01 cmp $0x1,%eax -c0108536: 74 24 je c010855c -c0108538: c7 44 24 0c 58 c0 10 movl $0xc010c058,0xc(%esp) -c010853f: c0 -c0108540: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0108547: c0 -c0108548: c7 44 24 04 5e 01 00 movl $0x15e,0x4(%esp) -c010854f: 00 -c0108550: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0108557: e8 e7 7e ff ff call c0100443 <__panic> - assert(PageProperty(p1) && p1->property == 3);// 检查 p1 属性 -c010855c: 8b 45 e0 mov -0x20(%ebp),%eax -c010855f: 83 c0 04 add $0x4,%eax -c0108562: c7 45 94 01 00 00 00 movl $0x1,-0x6c(%ebp) -c0108569: 89 45 90 mov %eax,-0x70(%ebp) - asm volatile ("btl %2, %1; sbbl %0,%0" : "=r" (oldbit) : "m" (*(volatile long *)addr), "Ir" (nr)); -c010856c: 8b 45 90 mov -0x70(%ebp),%eax -c010856f: 8b 55 94 mov -0x6c(%ebp),%edx -c0108572: 0f a3 10 bt %edx,(%eax) -c0108575: 19 c0 sbb %eax,%eax -c0108577: 89 45 8c mov %eax,-0x74(%ebp) - return oldbit != 0; -c010857a: 83 7d 8c 00 cmpl $0x0,-0x74(%ebp) -c010857e: 0f 95 c0 setne %al -c0108581: 0f b6 c0 movzbl %al,%eax -c0108584: 85 c0 test %eax,%eax -c0108586: 74 0b je c0108593 -c0108588: 8b 45 e0 mov -0x20(%ebp),%eax -c010858b: 8b 40 08 mov 0x8(%eax),%eax -c010858e: 83 f8 03 cmp $0x3,%eax -c0108591: 74 24 je c01085b7 -c0108593: c7 44 24 0c 80 c0 10 movl $0xc010c080,0xc(%esp) -c010859a: c0 -c010859b: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c01085a2: c0 -c01085a3: c7 44 24 04 5f 01 00 movl $0x15f,0x4(%esp) -c01085aa: 00 -c01085ab: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c01085b2: e8 8c 7e ff ff call c0100443 <__panic> - // 确保重分配的页面是之前释放的页面 - assert((p0 = alloc_page()) == p2 - 1); -c01085b7: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c01085be: e8 96 b1 ff ff call c0103759 -c01085c3: 89 45 e8 mov %eax,-0x18(%ebp) -c01085c6: 8b 45 dc mov -0x24(%ebp),%eax -c01085c9: 83 e8 20 sub $0x20,%eax -c01085cc: 39 45 e8 cmp %eax,-0x18(%ebp) -c01085cf: 74 24 je c01085f5 -c01085d1: c7 44 24 0c a6 c0 10 movl $0xc010c0a6,0xc(%esp) -c01085d8: c0 -c01085d9: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c01085e0: c0 -c01085e1: c7 44 24 04 61 01 00 movl $0x161,0x4(%esp) -c01085e8: 00 -c01085e9: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c01085f0: e8 4e 7e ff ff call c0100443 <__panic> - free_page(p0);// 释放分配的页面 -c01085f5: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c01085fc: 00 -c01085fd: 8b 45 e8 mov -0x18(%ebp),%eax -c0108600: 89 04 24 mov %eax,(%esp) -c0108603: e8 c0 b1 ff ff call c01037c8 - assert((p0 = alloc_pages(2)) == p2 + 1);// 分配 2 个页面并检查 -c0108608: c7 04 24 02 00 00 00 movl $0x2,(%esp) -c010860f: e8 45 b1 ff ff call c0103759 -c0108614: 89 45 e8 mov %eax,-0x18(%ebp) -c0108617: 8b 45 dc mov -0x24(%ebp),%eax -c010861a: 83 c0 20 add $0x20,%eax -c010861d: 39 45 e8 cmp %eax,-0x18(%ebp) -c0108620: 74 24 je c0108646 -c0108622: c7 44 24 0c c4 c0 10 movl $0xc010c0c4,0xc(%esp) -c0108629: c0 -c010862a: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0108631: c0 -c0108632: c7 44 24 04 63 01 00 movl $0x163,0x4(%esp) -c0108639: 00 -c010863a: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0108641: e8 fd 7d ff ff call c0100443 <__panic> - // 释放页面并检查空闲状态 - free_pages(p0, 2); -c0108646: c7 44 24 04 02 00 00 movl $0x2,0x4(%esp) -c010864d: 00 -c010864e: 8b 45 e8 mov -0x18(%ebp),%eax -c0108651: 89 04 24 mov %eax,(%esp) -c0108654: e8 6f b1 ff ff call c01037c8 - free_page(p2); -c0108659: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) -c0108660: 00 -c0108661: 8b 45 dc mov -0x24(%ebp),%eax -c0108664: 89 04 24 mov %eax,(%esp) -c0108667: e8 5c b1 ff ff call c01037c8 - // 再次分配 5 个页面 - assert((p0 = alloc_pages(5)) != NULL); -c010866c: c7 04 24 05 00 00 00 movl $0x5,(%esp) -c0108673: e8 e1 b0 ff ff call c0103759 -c0108678: 89 45 e8 mov %eax,-0x18(%ebp) -c010867b: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) -c010867f: 75 24 jne c01086a5 -c0108681: c7 44 24 0c e4 c0 10 movl $0xc010c0e4,0xc(%esp) -c0108688: c0 -c0108689: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0108690: c0 -c0108691: c7 44 24 04 68 01 00 movl $0x168,0x4(%esp) -c0108698: 00 -c0108699: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c01086a0: e8 9e 7d ff ff call c0100443 <__panic> - assert(alloc_page() == NULL);// 确保没有额外页面可分配 -c01086a5: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c01086ac: e8 a8 b0 ff ff call c0103759 -c01086b1: 85 c0 test %eax,%eax -c01086b3: 74 24 je c01086d9 -c01086b5: c7 44 24 0c 42 bf 10 movl $0xc010bf42,0xc(%esp) -c01086bc: c0 -c01086bd: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c01086c4: c0 -c01086c5: c7 44 24 04 69 01 00 movl $0x169,0x4(%esp) -c01086cc: 00 -c01086cd: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c01086d4: e8 6a 7d ff ff call c0100443 <__panic> +c0108408 : + * @param addr 引发页面错误的线性地址。 + * + * @return 成功返回0,失败返回负错误码。 + */ +int +do_pgfault(struct mm_struct *mm, uint32_t error_code, uintptr_t addr) { +c0108408: 55 push %ebp +c0108409: 89 e5 mov %esp,%ebp +c010840b: 83 ec 38 sub $0x38,%esp + int ret = -E_INVAL;// 初始化返回值为无效错误 +c010840e: c7 45 f4 fd ff ff ff movl $0xfffffffd,-0xc(%ebp) + //try to find a vma which include addr + // 尝试找到包含 addr 的 vma + struct vma_struct *vma = find_vma(mm, addr); +c0108415: 8b 45 10 mov 0x10(%ebp),%eax +c0108418: 89 44 24 04 mov %eax,0x4(%esp) +c010841c: 8b 45 08 mov 0x8(%ebp),%eax +c010841f: 89 04 24 mov %eax,(%esp) +c0108422: e8 ca f5 ff ff call c01079f1 +c0108427: 89 45 ec mov %eax,-0x14(%ebp) - assert(nr_free == 0);// 确保空闲页数为 0 -c01086d9: a1 ac e1 12 c0 mov 0xc012e1ac,%eax -c01086de: 85 c0 test %eax,%eax -c01086e0: 74 24 je c0108706 -c01086e2: c7 44 24 0c 95 bf 10 movl $0xc010bf95,0xc(%esp) -c01086e9: c0 -c01086ea: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c01086f1: c0 -c01086f2: c7 44 24 04 6b 01 00 movl $0x16b,0x4(%esp) -c01086f9: 00 -c01086fa: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0108701: e8 3d 7d ff ff call c0100443 <__panic> - nr_free = nr_free_store;// 恢复空闲页数 -c0108706: 8b 45 e4 mov -0x1c(%ebp),%eax -c0108709: a3 ac e1 12 c0 mov %eax,0xc012e1ac - // 恢复空闲列表状态 - free_list = free_list_store; -c010870e: 8b 45 80 mov -0x80(%ebp),%eax -c0108711: 8b 55 84 mov -0x7c(%ebp),%edx -c0108714: a3 a4 e1 12 c0 mov %eax,0xc012e1a4 -c0108719: 89 15 a8 e1 12 c0 mov %edx,0xc012e1a8 - free_pages(p0, 5);// 释放所有分配的页面 -c010871f: c7 44 24 04 05 00 00 movl $0x5,0x4(%esp) -c0108726: 00 -c0108727: 8b 45 e8 mov -0x18(%ebp),%eax -c010872a: 89 04 24 mov %eax,(%esp) -c010872d: e8 96 b0 ff ff call c01037c8 - // 验证空闲列表的一致性 - le = &free_list; -c0108732: c7 45 ec a4 e1 12 c0 movl $0xc012e1a4,-0x14(%ebp) - while ((le = list_next(le)) != &free_list) { -c0108739: eb 1c jmp c0108757 - struct Page *p = le2page(le, page_link); -c010873b: 8b 45 ec mov -0x14(%ebp),%eax -c010873e: 83 e8 0c sub $0xc,%eax -c0108741: 89 45 d8 mov %eax,-0x28(%ebp) - count --, total -= p->property; -c0108744: ff 4d f4 decl -0xc(%ebp) -c0108747: 8b 55 f0 mov -0x10(%ebp),%edx -c010874a: 8b 45 d8 mov -0x28(%ebp),%eax -c010874d: 8b 40 08 mov 0x8(%eax),%eax -c0108750: 29 c2 sub %eax,%edx -c0108752: 89 d0 mov %edx,%eax -c0108754: 89 45 f0 mov %eax,-0x10(%ebp) -c0108757: 8b 45 ec mov -0x14(%ebp),%eax -c010875a: 89 45 88 mov %eax,-0x78(%ebp) - return listelm->next; -c010875d: 8b 45 88 mov -0x78(%ebp),%eax -c0108760: 8b 40 04 mov 0x4(%eax),%eax - while ((le = list_next(le)) != &free_list) { -c0108763: 89 45 ec mov %eax,-0x14(%ebp) -c0108766: 81 7d ec a4 e1 12 c0 cmpl $0xc012e1a4,-0x14(%ebp) -c010876d: 75 cc jne c010873b + pgfault_num++;// 增加页面错误计数 +c010842a: a1 70 c1 12 c0 mov 0xc012c170,%eax +c010842f: 40 inc %eax +c0108430: a3 70 c1 12 c0 mov %eax,0xc012c170 + // 检查 addr 是否在 mm 的 vma 范围内 + //If the addr is in the range of a mm's vma? + if (vma == NULL || vma->vm_start > addr) { +c0108435: 83 7d ec 00 cmpl $0x0,-0x14(%ebp) +c0108439: 74 0b je c0108446 +c010843b: 8b 45 ec mov -0x14(%ebp),%eax +c010843e: 8b 40 04 mov 0x4(%eax),%eax +c0108441: 39 45 10 cmp %eax,0x10(%ebp) +c0108444: 73 18 jae c010845e + cprintf("not valid addr %x, and can not find it in vma\n", addr); +c0108446: 8b 45 10 mov 0x10(%ebp),%eax +c0108449: 89 44 24 04 mov %eax,0x4(%esp) +c010844d: c7 04 24 68 bd 10 c0 movl $0xc010bd68,(%esp) +c0108454: e8 1f 7f ff ff call c0100378 + goto failed;// 跳转到错误处理部分 +c0108459: e9 ba 01 00 00 jmp c0108618 } - assert(count == 0);// 确保所有页面都已处理 -c010876f: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0108773: 74 24 je c0108799 -c0108775: c7 44 24 0c 02 c1 10 movl $0xc010c102,0xc(%esp) -c010877c: c0 -c010877d: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c0108784: c0 -c0108785: c7 44 24 04 76 01 00 movl $0x176,0x4(%esp) -c010878c: 00 -c010878d: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c0108794: e8 aa 7c ff ff call c0100443 <__panic> - assert(total == 0);// 确保总属性值为 0 -c0108799: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c010879d: 74 24 je c01087c3 -c010879f: c7 44 24 0c 0d c1 10 movl $0xc010c10d,0xc(%esp) -c01087a6: c0 -c01087a7: c7 44 24 08 a2 bd 10 movl $0xc010bda2,0x8(%esp) -c01087ae: c0 -c01087af: c7 44 24 04 77 01 00 movl $0x177,0x4(%esp) -c01087b6: 00 -c01087b7: c7 04 24 b7 bd 10 c0 movl $0xc010bdb7,(%esp) -c01087be: e8 80 7c ff ff call c0100443 <__panic> -} -c01087c3: 90 nop -c01087c4: c9 leave -c01087c5: c3 ret - -c01087c6 : + //check the error_code + // 检查错误代码 + switch (error_code & 3) { +c010845e: 8b 45 0c mov 0xc(%ebp),%eax +c0108461: 83 e0 03 and $0x3,%eax +c0108464: 85 c0 test %eax,%eax +c0108466: 74 34 je c010849c +c0108468: 83 f8 01 cmp $0x1,%eax +c010846b: 74 1e je c010848b + default: + /* 默认错误代码标志:3 (W/R=1, P=1): 写操作,存在 */ + /* error code flag : default is 3 ( W/R=1, P=1): write, present */ + case 2: /* error code flag : (W/R=1, P=0): write, not present */ + /* 错误代码标志:(W/R=1, P=0): 写操作,不存在 */ + if (!(vma->vm_flags & VM_WRITE)) { +c010846d: 8b 45 ec mov -0x14(%ebp),%eax +c0108470: 8b 40 0c mov 0xc(%eax),%eax +c0108473: 83 e0 02 and $0x2,%eax +c0108476: 85 c0 test %eax,%eax +c0108478: 75 40 jne c01084ba + cprintf("do_pgfault failed: error code flag = write AND not present, but the addr's vma cannot write\n"); +c010847a: c7 04 24 98 bd 10 c0 movl $0xc010bd98,(%esp) +c0108481: e8 f2 7e ff ff call c0100378 + goto failed;// 跳转到错误处理部分 +c0108486: e9 8d 01 00 00 jmp c0108618 + } + break; + case 1: /* error code flag : (W/R=0, P=1): read, present */ + /* 错误代码标志:(W/R=0, P=1): 读操作,存在 */ + cprintf("do_pgfault failed: error code flag = read AND present\n"); +c010848b: c7 04 24 f8 bd 10 c0 movl $0xc010bdf8,(%esp) +c0108492: e8 e1 7e ff ff call c0100378 + goto failed;// 跳转到错误处理部分 +c0108497: e9 7c 01 00 00 jmp c0108618 + case 0: /* error code flag : (W/R=0, P=0): read, not present */ + /* 错误代码标志:(W/R=0, P=0): 读操作,不存在 */ + if (!(vma->vm_flags & (VM_READ | VM_EXEC))) { +c010849c: 8b 45 ec mov -0x14(%ebp),%eax +c010849f: 8b 40 0c mov 0xc(%eax),%eax +c01084a2: 83 e0 05 and $0x5,%eax +c01084a5: 85 c0 test %eax,%eax +c01084a7: 75 12 jne c01084bb + cprintf("do_pgfault failed: error code flag = read AND not present, but the addr's vma cannot read or exec\n"); +c01084a9: c7 04 24 30 be 10 c0 movl $0xc010be30,(%esp) +c01084b0: e8 c3 7e ff ff call c0100378 + goto failed;// 跳转到错误处理部分 +c01084b5: e9 5e 01 00 00 jmp c0108618 + break; +c01084ba: 90 nop + /* 如果 (写入已存在的地址) 或 + * (写入不存在的地址且地址可写) 或 + * (读取不存在的地址且地址可读) + * 则继续处理 + */ + uint32_t perm = PTE_U;// 初始化权限标志为用户可访问 +c01084bb: c7 45 f0 04 00 00 00 movl $0x4,-0x10(%ebp) + if (vma->vm_flags & VM_WRITE) { +c01084c2: 8b 45 ec mov -0x14(%ebp),%eax +c01084c5: 8b 40 0c mov 0xc(%eax),%eax +c01084c8: 83 e0 02 and $0x2,%eax +c01084cb: 85 c0 test %eax,%eax +c01084cd: 74 04 je c01084d3 + perm |= PTE_W;// 如果 vma 可写,则设置写权限 +c01084cf: 83 4d f0 02 orl $0x2,-0x10(%ebp) + } + addr = ROUNDDOWN(addr, PGSIZE);// 将地址对齐到页边界 +c01084d3: 8b 45 10 mov 0x10(%ebp),%eax +c01084d6: 89 45 e8 mov %eax,-0x18(%ebp) +c01084d9: 8b 45 e8 mov -0x18(%ebp),%eax +c01084dc: 25 00 f0 ff ff and $0xfffff000,%eax +c01084e1: 89 45 10 mov %eax,0x10(%ebp) + + ret = -E_NO_MEM;// 初始化返回值为内存不足错误 +c01084e4: c7 45 f4 fc ff ff ff movl $0xfffffffc,-0xc(%ebp) + + pte_t *ptep=NULL; +c01084eb: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) +#endif + // try to find a pte, if pte's PT(Page Table) isn't existed, then create a PT. + // (notice the 3th parameter '1') + // 尝试找到一个页表项 pte,如果包含该 pte 的页表不存在,则创建一个页表。 + // 注意第三个参数 '1' 表示如果需要,可以创建新的页表。 + if ((ptep = get_pte(mm->pgdir, addr, 1)) == NULL) { +c01084f2: 8b 45 08 mov 0x8(%ebp),%eax +c01084f5: 8b 40 0c mov 0xc(%eax),%eax +c01084f8: c7 44 24 08 01 00 00 movl $0x1,0x8(%esp) +c01084ff: 00 +c0108500: 8b 55 10 mov 0x10(%ebp),%edx +c0108503: 89 54 24 04 mov %edx,0x4(%esp) +c0108507: 89 04 24 mov %eax,(%esp) +c010850a: e8 87 d1 ff ff call c0105696 +c010850f: 89 45 e4 mov %eax,-0x1c(%ebp) +c0108512: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) +c0108516: 75 11 jne c0108529 + cprintf("get_pte in do_pgfault failed\n");// 输出错误信息 +c0108518: c7 04 24 93 be 10 c0 movl $0xc010be93,(%esp) +c010851f: e8 54 7e ff ff call c0100378 + goto failed;// 跳转到错误处理部分 +c0108524: e9 ef 00 00 00 jmp c0108618 + } + // 如果页表项 pte 的物理地址不存在,则分配一页内存并映射物理地址与逻辑地址 + if (*ptep == 0) { // if the phy addr isn't exist, then alloc a page & map the phy addr with logical addr +c0108529: 8b 45 e4 mov -0x1c(%ebp),%eax +c010852c: 8b 00 mov (%eax),%eax +c010852e: 85 c0 test %eax,%eax +c0108530: 75 35 jne c0108567 + if (pgdir_alloc_page(mm->pgdir, addr, perm) == NULL) { +c0108532: 8b 45 08 mov 0x8(%ebp),%eax +c0108535: 8b 40 0c mov 0xc(%eax),%eax +c0108538: 8b 55 f0 mov -0x10(%ebp),%edx +c010853b: 89 54 24 08 mov %edx,0x8(%esp) +c010853f: 8b 55 10 mov 0x10(%ebp),%edx +c0108542: 89 54 24 04 mov %edx,0x4(%esp) +c0108546: 89 04 24 mov %eax,(%esp) +c0108549: e8 a3 d4 ff ff call c01059f1 +c010854e: 85 c0 test %eax,%eax +c0108550: 0f 85 bb 00 00 00 jne c0108611 + cprintf("pgdir_alloc_page in do_pgfault failed\n");// 输出错误信息 +c0108556: c7 04 24 b4 be 10 c0 movl $0xc010beb4,(%esp) +c010855d: e8 16 7e ff ff call c0100378 + goto failed;// 跳转到错误处理部分 +c0108562: e9 b1 00 00 00 jmp c0108618 + } + else { // if this pte is a swap entry, then load data from disk to a page with phy addr + // and call page_insert to map the phy addr with logical addr + // 如果页表项 pte 是一个交换项,则从磁盘加载数据到 + //一个具有物理地址的页面,并映射物理地址与逻辑地址 + if(swap_init_ok) {// 检查交换初始化是否成功 +c0108567: a1 a4 c0 12 c0 mov 0xc012c0a4,%eax +c010856c: 85 c0 test %eax,%eax +c010856e: 0f 84 86 00 00 00 je c01085fa + struct Page *page=NULL;// 声明一个页面指针 +c0108574: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp) + if ((ret = swap_in(mm, addr, &page)) != 0) { +c010857b: 8d 45 e0 lea -0x20(%ebp),%eax +c010857e: 89 44 24 08 mov %eax,0x8(%esp) +c0108582: 8b 45 10 mov 0x10(%ebp),%eax +c0108585: 89 44 24 04 mov %eax,0x4(%esp) +c0108589: 8b 45 08 mov 0x8(%ebp),%eax +c010858c: 89 04 24 mov %eax,(%esp) +c010858f: e8 e8 e4 ff ff call c0106a7c +c0108594: 89 45 f4 mov %eax,-0xc(%ebp) +c0108597: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c010859b: 74 0e je c01085ab + cprintf("swap_in in do_pgfault failed\n"); +c010859d: c7 04 24 db be 10 c0 movl $0xc010bedb,(%esp) +c01085a4: e8 cf 7d ff ff call c0100378 +c01085a9: eb 6d jmp c0108618 + goto failed; + } + page_insert(mm->pgdir, page, addr, perm);// 设置物理地址与逻辑地址的映射 +c01085ab: 8b 55 e0 mov -0x20(%ebp),%edx +c01085ae: 8b 45 08 mov 0x8(%ebp),%eax +c01085b1: 8b 40 0c mov 0xc(%eax),%eax +c01085b4: 8b 4d f0 mov -0x10(%ebp),%ecx +c01085b7: 89 4c 24 0c mov %ecx,0xc(%esp) +c01085bb: 8b 4d 10 mov 0x10(%ebp),%ecx +c01085be: 89 4c 24 08 mov %ecx,0x8(%esp) +c01085c2: 89 54 24 04 mov %edx,0x4(%esp) +c01085c6: 89 04 24 mov %eax,(%esp) +c01085c9: e8 09 d3 ff ff call c01058d7 + swap_map_swappable(mm, addr, page, 1);// 设置页面可交换 +c01085ce: 8b 45 e0 mov -0x20(%ebp),%eax +c01085d1: c7 44 24 0c 01 00 00 movl $0x1,0xc(%esp) +c01085d8: 00 +c01085d9: 89 44 24 08 mov %eax,0x8(%esp) +c01085dd: 8b 45 10 mov 0x10(%ebp),%eax +c01085e0: 89 44 24 04 mov %eax,0x4(%esp) +c01085e4: 8b 45 08 mov 0x8(%ebp),%eax +c01085e7: 89 04 24 mov %eax,(%esp) +c01085ea: e8 c5 e2 ff ff call c01068b4 + page->pra_vaddr = addr;// 记录页面的虚拟地址 +c01085ef: 8b 45 e0 mov -0x20(%ebp),%eax +c01085f2: 8b 55 10 mov 0x10(%ebp),%edx +c01085f5: 89 50 1c mov %edx,0x1c(%eax) +c01085f8: eb 17 jmp c0108611 + } + else { + cprintf("no swap_init_ok but ptep is %x, failed\n",*ptep); +c01085fa: 8b 45 e4 mov -0x1c(%ebp),%eax +c01085fd: 8b 00 mov (%eax),%eax +c01085ff: 89 44 24 04 mov %eax,0x4(%esp) +c0108603: c7 04 24 fc be 10 c0 movl $0xc010befc,(%esp) +c010860a: e8 69 7d ff ff call c0100378 + goto failed;// 跳转到错误处理部分 +c010860f: eb 07 jmp c0108618 + } + } + ret = 0;// 设置返回值为成功 +c0108611: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) +failed: + return ret;// 返回结果 +c0108618: 8b 45 f4 mov -0xc(%ebp),%eax +} +c010861b: 89 ec mov %ebp,%esp +c010861d: 5d pop %ebp +c010861e: c3 ret + +c010861f : page2ppn(struct Page *page) { -c01087c6: 55 push %ebp -c01087c7: 89 e5 mov %esp,%ebp +c010861f: 55 push %ebp +c0108620: 89 e5 mov %esp,%ebp return page - pages; -c01087c9: a1 b8 e0 12 c0 mov 0xc012e0b8,%eax -c01087ce: 8b 55 08 mov 0x8(%ebp),%edx -c01087d1: 29 c2 sub %eax,%edx -c01087d3: 89 d0 mov %edx,%eax -c01087d5: c1 f8 05 sar $0x5,%eax +c0108622: 8b 15 00 c0 12 c0 mov 0xc012c000,%edx +c0108628: 8b 45 08 mov 0x8(%ebp),%eax +c010862b: 29 d0 sub %edx,%eax +c010862d: c1 f8 05 sar $0x5,%eax } -c01087d8: 5d pop %ebp -c01087d9: c3 ret +c0108630: 5d pop %ebp +c0108631: c3 ret -c01087da : +c0108632 : page2pa(struct Page *page) { -c01087da: 55 push %ebp -c01087db: 89 e5 mov %esp,%ebp -c01087dd: 83 ec 04 sub $0x4,%esp +c0108632: 55 push %ebp +c0108633: 89 e5 mov %esp,%ebp +c0108635: 83 ec 04 sub $0x4,%esp return page2ppn(page) << PGSHIFT; -c01087e0: 8b 45 08 mov 0x8(%ebp),%eax -c01087e3: 89 04 24 mov %eax,(%esp) -c01087e6: e8 db ff ff ff call c01087c6 -c01087eb: c1 e0 0c shl $0xc,%eax +c0108638: 8b 45 08 mov 0x8(%ebp),%eax +c010863b: 89 04 24 mov %eax,(%esp) +c010863e: e8 dc ff ff ff call c010861f +c0108643: c1 e0 0c shl $0xc,%eax } -c01087ee: c9 leave -c01087ef: c3 ret +c0108646: 89 ec mov %ebp,%esp +c0108648: 5d pop %ebp +c0108649: c3 ret -c01087f0 : +c010864a : page2kva(struct Page *page) { -c01087f0: 55 push %ebp -c01087f1: 89 e5 mov %esp,%ebp -c01087f3: 83 ec 28 sub $0x28,%esp +c010864a: 55 push %ebp +c010864b: 89 e5 mov %esp,%ebp +c010864d: 83 ec 28 sub $0x28,%esp return KADDR(page2pa(page)); -c01087f6: 8b 45 08 mov 0x8(%ebp),%eax -c01087f9: 89 04 24 mov %eax,(%esp) -c01087fc: e8 d9 ff ff ff call c01087da -c0108801: 89 45 f4 mov %eax,-0xc(%ebp) -c0108804: 8b 45 f4 mov -0xc(%ebp),%eax -c0108807: c1 e8 0c shr $0xc,%eax -c010880a: 89 45 f0 mov %eax,-0x10(%ebp) -c010880d: a1 80 bf 12 c0 mov 0xc012bf80,%eax -c0108812: 39 45 f0 cmp %eax,-0x10(%ebp) -c0108815: 72 23 jb c010883a -c0108817: 8b 45 f4 mov -0xc(%ebp),%eax -c010881a: 89 44 24 0c mov %eax,0xc(%esp) -c010881e: c7 44 24 08 48 c1 10 movl $0xc010c148,0x8(%esp) -c0108825: c0 -c0108826: c7 44 24 04 66 00 00 movl $0x66,0x4(%esp) -c010882d: 00 -c010882e: c7 04 24 6b c1 10 c0 movl $0xc010c16b,(%esp) -c0108835: e8 09 7c ff ff call c0100443 <__panic> -c010883a: 8b 45 f4 mov -0xc(%ebp),%eax -c010883d: 2d 00 00 00 40 sub $0x40000000,%eax -} -c0108842: c9 leave -c0108843: c3 ret - -c0108844 : +c0108650: 8b 45 08 mov 0x8(%ebp),%eax +c0108653: 89 04 24 mov %eax,(%esp) +c0108656: e8 d7 ff ff ff call c0108632 +c010865b: 89 45 f4 mov %eax,-0xc(%ebp) +c010865e: 8b 45 f4 mov -0xc(%ebp),%eax +c0108661: c1 e8 0c shr $0xc,%eax +c0108664: 89 45 f0 mov %eax,-0x10(%ebp) +c0108667: a1 04 c0 12 c0 mov 0xc012c004,%eax +c010866c: 39 45 f0 cmp %eax,-0x10(%ebp) +c010866f: 72 23 jb c0108694 +c0108671: 8b 45 f4 mov -0xc(%ebp),%eax +c0108674: 89 44 24 0c mov %eax,0xc(%esp) +c0108678: c7 44 24 08 24 bf 10 movl $0xc010bf24,0x8(%esp) +c010867f: c0 +c0108680: c7 44 24 04 66 00 00 movl $0x66,0x4(%esp) +c0108687: 00 +c0108688: c7 04 24 47 bf 10 c0 movl $0xc010bf47,(%esp) +c010868f: e8 b1 85 ff ff call c0100c45 <__panic> +c0108694: 8b 45 f4 mov -0xc(%ebp),%eax +c0108697: 2d 00 00 00 40 sub $0x40000000,%eax +} +c010869c: 89 ec mov %ebp,%esp +c010869e: 5d pop %ebp +c010869f: c3 ret + +c01086a0 : #include #include #include void swapfs_init(void) { -c0108844: f3 0f 1e fb endbr32 -c0108848: 55 push %ebp -c0108849: 89 e5 mov %esp,%ebp -c010884b: 83 ec 18 sub $0x18,%esp +c01086a0: 55 push %ebp +c01086a1: 89 e5 mov %esp,%ebp +c01086a3: 83 ec 18 sub $0x18,%esp static_assert((PGSIZE % SECTSIZE) == 0); if (!ide_device_valid(SWAP_DEV_NO)) { -c010884e: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0108855: e8 63 88 ff ff call c01010bd -c010885a: 85 c0 test %eax,%eax -c010885c: 75 1c jne c010887a +c01086a6: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c01086ad: e8 42 93 ff ff call c01019f4 +c01086b2: 85 c0 test %eax,%eax +c01086b4: 75 1c jne c01086d2 panic("swap fs isn't available.\n"); -c010885e: c7 44 24 08 79 c1 10 movl $0xc010c179,0x8(%esp) -c0108865: c0 -c0108866: c7 44 24 04 0d 00 00 movl $0xd,0x4(%esp) -c010886d: 00 -c010886e: c7 04 24 93 c1 10 c0 movl $0xc010c193,(%esp) -c0108875: e8 c9 7b ff ff call c0100443 <__panic> +c01086b6: c7 44 24 08 55 bf 10 movl $0xc010bf55,0x8(%esp) +c01086bd: c0 +c01086be: c7 44 24 04 0d 00 00 movl $0xd,0x4(%esp) +c01086c5: 00 +c01086c6: c7 04 24 6f bf 10 c0 movl $0xc010bf6f,(%esp) +c01086cd: e8 73 85 ff ff call c0100c45 <__panic> } max_swap_offset = ide_device_size(SWAP_DEV_NO) / (PGSIZE / SECTSIZE); -c010887a: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0108881: e8 79 88 ff ff call c01010ff -c0108886: c1 e8 03 shr $0x3,%eax -c0108889: a3 7c e1 12 c0 mov %eax,0xc012e17c +c01086d2: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c01086d9: e8 56 93 ff ff call c0101a34 +c01086de: c1 e8 03 shr $0x3,%eax +c01086e1: a3 a0 c0 12 c0 mov %eax,0xc012c0a0 } -c010888e: 90 nop -c010888f: c9 leave -c0108890: c3 ret - -c0108891 : +c01086e6: 90 nop +c01086e7: 89 ec mov %ebp,%esp +c01086e9: 5d pop %ebp +c01086ea: c3 ret -int -swapfs_read(swap_entry_t entry, struct Page *page) { -c0108891: f3 0f 1e fb endbr32 -c0108895: 55 push %ebp -c0108896: 89 e5 mov %esp,%ebp -c0108898: 83 ec 28 sub $0x28,%esp - return ide_read_secs(SWAP_DEV_NO, swap_offset(entry) * PAGE_NSECT, page2kva(page), PAGE_NSECT); -c010889b: 8b 45 0c mov 0xc(%ebp),%eax -c010889e: 89 04 24 mov %eax,(%esp) -c01088a1: e8 4a ff ff ff call c01087f0 -c01088a6: 8b 55 08 mov 0x8(%ebp),%edx -c01088a9: c1 ea 08 shr $0x8,%edx -c01088ac: 89 55 f4 mov %edx,-0xc(%ebp) -c01088af: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c01088b3: 74 0b je c01088c0 -c01088b5: 8b 15 7c e1 12 c0 mov 0xc012e17c,%edx -c01088bb: 39 55 f4 cmp %edx,-0xc(%ebp) -c01088be: 72 23 jb c01088e3 -c01088c0: 8b 45 08 mov 0x8(%ebp),%eax -c01088c3: 89 44 24 0c mov %eax,0xc(%esp) -c01088c7: c7 44 24 08 a4 c1 10 movl $0xc010c1a4,0x8(%esp) -c01088ce: c0 -c01088cf: c7 44 24 04 14 00 00 movl $0x14,0x4(%esp) -c01088d6: 00 -c01088d7: c7 04 24 93 c1 10 c0 movl $0xc010c193,(%esp) -c01088de: e8 60 7b ff ff call c0100443 <__panic> -c01088e3: 8b 55 f4 mov -0xc(%ebp),%edx -c01088e6: c1 e2 03 shl $0x3,%edx -c01088e9: c7 44 24 0c 08 00 00 movl $0x8,0xc(%esp) -c01088f0: 00 -c01088f1: 89 44 24 08 mov %eax,0x8(%esp) -c01088f5: 89 54 24 04 mov %edx,0x4(%esp) -c01088f9: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0108900: e8 39 88 ff ff call c010113e -} -c0108905: c9 leave -c0108906: c3 ret - -c0108907 : +c01086eb : int -swapfs_write(swap_entry_t entry, struct Page *page) { -c0108907: f3 0f 1e fb endbr32 -c010890b: 55 push %ebp -c010890c: 89 e5 mov %esp,%ebp -c010890e: 83 ec 28 sub $0x28,%esp - return ide_write_secs(SWAP_DEV_NO, swap_offset(entry) * PAGE_NSECT, page2kva(page), PAGE_NSECT); -c0108911: 8b 45 0c mov 0xc(%ebp),%eax -c0108914: 89 04 24 mov %eax,(%esp) -c0108917: e8 d4 fe ff ff call c01087f0 -c010891c: 8b 55 08 mov 0x8(%ebp),%edx -c010891f: c1 ea 08 shr $0x8,%edx -c0108922: 89 55 f4 mov %edx,-0xc(%ebp) -c0108925: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0108929: 74 0b je c0108936 -c010892b: 8b 15 7c e1 12 c0 mov 0xc012e17c,%edx -c0108931: 39 55 f4 cmp %edx,-0xc(%ebp) -c0108934: 72 23 jb c0108959 -c0108936: 8b 45 08 mov 0x8(%ebp),%eax -c0108939: 89 44 24 0c mov %eax,0xc(%esp) -c010893d: c7 44 24 08 a4 c1 10 movl $0xc010c1a4,0x8(%esp) -c0108944: c0 -c0108945: c7 44 24 04 19 00 00 movl $0x19,0x4(%esp) -c010894c: 00 -c010894d: c7 04 24 93 c1 10 c0 movl $0xc010c193,(%esp) -c0108954: e8 ea 7a ff ff call c0100443 <__panic> -c0108959: 8b 55 f4 mov -0xc(%ebp),%edx -c010895c: c1 e2 03 shl $0x3,%edx -c010895f: c7 44 24 0c 08 00 00 movl $0x8,0xc(%esp) -c0108966: 00 -c0108967: 89 44 24 08 mov %eax,0x8(%esp) -c010896b: 89 54 24 04 mov %edx,0x4(%esp) -c010896f: c7 04 24 01 00 00 00 movl $0x1,(%esp) -c0108976: e8 08 8a ff ff call c0101383 -} -c010897b: c9 leave -c010897c: c3 ret - -c010897d : -.text -.globl switch_to -switch_to: # switch_to(from, to) - - # save from's registers - movl 4(%esp), %eax # eax points to from -c010897d: 8b 44 24 04 mov 0x4(%esp),%eax - popl 0(%eax) # save eip !popl -c0108981: 8f 00 popl (%eax) - movl %esp, 4(%eax) # save esp::context of from -c0108983: 89 60 04 mov %esp,0x4(%eax) - movl %ebx, 8(%eax) # save ebx::context of from -c0108986: 89 58 08 mov %ebx,0x8(%eax) - movl %ecx, 12(%eax) # save ecx::context of from -c0108989: 89 48 0c mov %ecx,0xc(%eax) - movl %edx, 16(%eax) # save edx::context of from -c010898c: 89 50 10 mov %edx,0x10(%eax) - movl %esi, 20(%eax) # save esi::context of from -c010898f: 89 70 14 mov %esi,0x14(%eax) - movl %edi, 24(%eax) # save edi::context of from -c0108992: 89 78 18 mov %edi,0x18(%eax) - movl %ebp, 28(%eax) # save ebp::context of from -c0108995: 89 68 1c mov %ebp,0x1c(%eax) - - # restore to's registers - movl 4(%esp), %eax # not 8(%esp): popped return address already -c0108998: 8b 44 24 04 mov 0x4(%esp),%eax - # eax now points to to - movl 28(%eax), %ebp # restore ebp::context of to -c010899c: 8b 68 1c mov 0x1c(%eax),%ebp - movl 24(%eax), %edi # restore edi::context of to -c010899f: 8b 78 18 mov 0x18(%eax),%edi - movl 20(%eax), %esi # restore esi::context of to -c01089a2: 8b 70 14 mov 0x14(%eax),%esi - movl 16(%eax), %edx # restore edx::context of to -c01089a5: 8b 50 10 mov 0x10(%eax),%edx - movl 12(%eax), %ecx # restore ecx::context of to -c01089a8: 8b 48 0c mov 0xc(%eax),%ecx - movl 8(%eax), %ebx # restore ebx::context of to -c01089ab: 8b 58 08 mov 0x8(%eax),%ebx - movl 4(%eax), %esp # restore esp::context of to -c01089ae: 8b 60 04 mov 0x4(%eax),%esp - - pushl 0(%eax) # push eip -c01089b1: ff 30 pushl (%eax) - - ret -c01089b3: c3 ret +swapfs_read(swap_entry_t entry, struct Page *page) { +c01086eb: 55 push %ebp +c01086ec: 89 e5 mov %esp,%ebp +c01086ee: 83 ec 28 sub $0x28,%esp + return ide_read_secs(SWAP_DEV_NO, swap_offset(entry) * PAGE_NSECT, page2kva(page), PAGE_NSECT); +c01086f1: 8b 45 0c mov 0xc(%ebp),%eax +c01086f4: 89 04 24 mov %eax,(%esp) +c01086f7: e8 4e ff ff ff call c010864a +c01086fc: 8b 55 08 mov 0x8(%ebp),%edx +c01086ff: c1 ea 08 shr $0x8,%edx +c0108702: 89 55 f4 mov %edx,-0xc(%ebp) +c0108705: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0108709: 74 0b je c0108716 +c010870b: 8b 15 a0 c0 12 c0 mov 0xc012c0a0,%edx +c0108711: 39 55 f4 cmp %edx,-0xc(%ebp) +c0108714: 72 23 jb c0108739 +c0108716: 8b 45 08 mov 0x8(%ebp),%eax +c0108719: 89 44 24 0c mov %eax,0xc(%esp) +c010871d: c7 44 24 08 80 bf 10 movl $0xc010bf80,0x8(%esp) +c0108724: c0 +c0108725: c7 44 24 04 14 00 00 movl $0x14,0x4(%esp) +c010872c: 00 +c010872d: c7 04 24 6f bf 10 c0 movl $0xc010bf6f,(%esp) +c0108734: e8 0c 85 ff ff call c0100c45 <__panic> +c0108739: 8b 55 f4 mov -0xc(%ebp),%edx +c010873c: c1 e2 03 shl $0x3,%edx +c010873f: c7 44 24 0c 08 00 00 movl $0x8,0xc(%esp) +c0108746: 00 +c0108747: 89 44 24 08 mov %eax,0x8(%esp) +c010874b: 89 54 24 04 mov %edx,0x4(%esp) +c010874f: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c0108756: e8 16 93 ff ff call c0101a71 +} +c010875b: 89 ec mov %ebp,%esp +c010875d: 5d pop %ebp +c010875e: c3 ret + +c010875f : -c01089b4 : +int +swapfs_write(swap_entry_t entry, struct Page *page) { +c010875f: 55 push %ebp +c0108760: 89 e5 mov %esp,%ebp +c0108762: 83 ec 28 sub $0x28,%esp + return ide_write_secs(SWAP_DEV_NO, swap_offset(entry) * PAGE_NSECT, page2kva(page), PAGE_NSECT); +c0108765: 8b 45 0c mov 0xc(%ebp),%eax +c0108768: 89 04 24 mov %eax,(%esp) +c010876b: e8 da fe ff ff call c010864a +c0108770: 8b 55 08 mov 0x8(%ebp),%edx +c0108773: c1 ea 08 shr $0x8,%edx +c0108776: 89 55 f4 mov %edx,-0xc(%ebp) +c0108779: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c010877d: 74 0b je c010878a +c010877f: 8b 15 a0 c0 12 c0 mov 0xc012c0a0,%edx +c0108785: 39 55 f4 cmp %edx,-0xc(%ebp) +c0108788: 72 23 jb c01087ad +c010878a: 8b 45 08 mov 0x8(%ebp),%eax +c010878d: 89 44 24 0c mov %eax,0xc(%esp) +c0108791: c7 44 24 08 80 bf 10 movl $0xc010bf80,0x8(%esp) +c0108798: c0 +c0108799: c7 44 24 04 19 00 00 movl $0x19,0x4(%esp) +c01087a0: 00 +c01087a1: c7 04 24 6f bf 10 c0 movl $0xc010bf6f,(%esp) +c01087a8: e8 98 84 ff ff call c0100c45 <__panic> +c01087ad: 8b 55 f4 mov -0xc(%ebp),%edx +c01087b0: c1 e2 03 shl $0x3,%edx +c01087b3: c7 44 24 0c 08 00 00 movl $0x8,0xc(%esp) +c01087ba: 00 +c01087bb: 89 44 24 08 mov %eax,0x8(%esp) +c01087bf: 89 54 24 04 mov %edx,0x4(%esp) +c01087c3: c7 04 24 01 00 00 00 movl $0x1,(%esp) +c01087ca: e8 e3 94 ff ff call c0101cb2 +} +c01087cf: 89 ec mov %ebp,%esp +c01087d1: 5d pop %ebp +c01087d2: c3 ret + +c01087d3 : .text .globl kernel_thread_entry kernel_thread_entry: # void kernel_thread(void) pushl %edx # push arg -c01089b4: 52 push %edx +c01087d3: 52 push %edx call *%ebx # call fn -c01089b5: ff d3 call *%ebx +c01087d4: ff d3 call *%ebx pushl %eax # save the return value of fn(arg) -c01089b7: 50 push %eax +c01087d6: 50 push %eax call do_exit # call do_exit to terminate current thread -c01089b8: e8 9d 08 00 00 call c010925a +c01087d7: e8 88 08 00 00 call c0109064 -c01089bd <__intr_save>: +c01087dc <__intr_save>: __intr_save(void) { -c01089bd: 55 push %ebp -c01089be: 89 e5 mov %esp,%ebp -c01089c0: 83 ec 18 sub $0x18,%esp +c01087dc: 55 push %ebp +c01087dd: 89 e5 mov %esp,%ebp +c01087df: 83 ec 18 sub $0x18,%esp asm volatile ("pushfl; popl %0" : "=r" (eflags)); -c01089c3: 9c pushf -c01089c4: 58 pop %eax -c01089c5: 89 45 f4 mov %eax,-0xc(%ebp) +c01087e2: 9c pushf +c01087e3: 58 pop %eax +c01087e4: 89 45 f4 mov %eax,-0xc(%ebp) return eflags; -c01089c8: 8b 45 f4 mov -0xc(%ebp),%eax +c01087e7: 8b 45 f4 mov -0xc(%ebp),%eax if (read_eflags() & FL_IF) { -c01089cb: 25 00 02 00 00 and $0x200,%eax -c01089d0: 85 c0 test %eax,%eax -c01089d2: 74 0c je c01089e0 <__intr_save+0x23> +c01087ea: 25 00 02 00 00 and $0x200,%eax +c01087ef: 85 c0 test %eax,%eax +c01087f1: 74 0c je c01087ff <__intr_save+0x23> intr_disable(); -c01089d4: e8 7b 97 ff ff call c0102154 +c01087f3: e8 03 97 ff ff call c0101efb return 1; -c01089d9: b8 01 00 00 00 mov $0x1,%eax -c01089de: eb 05 jmp c01089e5 <__intr_save+0x28> +c01087f8: b8 01 00 00 00 mov $0x1,%eax +c01087fd: eb 05 jmp c0108804 <__intr_save+0x28> return 0; -c01089e0: b8 00 00 00 00 mov $0x0,%eax +c01087ff: b8 00 00 00 00 mov $0x0,%eax } -c01089e5: c9 leave -c01089e6: c3 ret +c0108804: 89 ec mov %ebp,%esp +c0108806: 5d pop %ebp +c0108807: c3 ret -c01089e7 <__intr_restore>: +c0108808 <__intr_restore>: __intr_restore(bool flag) { -c01089e7: 55 push %ebp -c01089e8: 89 e5 mov %esp,%ebp -c01089ea: 83 ec 08 sub $0x8,%esp +c0108808: 55 push %ebp +c0108809: 89 e5 mov %esp,%ebp +c010880b: 83 ec 08 sub $0x8,%esp if (flag) { -c01089ed: 83 7d 08 00 cmpl $0x0,0x8(%ebp) -c01089f1: 74 05 je c01089f8 <__intr_restore+0x11> +c010880e: 83 7d 08 00 cmpl $0x0,0x8(%ebp) +c0108812: 74 05 je c0108819 <__intr_restore+0x11> intr_enable(); -c01089f3: e8 50 97 ff ff call c0102148 +c0108814: e8 da 96 ff ff call c0101ef3 } -c01089f8: 90 nop -c01089f9: c9 leave -c01089fa: c3 ret +c0108819: 90 nop +c010881a: 89 ec mov %ebp,%esp +c010881c: 5d pop %ebp +c010881d: c3 ret -c01089fb : +c010881e : page2ppn(struct Page *page) { -c01089fb: 55 push %ebp -c01089fc: 89 e5 mov %esp,%ebp +c010881e: 55 push %ebp +c010881f: 89 e5 mov %esp,%ebp return page - pages; -c01089fe: a1 b8 e0 12 c0 mov 0xc012e0b8,%eax -c0108a03: 8b 55 08 mov 0x8(%ebp),%edx -c0108a06: 29 c2 sub %eax,%edx -c0108a08: 89 d0 mov %edx,%eax -c0108a0a: c1 f8 05 sar $0x5,%eax +c0108821: 8b 15 00 c0 12 c0 mov 0xc012c000,%edx +c0108827: 8b 45 08 mov 0x8(%ebp),%eax +c010882a: 29 d0 sub %edx,%eax +c010882c: c1 f8 05 sar $0x5,%eax } -c0108a0d: 5d pop %ebp -c0108a0e: c3 ret +c010882f: 5d pop %ebp +c0108830: c3 ret -c0108a0f : +c0108831 : page2pa(struct Page *page) { -c0108a0f: 55 push %ebp -c0108a10: 89 e5 mov %esp,%ebp -c0108a12: 83 ec 04 sub $0x4,%esp +c0108831: 55 push %ebp +c0108832: 89 e5 mov %esp,%ebp +c0108834: 83 ec 04 sub $0x4,%esp return page2ppn(page) << PGSHIFT; -c0108a15: 8b 45 08 mov 0x8(%ebp),%eax -c0108a18: 89 04 24 mov %eax,(%esp) -c0108a1b: e8 db ff ff ff call c01089fb -c0108a20: c1 e0 0c shl $0xc,%eax +c0108837: 8b 45 08 mov 0x8(%ebp),%eax +c010883a: 89 04 24 mov %eax,(%esp) +c010883d: e8 dc ff ff ff call c010881e +c0108842: c1 e0 0c shl $0xc,%eax } -c0108a23: c9 leave -c0108a24: c3 ret +c0108845: 89 ec mov %ebp,%esp +c0108847: 5d pop %ebp +c0108848: c3 ret -c0108a25 : +c0108849 : pa2page(uintptr_t pa) { -c0108a25: 55 push %ebp -c0108a26: 89 e5 mov %esp,%ebp -c0108a28: 83 ec 18 sub $0x18,%esp +c0108849: 55 push %ebp +c010884a: 89 e5 mov %esp,%ebp +c010884c: 83 ec 18 sub $0x18,%esp if (PPN(pa) >= npage) { -c0108a2b: 8b 45 08 mov 0x8(%ebp),%eax -c0108a2e: c1 e8 0c shr $0xc,%eax -c0108a31: 89 c2 mov %eax,%edx -c0108a33: a1 80 bf 12 c0 mov 0xc012bf80,%eax -c0108a38: 39 c2 cmp %eax,%edx -c0108a3a: 72 1c jb c0108a58 +c010884f: 8b 45 08 mov 0x8(%ebp),%eax +c0108852: c1 e8 0c shr $0xc,%eax +c0108855: 89 c2 mov %eax,%edx +c0108857: a1 04 c0 12 c0 mov 0xc012c004,%eax +c010885c: 39 c2 cmp %eax,%edx +c010885e: 72 1c jb c010887c panic("pa2page called with invalid pa"); -c0108a3c: c7 44 24 08 c4 c1 10 movl $0xc010c1c4,0x8(%esp) -c0108a43: c0 -c0108a44: c7 44 24 04 5f 00 00 movl $0x5f,0x4(%esp) -c0108a4b: 00 -c0108a4c: c7 04 24 e3 c1 10 c0 movl $0xc010c1e3,(%esp) -c0108a53: e8 eb 79 ff ff call c0100443 <__panic> +c0108860: c7 44 24 08 a0 bf 10 movl $0xc010bfa0,0x8(%esp) +c0108867: c0 +c0108868: c7 44 24 04 5f 00 00 movl $0x5f,0x4(%esp) +c010886f: 00 +c0108870: c7 04 24 bf bf 10 c0 movl $0xc010bfbf,(%esp) +c0108877: e8 c9 83 ff ff call c0100c45 <__panic> return &pages[PPN(pa)]; -c0108a58: a1 b8 e0 12 c0 mov 0xc012e0b8,%eax -c0108a5d: 8b 55 08 mov 0x8(%ebp),%edx -c0108a60: c1 ea 0c shr $0xc,%edx -c0108a63: c1 e2 05 shl $0x5,%edx -c0108a66: 01 d0 add %edx,%eax -} -c0108a68: c9 leave -c0108a69: c3 ret +c010887c: 8b 15 00 c0 12 c0 mov 0xc012c000,%edx +c0108882: 8b 45 08 mov 0x8(%ebp),%eax +c0108885: c1 e8 0c shr $0xc,%eax +c0108888: c1 e0 05 shl $0x5,%eax +c010888b: 01 d0 add %edx,%eax +} +c010888d: 89 ec mov %ebp,%esp +c010888f: 5d pop %ebp +c0108890: c3 ret -c0108a6a : +c0108891 : page2kva(struct Page *page) { -c0108a6a: 55 push %ebp -c0108a6b: 89 e5 mov %esp,%ebp -c0108a6d: 83 ec 28 sub $0x28,%esp +c0108891: 55 push %ebp +c0108892: 89 e5 mov %esp,%ebp +c0108894: 83 ec 28 sub $0x28,%esp return KADDR(page2pa(page)); -c0108a70: 8b 45 08 mov 0x8(%ebp),%eax -c0108a73: 89 04 24 mov %eax,(%esp) -c0108a76: e8 94 ff ff ff call c0108a0f -c0108a7b: 89 45 f4 mov %eax,-0xc(%ebp) -c0108a7e: 8b 45 f4 mov -0xc(%ebp),%eax -c0108a81: c1 e8 0c shr $0xc,%eax -c0108a84: 89 45 f0 mov %eax,-0x10(%ebp) -c0108a87: a1 80 bf 12 c0 mov 0xc012bf80,%eax -c0108a8c: 39 45 f0 cmp %eax,-0x10(%ebp) -c0108a8f: 72 23 jb c0108ab4 -c0108a91: 8b 45 f4 mov -0xc(%ebp),%eax -c0108a94: 89 44 24 0c mov %eax,0xc(%esp) -c0108a98: c7 44 24 08 f4 c1 10 movl $0xc010c1f4,0x8(%esp) -c0108a9f: c0 -c0108aa0: c7 44 24 04 66 00 00 movl $0x66,0x4(%esp) -c0108aa7: 00 -c0108aa8: c7 04 24 e3 c1 10 c0 movl $0xc010c1e3,(%esp) -c0108aaf: e8 8f 79 ff ff call c0100443 <__panic> -c0108ab4: 8b 45 f4 mov -0xc(%ebp),%eax -c0108ab7: 2d 00 00 00 40 sub $0x40000000,%eax -} -c0108abc: c9 leave -c0108abd: c3 ret - -c0108abe : +c0108897: 8b 45 08 mov 0x8(%ebp),%eax +c010889a: 89 04 24 mov %eax,(%esp) +c010889d: e8 8f ff ff ff call c0108831 +c01088a2: 89 45 f4 mov %eax,-0xc(%ebp) +c01088a5: 8b 45 f4 mov -0xc(%ebp),%eax +c01088a8: c1 e8 0c shr $0xc,%eax +c01088ab: 89 45 f0 mov %eax,-0x10(%ebp) +c01088ae: a1 04 c0 12 c0 mov 0xc012c004,%eax +c01088b3: 39 45 f0 cmp %eax,-0x10(%ebp) +c01088b6: 72 23 jb c01088db +c01088b8: 8b 45 f4 mov -0xc(%ebp),%eax +c01088bb: 89 44 24 0c mov %eax,0xc(%esp) +c01088bf: c7 44 24 08 d0 bf 10 movl $0xc010bfd0,0x8(%esp) +c01088c6: c0 +c01088c7: c7 44 24 04 66 00 00 movl $0x66,0x4(%esp) +c01088ce: 00 +c01088cf: c7 04 24 bf bf 10 c0 movl $0xc010bfbf,(%esp) +c01088d6: e8 6a 83 ff ff call c0100c45 <__panic> +c01088db: 8b 45 f4 mov -0xc(%ebp),%eax +c01088de: 2d 00 00 00 40 sub $0x40000000,%eax +} +c01088e3: 89 ec mov %ebp,%esp +c01088e5: 5d pop %ebp +c01088e6: c3 ret + +c01088e7 : kva2page(void *kva) { -c0108abe: 55 push %ebp -c0108abf: 89 e5 mov %esp,%ebp -c0108ac1: 83 ec 28 sub $0x28,%esp +c01088e7: 55 push %ebp +c01088e8: 89 e5 mov %esp,%ebp +c01088ea: 83 ec 28 sub $0x28,%esp return pa2page(PADDR(kva)); -c0108ac4: 8b 45 08 mov 0x8(%ebp),%eax -c0108ac7: 89 45 f4 mov %eax,-0xc(%ebp) -c0108aca: 81 7d f4 ff ff ff bf cmpl $0xbfffffff,-0xc(%ebp) -c0108ad1: 77 23 ja c0108af6 -c0108ad3: 8b 45 f4 mov -0xc(%ebp),%eax -c0108ad6: 89 44 24 0c mov %eax,0xc(%esp) -c0108ada: c7 44 24 08 18 c2 10 movl $0xc010c218,0x8(%esp) -c0108ae1: c0 -c0108ae2: c7 44 24 04 6b 00 00 movl $0x6b,0x4(%esp) -c0108ae9: 00 -c0108aea: c7 04 24 e3 c1 10 c0 movl $0xc010c1e3,(%esp) -c0108af1: e8 4d 79 ff ff call c0100443 <__panic> -c0108af6: 8b 45 f4 mov -0xc(%ebp),%eax -c0108af9: 05 00 00 00 40 add $0x40000000,%eax -c0108afe: 89 04 24 mov %eax,(%esp) -c0108b01: e8 1f ff ff ff call c0108a25 -} -c0108b06: c9 leave -c0108b07: c3 ret - -c0108b08 : +c01088ed: 8b 45 08 mov 0x8(%ebp),%eax +c01088f0: 89 45 f4 mov %eax,-0xc(%ebp) +c01088f3: 81 7d f4 ff ff ff bf cmpl $0xbfffffff,-0xc(%ebp) +c01088fa: 77 23 ja c010891f +c01088fc: 8b 45 f4 mov -0xc(%ebp),%eax +c01088ff: 89 44 24 0c mov %eax,0xc(%esp) +c0108903: c7 44 24 08 f4 bf 10 movl $0xc010bff4,0x8(%esp) +c010890a: c0 +c010890b: c7 44 24 04 6b 00 00 movl $0x6b,0x4(%esp) +c0108912: 00 +c0108913: c7 04 24 bf bf 10 c0 movl $0xc010bfbf,(%esp) +c010891a: e8 26 83 ff ff call c0100c45 <__panic> +c010891f: 8b 45 f4 mov -0xc(%ebp),%eax +c0108922: 05 00 00 00 40 add $0x40000000,%eax +c0108927: 89 04 24 mov %eax,(%esp) +c010892a: e8 1a ff ff ff call c0108849 +} +c010892f: 89 ec mov %ebp,%esp +c0108931: 5d pop %ebp +c0108932: c3 ret + +c0108933 : void forkrets(struct trapframe *tf); void switch_to(struct context *from, struct context *to); // alloc_proc - alloc a proc_struct and init all fields of proc_struct static struct proc_struct * alloc_proc(void) { -c0108b08: f3 0f 1e fb endbr32 -c0108b0c: 55 push %ebp -c0108b0d: 89 e5 mov %esp,%ebp -c0108b0f: 83 ec 28 sub $0x28,%esp +c0108933: 55 push %ebp +c0108934: 89 e5 mov %esp,%ebp +c0108936: 83 ec 28 sub $0x28,%esp struct proc_struct *proc = kmalloc(sizeof(struct proc_struct)); -c0108b12: c7 04 24 68 00 00 00 movl $0x68,(%esp) -c0108b19: e8 18 dd ff ff call c0106836 -c0108b1e: 89 45 f4 mov %eax,-0xc(%ebp) +c0108939: c7 04 24 68 00 00 00 movl $0x68,(%esp) +c0108940: e8 05 c2 ff ff call c0104b4a +c0108945: 89 45 f4 mov %eax,-0xc(%ebp) if (proc != NULL) { -c0108b21: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0108b25: 0f 84 a1 00 00 00 je c0108bcc +c0108948: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c010894c: 0f 84 a1 00 00 00 je c01089f3 * struct trapframe *tf; // Trap frame for current interrupt * uintptr_t cr3; // CR3 register: the base addr of Page Directroy Table(PDT) * uint32_t flags; // Process flag * char name[PROC_NAME_LEN + 1]; // Process name */ proc->state = PROC_UNINIT; // 初始状态为未初始化 -c0108b2b: 8b 45 f4 mov -0xc(%ebp),%eax -c0108b2e: c7 00 00 00 00 00 movl $0x0,(%eax) +c0108952: 8b 45 f4 mov -0xc(%ebp),%eax +c0108955: c7 00 00 00 00 00 movl $0x0,(%eax) proc->pid = -1; // 初始进程ID为-1 -c0108b34: 8b 45 f4 mov -0xc(%ebp),%eax -c0108b37: c7 40 04 ff ff ff ff movl $0xffffffff,0x4(%eax) +c010895b: 8b 45 f4 mov -0xc(%ebp),%eax +c010895e: c7 40 04 ff ff ff ff movl $0xffffffff,0x4(%eax) proc->runs = 0; // 初始运行次数为0 -c0108b3e: 8b 45 f4 mov -0xc(%ebp),%eax -c0108b41: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax) +c0108965: 8b 45 f4 mov -0xc(%ebp),%eax +c0108968: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax) proc->kstack = 0; // 初始内核栈指针为0 -c0108b48: 8b 45 f4 mov -0xc(%ebp),%eax -c0108b4b: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax) +c010896f: 8b 45 f4 mov -0xc(%ebp),%eax +c0108972: c7 40 0c 00 00 00 00 movl $0x0,0xc(%eax) proc->need_resched = 0; // 初始不需要重新调度 -c0108b52: 8b 45 f4 mov -0xc(%ebp),%eax -c0108b55: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax) +c0108979: 8b 45 f4 mov -0xc(%ebp),%eax +c010897c: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax) proc->parent = NULL; // 初始父进程指针为NULL -c0108b5c: 8b 45 f4 mov -0xc(%ebp),%eax -c0108b5f: c7 40 14 00 00 00 00 movl $0x0,0x14(%eax) +c0108983: 8b 45 f4 mov -0xc(%ebp),%eax +c0108986: c7 40 14 00 00 00 00 movl $0x0,0x14(%eax) proc->mm = NULL; // 初始内存管理结构指针为NULL -c0108b66: 8b 45 f4 mov -0xc(%ebp),%eax -c0108b69: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax) +c010898d: 8b 45 f4 mov -0xc(%ebp),%eax +c0108990: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax) memset(&proc->context, 0, sizeof(struct context)); // 初始化上下文切换信息 -c0108b70: 8b 45 f4 mov -0xc(%ebp),%eax -c0108b73: 83 c0 1c add $0x1c,%eax -c0108b76: c7 44 24 08 20 00 00 movl $0x20,0x8(%esp) -c0108b7d: 00 -c0108b7e: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c0108b85: 00 -c0108b86: 89 04 24 mov %eax,(%esp) -c0108b89: e8 c6 0d 00 00 call c0109954 +c0108997: 8b 45 f4 mov -0xc(%ebp),%eax +c010899a: 83 c0 1c add $0x1c,%eax +c010899d: c7 44 24 08 20 00 00 movl $0x20,0x8(%esp) +c01089a4: 00 +c01089a5: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c01089ac: 00 +c01089ad: 89 04 24 mov %eax,(%esp) +c01089b0: e8 2f 15 00 00 call c0109ee4 proc->tf = NULL; // 初始中断陷阱帧指针为NULL -c0108b8e: 8b 45 f4 mov -0xc(%ebp),%eax -c0108b91: c7 40 3c 00 00 00 00 movl $0x0,0x3c(%eax) +c01089b5: 8b 45 f4 mov -0xc(%ebp),%eax +c01089b8: c7 40 3c 00 00 00 00 movl $0x0,0x3c(%eax) proc->cr3 = boot_cr3; // 初始CR3寄存器值为0 -c0108b98: 8b 15 b4 e0 12 c0 mov 0xc012e0b4,%edx -c0108b9e: 8b 45 f4 mov -0xc(%ebp),%eax -c0108ba1: 89 50 40 mov %edx,0x40(%eax) +c01089bf: 8b 15 08 c0 12 c0 mov 0xc012c008,%edx +c01089c5: 8b 45 f4 mov -0xc(%ebp),%eax +c01089c8: 89 50 40 mov %edx,0x40(%eax) proc->flags = 0; // 初始进程标志为0 -c0108ba4: 8b 45 f4 mov -0xc(%ebp),%eax -c0108ba7: c7 40 44 00 00 00 00 movl $0x0,0x44(%eax) +c01089cb: 8b 45 f4 mov -0xc(%ebp),%eax +c01089ce: c7 40 44 00 00 00 00 movl $0x0,0x44(%eax) memset(proc->name, 0, PROC_NAME_LEN); // 初始进程名称为空字符串 -c0108bae: 8b 45 f4 mov -0xc(%ebp),%eax -c0108bb1: 83 c0 48 add $0x48,%eax -c0108bb4: c7 44 24 08 0f 00 00 movl $0xf,0x8(%esp) -c0108bbb: 00 -c0108bbc: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c0108bc3: 00 -c0108bc4: 89 04 24 mov %eax,(%esp) -c0108bc7: e8 88 0d 00 00 call c0109954 +c01089d5: 8b 45 f4 mov -0xc(%ebp),%eax +c01089d8: 83 c0 48 add $0x48,%eax +c01089db: c7 44 24 08 0f 00 00 movl $0xf,0x8(%esp) +c01089e2: 00 +c01089e3: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c01089ea: 00 +c01089eb: 89 04 24 mov %eax,(%esp) +c01089ee: e8 f1 14 00 00 call c0109ee4 } return proc; -c0108bcc: 8b 45 f4 mov -0xc(%ebp),%eax +c01089f3: 8b 45 f4 mov -0xc(%ebp),%eax } -c0108bcf: c9 leave -c0108bd0: c3 ret - -c0108bd1 : +c01089f6: 89 ec mov %ebp,%esp +c01089f8: 5d pop %ebp +c01089f9: c3 ret -// set_proc_name - set the name of proc +c01089fa : + * @return 返回指向进程名称的指针,这是在内存中直接修改后的结果 + * + * 注意:此函数直接操作传入的进程结构体,对名称字段进行先清空后赋值的操作 + */ char * set_proc_name(struct proc_struct *proc, const char *name) { -c0108bd1: f3 0f 1e fb endbr32 -c0108bd5: 55 push %ebp -c0108bd6: 89 e5 mov %esp,%ebp -c0108bd8: 83 ec 18 sub $0x18,%esp +c01089fa: 55 push %ebp +c01089fb: 89 e5 mov %esp,%ebp +c01089fd: 83 ec 18 sub $0x18,%esp + + // 清空进程名称字段中的现有内容,以准备存储新的名称 memset(proc->name, 0, sizeof(proc->name)); -c0108bdb: 8b 45 08 mov 0x8(%ebp),%eax -c0108bde: 83 c0 48 add $0x48,%eax -c0108be1: c7 44 24 08 10 00 00 movl $0x10,0x8(%esp) -c0108be8: 00 -c0108be9: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c0108bf0: 00 -c0108bf1: 89 04 24 mov %eax,(%esp) -c0108bf4: e8 5b 0d 00 00 call c0109954 +c0108a00: 8b 45 08 mov 0x8(%ebp),%eax +c0108a03: 83 c0 48 add $0x48,%eax +c0108a06: c7 44 24 08 10 00 00 movl $0x10,0x8(%esp) +c0108a0d: 00 +c0108a0e: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c0108a15: 00 +c0108a16: 89 04 24 mov %eax,(%esp) +c0108a19: e8 c6 14 00 00 call c0109ee4 + // 将新的名称复制到进程名称字段中 return memcpy(proc->name, name, PROC_NAME_LEN); -c0108bf9: 8b 45 08 mov 0x8(%ebp),%eax -c0108bfc: 8d 50 48 lea 0x48(%eax),%edx -c0108bff: c7 44 24 08 0f 00 00 movl $0xf,0x8(%esp) -c0108c06: 00 -c0108c07: 8b 45 0c mov 0xc(%ebp),%eax -c0108c0a: 89 44 24 04 mov %eax,0x4(%esp) -c0108c0e: 89 14 24 mov %edx,(%esp) -c0108c11: e8 28 0e 00 00 call c0109a3e +c0108a1e: 8b 45 08 mov 0x8(%ebp),%eax +c0108a21: 8d 50 48 lea 0x48(%eax),%edx +c0108a24: c7 44 24 08 0f 00 00 movl $0xf,0x8(%esp) +c0108a2b: 00 +c0108a2c: 8b 45 0c mov 0xc(%ebp),%eax +c0108a2f: 89 44 24 04 mov %eax,0x4(%esp) +c0108a33: 89 14 24 mov %edx,(%esp) +c0108a36: e8 8e 15 00 00 call c0109fc9 } -c0108c16: c9 leave -c0108c17: c3 ret +c0108a3b: 89 ec mov %ebp,%esp +c0108a3d: 5d pop %ebp +c0108a3e: c3 ret -c0108c18 : +c0108a3f : // get_proc_name - get the name of proc char * get_proc_name(struct proc_struct *proc) { -c0108c18: f3 0f 1e fb endbr32 -c0108c1c: 55 push %ebp -c0108c1d: 89 e5 mov %esp,%ebp -c0108c1f: 83 ec 18 sub $0x18,%esp +c0108a3f: 55 push %ebp +c0108a40: 89 e5 mov %esp,%ebp +c0108a42: 83 ec 18 sub $0x18,%esp static char name[PROC_NAME_LEN + 1]; memset(name, 0, sizeof(name)); -c0108c22: c7 44 24 08 10 00 00 movl $0x10,0x8(%esp) -c0108c29: 00 -c0108c2a: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c0108c31: 00 -c0108c32: c7 04 24 44 e0 12 c0 movl $0xc012e044,(%esp) -c0108c39: e8 16 0d 00 00 call c0109954 +c0108a45: c7 44 24 08 10 00 00 movl $0x10,0x8(%esp) +c0108a4c: 00 +c0108a4d: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c0108a54: 00 +c0108a55: c7 04 24 a4 e1 12 c0 movl $0xc012e1a4,(%esp) +c0108a5c: e8 83 14 00 00 call c0109ee4 return memcpy(name, proc->name, PROC_NAME_LEN); -c0108c3e: 8b 45 08 mov 0x8(%ebp),%eax -c0108c41: 83 c0 48 add $0x48,%eax -c0108c44: c7 44 24 08 0f 00 00 movl $0xf,0x8(%esp) -c0108c4b: 00 -c0108c4c: 89 44 24 04 mov %eax,0x4(%esp) -c0108c50: c7 04 24 44 e0 12 c0 movl $0xc012e044,(%esp) -c0108c57: e8 e2 0d 00 00 call c0109a3e -} -c0108c5c: c9 leave -c0108c5d: c3 ret - -c0108c5e : +c0108a61: 8b 45 08 mov 0x8(%ebp),%eax +c0108a64: 83 c0 48 add $0x48,%eax +c0108a67: c7 44 24 08 0f 00 00 movl $0xf,0x8(%esp) +c0108a6e: 00 +c0108a6f: 89 44 24 04 mov %eax,0x4(%esp) +c0108a73: c7 04 24 a4 e1 12 c0 movl $0xc012e1a4,(%esp) +c0108a7a: e8 4a 15 00 00 call c0109fc9 +} +c0108a7f: 89 ec mov %ebp,%esp +c0108a81: 5d pop %ebp +c0108a82: c3 ret + +c0108a83 : * 它使用静态变量来跟踪最后一个分配的PID和下一个安全PID,以提高效率并避免PID冲突。 * * @return 返回一个未被使用的进程ID。 */ static int get_pid(void) { -c0108c5e: f3 0f 1e fb endbr32 -c0108c62: 55 push %ebp -c0108c63: 89 e5 mov %esp,%ebp -c0108c65: 83 ec 10 sub $0x10,%esp +c0108a83: 55 push %ebp +c0108a84: 89 e5 mov %esp,%ebp +c0108a86: 83 ec 10 sub $0x10,%esp static_assert(MAX_PID > MAX_PROCESS); // 定义一个指向进程结构的指针,用于遍历进程列表。 struct proc_struct *proc; // 初始化列表指针,从进程列表的头部开始。 list_entry_t *list = &proc_list, *le; -c0108c68: c7 45 f8 b0 e1 12 c0 movl $0xc012e1b0,-0x8(%ebp) +c0108a89: c7 45 f8 80 c1 12 c0 movl $0xc012c180,-0x8(%ebp) // 定义静态变量,next_safe用于记录下一个安全的PID值,last_pid用于记录上一个分配的PID。 static int next_safe = MAX_PID, last_pid = MAX_PID; // 尝试递增last_pid以查找下一个可用的PID,如果超过最大值则重置为1。 if (++ last_pid >= MAX_PID) { -c0108c6f: a1 6c 8a 12 c0 mov 0xc0128a6c,%eax -c0108c74: 40 inc %eax -c0108c75: a3 6c 8a 12 c0 mov %eax,0xc0128a6c -c0108c7a: a1 6c 8a 12 c0 mov 0xc0128a6c,%eax -c0108c7f: 3d ff 1f 00 00 cmp $0x1fff,%eax -c0108c84: 7e 0c jle c0108c92 +c0108a90: a1 80 8a 12 c0 mov 0xc0128a80,%eax +c0108a95: 40 inc %eax +c0108a96: a3 80 8a 12 c0 mov %eax,0xc0128a80 +c0108a9b: a1 80 8a 12 c0 mov 0xc0128a80,%eax +c0108aa0: 3d ff 1f 00 00 cmp $0x1fff,%eax +c0108aa5: 7e 0c jle c0108ab3 last_pid = 1; -c0108c86: c7 05 6c 8a 12 c0 01 movl $0x1,0xc0128a6c -c0108c8d: 00 00 00 +c0108aa7: c7 05 80 8a 12 c0 01 movl $0x1,0xc0128a80 +c0108aae: 00 00 00 goto inside; -c0108c90: eb 14 jmp c0108ca6 +c0108ab1: eb 14 jmp c0108ac7 } // 如果当前的last_pid大于等于next_safe,表示需要重新计算下一个安全的PID。 if (last_pid >= next_safe) { -c0108c92: 8b 15 6c 8a 12 c0 mov 0xc0128a6c,%edx -c0108c98: a1 70 8a 12 c0 mov 0xc0128a70,%eax -c0108c9d: 39 c2 cmp %eax,%edx -c0108c9f: 0f 8c ab 00 00 00 jl c0108d50 +c0108ab3: 8b 15 80 8a 12 c0 mov 0xc0128a80,%edx +c0108ab9: a1 84 8a 12 c0 mov 0xc0128a84,%eax +c0108abe: 39 c2 cmp %eax,%edx +c0108ac0: 0f 8c ab 00 00 00 jl c0108b71 inside: -c0108ca5: 90 nop +c0108ac6: 90 nop next_safe = MAX_PID; -c0108ca6: c7 05 70 8a 12 c0 00 movl $0x2000,0xc0128a70 -c0108cad: 20 00 00 +c0108ac7: c7 05 84 8a 12 c0 00 movl $0x2000,0xc0128a84 +c0108ace: 20 00 00 repeat: // 从进程列表的头部开始遍历。 le = list; -c0108cb0: 8b 45 f8 mov -0x8(%ebp),%eax -c0108cb3: 89 45 fc mov %eax,-0x4(%ebp) +c0108ad1: 8b 45 f8 mov -0x8(%ebp),%eax +c0108ad4: 89 45 fc mov %eax,-0x4(%ebp) while ((le = list_next(le)) != list) { -c0108cb6: eb 7d jmp c0108d35 +c0108ad7: eb 7d jmp c0108b56 // 将列表项转换为进程结构。 proc = le2proc(le, list_link); -c0108cb8: 8b 45 fc mov -0x4(%ebp),%eax -c0108cbb: 83 e8 58 sub $0x58,%eax -c0108cbe: 89 45 f4 mov %eax,-0xc(%ebp) +c0108ad9: 8b 45 fc mov -0x4(%ebp),%eax +c0108adc: 83 e8 58 sub $0x58,%eax +c0108adf: 89 45 f4 mov %eax,-0xc(%ebp) // 如果找到相同PID的进程,表示当前last_pid已被使用,需要继续寻找下一个可用的PID。 if (proc->pid == last_pid) { -c0108cc1: 8b 45 f4 mov -0xc(%ebp),%eax -c0108cc4: 8b 50 04 mov 0x4(%eax),%edx -c0108cc7: a1 6c 8a 12 c0 mov 0xc0128a6c,%eax -c0108ccc: 39 c2 cmp %eax,%edx -c0108cce: 75 3c jne c0108d0c +c0108ae2: 8b 45 f4 mov -0xc(%ebp),%eax +c0108ae5: 8b 50 04 mov 0x4(%eax),%edx +c0108ae8: a1 80 8a 12 c0 mov 0xc0128a80,%eax +c0108aed: 39 c2 cmp %eax,%edx +c0108aef: 75 3c jne c0108b2d if (++ last_pid >= next_safe) { -c0108cd0: a1 6c 8a 12 c0 mov 0xc0128a6c,%eax -c0108cd5: 40 inc %eax -c0108cd6: a3 6c 8a 12 c0 mov %eax,0xc0128a6c -c0108cdb: 8b 15 6c 8a 12 c0 mov 0xc0128a6c,%edx -c0108ce1: a1 70 8a 12 c0 mov 0xc0128a70,%eax -c0108ce6: 39 c2 cmp %eax,%edx -c0108ce8: 7c 4b jl c0108d35 +c0108af1: a1 80 8a 12 c0 mov 0xc0128a80,%eax +c0108af6: 40 inc %eax +c0108af7: a3 80 8a 12 c0 mov %eax,0xc0128a80 +c0108afc: 8b 15 80 8a 12 c0 mov 0xc0128a80,%edx +c0108b02: a1 84 8a 12 c0 mov 0xc0128a84,%eax +c0108b07: 39 c2 cmp %eax,%edx +c0108b09: 7c 4b jl c0108b56 if (last_pid >= MAX_PID) { -c0108cea: a1 6c 8a 12 c0 mov 0xc0128a6c,%eax -c0108cef: 3d ff 1f 00 00 cmp $0x1fff,%eax -c0108cf4: 7e 0a jle c0108d00 +c0108b0b: a1 80 8a 12 c0 mov 0xc0128a80,%eax +c0108b10: 3d ff 1f 00 00 cmp $0x1fff,%eax +c0108b15: 7e 0a jle c0108b21 last_pid = 1; -c0108cf6: c7 05 6c 8a 12 c0 01 movl $0x1,0xc0128a6c -c0108cfd: 00 00 00 +c0108b17: c7 05 80 8a 12 c0 01 movl $0x1,0xc0128a80 +c0108b1e: 00 00 00 } next_safe = MAX_PID; -c0108d00: c7 05 70 8a 12 c0 00 movl $0x2000,0xc0128a70 -c0108d07: 20 00 00 +c0108b21: c7 05 84 8a 12 c0 00 movl $0x2000,0xc0128a84 +c0108b28: 20 00 00 goto repeat; -c0108d0a: eb a4 jmp c0108cb0 +c0108b2b: eb a4 jmp c0108ad1 } } // 如果找到一个更大的PID,更新next_safe为当前进程的PID,以确保找到的PID是安全的。 else if (proc->pid > last_pid && next_safe > proc->pid) { -c0108d0c: 8b 45 f4 mov -0xc(%ebp),%eax -c0108d0f: 8b 50 04 mov 0x4(%eax),%edx -c0108d12: a1 6c 8a 12 c0 mov 0xc0128a6c,%eax -c0108d17: 39 c2 cmp %eax,%edx -c0108d19: 7e 1a jle c0108d35 -c0108d1b: 8b 45 f4 mov -0xc(%ebp),%eax -c0108d1e: 8b 50 04 mov 0x4(%eax),%edx -c0108d21: a1 70 8a 12 c0 mov 0xc0128a70,%eax -c0108d26: 39 c2 cmp %eax,%edx -c0108d28: 7d 0b jge c0108d35 +c0108b2d: 8b 45 f4 mov -0xc(%ebp),%eax +c0108b30: 8b 50 04 mov 0x4(%eax),%edx +c0108b33: a1 80 8a 12 c0 mov 0xc0128a80,%eax +c0108b38: 39 c2 cmp %eax,%edx +c0108b3a: 7e 1a jle c0108b56 +c0108b3c: 8b 45 f4 mov -0xc(%ebp),%eax +c0108b3f: 8b 50 04 mov 0x4(%eax),%edx +c0108b42: a1 84 8a 12 c0 mov 0xc0128a84,%eax +c0108b47: 39 c2 cmp %eax,%edx +c0108b49: 7d 0b jge c0108b56 next_safe = proc->pid; -c0108d2a: 8b 45 f4 mov -0xc(%ebp),%eax -c0108d2d: 8b 40 04 mov 0x4(%eax),%eax -c0108d30: a3 70 8a 12 c0 mov %eax,0xc0128a70 -c0108d35: 8b 45 fc mov -0x4(%ebp),%eax -c0108d38: 89 45 f0 mov %eax,-0x10(%ebp) -c0108d3b: 8b 45 f0 mov -0x10(%ebp),%eax -c0108d3e: 8b 40 04 mov 0x4(%eax),%eax +c0108b4b: 8b 45 f4 mov -0xc(%ebp),%eax +c0108b4e: 8b 40 04 mov 0x4(%eax),%eax +c0108b51: a3 84 8a 12 c0 mov %eax,0xc0128a84 +c0108b56: 8b 45 fc mov -0x4(%ebp),%eax +c0108b59: 89 45 f0 mov %eax,-0x10(%ebp) +c0108b5c: 8b 45 f0 mov -0x10(%ebp),%eax +c0108b5f: 8b 40 04 mov 0x4(%eax),%eax while ((le = list_next(le)) != list) { -c0108d41: 89 45 fc mov %eax,-0x4(%ebp) -c0108d44: 8b 45 fc mov -0x4(%ebp),%eax -c0108d47: 3b 45 f8 cmp -0x8(%ebp),%eax -c0108d4a: 0f 85 68 ff ff ff jne c0108cb8 +c0108b62: 89 45 fc mov %eax,-0x4(%ebp) +c0108b65: 8b 45 fc mov -0x4(%ebp),%eax +c0108b68: 3b 45 f8 cmp -0x8(%ebp),%eax +c0108b6b: 0f 85 68 ff ff ff jne c0108ad9 } } } // 返回找到的可用PID。 return last_pid; -c0108d50: a1 6c 8a 12 c0 mov 0xc0128a6c,%eax +c0108b71: a1 80 8a 12 c0 mov 0xc0128a80,%eax } -c0108d55: c9 leave -c0108d56: c3 ret +c0108b76: 89 ec mov %ebp,%esp +c0108b78: 5d pop %ebp +c0108b79: c3 ret -c0108d57 : +c0108b7a : // proc_run - make process "proc" running on cpu // NOTE: before call switch_to, should load base addr of "proc"'s new PDT void proc_run(struct proc_struct *proc) { -c0108d57: f3 0f 1e fb endbr32 -c0108d5b: 55 push %ebp -c0108d5c: 89 e5 mov %esp,%ebp -c0108d5e: 83 ec 28 sub $0x28,%esp +c0108b7a: 55 push %ebp +c0108b7b: 89 e5 mov %esp,%ebp +c0108b7d: 83 ec 28 sub $0x28,%esp if (proc != current) { -c0108d61: a1 28 c0 12 c0 mov 0xc012c028,%eax -c0108d66: 39 45 08 cmp %eax,0x8(%ebp) -c0108d69: 74 64 je c0108dcf +c0108b80: a1 90 c1 12 c0 mov 0xc012c190,%eax +c0108b85: 39 45 08 cmp %eax,0x8(%ebp) +c0108b88: 74 64 je c0108bee bool intr_flag; struct proc_struct *prev = current, *next = proc; -c0108d6b: a1 28 c0 12 c0 mov 0xc012c028,%eax -c0108d70: 89 45 f4 mov %eax,-0xc(%ebp) -c0108d73: 8b 45 08 mov 0x8(%ebp),%eax -c0108d76: 89 45 f0 mov %eax,-0x10(%ebp) +c0108b8a: a1 90 c1 12 c0 mov 0xc012c190,%eax +c0108b8f: 89 45 f4 mov %eax,-0xc(%ebp) +c0108b92: 8b 45 08 mov 0x8(%ebp),%eax +c0108b95: 89 45 f0 mov %eax,-0x10(%ebp) local_intr_save(intr_flag); -c0108d79: e8 3f fc ff ff call c01089bd <__intr_save> -c0108d7e: 89 45 ec mov %eax,-0x14(%ebp) +c0108b98: e8 3f fc ff ff call c01087dc <__intr_save> +c0108b9d: 89 45 ec mov %eax,-0x14(%ebp) { current = proc; -c0108d81: 8b 45 08 mov 0x8(%ebp),%eax -c0108d84: a3 28 c0 12 c0 mov %eax,0xc012c028 +c0108ba0: 8b 45 08 mov 0x8(%ebp),%eax +c0108ba3: a3 90 c1 12 c0 mov %eax,0xc012c190 load_esp0(next->kstack + KSTACKSIZE); -c0108d89: 8b 45 f0 mov -0x10(%ebp),%eax -c0108d8c: 8b 40 0c mov 0xc(%eax),%eax -c0108d8f: 05 00 20 00 00 add $0x2000,%eax -c0108d94: 89 04 24 mov %eax,(%esp) -c0108d97: e8 61 a8 ff ff call c01035fd +c0108ba8: 8b 45 f0 mov -0x10(%ebp),%eax +c0108bab: 8b 40 0c mov 0xc(%eax),%eax +c0108bae: 05 00 20 00 00 add $0x2000,%eax +c0108bb3: 89 04 24 mov %eax,(%esp) +c0108bb6: e8 ce c2 ff ff call c0104e89 lcr3(next->cr3); -c0108d9c: 8b 45 f0 mov -0x10(%ebp),%eax -c0108d9f: 8b 40 40 mov 0x40(%eax),%eax -c0108da2: 89 45 e8 mov %eax,-0x18(%ebp) +c0108bbb: 8b 45 f0 mov -0x10(%ebp),%eax +c0108bbe: 8b 40 40 mov 0x40(%eax),%eax +c0108bc1: 89 45 e8 mov %eax,-0x18(%ebp) asm volatile ("mov %0, %%cr3" :: "r" (cr3) : "memory"); -c0108da5: 8b 45 e8 mov -0x18(%ebp),%eax -c0108da8: 0f 22 d8 mov %eax,%cr3 +c0108bc4: 8b 45 e8 mov -0x18(%ebp),%eax +c0108bc7: 0f 22 d8 mov %eax,%cr3 } -c0108dab: 90 nop +c0108bca: 90 nop switch_to(&(prev->context), &(next->context)); -c0108dac: 8b 45 f0 mov -0x10(%ebp),%eax -c0108daf: 8d 50 1c lea 0x1c(%eax),%edx -c0108db2: 8b 45 f4 mov -0xc(%ebp),%eax -c0108db5: 83 c0 1c add $0x1c,%eax -c0108db8: 89 54 24 04 mov %edx,0x4(%esp) -c0108dbc: 89 04 24 mov %eax,(%esp) -c0108dbf: e8 b9 fb ff ff call c010897d +c0108bcb: 8b 45 f0 mov -0x10(%ebp),%eax +c0108bce: 8d 50 1c lea 0x1c(%eax),%edx +c0108bd1: 8b 45 f4 mov -0xc(%ebp),%eax +c0108bd4: 83 c0 1c add $0x1c,%eax +c0108bd7: 89 54 24 04 mov %edx,0x4(%esp) +c0108bdb: 89 04 24 mov %eax,(%esp) +c0108bde: e8 d5 06 00 00 call c01092b8 } local_intr_restore(intr_flag); -c0108dc4: 8b 45 ec mov -0x14(%ebp),%eax -c0108dc7: 89 04 24 mov %eax,(%esp) -c0108dca: e8 18 fc ff ff call c01089e7 <__intr_restore> +c0108be3: 8b 45 ec mov -0x14(%ebp),%eax +c0108be6: 89 04 24 mov %eax,(%esp) +c0108be9: e8 1a fc ff ff call c0108808 <__intr_restore> } } -c0108dcf: 90 nop -c0108dd0: c9 leave -c0108dd1: c3 ret +c0108bee: 90 nop +c0108bef: 89 ec mov %ebp,%esp +c0108bf1: 5d pop %ebp +c0108bf2: c3 ret -c0108dd2 : +c0108bf3 : // forkret -- the first kernel entry point of a new thread/process // NOTE: the addr of forkret is setted in copy_thread function // after switch_to, the current proc will execute here. static void forkret(void) { -c0108dd2: f3 0f 1e fb endbr32 -c0108dd6: 55 push %ebp -c0108dd7: 89 e5 mov %esp,%ebp -c0108dd9: 83 ec 18 sub $0x18,%esp +c0108bf3: 55 push %ebp +c0108bf4: 89 e5 mov %esp,%ebp +c0108bf6: 83 ec 18 sub $0x18,%esp forkrets(current->tf); -c0108ddc: a1 28 c0 12 c0 mov 0xc012c028,%eax -c0108de1: 8b 40 3c mov 0x3c(%eax),%eax -c0108de4: 89 04 24 mov %eax,(%esp) -c0108de7: e8 38 a6 ff ff call c0103424 +c0108bf9: a1 90 c1 12 c0 mov 0xc012c190,%eax +c0108bfe: 8b 40 3c mov 0x3c(%eax),%eax +c0108c01: 89 04 24 mov %eax,(%esp) +c0108c04: e8 b7 9c ff ff call c01028c0 } -c0108dec: 90 nop -c0108ded: c9 leave -c0108dee: c3 ret +c0108c09: 90 nop +c0108c0a: 89 ec mov %ebp,%esp +c0108c0c: 5d pop %ebp +c0108c0d: c3 ret -c0108def : +c0108c0e : * 这有助于在需要时快速查找进程 * * @param proc 指向进程结构体的指针,表示要添加到哈希表的进程 */ static void hash_proc(struct proc_struct *proc) { -c0108def: f3 0f 1e fb endbr32 -c0108df3: 55 push %ebp -c0108df4: 89 e5 mov %esp,%ebp -c0108df6: 53 push %ebx -c0108df7: 83 ec 34 sub $0x34,%esp +c0108c0e: 55 push %ebp +c0108c0f: 89 e5 mov %esp,%ebp +c0108c11: 83 ec 38 sub $0x38,%esp +c0108c14: 89 5d fc mov %ebx,-0x4(%ebp) // 根据进程的PID计算哈希值,并将进程添加到相应哈希链表的末尾 list_add(hash_list + pid_hashfn(proc->pid), &(proc->hash_link)); -c0108dfa: 8b 45 08 mov 0x8(%ebp),%eax -c0108dfd: 8d 58 60 lea 0x60(%eax),%ebx -c0108e00: 8b 45 08 mov 0x8(%ebp),%eax -c0108e03: 8b 40 04 mov 0x4(%eax),%eax -c0108e06: c7 44 24 04 0a 00 00 movl $0xa,0x4(%esp) -c0108e0d: 00 -c0108e0e: 89 04 24 mov %eax,(%esp) -c0108e11: e8 62 13 00 00 call c010a178 -c0108e16: c1 e0 03 shl $0x3,%eax -c0108e19: 05 40 c0 12 c0 add $0xc012c040,%eax -c0108e1e: 89 45 f4 mov %eax,-0xc(%ebp) -c0108e21: 89 5d f0 mov %ebx,-0x10(%ebp) -c0108e24: 8b 45 f4 mov -0xc(%ebp),%eax -c0108e27: 89 45 ec mov %eax,-0x14(%ebp) -c0108e2a: 8b 45 f0 mov -0x10(%ebp),%eax -c0108e2d: 89 45 e8 mov %eax,-0x18(%ebp) +c0108c17: 8b 45 08 mov 0x8(%ebp),%eax +c0108c1a: 8d 58 60 lea 0x60(%eax),%ebx +c0108c1d: 8b 45 08 mov 0x8(%ebp),%eax +c0108c20: 8b 40 04 mov 0x4(%eax),%eax +c0108c23: c7 44 24 04 0a 00 00 movl $0xa,0x4(%esp) +c0108c2a: 00 +c0108c2b: 89 04 24 mov %eax,(%esp) +c0108c2e: e8 14 08 00 00 call c0109447 +c0108c33: c1 e0 03 shl $0x3,%eax +c0108c36: 05 a0 c1 12 c0 add $0xc012c1a0,%eax +c0108c3b: 89 45 f4 mov %eax,-0xc(%ebp) +c0108c3e: 89 5d f0 mov %ebx,-0x10(%ebp) +c0108c41: 8b 45 f4 mov -0xc(%ebp),%eax +c0108c44: 89 45 ec mov %eax,-0x14(%ebp) +c0108c47: 8b 45 f0 mov -0x10(%ebp),%eax +c0108c4a: 89 45 e8 mov %eax,-0x18(%ebp) __list_add(elm, listelm, listelm->next); -c0108e30: 8b 45 ec mov -0x14(%ebp),%eax -c0108e33: 8b 40 04 mov 0x4(%eax),%eax -c0108e36: 8b 55 e8 mov -0x18(%ebp),%edx -c0108e39: 89 55 e4 mov %edx,-0x1c(%ebp) -c0108e3c: 8b 55 ec mov -0x14(%ebp),%edx -c0108e3f: 89 55 e0 mov %edx,-0x20(%ebp) -c0108e42: 89 45 dc mov %eax,-0x24(%ebp) +c0108c4d: 8b 45 ec mov -0x14(%ebp),%eax +c0108c50: 8b 40 04 mov 0x4(%eax),%eax +c0108c53: 8b 55 e8 mov -0x18(%ebp),%edx +c0108c56: 89 55 e4 mov %edx,-0x1c(%ebp) +c0108c59: 8b 55 ec mov -0x14(%ebp),%edx +c0108c5c: 89 55 e0 mov %edx,-0x20(%ebp) +c0108c5f: 89 45 dc mov %eax,-0x24(%ebp) prev->next = next->prev = elm; -c0108e45: 8b 45 dc mov -0x24(%ebp),%eax -c0108e48: 8b 55 e4 mov -0x1c(%ebp),%edx -c0108e4b: 89 10 mov %edx,(%eax) -c0108e4d: 8b 45 dc mov -0x24(%ebp),%eax -c0108e50: 8b 10 mov (%eax),%edx -c0108e52: 8b 45 e0 mov -0x20(%ebp),%eax -c0108e55: 89 50 04 mov %edx,0x4(%eax) +c0108c62: 8b 45 dc mov -0x24(%ebp),%eax +c0108c65: 8b 55 e4 mov -0x1c(%ebp),%edx +c0108c68: 89 10 mov %edx,(%eax) +c0108c6a: 8b 45 dc mov -0x24(%ebp),%eax +c0108c6d: 8b 10 mov (%eax),%edx +c0108c6f: 8b 45 e0 mov -0x20(%ebp),%eax +c0108c72: 89 50 04 mov %edx,0x4(%eax) elm->next = next; -c0108e58: 8b 45 e4 mov -0x1c(%ebp),%eax -c0108e5b: 8b 55 dc mov -0x24(%ebp),%edx -c0108e5e: 89 50 04 mov %edx,0x4(%eax) +c0108c75: 8b 45 e4 mov -0x1c(%ebp),%eax +c0108c78: 8b 55 dc mov -0x24(%ebp),%edx +c0108c7b: 89 50 04 mov %edx,0x4(%eax) elm->prev = prev; -c0108e61: 8b 45 e4 mov -0x1c(%ebp),%eax -c0108e64: 8b 55 e0 mov -0x20(%ebp),%edx -c0108e67: 89 10 mov %edx,(%eax) +c0108c7e: 8b 45 e4 mov -0x1c(%ebp),%eax +c0108c81: 8b 55 e0 mov -0x20(%ebp),%edx +c0108c84: 89 10 mov %edx,(%eax) } -c0108e69: 90 nop +c0108c86: 90 nop } -c0108e6a: 90 nop +c0108c87: 90 nop } -c0108e6b: 90 nop +c0108c88: 90 nop } -c0108e6c: 90 nop -c0108e6d: 83 c4 34 add $0x34,%esp -c0108e70: 5b pop %ebx -c0108e71: 5d pop %ebp -c0108e72: c3 ret +c0108c89: 90 nop +c0108c8a: 8b 5d fc mov -0x4(%ebp),%ebx +c0108c8d: 89 ec mov %ebp,%esp +c0108c8f: 5d pop %ebp +c0108c90: c3 ret -c0108e73 : +c0108c91 : // find_proc - find proc frome proc hash_list according to pid struct proc_struct * find_proc(int pid) { -c0108e73: f3 0f 1e fb endbr32 -c0108e77: 55 push %ebp -c0108e78: 89 e5 mov %esp,%ebp -c0108e7a: 83 ec 28 sub $0x28,%esp +c0108c91: 55 push %ebp +c0108c92: 89 e5 mov %esp,%ebp +c0108c94: 83 ec 28 sub $0x28,%esp if (0 < pid && pid < MAX_PID) { -c0108e7d: 83 7d 08 00 cmpl $0x0,0x8(%ebp) -c0108e81: 7e 5f jle c0108ee2 -c0108e83: 81 7d 08 ff 1f 00 00 cmpl $0x1fff,0x8(%ebp) -c0108e8a: 7f 56 jg c0108ee2 +c0108c97: 83 7d 08 00 cmpl $0x0,0x8(%ebp) +c0108c9b: 7e 5f jle c0108cfc +c0108c9d: 81 7d 08 ff 1f 00 00 cmpl $0x1fff,0x8(%ebp) +c0108ca4: 7f 56 jg c0108cfc list_entry_t *list = hash_list + pid_hashfn(pid), *le = list; -c0108e8c: 8b 45 08 mov 0x8(%ebp),%eax -c0108e8f: c7 44 24 04 0a 00 00 movl $0xa,0x4(%esp) -c0108e96: 00 -c0108e97: 89 04 24 mov %eax,(%esp) -c0108e9a: e8 d9 12 00 00 call c010a178 -c0108e9f: c1 e0 03 shl $0x3,%eax -c0108ea2: 05 40 c0 12 c0 add $0xc012c040,%eax -c0108ea7: 89 45 f0 mov %eax,-0x10(%ebp) -c0108eaa: 8b 45 f0 mov -0x10(%ebp),%eax -c0108ead: 89 45 f4 mov %eax,-0xc(%ebp) +c0108ca6: 8b 45 08 mov 0x8(%ebp),%eax +c0108ca9: c7 44 24 04 0a 00 00 movl $0xa,0x4(%esp) +c0108cb0: 00 +c0108cb1: 89 04 24 mov %eax,(%esp) +c0108cb4: e8 8e 07 00 00 call c0109447 +c0108cb9: c1 e0 03 shl $0x3,%eax +c0108cbc: 05 a0 c1 12 c0 add $0xc012c1a0,%eax +c0108cc1: 89 45 f0 mov %eax,-0x10(%ebp) +c0108cc4: 8b 45 f0 mov -0x10(%ebp),%eax +c0108cc7: 89 45 f4 mov %eax,-0xc(%ebp) while ((le = list_next(le)) != list) { -c0108eb0: eb 19 jmp c0108ecb +c0108cca: eb 19 jmp c0108ce5 struct proc_struct *proc = le2proc(le, hash_link); -c0108eb2: 8b 45 f4 mov -0xc(%ebp),%eax -c0108eb5: 83 e8 60 sub $0x60,%eax -c0108eb8: 89 45 ec mov %eax,-0x14(%ebp) +c0108ccc: 8b 45 f4 mov -0xc(%ebp),%eax +c0108ccf: 83 e8 60 sub $0x60,%eax +c0108cd2: 89 45 ec mov %eax,-0x14(%ebp) if (proc->pid == pid) { -c0108ebb: 8b 45 ec mov -0x14(%ebp),%eax -c0108ebe: 8b 40 04 mov 0x4(%eax),%eax -c0108ec1: 39 45 08 cmp %eax,0x8(%ebp) -c0108ec4: 75 05 jne c0108ecb +c0108cd5: 8b 45 ec mov -0x14(%ebp),%eax +c0108cd8: 8b 40 04 mov 0x4(%eax),%eax +c0108cdb: 39 45 08 cmp %eax,0x8(%ebp) +c0108cde: 75 05 jne c0108ce5 return proc; -c0108ec6: 8b 45 ec mov -0x14(%ebp),%eax -c0108ec9: eb 1c jmp c0108ee7 -c0108ecb: 8b 45 f4 mov -0xc(%ebp),%eax -c0108ece: 89 45 e8 mov %eax,-0x18(%ebp) +c0108ce0: 8b 45 ec mov -0x14(%ebp),%eax +c0108ce3: eb 1c jmp c0108d01 +c0108ce5: 8b 45 f4 mov -0xc(%ebp),%eax +c0108ce8: 89 45 e8 mov %eax,-0x18(%ebp) return listelm->next; -c0108ed1: 8b 45 e8 mov -0x18(%ebp),%eax -c0108ed4: 8b 40 04 mov 0x4(%eax),%eax +c0108ceb: 8b 45 e8 mov -0x18(%ebp),%eax +c0108cee: 8b 40 04 mov 0x4(%eax),%eax while ((le = list_next(le)) != list) { -c0108ed7: 89 45 f4 mov %eax,-0xc(%ebp) -c0108eda: 8b 45 f4 mov -0xc(%ebp),%eax -c0108edd: 3b 45 f0 cmp -0x10(%ebp),%eax -c0108ee0: 75 d0 jne c0108eb2 +c0108cf1: 89 45 f4 mov %eax,-0xc(%ebp) +c0108cf4: 8b 45 f4 mov -0xc(%ebp),%eax +c0108cf7: 3b 45 f0 cmp -0x10(%ebp),%eax +c0108cfa: 75 d0 jne c0108ccc } } } return NULL; -c0108ee2: b8 00 00 00 00 mov $0x0,%eax +c0108cfc: b8 00 00 00 00 mov $0x0,%eax } -c0108ee7: c9 leave -c0108ee8: c3 ret - -c0108ee9 : +c0108d01: 89 ec mov %ebp,%esp +c0108d03: 5d pop %ebp +c0108d04: c3 ret -// kernel_thread - create a kernel thread using "fn" function -// NOTE: the contents of temp trapframe tf will be copied to -// proc->tf in do_fork-->copy_thread function +c0108d05 : + * + * 该函数通过设置trapframe来创建一个内核线程,并安排其执行指定的函数fn + * 使用do_fork函数来进行实际的线程创建操作,创建的线程将共享父线程的虚拟内存 + */ int kernel_thread(int (*fn)(void *), void *arg, uint32_t clone_flags) { -c0108ee9: f3 0f 1e fb endbr32 -c0108eed: 55 push %ebp -c0108eee: 89 e5 mov %esp,%ebp -c0108ef0: 83 ec 68 sub $0x68,%esp +c0108d05: 55 push %ebp +c0108d06: 89 e5 mov %esp,%ebp +c0108d08: 83 ec 68 sub $0x68,%esp + // 初始化trapframe结构体,用于描述线程的初始状态 struct trapframe tf; memset(&tf, 0, sizeof(struct trapframe)); -c0108ef3: c7 44 24 08 4c 00 00 movl $0x4c,0x8(%esp) -c0108efa: 00 -c0108efb: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c0108f02: 00 -c0108f03: 8d 45 ac lea -0x54(%ebp),%eax -c0108f06: 89 04 24 mov %eax,(%esp) -c0108f09: e8 46 0a 00 00 call c0109954 +c0108d0b: c7 44 24 08 4c 00 00 movl $0x4c,0x8(%esp) +c0108d12: 00 +c0108d13: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c0108d1a: 00 +c0108d1b: 8d 45 ac lea -0x54(%ebp),%eax +c0108d1e: 89 04 24 mov %eax,(%esp) +c0108d21: e8 be 11 00 00 call c0109ee4 + + // 设置代码段和数据段寄存器的值,使线程运行在内核态 tf.tf_cs = KERNEL_CS; -c0108f0e: 66 c7 45 e8 08 00 movw $0x8,-0x18(%ebp) +c0108d26: 66 c7 45 e8 08 00 movw $0x8,-0x18(%ebp) tf.tf_ds = tf.tf_es = tf.tf_ss = KERNEL_DS; -c0108f14: 66 c7 45 f4 10 00 movw $0x10,-0xc(%ebp) -c0108f1a: 0f b7 45 f4 movzwl -0xc(%ebp),%eax -c0108f1e: 66 89 45 d4 mov %ax,-0x2c(%ebp) -c0108f22: 0f b7 45 d4 movzwl -0x2c(%ebp),%eax -c0108f26: 66 89 45 d8 mov %ax,-0x28(%ebp) +c0108d2c: 66 c7 45 f4 10 00 movw $0x10,-0xc(%ebp) +c0108d32: 0f b7 45 f4 movzwl -0xc(%ebp),%eax +c0108d36: 66 89 45 d4 mov %ax,-0x2c(%ebp) +c0108d3a: 0f b7 45 d4 movzwl -0x2c(%ebp),%eax +c0108d3e: 66 89 45 d8 mov %ax,-0x28(%ebp) + + // 将要执行的函数fn的地址和参数arg的地址分别放入ebx和edx寄存器 tf.tf_regs.reg_ebx = (uint32_t)fn; -c0108f2a: 8b 45 08 mov 0x8(%ebp),%eax -c0108f2d: 89 45 bc mov %eax,-0x44(%ebp) +c0108d42: 8b 45 08 mov 0x8(%ebp),%eax +c0108d45: 89 45 bc mov %eax,-0x44(%ebp) tf.tf_regs.reg_edx = (uint32_t)arg; -c0108f30: 8b 45 0c mov 0xc(%ebp),%eax -c0108f33: 89 45 c0 mov %eax,-0x40(%ebp) +c0108d48: 8b 45 0c mov 0xc(%ebp),%eax +c0108d4b: 89 45 c0 mov %eax,-0x40(%ebp) + + // 设置指令指针寄存器eip,使其指向内核线程入口函数kernel_thread_entry tf.tf_eip = (uint32_t)kernel_thread_entry; -c0108f36: b8 b4 89 10 c0 mov $0xc01089b4,%eax -c0108f3b: 89 45 e4 mov %eax,-0x1c(%ebp) +c0108d4e: b8 d3 87 10 c0 mov $0xc01087d3,%eax +c0108d53: 89 45 e4 mov %eax,-0x1c(%ebp) + + // 调用do_fork函数创建新线程,新线程将共享父线程的虚拟内存 + // 并将新线程的初始状态设置为之前准备的trapframe return do_fork(clone_flags | CLONE_VM, 0, &tf); -c0108f3e: 8b 45 10 mov 0x10(%ebp),%eax -c0108f41: 0d 00 01 00 00 or $0x100,%eax -c0108f46: 89 c2 mov %eax,%edx -c0108f48: 8d 45 ac lea -0x54(%ebp),%eax -c0108f4b: 89 44 24 08 mov %eax,0x8(%esp) -c0108f4f: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) -c0108f56: 00 -c0108f57: 89 14 24 mov %edx,(%esp) -c0108f5a: e8 98 01 00 00 call c01090f7 -} -c0108f5f: c9 leave -c0108f60: c3 ret - -c0108f61 : +c0108d56: 8b 45 10 mov 0x10(%ebp),%eax +c0108d59: 0d 00 01 00 00 or $0x100,%eax +c0108d5e: 89 c2 mov %eax,%edx +c0108d60: 8d 45 ac lea -0x54(%ebp),%eax +c0108d63: 89 44 24 08 mov %eax,0x8(%esp) +c0108d67: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) +c0108d6e: 00 +c0108d6f: 89 14 24 mov %edx,(%esp) +c0108d72: e8 90 01 00 00 call c0108f07 +} +c0108d77: 89 ec mov %ebp,%esp +c0108d79: 5d pop %ebp +c0108d7a: c3 ret + +c0108d7b : * * 此函数通过分配一页内存用作进程的内核栈,并将该内存页的虚拟地址设置为进程的内核栈地址 * 如果内存分配成功,则返回0;如果内存分配失败,则返回-E_NO_MEM */ static int setup_kstack(struct proc_struct *proc) { -c0108f61: f3 0f 1e fb endbr32 -c0108f65: 55 push %ebp -c0108f66: 89 e5 mov %esp,%ebp -c0108f68: 83 ec 28 sub $0x28,%esp +c0108d7b: 55 push %ebp +c0108d7c: 89 e5 mov %esp,%ebp +c0108d7e: 83 ec 28 sub $0x28,%esp // 分配KSTACKPAGE页内存用作内核栈 struct Page *page = alloc_pages(KSTACKPAGE); -c0108f6b: c7 04 24 02 00 00 00 movl $0x2,(%esp) -c0108f72: e8 e2 a7 ff ff call c0103759 -c0108f77: 89 45 f4 mov %eax,-0xc(%ebp) +c0108d81: c7 04 24 02 00 00 00 movl $0x2,(%esp) +c0108d88: e8 4e c2 ff ff call c0104fdb +c0108d8d: 89 45 f4 mov %eax,-0xc(%ebp) if (page != NULL) { -c0108f7a: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c0108f7e: 74 1a je c0108f9a +c0108d90: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0108d94: 74 1a je c0108db0 // 如果内存分配成功,将内存页的虚拟地址设置为进程的内核栈地址 proc->kstack = (uintptr_t)page2kva(page); -c0108f80: 8b 45 f4 mov -0xc(%ebp),%eax -c0108f83: 89 04 24 mov %eax,(%esp) -c0108f86: e8 df fa ff ff call c0108a6a -c0108f8b: 89 c2 mov %eax,%edx -c0108f8d: 8b 45 08 mov 0x8(%ebp),%eax -c0108f90: 89 50 0c mov %edx,0xc(%eax) +c0108d96: 8b 45 f4 mov -0xc(%ebp),%eax +c0108d99: 89 04 24 mov %eax,(%esp) +c0108d9c: e8 f0 fa ff ff call c0108891 +c0108da1: 89 c2 mov %eax,%edx +c0108da3: 8b 45 08 mov 0x8(%ebp),%eax +c0108da6: 89 50 0c mov %edx,0xc(%eax) return 0; -c0108f93: b8 00 00 00 00 mov $0x0,%eax -c0108f98: eb 05 jmp c0108f9f +c0108da9: b8 00 00 00 00 mov $0x0,%eax +c0108dae: eb 05 jmp c0108db5 } // 如果内存分配失败,返回错误码 return -E_NO_MEM; -c0108f9a: b8 fc ff ff ff mov $0xfffffffc,%eax +c0108db0: b8 fc ff ff ff mov $0xfffffffc,%eax } -c0108f9f: c9 leave -c0108fa0: c3 ret +c0108db5: 89 ec mov %ebp,%esp +c0108db7: 5d pop %ebp +c0108db8: c3 ret -c0108fa1 : +c0108db9 : // put_kstack - free the memory space of process kernel stack static void put_kstack(struct proc_struct *proc) { -c0108fa1: f3 0f 1e fb endbr32 -c0108fa5: 55 push %ebp -c0108fa6: 89 e5 mov %esp,%ebp -c0108fa8: 83 ec 18 sub $0x18,%esp +c0108db9: 55 push %ebp +c0108dba: 89 e5 mov %esp,%ebp +c0108dbc: 83 ec 18 sub $0x18,%esp free_pages(kva2page((void *)(proc->kstack)), KSTACKPAGE); -c0108fab: 8b 45 08 mov 0x8(%ebp),%eax -c0108fae: 8b 40 0c mov 0xc(%eax),%eax -c0108fb1: 89 04 24 mov %eax,(%esp) -c0108fb4: e8 05 fb ff ff call c0108abe -c0108fb9: c7 44 24 04 02 00 00 movl $0x2,0x4(%esp) -c0108fc0: 00 -c0108fc1: 89 04 24 mov %eax,(%esp) -c0108fc4: e8 ff a7 ff ff call c01037c8 -} -c0108fc9: 90 nop -c0108fca: c9 leave -c0108fcb: c3 ret - -c0108fcc : +c0108dbf: 8b 45 08 mov 0x8(%ebp),%eax +c0108dc2: 8b 40 0c mov 0xc(%eax),%eax +c0108dc5: 89 04 24 mov %eax,(%esp) +c0108dc8: e8 1a fb ff ff call c01088e7 +c0108dcd: c7 44 24 04 02 00 00 movl $0x2,0x4(%esp) +c0108dd4: 00 +c0108dd5: 89 04 24 mov %eax,(%esp) +c0108dd8: e8 6b c2 ff ff call c0105048 +} +c0108ddd: 90 nop +c0108dde: 89 ec mov %ebp,%esp +c0108de0: 5d pop %ebp +c0108de1: c3 ret + +c0108de2 : * @param proc 指向新进程的进程结构体指针,用于存储复制的内存管理信息。 * * 断言当前进程没有内存管理信息。 */ static int copy_mm(uint32_t clone_flags, struct proc_struct *proc) { -c0108fcc: f3 0f 1e fb endbr32 -c0108fd0: 55 push %ebp -c0108fd1: 89 e5 mov %esp,%ebp -c0108fd3: 83 ec 18 sub $0x18,%esp +c0108de2: 55 push %ebp +c0108de3: 89 e5 mov %esp,%ebp +c0108de5: 83 ec 18 sub $0x18,%esp assert(current->mm == NULL); -c0108fd6: a1 28 c0 12 c0 mov 0xc012c028,%eax -c0108fdb: 8b 40 18 mov 0x18(%eax),%eax -c0108fde: 85 c0 test %eax,%eax -c0108fe0: 74 24 je c0109006 -c0108fe2: c7 44 24 0c 3c c2 10 movl $0xc010c23c,0xc(%esp) -c0108fe9: c0 -c0108fea: c7 44 24 08 50 c2 10 movl $0xc010c250,0x8(%esp) -c0108ff1: c0 -c0108ff2: c7 44 24 04 37 01 00 movl $0x137,0x4(%esp) -c0108ff9: 00 -c0108ffa: c7 04 24 65 c2 10 c0 movl $0xc010c265,(%esp) -c0109001: e8 3d 74 ff ff call c0100443 <__panic> +c0108de8: a1 90 c1 12 c0 mov 0xc012c190,%eax +c0108ded: 8b 40 18 mov 0x18(%eax),%eax +c0108df0: 85 c0 test %eax,%eax +c0108df2: 74 24 je c0108e18 +c0108df4: c7 44 24 0c 18 c0 10 movl $0xc010c018,0xc(%esp) +c0108dfb: c0 +c0108dfc: c7 44 24 08 2c c0 10 movl $0xc010c02c,0x8(%esp) +c0108e03: c0 +c0108e04: c7 44 24 04 5d 01 00 movl $0x15d,0x4(%esp) +c0108e0b: 00 +c0108e0c: c7 04 24 41 c0 10 c0 movl $0xc010c041,(%esp) +c0108e13: e8 2d 7e ff ff call c0100c45 <__panic> /* do nothing in this project */ return 0; -c0109006: b8 00 00 00 00 mov $0x0,%eax +c0108e18: b8 00 00 00 00 mov $0x0,%eax } -c010900b: c9 leave -c010900c: c3 ret +c0108e1d: 89 ec mov %ebp,%esp +c0108e1f: 5d pop %ebp +c0108e20: c3 ret -c010900d : +c0108e21 : * @param proc 指向新进程的进程结构体,用于存储初始化后的陷阱帧和上下文信息。 * @param esp 新进程的栈指针,表示新进程栈的初始位置。 * @param tf 指向当前线程的陷阱帧结构体,用于将当前线程的执行状态复制到新进程中。 */ static void copy_thread(struct proc_struct *proc, uintptr_t esp, struct trapframe *tf) { -c010900d: f3 0f 1e fb endbr32 -c0109011: 55 push %ebp -c0109012: 89 e5 mov %esp,%ebp -c0109014: 57 push %edi -c0109015: 56 push %esi -c0109016: 53 push %ebx +c0108e21: 55 push %ebp +c0108e22: 89 e5 mov %esp,%ebp +c0108e24: 57 push %edi +c0108e25: 56 push %esi +c0108e26: 53 push %ebx // 初始化新进程的陷阱帧,位于其内核栈的顶部 proc->tf = (struct trapframe *)(proc->kstack + KSTACKSIZE) - 1; -c0109017: 8b 45 08 mov 0x8(%ebp),%eax -c010901a: 8b 40 0c mov 0xc(%eax),%eax -c010901d: 05 b4 1f 00 00 add $0x1fb4,%eax -c0109022: 89 c2 mov %eax,%edx -c0109024: 8b 45 08 mov 0x8(%ebp),%eax -c0109027: 89 50 3c mov %edx,0x3c(%eax) +c0108e27: 8b 45 08 mov 0x8(%ebp),%eax +c0108e2a: 8b 40 0c mov 0xc(%eax),%eax +c0108e2d: 05 b4 1f 00 00 add $0x1fb4,%eax +c0108e32: 89 c2 mov %eax,%edx +c0108e34: 8b 45 08 mov 0x8(%ebp),%eax +c0108e37: 89 50 3c mov %edx,0x3c(%eax) // 将当前线程的陷阱帧内容复制到新进程的陷阱帧 *(proc->tf) = *tf; -c010902a: 8b 45 08 mov 0x8(%ebp),%eax -c010902d: 8b 40 3c mov 0x3c(%eax),%eax -c0109030: 8b 55 10 mov 0x10(%ebp),%edx -c0109033: bb 4c 00 00 00 mov $0x4c,%ebx -c0109038: 89 c1 mov %eax,%ecx -c010903a: 83 e1 01 and $0x1,%ecx -c010903d: 85 c9 test %ecx,%ecx -c010903f: 74 0c je c010904d -c0109041: 0f b6 0a movzbl (%edx),%ecx -c0109044: 88 08 mov %cl,(%eax) -c0109046: 8d 40 01 lea 0x1(%eax),%eax -c0109049: 8d 52 01 lea 0x1(%edx),%edx -c010904c: 4b dec %ebx -c010904d: 89 c1 mov %eax,%ecx -c010904f: 83 e1 02 and $0x2,%ecx -c0109052: 85 c9 test %ecx,%ecx -c0109054: 74 0f je c0109065 -c0109056: 0f b7 0a movzwl (%edx),%ecx -c0109059: 66 89 08 mov %cx,(%eax) -c010905c: 8d 40 02 lea 0x2(%eax),%eax -c010905f: 8d 52 02 lea 0x2(%edx),%edx -c0109062: 83 eb 02 sub $0x2,%ebx -c0109065: 89 df mov %ebx,%edi -c0109067: 83 e7 fc and $0xfffffffc,%edi -c010906a: b9 00 00 00 00 mov $0x0,%ecx -c010906f: 8b 34 0a mov (%edx,%ecx,1),%esi -c0109072: 89 34 08 mov %esi,(%eax,%ecx,1) -c0109075: 83 c1 04 add $0x4,%ecx -c0109078: 39 f9 cmp %edi,%ecx -c010907a: 72 f3 jb c010906f -c010907c: 01 c8 add %ecx,%eax -c010907e: 01 ca add %ecx,%edx -c0109080: b9 00 00 00 00 mov $0x0,%ecx -c0109085: 89 de mov %ebx,%esi -c0109087: 83 e6 02 and $0x2,%esi -c010908a: 85 f6 test %esi,%esi -c010908c: 74 0b je c0109099 -c010908e: 0f b7 34 0a movzwl (%edx,%ecx,1),%esi -c0109092: 66 89 34 08 mov %si,(%eax,%ecx,1) -c0109096: 83 c1 02 add $0x2,%ecx -c0109099: 83 e3 01 and $0x1,%ebx -c010909c: 85 db test %ebx,%ebx -c010909e: 74 07 je c01090a7 -c01090a0: 0f b6 14 0a movzbl (%edx,%ecx,1),%edx -c01090a4: 88 14 08 mov %dl,(%eax,%ecx,1) +c0108e3a: 8b 45 08 mov 0x8(%ebp),%eax +c0108e3d: 8b 40 3c mov 0x3c(%eax),%eax +c0108e40: 8b 55 10 mov 0x10(%ebp),%edx +c0108e43: b9 4c 00 00 00 mov $0x4c,%ecx +c0108e48: 89 c3 mov %eax,%ebx +c0108e4a: 83 e3 01 and $0x1,%ebx +c0108e4d: 85 db test %ebx,%ebx +c0108e4f: 74 0c je c0108e5d +c0108e51: 0f b6 1a movzbl (%edx),%ebx +c0108e54: 88 18 mov %bl,(%eax) +c0108e56: 8d 40 01 lea 0x1(%eax),%eax +c0108e59: 8d 52 01 lea 0x1(%edx),%edx +c0108e5c: 49 dec %ecx +c0108e5d: 89 c3 mov %eax,%ebx +c0108e5f: 83 e3 02 and $0x2,%ebx +c0108e62: 85 db test %ebx,%ebx +c0108e64: 74 0f je c0108e75 +c0108e66: 0f b7 1a movzwl (%edx),%ebx +c0108e69: 66 89 18 mov %bx,(%eax) +c0108e6c: 8d 40 02 lea 0x2(%eax),%eax +c0108e6f: 8d 52 02 lea 0x2(%edx),%edx +c0108e72: 83 e9 02 sub $0x2,%ecx +c0108e75: 89 cf mov %ecx,%edi +c0108e77: 83 e7 fc and $0xfffffffc,%edi +c0108e7a: bb 00 00 00 00 mov $0x0,%ebx +c0108e7f: 8b 34 1a mov (%edx,%ebx,1),%esi +c0108e82: 89 34 18 mov %esi,(%eax,%ebx,1) +c0108e85: 83 c3 04 add $0x4,%ebx +c0108e88: 39 fb cmp %edi,%ebx +c0108e8a: 72 f3 jb c0108e7f +c0108e8c: 01 d8 add %ebx,%eax +c0108e8e: 01 da add %ebx,%edx +c0108e90: bb 00 00 00 00 mov $0x0,%ebx +c0108e95: 89 ce mov %ecx,%esi +c0108e97: 83 e6 02 and $0x2,%esi +c0108e9a: 85 f6 test %esi,%esi +c0108e9c: 74 0b je c0108ea9 +c0108e9e: 0f b7 34 1a movzwl (%edx,%ebx,1),%esi +c0108ea2: 66 89 34 18 mov %si,(%eax,%ebx,1) +c0108ea6: 83 c3 02 add $0x2,%ebx +c0108ea9: 83 e1 01 and $0x1,%ecx +c0108eac: 85 c9 test %ecx,%ecx +c0108eae: 74 07 je c0108eb7 +c0108eb0: 0f b6 14 1a movzbl (%edx,%ebx,1),%edx +c0108eb4: 88 14 18 mov %dl,(%eax,%ebx,1) // 设置子进程的返回值为0,表示fork成功 proc->tf->tf_regs.reg_eax = 0; -c01090a7: 8b 45 08 mov 0x8(%ebp),%eax -c01090aa: 8b 40 3c mov 0x3c(%eax),%eax -c01090ad: c7 40 1c 00 00 00 00 movl $0x0,0x1c(%eax) +c0108eb7: 8b 45 08 mov 0x8(%ebp),%eax +c0108eba: 8b 40 3c mov 0x3c(%eax),%eax +c0108ebd: c7 40 1c 00 00 00 00 movl $0x0,0x1c(%eax) // 设置子进程的栈指针为指定的esp位置 proc->tf->tf_esp = esp; -c01090b4: 8b 45 08 mov 0x8(%ebp),%eax -c01090b7: 8b 40 3c mov 0x3c(%eax),%eax -c01090ba: 8b 55 0c mov 0xc(%ebp),%edx -c01090bd: 89 50 44 mov %edx,0x44(%eax) +c0108ec4: 8b 45 08 mov 0x8(%ebp),%eax +c0108ec7: 8b 40 3c mov 0x3c(%eax),%eax +c0108eca: 8b 55 0c mov 0xc(%ebp),%edx +c0108ecd: 89 50 44 mov %edx,0x44(%eax) // 启用子进程的中断标志 proc->tf->tf_eflags |= FL_IF; -c01090c0: 8b 45 08 mov 0x8(%ebp),%eax -c01090c3: 8b 40 3c mov 0x3c(%eax),%eax -c01090c6: 8b 50 40 mov 0x40(%eax),%edx -c01090c9: 8b 45 08 mov 0x8(%ebp),%eax -c01090cc: 8b 40 3c mov 0x3c(%eax),%eax -c01090cf: 81 ca 00 02 00 00 or $0x200,%edx -c01090d5: 89 50 40 mov %edx,0x40(%eax) +c0108ed0: 8b 45 08 mov 0x8(%ebp),%eax +c0108ed3: 8b 40 3c mov 0x3c(%eax),%eax +c0108ed6: 8b 50 40 mov 0x40(%eax),%edx +c0108ed9: 8b 45 08 mov 0x8(%ebp),%eax +c0108edc: 8b 40 3c mov 0x3c(%eax),%eax +c0108edf: 81 ca 00 02 00 00 or $0x200,%edx +c0108ee5: 89 50 40 mov %edx,0x40(%eax) // 设置子进程的初始指令指针为forkret函数的地址 proc->context.eip = (uintptr_t)forkret; -c01090d8: ba d2 8d 10 c0 mov $0xc0108dd2,%edx -c01090dd: 8b 45 08 mov 0x8(%ebp),%eax -c01090e0: 89 50 1c mov %edx,0x1c(%eax) +c0108ee8: ba f3 8b 10 c0 mov $0xc0108bf3,%edx +c0108eed: 8b 45 08 mov 0x8(%ebp),%eax +c0108ef0: 89 50 1c mov %edx,0x1c(%eax) // 设置子进程的栈指针为其陷阱帧的地址 proc->context.esp = (uintptr_t)(proc->tf); -c01090e3: 8b 45 08 mov 0x8(%ebp),%eax -c01090e6: 8b 40 3c mov 0x3c(%eax),%eax -c01090e9: 89 c2 mov %eax,%edx -c01090eb: 8b 45 08 mov 0x8(%ebp),%eax -c01090ee: 89 50 20 mov %edx,0x20(%eax) -} -c01090f1: 90 nop -c01090f2: 5b pop %ebx -c01090f3: 5e pop %esi -c01090f4: 5f pop %edi -c01090f5: 5d pop %ebp -c01090f6: c3 ret - -c01090f7 : - * @clone_flags: used to guide how to clone the child process +c0108ef3: 8b 45 08 mov 0x8(%ebp),%eax +c0108ef6: 8b 40 3c mov 0x3c(%eax),%eax +c0108ef9: 89 c2 mov %eax,%edx +c0108efb: 8b 45 08 mov 0x8(%ebp),%eax +c0108efe: 89 50 20 mov %edx,0x20(%eax) +} +c0108f01: 90 nop +c0108f02: 5b pop %ebx +c0108f03: 5e pop %esi +c0108f04: 5f pop %edi +c0108f05: 5d pop %ebp +c0108f06: c3 ret + +c0108f07 : * @stack: the parent's user stack pointer. if stack==0, It means to fork a kernel thread. * @tf: the trapframe info, which will be copied to child process's proc->tf */ + int do_fork(uint32_t clone_flags, uintptr_t stack, struct trapframe *tf) { -c01090f7: f3 0f 1e fb endbr32 -c01090fb: 55 push %ebp -c01090fc: 89 e5 mov %esp,%ebp -c01090fe: 83 ec 48 sub $0x48,%esp +c0108f07: 55 push %ebp +c0108f08: 89 e5 mov %esp,%ebp +c0108f0a: 83 ec 48 sub $0x48,%esp int ret = -E_NO_FREE_PROC; -c0109101: c7 45 f4 fb ff ff ff movl $0xfffffffb,-0xc(%ebp) +c0108f0d: c7 45 f4 fb ff ff ff movl $0xfffffffb,-0xc(%ebp) struct proc_struct *proc; if (nr_process >= MAX_PROCESS) { -c0109108: a1 40 e0 12 c0 mov 0xc012e040,%eax -c010910d: 3d ff 0f 00 00 cmp $0xfff,%eax -c0109112: 0f 8f 17 01 00 00 jg c010922f +c0108f14: a1 a0 e1 12 c0 mov 0xc012e1a0,%eax +c0108f19: 3d ff 0f 00 00 cmp $0xfff,%eax +c0108f1e: 0f 8f 17 01 00 00 jg c010903b goto fork_out; } ret = -E_NO_MEM; -c0109118: c7 45 f4 fc ff ff ff movl $0xfffffffc,-0xc(%ebp) +c0108f24: c7 45 f4 fc ff ff ff movl $0xfffffffc,-0xc(%ebp) // 4. call copy_thread to setup tf & context in proc_struct // 5. insert proc_struct into hash_list && proc_list // 6. call wakeup_proc to make the new child process RUNNABLE // 7. set ret vaule using child proc's pid //调用alloc_proc,首先获得一块用户信息块 if((proc = alloc_proc()) == NULL){ -c010911f: e8 e4 f9 ff ff call c0108b08 -c0109124: 89 45 f0 mov %eax,-0x10(%ebp) -c0109127: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c010912b: 0f 84 01 01 00 00 je c0109232 +c0108f2b: e8 03 fa ff ff call c0108933 +c0108f30: 89 45 f0 mov %eax,-0x10(%ebp) +c0108f33: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) +c0108f37: 0f 84 01 01 00 00 je c010903e goto fork_out; } proc->parent = current; -c0109131: 8b 15 28 c0 12 c0 mov 0xc012c028,%edx -c0109137: 8b 45 f0 mov -0x10(%ebp),%eax -c010913a: 89 50 14 mov %edx,0x14(%eax) +c0108f3d: 8b 15 90 c1 12 c0 mov 0xc012c190,%edx +c0108f43: 8b 45 f0 mov -0x10(%ebp),%eax +c0108f46: 89 50 14 mov %edx,0x14(%eax) //为进程分配一个内核栈 ret = setup_kstack(proc); -c010913d: 8b 45 f0 mov -0x10(%ebp),%eax -c0109140: 89 04 24 mov %eax,(%esp) -c0109143: e8 19 fe ff ff call c0108f61 -c0109148: 89 45 f4 mov %eax,-0xc(%ebp) +c0108f49: 8b 45 f0 mov -0x10(%ebp),%eax +c0108f4c: 89 04 24 mov %eax,(%esp) +c0108f4f: e8 27 fe ff ff call c0108d7b +c0108f54: 89 45 f4 mov %eax,-0xc(%ebp) if (ret != 0) { -c010914b: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c010914f: 0f 85 f5 00 00 00 jne c010924a +c0108f57: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0108f5b: 0f 85 f1 00 00 00 jne c0109052 goto bad_fork_cleanup_proc; } //复制原进程的内存管理信息到新进程 ret = copy_mm(clone_flags, proc); -c0109155: 8b 45 f0 mov -0x10(%ebp),%eax -c0109158: 89 44 24 04 mov %eax,0x4(%esp) -c010915c: 8b 45 08 mov 0x8(%ebp),%eax -c010915f: 89 04 24 mov %eax,(%esp) -c0109162: e8 65 fe ff ff call c0108fcc -c0109167: 89 45 f4 mov %eax,-0xc(%ebp) +c0108f61: 8b 45 f0 mov -0x10(%ebp),%eax +c0108f64: 89 44 24 04 mov %eax,0x4(%esp) +c0108f68: 8b 45 08 mov 0x8(%ebp),%eax +c0108f6b: 89 04 24 mov %eax,(%esp) +c0108f6e: e8 6f fe ff ff call c0108de2 +c0108f73: 89 45 f4 mov %eax,-0xc(%ebp) if (ret != 0) { -c010916a: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) -c010916e: 0f 85 c4 00 00 00 jne c0109238 +c0108f76: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) +c0108f7a: 0f 85 c4 00 00 00 jne c0109044 goto bad_fork_cleanup_kstack; } //复制原进程上下文到新进程 copy_thread(proc, stack, tf); -c0109174: 8b 45 10 mov 0x10(%ebp),%eax -c0109177: 89 44 24 08 mov %eax,0x8(%esp) -c010917b: 8b 45 0c mov 0xc(%ebp),%eax -c010917e: 89 44 24 04 mov %eax,0x4(%esp) -c0109182: 8b 45 f0 mov -0x10(%ebp),%eax -c0109185: 89 04 24 mov %eax,(%esp) -c0109188: e8 80 fe ff ff call c010900d +c0108f80: 8b 45 10 mov 0x10(%ebp),%eax +c0108f83: 89 44 24 08 mov %eax,0x8(%esp) +c0108f87: 8b 45 0c mov 0xc(%ebp),%eax +c0108f8a: 89 44 24 04 mov %eax,0x4(%esp) +c0108f8e: 8b 45 f0 mov -0x10(%ebp),%eax +c0108f91: 89 04 24 mov %eax,(%esp) +c0108f94: e8 88 fe ff ff call c0108e21 bool intr_flag; local_intr_save(intr_flag); -c010918d: e8 2b f8 ff ff call c01089bd <__intr_save> -c0109192: 89 45 ec mov %eax,-0x14(%ebp) +c0108f99: e8 3e f8 ff ff call c01087dc <__intr_save> +c0108f9e: 89 45 ec mov %eax,-0x14(%ebp) { //为新进程分配一个pid proc->pid = get_pid(); -c0109195: e8 c4 fa ff ff call c0108c5e -c010919a: 8b 55 f0 mov -0x10(%ebp),%edx -c010919d: 89 42 04 mov %eax,0x4(%edx) +c0108fa1: e8 dd fa ff ff call c0108a83 +c0108fa6: 8b 55 f0 mov -0x10(%ebp),%edx +c0108fa9: 89 42 04 mov %eax,0x4(%edx) //将新进程插入到进程列表 hash_proc(proc); -c01091a0: 8b 45 f0 mov -0x10(%ebp),%eax -c01091a3: 89 04 24 mov %eax,(%esp) -c01091a6: e8 44 fc ff ff call c0108def - list_add(&proc_init, &(proc->list_link)); -c01091ab: 8b 45 f0 mov -0x10(%ebp),%eax -c01091ae: 83 c0 58 add $0x58,%eax -c01091b1: c7 45 e8 da 92 10 c0 movl $0xc01092da,-0x18(%ebp) -c01091b8: 89 45 e4 mov %eax,-0x1c(%ebp) -c01091bb: 8b 45 e8 mov -0x18(%ebp),%eax -c01091be: 89 45 e0 mov %eax,-0x20(%ebp) -c01091c1: 8b 45 e4 mov -0x1c(%ebp),%eax -c01091c4: 89 45 dc mov %eax,-0x24(%ebp) +c0108fac: 8b 45 f0 mov -0x10(%ebp),%eax +c0108faf: 89 04 24 mov %eax,(%esp) +c0108fb2: e8 57 fc ff ff call c0108c0e + list_add(&proc_list, &(proc->list_link)); +c0108fb7: 8b 45 f0 mov -0x10(%ebp),%eax +c0108fba: 83 c0 58 add $0x58,%eax +c0108fbd: c7 45 e8 80 c1 12 c0 movl $0xc012c180,-0x18(%ebp) +c0108fc4: 89 45 e4 mov %eax,-0x1c(%ebp) +c0108fc7: 8b 45 e8 mov -0x18(%ebp),%eax +c0108fca: 89 45 e0 mov %eax,-0x20(%ebp) +c0108fcd: 8b 45 e4 mov -0x1c(%ebp),%eax +c0108fd0: 89 45 dc mov %eax,-0x24(%ebp) __list_add(elm, listelm, listelm->next); -c01091c7: 8b 45 e0 mov -0x20(%ebp),%eax -c01091ca: 8b 40 04 mov 0x4(%eax),%eax -c01091cd: 8b 55 dc mov -0x24(%ebp),%edx -c01091d0: 89 55 d8 mov %edx,-0x28(%ebp) -c01091d3: 8b 55 e0 mov -0x20(%ebp),%edx -c01091d6: 89 55 d4 mov %edx,-0x2c(%ebp) -c01091d9: 89 45 d0 mov %eax,-0x30(%ebp) +c0108fd3: 8b 45 e0 mov -0x20(%ebp),%eax +c0108fd6: 8b 40 04 mov 0x4(%eax),%eax +c0108fd9: 8b 55 dc mov -0x24(%ebp),%edx +c0108fdc: 89 55 d8 mov %edx,-0x28(%ebp) +c0108fdf: 8b 55 e0 mov -0x20(%ebp),%edx +c0108fe2: 89 55 d4 mov %edx,-0x2c(%ebp) +c0108fe5: 89 45 d0 mov %eax,-0x30(%ebp) prev->next = next->prev = elm; -c01091dc: 8b 45 d0 mov -0x30(%ebp),%eax -c01091df: 8b 55 d8 mov -0x28(%ebp),%edx -c01091e2: 89 10 mov %edx,(%eax) -c01091e4: 8b 45 d0 mov -0x30(%ebp),%eax -c01091e7: 8b 10 mov (%eax),%edx -c01091e9: 8b 45 d4 mov -0x2c(%ebp),%eax -c01091ec: 89 50 04 mov %edx,0x4(%eax) +c0108fe8: 8b 45 d0 mov -0x30(%ebp),%eax +c0108feb: 8b 55 d8 mov -0x28(%ebp),%edx +c0108fee: 89 10 mov %edx,(%eax) +c0108ff0: 8b 45 d0 mov -0x30(%ebp),%eax +c0108ff3: 8b 10 mov (%eax),%edx +c0108ff5: 8b 45 d4 mov -0x2c(%ebp),%eax +c0108ff8: 89 50 04 mov %edx,0x4(%eax) elm->next = next; -c01091ef: 8b 45 d8 mov -0x28(%ebp),%eax -c01091f2: 8b 55 d0 mov -0x30(%ebp),%edx -c01091f5: 89 50 04 mov %edx,0x4(%eax) +c0108ffb: 8b 45 d8 mov -0x28(%ebp),%eax +c0108ffe: 8b 55 d0 mov -0x30(%ebp),%edx +c0109001: 89 50 04 mov %edx,0x4(%eax) elm->prev = prev; -c01091f8: 8b 45 d8 mov -0x28(%ebp),%eax -c01091fb: 8b 55 d4 mov -0x2c(%ebp),%edx -c01091fe: 89 10 mov %edx,(%eax) +c0109004: 8b 45 d8 mov -0x28(%ebp),%eax +c0109007: 8b 55 d4 mov -0x2c(%ebp),%edx +c010900a: 89 10 mov %edx,(%eax) } -c0109200: 90 nop +c010900c: 90 nop } -c0109201: 90 nop +c010900d: 90 nop } -c0109202: 90 nop +c010900e: 90 nop nr_process ++; -c0109203: a1 40 e0 12 c0 mov 0xc012e040,%eax -c0109208: 40 inc %eax -c0109209: a3 40 e0 12 c0 mov %eax,0xc012e040 +c010900f: a1 a0 e1 12 c0 mov 0xc012e1a0,%eax +c0109014: 40 inc %eax +c0109015: a3 a0 e1 12 c0 mov %eax,0xc012e1a0 } local_intr_restore(intr_flag); -c010920e: 8b 45 ec mov -0x14(%ebp),%eax -c0109211: 89 04 24 mov %eax,(%esp) -c0109214: e8 ce f7 ff ff call c01089e7 <__intr_restore> +c010901a: 8b 45 ec mov -0x14(%ebp),%eax +c010901d: 89 04 24 mov %eax,(%esp) +c0109020: e8 e3 f7 ff ff call c0108808 <__intr_restore> wakeup_proc(proc); -c0109219: 8b 45 f0 mov -0x10(%ebp),%eax -c010921c: 89 04 24 mov %eax,(%esp) -c010921f: e8 d4 02 00 00 call c01094f8 +c0109025: 8b 45 f0 mov -0x10(%ebp),%eax +c0109028: 89 04 24 mov %eax,(%esp) +c010902b: e8 01 03 00 00 call c0109331 ret = proc->pid; -c0109224: 8b 45 f0 mov -0x10(%ebp),%eax -c0109227: 8b 40 04 mov 0x4(%eax),%eax -c010922a: 89 45 f4 mov %eax,-0xc(%ebp) -c010922d: eb 04 jmp c0109233 +c0109030: 8b 45 f0 mov -0x10(%ebp),%eax +c0109033: 8b 40 04 mov 0x4(%eax),%eax +c0109036: 89 45 f4 mov %eax,-0xc(%ebp) +c0109039: eb 04 jmp c010903f goto fork_out; -c010922f: 90 nop -c0109230: eb 01 jmp c0109233 +c010903b: 90 nop +c010903c: eb 01 jmp c010903f goto fork_out; -c0109232: 90 nop +c010903e: 90 nop fork_out: return ret; -c0109233: 8b 45 f4 mov -0xc(%ebp),%eax -c0109236: eb 20 jmp c0109258 +c010903f: 8b 45 f4 mov -0xc(%ebp),%eax +c0109042: eb 1c jmp c0109060 goto bad_fork_cleanup_kstack; -c0109238: 90 nop -c0109239: f3 0f 1e fb endbr32 +c0109044: 90 nop bad_fork_cleanup_kstack: - put_kstack(proc); -c010923d: 8b 45 f0 mov -0x10(%ebp),%eax -c0109240: 89 04 24 mov %eax,(%esp) -c0109243: e8 59 fd ff ff call c0108fa1 -c0109248: eb 01 jmp c010924b - goto bad_fork_cleanup_proc; -c010924a: 90 nop -bad_fork_cleanup_proc: - kfree(proc); -c010924b: 8b 45 f0 mov -0x10(%ebp),%eax -c010924e: 89 04 24 mov %eax,(%esp) -c0109251: e8 ff d5 ff ff call c0106855 - goto fork_out; -c0109256: eb db jmp c0109233 -} -c0109258: c9 leave -c0109259: c3 ret - -c010925a : -// do_exit - called by sys_exit -// 1. call exit_mmap & put_pgdir & mm_destroy to free the almost all memory space of process -// 2. set process' state as PROC_ZOMBIE, then call wakeup_proc(parent) to ask parent reclaim itself. -// 3. call scheduler to switch to other process -int -do_exit(int error_code) { -c010925a: f3 0f 1e fb endbr32 -c010925e: 55 push %ebp -c010925f: 89 e5 mov %esp,%ebp -c0109261: 83 ec 18 sub $0x18,%esp - panic("process exit!!.\n"); -c0109264: c7 44 24 08 79 c2 10 movl $0xc010c279,0x8(%esp) -c010926b: c0 -c010926c: c7 44 24 04 b6 01 00 movl $0x1b6,0x4(%esp) -c0109273: 00 -c0109274: c7 04 24 65 c2 10 c0 movl $0xc010c265,(%esp) -c010927b: e8 c3 71 ff ff call c0100443 <__panic> - -c0109280 : -} - -// init_main - the second kernel thread used to create user_main kernel threads -static int -init_main(void *arg) { -c0109280: f3 0f 1e fb endbr32 -c0109284: 55 push %ebp -c0109285: 89 e5 mov %esp,%ebp -c0109287: 83 ec 18 sub $0x18,%esp - cprintf("this initproc, pid = %d, name = \"%s\"\n", current->pid, get_proc_name(current)); -c010928a: a1 28 c0 12 c0 mov 0xc012c028,%eax -c010928f: 89 04 24 mov %eax,(%esp) -c0109292: e8 81 f9 ff ff call c0108c18 -c0109297: 8b 15 28 c0 12 c0 mov 0xc012c028,%edx -c010929d: 8b 52 04 mov 0x4(%edx),%edx -c01092a0: 89 44 24 08 mov %eax,0x8(%esp) -c01092a4: 89 54 24 04 mov %edx,0x4(%esp) -c01092a8: c7 04 24 8c c2 10 c0 movl $0xc010c28c,(%esp) -c01092af: e8 23 70 ff ff call c01002d7 - cprintf("To U: \"%s\".\n", (const char *)arg); -c01092b4: 8b 45 08 mov 0x8(%ebp),%eax -c01092b7: 89 44 24 04 mov %eax,0x4(%esp) -c01092bb: c7 04 24 b2 c2 10 c0 movl $0xc010c2b2,(%esp) -c01092c2: e8 10 70 ff ff call c01002d7 - cprintf("To U: \"en.., Bye, Bye. :)\"\n"); -c01092c7: c7 04 24 bf c2 10 c0 movl $0xc010c2bf,(%esp) -c01092ce: e8 04 70 ff ff call c01002d7 - return 0; -c01092d3: b8 00 00 00 00 mov $0x0,%eax -} -c01092d8: c9 leave -c01092d9: c3 ret - -c01092da : - -// proc_init - set up the first kernel thread idleproc "idle" by itself and -// - create the second kernel thread init_main -void -proc_init(void) { -c01092da: f3 0f 1e fb endbr32 -c01092de: 55 push %ebp -c01092df: 89 e5 mov %esp,%ebp -c01092e1: 83 ec 28 sub $0x28,%esp -c01092e4: c7 45 ec b0 e1 12 c0 movl $0xc012e1b0,-0x14(%ebp) - elm->prev = elm->next = elm; -c01092eb: 8b 45 ec mov -0x14(%ebp),%eax -c01092ee: 8b 55 ec mov -0x14(%ebp),%edx -c01092f1: 89 50 04 mov %edx,0x4(%eax) -c01092f4: 8b 45 ec mov -0x14(%ebp),%eax -c01092f7: 8b 50 04 mov 0x4(%eax),%edx -c01092fa: 8b 45 ec mov -0x14(%ebp),%eax -c01092fd: 89 10 mov %edx,(%eax) -} -c01092ff: 90 nop - int i; - - list_init(&proc_list); - for (i = 0; i < HASH_LIST_SIZE; i ++) { -c0109300: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) -c0109307: eb 26 jmp c010932f - list_init(hash_list + i); -c0109309: 8b 45 f4 mov -0xc(%ebp),%eax -c010930c: c1 e0 03 shl $0x3,%eax -c010930f: 05 40 c0 12 c0 add $0xc012c040,%eax -c0109314: 89 45 e8 mov %eax,-0x18(%ebp) - elm->prev = elm->next = elm; -c0109317: 8b 45 e8 mov -0x18(%ebp),%eax -c010931a: 8b 55 e8 mov -0x18(%ebp),%edx -c010931d: 89 50 04 mov %edx,0x4(%eax) -c0109320: 8b 45 e8 mov -0x18(%ebp),%eax -c0109323: 8b 50 04 mov 0x4(%eax),%edx -c0109326: 8b 45 e8 mov -0x18(%ebp),%eax -c0109329: 89 10 mov %edx,(%eax) -} -c010932b: 90 nop - for (i = 0; i < HASH_LIST_SIZE; i ++) { -c010932c: ff 45 f4 incl -0xc(%ebp) -c010932f: 81 7d f4 ff 03 00 00 cmpl $0x3ff,-0xc(%ebp) -c0109336: 7e d1 jle c0109309 - } - - if ((idleproc = alloc_proc()) == NULL) { -c0109338: e8 cb f7 ff ff call c0108b08 -c010933d: a3 20 c0 12 c0 mov %eax,0xc012c020 -c0109342: a1 20 c0 12 c0 mov 0xc012c020,%eax -c0109347: 85 c0 test %eax,%eax -c0109349: 75 1c jne c0109367 - panic("cannot alloc idleproc.\n"); -c010934b: c7 44 24 08 db c2 10 movl $0xc010c2db,0x8(%esp) -c0109352: c0 -c0109353: c7 44 24 04 ce 01 00 movl $0x1ce,0x4(%esp) -c010935a: 00 -c010935b: c7 04 24 65 c2 10 c0 movl $0xc010c265,(%esp) -c0109362: e8 dc 70 ff ff call c0100443 <__panic> - } - - idleproc->pid = 0; -c0109367: a1 20 c0 12 c0 mov 0xc012c020,%eax -c010936c: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax) - idleproc->state = PROC_RUNNABLE; -c0109373: a1 20 c0 12 c0 mov 0xc012c020,%eax -c0109378: c7 00 02 00 00 00 movl $0x2,(%eax) - idleproc->kstack = (uintptr_t)bootstack; -c010937e: a1 20 c0 12 c0 mov 0xc012c020,%eax -c0109383: ba 00 60 12 c0 mov $0xc0126000,%edx -c0109388: 89 50 0c mov %edx,0xc(%eax) - idleproc->need_resched = 1; -c010938b: a1 20 c0 12 c0 mov 0xc012c020,%eax -c0109390: c7 40 10 01 00 00 00 movl $0x1,0x10(%eax) - set_proc_name(idleproc, "idle"); -c0109397: a1 20 c0 12 c0 mov 0xc012c020,%eax -c010939c: c7 44 24 04 f3 c2 10 movl $0xc010c2f3,0x4(%esp) -c01093a3: c0 -c01093a4: 89 04 24 mov %eax,(%esp) -c01093a7: e8 25 f8 ff ff call c0108bd1 - nr_process ++; -c01093ac: a1 40 e0 12 c0 mov 0xc012e040,%eax -c01093b1: 40 inc %eax -c01093b2: a3 40 e0 12 c0 mov %eax,0xc012e040 - - current = idleproc; -c01093b7: a1 20 c0 12 c0 mov 0xc012c020,%eax -c01093bc: a3 28 c0 12 c0 mov %eax,0xc012c028 - - int pid = kernel_thread(init_main, "Hello world!!", 0); -c01093c1: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) -c01093c8: 00 -c01093c9: c7 44 24 04 f8 c2 10 movl $0xc010c2f8,0x4(%esp) -c01093d0: c0 -c01093d1: c7 04 24 80 92 10 c0 movl $0xc0109280,(%esp) -c01093d8: e8 0c fb ff ff call c0108ee9 -c01093dd: 89 45 f0 mov %eax,-0x10(%ebp) - if (pid <= 0) { -c01093e0: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c01093e4: 7f 1c jg c0109402 - panic("create init_main failed.\n"); -c01093e6: c7 44 24 08 06 c3 10 movl $0xc010c306,0x8(%esp) -c01093ed: c0 -c01093ee: c7 44 24 04 dc 01 00 movl $0x1dc,0x4(%esp) -c01093f5: 00 -c01093f6: c7 04 24 65 c2 10 c0 movl $0xc010c265,(%esp) -c01093fd: e8 41 70 ff ff call c0100443 <__panic> - } - - initproc = find_proc(pid); -c0109402: 8b 45 f0 mov -0x10(%ebp),%eax -c0109405: 89 04 24 mov %eax,(%esp) -c0109408: e8 66 fa ff ff call c0108e73 -c010940d: a3 24 c0 12 c0 mov %eax,0xc012c024 - set_proc_name(initproc, "init"); -c0109412: a1 24 c0 12 c0 mov 0xc012c024,%eax -c0109417: c7 44 24 04 20 c3 10 movl $0xc010c320,0x4(%esp) -c010941e: c0 -c010941f: 89 04 24 mov %eax,(%esp) -c0109422: e8 aa f7 ff ff call c0108bd1 - - assert(idleproc != NULL && idleproc->pid == 0); -c0109427: a1 20 c0 12 c0 mov 0xc012c020,%eax -c010942c: 85 c0 test %eax,%eax -c010942e: 74 0c je c010943c -c0109430: a1 20 c0 12 c0 mov 0xc012c020,%eax -c0109435: 8b 40 04 mov 0x4(%eax),%eax -c0109438: 85 c0 test %eax,%eax -c010943a: 74 24 je c0109460 -c010943c: c7 44 24 0c 28 c3 10 movl $0xc010c328,0xc(%esp) -c0109443: c0 -c0109444: c7 44 24 08 50 c2 10 movl $0xc010c250,0x8(%esp) -c010944b: c0 -c010944c: c7 44 24 04 e2 01 00 movl $0x1e2,0x4(%esp) -c0109453: 00 -c0109454: c7 04 24 65 c2 10 c0 movl $0xc010c265,(%esp) -c010945b: e8 e3 6f ff ff call c0100443 <__panic> - assert(initproc != NULL && initproc->pid == 1); -c0109460: a1 24 c0 12 c0 mov 0xc012c024,%eax -c0109465: 85 c0 test %eax,%eax -c0109467: 74 0d je c0109476 -c0109469: a1 24 c0 12 c0 mov 0xc012c024,%eax -c010946e: 8b 40 04 mov 0x4(%eax),%eax -c0109471: 83 f8 01 cmp $0x1,%eax -c0109474: 74 24 je c010949a -c0109476: c7 44 24 0c 50 c3 10 movl $0xc010c350,0xc(%esp) -c010947d: c0 -c010947e: c7 44 24 08 50 c2 10 movl $0xc010c250,0x8(%esp) -c0109485: c0 -c0109486: c7 44 24 04 e3 01 00 movl $0x1e3,0x4(%esp) -c010948d: 00 -c010948e: c7 04 24 65 c2 10 c0 movl $0xc010c265,(%esp) -c0109495: e8 a9 6f ff ff call c0100443 <__panic> -} -c010949a: 90 nop -c010949b: c9 leave -c010949c: c3 ret - -c010949d : - -// cpu_idle - at the end of kern_init, the first kernel thread idleproc will do below works -void -cpu_idle(void) { -c010949d: f3 0f 1e fb endbr32 -c01094a1: 55 push %ebp -c01094a2: 89 e5 mov %esp,%ebp -c01094a4: 83 ec 08 sub $0x8,%esp - while (1) { - if (current->need_resched) { -c01094a7: a1 28 c0 12 c0 mov 0xc012c028,%eax -c01094ac: 8b 40 10 mov 0x10(%eax),%eax -c01094af: 85 c0 test %eax,%eax -c01094b1: 74 f4 je c01094a7 - schedule(); -c01094b3: e8 8e 00 00 00 call c0109546 - if (current->need_resched) { -c01094b8: eb ed jmp c01094a7 - -c01094ba <__intr_save>: -__intr_save(void) { -c01094ba: 55 push %ebp -c01094bb: 89 e5 mov %esp,%ebp -c01094bd: 83 ec 18 sub $0x18,%esp - asm volatile ("pushfl; popl %0" : "=r" (eflags)); -c01094c0: 9c pushf -c01094c1: 58 pop %eax -c01094c2: 89 45 f4 mov %eax,-0xc(%ebp) - return eflags; -c01094c5: 8b 45 f4 mov -0xc(%ebp),%eax - if (read_eflags() & FL_IF) { -c01094c8: 25 00 02 00 00 and $0x200,%eax -c01094cd: 85 c0 test %eax,%eax -c01094cf: 74 0c je c01094dd <__intr_save+0x23> - intr_disable(); -c01094d1: e8 7e 8c ff ff call c0102154 - return 1; -c01094d6: b8 01 00 00 00 mov $0x1,%eax -c01094db: eb 05 jmp c01094e2 <__intr_save+0x28> - return 0; -c01094dd: b8 00 00 00 00 mov $0x0,%eax -} -c01094e2: c9 leave -c01094e3: c3 ret - -c01094e4 <__intr_restore>: -__intr_restore(bool flag) { -c01094e4: 55 push %ebp -c01094e5: 89 e5 mov %esp,%ebp -c01094e7: 83 ec 08 sub $0x8,%esp - if (flag) { -c01094ea: 83 7d 08 00 cmpl $0x0,0x8(%ebp) -c01094ee: 74 05 je c01094f5 <__intr_restore+0x11> - intr_enable(); -c01094f0: e8 53 8c ff ff call c0102148 -} -c01094f5: 90 nop -c01094f6: c9 leave -c01094f7: c3 ret - -c01094f8 : -#include -#include -#include - -void -wakeup_proc(struct proc_struct *proc) { -c01094f8: f3 0f 1e fb endbr32 -c01094fc: 55 push %ebp -c01094fd: 89 e5 mov %esp,%ebp -c01094ff: 83 ec 18 sub $0x18,%esp - assert(proc->state != PROC_ZOMBIE && proc->state != PROC_RUNNABLE); -c0109502: 8b 45 08 mov 0x8(%ebp),%eax -c0109505: 8b 00 mov (%eax),%eax -c0109507: 83 f8 03 cmp $0x3,%eax -c010950a: 74 0a je c0109516 -c010950c: 8b 45 08 mov 0x8(%ebp),%eax -c010950f: 8b 00 mov (%eax),%eax -c0109511: 83 f8 02 cmp $0x2,%eax -c0109514: 75 24 jne c010953a -c0109516: c7 44 24 0c 78 c3 10 movl $0xc010c378,0xc(%esp) -c010951d: c0 -c010951e: c7 44 24 08 b3 c3 10 movl $0xc010c3b3,0x8(%esp) -c0109525: c0 -c0109526: c7 44 24 04 09 00 00 movl $0x9,0x4(%esp) -c010952d: 00 -c010952e: c7 04 24 c8 c3 10 c0 movl $0xc010c3c8,(%esp) -c0109535: e8 09 6f ff ff call c0100443 <__panic> - proc->state = PROC_RUNNABLE; -c010953a: 8b 45 08 mov 0x8(%ebp),%eax -c010953d: c7 00 02 00 00 00 movl $0x2,(%eax) -} -c0109543: 90 nop -c0109544: c9 leave -c0109545: c3 ret - -c0109546 : - -void -schedule(void) { -c0109546: f3 0f 1e fb endbr32 -c010954a: 55 push %ebp -c010954b: 89 e5 mov %esp,%ebp -c010954d: 83 ec 38 sub $0x38,%esp - bool intr_flag; - list_entry_t *le, *last; - struct proc_struct *next = NULL; -c0109550: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%ebp) - local_intr_save(intr_flag); -c0109557: e8 5e ff ff ff call c01094ba <__intr_save> -c010955c: 89 45 ec mov %eax,-0x14(%ebp) - { - current->need_resched = 0; -c010955f: a1 28 c0 12 c0 mov 0xc012c028,%eax -c0109564: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax) - last = (current == idleproc) ? &proc_list : &(current->list_link); -c010956b: 8b 15 28 c0 12 c0 mov 0xc012c028,%edx -c0109571: a1 20 c0 12 c0 mov 0xc012c020,%eax -c0109576: 39 c2 cmp %eax,%edx -c0109578: 74 0a je c0109584 -c010957a: a1 28 c0 12 c0 mov 0xc012c028,%eax -c010957f: 83 c0 58 add $0x58,%eax -c0109582: eb 05 jmp c0109589 -c0109584: b8 b0 e1 12 c0 mov $0xc012e1b0,%eax -c0109589: 89 45 e8 mov %eax,-0x18(%ebp) - le = last; -c010958c: 8b 45 e8 mov -0x18(%ebp),%eax -c010958f: 89 45 f4 mov %eax,-0xc(%ebp) -c0109592: 8b 45 f4 mov -0xc(%ebp),%eax -c0109595: 89 45 e4 mov %eax,-0x1c(%ebp) - return listelm->next; -c0109598: 8b 45 e4 mov -0x1c(%ebp),%eax -c010959b: 8b 40 04 mov 0x4(%eax),%eax - do { - if ((le = list_next(le)) != &proc_list) { -c010959e: 89 45 f4 mov %eax,-0xc(%ebp) -c01095a1: 81 7d f4 b0 e1 12 c0 cmpl $0xc012e1b0,-0xc(%ebp) -c01095a8: 74 13 je c01095bd - next = le2proc(le, list_link); -c01095aa: 8b 45 f4 mov -0xc(%ebp),%eax -c01095ad: 83 e8 58 sub $0x58,%eax -c01095b0: 89 45 f0 mov %eax,-0x10(%ebp) - if (next->state == PROC_RUNNABLE) { -c01095b3: 8b 45 f0 mov -0x10(%ebp),%eax -c01095b6: 8b 00 mov (%eax),%eax -c01095b8: 83 f8 02 cmp $0x2,%eax -c01095bb: 74 0a je c01095c7 - break; - } - } - } while (le != last); -c01095bd: 8b 45 f4 mov -0xc(%ebp),%eax -c01095c0: 3b 45 e8 cmp -0x18(%ebp),%eax -c01095c3: 75 cd jne c0109592 -c01095c5: eb 01 jmp c01095c8 - break; -c01095c7: 90 nop - if (next == NULL || next->state != PROC_RUNNABLE) { -c01095c8: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c01095cc: 74 0a je c01095d8 -c01095ce: 8b 45 f0 mov -0x10(%ebp),%eax -c01095d1: 8b 00 mov (%eax),%eax -c01095d3: 83 f8 02 cmp $0x2,%eax -c01095d6: 74 08 je c01095e0 - next = idleproc; -c01095d8: a1 20 c0 12 c0 mov 0xc012c020,%eax -c01095dd: 89 45 f0 mov %eax,-0x10(%ebp) - } - next->runs ++; -c01095e0: 8b 45 f0 mov -0x10(%ebp),%eax -c01095e3: 8b 40 08 mov 0x8(%eax),%eax -c01095e6: 8d 50 01 lea 0x1(%eax),%edx -c01095e9: 8b 45 f0 mov -0x10(%ebp),%eax -c01095ec: 89 50 08 mov %edx,0x8(%eax) - if (next != current) { -c01095ef: a1 28 c0 12 c0 mov 0xc012c028,%eax -c01095f4: 39 45 f0 cmp %eax,-0x10(%ebp) -c01095f7: 74 0b je c0109604 - proc_run(next); -c01095f9: 8b 45 f0 mov -0x10(%ebp),%eax -c01095fc: 89 04 24 mov %eax,(%esp) -c01095ff: e8 53 f7 ff ff call c0108d57 - } - } - local_intr_restore(intr_flag); -c0109604: 8b 45 ec mov -0x14(%ebp),%eax -c0109607: 89 04 24 mov %eax,(%esp) -c010960a: e8 d5 fe ff ff call c01094e4 <__intr_restore> -} -c010960f: 90 nop -c0109610: c9 leave -c0109611: c3 ret - -c0109612 : - * @s: the input string - * - * The strlen() function returns the length of string @s. - * */ -size_t -strlen(const char *s) { -c0109612: f3 0f 1e fb endbr32 -c0109616: 55 push %ebp -c0109617: 89 e5 mov %esp,%ebp -c0109619: 83 ec 10 sub $0x10,%esp - size_t cnt = 0; -c010961c: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) - while (*s ++ != '\0') { -c0109623: eb 03 jmp c0109628 - cnt ++; -c0109625: ff 45 fc incl -0x4(%ebp) - while (*s ++ != '\0') { -c0109628: 8b 45 08 mov 0x8(%ebp),%eax -c010962b: 8d 50 01 lea 0x1(%eax),%edx -c010962e: 89 55 08 mov %edx,0x8(%ebp) -c0109631: 0f b6 00 movzbl (%eax),%eax -c0109634: 84 c0 test %al,%al -c0109636: 75 ed jne c0109625 - } - return cnt; -c0109638: 8b 45 fc mov -0x4(%ebp),%eax -} -c010963b: c9 leave -c010963c: c3 ret - -c010963d : - * The return value is strlen(s), if that is less than @len, or - * @len if there is no '\0' character among the first @len characters - * pointed by @s. - * */ -size_t -strnlen(const char *s, size_t len) { -c010963d: f3 0f 1e fb endbr32 -c0109641: 55 push %ebp -c0109642: 89 e5 mov %esp,%ebp -c0109644: 83 ec 10 sub $0x10,%esp - size_t cnt = 0; -c0109647: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) - while (cnt < len && *s ++ != '\0') { -c010964e: eb 03 jmp c0109653 - cnt ++; -c0109650: ff 45 fc incl -0x4(%ebp) - while (cnt < len && *s ++ != '\0') { -c0109653: 8b 45 fc mov -0x4(%ebp),%eax -c0109656: 3b 45 0c cmp 0xc(%ebp),%eax -c0109659: 73 10 jae c010966b -c010965b: 8b 45 08 mov 0x8(%ebp),%eax -c010965e: 8d 50 01 lea 0x1(%eax),%edx -c0109661: 89 55 08 mov %edx,0x8(%ebp) -c0109664: 0f b6 00 movzbl (%eax),%eax -c0109667: 84 c0 test %al,%al -c0109669: 75 e5 jne c0109650 - } - return cnt; -c010966b: 8b 45 fc mov -0x4(%ebp),%eax -} -c010966e: c9 leave -c010966f: c3 ret - -c0109670 : - * To avoid overflows, the size of array pointed by @dst should be long enough to - * contain the same string as @src (including the terminating null character), and - * should not overlap in memory with @src. - * */ -char * -strcpy(char *dst, const char *src) { -c0109670: f3 0f 1e fb endbr32 -c0109674: 55 push %ebp -c0109675: 89 e5 mov %esp,%ebp -c0109677: 57 push %edi -c0109678: 56 push %esi -c0109679: 83 ec 20 sub $0x20,%esp -c010967c: 8b 45 08 mov 0x8(%ebp),%eax -c010967f: 89 45 f4 mov %eax,-0xc(%ebp) -c0109682: 8b 45 0c mov 0xc(%ebp),%eax -c0109685: 89 45 f0 mov %eax,-0x10(%ebp) -#ifndef __HAVE_ARCH_STRCPY -#define __HAVE_ARCH_STRCPY -static inline char * -__strcpy(char *dst, const char *src) { - int d0, d1, d2; - asm volatile ( -c0109688: 8b 55 f0 mov -0x10(%ebp),%edx -c010968b: 8b 45 f4 mov -0xc(%ebp),%eax -c010968e: 89 d1 mov %edx,%ecx -c0109690: 89 c2 mov %eax,%edx -c0109692: 89 ce mov %ecx,%esi -c0109694: 89 d7 mov %edx,%edi -c0109696: ac lods %ds:(%esi),%al -c0109697: aa stos %al,%es:(%edi) -c0109698: 84 c0 test %al,%al -c010969a: 75 fa jne c0109696 -c010969c: 89 fa mov %edi,%edx -c010969e: 89 f1 mov %esi,%ecx -c01096a0: 89 4d ec mov %ecx,-0x14(%ebp) -c01096a3: 89 55 e8 mov %edx,-0x18(%ebp) -c01096a6: 89 45 e4 mov %eax,-0x1c(%ebp) - "stosb;" - "testb %%al, %%al;" - "jne 1b;" - : "=&S" (d0), "=&D" (d1), "=&a" (d2) - : "0" (src), "1" (dst) : "memory"); - return dst; -c01096a9: 8b 45 f4 mov -0xc(%ebp),%eax - char *p = dst; - while ((*p ++ = *src ++) != '\0') - /* nothing */; - return dst; -#endif /* __HAVE_ARCH_STRCPY */ -} -c01096ac: 83 c4 20 add $0x20,%esp -c01096af: 5e pop %esi -c01096b0: 5f pop %edi -c01096b1: 5d pop %ebp -c01096b2: c3 ret - -c01096b3 : - * @len: maximum number of characters to be copied from @src - * - * The return value is @dst - * */ -char * -strncpy(char *dst, const char *src, size_t len) { -c01096b3: f3 0f 1e fb endbr32 -c01096b7: 55 push %ebp -c01096b8: 89 e5 mov %esp,%ebp -c01096ba: 83 ec 10 sub $0x10,%esp - char *p = dst; -c01096bd: 8b 45 08 mov 0x8(%ebp),%eax -c01096c0: 89 45 fc mov %eax,-0x4(%ebp) - while (len > 0) { -c01096c3: eb 1e jmp c01096e3 - if ((*p = *src) != '\0') { -c01096c5: 8b 45 0c mov 0xc(%ebp),%eax -c01096c8: 0f b6 10 movzbl (%eax),%edx -c01096cb: 8b 45 fc mov -0x4(%ebp),%eax -c01096ce: 88 10 mov %dl,(%eax) -c01096d0: 8b 45 fc mov -0x4(%ebp),%eax -c01096d3: 0f b6 00 movzbl (%eax),%eax -c01096d6: 84 c0 test %al,%al -c01096d8: 74 03 je c01096dd - src ++; -c01096da: ff 45 0c incl 0xc(%ebp) - } - p ++, len --; -c01096dd: ff 45 fc incl -0x4(%ebp) -c01096e0: ff 4d 10 decl 0x10(%ebp) - while (len > 0) { -c01096e3: 83 7d 10 00 cmpl $0x0,0x10(%ebp) -c01096e7: 75 dc jne c01096c5 - } - return dst; -c01096e9: 8b 45 08 mov 0x8(%ebp),%eax -} -c01096ec: c9 leave -c01096ed: c3 ret - -c01096ee : - * - A value greater than zero indicates that the first character that does - * not match has a greater value in @s1 than in @s2; - * - And a value less than zero indicates the opposite. - * */ -int -strcmp(const char *s1, const char *s2) { -c01096ee: f3 0f 1e fb endbr32 -c01096f2: 55 push %ebp -c01096f3: 89 e5 mov %esp,%ebp -c01096f5: 57 push %edi -c01096f6: 56 push %esi -c01096f7: 83 ec 20 sub $0x20,%esp -c01096fa: 8b 45 08 mov 0x8(%ebp),%eax -c01096fd: 89 45 f4 mov %eax,-0xc(%ebp) -c0109700: 8b 45 0c mov 0xc(%ebp),%eax -c0109703: 89 45 f0 mov %eax,-0x10(%ebp) - asm volatile ( -c0109706: 8b 55 f4 mov -0xc(%ebp),%edx -c0109709: 8b 45 f0 mov -0x10(%ebp),%eax -c010970c: 89 d1 mov %edx,%ecx -c010970e: 89 c2 mov %eax,%edx -c0109710: 89 ce mov %ecx,%esi -c0109712: 89 d7 mov %edx,%edi -c0109714: ac lods %ds:(%esi),%al -c0109715: ae scas %es:(%edi),%al -c0109716: 75 08 jne c0109720 -c0109718: 84 c0 test %al,%al -c010971a: 75 f8 jne c0109714 -c010971c: 31 c0 xor %eax,%eax -c010971e: eb 04 jmp c0109724 -c0109720: 19 c0 sbb %eax,%eax -c0109722: 0c 01 or $0x1,%al -c0109724: 89 fa mov %edi,%edx -c0109726: 89 f1 mov %esi,%ecx -c0109728: 89 45 ec mov %eax,-0x14(%ebp) -c010972b: 89 4d e8 mov %ecx,-0x18(%ebp) -c010972e: 89 55 e4 mov %edx,-0x1c(%ebp) - return ret; -c0109731: 8b 45 ec mov -0x14(%ebp),%eax - while (*s1 != '\0' && *s1 == *s2) { - s1 ++, s2 ++; - } - return (int)((unsigned char)*s1 - (unsigned char)*s2); -#endif /* __HAVE_ARCH_STRCMP */ -} -c0109734: 83 c4 20 add $0x20,%esp -c0109737: 5e pop %esi -c0109738: 5f pop %edi -c0109739: 5d pop %ebp -c010973a: c3 ret - -c010973b : - * they are equal to each other, it continues with the following pairs until - * the characters differ, until a terminating null-character is reached, or - * until @n characters match in both strings, whichever happens first. - * */ -int -strncmp(const char *s1, const char *s2, size_t n) { -c010973b: f3 0f 1e fb endbr32 -c010973f: 55 push %ebp -c0109740: 89 e5 mov %esp,%ebp - while (n > 0 && *s1 != '\0' && *s1 == *s2) { -c0109742: eb 09 jmp c010974d - n --, s1 ++, s2 ++; -c0109744: ff 4d 10 decl 0x10(%ebp) -c0109747: ff 45 08 incl 0x8(%ebp) -c010974a: ff 45 0c incl 0xc(%ebp) - while (n > 0 && *s1 != '\0' && *s1 == *s2) { -c010974d: 83 7d 10 00 cmpl $0x0,0x10(%ebp) -c0109751: 74 1a je c010976d -c0109753: 8b 45 08 mov 0x8(%ebp),%eax -c0109756: 0f b6 00 movzbl (%eax),%eax -c0109759: 84 c0 test %al,%al -c010975b: 74 10 je c010976d -c010975d: 8b 45 08 mov 0x8(%ebp),%eax -c0109760: 0f b6 10 movzbl (%eax),%edx -c0109763: 8b 45 0c mov 0xc(%ebp),%eax -c0109766: 0f b6 00 movzbl (%eax),%eax -c0109769: 38 c2 cmp %al,%dl -c010976b: 74 d7 je c0109744 - } - return (n == 0) ? 0 : (int)((unsigned char)*s1 - (unsigned char)*s2); -c010976d: 83 7d 10 00 cmpl $0x0,0x10(%ebp) -c0109771: 74 18 je c010978b -c0109773: 8b 45 08 mov 0x8(%ebp),%eax -c0109776: 0f b6 00 movzbl (%eax),%eax -c0109779: 0f b6 d0 movzbl %al,%edx -c010977c: 8b 45 0c mov 0xc(%ebp),%eax -c010977f: 0f b6 00 movzbl (%eax),%eax -c0109782: 0f b6 c0 movzbl %al,%eax -c0109785: 29 c2 sub %eax,%edx -c0109787: 89 d0 mov %edx,%eax -c0109789: eb 05 jmp c0109790 -c010978b: b8 00 00 00 00 mov $0x0,%eax -} -c0109790: 5d pop %ebp -c0109791: c3 ret - -c0109792 : - * - * The strchr() function returns a pointer to the first occurrence of - * character in @s. If the value is not found, the function returns 'NULL'. - * */ -char * -strchr(const char *s, char c) { -c0109792: f3 0f 1e fb endbr32 -c0109796: 55 push %ebp -c0109797: 89 e5 mov %esp,%ebp -c0109799: 83 ec 04 sub $0x4,%esp -c010979c: 8b 45 0c mov 0xc(%ebp),%eax -c010979f: 88 45 fc mov %al,-0x4(%ebp) - while (*s != '\0') { -c01097a2: eb 13 jmp c01097b7 - if (*s == c) { -c01097a4: 8b 45 08 mov 0x8(%ebp),%eax -c01097a7: 0f b6 00 movzbl (%eax),%eax -c01097aa: 38 45 fc cmp %al,-0x4(%ebp) -c01097ad: 75 05 jne c01097b4 - return (char *)s; -c01097af: 8b 45 08 mov 0x8(%ebp),%eax -c01097b2: eb 12 jmp c01097c6 - } - s ++; -c01097b4: ff 45 08 incl 0x8(%ebp) - while (*s != '\0') { -c01097b7: 8b 45 08 mov 0x8(%ebp),%eax -c01097ba: 0f b6 00 movzbl (%eax),%eax -c01097bd: 84 c0 test %al,%al -c01097bf: 75 e3 jne c01097a4 - } - return NULL; -c01097c1: b8 00 00 00 00 mov $0x0,%eax + put_kstack(proc); +c0109045: 8b 45 f0 mov -0x10(%ebp),%eax +c0109048: 89 04 24 mov %eax,(%esp) +c010904b: e8 69 fd ff ff call c0108db9 +c0109050: eb 01 jmp c0109053 + goto bad_fork_cleanup_proc; +c0109052: 90 nop +bad_fork_cleanup_proc: + kfree(proc); +c0109053: 8b 45 f0 mov -0x10(%ebp),%eax +c0109056: 89 04 24 mov %eax,(%esp) +c0109059: e8 09 bb ff ff call c0104b67 + goto fork_out; +c010905e: eb df jmp c010903f } -c01097c6: c9 leave -c01097c7: c3 ret +c0109060: 89 ec mov %ebp,%esp +c0109062: 5d pop %ebp +c0109063: c3 ret -c01097c8 : - * The strfind() function is like strchr() except that if @c is - * not found in @s, then it returns a pointer to the null byte at the - * end of @s, rather than 'NULL'. - * */ -char * -strfind(const char *s, char c) { -c01097c8: f3 0f 1e fb endbr32 -c01097cc: 55 push %ebp -c01097cd: 89 e5 mov %esp,%ebp -c01097cf: 83 ec 04 sub $0x4,%esp -c01097d2: 8b 45 0c mov 0xc(%ebp),%eax -c01097d5: 88 45 fc mov %al,-0x4(%ebp) - while (*s != '\0') { -c01097d8: eb 0e jmp c01097e8 - if (*s == c) { -c01097da: 8b 45 08 mov 0x8(%ebp),%eax -c01097dd: 0f b6 00 movzbl (%eax),%eax -c01097e0: 38 45 fc cmp %al,-0x4(%ebp) -c01097e3: 74 0f je c01097f4 - break; - } - s ++; -c01097e5: ff 45 08 incl 0x8(%ebp) - while (*s != '\0') { -c01097e8: 8b 45 08 mov 0x8(%ebp),%eax -c01097eb: 0f b6 00 movzbl (%eax),%eax -c01097ee: 84 c0 test %al,%al -c01097f0: 75 e8 jne c01097da -c01097f2: eb 01 jmp c01097f5 - break; -c01097f4: 90 nop - } - return (char *)s; -c01097f5: 8b 45 08 mov 0x8(%ebp),%eax +c0109064 : +// do_exit - called by sys_exit +// 1. call exit_mmap & put_pgdir & mm_destroy to free the almost all memory space of process +// 2. set process' state as PROC_ZOMBIE, then call wakeup_proc(parent) to ask parent reclaim itself. +// 3. call scheduler to switch to other process +int +do_exit(int error_code) { +c0109064: 55 push %ebp +c0109065: 89 e5 mov %esp,%ebp +c0109067: 83 ec 18 sub $0x18,%esp + panic("process exit!!.\n"); +c010906a: c7 44 24 08 55 c0 10 movl $0xc010c055,0x8(%esp) +c0109071: c0 +c0109072: c7 44 24 04 dd 01 00 movl $0x1dd,0x4(%esp) +c0109079: 00 +c010907a: c7 04 24 41 c0 10 c0 movl $0xc010c041,(%esp) +c0109081: e8 bf 7b ff ff call c0100c45 <__panic> + +c0109086 : + * 和初始化参数的内容它不进行任何错误处理或复杂逻辑,主要是为了演示和调试目的 + * + * @return 返回0,表示初始化成功没有返回值表示失败,因为这是一个特殊的初始化进程 + */ +static int +init_main(void *arg) { +c0109086: 55 push %ebp +c0109087: 89 e5 mov %esp,%ebp +c0109089: 83 ec 18 sub $0x18,%esp + // 打印当前进程的pid和名称,用于调试和信息展示 + cprintf("this initproc, pid = %d, name = \"%s\"\n", current->pid, get_proc_name(current)); +c010908c: a1 90 c1 12 c0 mov 0xc012c190,%eax +c0109091: 89 04 24 mov %eax,(%esp) +c0109094: e8 a6 f9 ff ff call c0108a3f +c0109099: 8b 15 90 c1 12 c0 mov 0xc012c190,%edx +c010909f: 8b 52 04 mov 0x4(%edx),%edx +c01090a2: 89 44 24 08 mov %eax,0x8(%esp) +c01090a6: 89 54 24 04 mov %edx,0x4(%esp) +c01090aa: c7 04 24 68 c0 10 c0 movl $0xc010c068,(%esp) +c01090b1: e8 c2 72 ff ff call c0100378 + + // 打印传递给初始化进程的参数,这里假设参数是一个字符串 + cprintf("To U: \"%s\".\n", (const char *)arg); +c01090b6: 8b 45 08 mov 0x8(%ebp),%eax +c01090b9: 89 44 24 04 mov %eax,0x4(%esp) +c01090bd: c7 04 24 8e c0 10 c0 movl $0xc010c08e,(%esp) +c01090c4: e8 af 72 ff ff call c0100378 + + // 打印固定的告别信息,表示初始化进程即将结束 + cprintf("To U: \"en.., Bye, Bye. :)\"\n"); +c01090c9: c7 04 24 9b c0 10 c0 movl $0xc010c09b,(%esp) +c01090d0: e8 a3 72 ff ff call c0100378 + return 0; +c01090d5: b8 00 00 00 00 mov $0x0,%eax } -c01097f8: c9 leave -c01097f9: c3 ret +c01090da: 89 ec mov %ebp,%esp +c01090dc: 5d pop %ebp +c01090dd: c3 ret -c01097fa : - * an optional "0x" or "0X" prefix. - * - * The strtol() function returns the converted integral number as a long int value. - * */ -long -strtol(const char *s, char **endptr, int base) { -c01097fa: f3 0f 1e fb endbr32 -c01097fe: 55 push %ebp -c01097ff: 89 e5 mov %esp,%ebp -c0109801: 83 ec 10 sub $0x10,%esp - int neg = 0; -c0109804: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) - long val = 0; -c010980b: c7 45 f8 00 00 00 00 movl $0x0,-0x8(%ebp) +c01090de : +/** + * proc_init函数是进程管理初始化的核心函数。 + * 它负责初始化进程列表、哈希表、空闲进程、以及创建初始化进程。 + */ +void +proc_init(void) { +c01090de: 55 push %ebp +c01090df: 89 e5 mov %esp,%ebp +c01090e1: 83 ec 28 sub $0x28,%esp +c01090e4: c7 45 ec 80 c1 12 c0 movl $0xc012c180,-0x14(%ebp) + elm->prev = elm->next = elm; +c01090eb: 8b 45 ec mov -0x14(%ebp),%eax +c01090ee: 8b 55 ec mov -0x14(%ebp),%edx +c01090f1: 89 50 04 mov %edx,0x4(%eax) +c01090f4: 8b 45 ec mov -0x14(%ebp),%eax +c01090f7: 8b 50 04 mov 0x4(%eax),%edx +c01090fa: 8b 45 ec mov -0x14(%ebp),%eax +c01090fd: 89 10 mov %edx,(%eax) +} +c01090ff: 90 nop - // gobble initial whitespace - while (*s == ' ' || *s == '\t') { -c0109812: eb 03 jmp c0109817 - s ++; -c0109814: ff 45 08 incl 0x8(%ebp) - while (*s == ' ' || *s == '\t') { -c0109817: 8b 45 08 mov 0x8(%ebp),%eax -c010981a: 0f b6 00 movzbl (%eax),%eax -c010981d: 3c 20 cmp $0x20,%al -c010981f: 74 f3 je c0109814 -c0109821: 8b 45 08 mov 0x8(%ebp),%eax -c0109824: 0f b6 00 movzbl (%eax),%eax -c0109827: 3c 09 cmp $0x9,%al -c0109829: 74 e9 je c0109814 - } + // 初始化全局进程列表 + list_init(&proc_list); - // plus/minus sign - if (*s == '+') { -c010982b: 8b 45 08 mov 0x8(%ebp),%eax -c010982e: 0f b6 00 movzbl (%eax),%eax -c0109831: 3c 2b cmp $0x2b,%al -c0109833: 75 05 jne c010983a - s ++; -c0109835: ff 45 08 incl 0x8(%ebp) -c0109838: eb 14 jmp c010984e - } - else if (*s == '-') { -c010983a: 8b 45 08 mov 0x8(%ebp),%eax -c010983d: 0f b6 00 movzbl (%eax),%eax -c0109840: 3c 2d cmp $0x2d,%al -c0109842: 75 0a jne c010984e - s ++, neg = 1; -c0109844: ff 45 08 incl 0x8(%ebp) -c0109847: c7 45 fc 01 00 00 00 movl $0x1,-0x4(%ebp) + // 初始化哈希列表,用于快速查找进程 + for (i = 0; i < HASH_LIST_SIZE; i ++) { +c0109100: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) +c0109107: eb 26 jmp c010912f + list_init(hash_list + i); +c0109109: 8b 45 f4 mov -0xc(%ebp),%eax +c010910c: c1 e0 03 shl $0x3,%eax +c010910f: 05 a0 c1 12 c0 add $0xc012c1a0,%eax +c0109114: 89 45 e8 mov %eax,-0x18(%ebp) + elm->prev = elm->next = elm; +c0109117: 8b 45 e8 mov -0x18(%ebp),%eax +c010911a: 8b 55 e8 mov -0x18(%ebp),%edx +c010911d: 89 50 04 mov %edx,0x4(%eax) +c0109120: 8b 45 e8 mov -0x18(%ebp),%eax +c0109123: 8b 50 04 mov 0x4(%eax),%edx +c0109126: 8b 45 e8 mov -0x18(%ebp),%eax +c0109129: 89 10 mov %edx,(%eax) +} +c010912b: 90 nop + for (i = 0; i < HASH_LIST_SIZE; i ++) { +c010912c: ff 45 f4 incl -0xc(%ebp) +c010912f: 81 7d f4 ff 03 00 00 cmpl $0x3ff,-0xc(%ebp) +c0109136: 7e d1 jle c0109109 } - // hex or octal base prefix - if ((base == 0 || base == 16) && (s[0] == '0' && s[1] == 'x')) { -c010984e: 83 7d 10 00 cmpl $0x0,0x10(%ebp) -c0109852: 74 06 je c010985a -c0109854: 83 7d 10 10 cmpl $0x10,0x10(%ebp) -c0109858: 75 22 jne c010987c -c010985a: 8b 45 08 mov 0x8(%ebp),%eax -c010985d: 0f b6 00 movzbl (%eax),%eax -c0109860: 3c 30 cmp $0x30,%al -c0109862: 75 18 jne c010987c -c0109864: 8b 45 08 mov 0x8(%ebp),%eax -c0109867: 40 inc %eax -c0109868: 0f b6 00 movzbl (%eax),%eax -c010986b: 3c 78 cmp $0x78,%al -c010986d: 75 0d jne c010987c - s += 2, base = 16; -c010986f: 83 45 08 02 addl $0x2,0x8(%ebp) -c0109873: c7 45 10 10 00 00 00 movl $0x10,0x10(%ebp) -c010987a: eb 29 jmp c01098a5 + // 分配空闲进程idleproc,这是系统中的第一个进程 + if ((idleproc = alloc_proc()) == NULL) { +c0109138: e8 f6 f7 ff ff call c0108933 +c010913d: a3 88 c1 12 c0 mov %eax,0xc012c188 +c0109142: a1 88 c1 12 c0 mov 0xc012c188,%eax +c0109147: 85 c0 test %eax,%eax +c0109149: 75 1c jne c0109167 + panic("cannot alloc idleproc.\n"); +c010914b: c7 44 24 08 b7 c0 10 movl $0xc010c0b7,0x8(%esp) +c0109152: c0 +c0109153: c7 44 24 04 0c 02 00 movl $0x20c,0x4(%esp) +c010915a: 00 +c010915b: c7 04 24 41 c0 10 c0 movl $0xc010c041,(%esp) +c0109162: e8 de 7a ff ff call c0100c45 <__panic> } - else if (base == 0 && s[0] == '0') { -c010987c: 83 7d 10 00 cmpl $0x0,0x10(%ebp) -c0109880: 75 16 jne c0109898 -c0109882: 8b 45 08 mov 0x8(%ebp),%eax -c0109885: 0f b6 00 movzbl (%eax),%eax -c0109888: 3c 30 cmp $0x30,%al -c010988a: 75 0c jne c0109898 - s ++, base = 8; -c010988c: ff 45 08 incl 0x8(%ebp) -c010988f: c7 45 10 08 00 00 00 movl $0x8,0x10(%ebp) -c0109896: eb 0d jmp c01098a5 + + // 设置idleproc的基本信息 + idleproc->pid = 0; +c0109167: a1 88 c1 12 c0 mov 0xc012c188,%eax +c010916c: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax) + idleproc->state = PROC_RUNNABLE; +c0109173: a1 88 c1 12 c0 mov 0xc012c188,%eax +c0109178: c7 00 02 00 00 00 movl $0x2,(%eax) + idleproc->kstack = (uintptr_t)bootstack; +c010917e: a1 88 c1 12 c0 mov 0xc012c188,%eax +c0109183: ba 00 60 12 c0 mov $0xc0126000,%edx +c0109188: 89 50 0c mov %edx,0xc(%eax) + idleproc->need_resched = 1; +c010918b: a1 88 c1 12 c0 mov 0xc012c188,%eax +c0109190: c7 40 10 01 00 00 00 movl $0x1,0x10(%eax) + set_proc_name(idleproc, "idle"); +c0109197: a1 88 c1 12 c0 mov 0xc012c188,%eax +c010919c: c7 44 24 04 cf c0 10 movl $0xc010c0cf,0x4(%esp) +c01091a3: c0 +c01091a4: 89 04 24 mov %eax,(%esp) +c01091a7: e8 4e f8 ff ff call c01089fa + nr_process ++; +c01091ac: a1 a0 e1 12 c0 mov 0xc012e1a0,%eax +c01091b1: 40 inc %eax +c01091b2: a3 a0 e1 12 c0 mov %eax,0xc012e1a0 + + // 将当前进程设置为idleproc + current = idleproc; +c01091b7: a1 88 c1 12 c0 mov 0xc012c188,%eax +c01091bc: a3 90 c1 12 c0 mov %eax,0xc012c190 + + // 创建初始化进程init_main,这是系统中的第二个进程 + int pid = kernel_thread(init_main, "Hello world!!", 0); +c01091c1: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) +c01091c8: 00 +c01091c9: c7 44 24 04 d4 c0 10 movl $0xc010c0d4,0x4(%esp) +c01091d0: c0 +c01091d1: c7 04 24 86 90 10 c0 movl $0xc0109086,(%esp) +c01091d8: e8 28 fb ff ff call c0108d05 +c01091dd: 89 45 f0 mov %eax,-0x10(%ebp) + if (pid <= 0) { +c01091e0: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) +c01091e4: 7f 1c jg c0109202 + panic("create init_main failed.\n"); +c01091e6: c7 44 24 08 e2 c0 10 movl $0xc010c0e2,0x8(%esp) +c01091ed: c0 +c01091ee: c7 44 24 04 1d 02 00 movl $0x21d,0x4(%esp) +c01091f5: 00 +c01091f6: c7 04 24 41 c0 10 c0 movl $0xc010c041,(%esp) +c01091fd: e8 43 7a ff ff call c0100c45 <__panic> } - else if (base == 0) { -c0109898: 83 7d 10 00 cmpl $0x0,0x10(%ebp) -c010989c: 75 07 jne c01098a5 - base = 10; -c010989e: c7 45 10 0a 00 00 00 movl $0xa,0x10(%ebp) - // digits - while (1) { - int dig; + // 查找并设置初始化进程initproc + initproc = find_proc(pid); +c0109202: 8b 45 f0 mov -0x10(%ebp),%eax +c0109205: 89 04 24 mov %eax,(%esp) +c0109208: e8 84 fa ff ff call c0108c91 +c010920d: a3 8c c1 12 c0 mov %eax,0xc012c18c + set_proc_name(initproc, "init"); +c0109212: a1 8c c1 12 c0 mov 0xc012c18c,%eax +c0109217: c7 44 24 04 fc c0 10 movl $0xc010c0fc,0x4(%esp) +c010921e: c0 +c010921f: 89 04 24 mov %eax,(%esp) +c0109222: e8 d3 f7 ff ff call c01089fa - if (*s >= '0' && *s <= '9') { -c01098a5: 8b 45 08 mov 0x8(%ebp),%eax -c01098a8: 0f b6 00 movzbl (%eax),%eax -c01098ab: 3c 2f cmp $0x2f,%al -c01098ad: 7e 1b jle c01098ca -c01098af: 8b 45 08 mov 0x8(%ebp),%eax -c01098b2: 0f b6 00 movzbl (%eax),%eax -c01098b5: 3c 39 cmp $0x39,%al -c01098b7: 7f 11 jg c01098ca - dig = *s - '0'; -c01098b9: 8b 45 08 mov 0x8(%ebp),%eax -c01098bc: 0f b6 00 movzbl (%eax),%eax -c01098bf: 0f be c0 movsbl %al,%eax -c01098c2: 83 e8 30 sub $0x30,%eax -c01098c5: 89 45 f4 mov %eax,-0xc(%ebp) -c01098c8: eb 48 jmp c0109912 - } - else if (*s >= 'a' && *s <= 'z') { -c01098ca: 8b 45 08 mov 0x8(%ebp),%eax -c01098cd: 0f b6 00 movzbl (%eax),%eax -c01098d0: 3c 60 cmp $0x60,%al -c01098d2: 7e 1b jle c01098ef -c01098d4: 8b 45 08 mov 0x8(%ebp),%eax -c01098d7: 0f b6 00 movzbl (%eax),%eax -c01098da: 3c 7a cmp $0x7a,%al -c01098dc: 7f 11 jg c01098ef - dig = *s - 'a' + 10; -c01098de: 8b 45 08 mov 0x8(%ebp),%eax -c01098e1: 0f b6 00 movzbl (%eax),%eax -c01098e4: 0f be c0 movsbl %al,%eax -c01098e7: 83 e8 57 sub $0x57,%eax -c01098ea: 89 45 f4 mov %eax,-0xc(%ebp) -c01098ed: eb 23 jmp c0109912 - } - else if (*s >= 'A' && *s <= 'Z') { -c01098ef: 8b 45 08 mov 0x8(%ebp),%eax -c01098f2: 0f b6 00 movzbl (%eax),%eax -c01098f5: 3c 40 cmp $0x40,%al -c01098f7: 7e 3b jle c0109934 -c01098f9: 8b 45 08 mov 0x8(%ebp),%eax -c01098fc: 0f b6 00 movzbl (%eax),%eax -c01098ff: 3c 5a cmp $0x5a,%al -c0109901: 7f 31 jg c0109934 - dig = *s - 'A' + 10; -c0109903: 8b 45 08 mov 0x8(%ebp),%eax -c0109906: 0f b6 00 movzbl (%eax),%eax -c0109909: 0f be c0 movsbl %al,%eax -c010990c: 83 e8 37 sub $0x37,%eax -c010990f: 89 45 f4 mov %eax,-0xc(%ebp) - } - else { - break; - } - if (dig >= base) { -c0109912: 8b 45 f4 mov -0xc(%ebp),%eax -c0109915: 3b 45 10 cmp 0x10(%ebp),%eax -c0109918: 7d 19 jge c0109933 - break; - } - s ++, val = (val * base) + dig; -c010991a: ff 45 08 incl 0x8(%ebp) -c010991d: 8b 45 f8 mov -0x8(%ebp),%eax -c0109920: 0f af 45 10 imul 0x10(%ebp),%eax -c0109924: 89 c2 mov %eax,%edx -c0109926: 8b 45 f4 mov -0xc(%ebp),%eax -c0109929: 01 d0 add %edx,%eax -c010992b: 89 45 f8 mov %eax,-0x8(%ebp) + // 断言确保idleproc和initproc正确初始化 + assert(idleproc != NULL && idleproc->pid == 0); +c0109227: a1 88 c1 12 c0 mov 0xc012c188,%eax +c010922c: 85 c0 test %eax,%eax +c010922e: 74 0c je c010923c +c0109230: a1 88 c1 12 c0 mov 0xc012c188,%eax +c0109235: 8b 40 04 mov 0x4(%eax),%eax +c0109238: 85 c0 test %eax,%eax +c010923a: 74 24 je c0109260 +c010923c: c7 44 24 0c 04 c1 10 movl $0xc010c104,0xc(%esp) +c0109243: c0 +c0109244: c7 44 24 08 2c c0 10 movl $0xc010c02c,0x8(%esp) +c010924b: c0 +c010924c: c7 44 24 04 25 02 00 movl $0x225,0x4(%esp) +c0109253: 00 +c0109254: c7 04 24 41 c0 10 c0 movl $0xc010c041,(%esp) +c010925b: e8 e5 79 ff ff call c0100c45 <__panic> + assert(initproc != NULL && initproc->pid == 1); +c0109260: a1 8c c1 12 c0 mov 0xc012c18c,%eax +c0109265: 85 c0 test %eax,%eax +c0109267: 74 0d je c0109276 +c0109269: a1 8c c1 12 c0 mov 0xc012c18c,%eax +c010926e: 8b 40 04 mov 0x4(%eax),%eax +c0109271: 83 f8 01 cmp $0x1,%eax +c0109274: 74 24 je c010929a +c0109276: c7 44 24 0c 2c c1 10 movl $0xc010c12c,0xc(%esp) +c010927d: c0 +c010927e: c7 44 24 08 2c c0 10 movl $0xc010c02c,0x8(%esp) +c0109285: c0 +c0109286: c7 44 24 04 26 02 00 movl $0x226,0x4(%esp) +c010928d: 00 +c010928e: c7 04 24 41 c0 10 c0 movl $0xc010c041,(%esp) +c0109295: e8 ab 79 ff ff call c0100c45 <__panic> +} +c010929a: 90 nop +c010929b: 89 ec mov %ebp,%esp +c010929d: 5d pop %ebp +c010929e: c3 ret + +c010929f : + +// cpu_idle - at the end of kern_init, the first kernel thread idleproc will do below works +void +cpu_idle(void) { +c010929f: 55 push %ebp +c01092a0: 89 e5 mov %esp,%ebp +c01092a2: 83 ec 08 sub $0x8,%esp while (1) { -c010992e: e9 72 ff ff ff jmp c01098a5 - break; -c0109933: 90 nop - // we don't properly detect overflow! - } + //检查当前进程是否需要重新调度 + if (current->need_resched) { +c01092a5: a1 90 c1 12 c0 mov 0xc012c190,%eax +c01092aa: 8b 40 10 mov 0x10(%eax),%eax +c01092ad: 85 c0 test %eax,%eax +c01092af: 74 f4 je c01092a5 + schedule(); +c01092b1: e8 c7 00 00 00 call c010937d + if (current->need_resched) { +c01092b6: eb ed jmp c01092a5 - if (endptr) { -c0109934: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) -c0109938: 74 08 je c0109942 - *endptr = (char *) s; -c010993a: 8b 45 0c mov 0xc(%ebp),%eax -c010993d: 8b 55 08 mov 0x8(%ebp),%edx -c0109940: 89 10 mov %edx,(%eax) - } - return (neg ? -val : val); -c0109942: 83 7d fc 00 cmpl $0x0,-0x4(%ebp) -c0109946: 74 07 je c010994f -c0109948: 8b 45 f8 mov -0x8(%ebp),%eax -c010994b: f7 d8 neg %eax -c010994d: eb 03 jmp c0109952 -c010994f: 8b 45 f8 mov -0x8(%ebp),%eax -} -c0109952: c9 leave -c0109953: c3 ret +c01092b8 : +.text +.globl switch_to +switch_to: # switch_to(from, to) -c0109954 : - * @n: number of bytes to be set to the value - * - * The memset() function returns @s. - * */ -void * -memset(void *s, char c, size_t n) { -c0109954: f3 0f 1e fb endbr32 -c0109958: 55 push %ebp -c0109959: 89 e5 mov %esp,%ebp -c010995b: 57 push %edi -c010995c: 83 ec 24 sub $0x24,%esp -c010995f: 8b 45 0c mov 0xc(%ebp),%eax -c0109962: 88 45 d8 mov %al,-0x28(%ebp) -#ifdef __HAVE_ARCH_MEMSET - return __memset(s, c, n); -c0109965: 0f be 55 d8 movsbl -0x28(%ebp),%edx -c0109969: 8b 45 08 mov 0x8(%ebp),%eax -c010996c: 89 45 f8 mov %eax,-0x8(%ebp) -c010996f: 88 55 f7 mov %dl,-0x9(%ebp) -c0109972: 8b 45 10 mov 0x10(%ebp),%eax -c0109975: 89 45 f0 mov %eax,-0x10(%ebp) -#ifndef __HAVE_ARCH_MEMSET -#define __HAVE_ARCH_MEMSET -static inline void * -__memset(void *s, char c, size_t n) { - int d0, d1; - asm volatile ( -c0109978: 8b 4d f0 mov -0x10(%ebp),%ecx -c010997b: 0f b6 45 f7 movzbl -0x9(%ebp),%eax -c010997f: 8b 55 f8 mov -0x8(%ebp),%edx -c0109982: 89 d7 mov %edx,%edi -c0109984: f3 aa rep stos %al,%es:(%edi) -c0109986: 89 fa mov %edi,%edx -c0109988: 89 4d ec mov %ecx,-0x14(%ebp) -c010998b: 89 55 e8 mov %edx,-0x18(%ebp) - "rep; stosb;" - : "=&c" (d0), "=&D" (d1) - : "0" (n), "a" (c), "1" (s) - : "memory"); - return s; -c010998e: 8b 45 f8 mov -0x8(%ebp),%eax - while (n -- > 0) { - *p ++ = c; - } - return s; -#endif /* __HAVE_ARCH_MEMSET */ -} -c0109991: 83 c4 24 add $0x24,%esp -c0109994: 5f pop %edi -c0109995: 5d pop %ebp -c0109996: c3 ret + # save from's registers + movl 4(%esp), %eax # eax points to from +c01092b8: 8b 44 24 04 mov 0x4(%esp),%eax + popl 0(%eax) # save eip !popl +c01092bc: 8f 00 pop (%eax) + movl %esp, 4(%eax) # save esp::context of from +c01092be: 89 60 04 mov %esp,0x4(%eax) + movl %ebx, 8(%eax) # save ebx::context of from +c01092c1: 89 58 08 mov %ebx,0x8(%eax) + movl %ecx, 12(%eax) # save ecx::context of from +c01092c4: 89 48 0c mov %ecx,0xc(%eax) + movl %edx, 16(%eax) # save edx::context of from +c01092c7: 89 50 10 mov %edx,0x10(%eax) + movl %esi, 20(%eax) # save esi::context of from +c01092ca: 89 70 14 mov %esi,0x14(%eax) + movl %edi, 24(%eax) # save edi::context of from +c01092cd: 89 78 18 mov %edi,0x18(%eax) + movl %ebp, 28(%eax) # save ebp::context of from +c01092d0: 89 68 1c mov %ebp,0x1c(%eax) -c0109997 : - * @n: number of bytes to copy - * - * The memmove() function returns @dst. - * */ -void * -memmove(void *dst, const void *src, size_t n) { -c0109997: f3 0f 1e fb endbr32 -c010999b: 55 push %ebp -c010999c: 89 e5 mov %esp,%ebp -c010999e: 57 push %edi -c010999f: 56 push %esi -c01099a0: 53 push %ebx -c01099a1: 83 ec 30 sub $0x30,%esp -c01099a4: 8b 45 08 mov 0x8(%ebp),%eax -c01099a7: 89 45 f0 mov %eax,-0x10(%ebp) -c01099aa: 8b 45 0c mov 0xc(%ebp),%eax -c01099ad: 89 45 ec mov %eax,-0x14(%ebp) -c01099b0: 8b 45 10 mov 0x10(%ebp),%eax -c01099b3: 89 45 e8 mov %eax,-0x18(%ebp) + # restore to's registers + movl 4(%esp), %eax # not 8(%esp): popped return address already +c01092d3: 8b 44 24 04 mov 0x4(%esp),%eax + # eax now points to to + movl 28(%eax), %ebp # restore ebp::context of to +c01092d7: 8b 68 1c mov 0x1c(%eax),%ebp + movl 24(%eax), %edi # restore edi::context of to +c01092da: 8b 78 18 mov 0x18(%eax),%edi + movl 20(%eax), %esi # restore esi::context of to +c01092dd: 8b 70 14 mov 0x14(%eax),%esi + movl 16(%eax), %edx # restore edx::context of to +c01092e0: 8b 50 10 mov 0x10(%eax),%edx + movl 12(%eax), %ecx # restore ecx::context of to +c01092e3: 8b 48 0c mov 0xc(%eax),%ecx + movl 8(%eax), %ebx # restore ebx::context of to +c01092e6: 8b 58 08 mov 0x8(%eax),%ebx + movl 4(%eax), %esp # restore esp::context of to +c01092e9: 8b 60 04 mov 0x4(%eax),%esp -#ifndef __HAVE_ARCH_MEMMOVE -#define __HAVE_ARCH_MEMMOVE -static inline void * -__memmove(void *dst, const void *src, size_t n) { - if (dst < src) { -c01099b6: 8b 45 f0 mov -0x10(%ebp),%eax -c01099b9: 3b 45 ec cmp -0x14(%ebp),%eax -c01099bc: 73 42 jae c0109a00 -c01099be: 8b 45 f0 mov -0x10(%ebp),%eax -c01099c1: 89 45 e4 mov %eax,-0x1c(%ebp) -c01099c4: 8b 45 ec mov -0x14(%ebp),%eax -c01099c7: 89 45 e0 mov %eax,-0x20(%ebp) -c01099ca: 8b 45 e8 mov -0x18(%ebp),%eax -c01099cd: 89 45 dc mov %eax,-0x24(%ebp) - "andl $3, %%ecx;" - "jz 1f;" - "rep; movsb;" - "1:" - : "=&c" (d0), "=&D" (d1), "=&S" (d2) - : "0" (n / 4), "g" (n), "1" (dst), "2" (src) -c01099d0: 8b 45 dc mov -0x24(%ebp),%eax -c01099d3: c1 e8 02 shr $0x2,%eax -c01099d6: 89 c1 mov %eax,%ecx - asm volatile ( -c01099d8: 8b 55 e4 mov -0x1c(%ebp),%edx -c01099db: 8b 45 e0 mov -0x20(%ebp),%eax -c01099de: 89 d7 mov %edx,%edi -c01099e0: 89 c6 mov %eax,%esi -c01099e2: f3 a5 rep movsl %ds:(%esi),%es:(%edi) -c01099e4: 8b 4d dc mov -0x24(%ebp),%ecx -c01099e7: 83 e1 03 and $0x3,%ecx -c01099ea: 74 02 je c01099ee -c01099ec: f3 a4 rep movsb %ds:(%esi),%es:(%edi) -c01099ee: 89 f0 mov %esi,%eax -c01099f0: 89 fa mov %edi,%edx -c01099f2: 89 4d d8 mov %ecx,-0x28(%ebp) -c01099f5: 89 55 d4 mov %edx,-0x2c(%ebp) -c01099f8: 89 45 d0 mov %eax,-0x30(%ebp) - : "memory"); - return dst; -c01099fb: 8b 45 e4 mov -0x1c(%ebp),%eax - return __memcpy(dst, src, n); -c01099fe: eb 36 jmp c0109a36 - : "0" (n), "1" (n - 1 + src), "2" (n - 1 + dst) -c0109a00: 8b 45 e8 mov -0x18(%ebp),%eax -c0109a03: 8d 50 ff lea -0x1(%eax),%edx -c0109a06: 8b 45 ec mov -0x14(%ebp),%eax -c0109a09: 01 c2 add %eax,%edx -c0109a0b: 8b 45 e8 mov -0x18(%ebp),%eax -c0109a0e: 8d 48 ff lea -0x1(%eax),%ecx -c0109a11: 8b 45 f0 mov -0x10(%ebp),%eax -c0109a14: 8d 1c 01 lea (%ecx,%eax,1),%ebx - asm volatile ( -c0109a17: 8b 45 e8 mov -0x18(%ebp),%eax -c0109a1a: 89 c1 mov %eax,%ecx -c0109a1c: 89 d8 mov %ebx,%eax -c0109a1e: 89 d6 mov %edx,%esi -c0109a20: 89 c7 mov %eax,%edi -c0109a22: fd std -c0109a23: f3 a4 rep movsb %ds:(%esi),%es:(%edi) -c0109a25: fc cld -c0109a26: 89 f8 mov %edi,%eax -c0109a28: 89 f2 mov %esi,%edx -c0109a2a: 89 4d cc mov %ecx,-0x34(%ebp) -c0109a2d: 89 55 c8 mov %edx,-0x38(%ebp) -c0109a30: 89 45 c4 mov %eax,-0x3c(%ebp) - return dst; -c0109a33: 8b 45 f0 mov -0x10(%ebp),%eax - *d ++ = *s ++; - } - } - return dst; -#endif /* __HAVE_ARCH_MEMMOVE */ + pushl 0(%eax) # push eip +c01092ec: ff 30 push (%eax) + + ret +c01092ee: c3 ret + +c01092ef <__intr_save>: +__intr_save(void) { +c01092ef: 55 push %ebp +c01092f0: 89 e5 mov %esp,%ebp +c01092f2: 83 ec 18 sub $0x18,%esp + asm volatile ("pushfl; popl %0" : "=r" (eflags)); +c01092f5: 9c pushf +c01092f6: 58 pop %eax +c01092f7: 89 45 f4 mov %eax,-0xc(%ebp) + return eflags; +c01092fa: 8b 45 f4 mov -0xc(%ebp),%eax + if (read_eflags() & FL_IF) { +c01092fd: 25 00 02 00 00 and $0x200,%eax +c0109302: 85 c0 test %eax,%eax +c0109304: 74 0c je c0109312 <__intr_save+0x23> + intr_disable(); +c0109306: e8 f0 8b ff ff call c0101efb + return 1; +c010930b: b8 01 00 00 00 mov $0x1,%eax +c0109310: eb 05 jmp c0109317 <__intr_save+0x28> + return 0; +c0109312: b8 00 00 00 00 mov $0x0,%eax } -c0109a36: 83 c4 30 add $0x30,%esp -c0109a39: 5b pop %ebx -c0109a3a: 5e pop %esi -c0109a3b: 5f pop %edi -c0109a3c: 5d pop %ebp -c0109a3d: c3 ret +c0109317: 89 ec mov %ebp,%esp +c0109319: 5d pop %ebp +c010931a: c3 ret -c0109a3e : - * it always copies exactly @n bytes. To avoid overflows, the size of arrays pointed - * by both @src and @dst, should be at least @n bytes, and should not overlap - * (for overlapping memory area, memmove is a safer approach). - * */ -void * -memcpy(void *dst, const void *src, size_t n) { -c0109a3e: f3 0f 1e fb endbr32 -c0109a42: 55 push %ebp -c0109a43: 89 e5 mov %esp,%ebp -c0109a45: 57 push %edi -c0109a46: 56 push %esi -c0109a47: 83 ec 20 sub $0x20,%esp -c0109a4a: 8b 45 08 mov 0x8(%ebp),%eax -c0109a4d: 89 45 f4 mov %eax,-0xc(%ebp) -c0109a50: 8b 45 0c mov 0xc(%ebp),%eax -c0109a53: 89 45 f0 mov %eax,-0x10(%ebp) -c0109a56: 8b 45 10 mov 0x10(%ebp),%eax -c0109a59: 89 45 ec mov %eax,-0x14(%ebp) - : "0" (n / 4), "g" (n), "1" (dst), "2" (src) -c0109a5c: 8b 45 ec mov -0x14(%ebp),%eax -c0109a5f: c1 e8 02 shr $0x2,%eax -c0109a62: 89 c1 mov %eax,%ecx - asm volatile ( -c0109a64: 8b 55 f4 mov -0xc(%ebp),%edx -c0109a67: 8b 45 f0 mov -0x10(%ebp),%eax -c0109a6a: 89 d7 mov %edx,%edi -c0109a6c: 89 c6 mov %eax,%esi -c0109a6e: f3 a5 rep movsl %ds:(%esi),%es:(%edi) -c0109a70: 8b 4d ec mov -0x14(%ebp),%ecx -c0109a73: 83 e1 03 and $0x3,%ecx -c0109a76: 74 02 je c0109a7a -c0109a78: f3 a4 rep movsb %ds:(%esi),%es:(%edi) -c0109a7a: 89 f0 mov %esi,%eax -c0109a7c: 89 fa mov %edi,%edx -c0109a7e: 89 4d e8 mov %ecx,-0x18(%ebp) -c0109a81: 89 55 e4 mov %edx,-0x1c(%ebp) -c0109a84: 89 45 e0 mov %eax,-0x20(%ebp) - return dst; -c0109a87: 8b 45 f4 mov -0xc(%ebp),%eax - while (n -- > 0) { - *d ++ = *s ++; - } - return dst; -#endif /* __HAVE_ARCH_MEMCPY */ +c010931b <__intr_restore>: +__intr_restore(bool flag) { +c010931b: 55 push %ebp +c010931c: 89 e5 mov %esp,%ebp +c010931e: 83 ec 08 sub $0x8,%esp + if (flag) { +c0109321: 83 7d 08 00 cmpl $0x0,0x8(%ebp) +c0109325: 74 05 je c010932c <__intr_restore+0x11> + intr_enable(); +c0109327: e8 c7 8b ff ff call c0101ef3 } -c0109a8a: 83 c4 20 add $0x20,%esp -c0109a8d: 5e pop %esi -c0109a8e: 5f pop %edi -c0109a8f: 5d pop %ebp -c0109a90: c3 ret +c010932c: 90 nop +c010932d: 89 ec mov %ebp,%esp +c010932f: 5d pop %ebp +c0109330: c3 ret -c0109a91 : - * match in both memory blocks has a greater value in @v1 than in @v2 - * as if evaluated as unsigned char values; - * - And a value less than zero indicates the opposite. - * */ -int -memcmp(const void *v1, const void *v2, size_t n) { -c0109a91: f3 0f 1e fb endbr32 -c0109a95: 55 push %ebp -c0109a96: 89 e5 mov %esp,%ebp -c0109a98: 83 ec 10 sub $0x10,%esp - const char *s1 = (const char *)v1; -c0109a9b: 8b 45 08 mov 0x8(%ebp),%eax -c0109a9e: 89 45 fc mov %eax,-0x4(%ebp) - const char *s2 = (const char *)v2; -c0109aa1: 8b 45 0c mov 0xc(%ebp),%eax -c0109aa4: 89 45 f8 mov %eax,-0x8(%ebp) - while (n -- > 0) { -c0109aa7: eb 2e jmp c0109ad7 - if (*s1 != *s2) { -c0109aa9: 8b 45 fc mov -0x4(%ebp),%eax -c0109aac: 0f b6 10 movzbl (%eax),%edx -c0109aaf: 8b 45 f8 mov -0x8(%ebp),%eax -c0109ab2: 0f b6 00 movzbl (%eax),%eax -c0109ab5: 38 c2 cmp %al,%dl -c0109ab7: 74 18 je c0109ad1 - return (int)((unsigned char)*s1 - (unsigned char)*s2); -c0109ab9: 8b 45 fc mov -0x4(%ebp),%eax -c0109abc: 0f b6 00 movzbl (%eax),%eax -c0109abf: 0f b6 d0 movzbl %al,%edx -c0109ac2: 8b 45 f8 mov -0x8(%ebp),%eax -c0109ac5: 0f b6 00 movzbl (%eax),%eax -c0109ac8: 0f b6 c0 movzbl %al,%eax -c0109acb: 29 c2 sub %eax,%edx -c0109acd: 89 d0 mov %edx,%eax -c0109acf: eb 18 jmp c0109ae9 +c0109331 : +#include +#include +#include + +void +wakeup_proc(struct proc_struct *proc) { +c0109331: 55 push %ebp +c0109332: 89 e5 mov %esp,%ebp +c0109334: 83 ec 18 sub $0x18,%esp + assert(proc->state != PROC_ZOMBIE && proc->state != PROC_RUNNABLE); +c0109337: 8b 45 08 mov 0x8(%ebp),%eax +c010933a: 8b 00 mov (%eax),%eax +c010933c: 83 f8 03 cmp $0x3,%eax +c010933f: 74 0a je c010934b +c0109341: 8b 45 08 mov 0x8(%ebp),%eax +c0109344: 8b 00 mov (%eax),%eax +c0109346: 83 f8 02 cmp $0x2,%eax +c0109349: 75 24 jne c010936f +c010934b: c7 44 24 0c 54 c1 10 movl $0xc010c154,0xc(%esp) +c0109352: c0 +c0109353: c7 44 24 08 8f c1 10 movl $0xc010c18f,0x8(%esp) +c010935a: c0 +c010935b: c7 44 24 04 09 00 00 movl $0x9,0x4(%esp) +c0109362: 00 +c0109363: c7 04 24 a4 c1 10 c0 movl $0xc010c1a4,(%esp) +c010936a: e8 d6 78 ff ff call c0100c45 <__panic> + proc->state = PROC_RUNNABLE; +c010936f: 8b 45 08 mov 0x8(%ebp),%eax +c0109372: c7 00 02 00 00 00 movl $0x2,(%eax) +} +c0109378: 90 nop +c0109379: 89 ec mov %ebp,%esp +c010937b: 5d pop %ebp +c010937c: c3 ret + +c010937d : + * 如果找到可运行的进程,则选择该进程作为下一个要执行的进程,并进行上下文切换。 + * 如果没有找到可运行的进程,则选择空闲进程作为下一个要执行的进程。 + * 最后,恢复中断状态并退出调度函数。 + */ +void +schedule(void) { +c010937d: 55 push %ebp +c010937e: 89 e5 mov %esp,%ebp +c0109380: 83 ec 38 sub $0x38,%esp + // 保存中断状态标志 + bool intr_flag; + // 定义指向进程列表项的指针 + list_entry_t *le, *last; + // 定义下一个要执行的进程指针,并初始化为NULL + struct proc_struct *next = NULL; +c0109383: c7 45 f0 00 00 00 00 movl $0x0,-0x10(%ebp) + // 保存当前中断状态,并禁止中断 + local_intr_save(intr_flag); +c010938a: e8 60 ff ff ff call c01092ef <__intr_save> +c010938f: 89 45 ec mov %eax,-0x14(%ebp) + { + // 标记当前进程不需要重新调度 + current->need_resched = 0; +c0109392: a1 90 c1 12 c0 mov 0xc012c190,%eax +c0109397: c7 40 10 00 00 00 00 movl $0x0,0x10(%eax) + // 确定进程列表的最后一个元素 + last = (current == idleproc) ? &proc_list : &(current->list_link); +c010939e: 8b 15 90 c1 12 c0 mov 0xc012c190,%edx +c01093a4: a1 88 c1 12 c0 mov 0xc012c188,%eax +c01093a9: 39 c2 cmp %eax,%edx +c01093ab: 74 0a je c01093b7 +c01093ad: a1 90 c1 12 c0 mov 0xc012c190,%eax +c01093b2: 83 c0 58 add $0x58,%eax +c01093b5: eb 05 jmp c01093bc +c01093b7: b8 80 c1 12 c0 mov $0xc012c180,%eax +c01093bc: 89 45 e8 mov %eax,-0x18(%ebp) + // 从最后一个元素开始遍历进程列表 + le = last; +c01093bf: 8b 45 e8 mov -0x18(%ebp),%eax +c01093c2: 89 45 f4 mov %eax,-0xc(%ebp) +c01093c5: 8b 45 f4 mov -0xc(%ebp),%eax +c01093c8: 89 45 e4 mov %eax,-0x1c(%ebp) + return listelm->next; +c01093cb: 8b 45 e4 mov -0x1c(%ebp),%eax +c01093ce: 8b 40 04 mov 0x4(%eax),%eax + do { + // 如果不是进程列表的末尾,则继续查找下一个可运行的进程 + if ((le = list_next(le)) != &proc_list) { +c01093d1: 89 45 f4 mov %eax,-0xc(%ebp) +c01093d4: 81 7d f4 80 c1 12 c0 cmpl $0xc012c180,-0xc(%ebp) +c01093db: 74 13 je c01093f0 + // 获取当前列表项对应的进程结构体 + next = le2proc(le, list_link); +c01093dd: 8b 45 f4 mov -0xc(%ebp),%eax +c01093e0: 83 e8 58 sub $0x58,%eax +c01093e3: 89 45 f0 mov %eax,-0x10(%ebp) + // 如果进程处于可运行状态,则停止查找 + if (next->state == PROC_RUNNABLE) { +c01093e6: 8b 45 f0 mov -0x10(%ebp),%eax +c01093e9: 8b 00 mov (%eax),%eax +c01093eb: 83 f8 02 cmp $0x2,%eax +c01093ee: 74 0a je c01093fa + break; + } + } + } while (le != last); +c01093f0: 8b 45 f4 mov -0xc(%ebp),%eax +c01093f3: 3b 45 e8 cmp -0x18(%ebp),%eax +c01093f6: 75 cd jne c01093c5 +c01093f8: eb 01 jmp c01093fb + break; +c01093fa: 90 nop + // 如果没有找到可运行的进程,则选择空闲进程作为下一个要执行的进程 + if (next == NULL || next->state != PROC_RUNNABLE) { +c01093fb: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) +c01093ff: 74 0a je c010940b +c0109401: 8b 45 f0 mov -0x10(%ebp),%eax +c0109404: 8b 00 mov (%eax),%eax +c0109406: 83 f8 02 cmp $0x2,%eax +c0109409: 74 08 je c0109413 + next = idleproc; +c010940b: a1 88 c1 12 c0 mov 0xc012c188,%eax +c0109410: 89 45 f0 mov %eax,-0x10(%ebp) + } + // 增加下一个要执行的进程的运行次数 + next->runs ++; +c0109413: 8b 45 f0 mov -0x10(%ebp),%eax +c0109416: 8b 40 08 mov 0x8(%eax),%eax +c0109419: 8d 50 01 lea 0x1(%eax),%edx +c010941c: 8b 45 f0 mov -0x10(%ebp),%eax +c010941f: 89 50 08 mov %edx,0x8(%eax) + // 如果下一个要执行的进程不是当前进程,则进行上下文切换 + if (next != current) { +c0109422: a1 90 c1 12 c0 mov 0xc012c190,%eax +c0109427: 39 45 f0 cmp %eax,-0x10(%ebp) +c010942a: 74 0b je c0109437 + proc_run(next); +c010942c: 8b 45 f0 mov -0x10(%ebp),%eax +c010942f: 89 04 24 mov %eax,(%esp) +c0109432: e8 43 f7 ff ff call c0108b7a } - s1 ++, s2 ++; -c0109ad1: ff 45 fc incl -0x4(%ebp) -c0109ad4: ff 45 f8 incl -0x8(%ebp) - while (n -- > 0) { -c0109ad7: 8b 45 10 mov 0x10(%ebp),%eax -c0109ada: 8d 50 ff lea -0x1(%eax),%edx -c0109add: 89 55 10 mov %edx,0x10(%ebp) -c0109ae0: 85 c0 test %eax,%eax -c0109ae2: 75 c5 jne c0109aa9 } - return 0; -c0109ae4: b8 00 00 00 00 mov $0x0,%eax + // 恢复中断状态 + local_intr_restore(intr_flag); +c0109437: 8b 45 ec mov -0x14(%ebp),%eax +c010943a: 89 04 24 mov %eax,(%esp) +c010943d: e8 d9 fe ff ff call c010931b <__intr_restore> } -c0109ae9: c9 leave -c0109aea: c3 ret +c0109442: 90 nop +c0109443: 89 ec mov %ebp,%esp +c0109445: 5d pop %ebp +c0109446: c3 ret -c0109aeb : +c0109447 : + * @bits: the number of bits in a return value + * + * High bits are more random, so we use them. + * */ +uint32_t +hash32(uint32_t val, unsigned int bits) { +c0109447: 55 push %ebp +c0109448: 89 e5 mov %esp,%ebp +c010944a: 83 ec 10 sub $0x10,%esp + uint32_t hash = val * GOLDEN_RATIO_PRIME_32; +c010944d: 8b 45 08 mov 0x8(%ebp),%eax +c0109450: 69 c0 01 00 37 9e imul $0x9e370001,%eax,%eax +c0109456: 89 45 fc mov %eax,-0x4(%ebp) + return (hash >> (32 - bits)); +c0109459: b8 20 00 00 00 mov $0x20,%eax +c010945e: 2b 45 0c sub 0xc(%ebp),%eax +c0109461: 8b 55 fc mov -0x4(%ebp),%edx +c0109464: 88 c1 mov %al,%cl +c0109466: d3 ea shr %cl,%edx +c0109468: 89 d0 mov %edx,%eax +} +c010946a: 89 ec mov %ebp,%esp +c010946c: 5d pop %ebp +c010946d: c3 ret + +c010946e : * @width: maximum number of digits, if the actual width is less than @width, use @padc instead * @padc: character that padded on the left if the actual width is less than @width * */ static void printnum(void (*putch)(int, void*), void *putdat, unsigned long long num, unsigned base, int width, int padc) { -c0109aeb: f3 0f 1e fb endbr32 -c0109aef: 55 push %ebp -c0109af0: 89 e5 mov %esp,%ebp -c0109af2: 83 ec 58 sub $0x58,%esp -c0109af5: 8b 45 10 mov 0x10(%ebp),%eax -c0109af8: 89 45 d0 mov %eax,-0x30(%ebp) -c0109afb: 8b 45 14 mov 0x14(%ebp),%eax -c0109afe: 89 45 d4 mov %eax,-0x2c(%ebp) +c010946e: 55 push %ebp +c010946f: 89 e5 mov %esp,%ebp +c0109471: 83 ec 58 sub $0x58,%esp +c0109474: 8b 45 10 mov 0x10(%ebp),%eax +c0109477: 89 45 d0 mov %eax,-0x30(%ebp) +c010947a: 8b 45 14 mov 0x14(%ebp),%eax +c010947d: 89 45 d4 mov %eax,-0x2c(%ebp) unsigned long long result = num; -c0109b01: 8b 45 d0 mov -0x30(%ebp),%eax -c0109b04: 8b 55 d4 mov -0x2c(%ebp),%edx -c0109b07: 89 45 e8 mov %eax,-0x18(%ebp) -c0109b0a: 89 55 ec mov %edx,-0x14(%ebp) +c0109480: 8b 45 d0 mov -0x30(%ebp),%eax +c0109483: 8b 55 d4 mov -0x2c(%ebp),%edx +c0109486: 89 45 e8 mov %eax,-0x18(%ebp) +c0109489: 89 55 ec mov %edx,-0x14(%ebp) unsigned mod = do_div(result, base); -c0109b0d: 8b 45 18 mov 0x18(%ebp),%eax -c0109b10: 89 45 e4 mov %eax,-0x1c(%ebp) -c0109b13: 8b 45 e8 mov -0x18(%ebp),%eax -c0109b16: 8b 55 ec mov -0x14(%ebp),%edx -c0109b19: 89 45 e0 mov %eax,-0x20(%ebp) -c0109b1c: 89 55 f0 mov %edx,-0x10(%ebp) -c0109b1f: 8b 45 f0 mov -0x10(%ebp),%eax -c0109b22: 89 45 f4 mov %eax,-0xc(%ebp) -c0109b25: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) -c0109b29: 74 1c je c0109b47 -c0109b2b: 8b 45 f0 mov -0x10(%ebp),%eax -c0109b2e: ba 00 00 00 00 mov $0x0,%edx -c0109b33: f7 75 e4 divl -0x1c(%ebp) -c0109b36: 89 55 f4 mov %edx,-0xc(%ebp) -c0109b39: 8b 45 f0 mov -0x10(%ebp),%eax -c0109b3c: ba 00 00 00 00 mov $0x0,%edx -c0109b41: f7 75 e4 divl -0x1c(%ebp) -c0109b44: 89 45 f0 mov %eax,-0x10(%ebp) -c0109b47: 8b 45 e0 mov -0x20(%ebp),%eax -c0109b4a: 8b 55 f4 mov -0xc(%ebp),%edx -c0109b4d: f7 75 e4 divl -0x1c(%ebp) -c0109b50: 89 45 e0 mov %eax,-0x20(%ebp) -c0109b53: 89 55 dc mov %edx,-0x24(%ebp) -c0109b56: 8b 45 e0 mov -0x20(%ebp),%eax -c0109b59: 8b 55 f0 mov -0x10(%ebp),%edx -c0109b5c: 89 45 e8 mov %eax,-0x18(%ebp) -c0109b5f: 89 55 ec mov %edx,-0x14(%ebp) -c0109b62: 8b 45 dc mov -0x24(%ebp),%eax -c0109b65: 89 45 d8 mov %eax,-0x28(%ebp) +c010948c: 8b 45 18 mov 0x18(%ebp),%eax +c010948f: 89 45 e4 mov %eax,-0x1c(%ebp) +c0109492: 8b 45 e8 mov -0x18(%ebp),%eax +c0109495: 8b 55 ec mov -0x14(%ebp),%edx +c0109498: 89 45 e0 mov %eax,-0x20(%ebp) +c010949b: 89 55 f0 mov %edx,-0x10(%ebp) +c010949e: 8b 45 f0 mov -0x10(%ebp),%eax +c01094a1: 89 45 f4 mov %eax,-0xc(%ebp) +c01094a4: 83 7d f0 00 cmpl $0x0,-0x10(%ebp) +c01094a8: 74 1c je c01094c6 +c01094aa: 8b 45 f0 mov -0x10(%ebp),%eax +c01094ad: ba 00 00 00 00 mov $0x0,%edx +c01094b2: f7 75 e4 divl -0x1c(%ebp) +c01094b5: 89 55 f4 mov %edx,-0xc(%ebp) +c01094b8: 8b 45 f0 mov -0x10(%ebp),%eax +c01094bb: ba 00 00 00 00 mov $0x0,%edx +c01094c0: f7 75 e4 divl -0x1c(%ebp) +c01094c3: 89 45 f0 mov %eax,-0x10(%ebp) +c01094c6: 8b 45 e0 mov -0x20(%ebp),%eax +c01094c9: 8b 55 f4 mov -0xc(%ebp),%edx +c01094cc: f7 75 e4 divl -0x1c(%ebp) +c01094cf: 89 45 e0 mov %eax,-0x20(%ebp) +c01094d2: 89 55 dc mov %edx,-0x24(%ebp) +c01094d5: 8b 45 e0 mov -0x20(%ebp),%eax +c01094d8: 8b 55 f0 mov -0x10(%ebp),%edx +c01094db: 89 45 e8 mov %eax,-0x18(%ebp) +c01094de: 89 55 ec mov %edx,-0x14(%ebp) +c01094e1: 8b 45 dc mov -0x24(%ebp),%eax +c01094e4: 89 45 d8 mov %eax,-0x28(%ebp) // first recursively print all preceding (more significant) digits if (num >= base) { -c0109b68: 8b 45 18 mov 0x18(%ebp),%eax -c0109b6b: ba 00 00 00 00 mov $0x0,%edx -c0109b70: 8b 4d d4 mov -0x2c(%ebp),%ecx -c0109b73: 39 45 d0 cmp %eax,-0x30(%ebp) -c0109b76: 19 d1 sbb %edx,%ecx -c0109b78: 72 4c jb c0109bc6 +c01094e7: 8b 45 18 mov 0x18(%ebp),%eax +c01094ea: ba 00 00 00 00 mov $0x0,%edx +c01094ef: 8b 4d d4 mov -0x2c(%ebp),%ecx +c01094f2: 39 45 d0 cmp %eax,-0x30(%ebp) +c01094f5: 19 d1 sbb %edx,%ecx +c01094f7: 72 4c jb c0109545 printnum(putch, putdat, result, base, width - 1, padc); -c0109b7a: 8b 45 1c mov 0x1c(%ebp),%eax -c0109b7d: 8d 50 ff lea -0x1(%eax),%edx -c0109b80: 8b 45 20 mov 0x20(%ebp),%eax -c0109b83: 89 44 24 18 mov %eax,0x18(%esp) -c0109b87: 89 54 24 14 mov %edx,0x14(%esp) -c0109b8b: 8b 45 18 mov 0x18(%ebp),%eax -c0109b8e: 89 44 24 10 mov %eax,0x10(%esp) -c0109b92: 8b 45 e8 mov -0x18(%ebp),%eax -c0109b95: 8b 55 ec mov -0x14(%ebp),%edx -c0109b98: 89 44 24 08 mov %eax,0x8(%esp) -c0109b9c: 89 54 24 0c mov %edx,0xc(%esp) -c0109ba0: 8b 45 0c mov 0xc(%ebp),%eax -c0109ba3: 89 44 24 04 mov %eax,0x4(%esp) -c0109ba7: 8b 45 08 mov 0x8(%ebp),%eax -c0109baa: 89 04 24 mov %eax,(%esp) -c0109bad: e8 39 ff ff ff call c0109aeb -c0109bb2: eb 1b jmp c0109bcf +c01094f9: 8b 45 1c mov 0x1c(%ebp),%eax +c01094fc: 8d 50 ff lea -0x1(%eax),%edx +c01094ff: 8b 45 20 mov 0x20(%ebp),%eax +c0109502: 89 44 24 18 mov %eax,0x18(%esp) +c0109506: 89 54 24 14 mov %edx,0x14(%esp) +c010950a: 8b 45 18 mov 0x18(%ebp),%eax +c010950d: 89 44 24 10 mov %eax,0x10(%esp) +c0109511: 8b 45 e8 mov -0x18(%ebp),%eax +c0109514: 8b 55 ec mov -0x14(%ebp),%edx +c0109517: 89 44 24 08 mov %eax,0x8(%esp) +c010951b: 89 54 24 0c mov %edx,0xc(%esp) +c010951f: 8b 45 0c mov 0xc(%ebp),%eax +c0109522: 89 44 24 04 mov %eax,0x4(%esp) +c0109526: 8b 45 08 mov 0x8(%ebp),%eax +c0109529: 89 04 24 mov %eax,(%esp) +c010952c: e8 3d ff ff ff call c010946e +c0109531: eb 1b jmp c010954e } else { // print any needed pad characters before first digit while (-- width > 0) putch(padc, putdat); -c0109bb4: 8b 45 0c mov 0xc(%ebp),%eax -c0109bb7: 89 44 24 04 mov %eax,0x4(%esp) -c0109bbb: 8b 45 20 mov 0x20(%ebp),%eax -c0109bbe: 89 04 24 mov %eax,(%esp) -c0109bc1: 8b 45 08 mov 0x8(%ebp),%eax -c0109bc4: ff d0 call *%eax +c0109533: 8b 45 0c mov 0xc(%ebp),%eax +c0109536: 89 44 24 04 mov %eax,0x4(%esp) +c010953a: 8b 45 20 mov 0x20(%ebp),%eax +c010953d: 89 04 24 mov %eax,(%esp) +c0109540: 8b 45 08 mov 0x8(%ebp),%eax +c0109543: ff d0 call *%eax while (-- width > 0) -c0109bc6: ff 4d 1c decl 0x1c(%ebp) -c0109bc9: 83 7d 1c 00 cmpl $0x0,0x1c(%ebp) -c0109bcd: 7f e5 jg c0109bb4 +c0109545: ff 4d 1c decl 0x1c(%ebp) +c0109548: 83 7d 1c 00 cmpl $0x0,0x1c(%ebp) +c010954c: 7f e5 jg c0109533 } // then print this (the least significant) digit putch("0123456789abcdef"[mod], putdat); -c0109bcf: 8b 45 d8 mov -0x28(%ebp),%eax -c0109bd2: 05 60 c4 10 c0 add $0xc010c460,%eax -c0109bd7: 0f b6 00 movzbl (%eax),%eax -c0109bda: 0f be c0 movsbl %al,%eax -c0109bdd: 8b 55 0c mov 0xc(%ebp),%edx -c0109be0: 89 54 24 04 mov %edx,0x4(%esp) -c0109be4: 89 04 24 mov %eax,(%esp) -c0109be7: 8b 45 08 mov 0x8(%ebp),%eax -c0109bea: ff d0 call *%eax -} -c0109bec: 90 nop -c0109bed: c9 leave -c0109bee: c3 ret - -c0109bef : +c010954e: 8b 45 d8 mov -0x28(%ebp),%eax +c0109551: 05 3c c2 10 c0 add $0xc010c23c,%eax +c0109556: 0f b6 00 movzbl (%eax),%eax +c0109559: 0f be c0 movsbl %al,%eax +c010955c: 8b 55 0c mov 0xc(%ebp),%edx +c010955f: 89 54 24 04 mov %edx,0x4(%esp) +c0109563: 89 04 24 mov %eax,(%esp) +c0109566: 8b 45 08 mov 0x8(%ebp),%eax +c0109569: ff d0 call *%eax +} +c010956b: 90 nop +c010956c: 89 ec mov %ebp,%esp +c010956e: 5d pop %ebp +c010956f: c3 ret + +c0109570 : * getuint - get an unsigned int of various possible sizes from a varargs list * @ap: a varargs list pointer * @lflag: determines the size of the vararg that @ap points to * */ static unsigned long long getuint(va_list *ap, int lflag) { -c0109bef: f3 0f 1e fb endbr32 -c0109bf3: 55 push %ebp -c0109bf4: 89 e5 mov %esp,%ebp +c0109570: 55 push %ebp +c0109571: 89 e5 mov %esp,%ebp if (lflag >= 2) { -c0109bf6: 83 7d 0c 01 cmpl $0x1,0xc(%ebp) -c0109bfa: 7e 14 jle c0109c10 +c0109573: 83 7d 0c 01 cmpl $0x1,0xc(%ebp) +c0109577: 7e 14 jle c010958d return va_arg(*ap, unsigned long long); -c0109bfc: 8b 45 08 mov 0x8(%ebp),%eax -c0109bff: 8b 00 mov (%eax),%eax -c0109c01: 8d 48 08 lea 0x8(%eax),%ecx -c0109c04: 8b 55 08 mov 0x8(%ebp),%edx -c0109c07: 89 0a mov %ecx,(%edx) -c0109c09: 8b 50 04 mov 0x4(%eax),%edx -c0109c0c: 8b 00 mov (%eax),%eax -c0109c0e: eb 30 jmp c0109c40 +c0109579: 8b 45 08 mov 0x8(%ebp),%eax +c010957c: 8b 00 mov (%eax),%eax +c010957e: 8d 48 08 lea 0x8(%eax),%ecx +c0109581: 8b 55 08 mov 0x8(%ebp),%edx +c0109584: 89 0a mov %ecx,(%edx) +c0109586: 8b 50 04 mov 0x4(%eax),%edx +c0109589: 8b 00 mov (%eax),%eax +c010958b: eb 30 jmp c01095bd } else if (lflag) { -c0109c10: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) -c0109c14: 74 16 je c0109c2c +c010958d: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) +c0109591: 74 16 je c01095a9 return va_arg(*ap, unsigned long); -c0109c16: 8b 45 08 mov 0x8(%ebp),%eax -c0109c19: 8b 00 mov (%eax),%eax -c0109c1b: 8d 48 04 lea 0x4(%eax),%ecx -c0109c1e: 8b 55 08 mov 0x8(%ebp),%edx -c0109c21: 89 0a mov %ecx,(%edx) -c0109c23: 8b 00 mov (%eax),%eax -c0109c25: ba 00 00 00 00 mov $0x0,%edx -c0109c2a: eb 14 jmp c0109c40 +c0109593: 8b 45 08 mov 0x8(%ebp),%eax +c0109596: 8b 00 mov (%eax),%eax +c0109598: 8d 48 04 lea 0x4(%eax),%ecx +c010959b: 8b 55 08 mov 0x8(%ebp),%edx +c010959e: 89 0a mov %ecx,(%edx) +c01095a0: 8b 00 mov (%eax),%eax +c01095a2: ba 00 00 00 00 mov $0x0,%edx +c01095a7: eb 14 jmp c01095bd } else { return va_arg(*ap, unsigned int); -c0109c2c: 8b 45 08 mov 0x8(%ebp),%eax -c0109c2f: 8b 00 mov (%eax),%eax -c0109c31: 8d 48 04 lea 0x4(%eax),%ecx -c0109c34: 8b 55 08 mov 0x8(%ebp),%edx -c0109c37: 89 0a mov %ecx,(%edx) -c0109c39: 8b 00 mov (%eax),%eax -c0109c3b: ba 00 00 00 00 mov $0x0,%edx +c01095a9: 8b 45 08 mov 0x8(%ebp),%eax +c01095ac: 8b 00 mov (%eax),%eax +c01095ae: 8d 48 04 lea 0x4(%eax),%ecx +c01095b1: 8b 55 08 mov 0x8(%ebp),%edx +c01095b4: 89 0a mov %ecx,(%edx) +c01095b6: 8b 00 mov (%eax),%eax +c01095b8: ba 00 00 00 00 mov $0x0,%edx } } -c0109c40: 5d pop %ebp -c0109c41: c3 ret +c01095bd: 5d pop %ebp +c01095be: c3 ret -c0109c42 : +c01095bf : * getint - same as getuint but signed, we can't use getuint because of sign extension * @ap: a varargs list pointer * @lflag: determines the size of the vararg that @ap points to * */ static long long getint(va_list *ap, int lflag) { -c0109c42: f3 0f 1e fb endbr32 -c0109c46: 55 push %ebp -c0109c47: 89 e5 mov %esp,%ebp +c01095bf: 55 push %ebp +c01095c0: 89 e5 mov %esp,%ebp if (lflag >= 2) { -c0109c49: 83 7d 0c 01 cmpl $0x1,0xc(%ebp) -c0109c4d: 7e 14 jle c0109c63 +c01095c2: 83 7d 0c 01 cmpl $0x1,0xc(%ebp) +c01095c6: 7e 14 jle c01095dc return va_arg(*ap, long long); -c0109c4f: 8b 45 08 mov 0x8(%ebp),%eax -c0109c52: 8b 00 mov (%eax),%eax -c0109c54: 8d 48 08 lea 0x8(%eax),%ecx -c0109c57: 8b 55 08 mov 0x8(%ebp),%edx -c0109c5a: 89 0a mov %ecx,(%edx) -c0109c5c: 8b 50 04 mov 0x4(%eax),%edx -c0109c5f: 8b 00 mov (%eax),%eax -c0109c61: eb 28 jmp c0109c8b +c01095c8: 8b 45 08 mov 0x8(%ebp),%eax +c01095cb: 8b 00 mov (%eax),%eax +c01095cd: 8d 48 08 lea 0x8(%eax),%ecx +c01095d0: 8b 55 08 mov 0x8(%ebp),%edx +c01095d3: 89 0a mov %ecx,(%edx) +c01095d5: 8b 50 04 mov 0x4(%eax),%edx +c01095d8: 8b 00 mov (%eax),%eax +c01095da: eb 28 jmp c0109604 } else if (lflag) { -c0109c63: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) -c0109c67: 74 12 je c0109c7b +c01095dc: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) +c01095e0: 74 12 je c01095f4 return va_arg(*ap, long); -c0109c69: 8b 45 08 mov 0x8(%ebp),%eax -c0109c6c: 8b 00 mov (%eax),%eax -c0109c6e: 8d 48 04 lea 0x4(%eax),%ecx -c0109c71: 8b 55 08 mov 0x8(%ebp),%edx -c0109c74: 89 0a mov %ecx,(%edx) -c0109c76: 8b 00 mov (%eax),%eax -c0109c78: 99 cltd -c0109c79: eb 10 jmp c0109c8b +c01095e2: 8b 45 08 mov 0x8(%ebp),%eax +c01095e5: 8b 00 mov (%eax),%eax +c01095e7: 8d 48 04 lea 0x4(%eax),%ecx +c01095ea: 8b 55 08 mov 0x8(%ebp),%edx +c01095ed: 89 0a mov %ecx,(%edx) +c01095ef: 8b 00 mov (%eax),%eax +c01095f1: 99 cltd +c01095f2: eb 10 jmp c0109604 } else { return va_arg(*ap, int); -c0109c7b: 8b 45 08 mov 0x8(%ebp),%eax -c0109c7e: 8b 00 mov (%eax),%eax -c0109c80: 8d 48 04 lea 0x4(%eax),%ecx -c0109c83: 8b 55 08 mov 0x8(%ebp),%edx -c0109c86: 89 0a mov %ecx,(%edx) -c0109c88: 8b 00 mov (%eax),%eax -c0109c8a: 99 cltd +c01095f4: 8b 45 08 mov 0x8(%ebp),%eax +c01095f7: 8b 00 mov (%eax),%eax +c01095f9: 8d 48 04 lea 0x4(%eax),%ecx +c01095fc: 8b 55 08 mov 0x8(%ebp),%edx +c01095ff: 89 0a mov %ecx,(%edx) +c0109601: 8b 00 mov (%eax),%eax +c0109603: 99 cltd } } -c0109c8b: 5d pop %ebp -c0109c8c: c3 ret +c0109604: 5d pop %ebp +c0109605: c3 ret -c0109c8d : +c0109606 : * @putch: specified putch function, print a single character * @putdat: used by @putch function * @fmt: the format string to use * */ void printfmt(void (*putch)(int, void*), void *putdat, const char *fmt, ...) { -c0109c8d: f3 0f 1e fb endbr32 -c0109c91: 55 push %ebp -c0109c92: 89 e5 mov %esp,%ebp -c0109c94: 83 ec 28 sub $0x28,%esp +c0109606: 55 push %ebp +c0109607: 89 e5 mov %esp,%ebp +c0109609: 83 ec 28 sub $0x28,%esp va_list ap; va_start(ap, fmt); -c0109c97: 8d 45 14 lea 0x14(%ebp),%eax -c0109c9a: 89 45 f4 mov %eax,-0xc(%ebp) +c010960c: 8d 45 14 lea 0x14(%ebp),%eax +c010960f: 89 45 f4 mov %eax,-0xc(%ebp) vprintfmt(putch, putdat, fmt, ap); -c0109c9d: 8b 45 f4 mov -0xc(%ebp),%eax -c0109ca0: 89 44 24 0c mov %eax,0xc(%esp) -c0109ca4: 8b 45 10 mov 0x10(%ebp),%eax -c0109ca7: 89 44 24 08 mov %eax,0x8(%esp) -c0109cab: 8b 45 0c mov 0xc(%ebp),%eax -c0109cae: 89 44 24 04 mov %eax,0x4(%esp) -c0109cb2: 8b 45 08 mov 0x8(%ebp),%eax -c0109cb5: 89 04 24 mov %eax,(%esp) -c0109cb8: e8 03 00 00 00 call c0109cc0 +c0109612: 8b 45 f4 mov -0xc(%ebp),%eax +c0109615: 89 44 24 0c mov %eax,0xc(%esp) +c0109619: 8b 45 10 mov 0x10(%ebp),%eax +c010961c: 89 44 24 08 mov %eax,0x8(%esp) +c0109620: 8b 45 0c mov 0xc(%ebp),%eax +c0109623: 89 44 24 04 mov %eax,0x4(%esp) +c0109627: 8b 45 08 mov 0x8(%ebp),%eax +c010962a: 89 04 24 mov %eax,(%esp) +c010962d: e8 05 00 00 00 call c0109637 va_end(ap); } -c0109cbd: 90 nop -c0109cbe: c9 leave -c0109cbf: c3 ret +c0109632: 90 nop +c0109633: 89 ec mov %ebp,%esp +c0109635: 5d pop %ebp +c0109636: c3 ret -c0109cc0 : +c0109637 : * * Call this function if you are already dealing with a va_list. * Or you probably want printfmt() instead. * */ void vprintfmt(void (*putch)(int, void*), void *putdat, const char *fmt, va_list ap) { -c0109cc0: f3 0f 1e fb endbr32 -c0109cc4: 55 push %ebp -c0109cc5: 89 e5 mov %esp,%ebp -c0109cc7: 56 push %esi -c0109cc8: 53 push %ebx -c0109cc9: 83 ec 40 sub $0x40,%esp +c0109637: 55 push %ebp +c0109638: 89 e5 mov %esp,%ebp +c010963a: 56 push %esi +c010963b: 53 push %ebx +c010963c: 83 ec 40 sub $0x40,%esp register int ch, err; unsigned long long num; int base, width, precision, lflag, altflag; while (1) { while ((ch = *(unsigned char *)fmt ++) != '%') { -c0109ccc: eb 17 jmp c0109ce5 +c010963f: eb 17 jmp c0109658 if (ch == '\0') { -c0109cce: 85 db test %ebx,%ebx -c0109cd0: 0f 84 c0 03 00 00 je c010a096 +c0109641: 85 db test %ebx,%ebx +c0109643: 0f 84 bf 03 00 00 je c0109a08 return; } putch(ch, putdat); -c0109cd6: 8b 45 0c mov 0xc(%ebp),%eax -c0109cd9: 89 44 24 04 mov %eax,0x4(%esp) -c0109cdd: 89 1c 24 mov %ebx,(%esp) -c0109ce0: 8b 45 08 mov 0x8(%ebp),%eax -c0109ce3: ff d0 call *%eax +c0109649: 8b 45 0c mov 0xc(%ebp),%eax +c010964c: 89 44 24 04 mov %eax,0x4(%esp) +c0109650: 89 1c 24 mov %ebx,(%esp) +c0109653: 8b 45 08 mov 0x8(%ebp),%eax +c0109656: ff d0 call *%eax while ((ch = *(unsigned char *)fmt ++) != '%') { -c0109ce5: 8b 45 10 mov 0x10(%ebp),%eax -c0109ce8: 8d 50 01 lea 0x1(%eax),%edx -c0109ceb: 89 55 10 mov %edx,0x10(%ebp) -c0109cee: 0f b6 00 movzbl (%eax),%eax -c0109cf1: 0f b6 d8 movzbl %al,%ebx -c0109cf4: 83 fb 25 cmp $0x25,%ebx -c0109cf7: 75 d5 jne c0109cce +c0109658: 8b 45 10 mov 0x10(%ebp),%eax +c010965b: 8d 50 01 lea 0x1(%eax),%edx +c010965e: 89 55 10 mov %edx,0x10(%ebp) +c0109661: 0f b6 00 movzbl (%eax),%eax +c0109664: 0f b6 d8 movzbl %al,%ebx +c0109667: 83 fb 25 cmp $0x25,%ebx +c010966a: 75 d5 jne c0109641 } // Process a %-escape sequence char padc = ' '; -c0109cf9: c6 45 db 20 movb $0x20,-0x25(%ebp) +c010966c: c6 45 db 20 movb $0x20,-0x25(%ebp) width = precision = -1; -c0109cfd: c7 45 e4 ff ff ff ff movl $0xffffffff,-0x1c(%ebp) -c0109d04: 8b 45 e4 mov -0x1c(%ebp),%eax -c0109d07: 89 45 e8 mov %eax,-0x18(%ebp) +c0109670: c7 45 e4 ff ff ff ff movl $0xffffffff,-0x1c(%ebp) +c0109677: 8b 45 e4 mov -0x1c(%ebp),%eax +c010967a: 89 45 e8 mov %eax,-0x18(%ebp) lflag = altflag = 0; -c0109d0a: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp) -c0109d11: 8b 45 dc mov -0x24(%ebp),%eax -c0109d14: 89 45 e0 mov %eax,-0x20(%ebp) +c010967d: c7 45 dc 00 00 00 00 movl $0x0,-0x24(%ebp) +c0109684: 8b 45 dc mov -0x24(%ebp),%eax +c0109687: 89 45 e0 mov %eax,-0x20(%ebp) reswitch: switch (ch = *(unsigned char *)fmt ++) { -c0109d17: 8b 45 10 mov 0x10(%ebp),%eax -c0109d1a: 8d 50 01 lea 0x1(%eax),%edx -c0109d1d: 89 55 10 mov %edx,0x10(%ebp) -c0109d20: 0f b6 00 movzbl (%eax),%eax -c0109d23: 0f b6 d8 movzbl %al,%ebx -c0109d26: 8d 43 dd lea -0x23(%ebx),%eax -c0109d29: 83 f8 55 cmp $0x55,%eax -c0109d2c: 0f 87 38 03 00 00 ja c010a06a -c0109d32: 8b 04 85 84 c4 10 c0 mov -0x3fef3b7c(,%eax,4),%eax -c0109d39: 3e ff e0 notrack jmp *%eax +c010968a: 8b 45 10 mov 0x10(%ebp),%eax +c010968d: 8d 50 01 lea 0x1(%eax),%edx +c0109690: 89 55 10 mov %edx,0x10(%ebp) +c0109693: 0f b6 00 movzbl (%eax),%eax +c0109696: 0f b6 d8 movzbl %al,%ebx +c0109699: 8d 43 dd lea -0x23(%ebx),%eax +c010969c: 83 f8 55 cmp $0x55,%eax +c010969f: 0f 87 37 03 00 00 ja c01099dc +c01096a5: 8b 04 85 60 c2 10 c0 mov -0x3fef3da0(,%eax,4),%eax +c01096ac: ff e0 jmp *%eax // flag to pad on the right case '-': padc = '-'; -c0109d3c: c6 45 db 2d movb $0x2d,-0x25(%ebp) +c01096ae: c6 45 db 2d movb $0x2d,-0x25(%ebp) goto reswitch; -c0109d40: eb d5 jmp c0109d17 +c01096b2: eb d6 jmp c010968a // flag to pad with 0's instead of spaces case '0': padc = '0'; -c0109d42: c6 45 db 30 movb $0x30,-0x25(%ebp) +c01096b4: c6 45 db 30 movb $0x30,-0x25(%ebp) goto reswitch; -c0109d46: eb cf jmp c0109d17 +c01096b8: eb d0 jmp c010968a // width field case '1' ... '9': for (precision = 0; ; ++ fmt) { -c0109d48: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) +c01096ba: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) precision = precision * 10 + ch - '0'; -c0109d4f: 8b 55 e4 mov -0x1c(%ebp),%edx -c0109d52: 89 d0 mov %edx,%eax -c0109d54: c1 e0 02 shl $0x2,%eax -c0109d57: 01 d0 add %edx,%eax -c0109d59: 01 c0 add %eax,%eax -c0109d5b: 01 d8 add %ebx,%eax -c0109d5d: 83 e8 30 sub $0x30,%eax -c0109d60: 89 45 e4 mov %eax,-0x1c(%ebp) +c01096c1: 8b 55 e4 mov -0x1c(%ebp),%edx +c01096c4: 89 d0 mov %edx,%eax +c01096c6: c1 e0 02 shl $0x2,%eax +c01096c9: 01 d0 add %edx,%eax +c01096cb: 01 c0 add %eax,%eax +c01096cd: 01 d8 add %ebx,%eax +c01096cf: 83 e8 30 sub $0x30,%eax +c01096d2: 89 45 e4 mov %eax,-0x1c(%ebp) ch = *fmt; -c0109d63: 8b 45 10 mov 0x10(%ebp),%eax -c0109d66: 0f b6 00 movzbl (%eax),%eax -c0109d69: 0f be d8 movsbl %al,%ebx +c01096d5: 8b 45 10 mov 0x10(%ebp),%eax +c01096d8: 0f b6 00 movzbl (%eax),%eax +c01096db: 0f be d8 movsbl %al,%ebx if (ch < '0' || ch > '9') { -c0109d6c: 83 fb 2f cmp $0x2f,%ebx -c0109d6f: 7e 38 jle c0109da9 -c0109d71: 83 fb 39 cmp $0x39,%ebx -c0109d74: 7f 33 jg c0109da9 +c01096de: 83 fb 2f cmp $0x2f,%ebx +c01096e1: 7e 38 jle c010971b +c01096e3: 83 fb 39 cmp $0x39,%ebx +c01096e6: 7f 33 jg c010971b for (precision = 0; ; ++ fmt) { -c0109d76: ff 45 10 incl 0x10(%ebp) +c01096e8: ff 45 10 incl 0x10(%ebp) precision = precision * 10 + ch - '0'; -c0109d79: eb d4 jmp c0109d4f +c01096eb: eb d4 jmp c01096c1 } } goto process_precision; case '*': precision = va_arg(ap, int); -c0109d7b: 8b 45 14 mov 0x14(%ebp),%eax -c0109d7e: 8d 50 04 lea 0x4(%eax),%edx -c0109d81: 89 55 14 mov %edx,0x14(%ebp) -c0109d84: 8b 00 mov (%eax),%eax -c0109d86: 89 45 e4 mov %eax,-0x1c(%ebp) +c01096ed: 8b 45 14 mov 0x14(%ebp),%eax +c01096f0: 8d 50 04 lea 0x4(%eax),%edx +c01096f3: 89 55 14 mov %edx,0x14(%ebp) +c01096f6: 8b 00 mov (%eax),%eax +c01096f8: 89 45 e4 mov %eax,-0x1c(%ebp) goto process_precision; -c0109d89: eb 1f jmp c0109daa +c01096fb: eb 1f jmp c010971c case '.': if (width < 0) -c0109d8b: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) -c0109d8f: 79 86 jns c0109d17 +c01096fd: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) +c0109701: 79 87 jns c010968a width = 0; -c0109d91: c7 45 e8 00 00 00 00 movl $0x0,-0x18(%ebp) +c0109703: c7 45 e8 00 00 00 00 movl $0x0,-0x18(%ebp) goto reswitch; -c0109d98: e9 7a ff ff ff jmp c0109d17 +c010970a: e9 7b ff ff ff jmp c010968a case '#': altflag = 1; -c0109d9d: c7 45 dc 01 00 00 00 movl $0x1,-0x24(%ebp) +c010970f: c7 45 dc 01 00 00 00 movl $0x1,-0x24(%ebp) goto reswitch; -c0109da4: e9 6e ff ff ff jmp c0109d17 +c0109716: e9 6f ff ff ff jmp c010968a goto process_precision; -c0109da9: 90 nop +c010971b: 90 nop process_precision: if (width < 0) -c0109daa: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) -c0109dae: 0f 89 63 ff ff ff jns c0109d17 +c010971c: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) +c0109720: 0f 89 64 ff ff ff jns c010968a width = precision, precision = -1; -c0109db4: 8b 45 e4 mov -0x1c(%ebp),%eax -c0109db7: 89 45 e8 mov %eax,-0x18(%ebp) -c0109dba: c7 45 e4 ff ff ff ff movl $0xffffffff,-0x1c(%ebp) +c0109726: 8b 45 e4 mov -0x1c(%ebp),%eax +c0109729: 89 45 e8 mov %eax,-0x18(%ebp) +c010972c: c7 45 e4 ff ff ff ff movl $0xffffffff,-0x1c(%ebp) goto reswitch; -c0109dc1: e9 51 ff ff ff jmp c0109d17 +c0109733: e9 52 ff ff ff jmp c010968a // long flag (doubled for long long) case 'l': lflag ++; -c0109dc6: ff 45 e0 incl -0x20(%ebp) +c0109738: ff 45 e0 incl -0x20(%ebp) goto reswitch; -c0109dc9: e9 49 ff ff ff jmp c0109d17 +c010973b: e9 4a ff ff ff jmp c010968a // character case 'c': putch(va_arg(ap, int), putdat); -c0109dce: 8b 45 14 mov 0x14(%ebp),%eax -c0109dd1: 8d 50 04 lea 0x4(%eax),%edx -c0109dd4: 89 55 14 mov %edx,0x14(%ebp) -c0109dd7: 8b 00 mov (%eax),%eax -c0109dd9: 8b 55 0c mov 0xc(%ebp),%edx -c0109ddc: 89 54 24 04 mov %edx,0x4(%esp) -c0109de0: 89 04 24 mov %eax,(%esp) -c0109de3: 8b 45 08 mov 0x8(%ebp),%eax -c0109de6: ff d0 call *%eax +c0109740: 8b 45 14 mov 0x14(%ebp),%eax +c0109743: 8d 50 04 lea 0x4(%eax),%edx +c0109746: 89 55 14 mov %edx,0x14(%ebp) +c0109749: 8b 00 mov (%eax),%eax +c010974b: 8b 55 0c mov 0xc(%ebp),%edx +c010974e: 89 54 24 04 mov %edx,0x4(%esp) +c0109752: 89 04 24 mov %eax,(%esp) +c0109755: 8b 45 08 mov 0x8(%ebp),%eax +c0109758: ff d0 call *%eax break; -c0109de8: e9 a4 02 00 00 jmp c010a091 +c010975a: e9 a4 02 00 00 jmp c0109a03 // error message case 'e': err = va_arg(ap, int); -c0109ded: 8b 45 14 mov 0x14(%ebp),%eax -c0109df0: 8d 50 04 lea 0x4(%eax),%edx -c0109df3: 89 55 14 mov %edx,0x14(%ebp) -c0109df6: 8b 18 mov (%eax),%ebx +c010975f: 8b 45 14 mov 0x14(%ebp),%eax +c0109762: 8d 50 04 lea 0x4(%eax),%edx +c0109765: 89 55 14 mov %edx,0x14(%ebp) +c0109768: 8b 18 mov (%eax),%ebx if (err < 0) { -c0109df8: 85 db test %ebx,%ebx -c0109dfa: 79 02 jns c0109dfe +c010976a: 85 db test %ebx,%ebx +c010976c: 79 02 jns c0109770 err = -err; -c0109dfc: f7 db neg %ebx +c010976e: f7 db neg %ebx } if (err > MAXERROR || (p = error_string[err]) == NULL) { -c0109dfe: 83 fb 06 cmp $0x6,%ebx -c0109e01: 7f 0b jg c0109e0e -c0109e03: 8b 34 9d 44 c4 10 c0 mov -0x3fef3bbc(,%ebx,4),%esi -c0109e0a: 85 f6 test %esi,%esi -c0109e0c: 75 23 jne c0109e31 +c0109770: 83 fb 06 cmp $0x6,%ebx +c0109773: 7f 0b jg c0109780 +c0109775: 8b 34 9d 20 c2 10 c0 mov -0x3fef3de0(,%ebx,4),%esi +c010977c: 85 f6 test %esi,%esi +c010977e: 75 23 jne c01097a3 printfmt(putch, putdat, "error %d", err); -c0109e0e: 89 5c 24 0c mov %ebx,0xc(%esp) -c0109e12: c7 44 24 08 71 c4 10 movl $0xc010c471,0x8(%esp) -c0109e19: c0 -c0109e1a: 8b 45 0c mov 0xc(%ebp),%eax -c0109e1d: 89 44 24 04 mov %eax,0x4(%esp) -c0109e21: 8b 45 08 mov 0x8(%ebp),%eax -c0109e24: 89 04 24 mov %eax,(%esp) -c0109e27: e8 61 fe ff ff call c0109c8d +c0109780: 89 5c 24 0c mov %ebx,0xc(%esp) +c0109784: c7 44 24 08 4d c2 10 movl $0xc010c24d,0x8(%esp) +c010978b: c0 +c010978c: 8b 45 0c mov 0xc(%ebp),%eax +c010978f: 89 44 24 04 mov %eax,0x4(%esp) +c0109793: 8b 45 08 mov 0x8(%ebp),%eax +c0109796: 89 04 24 mov %eax,(%esp) +c0109799: e8 68 fe ff ff call c0109606 } else { printfmt(putch, putdat, "%s", p); } break; -c0109e2c: e9 60 02 00 00 jmp c010a091 +c010979e: e9 60 02 00 00 jmp c0109a03 printfmt(putch, putdat, "%s", p); -c0109e31: 89 74 24 0c mov %esi,0xc(%esp) -c0109e35: c7 44 24 08 7a c4 10 movl $0xc010c47a,0x8(%esp) -c0109e3c: c0 -c0109e3d: 8b 45 0c mov 0xc(%ebp),%eax -c0109e40: 89 44 24 04 mov %eax,0x4(%esp) -c0109e44: 8b 45 08 mov 0x8(%ebp),%eax -c0109e47: 89 04 24 mov %eax,(%esp) -c0109e4a: e8 3e fe ff ff call c0109c8d +c01097a3: 89 74 24 0c mov %esi,0xc(%esp) +c01097a7: c7 44 24 08 56 c2 10 movl $0xc010c256,0x8(%esp) +c01097ae: c0 +c01097af: 8b 45 0c mov 0xc(%ebp),%eax +c01097b2: 89 44 24 04 mov %eax,0x4(%esp) +c01097b6: 8b 45 08 mov 0x8(%ebp),%eax +c01097b9: 89 04 24 mov %eax,(%esp) +c01097bc: e8 45 fe ff ff call c0109606 break; -c0109e4f: e9 3d 02 00 00 jmp c010a091 +c01097c1: e9 3d 02 00 00 jmp c0109a03 // string case 's': if ((p = va_arg(ap, char *)) == NULL) { -c0109e54: 8b 45 14 mov 0x14(%ebp),%eax -c0109e57: 8d 50 04 lea 0x4(%eax),%edx -c0109e5a: 89 55 14 mov %edx,0x14(%ebp) -c0109e5d: 8b 30 mov (%eax),%esi -c0109e5f: 85 f6 test %esi,%esi -c0109e61: 75 05 jne c0109e68 +c01097c6: 8b 45 14 mov 0x14(%ebp),%eax +c01097c9: 8d 50 04 lea 0x4(%eax),%edx +c01097cc: 89 55 14 mov %edx,0x14(%ebp) +c01097cf: 8b 30 mov (%eax),%esi +c01097d1: 85 f6 test %esi,%esi +c01097d3: 75 05 jne c01097da p = "(null)"; -c0109e63: be 7d c4 10 c0 mov $0xc010c47d,%esi +c01097d5: be 59 c2 10 c0 mov $0xc010c259,%esi } if (width > 0 && padc != '-') { -c0109e68: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) -c0109e6c: 7e 76 jle c0109ee4 -c0109e6e: 80 7d db 2d cmpb $0x2d,-0x25(%ebp) -c0109e72: 74 70 je c0109ee4 +c01097da: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) +c01097de: 7e 76 jle c0109856 +c01097e0: 80 7d db 2d cmpb $0x2d,-0x25(%ebp) +c01097e4: 74 70 je c0109856 for (width -= strnlen(p, precision); width > 0; width --) { -c0109e74: 8b 45 e4 mov -0x1c(%ebp),%eax -c0109e77: 89 44 24 04 mov %eax,0x4(%esp) -c0109e7b: 89 34 24 mov %esi,(%esp) -c0109e7e: e8 ba f7 ff ff call c010963d -c0109e83: 8b 55 e8 mov -0x18(%ebp),%edx -c0109e86: 29 c2 sub %eax,%edx -c0109e88: 89 d0 mov %edx,%eax -c0109e8a: 89 45 e8 mov %eax,-0x18(%ebp) -c0109e8d: eb 16 jmp c0109ea5 +c01097e6: 8b 45 e4 mov -0x1c(%ebp),%eax +c01097e9: 89 44 24 04 mov %eax,0x4(%esp) +c01097ed: 89 34 24 mov %esi,(%esp) +c01097f0: e8 ee 03 00 00 call c0109be3 +c01097f5: 89 c2 mov %eax,%edx +c01097f7: 8b 45 e8 mov -0x18(%ebp),%eax +c01097fa: 29 d0 sub %edx,%eax +c01097fc: 89 45 e8 mov %eax,-0x18(%ebp) +c01097ff: eb 16 jmp c0109817 putch(padc, putdat); -c0109e8f: 0f be 45 db movsbl -0x25(%ebp),%eax -c0109e93: 8b 55 0c mov 0xc(%ebp),%edx -c0109e96: 89 54 24 04 mov %edx,0x4(%esp) -c0109e9a: 89 04 24 mov %eax,(%esp) -c0109e9d: 8b 45 08 mov 0x8(%ebp),%eax -c0109ea0: ff d0 call *%eax +c0109801: 0f be 45 db movsbl -0x25(%ebp),%eax +c0109805: 8b 55 0c mov 0xc(%ebp),%edx +c0109808: 89 54 24 04 mov %edx,0x4(%esp) +c010980c: 89 04 24 mov %eax,(%esp) +c010980f: 8b 45 08 mov 0x8(%ebp),%eax +c0109812: ff d0 call *%eax for (width -= strnlen(p, precision); width > 0; width --) { -c0109ea2: ff 4d e8 decl -0x18(%ebp) -c0109ea5: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) -c0109ea9: 7f e4 jg c0109e8f +c0109814: ff 4d e8 decl -0x18(%ebp) +c0109817: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) +c010981b: 7f e4 jg c0109801 } } for (; (ch = *p ++) != '\0' && (precision < 0 || -- precision >= 0); width --) { -c0109eab: eb 37 jmp c0109ee4 +c010981d: eb 37 jmp c0109856 if (altflag && (ch < ' ' || ch > '~')) { -c0109ead: 83 7d dc 00 cmpl $0x0,-0x24(%ebp) -c0109eb1: 74 1f je c0109ed2 -c0109eb3: 83 fb 1f cmp $0x1f,%ebx -c0109eb6: 7e 05 jle c0109ebd -c0109eb8: 83 fb 7e cmp $0x7e,%ebx -c0109ebb: 7e 15 jle c0109ed2 +c010981f: 83 7d dc 00 cmpl $0x0,-0x24(%ebp) +c0109823: 74 1f je c0109844 +c0109825: 83 fb 1f cmp $0x1f,%ebx +c0109828: 7e 05 jle c010982f +c010982a: 83 fb 7e cmp $0x7e,%ebx +c010982d: 7e 15 jle c0109844 putch('?', putdat); -c0109ebd: 8b 45 0c mov 0xc(%ebp),%eax -c0109ec0: 89 44 24 04 mov %eax,0x4(%esp) -c0109ec4: c7 04 24 3f 00 00 00 movl $0x3f,(%esp) -c0109ecb: 8b 45 08 mov 0x8(%ebp),%eax -c0109ece: ff d0 call *%eax -c0109ed0: eb 0f jmp c0109ee1 +c010982f: 8b 45 0c mov 0xc(%ebp),%eax +c0109832: 89 44 24 04 mov %eax,0x4(%esp) +c0109836: c7 04 24 3f 00 00 00 movl $0x3f,(%esp) +c010983d: 8b 45 08 mov 0x8(%ebp),%eax +c0109840: ff d0 call *%eax +c0109842: eb 0f jmp c0109853 } else { putch(ch, putdat); -c0109ed2: 8b 45 0c mov 0xc(%ebp),%eax -c0109ed5: 89 44 24 04 mov %eax,0x4(%esp) -c0109ed9: 89 1c 24 mov %ebx,(%esp) -c0109edc: 8b 45 08 mov 0x8(%ebp),%eax -c0109edf: ff d0 call *%eax +c0109844: 8b 45 0c mov 0xc(%ebp),%eax +c0109847: 89 44 24 04 mov %eax,0x4(%esp) +c010984b: 89 1c 24 mov %ebx,(%esp) +c010984e: 8b 45 08 mov 0x8(%ebp),%eax +c0109851: ff d0 call *%eax for (; (ch = *p ++) != '\0' && (precision < 0 || -- precision >= 0); width --) { -c0109ee1: ff 4d e8 decl -0x18(%ebp) -c0109ee4: 89 f0 mov %esi,%eax -c0109ee6: 8d 70 01 lea 0x1(%eax),%esi -c0109ee9: 0f b6 00 movzbl (%eax),%eax -c0109eec: 0f be d8 movsbl %al,%ebx -c0109eef: 85 db test %ebx,%ebx -c0109ef1: 74 27 je c0109f1a -c0109ef3: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) -c0109ef7: 78 b4 js c0109ead -c0109ef9: ff 4d e4 decl -0x1c(%ebp) -c0109efc: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) -c0109f00: 79 ab jns c0109ead +c0109853: ff 4d e8 decl -0x18(%ebp) +c0109856: 89 f0 mov %esi,%eax +c0109858: 8d 70 01 lea 0x1(%eax),%esi +c010985b: 0f b6 00 movzbl (%eax),%eax +c010985e: 0f be d8 movsbl %al,%ebx +c0109861: 85 db test %ebx,%ebx +c0109863: 74 27 je c010988c +c0109865: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) +c0109869: 78 b4 js c010981f +c010986b: ff 4d e4 decl -0x1c(%ebp) +c010986e: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) +c0109872: 79 ab jns c010981f } } for (; width > 0; width --) { -c0109f02: eb 16 jmp c0109f1a +c0109874: eb 16 jmp c010988c putch(' ', putdat); -c0109f04: 8b 45 0c mov 0xc(%ebp),%eax -c0109f07: 89 44 24 04 mov %eax,0x4(%esp) -c0109f0b: c7 04 24 20 00 00 00 movl $0x20,(%esp) -c0109f12: 8b 45 08 mov 0x8(%ebp),%eax -c0109f15: ff d0 call *%eax +c0109876: 8b 45 0c mov 0xc(%ebp),%eax +c0109879: 89 44 24 04 mov %eax,0x4(%esp) +c010987d: c7 04 24 20 00 00 00 movl $0x20,(%esp) +c0109884: 8b 45 08 mov 0x8(%ebp),%eax +c0109887: ff d0 call *%eax for (; width > 0; width --) { -c0109f17: ff 4d e8 decl -0x18(%ebp) -c0109f1a: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) -c0109f1e: 7f e4 jg c0109f04 +c0109889: ff 4d e8 decl -0x18(%ebp) +c010988c: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) +c0109890: 7f e4 jg c0109876 + } + break; +c0109892: e9 6c 01 00 00 jmp c0109a03 + + // (signed) decimal + case 'd': + num = getint(&ap, lflag); +c0109897: 8b 45 e0 mov -0x20(%ebp),%eax +c010989a: 89 44 24 04 mov %eax,0x4(%esp) +c010989e: 8d 45 14 lea 0x14(%ebp),%eax +c01098a1: 89 04 24 mov %eax,(%esp) +c01098a4: e8 16 fd ff ff call c01095bf +c01098a9: 89 45 f0 mov %eax,-0x10(%ebp) +c01098ac: 89 55 f4 mov %edx,-0xc(%ebp) + if ((long long)num < 0) { +c01098af: 8b 45 f0 mov -0x10(%ebp),%eax +c01098b2: 8b 55 f4 mov -0xc(%ebp),%edx +c01098b5: 85 d2 test %edx,%edx +c01098b7: 79 26 jns c01098df + putch('-', putdat); +c01098b9: 8b 45 0c mov 0xc(%ebp),%eax +c01098bc: 89 44 24 04 mov %eax,0x4(%esp) +c01098c0: c7 04 24 2d 00 00 00 movl $0x2d,(%esp) +c01098c7: 8b 45 08 mov 0x8(%ebp),%eax +c01098ca: ff d0 call *%eax + num = -(long long)num; +c01098cc: 8b 45 f0 mov -0x10(%ebp),%eax +c01098cf: 8b 55 f4 mov -0xc(%ebp),%edx +c01098d2: f7 d8 neg %eax +c01098d4: 83 d2 00 adc $0x0,%edx +c01098d7: f7 da neg %edx +c01098d9: 89 45 f0 mov %eax,-0x10(%ebp) +c01098dc: 89 55 f4 mov %edx,-0xc(%ebp) } + base = 10; +c01098df: c7 45 ec 0a 00 00 00 movl $0xa,-0x14(%ebp) + goto number; +c01098e6: e9 a8 00 00 00 jmp c0109993 + + // unsigned decimal + case 'u': + num = getuint(&ap, lflag); +c01098eb: 8b 45 e0 mov -0x20(%ebp),%eax +c01098ee: 89 44 24 04 mov %eax,0x4(%esp) +c01098f2: 8d 45 14 lea 0x14(%ebp),%eax +c01098f5: 89 04 24 mov %eax,(%esp) +c01098f8: e8 73 fc ff ff call c0109570 +c01098fd: 89 45 f0 mov %eax,-0x10(%ebp) +c0109900: 89 55 f4 mov %edx,-0xc(%ebp) + base = 10; +c0109903: c7 45 ec 0a 00 00 00 movl $0xa,-0x14(%ebp) + goto number; +c010990a: e9 84 00 00 00 jmp c0109993 + + // (unsigned) octal + case 'o': + num = getuint(&ap, lflag); +c010990f: 8b 45 e0 mov -0x20(%ebp),%eax +c0109912: 89 44 24 04 mov %eax,0x4(%esp) +c0109916: 8d 45 14 lea 0x14(%ebp),%eax +c0109919: 89 04 24 mov %eax,(%esp) +c010991c: e8 4f fc ff ff call c0109570 +c0109921: 89 45 f0 mov %eax,-0x10(%ebp) +c0109924: 89 55 f4 mov %edx,-0xc(%ebp) + base = 8; +c0109927: c7 45 ec 08 00 00 00 movl $0x8,-0x14(%ebp) + goto number; +c010992e: eb 63 jmp c0109993 + + // pointer + case 'p': + putch('0', putdat); +c0109930: 8b 45 0c mov 0xc(%ebp),%eax +c0109933: 89 44 24 04 mov %eax,0x4(%esp) +c0109937: c7 04 24 30 00 00 00 movl $0x30,(%esp) +c010993e: 8b 45 08 mov 0x8(%ebp),%eax +c0109941: ff d0 call *%eax + putch('x', putdat); +c0109943: 8b 45 0c mov 0xc(%ebp),%eax +c0109946: 89 44 24 04 mov %eax,0x4(%esp) +c010994a: c7 04 24 78 00 00 00 movl $0x78,(%esp) +c0109951: 8b 45 08 mov 0x8(%ebp),%eax +c0109954: ff d0 call *%eax + num = (unsigned long long)(uintptr_t)va_arg(ap, void *); +c0109956: 8b 45 14 mov 0x14(%ebp),%eax +c0109959: 8d 50 04 lea 0x4(%eax),%edx +c010995c: 89 55 14 mov %edx,0x14(%ebp) +c010995f: 8b 00 mov (%eax),%eax +c0109961: 89 45 f0 mov %eax,-0x10(%ebp) +c0109964: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) + base = 16; +c010996b: c7 45 ec 10 00 00 00 movl $0x10,-0x14(%ebp) + goto number; +c0109972: eb 1f jmp c0109993 + + // (unsigned) hexadecimal + case 'x': + num = getuint(&ap, lflag); +c0109974: 8b 45 e0 mov -0x20(%ebp),%eax +c0109977: 89 44 24 04 mov %eax,0x4(%esp) +c010997b: 8d 45 14 lea 0x14(%ebp),%eax +c010997e: 89 04 24 mov %eax,(%esp) +c0109981: e8 ea fb ff ff call c0109570 +c0109986: 89 45 f0 mov %eax,-0x10(%ebp) +c0109989: 89 55 f4 mov %edx,-0xc(%ebp) + base = 16; +c010998c: c7 45 ec 10 00 00 00 movl $0x10,-0x14(%ebp) + number: + printnum(putch, putdat, num, base, width, padc); +c0109993: 0f be 55 db movsbl -0x25(%ebp),%edx +c0109997: 8b 45 ec mov -0x14(%ebp),%eax +c010999a: 89 54 24 18 mov %edx,0x18(%esp) +c010999e: 8b 55 e8 mov -0x18(%ebp),%edx +c01099a1: 89 54 24 14 mov %edx,0x14(%esp) +c01099a5: 89 44 24 10 mov %eax,0x10(%esp) +c01099a9: 8b 45 f0 mov -0x10(%ebp),%eax +c01099ac: 8b 55 f4 mov -0xc(%ebp),%edx +c01099af: 89 44 24 08 mov %eax,0x8(%esp) +c01099b3: 89 54 24 0c mov %edx,0xc(%esp) +c01099b7: 8b 45 0c mov 0xc(%ebp),%eax +c01099ba: 89 44 24 04 mov %eax,0x4(%esp) +c01099be: 8b 45 08 mov 0x8(%ebp),%eax +c01099c1: 89 04 24 mov %eax,(%esp) +c01099c4: e8 a5 fa ff ff call c010946e + break; +c01099c9: eb 38 jmp c0109a03 + + // escaped '%' character + case '%': + putch(ch, putdat); +c01099cb: 8b 45 0c mov 0xc(%ebp),%eax +c01099ce: 89 44 24 04 mov %eax,0x4(%esp) +c01099d2: 89 1c 24 mov %ebx,(%esp) +c01099d5: 8b 45 08 mov 0x8(%ebp),%eax +c01099d8: ff d0 call *%eax + break; +c01099da: eb 27 jmp c0109a03 + + // unrecognized escape sequence - just print it literally + default: + putch('%', putdat); +c01099dc: 8b 45 0c mov 0xc(%ebp),%eax +c01099df: 89 44 24 04 mov %eax,0x4(%esp) +c01099e3: c7 04 24 25 00 00 00 movl $0x25,(%esp) +c01099ea: 8b 45 08 mov 0x8(%ebp),%eax +c01099ed: ff d0 call *%eax + for (fmt --; fmt[-1] != '%'; fmt --) +c01099ef: ff 4d 10 decl 0x10(%ebp) +c01099f2: eb 03 jmp c01099f7 +c01099f4: ff 4d 10 decl 0x10(%ebp) +c01099f7: 8b 45 10 mov 0x10(%ebp),%eax +c01099fa: 48 dec %eax +c01099fb: 0f b6 00 movzbl (%eax),%eax +c01099fe: 3c 25 cmp $0x25,%al +c0109a00: 75 f2 jne c01099f4 + /* do nothing */; + break; +c0109a02: 90 nop + while (1) { +c0109a03: e9 37 fc ff ff jmp c010963f + return; +c0109a08: 90 nop + } + } +} +c0109a09: 83 c4 40 add $0x40,%esp +c0109a0c: 5b pop %ebx +c0109a0d: 5e pop %esi +c0109a0e: 5d pop %ebp +c0109a0f: c3 ret + +c0109a10 : + * sprintputch - 'print' a single character in a buffer + * @ch: the character will be printed + * @b: the buffer to place the character @ch + * */ +static void +sprintputch(int ch, struct sprintbuf *b) { +c0109a10: 55 push %ebp +c0109a11: 89 e5 mov %esp,%ebp + b->cnt ++; +c0109a13: 8b 45 0c mov 0xc(%ebp),%eax +c0109a16: 8b 40 08 mov 0x8(%eax),%eax +c0109a19: 8d 50 01 lea 0x1(%eax),%edx +c0109a1c: 8b 45 0c mov 0xc(%ebp),%eax +c0109a1f: 89 50 08 mov %edx,0x8(%eax) + if (b->buf < b->ebuf) { +c0109a22: 8b 45 0c mov 0xc(%ebp),%eax +c0109a25: 8b 10 mov (%eax),%edx +c0109a27: 8b 45 0c mov 0xc(%ebp),%eax +c0109a2a: 8b 40 04 mov 0x4(%eax),%eax +c0109a2d: 39 c2 cmp %eax,%edx +c0109a2f: 73 12 jae c0109a43 + *b->buf ++ = ch; +c0109a31: 8b 45 0c mov 0xc(%ebp),%eax +c0109a34: 8b 00 mov (%eax),%eax +c0109a36: 8d 48 01 lea 0x1(%eax),%ecx +c0109a39: 8b 55 0c mov 0xc(%ebp),%edx +c0109a3c: 89 0a mov %ecx,(%edx) +c0109a3e: 8b 55 08 mov 0x8(%ebp),%edx +c0109a41: 88 10 mov %dl,(%eax) + } +} +c0109a43: 90 nop +c0109a44: 5d pop %ebp +c0109a45: c3 ret + +c0109a46 : + * @str: the buffer to place the result into + * @size: the size of buffer, including the trailing null space + * @fmt: the format string to use + * */ +int +snprintf(char *str, size_t size, const char *fmt, ...) { +c0109a46: 55 push %ebp +c0109a47: 89 e5 mov %esp,%ebp +c0109a49: 83 ec 28 sub $0x28,%esp + va_list ap; + int cnt; + va_start(ap, fmt); +c0109a4c: 8d 45 14 lea 0x14(%ebp),%eax +c0109a4f: 89 45 f0 mov %eax,-0x10(%ebp) + cnt = vsnprintf(str, size, fmt, ap); +c0109a52: 8b 45 f0 mov -0x10(%ebp),%eax +c0109a55: 89 44 24 0c mov %eax,0xc(%esp) +c0109a59: 8b 45 10 mov 0x10(%ebp),%eax +c0109a5c: 89 44 24 08 mov %eax,0x8(%esp) +c0109a60: 8b 45 0c mov 0xc(%ebp),%eax +c0109a63: 89 44 24 04 mov %eax,0x4(%esp) +c0109a67: 8b 45 08 mov 0x8(%ebp),%eax +c0109a6a: 89 04 24 mov %eax,(%esp) +c0109a6d: e8 0a 00 00 00 call c0109a7c +c0109a72: 89 45 f4 mov %eax,-0xc(%ebp) + va_end(ap); + return cnt; +c0109a75: 8b 45 f4 mov -0xc(%ebp),%eax +} +c0109a78: 89 ec mov %ebp,%esp +c0109a7a: 5d pop %ebp +c0109a7b: c3 ret + +c0109a7c : + * + * Call this function if you are already dealing with a va_list. + * Or you probably want snprintf() instead. + * */ +int +vsnprintf(char *str, size_t size, const char *fmt, va_list ap) { +c0109a7c: 55 push %ebp +c0109a7d: 89 e5 mov %esp,%ebp +c0109a7f: 83 ec 28 sub $0x28,%esp + struct sprintbuf b = {str, str + size - 1, 0}; +c0109a82: 8b 45 08 mov 0x8(%ebp),%eax +c0109a85: 89 45 ec mov %eax,-0x14(%ebp) +c0109a88: 8b 45 0c mov 0xc(%ebp),%eax +c0109a8b: 8d 50 ff lea -0x1(%eax),%edx +c0109a8e: 8b 45 08 mov 0x8(%ebp),%eax +c0109a91: 01 d0 add %edx,%eax +c0109a93: 89 45 f0 mov %eax,-0x10(%ebp) +c0109a96: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) + if (str == NULL || b.buf > b.ebuf) { +c0109a9d: 83 7d 08 00 cmpl $0x0,0x8(%ebp) +c0109aa1: 74 0a je c0109aad +c0109aa3: 8b 55 ec mov -0x14(%ebp),%edx +c0109aa6: 8b 45 f0 mov -0x10(%ebp),%eax +c0109aa9: 39 c2 cmp %eax,%edx +c0109aab: 76 07 jbe c0109ab4 + return -E_INVAL; +c0109aad: b8 fd ff ff ff mov $0xfffffffd,%eax +c0109ab2: eb 2a jmp c0109ade + } + // print the string to the buffer + vprintfmt((void*)sprintputch, &b, fmt, ap); +c0109ab4: 8b 45 14 mov 0x14(%ebp),%eax +c0109ab7: 89 44 24 0c mov %eax,0xc(%esp) +c0109abb: 8b 45 10 mov 0x10(%ebp),%eax +c0109abe: 89 44 24 08 mov %eax,0x8(%esp) +c0109ac2: 8d 45 ec lea -0x14(%ebp),%eax +c0109ac5: 89 44 24 04 mov %eax,0x4(%esp) +c0109ac9: c7 04 24 10 9a 10 c0 movl $0xc0109a10,(%esp) +c0109ad0: e8 62 fb ff ff call c0109637 + // null terminate the buffer + *b.buf = '\0'; +c0109ad5: 8b 45 ec mov -0x14(%ebp),%eax +c0109ad8: c6 00 00 movb $0x0,(%eax) + return b.cnt; +c0109adb: 8b 45 f4 mov -0xc(%ebp),%eax +} +c0109ade: 89 ec mov %ebp,%esp +c0109ae0: 5d pop %ebp +c0109ae1: c3 ret + +c0109ae2 : + * rand - returns a pseudo-random integer + * + * The rand() function return a value in the range [0, RAND_MAX]. + * */ +int +rand(void) { +c0109ae2: 55 push %ebp +c0109ae3: 89 e5 mov %esp,%ebp +c0109ae5: 57 push %edi +c0109ae6: 56 push %esi +c0109ae7: 53 push %ebx +c0109ae8: 83 ec 24 sub $0x24,%esp + next = (next * 0x5DEECE66DLL + 0xBLL) & ((1LL << 48) - 1); +c0109aeb: a1 88 8a 12 c0 mov 0xc0128a88,%eax +c0109af0: 8b 15 8c 8a 12 c0 mov 0xc0128a8c,%edx +c0109af6: 69 fa 6d e6 ec de imul $0xdeece66d,%edx,%edi +c0109afc: 6b f0 05 imul $0x5,%eax,%esi +c0109aff: 01 fe add %edi,%esi +c0109b01: bf 6d e6 ec de mov $0xdeece66d,%edi +c0109b06: f7 e7 mul %edi +c0109b08: 01 d6 add %edx,%esi +c0109b0a: 89 f2 mov %esi,%edx +c0109b0c: 83 c0 0b add $0xb,%eax +c0109b0f: 83 d2 00 adc $0x0,%edx +c0109b12: 89 c7 mov %eax,%edi +c0109b14: 83 e7 ff and $0xffffffff,%edi +c0109b17: 89 f9 mov %edi,%ecx +c0109b19: 0f b7 da movzwl %dx,%ebx +c0109b1c: 89 0d 88 8a 12 c0 mov %ecx,0xc0128a88 +c0109b22: 89 1d 8c 8a 12 c0 mov %ebx,0xc0128a8c + unsigned long long result = (next >> 12); +c0109b28: a1 88 8a 12 c0 mov 0xc0128a88,%eax +c0109b2d: 8b 15 8c 8a 12 c0 mov 0xc0128a8c,%edx +c0109b33: 0f ac d0 0c shrd $0xc,%edx,%eax +c0109b37: c1 ea 0c shr $0xc,%edx +c0109b3a: 89 45 e0 mov %eax,-0x20(%ebp) +c0109b3d: 89 55 e4 mov %edx,-0x1c(%ebp) + return (int)do_div(result, RAND_MAX + 1); +c0109b40: c7 45 dc 00 00 00 80 movl $0x80000000,-0x24(%ebp) +c0109b47: 8b 45 e0 mov -0x20(%ebp),%eax +c0109b4a: 8b 55 e4 mov -0x1c(%ebp),%edx +c0109b4d: 89 45 d8 mov %eax,-0x28(%ebp) +c0109b50: 89 55 e8 mov %edx,-0x18(%ebp) +c0109b53: 8b 45 e8 mov -0x18(%ebp),%eax +c0109b56: 89 45 ec mov %eax,-0x14(%ebp) +c0109b59: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) +c0109b5d: 74 1c je c0109b7b +c0109b5f: 8b 45 e8 mov -0x18(%ebp),%eax +c0109b62: ba 00 00 00 00 mov $0x0,%edx +c0109b67: f7 75 dc divl -0x24(%ebp) +c0109b6a: 89 55 ec mov %edx,-0x14(%ebp) +c0109b6d: 8b 45 e8 mov -0x18(%ebp),%eax +c0109b70: ba 00 00 00 00 mov $0x0,%edx +c0109b75: f7 75 dc divl -0x24(%ebp) +c0109b78: 89 45 e8 mov %eax,-0x18(%ebp) +c0109b7b: 8b 45 d8 mov -0x28(%ebp),%eax +c0109b7e: 8b 55 ec mov -0x14(%ebp),%edx +c0109b81: f7 75 dc divl -0x24(%ebp) +c0109b84: 89 45 d8 mov %eax,-0x28(%ebp) +c0109b87: 89 55 d4 mov %edx,-0x2c(%ebp) +c0109b8a: 8b 45 d8 mov -0x28(%ebp),%eax +c0109b8d: 8b 55 e8 mov -0x18(%ebp),%edx +c0109b90: 89 45 e0 mov %eax,-0x20(%ebp) +c0109b93: 89 55 e4 mov %edx,-0x1c(%ebp) +c0109b96: 8b 45 d4 mov -0x2c(%ebp),%eax +} +c0109b99: 83 c4 24 add $0x24,%esp +c0109b9c: 5b pop %ebx +c0109b9d: 5e pop %esi +c0109b9e: 5f pop %edi +c0109b9f: 5d pop %ebp +c0109ba0: c3 ret + +c0109ba1 : +/* * + * srand - seed the random number generator with the given number + * @seed: the required seed number + * */ +void +srand(unsigned int seed) { +c0109ba1: 55 push %ebp +c0109ba2: 89 e5 mov %esp,%ebp + next = seed; +c0109ba4: 8b 45 08 mov 0x8(%ebp),%eax +c0109ba7: ba 00 00 00 00 mov $0x0,%edx +c0109bac: a3 88 8a 12 c0 mov %eax,0xc0128a88 +c0109bb1: 89 15 8c 8a 12 c0 mov %edx,0xc0128a8c +} +c0109bb7: 90 nop +c0109bb8: 5d pop %ebp +c0109bb9: c3 ret + +c0109bba : + * @s: the input string + * + * The strlen() function returns the length of string @s. + * */ +size_t +strlen(const char *s) { +c0109bba: 55 push %ebp +c0109bbb: 89 e5 mov %esp,%ebp +c0109bbd: 83 ec 10 sub $0x10,%esp + size_t cnt = 0; +c0109bc0: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) + while (*s ++ != '\0') { +c0109bc7: eb 03 jmp c0109bcc + cnt ++; +c0109bc9: ff 45 fc incl -0x4(%ebp) + while (*s ++ != '\0') { +c0109bcc: 8b 45 08 mov 0x8(%ebp),%eax +c0109bcf: 8d 50 01 lea 0x1(%eax),%edx +c0109bd2: 89 55 08 mov %edx,0x8(%ebp) +c0109bd5: 0f b6 00 movzbl (%eax),%eax +c0109bd8: 84 c0 test %al,%al +c0109bda: 75 ed jne c0109bc9 + } + return cnt; +c0109bdc: 8b 45 fc mov -0x4(%ebp),%eax +} +c0109bdf: 89 ec mov %ebp,%esp +c0109be1: 5d pop %ebp +c0109be2: c3 ret + +c0109be3 : + * The return value is strlen(s), if that is less than @len, or + * @len if there is no '\0' character among the first @len characters + * pointed by @s. + * */ +size_t +strnlen(const char *s, size_t len) { +c0109be3: 55 push %ebp +c0109be4: 89 e5 mov %esp,%ebp +c0109be6: 83 ec 10 sub $0x10,%esp + size_t cnt = 0; +c0109be9: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) + while (cnt < len && *s ++ != '\0') { +c0109bf0: eb 03 jmp c0109bf5 + cnt ++; +c0109bf2: ff 45 fc incl -0x4(%ebp) + while (cnt < len && *s ++ != '\0') { +c0109bf5: 8b 45 fc mov -0x4(%ebp),%eax +c0109bf8: 3b 45 0c cmp 0xc(%ebp),%eax +c0109bfb: 73 10 jae c0109c0d +c0109bfd: 8b 45 08 mov 0x8(%ebp),%eax +c0109c00: 8d 50 01 lea 0x1(%eax),%edx +c0109c03: 89 55 08 mov %edx,0x8(%ebp) +c0109c06: 0f b6 00 movzbl (%eax),%eax +c0109c09: 84 c0 test %al,%al +c0109c0b: 75 e5 jne c0109bf2 + } + return cnt; +c0109c0d: 8b 45 fc mov -0x4(%ebp),%eax +} +c0109c10: 89 ec mov %ebp,%esp +c0109c12: 5d pop %ebp +c0109c13: c3 ret + +c0109c14 : + * To avoid overflows, the size of array pointed by @dst should be long enough to + * contain the same string as @src (including the terminating null character), and + * should not overlap in memory with @src. + * */ +char * +strcpy(char *dst, const char *src) { +c0109c14: 55 push %ebp +c0109c15: 89 e5 mov %esp,%ebp +c0109c17: 57 push %edi +c0109c18: 56 push %esi +c0109c19: 83 ec 20 sub $0x20,%esp +c0109c1c: 8b 45 08 mov 0x8(%ebp),%eax +c0109c1f: 89 45 f4 mov %eax,-0xc(%ebp) +c0109c22: 8b 45 0c mov 0xc(%ebp),%eax +c0109c25: 89 45 f0 mov %eax,-0x10(%ebp) +#ifndef __HAVE_ARCH_STRCPY +#define __HAVE_ARCH_STRCPY +static inline char * +__strcpy(char *dst, const char *src) { + int d0, d1, d2; + asm volatile ( +c0109c28: 8b 55 f0 mov -0x10(%ebp),%edx +c0109c2b: 8b 45 f4 mov -0xc(%ebp),%eax +c0109c2e: 89 d1 mov %edx,%ecx +c0109c30: 89 c2 mov %eax,%edx +c0109c32: 89 ce mov %ecx,%esi +c0109c34: 89 d7 mov %edx,%edi +c0109c36: ac lods %ds:(%esi),%al +c0109c37: aa stos %al,%es:(%edi) +c0109c38: 84 c0 test %al,%al +c0109c3a: 75 fa jne c0109c36 +c0109c3c: 89 fa mov %edi,%edx +c0109c3e: 89 f1 mov %esi,%ecx +c0109c40: 89 4d ec mov %ecx,-0x14(%ebp) +c0109c43: 89 55 e8 mov %edx,-0x18(%ebp) +c0109c46: 89 45 e4 mov %eax,-0x1c(%ebp) + "stosb;" + "testb %%al, %%al;" + "jne 1b;" + : "=&S" (d0), "=&D" (d1), "=&a" (d2) + : "0" (src), "1" (dst) : "memory"); + return dst; +c0109c49: 8b 45 f4 mov -0xc(%ebp),%eax + char *p = dst; + while ((*p ++ = *src ++) != '\0') + /* nothing */; + return dst; +#endif /* __HAVE_ARCH_STRCPY */ +} +c0109c4c: 83 c4 20 add $0x20,%esp +c0109c4f: 5e pop %esi +c0109c50: 5f pop %edi +c0109c51: 5d pop %ebp +c0109c52: c3 ret + +c0109c53 : + * @len: maximum number of characters to be copied from @src + * + * The return value is @dst + * */ +char * +strncpy(char *dst, const char *src, size_t len) { +c0109c53: 55 push %ebp +c0109c54: 89 e5 mov %esp,%ebp +c0109c56: 83 ec 10 sub $0x10,%esp + char *p = dst; +c0109c59: 8b 45 08 mov 0x8(%ebp),%eax +c0109c5c: 89 45 fc mov %eax,-0x4(%ebp) + while (len > 0) { +c0109c5f: eb 1e jmp c0109c7f + if ((*p = *src) != '\0') { +c0109c61: 8b 45 0c mov 0xc(%ebp),%eax +c0109c64: 0f b6 10 movzbl (%eax),%edx +c0109c67: 8b 45 fc mov -0x4(%ebp),%eax +c0109c6a: 88 10 mov %dl,(%eax) +c0109c6c: 8b 45 fc mov -0x4(%ebp),%eax +c0109c6f: 0f b6 00 movzbl (%eax),%eax +c0109c72: 84 c0 test %al,%al +c0109c74: 74 03 je c0109c79 + src ++; +c0109c76: ff 45 0c incl 0xc(%ebp) + } + p ++, len --; +c0109c79: ff 45 fc incl -0x4(%ebp) +c0109c7c: ff 4d 10 decl 0x10(%ebp) + while (len > 0) { +c0109c7f: 83 7d 10 00 cmpl $0x0,0x10(%ebp) +c0109c83: 75 dc jne c0109c61 + } + return dst; +c0109c85: 8b 45 08 mov 0x8(%ebp),%eax +} +c0109c88: 89 ec mov %ebp,%esp +c0109c8a: 5d pop %ebp +c0109c8b: c3 ret + +c0109c8c : + * - A value greater than zero indicates that the first character that does + * not match has a greater value in @s1 than in @s2; + * - And a value less than zero indicates the opposite. + * */ +int +strcmp(const char *s1, const char *s2) { +c0109c8c: 55 push %ebp +c0109c8d: 89 e5 mov %esp,%ebp +c0109c8f: 57 push %edi +c0109c90: 56 push %esi +c0109c91: 83 ec 20 sub $0x20,%esp +c0109c94: 8b 45 08 mov 0x8(%ebp),%eax +c0109c97: 89 45 f4 mov %eax,-0xc(%ebp) +c0109c9a: 8b 45 0c mov 0xc(%ebp),%eax +c0109c9d: 89 45 f0 mov %eax,-0x10(%ebp) + asm volatile ( +c0109ca0: 8b 55 f4 mov -0xc(%ebp),%edx +c0109ca3: 8b 45 f0 mov -0x10(%ebp),%eax +c0109ca6: 89 d1 mov %edx,%ecx +c0109ca8: 89 c2 mov %eax,%edx +c0109caa: 89 ce mov %ecx,%esi +c0109cac: 89 d7 mov %edx,%edi +c0109cae: ac lods %ds:(%esi),%al +c0109caf: ae scas %es:(%edi),%al +c0109cb0: 75 08 jne c0109cba +c0109cb2: 84 c0 test %al,%al +c0109cb4: 75 f8 jne c0109cae +c0109cb6: 31 c0 xor %eax,%eax +c0109cb8: eb 04 jmp c0109cbe +c0109cba: 19 c0 sbb %eax,%eax +c0109cbc: 0c 01 or $0x1,%al +c0109cbe: 89 fa mov %edi,%edx +c0109cc0: 89 f1 mov %esi,%ecx +c0109cc2: 89 45 ec mov %eax,-0x14(%ebp) +c0109cc5: 89 4d e8 mov %ecx,-0x18(%ebp) +c0109cc8: 89 55 e4 mov %edx,-0x1c(%ebp) + return ret; +c0109ccb: 8b 45 ec mov -0x14(%ebp),%eax + while (*s1 != '\0' && *s1 == *s2) { + s1 ++, s2 ++; + } + return (int)((unsigned char)*s1 - (unsigned char)*s2); +#endif /* __HAVE_ARCH_STRCMP */ +} +c0109cce: 83 c4 20 add $0x20,%esp +c0109cd1: 5e pop %esi +c0109cd2: 5f pop %edi +c0109cd3: 5d pop %ebp +c0109cd4: c3 ret + +c0109cd5 : + * they are equal to each other, it continues with the following pairs until + * the characters differ, until a terminating null-character is reached, or + * until @n characters match in both strings, whichever happens first. + * */ +int +strncmp(const char *s1, const char *s2, size_t n) { +c0109cd5: 55 push %ebp +c0109cd6: 89 e5 mov %esp,%ebp + while (n > 0 && *s1 != '\0' && *s1 == *s2) { +c0109cd8: eb 09 jmp c0109ce3 + n --, s1 ++, s2 ++; +c0109cda: ff 4d 10 decl 0x10(%ebp) +c0109cdd: ff 45 08 incl 0x8(%ebp) +c0109ce0: ff 45 0c incl 0xc(%ebp) + while (n > 0 && *s1 != '\0' && *s1 == *s2) { +c0109ce3: 83 7d 10 00 cmpl $0x0,0x10(%ebp) +c0109ce7: 74 1a je c0109d03 +c0109ce9: 8b 45 08 mov 0x8(%ebp),%eax +c0109cec: 0f b6 00 movzbl (%eax),%eax +c0109cef: 84 c0 test %al,%al +c0109cf1: 74 10 je c0109d03 +c0109cf3: 8b 45 08 mov 0x8(%ebp),%eax +c0109cf6: 0f b6 10 movzbl (%eax),%edx +c0109cf9: 8b 45 0c mov 0xc(%ebp),%eax +c0109cfc: 0f b6 00 movzbl (%eax),%eax +c0109cff: 38 c2 cmp %al,%dl +c0109d01: 74 d7 je c0109cda + } + return (n == 0) ? 0 : (int)((unsigned char)*s1 - (unsigned char)*s2); +c0109d03: 83 7d 10 00 cmpl $0x0,0x10(%ebp) +c0109d07: 74 18 je c0109d21 +c0109d09: 8b 45 08 mov 0x8(%ebp),%eax +c0109d0c: 0f b6 00 movzbl (%eax),%eax +c0109d0f: 0f b6 d0 movzbl %al,%edx +c0109d12: 8b 45 0c mov 0xc(%ebp),%eax +c0109d15: 0f b6 00 movzbl (%eax),%eax +c0109d18: 0f b6 c8 movzbl %al,%ecx +c0109d1b: 89 d0 mov %edx,%eax +c0109d1d: 29 c8 sub %ecx,%eax +c0109d1f: eb 05 jmp c0109d26 +c0109d21: b8 00 00 00 00 mov $0x0,%eax +} +c0109d26: 5d pop %ebp +c0109d27: c3 ret + +c0109d28 : + * + * The strchr() function returns a pointer to the first occurrence of + * character in @s. If the value is not found, the function returns 'NULL'. + * */ +char * +strchr(const char *s, char c) { +c0109d28: 55 push %ebp +c0109d29: 89 e5 mov %esp,%ebp +c0109d2b: 83 ec 04 sub $0x4,%esp +c0109d2e: 8b 45 0c mov 0xc(%ebp),%eax +c0109d31: 88 45 fc mov %al,-0x4(%ebp) + while (*s != '\0') { +c0109d34: eb 13 jmp c0109d49 + if (*s == c) { +c0109d36: 8b 45 08 mov 0x8(%ebp),%eax +c0109d39: 0f b6 00 movzbl (%eax),%eax +c0109d3c: 38 45 fc cmp %al,-0x4(%ebp) +c0109d3f: 75 05 jne c0109d46 + return (char *)s; +c0109d41: 8b 45 08 mov 0x8(%ebp),%eax +c0109d44: eb 12 jmp c0109d58 + } + s ++; +c0109d46: ff 45 08 incl 0x8(%ebp) + while (*s != '\0') { +c0109d49: 8b 45 08 mov 0x8(%ebp),%eax +c0109d4c: 0f b6 00 movzbl (%eax),%eax +c0109d4f: 84 c0 test %al,%al +c0109d51: 75 e3 jne c0109d36 + } + return NULL; +c0109d53: b8 00 00 00 00 mov $0x0,%eax +} +c0109d58: 89 ec mov %ebp,%esp +c0109d5a: 5d pop %ebp +c0109d5b: c3 ret + +c0109d5c : + * The strfind() function is like strchr() except that if @c is + * not found in @s, then it returns a pointer to the null byte at the + * end of @s, rather than 'NULL'. + * */ +char * +strfind(const char *s, char c) { +c0109d5c: 55 push %ebp +c0109d5d: 89 e5 mov %esp,%ebp +c0109d5f: 83 ec 04 sub $0x4,%esp +c0109d62: 8b 45 0c mov 0xc(%ebp),%eax +c0109d65: 88 45 fc mov %al,-0x4(%ebp) + while (*s != '\0') { +c0109d68: eb 0e jmp c0109d78 + if (*s == c) { +c0109d6a: 8b 45 08 mov 0x8(%ebp),%eax +c0109d6d: 0f b6 00 movzbl (%eax),%eax +c0109d70: 38 45 fc cmp %al,-0x4(%ebp) +c0109d73: 74 0f je c0109d84 + break; + } + s ++; +c0109d75: ff 45 08 incl 0x8(%ebp) + while (*s != '\0') { +c0109d78: 8b 45 08 mov 0x8(%ebp),%eax +c0109d7b: 0f b6 00 movzbl (%eax),%eax +c0109d7e: 84 c0 test %al,%al +c0109d80: 75 e8 jne c0109d6a +c0109d82: eb 01 jmp c0109d85 break; -c0109f20: e9 6c 01 00 00 jmp c010a091 +c0109d84: 90 nop + } + return (char *)s; +c0109d85: 8b 45 08 mov 0x8(%ebp),%eax +} +c0109d88: 89 ec mov %ebp,%esp +c0109d8a: 5d pop %ebp +c0109d8b: c3 ret - // (signed) decimal - case 'd': - num = getint(&ap, lflag); -c0109f25: 8b 45 e0 mov -0x20(%ebp),%eax -c0109f28: 89 44 24 04 mov %eax,0x4(%esp) -c0109f2c: 8d 45 14 lea 0x14(%ebp),%eax -c0109f2f: 89 04 24 mov %eax,(%esp) -c0109f32: e8 0b fd ff ff call c0109c42 -c0109f37: 89 45 f0 mov %eax,-0x10(%ebp) -c0109f3a: 89 55 f4 mov %edx,-0xc(%ebp) - if ((long long)num < 0) { -c0109f3d: 8b 45 f0 mov -0x10(%ebp),%eax -c0109f40: 8b 55 f4 mov -0xc(%ebp),%edx -c0109f43: 85 d2 test %edx,%edx -c0109f45: 79 26 jns c0109f6d - putch('-', putdat); -c0109f47: 8b 45 0c mov 0xc(%ebp),%eax -c0109f4a: 89 44 24 04 mov %eax,0x4(%esp) -c0109f4e: c7 04 24 2d 00 00 00 movl $0x2d,(%esp) -c0109f55: 8b 45 08 mov 0x8(%ebp),%eax -c0109f58: ff d0 call *%eax - num = -(long long)num; -c0109f5a: 8b 45 f0 mov -0x10(%ebp),%eax -c0109f5d: 8b 55 f4 mov -0xc(%ebp),%edx -c0109f60: f7 d8 neg %eax -c0109f62: 83 d2 00 adc $0x0,%edx -c0109f65: f7 da neg %edx -c0109f67: 89 45 f0 mov %eax,-0x10(%ebp) -c0109f6a: 89 55 f4 mov %edx,-0xc(%ebp) - } - base = 10; -c0109f6d: c7 45 ec 0a 00 00 00 movl $0xa,-0x14(%ebp) - goto number; -c0109f74: e9 a8 00 00 00 jmp c010a021 +c0109d8c : + * an optional "0x" or "0X" prefix. + * + * The strtol() function returns the converted integral number as a long int value. + * */ +long +strtol(const char *s, char **endptr, int base) { +c0109d8c: 55 push %ebp +c0109d8d: 89 e5 mov %esp,%ebp +c0109d8f: 83 ec 10 sub $0x10,%esp + int neg = 0; +c0109d92: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) + long val = 0; +c0109d99: c7 45 f8 00 00 00 00 movl $0x0,-0x8(%ebp) - // unsigned decimal - case 'u': - num = getuint(&ap, lflag); -c0109f79: 8b 45 e0 mov -0x20(%ebp),%eax -c0109f7c: 89 44 24 04 mov %eax,0x4(%esp) -c0109f80: 8d 45 14 lea 0x14(%ebp),%eax -c0109f83: 89 04 24 mov %eax,(%esp) -c0109f86: e8 64 fc ff ff call c0109bef -c0109f8b: 89 45 f0 mov %eax,-0x10(%ebp) -c0109f8e: 89 55 f4 mov %edx,-0xc(%ebp) - base = 10; -c0109f91: c7 45 ec 0a 00 00 00 movl $0xa,-0x14(%ebp) - goto number; -c0109f98: e9 84 00 00 00 jmp c010a021 + // gobble initial whitespace + while (*s == ' ' || *s == '\t') { +c0109da0: eb 03 jmp c0109da5 + s ++; +c0109da2: ff 45 08 incl 0x8(%ebp) + while (*s == ' ' || *s == '\t') { +c0109da5: 8b 45 08 mov 0x8(%ebp),%eax +c0109da8: 0f b6 00 movzbl (%eax),%eax +c0109dab: 3c 20 cmp $0x20,%al +c0109dad: 74 f3 je c0109da2 +c0109daf: 8b 45 08 mov 0x8(%ebp),%eax +c0109db2: 0f b6 00 movzbl (%eax),%eax +c0109db5: 3c 09 cmp $0x9,%al +c0109db7: 74 e9 je c0109da2 + } - // (unsigned) octal - case 'o': - num = getuint(&ap, lflag); -c0109f9d: 8b 45 e0 mov -0x20(%ebp),%eax -c0109fa0: 89 44 24 04 mov %eax,0x4(%esp) -c0109fa4: 8d 45 14 lea 0x14(%ebp),%eax -c0109fa7: 89 04 24 mov %eax,(%esp) -c0109faa: e8 40 fc ff ff call c0109bef -c0109faf: 89 45 f0 mov %eax,-0x10(%ebp) -c0109fb2: 89 55 f4 mov %edx,-0xc(%ebp) - base = 8; -c0109fb5: c7 45 ec 08 00 00 00 movl $0x8,-0x14(%ebp) - goto number; -c0109fbc: eb 63 jmp c010a021 + // plus/minus sign + if (*s == '+') { +c0109db9: 8b 45 08 mov 0x8(%ebp),%eax +c0109dbc: 0f b6 00 movzbl (%eax),%eax +c0109dbf: 3c 2b cmp $0x2b,%al +c0109dc1: 75 05 jne c0109dc8 + s ++; +c0109dc3: ff 45 08 incl 0x8(%ebp) +c0109dc6: eb 14 jmp c0109ddc + } + else if (*s == '-') { +c0109dc8: 8b 45 08 mov 0x8(%ebp),%eax +c0109dcb: 0f b6 00 movzbl (%eax),%eax +c0109dce: 3c 2d cmp $0x2d,%al +c0109dd0: 75 0a jne c0109ddc + s ++, neg = 1; +c0109dd2: ff 45 08 incl 0x8(%ebp) +c0109dd5: c7 45 fc 01 00 00 00 movl $0x1,-0x4(%ebp) + } - // pointer - case 'p': - putch('0', putdat); -c0109fbe: 8b 45 0c mov 0xc(%ebp),%eax -c0109fc1: 89 44 24 04 mov %eax,0x4(%esp) -c0109fc5: c7 04 24 30 00 00 00 movl $0x30,(%esp) -c0109fcc: 8b 45 08 mov 0x8(%ebp),%eax -c0109fcf: ff d0 call *%eax - putch('x', putdat); -c0109fd1: 8b 45 0c mov 0xc(%ebp),%eax -c0109fd4: 89 44 24 04 mov %eax,0x4(%esp) -c0109fd8: c7 04 24 78 00 00 00 movl $0x78,(%esp) -c0109fdf: 8b 45 08 mov 0x8(%ebp),%eax -c0109fe2: ff d0 call *%eax - num = (unsigned long long)(uintptr_t)va_arg(ap, void *); -c0109fe4: 8b 45 14 mov 0x14(%ebp),%eax -c0109fe7: 8d 50 04 lea 0x4(%eax),%edx -c0109fea: 89 55 14 mov %edx,0x14(%ebp) -c0109fed: 8b 00 mov (%eax),%eax -c0109fef: 89 45 f0 mov %eax,-0x10(%ebp) -c0109ff2: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) - base = 16; -c0109ff9: c7 45 ec 10 00 00 00 movl $0x10,-0x14(%ebp) - goto number; -c010a000: eb 1f jmp c010a021 + // hex or octal base prefix + if ((base == 0 || base == 16) && (s[0] == '0' && s[1] == 'x')) { +c0109ddc: 83 7d 10 00 cmpl $0x0,0x10(%ebp) +c0109de0: 74 06 je c0109de8 +c0109de2: 83 7d 10 10 cmpl $0x10,0x10(%ebp) +c0109de6: 75 22 jne c0109e0a +c0109de8: 8b 45 08 mov 0x8(%ebp),%eax +c0109deb: 0f b6 00 movzbl (%eax),%eax +c0109dee: 3c 30 cmp $0x30,%al +c0109df0: 75 18 jne c0109e0a +c0109df2: 8b 45 08 mov 0x8(%ebp),%eax +c0109df5: 40 inc %eax +c0109df6: 0f b6 00 movzbl (%eax),%eax +c0109df9: 3c 78 cmp $0x78,%al +c0109dfb: 75 0d jne c0109e0a + s += 2, base = 16; +c0109dfd: 83 45 08 02 addl $0x2,0x8(%ebp) +c0109e01: c7 45 10 10 00 00 00 movl $0x10,0x10(%ebp) +c0109e08: eb 29 jmp c0109e33 + } + else if (base == 0 && s[0] == '0') { +c0109e0a: 83 7d 10 00 cmpl $0x0,0x10(%ebp) +c0109e0e: 75 16 jne c0109e26 +c0109e10: 8b 45 08 mov 0x8(%ebp),%eax +c0109e13: 0f b6 00 movzbl (%eax),%eax +c0109e16: 3c 30 cmp $0x30,%al +c0109e18: 75 0c jne c0109e26 + s ++, base = 8; +c0109e1a: ff 45 08 incl 0x8(%ebp) +c0109e1d: c7 45 10 08 00 00 00 movl $0x8,0x10(%ebp) +c0109e24: eb 0d jmp c0109e33 + } + else if (base == 0) { +c0109e26: 83 7d 10 00 cmpl $0x0,0x10(%ebp) +c0109e2a: 75 07 jne c0109e33 + base = 10; +c0109e2c: c7 45 10 0a 00 00 00 movl $0xa,0x10(%ebp) - // (unsigned) hexadecimal - case 'x': - num = getuint(&ap, lflag); -c010a002: 8b 45 e0 mov -0x20(%ebp),%eax -c010a005: 89 44 24 04 mov %eax,0x4(%esp) -c010a009: 8d 45 14 lea 0x14(%ebp),%eax -c010a00c: 89 04 24 mov %eax,(%esp) -c010a00f: e8 db fb ff ff call c0109bef -c010a014: 89 45 f0 mov %eax,-0x10(%ebp) -c010a017: 89 55 f4 mov %edx,-0xc(%ebp) - base = 16; -c010a01a: c7 45 ec 10 00 00 00 movl $0x10,-0x14(%ebp) - number: - printnum(putch, putdat, num, base, width, padc); -c010a021: 0f be 55 db movsbl -0x25(%ebp),%edx -c010a025: 8b 45 ec mov -0x14(%ebp),%eax -c010a028: 89 54 24 18 mov %edx,0x18(%esp) -c010a02c: 8b 55 e8 mov -0x18(%ebp),%edx -c010a02f: 89 54 24 14 mov %edx,0x14(%esp) -c010a033: 89 44 24 10 mov %eax,0x10(%esp) -c010a037: 8b 45 f0 mov -0x10(%ebp),%eax -c010a03a: 8b 55 f4 mov -0xc(%ebp),%edx -c010a03d: 89 44 24 08 mov %eax,0x8(%esp) -c010a041: 89 54 24 0c mov %edx,0xc(%esp) -c010a045: 8b 45 0c mov 0xc(%ebp),%eax -c010a048: 89 44 24 04 mov %eax,0x4(%esp) -c010a04c: 8b 45 08 mov 0x8(%ebp),%eax -c010a04f: 89 04 24 mov %eax,(%esp) -c010a052: e8 94 fa ff ff call c0109aeb - break; -c010a057: eb 38 jmp c010a091 + // digits + while (1) { + int dig; - // escaped '%' character - case '%': - putch(ch, putdat); -c010a059: 8b 45 0c mov 0xc(%ebp),%eax -c010a05c: 89 44 24 04 mov %eax,0x4(%esp) -c010a060: 89 1c 24 mov %ebx,(%esp) -c010a063: 8b 45 08 mov 0x8(%ebp),%eax -c010a066: ff d0 call *%eax + if (*s >= '0' && *s <= '9') { +c0109e33: 8b 45 08 mov 0x8(%ebp),%eax +c0109e36: 0f b6 00 movzbl (%eax),%eax +c0109e39: 3c 2f cmp $0x2f,%al +c0109e3b: 7e 1b jle c0109e58 +c0109e3d: 8b 45 08 mov 0x8(%ebp),%eax +c0109e40: 0f b6 00 movzbl (%eax),%eax +c0109e43: 3c 39 cmp $0x39,%al +c0109e45: 7f 11 jg c0109e58 + dig = *s - '0'; +c0109e47: 8b 45 08 mov 0x8(%ebp),%eax +c0109e4a: 0f b6 00 movzbl (%eax),%eax +c0109e4d: 0f be c0 movsbl %al,%eax +c0109e50: 83 e8 30 sub $0x30,%eax +c0109e53: 89 45 f4 mov %eax,-0xc(%ebp) +c0109e56: eb 48 jmp c0109ea0 + } + else if (*s >= 'a' && *s <= 'z') { +c0109e58: 8b 45 08 mov 0x8(%ebp),%eax +c0109e5b: 0f b6 00 movzbl (%eax),%eax +c0109e5e: 3c 60 cmp $0x60,%al +c0109e60: 7e 1b jle c0109e7d +c0109e62: 8b 45 08 mov 0x8(%ebp),%eax +c0109e65: 0f b6 00 movzbl (%eax),%eax +c0109e68: 3c 7a cmp $0x7a,%al +c0109e6a: 7f 11 jg c0109e7d + dig = *s - 'a' + 10; +c0109e6c: 8b 45 08 mov 0x8(%ebp),%eax +c0109e6f: 0f b6 00 movzbl (%eax),%eax +c0109e72: 0f be c0 movsbl %al,%eax +c0109e75: 83 e8 57 sub $0x57,%eax +c0109e78: 89 45 f4 mov %eax,-0xc(%ebp) +c0109e7b: eb 23 jmp c0109ea0 + } + else if (*s >= 'A' && *s <= 'Z') { +c0109e7d: 8b 45 08 mov 0x8(%ebp),%eax +c0109e80: 0f b6 00 movzbl (%eax),%eax +c0109e83: 3c 40 cmp $0x40,%al +c0109e85: 7e 3b jle c0109ec2 +c0109e87: 8b 45 08 mov 0x8(%ebp),%eax +c0109e8a: 0f b6 00 movzbl (%eax),%eax +c0109e8d: 3c 5a cmp $0x5a,%al +c0109e8f: 7f 31 jg c0109ec2 + dig = *s - 'A' + 10; +c0109e91: 8b 45 08 mov 0x8(%ebp),%eax +c0109e94: 0f b6 00 movzbl (%eax),%eax +c0109e97: 0f be c0 movsbl %al,%eax +c0109e9a: 83 e8 37 sub $0x37,%eax +c0109e9d: 89 45 f4 mov %eax,-0xc(%ebp) + } + else { break; -c010a068: eb 27 jmp c010a091 - - // unrecognized escape sequence - just print it literally - default: - putch('%', putdat); -c010a06a: 8b 45 0c mov 0xc(%ebp),%eax -c010a06d: 89 44 24 04 mov %eax,0x4(%esp) -c010a071: c7 04 24 25 00 00 00 movl $0x25,(%esp) -c010a078: 8b 45 08 mov 0x8(%ebp),%eax -c010a07b: ff d0 call *%eax - for (fmt --; fmt[-1] != '%'; fmt --) -c010a07d: ff 4d 10 decl 0x10(%ebp) -c010a080: eb 03 jmp c010a085 -c010a082: ff 4d 10 decl 0x10(%ebp) -c010a085: 8b 45 10 mov 0x10(%ebp),%eax -c010a088: 48 dec %eax -c010a089: 0f b6 00 movzbl (%eax),%eax -c010a08c: 3c 25 cmp $0x25,%al -c010a08e: 75 f2 jne c010a082 - /* do nothing */; + } + if (dig >= base) { +c0109ea0: 8b 45 f4 mov -0xc(%ebp),%eax +c0109ea3: 3b 45 10 cmp 0x10(%ebp),%eax +c0109ea6: 7d 19 jge c0109ec1 break; -c010a090: 90 nop - while (1) { -c010a091: e9 36 fc ff ff jmp c0109ccc - return; -c010a096: 90 nop } + s ++, val = (val * base) + dig; +c0109ea8: ff 45 08 incl 0x8(%ebp) +c0109eab: 8b 45 f8 mov -0x8(%ebp),%eax +c0109eae: 0f af 45 10 imul 0x10(%ebp),%eax +c0109eb2: 89 c2 mov %eax,%edx +c0109eb4: 8b 45 f4 mov -0xc(%ebp),%eax +c0109eb7: 01 d0 add %edx,%eax +c0109eb9: 89 45 f8 mov %eax,-0x8(%ebp) + while (1) { +c0109ebc: e9 72 ff ff ff jmp c0109e33 + break; +c0109ec1: 90 nop + // we don't properly detect overflow! } -} -c010a097: 83 c4 40 add $0x40,%esp -c010a09a: 5b pop %ebx -c010a09b: 5e pop %esi -c010a09c: 5d pop %ebp -c010a09d: c3 ret -c010a09e : - * sprintputch - 'print' a single character in a buffer - * @ch: the character will be printed - * @b: the buffer to place the character @ch - * */ -static void -sprintputch(int ch, struct sprintbuf *b) { -c010a09e: f3 0f 1e fb endbr32 -c010a0a2: 55 push %ebp -c010a0a3: 89 e5 mov %esp,%ebp - b->cnt ++; -c010a0a5: 8b 45 0c mov 0xc(%ebp),%eax -c010a0a8: 8b 40 08 mov 0x8(%eax),%eax -c010a0ab: 8d 50 01 lea 0x1(%eax),%edx -c010a0ae: 8b 45 0c mov 0xc(%ebp),%eax -c010a0b1: 89 50 08 mov %edx,0x8(%eax) - if (b->buf < b->ebuf) { -c010a0b4: 8b 45 0c mov 0xc(%ebp),%eax -c010a0b7: 8b 10 mov (%eax),%edx -c010a0b9: 8b 45 0c mov 0xc(%ebp),%eax -c010a0bc: 8b 40 04 mov 0x4(%eax),%eax -c010a0bf: 39 c2 cmp %eax,%edx -c010a0c1: 73 12 jae c010a0d5 - *b->buf ++ = ch; -c010a0c3: 8b 45 0c mov 0xc(%ebp),%eax -c010a0c6: 8b 00 mov (%eax),%eax -c010a0c8: 8d 48 01 lea 0x1(%eax),%ecx -c010a0cb: 8b 55 0c mov 0xc(%ebp),%edx -c010a0ce: 89 0a mov %ecx,(%edx) -c010a0d0: 8b 55 08 mov 0x8(%ebp),%edx -c010a0d3: 88 10 mov %dl,(%eax) + if (endptr) { +c0109ec2: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) +c0109ec6: 74 08 je c0109ed0 + *endptr = (char *) s; +c0109ec8: 8b 45 0c mov 0xc(%ebp),%eax +c0109ecb: 8b 55 08 mov 0x8(%ebp),%edx +c0109ece: 89 10 mov %edx,(%eax) } -} -c010a0d5: 90 nop -c010a0d6: 5d pop %ebp -c010a0d7: c3 ret - -c010a0d8 : - * @str: the buffer to place the result into - * @size: the size of buffer, including the trailing null space - * @fmt: the format string to use + return (neg ? -val : val); +c0109ed0: 83 7d fc 00 cmpl $0x0,-0x4(%ebp) +c0109ed4: 74 07 je c0109edd +c0109ed6: 8b 45 f8 mov -0x8(%ebp),%eax +c0109ed9: f7 d8 neg %eax +c0109edb: eb 03 jmp c0109ee0 +c0109edd: 8b 45 f8 mov -0x8(%ebp),%eax +} +c0109ee0: 89 ec mov %ebp,%esp +c0109ee2: 5d pop %ebp +c0109ee3: c3 ret + +c0109ee4 : + * @n: number of bytes to be set to the value + * + * The memset() function returns @s. * */ -int -snprintf(char *str, size_t size, const char *fmt, ...) { -c010a0d8: f3 0f 1e fb endbr32 -c010a0dc: 55 push %ebp -c010a0dd: 89 e5 mov %esp,%ebp -c010a0df: 83 ec 28 sub $0x28,%esp - va_list ap; - int cnt; - va_start(ap, fmt); -c010a0e2: 8d 45 14 lea 0x14(%ebp),%eax -c010a0e5: 89 45 f0 mov %eax,-0x10(%ebp) - cnt = vsnprintf(str, size, fmt, ap); -c010a0e8: 8b 45 f0 mov -0x10(%ebp),%eax -c010a0eb: 89 44 24 0c mov %eax,0xc(%esp) -c010a0ef: 8b 45 10 mov 0x10(%ebp),%eax -c010a0f2: 89 44 24 08 mov %eax,0x8(%esp) -c010a0f6: 8b 45 0c mov 0xc(%ebp),%eax -c010a0f9: 89 44 24 04 mov %eax,0x4(%esp) -c010a0fd: 8b 45 08 mov 0x8(%ebp),%eax -c010a100: 89 04 24 mov %eax,(%esp) -c010a103: e8 08 00 00 00 call c010a110 -c010a108: 89 45 f4 mov %eax,-0xc(%ebp) - va_end(ap); - return cnt; -c010a10b: 8b 45 f4 mov -0xc(%ebp),%eax +void * +memset(void *s, char c, size_t n) { +c0109ee4: 55 push %ebp +c0109ee5: 89 e5 mov %esp,%ebp +c0109ee7: 83 ec 28 sub $0x28,%esp +c0109eea: 89 7d fc mov %edi,-0x4(%ebp) +c0109eed: 8b 45 0c mov 0xc(%ebp),%eax +c0109ef0: 88 45 d8 mov %al,-0x28(%ebp) +#ifdef __HAVE_ARCH_MEMSET + return __memset(s, c, n); +c0109ef3: 0f be 55 d8 movsbl -0x28(%ebp),%edx +c0109ef7: 8b 45 08 mov 0x8(%ebp),%eax +c0109efa: 89 45 f8 mov %eax,-0x8(%ebp) +c0109efd: 88 55 f7 mov %dl,-0x9(%ebp) +c0109f00: 8b 45 10 mov 0x10(%ebp),%eax +c0109f03: 89 45 f0 mov %eax,-0x10(%ebp) +#ifndef __HAVE_ARCH_MEMSET +#define __HAVE_ARCH_MEMSET +static inline void * +__memset(void *s, char c, size_t n) { + int d0, d1; + asm volatile ( +c0109f06: 8b 4d f0 mov -0x10(%ebp),%ecx +c0109f09: 0f b6 45 f7 movzbl -0x9(%ebp),%eax +c0109f0d: 8b 55 f8 mov -0x8(%ebp),%edx +c0109f10: 89 d7 mov %edx,%edi +c0109f12: f3 aa rep stos %al,%es:(%edi) +c0109f14: 89 fa mov %edi,%edx +c0109f16: 89 4d ec mov %ecx,-0x14(%ebp) +c0109f19: 89 55 e8 mov %edx,-0x18(%ebp) + "rep; stosb;" + : "=&c" (d0), "=&D" (d1) + : "0" (n), "a" (c), "1" (s) + : "memory"); + return s; +c0109f1c: 8b 45 f8 mov -0x8(%ebp),%eax + while (n -- > 0) { + *p ++ = c; + } + return s; +#endif /* __HAVE_ARCH_MEMSET */ } -c010a10e: c9 leave -c010a10f: c3 ret +c0109f1f: 8b 7d fc mov -0x4(%ebp),%edi +c0109f22: 89 ec mov %ebp,%esp +c0109f24: 5d pop %ebp +c0109f25: c3 ret -c010a110 : +c0109f26 : + * @n: number of bytes to copy * - * Call this function if you are already dealing with a va_list. - * Or you probably want snprintf() instead. + * The memmove() function returns @dst. * */ -int -vsnprintf(char *str, size_t size, const char *fmt, va_list ap) { -c010a110: f3 0f 1e fb endbr32 -c010a114: 55 push %ebp -c010a115: 89 e5 mov %esp,%ebp -c010a117: 83 ec 28 sub $0x28,%esp - struct sprintbuf b = {str, str + size - 1, 0}; -c010a11a: 8b 45 08 mov 0x8(%ebp),%eax -c010a11d: 89 45 ec mov %eax,-0x14(%ebp) -c010a120: 8b 45 0c mov 0xc(%ebp),%eax -c010a123: 8d 50 ff lea -0x1(%eax),%edx -c010a126: 8b 45 08 mov 0x8(%ebp),%eax -c010a129: 01 d0 add %edx,%eax -c010a12b: 89 45 f0 mov %eax,-0x10(%ebp) -c010a12e: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) - if (str == NULL || b.buf > b.ebuf) { -c010a135: 83 7d 08 00 cmpl $0x0,0x8(%ebp) -c010a139: 74 0a je c010a145 -c010a13b: 8b 55 ec mov -0x14(%ebp),%edx -c010a13e: 8b 45 f0 mov -0x10(%ebp),%eax -c010a141: 39 c2 cmp %eax,%edx -c010a143: 76 07 jbe c010a14c - return -E_INVAL; -c010a145: b8 fd ff ff ff mov $0xfffffffd,%eax -c010a14a: eb 2a jmp c010a176 +void * +memmove(void *dst, const void *src, size_t n) { +c0109f26: 55 push %ebp +c0109f27: 89 e5 mov %esp,%ebp +c0109f29: 57 push %edi +c0109f2a: 56 push %esi +c0109f2b: 53 push %ebx +c0109f2c: 83 ec 30 sub $0x30,%esp +c0109f2f: 8b 45 08 mov 0x8(%ebp),%eax +c0109f32: 89 45 f0 mov %eax,-0x10(%ebp) +c0109f35: 8b 45 0c mov 0xc(%ebp),%eax +c0109f38: 89 45 ec mov %eax,-0x14(%ebp) +c0109f3b: 8b 45 10 mov 0x10(%ebp),%eax +c0109f3e: 89 45 e8 mov %eax,-0x18(%ebp) + +#ifndef __HAVE_ARCH_MEMMOVE +#define __HAVE_ARCH_MEMMOVE +static inline void * +__memmove(void *dst, const void *src, size_t n) { + if (dst < src) { +c0109f41: 8b 45 f0 mov -0x10(%ebp),%eax +c0109f44: 3b 45 ec cmp -0x14(%ebp),%eax +c0109f47: 73 42 jae c0109f8b +c0109f49: 8b 45 f0 mov -0x10(%ebp),%eax +c0109f4c: 89 45 e4 mov %eax,-0x1c(%ebp) +c0109f4f: 8b 45 ec mov -0x14(%ebp),%eax +c0109f52: 89 45 e0 mov %eax,-0x20(%ebp) +c0109f55: 8b 45 e8 mov -0x18(%ebp),%eax +c0109f58: 89 45 dc mov %eax,-0x24(%ebp) + "andl $3, %%ecx;" + "jz 1f;" + "rep; movsb;" + "1:" + : "=&c" (d0), "=&D" (d1), "=&S" (d2) + : "0" (n / 4), "g" (n), "1" (dst), "2" (src) +c0109f5b: 8b 45 dc mov -0x24(%ebp),%eax +c0109f5e: c1 e8 02 shr $0x2,%eax +c0109f61: 89 c1 mov %eax,%ecx + asm volatile ( +c0109f63: 8b 55 e4 mov -0x1c(%ebp),%edx +c0109f66: 8b 45 e0 mov -0x20(%ebp),%eax +c0109f69: 89 d7 mov %edx,%edi +c0109f6b: 89 c6 mov %eax,%esi +c0109f6d: f3 a5 rep movsl %ds:(%esi),%es:(%edi) +c0109f6f: 8b 4d dc mov -0x24(%ebp),%ecx +c0109f72: 83 e1 03 and $0x3,%ecx +c0109f75: 74 02 je c0109f79 +c0109f77: f3 a4 rep movsb %ds:(%esi),%es:(%edi) +c0109f79: 89 f0 mov %esi,%eax +c0109f7b: 89 fa mov %edi,%edx +c0109f7d: 89 4d d8 mov %ecx,-0x28(%ebp) +c0109f80: 89 55 d4 mov %edx,-0x2c(%ebp) +c0109f83: 89 45 d0 mov %eax,-0x30(%ebp) + : "memory"); + return dst; +c0109f86: 8b 45 e4 mov -0x1c(%ebp),%eax + return __memcpy(dst, src, n); +c0109f89: eb 36 jmp c0109fc1 + : "0" (n), "1" (n - 1 + src), "2" (n - 1 + dst) +c0109f8b: 8b 45 e8 mov -0x18(%ebp),%eax +c0109f8e: 8d 50 ff lea -0x1(%eax),%edx +c0109f91: 8b 45 ec mov -0x14(%ebp),%eax +c0109f94: 01 c2 add %eax,%edx +c0109f96: 8b 45 e8 mov -0x18(%ebp),%eax +c0109f99: 8d 48 ff lea -0x1(%eax),%ecx +c0109f9c: 8b 45 f0 mov -0x10(%ebp),%eax +c0109f9f: 8d 1c 01 lea (%ecx,%eax,1),%ebx + asm volatile ( +c0109fa2: 8b 45 e8 mov -0x18(%ebp),%eax +c0109fa5: 89 c1 mov %eax,%ecx +c0109fa7: 89 d8 mov %ebx,%eax +c0109fa9: 89 d6 mov %edx,%esi +c0109fab: 89 c7 mov %eax,%edi +c0109fad: fd std +c0109fae: f3 a4 rep movsb %ds:(%esi),%es:(%edi) +c0109fb0: fc cld +c0109fb1: 89 f8 mov %edi,%eax +c0109fb3: 89 f2 mov %esi,%edx +c0109fb5: 89 4d cc mov %ecx,-0x34(%ebp) +c0109fb8: 89 55 c8 mov %edx,-0x38(%ebp) +c0109fbb: 89 45 c4 mov %eax,-0x3c(%ebp) + return dst; +c0109fbe: 8b 45 f0 mov -0x10(%ebp),%eax + *d ++ = *s ++; + } } - // print the string to the buffer - vprintfmt((void*)sprintputch, &b, fmt, ap); -c010a14c: 8b 45 14 mov 0x14(%ebp),%eax -c010a14f: 89 44 24 0c mov %eax,0xc(%esp) -c010a153: 8b 45 10 mov 0x10(%ebp),%eax -c010a156: 89 44 24 08 mov %eax,0x8(%esp) -c010a15a: 8d 45 ec lea -0x14(%ebp),%eax -c010a15d: 89 44 24 04 mov %eax,0x4(%esp) -c010a161: c7 04 24 9e a0 10 c0 movl $0xc010a09e,(%esp) -c010a168: e8 53 fb ff ff call c0109cc0 - // null terminate the buffer - *b.buf = '\0'; -c010a16d: 8b 45 ec mov -0x14(%ebp),%eax -c010a170: c6 00 00 movb $0x0,(%eax) - return b.cnt; -c010a173: 8b 45 f4 mov -0xc(%ebp),%eax + return dst; +#endif /* __HAVE_ARCH_MEMMOVE */ } -c010a176: c9 leave -c010a177: c3 ret +c0109fc1: 83 c4 30 add $0x30,%esp +c0109fc4: 5b pop %ebx +c0109fc5: 5e pop %esi +c0109fc6: 5f pop %edi +c0109fc7: 5d pop %ebp +c0109fc8: c3 ret -c010a178 : - * @bits: the number of bits in a return value - * - * High bits are more random, so we use them. +c0109fc9 : + * it always copies exactly @n bytes. To avoid overflows, the size of arrays pointed + * by both @src and @dst, should be at least @n bytes, and should not overlap + * (for overlapping memory area, memmove is a safer approach). * */ -uint32_t -hash32(uint32_t val, unsigned int bits) { -c010a178: f3 0f 1e fb endbr32 -c010a17c: 55 push %ebp -c010a17d: 89 e5 mov %esp,%ebp -c010a17f: 83 ec 10 sub $0x10,%esp - uint32_t hash = val * GOLDEN_RATIO_PRIME_32; -c010a182: 8b 45 08 mov 0x8(%ebp),%eax -c010a185: 69 c0 01 00 37 9e imul $0x9e370001,%eax,%eax -c010a18b: 89 45 fc mov %eax,-0x4(%ebp) - return (hash >> (32 - bits)); -c010a18e: b8 20 00 00 00 mov $0x20,%eax -c010a193: 2b 45 0c sub 0xc(%ebp),%eax -c010a196: 8b 55 fc mov -0x4(%ebp),%edx -c010a199: 88 c1 mov %al,%cl -c010a19b: d3 ea shr %cl,%edx -c010a19d: 89 d0 mov %edx,%eax +void * +memcpy(void *dst, const void *src, size_t n) { +c0109fc9: 55 push %ebp +c0109fca: 89 e5 mov %esp,%ebp +c0109fcc: 57 push %edi +c0109fcd: 56 push %esi +c0109fce: 83 ec 20 sub $0x20,%esp +c0109fd1: 8b 45 08 mov 0x8(%ebp),%eax +c0109fd4: 89 45 f4 mov %eax,-0xc(%ebp) +c0109fd7: 8b 45 0c mov 0xc(%ebp),%eax +c0109fda: 89 45 f0 mov %eax,-0x10(%ebp) +c0109fdd: 8b 45 10 mov 0x10(%ebp),%eax +c0109fe0: 89 45 ec mov %eax,-0x14(%ebp) + : "0" (n / 4), "g" (n), "1" (dst), "2" (src) +c0109fe3: 8b 45 ec mov -0x14(%ebp),%eax +c0109fe6: c1 e8 02 shr $0x2,%eax +c0109fe9: 89 c1 mov %eax,%ecx + asm volatile ( +c0109feb: 8b 55 f4 mov -0xc(%ebp),%edx +c0109fee: 8b 45 f0 mov -0x10(%ebp),%eax +c0109ff1: 89 d7 mov %edx,%edi +c0109ff3: 89 c6 mov %eax,%esi +c0109ff5: f3 a5 rep movsl %ds:(%esi),%es:(%edi) +c0109ff7: 8b 4d ec mov -0x14(%ebp),%ecx +c0109ffa: 83 e1 03 and $0x3,%ecx +c0109ffd: 74 02 je c010a001 +c0109fff: f3 a4 rep movsb %ds:(%esi),%es:(%edi) +c010a001: 89 f0 mov %esi,%eax +c010a003: 89 fa mov %edi,%edx +c010a005: 89 4d e8 mov %ecx,-0x18(%ebp) +c010a008: 89 55 e4 mov %edx,-0x1c(%ebp) +c010a00b: 89 45 e0 mov %eax,-0x20(%ebp) + return dst; +c010a00e: 8b 45 f4 mov -0xc(%ebp),%eax + while (n -- > 0) { + *d ++ = *s ++; + } + return dst; +#endif /* __HAVE_ARCH_MEMCPY */ } -c010a19f: c9 leave -c010a1a0: c3 ret +c010a011: 83 c4 20 add $0x20,%esp +c010a014: 5e pop %esi +c010a015: 5f pop %edi +c010a016: 5d pop %ebp +c010a017: c3 ret -c010a1a1 : - * rand - returns a pseudo-random integer - * - * The rand() function return a value in the range [0, RAND_MAX]. +c010a018 : + * match in both memory blocks has a greater value in @v1 than in @v2 + * as if evaluated as unsigned char values; + * - And a value less than zero indicates the opposite. * */ int -rand(void) { -c010a1a1: f3 0f 1e fb endbr32 -c010a1a5: 55 push %ebp -c010a1a6: 89 e5 mov %esp,%ebp -c010a1a8: 57 push %edi -c010a1a9: 56 push %esi -c010a1aa: 53 push %ebx -c010a1ab: 83 ec 24 sub $0x24,%esp - next = (next * 0x5DEECE66DLL + 0xBLL) & ((1LL << 48) - 1); -c010a1ae: a1 78 8a 12 c0 mov 0xc0128a78,%eax -c010a1b3: 8b 15 7c 8a 12 c0 mov 0xc0128a7c,%edx -c010a1b9: 69 fa 6d e6 ec de imul $0xdeece66d,%edx,%edi -c010a1bf: 6b f0 05 imul $0x5,%eax,%esi -c010a1c2: 01 fe add %edi,%esi -c010a1c4: bf 6d e6 ec de mov $0xdeece66d,%edi -c010a1c9: f7 e7 mul %edi -c010a1cb: 01 d6 add %edx,%esi -c010a1cd: 89 f2 mov %esi,%edx -c010a1cf: 83 c0 0b add $0xb,%eax -c010a1d2: 83 d2 00 adc $0x0,%edx -c010a1d5: 89 c7 mov %eax,%edi -c010a1d7: 83 e7 ff and $0xffffffff,%edi -c010a1da: 89 f9 mov %edi,%ecx -c010a1dc: 0f b7 da movzwl %dx,%ebx -c010a1df: 89 0d 78 8a 12 c0 mov %ecx,0xc0128a78 -c010a1e5: 89 1d 7c 8a 12 c0 mov %ebx,0xc0128a7c - unsigned long long result = (next >> 12); -c010a1eb: a1 78 8a 12 c0 mov 0xc0128a78,%eax -c010a1f0: 8b 15 7c 8a 12 c0 mov 0xc0128a7c,%edx -c010a1f6: 0f ac d0 0c shrd $0xc,%edx,%eax -c010a1fa: c1 ea 0c shr $0xc,%edx -c010a1fd: 89 45 e0 mov %eax,-0x20(%ebp) -c010a200: 89 55 e4 mov %edx,-0x1c(%ebp) - return (int)do_div(result, RAND_MAX + 1); -c010a203: c7 45 dc 00 00 00 80 movl $0x80000000,-0x24(%ebp) -c010a20a: 8b 45 e0 mov -0x20(%ebp),%eax -c010a20d: 8b 55 e4 mov -0x1c(%ebp),%edx -c010a210: 89 45 d8 mov %eax,-0x28(%ebp) -c010a213: 89 55 e8 mov %edx,-0x18(%ebp) -c010a216: 8b 45 e8 mov -0x18(%ebp),%eax -c010a219: 89 45 ec mov %eax,-0x14(%ebp) -c010a21c: 83 7d e8 00 cmpl $0x0,-0x18(%ebp) -c010a220: 74 1c je c010a23e -c010a222: 8b 45 e8 mov -0x18(%ebp),%eax -c010a225: ba 00 00 00 00 mov $0x0,%edx -c010a22a: f7 75 dc divl -0x24(%ebp) -c010a22d: 89 55 ec mov %edx,-0x14(%ebp) -c010a230: 8b 45 e8 mov -0x18(%ebp),%eax -c010a233: ba 00 00 00 00 mov $0x0,%edx -c010a238: f7 75 dc divl -0x24(%ebp) -c010a23b: 89 45 e8 mov %eax,-0x18(%ebp) -c010a23e: 8b 45 d8 mov -0x28(%ebp),%eax -c010a241: 8b 55 ec mov -0x14(%ebp),%edx -c010a244: f7 75 dc divl -0x24(%ebp) -c010a247: 89 45 d8 mov %eax,-0x28(%ebp) -c010a24a: 89 55 d4 mov %edx,-0x2c(%ebp) -c010a24d: 8b 45 d8 mov -0x28(%ebp),%eax -c010a250: 8b 55 e8 mov -0x18(%ebp),%edx -c010a253: 89 45 e0 mov %eax,-0x20(%ebp) -c010a256: 89 55 e4 mov %edx,-0x1c(%ebp) -c010a259: 8b 45 d4 mov -0x2c(%ebp),%eax -} -c010a25c: 83 c4 24 add $0x24,%esp -c010a25f: 5b pop %ebx -c010a260: 5e pop %esi -c010a261: 5f pop %edi -c010a262: 5d pop %ebp -c010a263: c3 ret - -c010a264 : -/* * - * srand - seed the random number generator with the given number - * @seed: the required seed number - * */ -void -srand(unsigned int seed) { -c010a264: f3 0f 1e fb endbr32 -c010a268: 55 push %ebp -c010a269: 89 e5 mov %esp,%ebp - next = seed; -c010a26b: 8b 45 08 mov 0x8(%ebp),%eax -c010a26e: ba 00 00 00 00 mov $0x0,%edx -c010a273: a3 78 8a 12 c0 mov %eax,0xc0128a78 -c010a278: 89 15 7c 8a 12 c0 mov %edx,0xc0128a7c -} -c010a27e: 90 nop -c010a27f: 5d pop %ebp -c010a280: c3 ret +memcmp(const void *v1, const void *v2, size_t n) { +c010a018: 55 push %ebp +c010a019: 89 e5 mov %esp,%ebp +c010a01b: 83 ec 10 sub $0x10,%esp + const char *s1 = (const char *)v1; +c010a01e: 8b 45 08 mov 0x8(%ebp),%eax +c010a021: 89 45 fc mov %eax,-0x4(%ebp) + const char *s2 = (const char *)v2; +c010a024: 8b 45 0c mov 0xc(%ebp),%eax +c010a027: 89 45 f8 mov %eax,-0x8(%ebp) + while (n -- > 0) { +c010a02a: eb 2e jmp c010a05a + if (*s1 != *s2) { +c010a02c: 8b 45 fc mov -0x4(%ebp),%eax +c010a02f: 0f b6 10 movzbl (%eax),%edx +c010a032: 8b 45 f8 mov -0x8(%ebp),%eax +c010a035: 0f b6 00 movzbl (%eax),%eax +c010a038: 38 c2 cmp %al,%dl +c010a03a: 74 18 je c010a054 + return (int)((unsigned char)*s1 - (unsigned char)*s2); +c010a03c: 8b 45 fc mov -0x4(%ebp),%eax +c010a03f: 0f b6 00 movzbl (%eax),%eax +c010a042: 0f b6 d0 movzbl %al,%edx +c010a045: 8b 45 f8 mov -0x8(%ebp),%eax +c010a048: 0f b6 00 movzbl (%eax),%eax +c010a04b: 0f b6 c8 movzbl %al,%ecx +c010a04e: 89 d0 mov %edx,%eax +c010a050: 29 c8 sub %ecx,%eax +c010a052: eb 18 jmp c010a06c + } + s1 ++, s2 ++; +c010a054: ff 45 fc incl -0x4(%ebp) +c010a057: ff 45 f8 incl -0x8(%ebp) + while (n -- > 0) { +c010a05a: 8b 45 10 mov 0x10(%ebp),%eax +c010a05d: 8d 50 ff lea -0x1(%eax),%edx +c010a060: 89 55 10 mov %edx,0x10(%ebp) +c010a063: 85 c0 test %eax,%eax +c010a065: 75 c5 jne c010a02c + } + return 0; +c010a067: b8 00 00 00 00 mov $0x0,%eax +} +c010a06c: 89 ec mov %ebp,%esp +c010a06e: 5d pop %ebp +c010a06f: c3 ret diff --git a/labcodes/lab4/obj/kernel.sym b/labcodes/lab4/obj/kernel.sym index d7f21eb5..379f6ba9 100644 --- a/labcodes/lab4/obj/kernel.sym +++ b/labcodes/lab4/obj/kernel.sym @@ -1,611 +1,603 @@ -c0100000 .text -c010a2a0 .rodata -c010c5dc .stab -c0120f4d .stabstr -c0126000 .data -c0129000 .data.pgdir -c012b000 .bss -00000000 .comment -00000000 obj/kern/init/entry.o +00000000 entry.o c010001e next c0100034 spin c012a000 __boot_pt1 00000400 i 00000000 init.c -c010015c lab1_print_cur_status -c012b000 round.1862 -c010021e lab1_switch_to_user -c010022f lab1_switch_to_kernel -c010023d lab1_switch_test -00000000 stdio.c -c010027b cputch +c0100156 lab1_print_cur_status +c012b000 round.0 +c0100216 lab1_switch_to_user +c0100223 lab1_switch_to_kernel +c010022d lab1_switch_test 00000000 readline.c c012b020 buf -00000000 panic.c -c012b420 is_panic +00000000 stdio.c +c0100320 cputch 00000000 kdebug.c -c010051e stab_binsearch -c0100ad7 read_eip +c0100423 stab_binsearch +c01009d4 read_eip 00000000 kmonitor.c c0128000 commands -c0100af6 parse -c0100bb1 runcmd -00000000 ide.c -c010a58c channels -c012b440 ide_devices -c0100d59 ide_wait_ready +c01009ed parse +c0100aa6 runcmd +00000000 panic.c +c012b420 is_panic 00000000 clock.c 00000000 console.c -c0101633 __intr_save -c010165d __intr_restore -c0101671 delay -c012b520 crt_buf -c012b524 crt_pos -c012b526 addr_6845 -c01016be cga_init -c012b528 serial_exists -c01017a8 serial_init -c0101897 lpt_putc_sub -c0101917 lpt_putc -c010195b cga_putc -c0101b51 serial_putc_sub -c0101baf serial_putc -c012b540 cons -c0101bf3 cons_intr -c0101c44 serial_proc_data +c0100d7f __intr_save +c0100dab __intr_restore +c0100dc1 delay +c012b440 crt_buf +c012b444 crt_pos +c012b446 addr_6845 +c0100e0c cga_init +c012b448 serial_exists +c0100ef4 serial_init +c0100fe1 lpt_putc_sub +c010105f lpt_putc +c01010a1 cga_putc +c0101297 serial_putc_sub +c01012f3 serial_putc +c012b460 cons +c0101335 cons_intr +c0101384 serial_proc_data c0128040 shiftcode c0128140 togglecode c0128240 normalmap c0128340 shiftmap c0128440 ctlmap c0128540 charcode -c0101cc1 kbd_proc_data -c012b748 shift.1590 -c0101e4a kbd_intr -c0101e63 kbd_init +c01013fd kbd_proc_data +c012b668 shift.0 +c0101584 kbd_intr +c010159b kbd_init +00000000 ide.c +c010a3b4 channels +c012b680 ide_devices +c0101696 ide_wait_ready +00000000 intr.c 00000000 picirq.c c0128550 irq_mask -c012b74c did_init -c0101f66 pic_setmask -00000000 intr.c +c012b760 did_init +c0101f03 pic_setmask 00000000 trap.c -c0102160 print_ticks -c012b760 idt +c01020df print_ticks +c012b7e0 idt c0128560 idt_pd -c01022f8 trapname -c010ab40 excnames.1683 +c0102273 trapname +c010a920 excnames.0 c0128580 IA32flags -c01025b7 print_pgfault -c0102635 pgfault_handler -c012bf60 in_swap_tick_event -c0102697 trap_dispatch +c0102526 print_pgfault +c01025a7 pgfault_handler +c012bfe0 in_swap_tick_event +c0102607 trap_dispatch +00000000 default_pmm.c +c0103338 page2ppn +c010334b page2pa +c0103363 page_ref +c010336d set_page_ref +c010337b default_init +c01033ac default_init_memmap +c01034f9 default_alloc_pages +c010367d default_free_pages +c0103995 default_nr_free_pages +c010399f basic_check +c0103edf default_check +00000000 kmalloc.c +c0104531 __intr_save +c010455d __intr_restore +c0104573 page2ppn +c0104586 page2pa +c010459e pa2page +c01045e6 page2kva +c010463c kva2page +c01289e0 arena +c01289e8 slobfree +c012bff0 bigblocks +c0104688 __slob_get_free_pages +c01046c3 __slob_free_pages +c01046fb slob_alloc +c01048ce slob_free +c0104a31 find_order +c0104a56 __kmalloc 00000000 pmm.c -c010342a page2ppn -c010343e page2pa -c0103454 pa2page -c0103499 page2kva -c01034ed pte2page -c010352b pde2page -c0103543 page_ref -c010354d set_page_ref -c010355b page_ref_inc -c0103572 page_ref_dec -c0103589 __intr_save -c01035b3 __intr_restore -c012bfa0 ts -c0128a00 gdt -c0128a30 gdt_pd -c01035c7 lgdt -c010360f gdt_init -c01036fd init_pmm_manager -c0103735 init_memmap -c010382e page_init -c0103bea boot_map_segment -c0103cf2 boot_alloc_page -c010425b check_alloc_page -c010427e check_pgdir -c010491e check_boot_pgdir -c0103fc3 page_remove_pte -c0104cac perm2str -c012c008 str.1871 -c0104cf2 get_pgtable_items +c0104ca8 page2ppn +c0104cbb page2pa +c0104cd3 pa2page +c0104d1b page2kva +c0104d71 pte2page +c0104db1 pde2page +c0104dcb page_ref +c0104dd5 set_page_ref +c0104de3 page_ref_inc +c0104dfa page_ref_dec +c0104e11 __intr_save +c0104e3d __intr_restore +c012c020 ts +c0128a20 gdt +c0128a50 gdt_pd +c0104e53 lgdt +c0104e97 gdt_init +c0104f83 init_pmm_manager +c0104fb9 init_memmap +c01050aa page_init +c010545d boot_map_segment +c0105563 boot_alloc_page +c0105abe check_alloc_page +c0105adf check_pgdir +c010617d check_boot_pgdir +c010582c page_remove_pte +c0106509 perm2str +c012c088 str.0 +c010654b get_pgtable_items +00000000 swap.c +c0106766 pa2page +c01067ae pte2page +c012c160 sm +c0106d29 check_swap +c0106b54 check_content_set +c0106d0f check_content_access 00000000 swap_fifo.c -c0104f1b _fifo_init_mm -c0104f52 _fifo_map_swappable -c0104ff9 _fifo_swap_out_victim -c0105100 _fifo_check_swap -c0105459 _fifo_init -c0105467 _fifo_set_unswappable -c0105475 _fifo_tick_event +c0107383 _fifo_init_mm +c01073b8 _fifo_map_swappable +c010745d _fifo_swap_out_victim +c0107562 _fifo_check_swap +c01078b9 _fifo_init +c01078c3 _fifo_set_unswappable +c01078cd _fifo_tick_event 00000000 vmm.c -c0105483 pa2page -c01054c8 pde2page -c0105651 check_vma_overlap -c01058c6 check_vmm -c010591f check_vma_struct -c0105db5 check_pgfault -00000000 kmalloc.c -c0106216 __intr_save -c0106240 __intr_restore -c0106254 page2ppn -c0106268 page2pa -c010627e pa2page -c01062c3 page2kva -c0106317 kva2page -c0128a60 arena -c0128a68 slobfree -c012c010 bigblocks -c0106361 __slob_get_free_pages -c010639e __slob_free_pages -c01063d3 slob_alloc -c01065a8 slob_free -c0106719 find_order -c0106740 __kmalloc -00000000 swap.c -c010699a pa2page -c01069df pte2page -c012c01c sm -c0106f62 check_swap -c0106d91 check_content_set -c0106f4a check_content_access -00000000 default_pmm.c -c01075be page2ppn -c01075d2 page2pa -c01075e8 page_ref -c01075f2 set_page_ref -c0107600 default_init -c0107633 default_init_memmap -c0107782 default_alloc_pages -c0107908 default_free_pages -c0107c22 default_nr_free_pages -c0107c30 basic_check -c0108172 default_check +c01078d7 pa2page +c010791f pde2page +c0107aa4 check_vma_overlap +c0107d05 check_vmm +c0107d2e check_vma_struct +c01081c2 check_pgfault 00000000 swapfs.c -c01087c6 page2ppn -c01087da page2pa -c01087f0 page2kva +c010861f page2ppn +c0108632 page2pa +c010864a page2kva 00000000 proc.c -c01089bd __intr_save -c01089e7 __intr_restore -c01089fb page2ppn -c0108a0f page2pa -c0108a25 pa2page -c0108a6a page2kva -c0108abe kva2page -c012c040 hash_list -c012e040 nr_process -c0108b08 alloc_proc -c012e044 name.1770 -c0108c5e get_pid -c0128a6c last_pid.1780 -c0128a70 next_safe.1779 -c0108dd2 forkret -c0108def hash_proc -c0108f61 setup_kstack -c0108fa1 put_kstack -c0108fcc copy_mm -c010900d copy_thread -c0109280 init_main +c01087dc __intr_save +c0108808 __intr_restore +c010881e page2ppn +c0108831 page2pa +c0108849 pa2page +c0108891 page2kva +c01088e7 kva2page +c012c1a0 hash_list +c012e1a0 nr_process +c0108933 alloc_proc +c012e1a4 name.2 +c0108a83 get_pid +c0128a80 last_pid.1 +c0128a84 next_safe.0 +c0108bf3 forkret +c0108c0e hash_proc +c0108d7b setup_kstack +c0108db9 put_kstack +c0108de2 copy_mm +c0108e21 copy_thread +c0109086 init_main 00000000 sched.c -c01094ba __intr_save -c01094e4 __intr_restore -00000000 string.c -00000000 printfmt.c -c010c444 error_string -c0109aeb printnum -c0109bef getuint -c0109c42 getint -c010a09e sprintputch +c01092ef __intr_save +c010931b __intr_restore 00000000 hash.c +00000000 printfmt.c +c010c220 error_string +c010946e printnum +c0109570 getuint +c01095bf getint +c0109a10 sprintputch 00000000 rand.c -c0128a78 next -c010335a vector242 -c0102db1 vector119 -c010099a print_kerninfo -c0102c91 vector87 -c0102c88 vector86 -c01033c6 vector251 -c0109670 strcpy -c01010bd ide_device_valid -c0102cb5 vector91 -c0102aab vector33 -c0102f9a vector162 -c01031fe vector213 -c0102d4e vector108 -c0102b05 vector43 -c01066fd slob_allocated +c0128a88 next +00000000 string.c +c0103290 vector242 +c0102ce7 vector119 +c010089b print_kerninfo +c0102bc7 vector87 +c0102bbe vector86 +c01032fc vector251 +c0109c14 strcpy +c01019f4 ide_device_valid +c0102beb vector91 +c01029e1 vector33 +c0102ed0 vector162 +c0103134 vector213 +c0102c84 vector108 +c0102a3b vector43 +c0104a1d slob_allocated c0100000 kern_entry -c0100d43 mon_backtrace -c0102fbe vector165 -c01030ae vector185 -c0102d8d vector115 -c0102dcc vector122 -c010406e page_insert -c0102f52 vector156 -c010337e vector245 -c01030de vector189 -c01029cf vector7 -c0102ba7 vector61 -c0102a5a vector24 -c0102d69 vector111 -c0103162 vector200 -c0102bdd vector67 -c01094f8 wakeup_proc -c010670b kallocated -c010418c pgdir_alloc_page -c0102e7a vector138 -c0102c1c vector74 -c0109997 memmove -c0102b83 vector57 -c01054e0 mm_create -c010a0d8 snprintf -c0102346 print_trapframe -c010320a vector214 -c0109cc0 vprintfmt -c0102cfd vector99 -c0103f66 get_page -c0103402 __alltraps -c0101ef3 cons_getc -c0102e9e vector141 -c0100510 is_kernel_panic -c0103012 vector172 -c0100aec print_stackframe -c010334e vector241 -c012e0bc pra_list_head -c01033de vector253 -c01029ab vector3 -c0103424 forkrets -c01029a2 vector2 -c01090f7 do_fork -c01032a6 vector227 -c0108ee9 kernel_thread -c01031da vector210 -c012c020 idleproc -c0103282 vector224 -c0102af3 vector41 -c0128a40 swap_manager_fifo -c01002d7 cprintf -c012e1b0 proc_list -c0102a3f vector21 -c010304e vector177 -c0102da8 vector118 -c0102bf8 vector70 -c0102bef vector69 -c010331e vector237 -c0102bc2 vector64 -c0102a75 vector27 -c01058b4 vmm_init -c0102e32 vector132 -c01030ba vector186 -c010322e vector217 -c010582e mm_destroy -c01089b4 kernel_thread_entry -c0109a3e memcpy -c0102999 vector1 -c010305a vector178 -c0102ad8 vector38 -c0106855 kfree -c010332a vector238 -c010038a readline -c0102e3e vector133 -c0102c13 vector73 -c0102ec2 vector144 -c010ac0c vpd +c0100c31 mon_backtrace +c0102ef4 vector165 +c0102fe4 vector185 +c0102cc3 vector115 +c0102d02 vector122 +c01058d7 page_insert +c0102e88 vector156 +c01032b4 vector245 +c0103014 vector189 +c0102905 vector7 +c0102add vector61 +c0102990 vector24 +c0102c9f vector111 +c0103098 vector200 +c0102b13 vector67 +c0109331 wakeup_proc +c0104a27 kallocated +c01059f1 pgdir_alloc_page +c0102db0 vector138 +c0102b52 vector74 +c0109f26 memmove +c0102ab9 vector57 +c0107939 mm_create +c0109a46 snprintf +c01022b9 print_trapframe +c0103140 vector214 +c0109637 vprintfmt +c0102c33 vector99 +c01057d1 get_page +c010289e __alltraps +c0101625 cons_getc +c0102dd4 vector141 +c0100d0c is_kernel_panic +c0102f48 vector172 +c01009e7 print_stackframe +c0103284 vector241 +c012c164 pra_list_head +c0103314 vector253 +c01028e1 vector3 +c01028c0 forkrets +c01028d8 vector2 +c0108f07 do_fork +c01031dc vector227 +c0108d05 kernel_thread +c0103110 vector210 +c012c188 idleproc +c01031b8 vector224 +c0102a29 vector41 +c0128a60 swap_manager_fifo +c0100378 cprintf +c012c180 proc_list +c0102975 vector21 +c0102f84 vector177 +c0102cde vector118 +c0102b2e vector70 +c0102b25 vector69 +c0103254 vector237 +c0102af8 vector64 +c01029ab vector27 +c0107cf5 vmm_init +c0102d68 vector132 +c0102ff0 vector186 +c0103164 vector217 +c0107c81 mm_destroy +c01087d3 kernel_thread_entry +c0109fc9 memcpy +c01028cf vector1 +c0102f90 vector178 +c0102a0e vector38 +c0104b67 kfree +c0103260 vector238 +c0100269 readline +c0102d74 vector133 +c0102b49 vector73 +c0102df8 vector144 +c010ae88 vpd c0100036 kern_init -c01033ea vector254 -c0102d0f vector101 -c01031e6 vector211 -c010302a vector174 -c0103366 vector243 -c0102e02 vector128 -c0102c5b vector81 -c01037c8 free_pages -c01029fd vector13 -c010a110 vsnprintf -c0102b4d vector51 -c0102a14 vector16 +c0103320 vector254 +c0102c45 vector101 +c010311c vector211 +c0102f60 vector174 +c010329c vector243 +c0102d38 vector128 +c0102b91 vector81 +c0105048 free_pages +c0102933 vector13 +c0109a7c vsnprintf +c0102a83 vector51 +c010294a vector16 c012b000 edata -c0101e81 cons_init -c0106cb7 swap_in -c0101383 ide_write_secs -c012e0b0 pmm_manager -c0103342 vector240 -c0102b68 vector54 -c0102a2d vector19 -c0120f4c __STAB_END__ -c0102cbe vector92 -c0103372 vector244 -c012c014 swap_init_ok -c01035fd load_esp0 -c0102e92 vector140 -c0102b17 vector45 -c0102c49 vector79 -c01032be vector229 -c0106a1d swap_init -c0102f6a vector158 -c0101fc5 pic_enable -c0108844 swapfs_init -c012e0e0 check_rp -c0102ae1 vector39 -c0102fe2 vector168 -c0102abd vector35 -c0102d7b vector113 -c0120f4d __STABSTR_BEGIN__ -c0102de7 vector125 -c0100443 __panic -c012c024 initproc -c0103222 vector216 -c0102bb9 vector63 -c0102a6c vector26 -c0101c9f serial_intr -c010310e vector193 -c0103132 vector196 -c0100113 grade_backtrace0 -c01031ce vector209 -c01029b4 vector4 -c0102ffa vector170 -c0109546 schedule -c0102e62 vector136 -c01029e8 vector10 -c01031aa vector206 -c01033f6 vector255 -c010307e vector181 -c0102b95 vector59 -c0100132 grade_backtrace -c0102c7f vector85 -c0102c76 vector84 -c010897d switch_to -c0103096 vector183 -c0102f76 vector159 -c01031f2 vector212 -c0102b29 vector47 -c01097fa strtol -c01032b2 vector228 -c0102afc vector42 -c0102d84 vector114 -c010963d strnlen -c0103036 vector175 -c0102eb6 vector143 -c0102e1a vector130 -c010c12c default_pmm_manager -c010338a vector246 -c01029df vector9 -c0102eaa vector142 -c0102d06 vector100 -c010316e vector201 -c0102181 idt_init -c0100a30 print_debuginfo -c010559c find_vma -c012e100 swap_in_seq_no -c0102b9e vector60 -c0102a51 vector23 -c0103312 vector236 -c012bf80 npage -c0105ffd do_pgfault -c01032d6 vector231 -c0108bd1 set_proc_name -c0102bd4 vector66 -c0102a87 vector29 -c0104da8 print_pgdir -c0102e56 vector135 -c0100c6a kmonitor -c0102c37 vector77 -c0103072 vector180 -c01015c8 clock_init -c01031c2 vector208 -c0102cf4 vector98 -c0102ceb vector97 -c01037ff nr_free_pages -c0106916 ksize -c0103042 vector176 -c010311a vector194 -c0102aa2 vector32 -c012e0b4 boot_cr3 -c012e1b8 end -c0103156 vector199 -c010925a do_exit -c0102e26 vector131 -c01033d2 vector252 -c0102990 vector0 -c01097c8 strfind -c0101eb2 cons_putc -c012e140 swap_out_seq_no -c010a281 etext -c0102ece vector145 -c0102d45 vector107 -c01289e0 boot_pgdir -c0102aea vector40 -c0102148 intr_enable -c0102d18 vector102 -c0102b7a vector56 -c0102be6 vector68 -c01029c6 vector6 -c010a1a1 rand -c0102e0e vector129 -c010313e vector197 -c0102f22 vector152 +c01015b7 cons_init +c0106a7c swap_in +c0101cb2 ide_write_secs +c012c00c pmm_manager +c0103278 vector240 +c0102a9e vector54 +c0102963 vector19 +c011f024 __STAB_END__ +c0102bf4 vector92 +c01032a8 vector244 +c012c0a4 swap_init_ok +c0104e89 load_esp0 +c0102dc8 vector140 +c0102a4d vector45 +c0102b7f vector79 +c01031f4 vector229 +c01067ee swap_init +c0102ea0 vector158 +c0101f60 pic_enable +c01086a0 swapfs_init +c012c12c check_rp +c0102a17 vector39 +c0102f18 vector168 +c01029f3 vector35 +c0102cb1 vector113 +c011f025 __STABSTR_BEGIN__ +c0102d1d vector125 +c0100c45 __panic +c012c18c initproc +c0103158 vector216 +c0102aef vector63 +c01029a2 vector26 +c01013dd serial_intr +c0103044 vector193 +c0103068 vector196 +c0100111 grade_backtrace0 +c0103104 vector209 +c01028ea vector4 +c0102f30 vector170 +c010937d schedule +c0102d98 vector136 +c010291e vector10 +c01030e0 vector206 +c010332c vector255 +c0102fb4 vector181 +c0102acb vector59 +c010012e grade_backtrace +c0102bb5 vector85 +c0102bac vector84 +c01092b8 switch_to +c0102fcc vector183 +c0102eac vector159 +c0103128 vector212 +c0102a5f vector47 +c0109d8c strtol +c01031e8 vector228 +c0102a32 vector42 +c0102cba vector114 +c0109be3 strnlen +c0102f6c vector175 +c0102dec vector143 +c0102d50 vector130 +c010ad00 default_pmm_manager +c01032c0 vector246 +c0102915 vector9 +c0102de0 vector142 +c0102c3c vector100 +c01030a4 vector201 +c01020fe idt_init +c010092f print_debuginfo +c01079f1 find_vma +c012c0c0 swap_in_seq_no +c0102ad4 vector60 +c0102987 vector23 +c0103248 vector236 +c012c004 npage +c0108408 do_pgfault +c010320c vector231 +c01089fa set_proc_name +c0102b0a vector66 +c01029bd vector29 +c01065ff print_pgdir +c0102d8c vector135 +c0100b5e kmonitor +c0102b6d vector77 +c0102fa8 vector180 +c0100d16 clock_init +c01030f8 vector208 +c0102c2a vector98 +c0102c21 vector97 +c010507d nr_free_pages +c0104c26 ksize +c0102f78 vector176 +c0103050 vector194 +c01029d8 vector32 +c012c008 boot_cr3 +c012e1b4 end +c010308c vector199 +c0109064 do_exit +c0102d5c vector131 +c0103308 vector252 +c01028c6 vector0 +c0109d5c strfind +c01015e6 cons_putc +c012c100 swap_out_seq_no +c010a070 etext +c0102e04 vector145 +c0102c7b vector107 +c0128a00 boot_pgdir +c0102a20 vector40 +c0101ef3 intr_enable +c0102c4e vector102 +c0102ab0 vector56 +c0102b1c vector68 +c01028fc vector6 +c0109ae2 rand +c0102d44 vector129 +c0103074 vector197 +c0102e58 vector152 c01285e0 __vectors -c01032ca vector230 -c010973b strncmp -c01066c6 slob_init -c0103e29 get_pte -c01010ff ide_device_size -c0102acf vector37 -c012e168 check_swap_addr -c010319e vector205 -c0102f8e vector161 -c012c028 current -c01096b3 strncpy -c0102c01 vector71 -c0102f82 vector160 -c01066df kmalloc_init -c0103216 vector215 -c0102f5e vector157 -c0102154 intr_disable -c01024fb print_regs -c0102d72 vector112 -c01000b8 grade_backtrace2 -c010308a vector182 -c01029f6 vector12 -c0109a91 memcmp -c0102d57 vector109 -c0102a36 vector20 -c0102b5f vector53 -c0102a24 vector18 -c010949d cpu_idle -c0102cd9 vector95 -c010329a vector226 -c0102b3b vector49 -c0102b0e vector44 -c0102c40 vector78 -c010301e vector173 -c0108891 swapfs_read -c0102d9f vector117 -c010232d trap_in_kernel -c0106b1a swap_set_unswappable -c0102c64 vector82 -c010326a vector222 -c01029d8 vector8 -c0102efe vector149 -c0100301 cputchar -c0109954 memset -c01032e2 vector232 -c010113e ide_read_secs -c0102d3c vector106 -c0103252 vector220 -c0102cac vector90 -c0102fa6 vector163 -c010a264 srand -c01032fa vector234 -c0106ae9 swap_map_swappable -c0102bb0 vector62 -c0102a63 vector25 -c010314a vector198 -c0102dba vector120 -c010036c getchar -c0104025 page_remove -c010a178 hash32 -c0102b44 vector50 -c0102a0b vector15 -c012c018 swap_out_num -c0109c8d printfmt -c0102f16 vector151 -c0102c6d vector83 -c0102ca3 vector89 -c0102c9a vector88 -c0102978 trap -c0103066 vector179 -c0102ab4 vector34 -c0125848 __STABSTR_END__ -c0102b20 vector46 -c01096ee strcmp -c0102e4a vector134 -c0103276 vector223 -c010323a vector218 -c0100670 debuginfo_eip -c012e17c max_swap_offset -c01056f6 insert_vma_struct -c0101ffc pic_init -c010328e vector225 -c01030c6 vector187 -c0103d3a pmm_init -c0102a90 vector30 -c0102df9 vector127 -c012e054 ticks -c0103102 vector192 -c0102fca vector166 -c0102c2e vector76 -c0102c25 vector75 -c0103126 vector195 -c0102f0a vector150 -c0102b8c vector58 -c01033a2 vector248 -c0102dd5 vector123 -c0102ce2 vector96 -c0102a99 vector31 -c0103186 vector203 -c0103759 alloc_pages -c0102e86 vector139 -c0102f2e vector153 -c0102fb2 vector164 -c0102dc3 vector121 -c012e060 switchk2u -c01029bd vector5 -c0102fd6 vector167 -c0102f46 vector155 -c01033ae vector249 -c010ac08 vpt -c01033ba vector250 -c0102dde vector124 -c0102d60 vector110 -c0103192 vector204 -c012e180 swap_page -c0103419 __trapret -c01002a0 vcprintf -c0102e6e vector137 -c01004c5 __warn -c0103396 vector247 -c0102a48 vector22 -c010317a vector202 -c0102c0a vector72 -c0102b71 vector55 -c0100319 cputs +c0103200 vector230 +c0109cd5 strncmp +c01049ea slob_init +c0105696 get_pte +c0101a34 ide_device_size +c0102a05 vector37 +c012c14c check_swap_addr +c01030d4 vector205 +c0102ec4 vector161 +c012c190 current +c0109c53 strncpy +c0102b37 vector71 +c0102eb8 vector160 +c0104a01 kmalloc_init +c010314c vector215 +c0102e94 vector157 +c0101efb intr_disable +c010246c print_regs +c0102ca8 vector112 +c01000b9 grade_backtrace2 +c0102fc0 vector182 +c010292c vector12 +c010a018 memcmp +c0102c8d vector109 +c010296c vector20 +c0102a95 vector53 +c010295a vector18 +c010929f cpu_idle +c0102c0f vector95 +c01031d0 vector226 +c0102a71 vector49 +c0102a44 vector44 +c0102b76 vector78 +c0102f54 vector173 +c01086eb swapfs_read +c0102cd5 vector117 +c01022a4 trap_in_kernel +c01068e3 swap_set_unswappable +c0102b9a vector82 +c01031a0 vector222 +c010290e vector8 +c0102e34 vector149 +c01003a0 cputchar +c0109ee4 memset +c0103218 vector232 +c0101a71 ide_read_secs +c0102c72 vector106 +c0103188 vector220 +c0102be2 vector90 +c0102edc vector163 +c0109ba1 srand +c0103230 vector234 +c01068b4 swap_map_swappable +c0102ae6 vector62 +c0102999 vector25 +c0103080 vector198 +c0102cf0 vector120 +c0100407 getchar +c0105890 page_remove +c0109447 hash32 +c0102a7a vector50 +c0102941 vector15 +c012c128 swap_out_num +c0109606 printfmt +c0102e4c vector151 +c0102ba3 vector83 +c0102bd9 vector89 +c0102bd0 vector88 +c0102888 trap +c0102f9c vector179 +c01029ea vector34 +c01254b4 __STABSTR_END__ +c0102a56 vector46 +c0109c8c strcmp +c0102d80 vector134 +c01031ac vector223 +c0103170 vector218 +c0100573 debuginfo_eip +c012c0a0 max_swap_offset +c0107b4b insert_vma_struct +c0101f95 pic_init +c01031c4 vector225 +c0102ffc vector187 +c01055a9 pmm_init +c01029c6 vector30 +c0102d2f vector127 +c012b424 ticks +c0103038 vector192 +c0102f00 vector166 +c0102b64 vector76 +c0102b5b vector75 +c010305c vector195 +c0102e40 vector150 +c0102ac2 vector58 +c01032d8 vector248 +c0102d0b vector123 +c0102c18 vector96 +c01029cf vector31 +c01030bc vector203 +c0104fdb alloc_pages +c0102dbc vector139 +c0102e64 vector153 +c0102ee8 vector164 +c0102cf9 vector121 +c012b780 switchk2u +c01028f3 vector5 +c0102f0c vector167 +c0102e7c vector155 +c01032e4 vector249 +c010ae84 vpt +c01032f0 vector250 +c0102d14 vector124 +c0102c96 vector110 +c01030c8 vector204 +c012c0a8 swap_page +c01028b5 __trapret +c0100343 vcprintf +c0102da4 vector137 +c0100cc3 __warn +c01032cc vector247 +c010297e vector22 +c01030b0 vector202 +c0102b40 vector72 +c0102aa7 vector55 +c01003b6 cputs c0128000 bootstacktop -c0108e73 find_proc -c0102df0 vector126 -c0102bcb vector65 -c0102a7e vector28 -c0102fee vector169 -c0106acd swap_tick_event -c01032ee vector233 -c0106b3d swap_out -c0106836 kmalloc -c010555d vma_create -c0102ee6 vector147 -c0108d57 proc_run +c0108c91 find_proc +c0102d26 vector126 +c0102b01 vector65 +c01029b4 vector28 +c0102f24 vector169 +c010689a swap_tick_event +c0103224 vector233 +c0106904 swap_out +c0104b4a kmalloc +c01079b4 vma_create +c0102e1c vector147 +c0108b7a proc_run c0126000 bootstack c0129000 __boot_pgdir -c0102d2a vector104 -c012e1a4 free_area -c0102d96 vector116 -c0108907 swapfs_write -c010c5dc __STAB_BEGIN__ -c012e194 check_ptep -c0102b56 vector52 -c0102a1d vector17 -c01030a2 vector184 -c0109612 strlen -c0108c18 get_proc_name -c012c00c pgfault_num -c01031b6 vector207 -c01030ea vector190 -c0100db6 ide_init -c0103336 vector239 -c0102cd0 vector94 -c0102cc7 vector93 -c01030d2 vector188 -c0109792 strchr -c0102b32 vector48 -c012e0c4 check_mm_struct -c0106ab1 swap_init_mm -c01000e1 grade_backtrace1 -c0103246 vector219 -c0102ef2 vector148 -c010325e vector221 -c0102c52 vector80 -c0103006 vector171 -c0102f3a vector154 -c0102ac6 vector36 -c012e0ac switchu2k -c0103306 vector235 -c0102d33 vector105 -c0100d2d mon_kerninfo -c012e0b8 pages -c0102eda vector146 -c01030f6 vector191 -c01092da proc_init -c0102d21 vector103 -c0100cce mon_help -c01029ef vector11 -c010412b tlb_invalidate -c0102a04 vector14 +c0102c60 vector104 +c012bfe4 free_area +c0102ccc vector116 +c010875f swapfs_write +c010c3b8 __STAB_BEGIN__ +c012c13c check_ptep +c0102a8c vector52 +c0102953 vector17 +c0102fd8 vector184 +c0109bba strlen +c0108a3f get_proc_name +c012c170 pgfault_num +c01030ec vector207 +c0103020 vector190 +c01016f1 ide_init +c010326c vector239 +c0102c06 vector94 +c0102bfd vector93 +c0103008 vector188 +c0109d28 strchr +c0102a68 vector48 +c012c16c check_mm_struct +c0106880 swap_init_mm +c01000e0 grade_backtrace1 +c010317c vector219 +c0102e28 vector148 +c0103194 vector221 +c0102b88 vector80 +c0102f3c vector171 +c0102e70 vector154 +c01029fc vector36 +c012b7cc switchu2k +c010323c vector235 +c0102c69 vector105 +c0100c1d mon_kerninfo +c012c000 pages +c0102e10 vector146 +c010302c vector191 +c01090de proc_init +c0102c57 vector103 +c0100bc0 mon_help +c0102925 vector11 +c0105992 tlb_invalidate +c010293a vector14 diff --git a/labcodes/lab4/obj/libs/hash.o b/labcodes/lab4/obj/libs/hash.o index 0bd564d36c5cedc0500211db7aac173589b6acf0..c81a1fceeb3ccc82c17b4f30e44038a75e69409a 100644 GIT binary patch delta 569 zcmca2v4U%Yg2)dh1~4!IlNt~zEtL5?-^3nfU<3;aFic{Ym?fvD0#V7}1Ed?E z>=-0=0g$}_h&h0`nql%ZCOIuOAQJ>!7z7xEAWSe@3eFZ}PzJKw87ALjlH*l}3a0>R z^~s#fYV{e3#Tmv%R&E*wI)<9IK+;Ilwg^mF8(5ndS(;dynHyP}S~HYp=9L&5#g|x> zfR!?o<`rkA=cT470L8&#Mw$#|i8)pU5b31Ml439$C=9a03L?zl?(A%(pb?r>npaY) zU}z|a=^2=40>weXlS4VwMZhk0%EvN!0*3)7 zC=ftEeX=K~JeLlT#mLOSaDriS5oh}3H=O2^Rk%bL)h8!%2~YOn5@3v;Jds0uatWL@ zhf9DB6t-s=CU4?W;w%8hk_3>;J^3z|JgWvUUM7LHif{`s?P8p)#;wNmjB#=tmzWSp z6DZoC(aP|Gaq>KFG1&;95GN2j05J%30OdhW_!0!Xo8Tr}ZabsJ;nX_#PC-6k7pB4`=d^*La#ACpJ!p{!m!QtT{nfB>n z+HJ_3!F7upm43siiB_}Pf5PDPT1}Q~osDj@71tfnY$uD!oICI3p6n@6T9BR}`cXdc zqf!dPlBhK*Jw=t8Dsv^b@@2-ENmBEG+D^$*Rr3~ z@p?K9J*vlRec)=R(*j%4YpLE!fwLWzsTOh`k&%O(7%(N`A!0s9OfN80L_u0tb5per z0jGz^d1=U~lU|GbrdreoT3=BE-%wE(C?oAQ)uJBI78SLd^bD6yHKGnQndvDvIUnY5 zVz0)QOvxc_gx2l0t&)<15-HP13>8|@6E`cZ#jb|cX3_^%krHW9tHp)$=ND(^R;z<{ zGMFtozT+-<12ytqldj|Xj+fJVd^7QR74(h9)h;ePze+dzKIw4HsQVp4WUjs_GOvzh zX2wTHui=h;2s-N2)c1FJa_p^Xm{ij0fA_CU3Dw3fh zt8N!QHa|B;l}&FJt;nhjIscyF04OVtryePn`{-}S+#7o5^*&?})*1B7Ng+Nai9QSd z2&8cO+Z#!x3Yqk@Y*>`UTZwS$m82q^YQHa>UfcprlPguwgoCSTBW{D%?j*5;DlC9d zyJE)c?Sa$nb-Hmc+1AtJMtQAQ*@&_7|86s2QXOpe^e<@dPI6*v^svEHe`+slkv=Vt z?q<5@|BL5>W9N{Q%jlnA&ukp_{LMp8l{|+|?J@=rLekkJ4s}{DK(}iGig66+ztlFn z)>BXrruC^!Vlu5^8`-EoW2DtD(ju%`f0v*;j!xyKb{0JQ4$#;h`wlS8vAj#*MMN;o z@~&Xa^WDOLmZp5^-^k|6eL*eW0cjs{0v$(D@unfk7vGl`pqPTrHk-#OC^&BiylqQ@ Hw7kCov|#DY diff --git a/labcodes/lab4/obj/libs/printfmt.o b/labcodes/lab4/obj/libs/printfmt.o index 571e71b236af1cb3985c1110715265adbc97b29c..41a9c32cc965f862c9cc3ae6f994003b4da58691 100644 GIT binary patch literal 9372 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 tSsNyoBh^(>)+|d505;&b84aQC^?!pw&Az% z*Z7YM-|su$?)&#Rp^N8y-!v{vO|P8#iZxD5om*`D+5O>njV_94tfL4mxcl8xouB;F z*+|Vb(q~VkX5pP|rskUIvyIf5MtZ)Pns1~QrVh=s+FIaal;mQ4wvk@YM=9{mG}8;@ zp|I0@h)BxXOr4(kv~SnrnLRUd3C&aoPxKaLYw$(9x@U$4Y7d0o#+vPnb--@37IL#2 z@NDFWvD=_0CB9F?qZ&S<;o}(yapvs@+^!EY4|Y> z*EM`Z!|!YOl!kxNa98V6{s9ed*YFb>Zff{-;OAs*?`Ze~jdN1Nvl_mj;SL-hwZ`=t zwlus=!x;_NHT;T(-`4Ok4O6*q%9_8tg1r;x;||GL4csR&sbMBB5yxGOUjT^%M1Ty# zD(;xTcMCJ@tJpRTr#;-wavFYC!>@U`hkXRxhk7QV&o3@6l53iNAcnO61N%J^&jW9l z_z&PmB|ZymOS}L~@zZ!z4RgRW7s(u+89YydulC_E@Efqv9U>WKHwnP;YIe084YQls zEfU+%bA+qek{!siVj<^lka#qoH#7P2c%@Ku>;Nm2YKdBZaKP~2Rplx{aPFD=Jt~#o`NDwwjn=#ITyUX@){k zGZ>1*!d5gIjs;`M%WY~qcosF8x6-&s7grOyW94ei^BO_nhE5KK%xEN*q+g^Iyvx!V zs%r)%jD*7>?3&zMuU&@h7c{oQjESCkxt4gca|T)$OqyY&+FLAVdciD^V66(x{0 zD7caG(cG-5^eBz;ggSN+wRP0Q#FrEM->>t2t zBS~0tS=S*GGQlzsGLuPGawcktouWkgQK!UnP}n>QzV`_s94saEfe2dqGF(5Ul~@r)S^ z1g(JK7k0+l@TZ&JeE8GPw%nhlFQ;j;;Wf^`pP-oU;DgNfbcb(EXItCL_=f3+Z7n$< z^bTRERUI$1+}qVY@>1)IZBy+n@6BxbeA9_dpMg)jt&+D+=cdU^hUJ3vp0u%F`8!M* zmVfn9ja225v|=^t-9?(dlXYoj*XTodS6nh)dC8b|Wl37SH=wY!VzyP%P5W>iW~A>1 z!n9TztM?+E3C4TIc#IFF(f29oA*n~C-Y)e6QhzP=w^H*sG%ARP;y02;6NiC)C}5H_ zY`x&OK<|*61>6JUwQLT$Ruy_op{i31)TqXQovmeAAm_R)Kt@*vWOJah0AA=^R`oBj}rJPGVB(jI05s zjt=1=IfeEOK~oQiL&uBG!R>O4ZQ-&SPIXSmpzxg%D_*afh(|5WOZDh3;ysTb^?ju7 zR1iG9z8>_bA2zCwPL`@K0j%Z(Wb}HG3Al3Wj)61B!_VbFP7k>rpfK`Y*W8n>1K diff --git a/labcodes/lab4/obj/libs/string.o b/labcodes/lab4/obj/libs/string.o index 275bdc12d5eb1137fe125262bb99060cecf77003..1e3bf53a07d3ded3268b428698b7a04ae324ab42 100644 GIT binary patch literal 7536 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 literal 9236 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 V#fc@KgVJvKjYRf)F1K5%{}0k(rAPn( diff --git a/labcodes/lab4/obj/sign/tools/sign.o b/labcodes/lab4/obj/sign/tools/sign.o index 27d8fe9452db16aed33d14ef2a447b1336351ed0..781cf8734dfd6a26f4a282a35189d784a2cfb617 100644 GIT binary patch literal 17456 zcmbuG3wWGWna9sJmt>MjCP~w@Ns~4+^cHAyC6r#$Hlej7rCg+qwm=;wGm~VVPG;g< zT3VJ%sny0(1Vk1Usmg;^s90_fg%zlZt|;!Ri>!zXxGJEsigrbDSGw>2ocGL}oF`CWylSsMhzbli-#e<6%W)}zJnM^vfG?-27i3bze;KEoN z=?vu)$yo55&aU9l?p!<@97?Bi!E8L5OJ`Q9ZrOY^8qa1!<>Fm15KNE9Q;F1w^er`3 z1{Y?_g>(ViBqqtEG*>QUea#y3&=DdNnIVyhM`F_lv}{l1~>Qb zedCBrh*7V$(f;$Lwp4fNFUA2EPWwC$aWdFpg{Rgl1y$&ON6Ho6yQMG>r zEeAI(=;%MV+4mHZ-Fc$_&^geMYN~DT+wV|Q)ko6MK6G@!%~J2NUfT6f{D$>U_TN{q zF1tMrbJRXCapFlq!3<1%UD=F&w|~`^1szrUA0&lM6Te|kS63e&y!X^8HaAQ|xQTkn z#>dhBNw(KN@fB@qHF(wjTPE4rTs`GLR7PU`OH_)g_CJmA_CAfot)F=1^6h-)@B&}o1f{7C4gCjYyVUJGQB=E$)T)bWzxsFC z8|?>|^MEh#DG$m5rHM^;o{$Q^=s!i-P>tMTd-=seQjy9J(R%d?$A^&S7B;BZ#RK5^ z-t1+xEA^E^D)q?SJYU6nNXkm7OSL&AQpM%PuG!;Fq;k|xO45|~mIjzo^;;W|4ORcB zQNPX5xqVJi=N}u3eeY;U75aX>u~`4~oMQb;bBpzdn~L?XhfpsmrzKLV0uG`+gP{0f zN#~t3$5=h0+s}k1FdW7P*`wT*-ulyI@{DYCXt3Gc4@R}u~=VO!-hq;|6sE}#7ZwcMeED;j=E!l#w6 zU50Z+3GXYzIyt62Y0O)CCTE7pn`S3+Ig+hA&;+*~%Nik7ZyDQm9G7u3oYRDK+4s%2@_10+-{p*3(13H3^7uiQ&Q zlM*^A50Ma5LRT4<-2x?aOVce%SW$@y>`=n$nxBxcTnTHd|BHlPC2Xv#rxElk;Q}da zRl+7Ij4ENeP45x}sTsVej75>+G$R~SL8BBZjEuc=N0s&BQ?)++*5OYv1H`^tdg*IIpvpM0bfl>D@ z$M!T1<%h+r@_!};_bn%`Zb}S~i+VXK)?b9Z(;(NFHqn$Ot&pizcSX5wg$|?+RawRlW zuPUYf>kRH)W(sGS!aPG*jG$UBHb^0SENcqiwUf46+~vaMcHWJ#Y;|3OPE+S)Hkzok zcn=|>zb!AjjWFc6%FAAYmD>znd4PmMjGrZeVk~BtLPd=4cKObt5Kl9R&;r;{X)LQF zJEt2LWv6vpP_}tW)j}LNJ4n}Ja&PGu|x2?vXx_QJiwfvoEzM*S?b%Z)4O zIHq-UH zgb}XyD8*LNkR>46bX7Q&!W~%YU*%unAE;eU9q2Z5fUf)Q0pY5@ zmLl@ZG8AZ$dqrohYxbk(k=v3g;Sc$sUAjQ{{cHSgIv{-g&Na?;#LDJ6owb)b$ItT* z&fXeww)x-dcLax}3YlZsGQ=3^^+CE*eWyk%WqR zb8DQ1fm*-2xv_b0c8ya_X`e@Fr}&#W=X4YY7s{*V`Q!{v1=PJ^!d0=wJQq0IJzsbJ&2hG~0(OQ{9VuO~oi-<&A3L=BvGX&>+3I=C`2$JNr3ejm zX|tVde#UtKHl5<&o5~CK0Eekp;o8yUp=;}8;_84r$*|8u_b`V&z9#2AWOP!K^y!`K z%;Q{Y`u4gy4^NWGin|zsSA}2%JKGG_;Gt=FU>aU+a^u21ot=56{!*1*+7^;U_2QkO z6pYO-s_WH8OIj6=nBi$?B3_W|JoR%;x!%(hGUb40#%xc+nI@|C)J{^V^EAv8bZer@ zjUI6;FZ6vx9LM>eKqYpVDEgyHb3vK=Oxn4eW>=NGPeu9}~!$ zWO86~BbT8Xr+1zxldb4bU*h;?c)caQ_FAv6#G%@g-m(&>XQS750|_7WxV(=0KZN6T z&-9j)?okhP+@HP9@%l;Kx0R%4Ydvn#IzubnKsq(z)cUS9ott+7HYkLes9fX-av-X2Vl}$ zvCUiaTiEed$PsMgksRA64S%B;{jf6o7)9@prLq$Dm97@VG--@8a->#`G0JFP5*rZ? zDPz>t4U*FFSpiJ3U?KM1(uF$}V3kborgKdJidVBCFNgyk!GWDRI9b za-49exbL~{cQTR}MGw4?`_C1OULlP>S1>B0xbHgOM%m*Bg)r{p9*%p~R=Oi_obe1j zb{ZDpaC&$+oTL3nB8L6I#bG=%4UgwCA{-r!BvK-q3rBN_F@fi;P|1#_GdcW%3WtGc z7af%yiG_zE**JO(CDYLzSu&B1#iKiOgd(&_jHKeRAeklOVLT1aB~syG`Pdkp5~(!t zG3o+8@_91>9a20ML$BnHXevkT$uvC|#M)4F9NJL4+Jbf=k2q;?=v z$Tg>-OUV2oVr3?$cv?^XWrk=%!XwGVP?XkFHlEoTk0B-*axr;wC8&|gJi=>&Wkq$W>Dn-L%a-Gm|L_KKroFmS^ zXfU|0^W0!(XIpn$N3eA)mruo4kHk~)Od?8RBoiH7ebw@1t;@QDts}wKi@SoY!;$Rn zRCF|xPNnnN)_iJLA{A?uqs>yI98T+aCY_TnOkvV@5l{?H$>UXkL&eTSf)@J!*RriF7>8Kp=Nmy zBokOG<~(NP+aNK9vq^DfsU*rnpnWtw7H=Qf-M%ZG*^wQOMC0x0Y?zL-R6H3@Muyty z565s8m2Qzsr<2)s9Dr?6@%QuTV$typ%)#G@@z@t<6+W7CDL7Oqm+9(b&rIH=_H&O zPQ+sp#bWVcsz^UdCm+p)abS?dJL(9ikD{U)&dpLH4~milS&>{G9VGV16LxDNwMK~Z z*R5L_Y#AKNr*e5-->sc_DRy4l)z#L~eI{dlUs6pK+=0+RfqRz|xJ}V_y)&Ui#o0r* zrdL%vjTNOnJV3{5N&PrYKJ(iUs6OO6FHnD@yDt#@prd;JaS>0bd?ySsw`Y z1?tZWRG$~{^~vAL((36O+)8=GZ%>`xf|%qD)M-ub;!WSAHh1wJ-{O<+Om(BX_<%$s zxp%8y_mda|w|YuC1(#1?r{MJSb&BE^I?KgI6`@zX-zs7u-`LT3*BJ~|`Syo+%;NOR zk%~viUp+>fn!D5U8In3)vBA(qb&-@kqQl}#q^#~=%_gPi72PJJI$pQVFy=)+FJ4I; z>(DN12~5Q|O~dh0Xe#~pO~d2U@Z>Z+I}P7E4Zn37{>f>$KBu&8TGu6L(~ZqCY?fow zfz3JCoQq8-HfO7|x4ey;boay;{o*~0zI+yL>*NK7?mNs|uCR5<#jO%v_|p~2x@6N3 z#Byw?U?t%h-~ZA}T9nHGso?ia1^sCr2BZRgtWC{73`hm~SmT=C4oC(1cnYQYLx5Dk z@hV31X8@^y<6VR1F91@3eLPFn{8d0Iw*7Y$mb{VbS|2alP;C42nZrJQ6KZ|+=1b|D z<9)B8k7H5mt9M%}POM|i-*5Oe{>Ttokep^tNkw(})Jf1bhR z2M;7856uSumSM;A`<%gX7S#4%H0+!4yk_W|c7APeoHezbcc!u9!-P;loI(22`uYk$ zk8zE&ky?9%xezil1ihiyQUGuso-*XWIhp#mKp{Vny;`HddP}F&} z==W@HS;2eQ!QT!ZXRpP3nO|h_Yk2&F7XJ+EUtw|iBA8gz;s@Ez`z`)emUmiw5!=7P z;`2G5H(6XhM3ET6QvpJjOgG5o&7cJw^!c%I;R=I~zgm8`$m;yUhb zi|h5#XK}oPLb=G|S90DixA>*ZM=gFKk1KES?VRTuEdC?b|A@s;vHqtl{w&L1u(%%Q z0~SAr?f<~yzf{8&FI)U$EW6pi&a;ol+hFmBS%0C$OPF_A{7sIh*W%+G&nAmEvfphM zzm@feEuLe)S&P5Uey_K98}maJe-F!_uy`};f8OHnu-}I*{tD}V#o~9f{=ZmUzkqqs z;&1VIU$^)g&d={HuCISCZrAe|Wxqj->-)1+7XKdWUvBX(mOp55eV(GX0kUYnTK^%7 z|B>_an8o$Fe9__?SgzooNZNiAk3VGbEgb)9i|=4NTP*HpJ8_Ha^*Lej9NW2#IflbX zj{iPO|3Yqj*xR+tKEslGAlqU?1G2>G$ly4Xub}o=qh;LbZHS^zFTpveoTl_}W zf5+hPdneCVS&32rgI|5UuC(|Um6~X@_^ZsDE&dAg7Unvi=QHn|hHtX$xH-;CEH2+h zk*z_?PL%EMFgTV1?x9ik7#ykB_jUUW`?xRF^L4Aik)KA6=XQ%XFh6YZR_1qGdonO^tQ!6!uo%<_#x)%17vkSV~)#@!BElb_Ab`1vbbL7GnqpTdDH8>*Wz_-XJ8s0 zv+N&Z{ZWhG&wR|Xvy}NhgX7eu?+WT>E{Q?cZi_zC=k6 zcN-je{u%2ZHSD9RpA-F)!4Xdj`+dsdizdCoKtz-;;o$L|F*ckj?2!}Pusbl^(z4kuJ4zcEq;LgF0uG})m^N& z_z;hGyTw^uBrSdkl1*ig#r5@K!s6Qg$1JYx+--4vzxR2I?^SNa{TBZ@=jXv`cpdk{ zFgZ1nY?_9D)Z+TOdEDaqy6~FC|ID(7^Q!%x&%DauNTt5tQ2z*^zJfuV`hG+IUeR_m z*UzhLez{>Ec69vu`GeNi{Q7D1Z=Qx9o`yeQaeaJ!+2EKeef@gI;D}RSzw~oXH1pI_ zO^BaZ`i1L@!I94mQd@|(4G#PIdf{QC+I|P?*BBi7`gm_LI4^zK<4l7?U!RBd?{e6O zzCKU#ZHqjv`4(H+sg~Q~ytByfsft|ByIwD_55M}n+G^R+`CM)B{hSv)5893%@0FIm z9@n_VSycZ?Ljn#zKmF<~o0Ry!yB> zpC==JJ?~drcJ%%8^%lRK?eDkvrtI3Xx1MKh7u?AIgu=*D=Fs zGA8Shp`i?Y2BLZ>L|@3@;|@518P>~0QX}+rgUK=}`t-+Er0*-@+Bik0tHAWqkK|~2 zY%ES6bhV}E`<6EPP=LN~p$|}4rVlgP=*yS!cqX@-oyAA#wIlsUvd-WCcaL{om=k>- z()N0F#oF^U7ifrTVCFdxjlI}RQSAPUNe8!ze{X;Mj)6^mKA@^By}bVi-s>ITmdZY0 ztLSg4{$J(}qrBHU9lze={vLHZe;ur#?*nyzeO}k{Myg=l_iDiVZw6K6I1UUdbLbB~ zbo_W{i!wxiIu;3d)58gU6ej?q*t$3mP38ak`Kr^A8EOyz@NN4~5wmTg$4R_wrlOxu zE9rFIz0@#O|2sKRYk2(A^~d~96@Lp~2o4ze!}-pR|MqG8|A@!kp&j$yj`bGeQ~5u( zTy@a>kw2uw_J1!i+a`LJ*J3M#J})cjblrQXVJiQxu>T|65&rQm(Dwfnv8nv;XaBeV zh5SEG{ipJOfM2lc-<9xRGll<$xKVVhdjCANp>Fs80vuA&&sUUG z9INh+`-7?aZ);LL^mCHw`u~Re>vp~0&;7Nm_u8+PPf?|m{;V{M1KdBT6?w1cPh-5t zf=#>s5$><=KeWExe+G4)YW|Ml#7IS-XOK?Rb$`vL@{NA_2Mqq>7zNiE{N}Rzd zTB=NG7ib&AAuy@Ul_{NHxDY(FPX!anK9!7yB83Cm)^}m9;gEZ?YVzA%>$}#iU)yu@ zYezgvMSAuXO>2gdp1rp;9RkpCeD`U$YR^T`i#>ba?Af=~*R%JZzK(tRGFs}|dt%S= zsyzc(yl-Vwd(XbLK3&>zyl4L|lkSM3pW2Ib559)ChXM9cR+WeUU3_FTHIsl95?L!hv7?{BEewbjSgKXCdq znd^sk+zz#L;Uif839{F-_enOj0D0A(gQM)Mt2j^xaXhDX zJE&FX)L#92T^q~y&7lTg?lT^Y1?VO+*>PMeywYbBc}R#Y1tCHx^GrJuPWd#RnVE zl*#`^!~AUiPAmTrOXsdhIh~I+=IS157|z!Hcw;Vqcv3F^#j|tyubh?3pO}jI5?>j# z-8B*Gd?`?MvZTZJDTq%m{gR7I`VksoR%sE`@EKvY7OIUfM+@~vn5%_=5$0*3*$9_v zq1_1cwJ^sB3$)N_gibB=7@)4JPq0jd^7&u`jhp(hzB6M~+=&F(n z{d$6y_`VDZB|a>u#KFV3{5U6&ejWr;JDJP=9I{&XUDmBtRal{PufNR2dN|l#%o=>F z#wNcnmoJ-Cfit0UH7G8IU$yeh)zxcoN-T%07ysybWsQ?iMNg;d@-p9k5OfpED=L17 zzKu{l;a?%|GkOOqT7B<_C8>)l+AGspy^2dJ522nZSx|KpglZ!!^nV6~dLwjJ-UPx~ zM(C=%4TOLZ7L{V?O-5LvO*b21MI}y$b|b8+IR(NTBV1Aa8VH?6xOzeqn$Tl}jauk6 z!X_;Y8sVBcY{7O_iS3F*R*#KG)qtp+5=Sp3%tNYyUdQCz{W5GI<8-#9%+??_5z9H% zrqass)nJFZ2aoQo?aTBlXJXmwpyD1pe(m^J|A=zx%W*V0O~8!Ppu2$C_yp=r9i=z% zwB-lJ)THrrbSg`SU>B>KtOwP=x*AKUCq?x~fDO)ir=!7Hk+A649Z3~MmK}{O8Bps8}P@P5tpSB9> zK4J?WvW1g~f?nsADGzi3_Cv4d`hxvX$NkXk{Wkjl&-KIituRb8%1RsH zOjP%(RnYiT5VAo|F+t|K6Jj-k<+}g|Ym7yV&(A?NmafTbT}>KO&uJ<>kXJVw$ptzR zaIQvI*UlV&>5tE_I`nd`HNuwZl-kl}nB0G&Q?j85TRcnEEQoa(*nrNmd}WKfp*X0E z*W*}cIaa%&aJ5xXe1xj$NuvkC%$zGn8A1oga}Lg?0Z~^2&k6&!pig)uK0IUV{U4Y2 zWIR`#cGMKC?s>}5JCb`5OpgGQ<*>}M0+zrT0=Ju~s8DpNvj`3@uAXx&z=MsCRJX( z5Hz6As~`(!*VzgSim3nwvjhu}`OectrL~UhFE2Mn9N=Y@md!a}qdeyXE){B_bbbTO z4#!zui~9blV5bfAs%BahFKa-hY8?NXR_C$?4s&|L^4c0_TuEpB$GRJ^`Z%vu%TxEY zZfI65Sn_eRJh1Y|j{-(%g6)nfPCVP`sJ+rT)?JQ1ddoMIzqcHnz&77eOFH#?cRA3N z9e^8d-Q_4x{lRWIDmgi?$vj^2px&GnlgncZ3i5P$9>p_jha+7oN4;0Fu}T<38g`)3 zDes7nR>8}A+|P9yGwfqqRs{N_A}7JTYk7m9;4}~t2ib;=4OVo}_%wmGk-kx&MtG_zbLZ zSKR`W&2irGSHfTYtQzHXA~BRwZJAWEEfx=YXU%LGip4YATL$8pw$zS4 zr_mQnlgd!6uWcY49&2PS+y67p&{SJ`$4GRvPo+|^fp}{eHbj+5htjQsIHOYONGve} z^3cFkItdT3gZ+tQI@TYHMwmt-(SFFo-M_ZVIGG8jgG-mMTmk?tGjcg?6JRlz+>r{x z^Yx)v3jG-$SS=kJj;2PUVN;dDfnv~&C#b59#^mSYB z*IVpstM&Sd9mqXV&;8bQSp2~v7m80RF7|x^3cbbd z=WcYoHu4dHqR1x1d#T z#RhN9@6eRDLN{y!HSp+eZTrbw6Z(zWC!h%qSSl@cH+z~ftWgaemj<iM<{#tjZCX z!RdY#3?};fgK0Pp#3FcHzB-8SSArwyqzZ-yL$Nr__Fx#MA*_m>QB+9{!o0_)Pr=|w zC_M-VEP+E9@=za&f_R4rSzKCq}`c3^Jn%+~fm%Wygqk1iO9#-qtt7{pLAJh%XM zfR6d<2oHr)gIpX-#GxSEZ^_t_zM({TOA4Bnh(yC%(||(o2iAKu5`gAHqal7+ zLa}(TU%&doO0jqX_%Kw#_Um_M3Dq{37>>3L4yN0-C6ZfGBcX7#Es+Xti6-OGq2N%c zuMK|aCWV=qxvq`IBj{ylOE?beTMc0o@LfT$e<(Bnp-~rVwQwd0p$=t+d#IT=Ir39 ztvePYh`}U^gwi2YhdDq?2j0Re-s)9wtDf;Zh7=TygdXaCT%*`VTo6ct{h`jj)07Sm(>!@ApHr+^wTuP%WD z295PH@k}ZjnSrB&;~h#4Y*oY2VVsN5Pz(l*^+C9q5gujT3f&%18OHfcOAczo2tu)* zhImd?R>uW{+s&$l35hS1)iCZ-x#2aT>&d8=Em|}$(7e7c6HjN%KGf2Y(Nf0^Gum6* zXSQ~nZ#Z8J!O0t5aKJ+s_`wE-r~c!};GC;d_Nn;JE0wdo+G(sP@g0CGh51m*&;Inq z=2Cz4eowc*{x-MEANXKVm%n+pcbWfLue;DG^EWT{2fFbt$)!tRS>$G0F}lRXOO`yz)x9vbz{M+;JjsPOI{A_d_j37?Yu<52+#@0iAvx#l%X9uCiI@+4R3HzQ+8Ts3hFL*OcYRG%w0E%oM}z*3Qk+^ZJlRCP|j z(t-Yr2yQGFjd>hl=F-@4nX2o1)ly;SJS`WgcEK+seSt~Ot7ggqkX^;IJXeU1kH=Z# z&No!^fa7|R37>N0h7+U!PQHbu3fS&xUQ>v<&q$5xn}np zb?P^#sUU8daP5W{19W1|Uc=~J85Hd61-#*a^F{W=fMU%oaZ^}PqFwNkjI4jxH?(?lL#T9egJ;Vk3k+2a-93jzmE_S@^j$F z{3i$@p?#di%wI(aN!oX53q^h|{8%4fv}2O?n~9@++(lTw#nQLiyV25bvh;^7j=K)q z*=pIbEm9)Tz?@1GWG+$-(dcXWykjW zBa6e!gRK53%f21YYnHxk=S_=Gvh29n@sKbc+fJp$o1u*3an zP}T{aCjF}gucSEp1iyytj0k=!>1PCgo%qdydvSmu?Kg*Pf9kJ9fPGx>=gIH=f_ISp zFAIJ*wd--gOGy5%;FT25^MWrW{xiWFDV|>oej~;6N5M}~JlwB5PhKKBbySb}IO0u$ z-$^pJoAvn$WTDVcl6<+~b=0n2!Ji`@75s9FpY5^VH;8k)nZK9Xf19xL36ei9IDVms z>9c|-DW0zgK8^Ts!STx@Oy3i{$zb&lg3lxQmx6zR;`zPce@C)I<=kG5o7W%nyD6SV zp^w)^n3@IuEXkJ${!{YXE%<3;My(e7DD}@q!S5p;6P)AQD)?ojzgzH!Nj@O>YSO<) z@CT_M9uT~Q_(OvKJGJ*mfCBFQe*tkQd5k3w}Gviv>6LJ4&q)yqo+c z1b>?3opi)*;d2OvbWrGjisZX3j&0^U-@}5V4NUi29IrQmB=b5(8~ED}KTHo>`pB=* zRH>f}ein`6F9ql8*VinLeiJkVM3BmUh zzgO59B>P{rI9{Xjms}?-j{UZi^uK4>=WACideP!IE{~Jnp9%gb@m~r467kms$B&0G z{Xy_bT1W2)&Y#A4>4Ka4`D@0E@)O4x^>s4w$ri`56=eS$!Iu)hP;lN)+63qQcaGqn zBRlg2zn}OL!M{g*x!`|Gd=+tS?_<=i9fD6n1xULJ@Oy;)H^}~dg8!EI=Y$=;UVPl* zI7C-yuSz{_ahz8hD4ypn`#3I}N&h8__;A;us75R*~Ojg0Ccgm9X=dWIt%>V|x$44^zV8X#YC0lM?;({uZW{h zj7JX;9NxA#mYpQO?+X3`aUY%d&@8Hy(7rL*;uz0N_+dKV;;4VGrb;ceIO;DV-eYmp z{{ivMg8zni#^PuvLi|RH>o}<&J})@0(XhJY|24tc&f9`NO7`C^z)NsIAn~|-i^jdY0IwB%7ul~X zzypHcMf&ESsO0=Mklzc1{!tp2wgP;%;L}O}(gJ*u;2)y#T2_Fs7M$Z>TYzsA{8tpu z<^tUOdzxH7e3SZTNa!=q2!4X>?m@HJU?KpZU3h^Z6A1 zMT1UkhxuH=KS1NVxBy=%IPWKXf57%hP2D8)dB5FPfZr)NUq9SafPYqSZr8&FI9~^G zoYzo$zb*8cKO;C_54>1_za)4C&D-A=;QuN(_b1;!ah!a;%FpGPKT7r6s2!5e7TiNJ zKPP5=Zr2K-e=Es+AIAFJkK2U)a}*DJ#;z0Vmypc%nDc(}QK8TA@cRPRKSX**gg*15 zf*&UNQNj7Ti_eo-jO&Y^_wn@$bM7~OFTlK*?EZm{lAjiw=W`j&3)bg&#tF{x@O>xi zx0~)&vxPpdTfXm<`tKL|ydJM9z>|V^l3%{RWc$1?d`##MlKy=b$Lk-yujKnew!`<8 zPg(jnE_aa~zAu#ezb>H9_k~h_0`14lcai;b3-AjC=Xm(OknQj~y;A7&I^9%&C6bBNVG3A0G~MaC%~A_hx+=G@M)o`VGw-HGD;35L-7Il!r#`(gW!YH zC|iZFRBJdfJRF6ua$Do@wQ(za2?$>s!`F)>!@pH%h3}9@qRI3QG94X+&u`$r(#dwn ze=mdg9XJHMuduaF&WIxoSC&qN95OmxWO-*cH##HhPlsY3{Qj%;FM_&ga|ZnE)Jej1 zHiSI-!o+c0N_knI_n$$no%_S}__&(t%l_ka!1J6fRC9)oE8vJ*eJ9C$*xqDv$LKl; zzyClV9DhA2_Q8>3A*2so)S)-f{VA78-Az!C&wo1(45aGu=7|2$xAY$eCT(JkuhYjU z{N5NDCaHUK9)^02)KNwD#X%lj9N&ELcjCZ8>ZO1&{&M)q_zwb;F#%Fj=tG=#6s#n5 z@w}PO|Di>u64yun*d@~c{lKJ6tht)}Um*&Gs1Ac}KL6h#|A(#lgWtqR|9BpfHUX)7 z@nbPa{9f2dV|Bj*1^N6BE;TiHo?`oJ;3xf`0EYg#pCGH#vPtIn&uH9A94jC3em-CQ zmMNwZ?hkh2dVIw5D(7vz4OHJ|n3uXQ1H|C{pke;w#@eIA#5zR}Z3@_&-{5gd-Q^3=!2o1_A{TsnHL$v>4tIw$)N R=S05xhbaCsQ9+36KLEjsn2!Je diff --git a/labcodes/lab4/tools/gdbinit b/labcodes/lab4/tools/gdbinit index 6a429c1b..2c9adc9d 100644 --- a/labcodes/lab4/tools/gdbinit +++ b/labcodes/lab4/tools/gdbinit @@ -1,5 +1,7 @@ file bin/kernel target remote :1234 b kern_init -break swap_init +b proc_init +b kernel_thread +b do_fork continue -- Gitee