linux驱动小述

linux驱动开发:字符设备驱动

  文章地址1文章地址2

  写linux驱动其实就是在写hook function,这些function由开发者编写、但是被linux内核调用 (对hook function的解释

  文章1,简单摘要

    编写hello驱动步骤:
    编写hello驱动代码
    编写makefile
    编译和加载hello驱动
    编写应用程序测试hello驱动

    hello驱动代码:
    hello_open()
    hello_write()
    hello_read()
    hello_init()
    hello_exit()

    编译hello需要makefile文件
    应用层程序在编译的时候,需要链接C运行时库和glibc库
    驱动需要引用内核的头文件和函数,不能链接和使用应用层的任何lib库

    执行make,编译出helloDev.ko;把驱动insmod helloDev.ko加载到内核
    (dmesg命令 显示信息)
    在执行insmod的时候,驱动文件里的hello_init(),被调用了
    在执行rmmod的时候,hello_exit()被调用了

    执行应用程序的时候,发现错误,找不到设备文件;
    为hello驱动手动创建设备文件mknod /dev/hello c 232 0 (这里的232 0跟驱动文件里定义的主次设备号对应起来 )
    执行dmesg查看驱动输出,发现驱动力的hell_open、hello_write、hello_read依次被调用了

  文章2

    linux操作系统中,一切皆文件,文件是文件,目录是文件,设备是文件,socket套接字是文件,管道也是文件

    linux系统中用文件抽象出这一切,文件成为了以上这些实体的编程接口。正由于此,基于linux的编程变成了面向文件的编程,对于linux应用程序开发者而言,简直是爽的不                   要不要的

    但是对于内核开发者而言,却是未必。虽然应用层可以用open、write、read操作一切,但是在内核里面,却需要不同的部分(或者说驱动)来真正实现这一切

    任何一个可以正常使用的函数,如果你的应用程序里没有定义,那么肯定定义在C库里。而C库怎么做,会视情况而定。像一些字符处理函数,C库里会实现它们;但是像write函数,C库只会做一些检查,然后就进入write的系统调用,系统调用会通过软中断的方式进入到内核空间里去执行

    应用空间和内核空间是彼此隔离的,互相看不到对方,也无法访问对应的数据,这是为了安全。所以就write函数而言,当从用户空间通过系统调用进入到内核空间以后,内核需要通过copy_from_user函数才能把应用程序传给write的数据拷贝到内核空间,之后内核空间才能对次数据进行处理

 

posted @ 2021-05-10 09:33  我爱茜茜公主  阅读(59)  评论(0)    收藏  举报