Linux设备驱动开发详解 笔记6 字符设备驱动
使用下列洪可以通过主设备号和次设备号生成dev_t
MKDEV(int major, int mainor)
如果复制的内存是简单类型,如char、int、long等,则可以使用简单的put_user()和get_user()
Linux系统建议以如图方式定义ioctl命令码
命了码的设备类型字段为一个“幻数”,可以是0-0xff之间的值,内核中的ioctl-number.txt给出了一些推荐的和已经使用了的“幻数”,新设备驱动定义“幻数”的时候要避免与其发生冲突。
命令码的方向字段为2位,该字段表示数据传送的方向,可能的值是_IOC_NONE(无数据传输)、_IOC_READ(读)、_IOC_WRITE(写)和_IOC_READ|_IOC_WRITE(双向)。数据传送的方向是从应用程序的角度来看的
命令码的数据长度字段表示涉及的用户数据的大小,这个成员的长度通常依赖于体系结构,通常是13位或者14位
内核还定义了_IO()、_IOR()、_IOW()和_IOWR()这四个宏来辅助生成命令
内核中预定义了一些io控制命令,如果某设备驱动中包含了与预定义命令一样的命令,这些命令会被当做预定义命令被内核处理而不是被设备驱动处理,预定义命令有如下4种:
FIOCLEX FIONCLEX FIOQSIZE FIONBIO p142
dev = container_of(inode->i_cdev, struct globalmem_dev, cdev);
container_of的作用是通过结构体成员的指针找到对应结构体的指针,这个技巧在Linux内核编程中十分有常用。第1个参数是结构体成员的指针,第2个参数为整个结构体的类型,第3个参数为传入的第1个参数(结构体成员)的类型,返回整个结构体的指针
相关文档:
1、软件安装
卸载,分几种情况:
A:
RPM包,这种软件包就像windows的EXE安装
文件一样,各种文件已经编译好,并打了包,哪个文件该放到哪个文件夹,都指定好了,安装
非常方便,在图形界面里你只需要双击就能自动安装
。
==如何卸载:
1、打开一个SHELL终端
2、因为Linux
下的软件名都包括版本号,所以卸载前最好 ......
#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <signal.h>
using namespace std;
extern char **environ;
void signal_handle(int signal_no){
cout << "sign:" &l ......
时间间隔定时器
interval timer(时间间隔定时器)系统调用自从被POSIX标准化后,首次出现于4.2BSD,能够提供比alarm()还多的控制:
#include <sys/time.h>
int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
interval ti ......
这两天搭建了一组Apache服务器,每台服务器4G内存,采用的是prefork模式,一开始设置的连接数太少了,需要较长的时间去响应用户的请求,后来修改了一下Apache 2.0.59的配置文件httpd.conf:
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes ......
在用户空间,使用ioctl系统调用来控制设备,原型如下:
int ioctl(int fd, unsigned long cmd, ...);
第三个参数不表示一个变数目的参数,而是一个类型可选的参数。第三个参数依赖于控制命令。一些命令不用参数,一些用一个整数值,一些使用指针
1、ioctl函数定义命令
在编写ioctl代码之前,首先需要定义命令。为了防止 ......