第一个 驱动开发_第一个安卓驱动 - CSDN
  • Windows驱动开发第一个驱动程序

    千次阅读 2016-07-05 10:18:09
    一个简单的驱动程序

    转载请注明来源:
    enjoy5512的博客 : http://blog.csdn.net/enjoy5512
    GitHub : https://github.com/whu-enjoy

    为了整理方便,可以在一个合适的路径下建立一个专门的文件夹用于保存源代码.打开桌面的x86 Checked Build Enviroment快捷方式,进到源代码所在文件夹下,可以看到每个程序至少有三个文件,一个源代码文件,一个是makefile,一个sources,头文件是可选的
    这里写图片描述


    头文件

    /////////////////////////////////////////////////////////////////////////////
    //  文件名 : fitst.h
    //  工程 : first 
    //  作者 : enjoy5512   修改者 : enjoy5512   最后优化注释者 : enjoy5512
    //  个人技术博客 : blog.csdn.net/enjoy5512
    //  个人GitHub   : github.com/whu-enjoy
    //  描述 : 第一个驱动程序的头文件
    //  版本 : 最终确定版  完成日期 : 2016年7月5日 09:25:30
    //  修改 :
    //  参考文献 :
    //       <<Windows内核安全与驱动开发>> 谭文 陈铭霖 编著
    //////////////////////////////////////////////////////////////////////////////
    
    #ifndef __FIRST_H__
    #define __FIRST_H__
    
    
    //////////////////////////////////////////////////////////////////////////////
    //*= = 头文件声明
    //////////////////////////////////////////////////////////////////////////////
    #include <ntddk.h>
    
    //////////////////////////////////////////////////////////////////////////////
    //*= = 宏与结构体
    //////////////////////////////////////////////////////////////////////////////
    
    //////////////////////////////////////////////////////////////////////////////
    //*= = 函数声明
    //////////////////////////////////////////////////////////////////////////////
    NTSTATUS
    DriverEntry(
        __in PDRIVER_OBJECT DriverObject,
        __in PUNICODE_STRING RegistryPath
        );
    
    VOID
    DriverUnload(
        __in PDRIVER_OBJECT DriverObject
        );
    
    #endif //End of __FIRST_H__

    源代码

    /////////////////////////////////////////////////////////////////////////////
    //  文件名 : fitst.c
    //  工程 : first 
    //  作者 : enjoy5512   修改者 : enjoy5512   最后优化注释者 : enjoy5512
    //  个人技术博客 : blog.csdn.net/enjoy5512
    //  个人GitHub   : github.com/whu-enjoy
    //  描述 : 第一个驱动程序
    //  主要函数 :
    //      VOID DriverUnload(PDRIVER_OBJECT driver) 卸载函数
    //      NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) 入口函数
    //  版本 : 最终确定版  完成日期 : 2016年7月5日 09:36:17
    //  修改 :
    //  参考文献 :
    //       <<Windows内核安全与驱动开发>> 谭文 陈铭霖 编著
    /////////////////////////////////////////////////////////////////////////////
    
    #include "first.h"
    
    //程序说明开始
    //==================================================================================
    //  功能 : 驱动程序入口函数
    //  参数 :    __in PDRIVER_OBJECT DriverObject, in PUNICODE_STRING RegistryPath
    //  (入口)  __in PDRIVER_OBJECT DriverObject  : 驱动对象
    //          __in PUNICODE_STRING RegistryPath : 驱动在注册表中的键值
    //  (出口)  无
    //  返回 :  NTSTATUS
    //  主要思路 : 先设置一个int3断点,然后输出一句话,设置卸载函数
    //  调用举例 : 
    //  日期 : 2016年7月5日 09:32:32
    //==================================================================================
    //程序说明结束
    NTSTATUS 
    DriverEntry(
        __in PDRIVER_OBJECT DriverObject, 
        __in PUNICODE_STRING RegistryPath
        )
    {
        #if DBG
            _asm int 3
        #endif
    
        DbgPrint("first : hello ,load server!!\n");
    
        DriverObject->DriverUnload = DriverUnload;
    
        return STATUS_SUCCESS;
    }
    
    //程序说明开始
    //==================================================================================
    //  功能 : 驱动程序卸载
    //  参数 :    __in PDRIVER_OBJECT DriverObject
    //  (入口)  __in PDRIVER_OBJECT DriverObject  : 驱动对象
    //  (出口)  无
    //  返回 :  VOID
    //  主要思路 : 输出一句话
    //  调用举例 : 
    //  日期 : 2016年7月5日 09:35:59
    //==================================================================================
    //程序说明结束
    VOID 
    DriverUnload(
        __in PDRIVER_OBJECT driver
        )
    {
        DbgPrint("firts:Our driver is unloading!!\r\n");
    }

    makefile文件

    这个文件是固定的,内容不变

    !IF 0
    
    Copyright (C) Microsoft Corporation, 1999 - 2002
    
    Module Name:
    
        makefile.
    
    Notes:
    
        DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source
        file to this component.  This file merely indirects to the real make file
        that is shared by all the components of Windows NT (DDK)
    
    !ENDIF
    
    !INCLUDE $(NTMAKEENV)\makefile.def
    
    

    sources文件

    TARGETNAME=first
    TARGETTYPE=DRIVER
    SOURCES=first.c

    在源代码路径下,使用build命令编译驱动程序
    这里写图片描述

    将编译好的first.sys复制到虚拟机中
    将程序符号文件路径加到windbg符号路径中
    这里写图片描述

    设置源代码路径
    这里写图片描述

    启动服务,可以看到虚拟机卡住了,windbg在int3处中断了,然后便可以开始调试运行了
    这里写图片描述

    展开全文
  • linux设备驱动主要分为三类:字符设备驱动、块设备驱动、网络设备驱动 其中字符设备驱动适合...字符设备驱动开发流程 1.编写驱动代码  1.1 定义一个cdev 来表示你的驱动所对应的设备 struct cdev chrdev;  ...

    linux设备驱动主要分为三类:字符设备驱动、块设备驱动、网络设备驱动

    其中字符设备驱动适合用来入门,结构简单,更多关于设备驱动的东西这里就不作说明。

    上传了完整项目文档说明和代码:操作系统课程设计-简单字符设备和块设备驱动程序

    字符设备驱动开发流程

    1.编写驱动代码

          1.1 定义一个cdev 来表示你的驱动所对应的设备

    struct cdev chrdev;

           1.2 为你设备申请一个设备号

    unsigned int TestMajor=0;// 主设备号
    unsigned int TestMinor=0;// 次设备号
    char *name="demo1";//驱动名称
    dev_t dev_no; //设备号
    int ret; // 返回结果
    dev_no =MKDEV(TestMajor,TestMinor);
    if(dev_no>0){
    ret=register_chrdev_region(dev_no, 1,name);//静态注册设备号
    }
    else{//动态申请设备号
    alloc_chrdev_region(&dev_no,TestMinor, 1,name);
    }	
    if(ret<0){
    return ret;
    }

           1.3 定义文件操作集

    int my_open(struct inode *i,struct file *f){
            printk("cdev init\n");
            return 0;
    }
    
    int my_release(struct inode *i,struct file *f){
            printk("cdev release\n");
            return 0;
    }
    
    static ssize_t my_write(struct file *f,const char __user *u,size_t l,loff_t *o){
            printk("write string\n");
            return l;
    }
    
    static ssize_t my_read(struct file *f,char __user *u,size_t l,loff_t *o){
            printk("read string\n");
            return l;
    }
    
    struct file_operations fops={
            .owner=THIS_MODULE,
            .open=my_open,
            .release=my_release,
            .write=my_write,
            .read=my_read
    };
    

     

          1.4 初始化 cdev并添加到内核

    cdev_init(&chrdev,&fops);
    cdev_add(&chrdev,dev_no,1);//先初始化设备号,然后注册cdev

             1.5 设备号和cdev 的注销

    unregister_chrdev_region(dev_no, 1);
    cdev_dev(&chrdev);

             在贴上完整代码前先注明一点内容:

              一个驱动程序必须的部分如下:

    static int my_init(void){ 
            //驱动的初始化
            return 0;
    }
    
    static void my_exit(void){
            //驱动的退出
    }
    
    module_init(my_init); //调用系统函数来设置驱动初始化函数
    module_exit(my_exit); //设置驱动结束的函数
    
    MODULE_AUTHOR("guoz"); //设置作者 ,非必须
    MODULE_DESCRIPTION("this ostest demo1"); //设置描述,非必须
    MODULE_LICENSE("GPL"); // 必须加上,含义自行查找
    

               字符设备驱动涉及到了用户态和核态的信息传递,这里放上两个用户传递信息的系统函数:

    #include<linux/uaccess.h> //头文件
    //函数原型
    unsigned  long  copy_to_user(void *to,  const void  __user  *from,  usigned long  count);
    unsigned  long  copy_from_user(void __user *to,  const void *from,  usigned long  count);

             完整驱动程序代码如下:

    #include<linux/module.h>
    #include<linux/kernel.h>
    #include<linux/cdev.h>
    #include<linux/fs.h>
    #include<linux/kdev_t.h>
    #include<linux/types.h>
    #include<linux/uaccess.h>
    #include<linux/string.h>
    
    struct cdev chrdev;
    unsigned int major=0;
    unsigned int minor=0;
    dev_t dev_no;
    int ret;
    
    int my_open(struct inode *i,struct file *f){
    	printk("cdev init\n");
    	return 0;
    }
    
    int my_release(struct inode *i,struct file *f){
    	printk("cdev release\n");
    	return 0;
    }
    
    static ssize_t my_write(struct file *f,const char __user *u,size_t l,loff_t *o){
    	char buf[100];
    	copy_from_user(buf,u,l);
    	printk(KERN_EMERG"write string:%s",buf);
    	return l;
    }
    
    static ssize_t my_read(struct file *f,char __user *u,size_t l,loff_t *o){
    	char *buf="hello,user!";
    	copy_to_user(u,buf,strlen(buf));
    	printk(KERN_EMERG"read string:%s",buf);
    	return l;
    }
    
    struct file_operations fops={
    	.owner=THIS_MODULE,
    	.open=my_open,
    	.release=my_release,
    	.write=my_write,
    	.read=my_read
    };
    
    static int my_init(void){
    	dev_no=MKDEV(major,minor);
    	if(dev_no>0){
    		ret=register_chrdev_region(dev_no,1,"demo1");
    	}else{
    		ret=alloc_chrdev_region(&dev_no,0,1,"demo1");
    	}
    	if(ret<0){
    		return ret;
    	}
    	cdev_init(&chrdev,&fops);
    	chrdev.owner=THIS_MODULE;
    	cdev_add(&chrdev,dev_no,1);
    	return 0;
    }
    
    static void my_exit(void){
    	unregister_chrdev_region(dev_no,1);
    	cdev_del(&chrdev);
    }
    
    module_init(my_init);
    module_exit(my_exit);
    
    MODULE_AUTHOR("guoz");
    MODULE_DESCRIPTION("this ostest demo1");
    MODULE_LICENSE("GPL");

     

    2.编写Makefile文件

        用于编译驱动程序,文件可复制粘贴使用,注意修改 obj-m 的值

        

    ifneq ($(KERNELRELEASE),)
    obj-m := demo1.o
    else
    PWD := $(shell pwd)
    KVER := $(shell uname -r)
    KDIR := /lib/modules/$(KVER)/build
    all:
    	$(MAKE) -C $(KDIR) M=$(PWD) modules
    clean:
    	rm -fr .*.cmd *.o *.mod.c *.ko .tmp_versions modules.* Module.*
    endif

       这里也有坑注意,只有当该行写的命令时才能用 tab 符号开头,而且字符编码需要用 utf-8

    3.检查驱动安装是否完成

         上面的步骤完成后,结果就是两个文件 

    demo1.c Makefile

          3.1 在当前目录执行 make 命令(默认执行的是make all)

    gz@ubuntu:~/Desktop/demo1$ ls
    demo1.c  Makefile  test.c
    gz@ubuntu:~/Desktop/demo1$ make
    make -C /lib/modules/4.15.0-43-generic/build M=/home/gz/Desktop/demo1 modules
    make[1]: Entering directory '/usr/src/linux-headers-4.15.0-43-generic'
      CC [M]  /home/gz/Desktop/demo1/demo1.o
      Building modules, stage 2.
      MODPOST 1 modules
      CC      /home/gz/Desktop/demo1/demo1.mod.o
      LD [M]  /home/gz/Desktop/demo1/demo1.ko
    make[1]: Leaving directory '/usr/src/linux-headers-4.15.0-43-generic'
    gz@ubuntu:~/Desktop/demo1$ ls
    demo1.c   demo1.mod.c  demo1.o   modules.order   test.c
    demo1.ko  demo1.mod.o  Makefile  Module.symvers

          3.2 向内核插入驱动程序并获取设备号

    root@ubuntu:/home/gz/Desktop/demo1# insmod demo1.ko 
    root@ubuntu:/home/gz/Desktop/demo1# cat /proc/devices 
    Character devices:
      ...
    243 demo1
      ...

       3.3 添加设备文件

            从上一步可以得知 设备号为 243

    root@ubuntu:/home/gz/Desktop/demo1# mknod /dev/demo1 c 243 0
    root@ubuntu:/home/gz/Desktop/demo1# ll /dev/demo1 
    crw-r--r-- 1 root root 243, 0 Jan 28 22:28 /dev/demo1

     

    4.编写简单测试程序

    测试文件比较简单,这里直接贴完整代码 (test.c)

    #include<stdio.h>
    #include <unistd.h>
    #include<fcntl.h>
    int main(void)
    {
    int fd;
    char *buf="test.c";
    char buf2[20];
    fd=open("/dev/demo1",O_RDWR);
    if(fd<0){
    	printf("fd<0\n");
    }else{
    	printf("fd:%d\n",fd);
    }
    write(fd,buf,7);
    read(fd,buf2,18);
    printf("res:%s",buf2);
    close(fd);
    }

    5.检验成果

    运行测试程序,结果如下:

    root@ubuntu:/home/gz/Desktop/demo1# gcc test.c 
    root@ubuntu:/home/gz/Desktop/demo1# ./a.out
    fd:3
    res:hello,user!root

    在驱动程序中,使用printk输出的内容我们不能直接看到,这里采用dmesg命令查看

    root@ubuntu:/home/gz/Desktop/demo1# dmesg
    ...
    [  909.055395] cdev init
    [  909.055458] write string:test.c
    [  909.055461] read string:hello,user!
    [  909.055469] cdev release

     

    参考文章:字符设备驱动模块与测试代码编写

    展开全文
  • Windows驱动开发如何入门

    万次阅读 多人点赞 2016-03-16 18:21:23
    搞Windows驱动开发件痛苦的事情,特别是初学Windows驱动开发。有的人觉得Windows驱动开发就是把开发包WDK下载下来,然后只要掌握了C/C++语言,接下来无非就是类库调来调去,像调用MFC、QT之类的库那样,看着书和...
    搞Windows驱动开发是一件痛苦的事情,特别是初学Windows驱动开发。有的人觉得Windows驱动开发就是把开发包WDK下载下来,然后只要掌握了C/C++语言,接下来无非就是类库调来调去,像调用MFC、QT之类的库那样,看着书和MSDN上的文档来就行了。等真正接触以后才发现根本不是那么一回事,痛苦源于以下几点:
    

    痛苦一:中文资料太少
    讲Windows驱动开发的,无论是中文书籍还是网上的中文资料,都很少,手把手从零到精通的更是不用说了。仅有的少量中文资料,有的还比较旧,讲的是DDK、NT式驱动,新手拿着WDK8.1、WDK10面对Win8、Win10系统很难跟着学习,而且现在的WDK,在WDM上又出现了了WDF,而WDF又分KMDF(内核模式驱动)和UMDF(用户模式驱动),对于UMDF(用户模式驱动)中文资料就更少了。而且驱动开发不像应用开发,需要先对操作系统原理有一定了解,不然遇到“I/O管理器”、“输入输出请求包”、“软件中断”、“符号链接”、”派遣函数“等名词和概念都不知所云,是寸步难行的。

    解决方法:
    ①其实MSDN上已经提供了大量的文档和示例程序,对KMDF、UMDF等进行了详细的讲解,甚至还提供了手把手教你来的视频教程,可惜它们都是英文的,对于我等英语不好的程序员来说真是坐车不买票——白搭。最近越来越觉得英语不好是阻碍一个程序员进步最大的绊脚石,我们不谈什么算法,不谈什么数学功底了,首先要成为一个合格的码农,需要熟练使用各种编程语言和对应的各种工具库,而大部分的库都只有英文文档,不能流畅阅读这些文档的话,寸步难行。在成为了合格的码农,能熟练使用各种现成的工具库搭积木般的开发出应用程序后,才能去谈各种算法,各种数学知识的代入,才能去谈如何从一个码农升级为软件工程师。显然,当前摆在我面前最迫切的问题是如何成为一个合格的码农,先养活自己,再去考虑如何为社会主义做贡献,如何推动人类科技进步。学习英语确实应该赶快提上日程并立即执行、坚持执行了。英语好的人真的是把WDK拿来就像用MFC那样轻松,看着文档和示例程序,那些个API调来调去,一个完整的驱动程序就出来了。这不是吹牛,我之前在一家公司工作的时候,公司有个项目的一个模块需要在Ring0上实现,需要编写Windows内核驱动,然而公司里没有一个人会,于是老大将这个模块交给了他的一个朋友去做。他的这个朋友是中国人,在美国微软总部工作,英语水平怎么样就不用说了,总之人家以前从来没搞过驱动开发,看了文档和示例代码后,利用3天的业余时间就完成了这个模块,拿到了15K RMB的报酬,着实让人佩服,让人羡慕。真的,学好英语,不说“听说写”,只要能流畅阅读各种英文技术资料,完全是另一个世界,学什么、做什么都得心应手。
    MSDN上的驱动开发资料入口:https://msdn.microsoft.com/zh-cn/windows/hardware
    MSDN上手把手教你来的视频教程:https://msdn.microsoft.com/zh-cn/windows/hardware/gg454522

    ②抓住仅有的几本中文书籍,细细研读。关于Windows驱动开发的中文书籍大概有那么几本:
    Windows驱动开发技术详解》(强烈推荐先看这本)
    WindowsWDM设备驱动程序开发指南》(比较老了,2000年出版的,以win98、win2000为目标系统)
    Windows设备驱动程序WDF开发》(为数不多讲WDF的)
    《Windows 7设备驱动程序开发》(为数不多讲WDF的,且比较新,这本书的英文版是2010年出版的,中文译版是2012年出版的)
    《竹林蹊径:深入浅出windows驱动开发》
    《寒江独钓:Windows内核安全编程》
    《天书夜读:从汇编语言到Windows内核编程》
    《Windows内核安全与驱动开发》(是《天书夜读》和《寒江独钓》的合订本以及升级版)
    后面的这四本其实不太适合作为入门书籍,而适合作为进阶书籍,对一些基础的概念和原理的讲解没有《Windows驱动开发技术详解》那么多

    痛苦二:开发工具链不好用
    对于我等刚学编程时用的就是VisualStudio以及各种智能提示智能感知的插件,甚至还有代码生成器的辅助的程序员来说,习惯了VisualStudio傻瓜化的一切,代码可以自动生成,窗体应用程序可以拖控件,甚至连网页都能拖控件。很难接受只有文本编辑器和命令行工具的开发环境,很多时候连代码编辑器不能智能提示都无法忍受,更不说手动调用cl.exe link.exe,写起代码来就像有一万只蚂蚁在身上爬。
    在之前很长的一段时间里,VC6.0和VisualStudio里是没有创建驱动项目的选项的,更没有直接由IDE生成的HelloWorld,如果不想手动cl.exe link.exe,如果想在IDE中写代码,需要自己建一个空项目,然后手动配置编译器指令、链接器指令、包含目录、库目录等等,然后把书上的HelloWorld复制过来,然后可能还会遇到各种问题。生成好驱动程序文件后,还要手动拷贝到虚拟机中,借助工具或inf文件手动安装,然后要改系统配置,进入内核调试模式,然后要设置调试接口,比如使用COM串口调试的话要在虚拟机上设置,把COM串口映射到主机的命名管道,然后还不能在VC中调试,只能用Windbg来调试。总之每修改一下代码,需要手工进行很多步骤才能开始调试,非常麻烦。而且即便照着网上或书上的步骤来配置,在不同的环境下也会遇到各种奇怪的问题,搞起来颇为头疼。

    解决方法:
    ①有个名为VisualDDK的第三方软件,使得这个事情方便了很多。VisualDDK装好后会给VisualStudio安装一个插件,使得在VisualStudio中可以通过这个插件新建驱动项目,并且自带HelloWorld,然后把VisualDDK Monitor装到虚拟机中,两边配置一下,接下来只要在VisualStudio这边生成驱动文件,VisualDDK会自动传给虚拟机中的系统进行安装,并且可以直接在VisualStudio中下断点调试了。不过这个软件在安装和配置过程中,也需要不少步骤,有时候也会出现一些配置不对的问题,偶尔也略感头疼,且稳定性和兼容性不是非常好。此方式适用于VisualStudio2010及以下版本,WDK7.1及以下版本。对于更高的版本,不建议用VisualDDK,因为可以继续往下看,下面有更激动人心的办法。
    VS2010+VMWare8+VisualDDK1.5.6配置教程:http://techird.blog.163.com/blog/static/1215640362011112385241568/

    ②激动人心的就是,从VisualStudio2012开始,从WDK8.0开始,微软在里面整合了一套类似VisualDDK但比VisualDDK好用很多的工具。从那以后,开发Windows驱动程序就和开发Windows应用程序一样方便了,只需在虚拟机中安装一个EXE,然后在VisualStudio中输入它的IP、用户名、密码就OK了,接下来你只需新建一个WDK项目,点生成,VisualStudio会自动把驱动文件传给虚拟机中的系统并自动安装,然后点调试,就能在VisualStudio中单步调试了。是不是爽爆了,而且配置和设置都不复杂,MSDN上还有手把手教你配置的高清视频教程!
    具体可以看我写的另一篇文章:
    Win8.1+VS2013+WDK8.1+VirtualBox or VMware驱动开发环境配置》:http://blog.csdn.net/charlessimonyi/article/details/50904956

    痛苦三:没有库可用
    假如有一天老板叫你开发一个软件,允许你使用你擅长的任意一门语言,C/C++/C#/JAVA/Python等。但是附加了一个条件:不能使用任何第三方库,不能使用标准库!你有什么感想。What!标准库都不能用?那还写个毛。是的,没错,开发Windows驱动程序,几乎什么库都用不了,包括标准库。因为我们平时常用的第三方库或标准库,它的实现其实都是调用系统API,在Windows上调用的是Window API,即uer32.dll、kernel32.dll、gdi32.dll等等提供的API函数。但是这些API函数属于应用层API,无法在驱动程序中使用,因为驱动程序跑在内核层。所以只要一个库的实现上调用了系统API,就无法在驱动程序中使用。少数库还是可以使用的,比如math.h中的各种数值计算函数。不过仅剩的可用的库太少了,很多时候你都需要从新发明轮子。甚至连C语言中的malloc、free,C++中的new、delete,你都需要自己去实现。

    解决方法:
    ①自己发明轮子就自己发明轮子,虽然没有现成库可用,但有内核层下的系统API可用,很多和应用层的API很相似,你想要的功能基本都可以通过这些API实现。

    ②咬咬牙,把苦水往肚子里咽。搞驱动开发的人很少,苦尽甘(qian)来


    本文由CharlesSimonyi发表于CSDN博客:http://blog.csdn.net/charlessimonyi/article/details/50904854转载请注明出处

    展开全文
  • 第一篇 Android 驱动开发之简单概述

    千次阅读 2016-09-22 16:00:51
    第一层:硬件; 第二层:linux内核层;或者说是:驱动层 主要包含:外设驱动;内存管理;进程管理;电源管理;其实这些都是linux kernel 具有的功能。 第三层:C、C++代码库;其实就是:HAL层; 主要包含linux的动态...

    1.Android设备设计之七层结构:

    第一层:HardWare  =  硬件层。

    第二层:Bootloader  =  引导层。

    主要包含:初始化时钟,内存等;以便引导linux内核。

    第三层:Linux Kernel  =  Linux内核驱动层。

    主要包含:外设驱动;内存管理;进程管理;电源管理;其实这些都是linux kernel 具有的功能。

    第四层:HAL  =  Hardware Abstraction Layer  -  硬件抽象层。

    主要包含linux的动态链接库*.so;以及嵌入到APK的NDK代码。

    第五层:Library and Runtime  =  系统运行库层

    第六层:Application FrameWork layer  =  应用框架层

    主要是直接面向应用程序的Java APK。

    第七层:Application  =  应用层

    所谓的各种APP,包括:拍照,电话,短信,android桌面,浏览器,以及各种游戏。


    2.对于和Android 移植相关的工作岗位分类:

    (1)android应用移植:由于应用程序在不同的硬件平台之间是有差异的,android SDK API 也有可能有差异(因为有的平台厂商会修改原生android SDK API)

    (2)android系统移植:主要针对上面的第二层部分内容,因为android的底层其实就是linux系统,而linux系统可以移植到很多硬件平台(ARM,X86,PowerPC),主要的工作还是要保证最小系统可以在特定的平台上可以跑起来,同时还要保证各种外围设备能够正常工作,例如(LCD,TP,camera,BT,WLAN,GPS等等)

    PS:android系统移植外设驱动的时候,如果外设厂家提供驱动代码的话,开发难度很小;如果厂家不提供参考代码的话,需要自己根据系统驱动框架编写设备驱动,这样的话,难度还是相当大的,尤其是一些复杂的外设。


    3.什么是HAL层,为什么会有HAL层?

    HAL层的中文名称叫,硬件抽象层。

    存在形式:HAL层的代码一般有C或C++的形式存在,最终编译生成*.so,一种linux动态链接库文件。

    那么为什么会有HAL层呢?有什么好处呢?

    首先说一下HAL的作用,它处在linux驱动内核层和Android Framework层之间,起着承上启下的作用。

    如果没有他,Android SDK会直接和linux 驱动内核直接沟通;这样很不好,不符合很多人的利益,因为各种外设驱动属于linux,而linux又是遵循GPL开源协议,这样的话,驱动代码也要开源,但是这些驱动是很多外围设备厂家辛辛苦苦开发的,不愿意这样白白的开发给所有人,包括很多竞争对手;

    那怎么办?由HAL层来解决这个困难,HAL其实就是把原来驱动的控制逻辑一部分独立出来,编译生成SO文件,这部分代码不遵循GPL协议,不需要开源,保证了外设厂家的利益,同时也不影响linux的框架设计。


    4.查看linux内核版本的命令:

    (1)设备启动后,等待adb口 的出现

    (2)adb root

    (3)adb shell uname -a   该命令不行,可以使用   adb shell cat /proc/version


    5.搭建开发环境

    (1)搭建软件开发环境,构建linux虚拟机(后面详细介绍)

    (2)搭建硬件开发环境,开发板;不一定非要使用网上推荐的SC2440等开发板,只要是一个嵌入式设备都可以,手机或者pad等,只要你有相关的设备资料就可以。

    驱动开发的最大的魅力就是软硬结合,没有硬件设备,无从谈起驱动开发;也是限制驱动学习的门槛之一。


    6.要想学习Android驱动都需要哪些方面知识:

    (1)硬件知识:电子通信方面的内容;主要是能看懂电路原理图基本就可以了。

    (2)linux操作系统相关知识:包括linux虚拟机使用,linux基本常用命令。

    (3)基本脚本知识:shell脚本,简单Makefile。

    (4)了解编译系统:编译工具的选择,系统的配置过程,编译过程 -> 一般新项目开始搭建的时候会用到。

    (5)核心内容,linux 系统驱动的各种框架,各种机制。

    (6)个人认为,android系统的启动流程非常关键,有利于建立整个系统的宏观概念,不需要详细深挖,但要知道大概的流程。

    (7)android 内核系统机制,应该是linux系统编程和网络编程的揉合。


    7.闲话android

    (1)开放性,android几乎所有源码都是可以免费下载的。遵循Apache开源协议。

    (2)强大的SDK,Software Development Kit 软件开发套件 实现操作系统和开发者之间的接口。

    android通过总结应用开发规律,提供Activity,Service,Broadcast Receiver以及Content Provide四大组件。

    (3)不断改进UI,新版UI更加人性化,对于用户是最直观的艺术盛宴。

    (4)逐步完善的生态系统

    (5)阵营良莠不齐

    (6)系统运行效率有待改善

    据不完全统计,android的启动过程花费的平均时间超过了1分钟,甚至有的达到了5分钟以上。

    (7)兼容性问题

    8.参考文档:

    (1)Android 深度探索(卷I)HAL与驱动开发 - 李宁

    (2)深入理解Android内核设计思想 - 林学森

    (3)深入理解Android(卷I)- 邓凡平

    展开全文
  • 说说测试驱动开发

    千次阅读 2017-04-28 10:53:22
    1 测试驱动开发模式1.1 重新定义“测试”这是一张影响图: 普通箭头表示当第一个节点增长时,第二节点也会做相应的增长。 带圆圈的箭头表示当第一个节点增长时,第二节点也会做相应的减少。 当压力越大时,所做...
  • Windows驱动开发入门系列教程

    千次阅读 2016-03-28 11:27:41
    前几天,一朋友问到我怎么学习Windows驱动开发,我就想到把我学习Windows驱动开发的过程分享一下,也算我的一点总结。 我总结了一下,大概分为这么几部分内容: 第一讲:开发环境与工具篇 主要讲述驱动...
  • 本博实时更新《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)的最新进展。 目前已经完成稿件。 2015年8月9日,china-pub开始上线预售: ... 2015年8月20日,各路朋友报喜...
  • 从零开始之驱动开发、linux驱动(、驱动基础)

    万次阅读 多人点赞 2018-10-08 20:28:15
    准备19年在深圳这边找驱动相关的工作了,所以从头开始再学遍韦东山老师的驱动课程,并做好记录,希望能找到满意的工作。 同时该系列的驱动都是在前面新移植的linux3.16.57的基础上工作的。   之前的驱动模型...
  • 本文讲述在Win7 SP1 x64系统中,如何搭建基于WDK7600的驱动开发环境
  • 在上篇中,我简单介绍了驱动开发的基础知识,这篇中,将介绍编写一个NT空壳驱动(驱动基础框架) 、驱动入口 驱动程序的入口点是DriverEntry,此函数的原型是: extern "C" NTSTATUS DriverEntry(PDRIVER_...
  • VS2019 开发第一个Windows驱动程序

    千次阅读 2020-05-09 00:02:16
    VS大概从2013开始集成Windows驱动开发功能;win10下,需要安装3东西:VS2019(VC++2019),WDK 10(Driver Kit),win10 SDK;然后启动VS2019以后,创建项目... 下面是整个环境搭建和构建第一个驱动的一些截图;环境...
  • Windows驱动开发驱动开发环境搭建

    千次阅读 2016-07-05 08:06:51
    驱动开发环境搭建
  • 测试驱动开发

    千次阅读 2019-06-20 12:42:58
    测试驱动开发 概述 极限编程是一个轻量级的、灵巧的软件开发方法,同时它也是一个非常严 谨和周密的方法,它从 4 基本方面对软件项目进行改善:交流、简易、反馈 和勇气。测试驱动开发则是极限编程的最佳...
  • windows驱动开发推荐书籍

    千次阅读 2016-03-06 01:55:43
    很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资 料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从 事驱动开发时间不长也不短,大概也就3~4年时间....
  • 手把手教你写第一个Linux驱动程序

    千次阅读 2017-01-19 22:57:14
    我这里以我的开发环境tiny4412为主,我将在这上面写第一个驱动程序。首先,我在driver/目录下创建yangyx目录,在目录下新建一hello.c和一Makefilehello.c内容如下:hello.c包含的头文件就类似咱们写标准C一样的...
  • 最近因为工作关系,接触了一下WDF驱动开发。 WDF驱动其实是微软公司提供的一套驱动开发的框架。有了这框架之后,开发驱动会简单一些。WDF本身是从WDM基础上封装而成的。WDF里面封装了很多对象,如WDFDRIVER等。...
  • 硬件平台:XCZ7020 CLG484-1 完全适配Zedboard 开发环境:Widows下Vivado 2016.2 、 SDK2016.2 、 Linux机器:debin 目的:操作板载的LED灯LD9,受PS部分的MIO7控制 linux设备驱动大体分三种:字符设备、块设备、...
  • .通过程序流程管理 ...如果做到一个驱动程序管理多硬件设备个体,通过次设备号,共享一个主设备号; 答: struct inode { dev_t i_rdev; struct cdev *icdev; ... }; 作用: 描述一个文件
  • 每一位新手在开始学习驱动开发的时候相信总会看大量的资料,如我第一篇提到的几本书的确是不错的,但名著总有一问题就是,开篇一开始总是会铺陈太多的基本理论,这会让我们觉得手足无措,更不知如何下手。...
1 2 3 4 5 ... 20
收藏数 404,273
精华内容 161,709
关键字:

第一个 驱动开发