diff --git a/crate/memory/src/cow.rs b/crate/memory/src/cow.rs
index 2ee6b10..26b6948 100644
--- a/crate/memory/src/cow.rs
+++ b/crate/memory/src/cow.rs
@@ -109,8 +109,8 @@ impl<T: PageTable> CowExt<T> {
             self.rc_map.write_decrease(&frame);
             return true;
         }
-        use core::mem::uninitialized;
-        let mut temp_data: [u8; PAGE_SIZE] = unsafe { uninitialized() };
+        use core::mem::MaybeUninit;
+        let mut temp_data: [u8; PAGE_SIZE] = unsafe { MaybeUninit::uninitialized().into_initialized() };
         temp_data[..].copy_from_slice(self.get_page_slice_mut(addr));
 
         self.unmap_shared(addr);
diff --git a/crate/memory/src/lib.rs b/crate/memory/src/lib.rs
index 61aef37..2b68ad0 100644
--- a/crate/memory/src/lib.rs
+++ b/crate/memory/src/lib.rs
@@ -1,6 +1,7 @@
 #![cfg_attr(not(test), no_std)]
 #![feature(alloc)]
 #![feature(nll)]
+#![feature(maybe_uninit)]
 
 // import macros from log
 use log::*;
diff --git a/crate/memory/src/paging/mock_page_table.rs b/crate/memory/src/paging/mock_page_table.rs
index 6395325..525d56c 100644
--- a/crate/memory/src/paging/mock_page_table.rs
+++ b/crate/memory/src/paging/mock_page_table.rs
@@ -144,10 +144,10 @@ impl MockPageTable {
      **  @retval MockPageTable        the mock page table created
      */
     pub fn new() -> Self {
-        use core::mem::uninitialized;
+        use core::mem::MaybeUninit;
         MockPageTable {
             entries: [MockEntry::default(); PAGE_COUNT],
-            data: unsafe { uninitialized() },
+            data: unsafe { MaybeUninit::uninitialized().into_initialized() },
             page_fault_handler: None,
         }
     }
diff --git a/crate/memory/src/swap/mock_swapper.rs b/crate/memory/src/swap/mock_swapper.rs
index 74564c0..ec71c39 100644
--- a/crate/memory/src/swap/mock_swapper.rs
+++ b/crate/memory/src/swap/mock_swapper.rs
@@ -5,7 +5,7 @@
 
 use super::Swapper;
 use alloc::collections::BTreeMap;
-use core::mem::uninitialized;
+use core::mem::MaybeUninit;
 
 const PAGE_SIZE: usize = 4096;
 
@@ -17,7 +17,7 @@ pub struct MockSwapper {
 impl Swapper for MockSwapper {
     fn swap_out(&mut self, data: &[u8]) -> Result<usize, ()> {
         let id = self.alloc_id();
-        let mut slice: [u8; PAGE_SIZE] = unsafe { uninitialized() };
+        let mut slice: [u8; PAGE_SIZE] = unsafe { MaybeUninit::uninitialized().into_initialized() };
         slice.copy_from_slice(data);
         self.map.insert(id, slice);
         Ok(id)
@@ -27,7 +27,7 @@ impl Swapper for MockSwapper {
         if !self.map.contains_key(&token) {
             return Err(());
         }
-        let mut slice: [u8; PAGE_SIZE] = unsafe { uninitialized() };
+        let mut slice: [u8; PAGE_SIZE] = unsafe { MaybeUninit::uninitialized().into_initialized() };
         slice.copy_from_slice(data);
         self.map.insert(token, slice);
         Ok(())
@@ -64,8 +64,8 @@ mod test {
     #[test]
     fn swap_out_in() {
         let mut swapper = MockSwapper::default();
-        let mut data: [u8; 4096] = unsafe { uninitialized() };
-        let data1: [u8; 4096] = unsafe { uninitialized() };
+        let mut data: [u8; 4096] = unsafe { MaybeUninit::uninitialized().into_initialized() };
+        let data1: [u8; 4096] = unsafe { MaybeUninit::uninitialized().into_initialized() };
         let token = swapper.swap_out(&data1).unwrap();
         swapper.swap_in(token, &mut data).unwrap();
         assert_data_eq(&data, &data1);
@@ -74,9 +74,9 @@ mod test {
     #[test]
     fn swap_update() {
         let mut swapper = MockSwapper::default();
-        let mut data: [u8; 4096] = unsafe { uninitialized() };
-        let data1: [u8; 4096] = unsafe { uninitialized() };
-        let data2: [u8; 4096] = unsafe { uninitialized() };
+        let mut data: [u8; 4096] = unsafe { MaybeUninit::uninitialized().into_initialized() };
+        let data1: [u8; 4096] = unsafe { MaybeUninit::uninitialized().into_initialized() };
+        let data2: [u8; 4096] = unsafe { MaybeUninit::uninitialized().into_initialized() };
         let token = swapper.swap_out(&data1).unwrap();
         swapper.swap_update(token, &data2).unwrap();
         swapper.swap_in(token, &mut data).unwrap();
@@ -86,7 +86,7 @@ mod test {
     #[test]
     fn invalid_token() {
         let mut swapper = MockSwapper::default();
-        let mut data: [u8; 4096] = unsafe { uninitialized() };
+        let mut data: [u8; 4096] = unsafe { MaybeUninit::uninitialized().into_initialized() };
         assert_eq!(swapper.swap_in(0, &mut data), Err(()));
     }
 }
diff --git a/kernel/src/arch/aarch64/paging.rs b/kernel/src/arch/aarch64/paging.rs
index 5e7cd94..1d27b85 100644
--- a/kernel/src/arch/aarch64/paging.rs
+++ b/kernel/src/arch/aarch64/paging.rs
@@ -212,7 +212,7 @@ impl PageTableImpl {
         PageTableImpl {
             page_table: MappedPageTable::new(table, frame_to_page_table),
             root_frame: frame,
-            entry: core::mem::uninitialized(),
+            entry: core::mem::MaybeUninit::uninitialized().into_initialized(),
         }
     }
 }
@@ -227,7 +227,7 @@ impl PageTableExt for PageTableImpl {
             PageTableImpl {
                 page_table: MappedPageTable::new(table, frame_to_page_table),
                 root_frame: frame,
-                entry: core::mem::uninitialized(),
+                entry: core::mem::MaybeUninit::uninitialized().into_initialized(),
             }
         }
     }
diff --git a/kernel/src/arch/mipsel/paging.rs b/kernel/src/arch/mipsel/paging.rs
index 81815b2..2dd1cdf 100644
--- a/kernel/src/arch/mipsel/paging.rs
+++ b/kernel/src/arch/mipsel/paging.rs
@@ -155,7 +155,7 @@ impl PageTableImpl {
         PageTableImpl {
             page_table: TwoLevelPageTable::new(table),
             root_frame: frame,
-            entry: unsafe { core::mem::uninitialized() },
+            entry: unsafe { core::mem::MaybeUninit::uninitialized().into_initialized() },
         }
     }
 }
@@ -171,7 +171,7 @@ impl PageTableExt for PageTableImpl {
         PageTableImpl {
             page_table: TwoLevelPageTable::new(table),
             root_frame: frame,
-            entry: unsafe { core::mem::uninitialized() },
+            entry: unsafe { core::mem::MaybeUninit::uninitialized().into_initialized() },
         }
     }
 
diff --git a/kernel/src/arch/x86_64/paging.rs b/kernel/src/arch/x86_64/paging.rs
index b8f07ec..b6c5491 100644
--- a/kernel/src/arch/x86_64/paging.rs
+++ b/kernel/src/arch/x86_64/paging.rs
@@ -202,7 +202,7 @@ impl PageTableImpl {
         let table = unsafe { &mut *frame_to_page_table(frame) };
         PageTableImpl(
             MappedPageTable::new(table, frame_to_page_table),
-            core::mem::uninitialized(),
+            core::mem::MaybeUninit::uninitialized().into_initialized()(),
             frame,
         )
     }
@@ -217,7 +217,7 @@ impl PageTableExt for PageTableImpl {
         unsafe {
             PageTableImpl(
                 MappedPageTable::new(table, frame_to_page_table),
-                core::mem::uninitialized(),
+                core::mem::MaybeUninit::uninitialized().into_initialized()(),
                 frame,
             )
         }
diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs
index 1b8f90b..8788476 100644
--- a/kernel/src/lib.rs
+++ b/kernel/src/lib.rs
@@ -7,6 +7,7 @@
 #![feature(panic_info_message)]
 #![feature(global_asm)]
 #![feature(fnbox)]
+#![feature(maybe_uninit)]
 #![deny(unused_must_use)]
 #![no_std]
 
diff --git a/kernel/src/process/structs.rs b/kernel/src/process/structs.rs
index 0ed4ce8..384d2d5 100644
--- a/kernel/src/process/structs.rs
+++ b/kernel/src/process/structs.rs
@@ -21,7 +21,7 @@ use crate::sync::{Condvar, SpinNoIrqLock as Mutex};
 
 use super::abi::{self, ProcInitInfo};
 use crate::processor;
-use core::mem::uninitialized;
+use core::mem::MaybeUninit;
 use rcore_fs::vfs::INode;
 
 pub struct Thread {
@@ -103,7 +103,7 @@ impl Thread {
         Box::new(Thread {
             context: Context::null(),
             // safety: other fields will never be used
-            ..core::mem::uninitialized()
+            ..core::mem::MaybeUninit::uninitialized().into_initialized()
         })
     }
 
@@ -146,7 +146,7 @@ impl Thread {
     ) -> Result<(MemorySet, usize, usize), &'static str> {
         // Read ELF header
         // 0x3c0: magic number from ld-musl.so
-        let mut data: [u8; 0x3c0] = unsafe { uninitialized() };
+        let mut data: [u8; 0x3c0] = unsafe { MaybeUninit::uninitialized().into_initialized() };
         inode
             .read_at(0, &mut data)
             .map_err(|_| "failed to read from INode")?;