64bit 用户空间内核空间

64位的linux采用4级页表,支持的最大物理内存为64T。
对于虚拟地址空间的划分,将0x0000,0000,0000,0000 – 0x0000,7fff,ffff,f000这128T地址用于用户空间;而0xffff,8000,0000,0000以上的128T为系统空间地址。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是一个简单的 PCI 驱动,将 BAR0 映射到用户空间。 ```c #include <linux/module.h> #include <linux/pci.h> #include <linux/fs.h> #include <linux/uaccess.h> #define MY_DEVICE_VENDOR_ID 0x1234 #define MY_DEVICE_DEVICE_ID 0x5678 #define MY_DEVICE_BAR_NUM 0 static struct pci_device_id my_device_id_table[] = { { PCI_DEVICE(MY_DEVICE_VENDOR_ID, MY_DEVICE_DEVICE_ID) }, { 0 } }; MODULE_DEVICE_TABLE(pci, my_device_id_table); static int my_device_probe(struct pci_dev *dev, const struct pci_device_id *id) { void __iomem *bar_addr; int bar_size; int ret; /* Enable the PCI device */ ret = pci_enable_device(dev); if (ret) { dev_err(&dev->dev, "Failed to enable PCI device\n"); return ret; } /* Set the DMA mask */ ret = dma_set_mask(&dev->dev, DMA_BIT_MASK(32)); if (ret) { dev_err(&dev->dev, "Failed to set DMA mask\n"); goto disable_device; } /* Map the BAR */ bar_addr = pci_iomap(dev, MY_DEVICE_BAR_NUM, 0); if (!bar_addr) { dev_err(&dev->dev, "Failed to map BAR%d\n", MY_DEVICE_BAR_NUM); ret = -ENODEV; goto disable_device; } /* Get the BAR size */ bar_size = pci_resource_len(dev, MY_DEVICE_BAR_NUM); /* Do something with the BAR */ /* ... */ /* Unmap the BAR */ iounmap(bar_addr); /* Disable the PCI device */ pci_disable_device(dev); return 0; disable_device: pci_disable_device(dev); return ret; } static void my_device_remove(struct pci_dev *dev) { /* Do nothing for now */ } static struct pci_driver my_device_driver = { .name = "my_device_driver", .id_table = my_device_id_table, .probe = my_device_probe, .remove = my_device_remove, }; static int __init my_device_init(void) { int ret; /* Register the PCI driver */ ret = pci_register_driver(&my_device_driver); if (ret) { pr_err("Failed to register PCI driver\n"); return ret; } return 0; } static void __exit my_device_exit(void) { /* Unregister the PCI driver */ pci_unregister_driver(&my_device_driver); } module_init(my_device_init); module_exit(my_device_exit); MODULE_LICENSE("GPL"); ``` 在该驱动中,我们定义了一个 `my_device_probe` 函数,其中我们使用 `pci_enable_device` 函数来启用 PCI 设备,使用 `dma_set_mask` 函数来设置 DMA 位掩码,使用 `pci_iomap` 函数来映射 BAR0 到内核空间,然后使用 `iounmap` 函数来解除映射。在实际开发中,我们可以使用 `remap_pfn_range` 函数将 BAR0 映射到用户空间。 需要注意的是,该驱动只适用于在 PCI 总线上具有 vendor ID 为 `MY_DEVICE_VENDOR_ID`,device ID 为 `MY_DEVICE_DEVICE_ID` 的设备,并且我们只将 BAR0 映射到用户空间。在实际开发中,我们需要根据具体硬件设备的情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值