Issue title: Separate drivers to crates
 Issue body: - [x] APIC
- [ ] VirtIO
- [ ] E1000
- [ ] IXGBE
- [ ] PCI
- [ ] ATA/IDE
 Comments: 
 Comment 0: Things need to expose to drivers:
1. Memory mapping (MMIO, DMA addrs)
2. Mutex with no irq lock (optional?)
3. Interrupt handler
4. Interrupt number assignment when available
 Comment 1: See https://github.com/rcore-os/isomorphic_drivers
{'source': 'GithubIssues', 'repo_name_with_owner': 'oscourse-tsinghua/rcore_plus', 'issue_id': 422799412, 'repo_stars': 168.0}