ubuntu中如何找到最新增加的设备节点
mknod 设备节点名称 设备类型 主设备号 次设备号,例如:mknod memdev c 260
0,创建好之后会在/dev目录下看到一个字符设备
Linux下的设备文件都在/dev目录下,每一个硬件设备都有对应的文件,比如鼠标对应的文件时mouse,蓝对应的是blueteeth等,当然可能文件名中还包含设备的型号信息。要想找到你的设备对应的设备文件,首先你要知道你的设备的类型,然后再在/dev目录下找。
将自己开发的内核代码加入到Linux内核中,需要3个步骤:1、确定把自己开发代码放入到内核合适的位置
将demo_chardev.c文件拷贝到.../drivers/char/目录下。
demo_chardev.c
[cpp] view plain copy
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
/*结构体file_operations定义的头文件*/
#include <linux/fs.h>
/*声明copy_to/from_user函数的头文件*/
#include <linux/uaccess.h>
/*声明class_create 和device_create相关信息*/
#include <linux/device.h>
#define DEMO_DEBUG
#ifdef DEMO_DEBUG
#define dem_dbg(fmt, arg...) printk(KERN_WARNING fmt, ##arg)
#else
#define dem_dbg(fmt, arg...) printk(KERN_DEBUG fmt, ##arg)
#endif
#define DEVICE_COUNT 2
/*记录当前驱动所占用的主设备号*/
static int major = 0;
static int demo_open (struct inode *pnode, struct file *filp)
{
dem_dbg("[kern func]: %s major: %d minor: %d\n",
__FUNCTION__, imajor(pnode), iminor(pnode));
return 0;
}
static ssize_t demo_read (struct file *filp, char __user *buf, size_t count, loff_t *offp)
{
unsigned char ary[100] = "you are reading successfully!";
unsigned long len = min(count, sizeof(ary)); //min是个宏,用来获取两个数中较小的值
int retval;
dem_dbg("[kern func]: %s major: %d minor: %d\n",
__FUNCTION__, imajor(filp->f_dentry->d_inode),
iminor(filp->f_dentry->d_inode));
//file结构体的f_flags成员可用来判断是否阻塞读取,然后进行相应处理
if(copy_to_user(buf, ary, len) != 0){
retval = -EFAULT;
goto cp_err;
}
return len; //成功返回实际传输的字节数
cp_err:
return retval;
}
static ssize_t demo_write(struct file *filp, const char __user *buf, size_t count, loff_t *offp)
{
unsigned char ary[100] = "";
unsigned long len = min(count, sizeof(ary)); //min是个宏,用来获取两个数中较小的值
int retval;
dem_dbg("[kern func]: %s major: %d minor: %d\n",
__FUNCTION__, imajor(filp->f_dentry->d_inode),
iminor(filp->f_dentry->d_inode));
if(copy_from_user(ary, buf, len) != 0){
retval = -EFAULT;
goto cp_err;
}
printk("[msg]: writing context: %s\n",ary);
return len; //成功返回实际传输的字节数
cp_err:
return retval;
}
static int demo_release (struct inode *pnode, struct file *filp)
{
dem_dbg("[kern func]: %s major: %d minor: %d\n",
__FUNCTION__, imajor(pnode), iminor(pnode));
return 0;
}
/*@定义file_operations结构体变量*/
static struct file_operations fops = {
.owner = THIS_MODULE,
.read = demo_read,
.write = demo_write,
.open = demo_open,
.release = demo_release,
};
static struct class *demo_class;
static int __init drvdemo_init(void)
{
struct device *demo_device;
int i;
int retval;
dem_dbg("[msg]:this is a driver demo, in module initial function\n");
/*注册字符驱动函数,成功 返回动态分配好的主设备号,失败
*返回错误码(负值)*/
major = register_chrdev(0, "demo_chrdev", &fops);
if(major < 0){
retval = major;
goto chrdev_err;
}
/*创建设备类*/
demo_class = class_create(THIS_MODULE,"demo_class");
if(IS_ERR(demo_class)){
retval = PTR_ERR(demo_class);
goto class_err;
}
/*创建设备文件,通知用户在“/dev/”目录下创件名字为demoX的设备文件*/
for(i=0; i<DEVICE_COUNT; i++){ //最多可创建255个设备节点(register_chrdev函数会申请0-254范围的从设备号)
demo_device = device_create(demo_class,NULL, MKDEV(major, i), NULL,"demo%d",i);
if(IS_ERR(demo_device)){
retval = PTR_ERR(demo_device);
goto device_err;
}
}
return 0;
device_err:
while(i--) //设备节点创建的回滚操作 device_destroy(demo_class,MKDEV(major, i));
class_destroy(demo_class); //删除设备类
class_err:
unregister_chrdev(major, "demo_chrdev");
chrdev_err:
return retval;
}
static void __exit drvdemo_exit(void)
{
int i;
dem_dbg("[msg]:in module exit function\n");
/*注销字符驱动函数,无返回值,major为已分配的主设备号*/
unregister_chrdev(major, "demo_chrdev");
/*删除设备节点和设备类*/
for(i=0; i<DEVICE_COUNT; i++)
device_destroy(demo_class,MKDEV(major, i));
class_destroy(demo_class);
}
module_init(drvdemo_init);
module_exit(drvdemo_exit);
MODULE_LICENSE("Dual BSD/GPL"); //BSD/GPL双重许可证
MODULE_AUTHOR("hanbo"); //模块作者(可选)
MODULE_DESCRIPTION("used for studing linux drivers"); //模块儿简介(可选)
2、把自己开发的功能增加到Linux内核的配置选项中,使用户能够选择此功能
vi drivers/char/Konfig 在文件结尾,endmenu的前面加入一个config选项
[cpp] view plain copy
config DEMO_CHARDEV
bool "demo_chardev driver for hanbo chardev boards"
default y
help
this is CHARDEV driver for hanbo chardev boards.
3、构建或修改Makefile,根据用户的选择,将相应的代码编译到最终生成的Linux内核中去
make menuconfig(添加配置选项)(如果提示找不到“ncurses”库则执行命令: sudo apt-get install libncurses5-dev )
Device driver -->
character devices ->
[*] demo_chardev driver for hanbo chardev boards
4、vi drivers/char/Makefile 添加内容如下:
..........
obj-$(CONFIG_DEMO_CHARDEV) +=demo_chardev.o (添加)
obj-$(CONFIG_JS_RTC) +=js-rtc.o(自带)
js-rtc-y = rtc.o (自带)
5、make (更新内核镜像到开发板)
6、交叉编译测试程序,放到开发板运行
arm-linux-gcc-gcc test.c -o demo
test.c
[cpp] view plain copy
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char *argv[])
{
int fd1 = 0, fd2 = 0;
unsigned char buf1[100] = "I am a test program!";
unsigned char buf2[100] = {0};
int retval;
//以读写、不阻塞方式打开设备文件
fd1 = open("/dev/demo0", O_RDWR | O_NONBLOCK);
if(fd1 < 0){
perror("open /dev/demo1");
goto out;
}
//以只读、阻塞方式打开设备文件
fd2 = open("/dev/demo1", O_RDONLY);
if(fd2 < 0){
perror("open /dev/demo2");
goto out;
}
//成功返回实际写入字节数,失败返回负值
retval = write(fd1, buf1, strlen(buf1)+1);
if(retval < 0){
perror("writing fd1 failed!");
goto out;
}
printf("<user space>: write bytes: %d write content: %s\n", retval, buf1);
//成功返回实际读取字节数,失败返回负值
retval = read(fd2, buf2, sizeof(buf2));
if(retval < 0){
perror("reading fd2 failed!");
goto out;
}
printf("<user space>: read bytes: %d read content: %s\n", retval, buf2);
return 0;
out:
if(fd1 > 0)
close(fd1);
if(fd2 > 0)
close(fd2);
return -1;
}
二、手动加载驱动 .ko文件
1、上面的demo_chardev.c文件放到内核下编译生成 .ko文件
Makefile
[cpp] view plain copy
#如果已定义KERNELRELEASE,说明是由内核构造系统调用的
#可以利用内建语句
ifneq ($(KERNELRELEASE),)
obj-m +=demo_chrdev.o
#此时由内核构造系统调用
else
#定义并记录内核源码路径
KERNELDIR = /home/hanbo/linux-2.6.35.7(自己源码路径,2.6.35.7指当前内核版本)
#记录当前工程目录
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
@rm -rf *.o .t* .m* .*.cmd *.mod.c *.order *.symvers
endif
clean:
rm -rf *.ko *.o .t* .m* .*.cmd *.mod.c *.order *.symvers
2、 然后用命令加载 .ko 驱动
lsmod 列举当前系统中的所有模块
lsmod 列举当前系统中的所有模块
rmmod xxx 卸载指定模块(不需要.ko后缀)
3、如果自己编译的代码中没有用
/*创建设备类*/
demo_class = class_create(THIS_MODULE,"demo_class");
/*创建设备文件,通知用户在“/dev/”目录下创件名字为demoX的设备文件*/
demo_device = device_create(demo_class,NULL, MKDEV(major, i), NULL,"demo%d",i);
则需要手动添加设备节点
mknod /dev/demo1 c 主设备号 0
mknod /dev/demo2 c 主设备号 1
注意:若卸载时出现提示 rmmod:chdir(2.6.35.7):No such file or directory
则在开发板根文件系统下创建目录:/lib/modules/2.6.35.7(跟当前内核版本同名)
ubuntu怎么知道安装的软件在哪个目录(ubuntu系统文件目录在哪里)_百度...
用ubuntu的方式比较多,可以图形界面用系统的软件中心安装,可以像window一样自己去网上下载来安装,也可以用apt-getinstall安装(其实是dpkg软件包管理器),但是,安装后的软件到底在哪里看不像window一个软件一般都在一个文件夹里,ubuntu的一个软件一般分开在多个目录,可供终端调用的执行文件一般在\/bin...
ubuntu怎么查看linux系统日志
该文件的格式是每一行包含日期、主机名、程序名,后面是包含PID或内核标识的方括号、一个冒号和一个空格,最后是消息。该文件有一个不足,就是被记录的入侵企图和成功的入侵事件,被淹没在大量的正常进程的记录中。但该文件可以由\/etc\/syslog文件进行定制。由\/etc\/syslog.conf配置文件决定系统如何写入\/...
UBUNTU系统下火狐浏览器安装路径 在哪可以找到它的
一般这么查找一个程序的路径:打开一个火狐浏览器 然后在系统监视器里找到进程firefox,右键点击,选择“打开的文件”可能不止一个,但应该不难找到那个是主程序 也可以在终端里面找:打开一个终端,输入:ps -ef grep firefox (即,列出当前所有进程的详情,并在其中筛选还有firefox字样的内容)通过列出的...
ubuntu20.04找不到start命令
解决办法:1.Ctrl + Alt +T 打开终端;2.输入命令:sudo apt-get install vim-gtk
ubuntu如何切换到命令行模式
方法一:利用快捷键来切换 1、从图形化界面切换到命令行模式,我们可以通过按ALT+CTRL+F1、---、F6,为什么是F1、---、F6,因为在Linux中一般有F1到F6多个命令行字符终端,也就是说我们可以同时打开最多6个命令行界面。这里ubuntu16.04就可以切换这多个界面,由于命令行模式小编还没找到截图方法,...
UBUNTU系统下火狐浏览器安装路径 在哪可以找到它的启动程序?不要在应...
一般这么查找一个程序的路径:打开一个火狐浏览器 然后在系统监视器里找到进程firefox,右键点击,选择“打开的文件”可能不止一个,但应该不难找到那个是主程序 也可以在终端里面找:打开一个终端,输入:ps -ef | grep firefox (即,列出当前所有进程的详情,并在其中筛选还有firefox字样的内容)通过...
UBUNTU安装中,找不到SWAP分区选项,
1、swap 直接在分区类型里选 ,不是在分区名称里选 。swap 是类型不是 名称\/ 、 \/boot 、\/home 这些是分区名称,他们的类型可以选 ext2、ext3 ……2、swap没有名称,就类型swap,需要在分区类型中去选。deb 在ubuntu中安装:1、用图形用户界面,可以点着它按鼠标右键,在弹出菜单中选"打...
Ubuntu中怎么找不到\/etc\/sysconfig\/network?
你看看是不是 \/etc\/network\/interfaces 这个文件。ubuntu和其他发行版的文件目录有很多不同 记得修改后要resource一下才能生效
最详细的图文安装Ubuntu教程|如果还不会你找我
如果你正在寻找详细的Ubuntu安装教程,别担心,本文将为你提供逐步的指引。无论你的VMware版本如何,只要遵循以下步骤,就能顺利进行安装。1. 创建虚拟机启动VMware Workstation,点击菜单中的"File" > "Create New Virtual Machine"。接下来,根据你的硬件版本选择相应的选项,然后选择将要安装的Ubuntu操作...
ubuntu怎么安装第三方软件
2. **下载并安装.deb包**:对于一些不在Ubuntu软件库中的软件,可以在其官方网站上找到.deb安装包。下载后,在终端中使用`sudo dpkg -i 文件名.deb`命令安装。如果安装过程中缺少依赖项,可以使用`sudo apt-get install -f`来自动修复依赖问题。3. **使用snap包管理器**:snap是Ubuntu 16及以后...
依崔皮敏: 一般都在会出现在应用程序里面,有时候需要重启X才会出现.如果实在没有出现可以在terminal里输入该程序的命令来启动. 或者也可以通过:系统-设置(Preference)-主菜单(Main Menu)添加程序到"应用程序"里.
衢江区18377696190: 新版 Ubuntu 17.10 中怎样访问设置选项 - ?
依崔皮敏: https://jingyan.baidu.com/article/fea4511a31cb7bf7ba912543.html-供参考
衢江区18377696190: ubuntu软件中心安装后的软件怎么找到? - ?
依崔皮敏: 在应用程序菜单里找---新德里软件包管理---在这里搜索您安装的软件.要不然你就用命令查询你安装的软件也行.
衢江区18377696190: ubuntu怎么查看添加的用户 - ?
依崔皮敏: 命令行管理用户与组1 打开终端字符操作界面2 添加新用户的命令行操作$sudo adduser 用户名输入两次密码根据提示输入相关信息最后Y完成3 添加新的用户组$sudo groupadd 组名4 把用户添加到你想要添加的已经存在的用户组$sudo...
衢江区18377696190: ubuntu中安装了程序在哪找到? - ?
依崔皮敏: 打开终端,直接输入该软件的名字即可.可以根据大概名称搜索.,应用程序一般在 usr/bin/或者usr/local/soft/.
衢江区18377696190: ubuntu没有安装启动加载器如何让它出现在启动菜单里 - ?
依崔皮敏: 用livecd进入,或者从iso文件启动进入.在终端中输入命令:sudo fdisk -l 从这个命令中查看你的ubuntu安装在什么分区,比如,sda5 然后在终端中输入:sudo grub 输入:root (hd0,x) 这个hd0指的是你的第一硬盘,如果你装在别的硬盘上,那么...
衢江区18377696190: Ubuntu中怎样添加开机启动项 - ?
依崔皮敏: ubuntu14.04:在dash中输入session,会出现“启动应用程序”,就在这里面设置.ubuntu12.04:右上角点开,里面有启动程序设置.
衢江区18377696190: 如何在Virtualbox虚拟机中安装Linux - ?
依崔皮敏: 在Virtualbox虚拟机中安装Linux的步骤:一、创建虚拟机1、① 点击菜单上的新建;② 设置一个名称,设置类型为 Linux,版本 Ubuntu(64 bit)2、设置内存大小为20483、点击下一步4、...
衢江区18377696190: ubuntu中怎样添加或删除一个PPA源 - ?
依崔皮敏: 1、找到自己想要添加的 PPA 页面,在页面上找到该软件 PPA 源的地址,复制下来;2、在 Ubuntu 桌面上,点击左侧启动栏上的“Ubuntu 软件”图标,启动软件应用.3、在打开的“软件和更新”窗口中,点击“其他软件”选项卡,接着点击...
衢江区18377696190: VM虚拟机中ubuntu10.10的分辨率调整.怎么安装虚拟机的增加功能 - ?
依崔皮敏: vm中有个vmware tools,安装这个就是全屏的了,点击vm的set选项,单击install vmware tools,然后虚拟机中就有个光盘,命令行下输入cd /media/cmdrom 进入光盘,然后解压到本地目录下,然后输入./vmware-tools.pl,好像是这个名字,反正是以个.pl文件,然后一路回车,安装前先确定自己的gcc安装了没有,输入gcc -v就知道了.祝你好运!