那么既然ko的驱动已经可以运行,那么我们来写几个简单的操作设备树的内核驱动
字符型设备驱动和应用层
这俩种代码是分开的,设备驱动调用的是内核的地址,而应用层则是相当于虚拟地址,所以应用层传递参数的时候不能直接付给指针,要调用相对于的参数
内核->驱动->应用
驱动的编写
找到sdk内的例程,按照例程去写ko文件
ko文件的编写
先照着写一份结构体,写上拥有者、打开、写入、读取、释放的操作函数
应用层编写
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
//一个参数个数一个参数字符串
int main(int argc,char *argv[])
{
int flie;
size_t count;
char readbuffer[100];
flie = open(argv[1],O_RDWR);
if(flie<0)
{
printf("failed to open\r\n");
}
else
{
printf("open it\r\n");
}
count = read(flie,readbuffer,50);//返回实际读取的数量,如果为副则失败
if(count<0)
{
printf("failed to read\r\n");
}
else
{
printf("read it\r\n");
}
count = write(flie,"nihao",6);
if(count<0)//如果为负数失败并且错误类型保存在全局变量errno中,
{
printf("failed to read\r\n");
}
else
{
printf("write it\r\n");
}
count = close(flie);
if(count<0)//如果为负数失败并且错误类型保存在全局变量errno中,
{
printf("close to read\r\n");
}
else
{
printf("close it\r\n");
}
return 0;
}
编写makefile
KEDIR = /home/momo/T113/Tina-Linux/lichee/linux-5.4
CROSS_COMPILESS = /home/momo/T113/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-
CURRENT-PATH := $(shell pwd)
obj-m := chabasemo.o
build: kernel_modules
kernel_modules:
${MAKE} ARCH=arm CROSS_COMPILE=$(CROSS_COMPILESS) -C ${KEDIR} M=${CURRENT-PATH} modules
$(CROSS_COMPILESS)gcc -o chabase chabase.c
clean:
${MAKE} ARCH=arm CROSS_COMPILE=$(CROSS_COMPILESS) -C ${KEDIR} M=${CURRENT-PATH} clean
rm -rf modules.order
rm -f chabase
cmake后就可以得到ko和可执行文件
记住要用
make ARCH=arm CROSS_COMPILE=~/T113/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-
命令
运行
通过modinfo查看ko文件详细信息