weiriver 发表于 2004-4-20 16:36:38

Linux2.6内核驱动移植参考(3)

19、        新增创建VFS的"libfs"
        libfs给创建一个新的文件系统提供了大量的API.
        主要是对struct file_system_type的实现。
        参考源代码:
        drivers/hotplug/pci_hotplug_core.c
        drivers/usb/core/inode.c
        drivers/oprofile/oprofilefs.c
        fs/ramfs/inode.c
        fs/nfsd/nfsctl.c (simple_fill_super() example)
20、        DMA的变化
        未变化的有:
        void *pci_alloc_consistent(struct pci_dev *dev, size_t size,
                             dma_addr_t *dma_handle);
            void pci_free_consistent(struct pci_dev *dev, size_t size,
                             void *cpu_addr, dma_addr_t dma_handle);
        变化的有:
        1、        void *dma_alloc_coherent(struct device *dev, size_t size,
                             dma_addr_t *dma_handle, int flag);
                  void dma_free_coherent(struct device *dev, size_t size,
                           void *cpu_addr, dma_addr_t dma_handle);
        2、列举了映射方向:
                enum dma_data_direction {
                      DMA_BIDIRECTIONAL = 0,
                      DMA_TO_DEVICE = 1,
                      DMA_FROM_DEVICE = 2,
                      DMA_NONE = 3,
                    };
        3、单映射
        dma_addr_t dma_map_single(struct device *dev, void *addr,
                            size_t size,
                              enum dma_data_direction direction);
            void dma_unmap_single(struct device *dev, dma_addr_t dma_addr,
                        size_t size,
                          enum dma_data_direction direction);
        4、页面映射
            dma_addr_t dma_map_page(struct device *dev, struct page *page,
                            unsigned long offset, size_t size,
                          enum dma_data_direction direction);
          void dma_unmap_page(struct device *dev, dma_addr_t dma_addr,
                        size_t size,
                        enum dma_data_direction direction);
        5、有关scatter/gather的函数:
        int dma_map_sg(struct device *dev, struct scatterlist *sg,
                   int nents, enum dma_data_direction direction);
           void dma_unmap_sg(struct device *dev, struct scatterlist *sg,
                      int nhwentries, enum dma_data_direction direction);
        6、非一致性映射(Noncoherent DMA mappings)
        void *dma_alloc_noncoherent(struct device *dev, size_t size,
                                dma_addr_t *dma_handle, int flag);
        void dma_sync_single_range(struct device *dev, dma_addr_t dma_handle,
                               unsigned long offset, size_t size,
                             enum dma_data_direction direction);
        void dma_free_noncoherent(struct device *dev, size_t size,
                              void *cpu_addr, dma_addr_t dma_handle);
        7、DAC (double address cycle)
        int pci_dac_set_dma_mask(struct pci_dev *dev, u64 mask);
        void pci_dac_dma_sync_single(struct pci_dev *dev,
                               dma64_addr_t dma_addr,
                               size_t len, int direction);
21、        互斥
        新增seqlock主要用于:
        1、少量的数据保护
        2、数据比较简单(没有指针),并且使用频率很高
        3、对不产生任何副作用的数据的访问
        4、访问时写者不被饿死
        <linux/seqlock.h>
        初始化
        seqlock_t lock1 = SEQLOCK_UNLOCKED;
            或seqlock_t lock2;   seqlock_init(&lock2);
                void write_seqlock(seqlock_t *sl);
          void write_sequnlock(seqlock_t *sl);
          int write_tryseqlock(seqlock_t *sl);
            void write_seqlock_irqsave(seqlock_t *sl, long flags);
            void write_sequnlock_irqrestore(seqlock_t *sl, long flags);
            void write_seqlock_irq(seqlock_t *sl);
            void write_sequnlock_irq(seqlock_t *sl);
            void write_seqlock_bh(seqlock_t *sl);
            void write_sequnlock_bh(seqlock_t *sl);
            unsigned int read_seqbegin(seqlock_t *sl);
            int read_seqretry(seqlock_t *sl, unsigned int iv);
            unsigned int read_seqbegin_irqsave(seqlock_t *sl, long flags);
            int read_seqretry_irqrestore(seqlock_t *sl, unsigned int iv, long flags);
22、        内核可剥夺
        <linux/preempt.h>
        preempt_disable();
        preempt_enable_no_resched();
        preempt_enable_noresched();
        preempt_check_resched();
23、        眠和唤醒
        1、原来的函数可用,新增下列函数:
        prepare_to_wait_exclusive();
        prepare_to_wait();
        2、等待队列的变化
        typedef int (*wait_queue_func_t)(wait_queue_t *wait,
                                     unsigned mode, int sync);
        void init_waitqueue_func_entry(wait_queue_t *queue,
                                 wait_queue_func_t func);
24、        新增完成事件(completion events)
        <linux/completion.h>
        init_completion(&my_comp);
        void wait_for_completion(struct completion *comp);
        void complete(struct completion *comp);
            void complete_all(struct completion *comp);
25、        RCU(Read-copy-update)
        rcu_read_lock();
        void call_rcu(struct rcu_head *head, void (*func)(void *arg),
                  void *arg);
26、        中断处理
        1、中断处理有返回值了。
        IRQ_RETVAL(handled);
        2、cli(), sti(), save_flags(), 和 restore_flags()不再有效,应该使用local_save_flags() 或local_irq_disable()。
        3、synchronize_irq()函数有改动
        4、新增int can_request_irq(unsigned int irq, unsigned long flags);
        5、        request_irq() 和free_irq() 从 <linux/sched.h>改到了 <linux/interrupt.h>
27、        异步I/O(AIO)
        <linux/aio.h>
        ssize_t (*aio_read) (struct kiocb *iocb, char __user *buffer,
                       size_t count, loff_t pos);
            ssize_t (*aio_write) (struct kiocb *iocb, const char __user *buffer,
                          size_t count, loff_t pos);
            int (*aio_fsync) (struct kiocb *, int datasync);
        新增到了file_operation结构中。
        is_sync_kiocb(struct kiocb *iocb);
        int aio_complete(struct kiocb *iocb, long res, long res2);
28、        网络驱动
        1、struct net_device *alloc_netdev(int sizeof_priv, const char *name,
                                       void (*setup)(struct net_device *));
        struct net_device *alloc_etherdev(int sizeof_priv);
        2、新增NAPI(New API)
        void netif_rx_schedule(struct net_device *dev);
        void netif_rx_complete(struct net_device *dev);
        int netif_rx_ni(struct sk_buff *skb);
        (老版本为netif_rx())
29、        USB驱动
        老版本struct usb_driver取消了,新的结构体为
        struct usb_class_driver {
                char *name;
                struct file_operations *fops;
                mode_t mode;
                int minor_base;
      };
        int usb_submit_urb(struct urb *urb, int mem_flags);
        int (*probe) (struct usb_interface *intf,
                      const struct usb_device_id *id);
30、        block I/O 层
        这一部分做的改动最大。不祥叙。
31、        mmap()
        int remap_page_range(struct vm_area_struct *vma, unsigned long from,
                         unsigned long to, unsigned long size,
                       pgprot_t prot);
        int io_remap_page_range(struct vm_area_struct *vma, unsigned long from,
                            unsigned long to, unsigned long size,
                          pgprot_t prot);
        struct page *(*nopage)(struct vm_area_struct *area,
                         unsigned long address,
                           int *type);
        int (*populate)(struct vm_area_struct *area, unsigned long address,
                  unsigned long len, pgprot_t prot, unsigned long pgoff,
                  int nonblock);
        int install_page(struct mm_struct *mm, struct vm_area_struct *vma,
                     unsigned long addr, struct page *page,
                     pgprot_t prot);
        struct page *vmalloc_to_page(void *address);
32、        零拷贝块I/O(Zero-copy block I/O)
        struct bio *bio_map_user(struct block_device *bdev,
                           unsigned long uaddr,
                             unsigned int len,
                             int write_to_vm);
        void bio_unmap_user(struct bio *bio, int write_to_vm);
        int get_user_pages(struct task_struct *task,
                     struct mm_struct *mm,
                     unsigned long start,
                     int len,
                     int write,
                     int force,
                     struct page **pages,
                     struct vm_area_struct **vmas);
33、        高端内存操作kmaps
        void *kmap_atomic(struct page *page, enum km_type type);
        void kunmap_atomic(void *address, enum km_type type);
                struct page *kmap_atomic_to_page(void *address);
                老版本:kmap() 和 kunmap()。
34、        驱动模型
主要用于设备管理。
1、        sysfs
2、        Kobjects


推荐文章:
http://www-900.ibm.com/developerWorks/cn/linux/kernel/l-kernel26/index.shtml#1
http://www-900.ibm.com/developerWorks/cn/linux/l-inside/index.shtml#h1
(over)

jinzhcheng 发表于 2004-4-21 09:35:56

多谢!
页: [1]
查看完整版本: Linux2.6内核驱动移植参考(3)