diff --git a/src/descriptor.rs b/src/descriptor.rs
index 039cdae..ef78d13 100644
--- a/src/descriptor.rs
+++ b/src/descriptor.rs
@@ -102,6 +102,7 @@
 
 /// Memory descriptor of a memory translation table
 #[repr(C)]
+#[derive(Default)]
 pub struct Descriptor {
     cell: UnsafeCell<u64>,
 }
@@ -122,7 +123,7 @@
     pub fn get_descriptor_type(&self, level: usize) -> DescriptorType {
         assert!(level <= 3);
 
-        let desc_type_bits = unsafe { self.get() } & Self::DESCRIPTOR_TYPE_MASK;
+        let desc_type_bits = self.get() & Self::DESCRIPTOR_TYPE_MASK;
         if desc_type_bits & Self::VALID_BIT != 0 {
             if level == 3 {
                 assert_eq!(Self::TABLE_BIT, desc_type_bits & Self::TABLE_BIT);
@@ -141,7 +142,7 @@
 
     /// Check if it is a valid descriptor
     pub fn is_valid(&self) -> bool {
-        unsafe { self.get() & Self::VALID_BIT != 0 }
+        self.get() & Self::VALID_BIT != 0
     }
 
     // Block descriptor functions
@@ -162,9 +163,7 @@
 
         let table_bit = if level < 3 { 0 } else { Self::TABLE_BIT };
 
-        unsafe {
-            self.set(Self::VALID_BIT | table_bit | output_address as u64 | attr);
-        }
+        self.set(Self::VALID_BIT | table_bit | output_address as u64 | attr);
     }
 
     /// Get output address from the block descriptor
@@ -172,7 +171,7 @@
         assert!(level <= 3);
         assert_eq!(DescriptorType::Block, self.get_descriptor_type(level));
 
-        ((unsafe { self.get() }) & Self::OA_MASK) as usize
+        (self.get() & Self::OA_MASK) as usize
     }
 
     /// Set the attributes of the block descriptor
@@ -182,7 +181,7 @@
         assert_eq!(0, attr & !Self::ATTR_MASK);
         assert_eq!(DescriptorType::Block, self.get_descriptor_type(level));
 
-        unsafe { self.modify(|d| (d & !Self::ATTR_MASK) | attr) };
+        self.modify(|d| (d & !Self::ATTR_MASK) | attr);
     }
 
     /// Get the attributes of the block descriptor
@@ -190,7 +189,7 @@
         assert!(level <= 3);
         assert_eq!(DescriptorType::Block, self.get_descriptor_type(level));
 
-        Attributes::from((unsafe { self.get() }) & Self::ATTR_MASK)
+        Attributes::from(self.get() & Self::ATTR_MASK)
     }
 
     /// Set block descriptor to invalid
@@ -198,7 +197,7 @@
         assert!(level <= 3);
         assert_eq!(DescriptorType::Block, self.get_descriptor_type(level));
 
-        unsafe { self.set(Self::INVALID_DESCRIPTOR_VALUE) }
+        self.set(Self::INVALID_DESCRIPTOR_VALUE)
     }
 
     /// Set table descriptor
@@ -260,7 +259,7 @@
         assert!(level <= 2);
         assert_eq!(DescriptorType::Table, self.get_descriptor_type(level));
 
-        NextLevelAttributes::from((unsafe { self.get() }) & Self::NEXT_ATTR_MASK)
+        NextLevelAttributes::from(self.get() & Self::NEXT_ATTR_MASK)
     }
 
     /// Set table descriptor to invalid
@@ -278,17 +277,17 @@
     }
 
     /// Get raw descriptor value
-    unsafe fn get(&self) -> u64 {
-        ptr::read_volatile(self.cell.get())
+    fn get(&self) -> u64 {
+        unsafe { ptr::read_volatile(self.cell.get()) }
     }
 
     /// Set raw descriptor value
-    unsafe fn set(&mut self, value: u64) {
-        ptr::write_volatile(self.cell.get(), value)
+    fn set(&mut self, value: u64) {
+        unsafe { ptr::write_volatile(self.cell.get(), value) }
     }
 
     /// Modify raw descriptor value
-    unsafe fn modify<F>(&mut self, f: F)
+    fn modify<F>(&mut self, f: F)
     where
         F: Fn(u64) -> u64,
     {
@@ -459,7 +458,7 @@
     };
 
     descriptor.set_block_descriptor(1, 0, Attributes::default());
-    assert_eq!(0x1, unsafe { descriptor.get() });
+    assert_eq!(0x1, descriptor.get());
 }
 
 #[test]
@@ -486,7 +485,7 @@
             ..Default::default()
         },
     );
-    assert_eq!(0x0040000f_c0000001, unsafe { descriptor.get() });
+    assert_eq!(0x0040000f_c0000001, descriptor.get());
 
     let mut descriptor = Descriptor {
         cell: UnsafeCell::new(0),
@@ -500,7 +499,7 @@
             ..Default::default()
         },
     );
-    assert_eq!(0x0040000f_fffff003, unsafe { descriptor.get() });
+    assert_eq!(0x0040000f_fffff003, descriptor.get());
 
     assert_eq!(0x0000000f_fffff000, descriptor.get_block_output_address(3));
     assert_eq!(
@@ -544,7 +543,7 @@
     };
 
     descriptor.set_block_descriptor_to_invalid(3);
-    assert_eq!(0, unsafe { descriptor.get() });
+    assert_eq!(0, descriptor.get());
 }
 
 #[test]
@@ -573,7 +572,7 @@
     unsafe {
         descriptor.set_table_descriptor(0, next_level_table, None);
     }
-    assert_eq!(0x1003, unsafe { descriptor.get() });
+    assert_eq!(0x1003, descriptor.get());
 }
 
 #[test]
@@ -615,7 +614,7 @@
     unsafe {
         descriptor.set_table_descriptor(0, next_level_table, None);
     }
-    assert_eq!(0x0000_000c_ba98_7003, unsafe { descriptor.get() });
+    assert_eq!(0x0000_000c_ba98_7003, descriptor.get());
 }
 
 #[test]
@@ -637,9 +636,7 @@
             }),
         );
     }
-    assert_eq!(NEXT_LEVEL_ADDR | 0x8000_0000_0000_0003, unsafe {
-        descriptor.get()
-    });
+    assert_eq!(NEXT_LEVEL_ADDR | 0x8000_0000_0000_0003, descriptor.get());
 }
 
 #[test]
@@ -688,7 +685,7 @@
     assert_eq!(KernelSpace::pa_to_kernel(NEXT_LEVEL_ADDR), unsafe {
         descriptor.set_table_descriptor_to_invalid(0).as_ptr() as *mut Descriptor as u64
     });
-    assert_eq!(0, unsafe { descriptor.get() });
+    assert_eq!(0, descriptor.get());
 }
 
 #[test]
@@ -700,13 +697,11 @@
         cell: UnsafeCell::new(cell_value),
     };
 
-    unsafe {
-        assert_eq!(cell_value, descriptor.get());
+    assert_eq!(cell_value, descriptor.get());
 
-        descriptor.set(cell_new_value);
-        assert_eq!(cell_new_value, descriptor.get());
+    descriptor.set(cell_new_value);
+    assert_eq!(cell_new_value, descriptor.get());
 
-        descriptor.modify(|d| d + 1);
-        assert_eq!(cell_new_value + 1, descriptor.get());
-    }
+    descriptor.modify(|d| d + 1);
+    assert_eq!(cell_new_value + 1, descriptor.get());
 }
diff --git a/src/lib.rs b/src/lib.rs
index c70824e..9592c04 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -44,7 +44,7 @@
 impl BaseTable {
     pub fn new() -> Self {
         BaseTable {
-            descriptors: unsafe { core::mem::transmute([0u64; 64]) },
+            descriptors: core::array::from_fn(|_| Descriptor::default()),
         }
     }
 }
