Skip to content

Latest commit

 

History

History
113 lines (94 loc) · 3.33 KB

File metadata and controls

113 lines (94 loc) · 3.33 KB

#mmap mmap不影响源文件长度

虚拟内存区间由:程序代码、数据、BSS、堆区、内存映射区、栈区构成 (地址由低到高) 查看方法: /proc/pid/maps

mmap设备方法就是要建立虚拟地址到物理地址的页表

int (*mmap)(struct file*,struct vm_area_struct *))

虚拟地址转化为物理地址的函数: int virt_to_phys(); 页表的建立: remap_pfn_range函数

int memdev_mmap(struct file *filp,struct vm_aera_struct* vma)
{
    Vma->vm_flags |= VM_IO;
    Vma->vm_flags |= VM_RESERVED; //设置访问属性

    if(remap_pfn_range(vma,vma->vm_start,
        virt_to_phys(dev->data)<<PAGE_SHIFT,
        size,
        vma->vm_page_prot))
     return -EAGAIN;

    return 0;
} 

应用:通过mmap把用户空间的一段地址关联到设备内存上

##寄存器与内存

寄存器和RAM的区别在于 寄存器操作有副作用,比如清零

  • IO端口:寄存器或内存位于IO空间
  • IO内存:寄存器或内存位于内存空间

#IO端口操作: 1.申请 函数: struct resource *reuest_region(unsignwed long first, unsigned long n,const char name); 情况被记录在 /proc/ioprots中 2.访问 IO端口分为8位、16位和32位端口。 内核头文件定义了以下几个访问函数 * 8位 - unsigned inb(unsigned port) //读 - void outb(unsigned char byte,unsigned port) //写 * 16位 - unsigned inb(unsigned port) //读 - void outb(unsigned char byte,unsigned port) //写 * 32位 - unsigned inb(unsigned port) //读 - void outb(unsigned char byte,unsigned port) //写

3.释放 函数: void release_region(unsigned long start,unsigned long n)

#IO内存口操作: 1.申请 函数: struct resource *reuest_mem_region(unsignwed long first, unsigned long n,const char name); 成功:返回非NULL 失败:返回NULL 情况被记录在 /proc/iomem中 3.映射IO内存 在访问IO内存之前,必须进行物理地址到虚拟地址之间的映射,ioremap函数具有此功能 void *loremap(unsigned phys_addr,unsigned long size); 4.访问 IO端口分为8位、16位和32位端口。 内核头文件定义了以下几个访问函数 * 8位 - unsigned ioread8(void *addr) //读 - void iowrite8(u8 value,void *addr) //写 * 16位 - unsigned ioread16(void *addr) //读 - void iowrite16(u16 value,void *addr) //写 * 32位 - unsigned ioread32(void *addr) //读 - void iowrite32(u32 value,void *addr) //写

5.释放 函数: void release_region(unsigned long start,unsigned long n)\

混杂设备 一些字符设备共享一个主设备号:10,但次设备号不同,称为混杂设备(miscdevice) 所有混杂设备形成一个链表,访问时内核根据次设备号查到相应设备

struct miscdevice{
    int minor;  /*次设备号*/
    coust char *name;/*设备名*/
    const struct file_operations *fops;/*文件操作*/
    struct list_head list;
    struct device *parent;
    struct device *this_device;
}

注册混杂设备: 函数: int misc_register(struct miscdevice *misc);

##Sys文件系统 其它目录大部分设备最终都指向Devices目录下的设备 kobject