当前位置:首页 » 操作系统 » linux驱动笔记

linux驱动笔记

发布时间: 2022-11-17 21:55:46

‘壹’ linux设备驱动里的一个简单的例子为什么编译不过

该文重点给出了三个实例来讲解Linux驱动,使新手快速、从代码层了解什么是Linux设备驱动。
本文算是笔记,大体上是翻译该文的前两部分,即前两个实例,这两个例子都可能正确成功运行。
文件: Writing device drivers in Linux.pdf
大小: 216KB
下载: 下载
所需知识
- C 语言编程
- 微处理器编程.对处理器的工作原理有一定的了解,如内存管理、中断等

用户空间和内核空间
写设备驱动时,了解“用户空间”和“内核空间”之间的区别是非常重要的。
- 内核空间。Linux内核简单并高效地管理着机器的硬件,为用户提供简单并
规范的编程接口。同样地,内核,特别是内核中的驱动,是用户/程序员与硬
件之间的桥梁或接口。内核的任何例程或函数(比如模块、驱动)都属于内核
空间。
- 用户空间。用户程序,比如unix shell或其他的gui应用程序(比如
kpresenter),都属于用户空间。显然,这些应用程序都要与硬件打交道。但是
它们不并直接操作硬件,而是通过内核提供的函数来实现。

用户空间与内核空间之间的接口函数
内核为用户空间提供了一系列的例程或函数,用户的应用程序利用这些接口来与硬件交互
。通常,在UNIX或Linux系统中,这种对话是通过函数或子程序来读写文件的。原因是从
用户的角度来看,UNIX设备就是文件。
另一方面,在内核空间中Linux也提供了一系列的函数或子程序来完成底层与硬件的交互
,并允许从内核向用户空间传递信息。
通常,每个用户空间的(设备或文件允许使用的)函数,都能在内核空间中找到一个类似
的函数,(允许信息从内核传递给用户空间,反之亦然)
内核空间与硬件设备之间的接口函数
内核空间中有许多函数用于控制硬件或在内核与硬件之间交互信息。
第一个驱动:在用户空间加载和移除驱动
现在将展示如何完成第一个驱动,在内核中将看作模块
新建一个文件nothing.c如下
include
MODULE_LICENSE(“Dual BSD/GPL”);
2.6.x版本后的内核,编译模块会略微复杂一点。首先,需要有一份完整的、编译过的内
源码树。在下面的文字中,将假设使用2。6。8版本的内核。
其次,需要一个makefile文件,本例中的makefile文件名为Makefile,内容如下:
obj-m := nothing.o
与之前版本的内核不同,现在编译模块时使用的内核需要与模块将要加载的内核相同。
编译上面的文件,可以使用命令:
make -C /usr/src/kernel-source-2.6.8 M=pwd moles
这个极其简单的模块就属于内核空间,一旦其被加载,它就是内核空间的一部分。
在用户空间,可以使用下面的命令加载它,需要root权限:
insmod nothing.ko
insmod 这个命令用于为内核加载模块。尽管现在我们已经加载了nothing.ko这个模块,
但是这个模块毕竟没有任何用处。
可以通过查看系统里已加载的模块来检查是否已经成功加载了nothing.ko
lsmod
最后,需要卸载该模块时使用下面的命令:
rmmod nothing
重新使用lsmod,可以发现nothing模块已经不在了。
“Hello world”驱动:在内核空间加载和移除驱动
当一个模块设备驱动加载到内核,将执行一些初始的工作,如重新设置设备,reserving
RAM, reserving interrupts, reserving input/output ports, etc.
这些工作得以在内核空间执行,必须要有两个函数存在:mole_init 和
mole_exit;它们对应于用户空间的insmod和rmmod命令。总之,用户命令insmod和
rmmod使用了内核空间的函数mole_init和mole_exit.
来看一个经典的程序 HELLO WORLD:
//hello.c#include #include #inlucde MODULE_LICENSE("Dual BSD/GPL");static int hello_init(void)
{
printk("<1> Hello world!\n"); return 0;
}static void hello_exit(void)
{
printk("<1> Bye, cruel world!\n");
}

mole_init(hello_init);
mole_exit(hello_exit);

其中hello_init 和 hello_exit 函数可以取任意名,但为了加载和移除功能是更容易识
别,它们作为参数传递给函数mole_init 和 mole_exit.
printk函数与printf函数非常类似,但printk只工作在内核中。<1>表示打印信息
为最高优先级(数字越低,优先级越高)。这样,不仅可以在内核系统日志中看到该
打印信息,还能在系统控制台接收到该打印信息。
可以用之前的命令来编译这个模块,此时只需要将模块名加入到Makefile文件中即可:
obj-m := nothing.o hello.o
本文的其他部分,将Makefile作为给读者的练习。一个完整的Makefile文件可以编译
本教程中的所有示例模块。
当模块被加载或卸载时,通过printk打印的信息将会出现在系统控制台。如果打印
信息没有出现在终端里,则可通过dmesg命令或查看系统日志文件(cat
var/log/syslog)看到打印信息。

‘贰’ 如何简化linux usb 驱动 实验报告

《LINUX设备驱动程序》

USB骨架程序(usb-skeleton),是USB驱动程序的基础,通过对它源码的学习和理解,可以使我们迅速地了解USB驱动架构,迅速地开发我们自己的USB硬件的驱动。
前言
在上篇《Linux下的硬件驱动--USB设备(上)(驱动配制部分)》中,我们知道了在Linux下如何去使用一些最常见的USB设备。但对于做系统设计的程序员来说,这是远远不够的,我们还需要具有驱动程序的阅读、修改和开发能力。在此下篇中,就是要通过简单的USB驱动的例子,随您一起进入 USB驱动开发的世界。
USB驱动开发
在掌握了USB设备的配置后,对于程序员,我们就可以尝试进行一些简单的USB驱动的修改和开发了。这一段落,我们会讲解一个最基础USB框架的基础上,做两个小的USB驱动的例子。
USB骨架
在Linux kernel源码目录中driver/usb/usb-skeleton.c为我们提供了一个最基础的USB驱动程序。我们称为USB骨架。通过它我们仅需要修改极少的部分,就可以完成一个USB设备的驱动。我们的USB驱动开发也是从她开始的。
那些linux下不支持的USB设备几乎都是生产厂商特定的产品。如果生产厂商在他们的产品中使用自己定义的协议,他们就需要为此设备创建特定的驱动程序。当然我们知道,有些生产厂商公开他们的USB协议,并帮助Linux驱动程序的开发,然而有些生产厂商却根本不公开他们的USB协议。因为每一个不同的协议都会产生一个新的驱动程序,所以就有了这个通用的USB驱动骨架程序, 它是以pci 骨架为模板的。
如果你准备写一个linux驱动程序,首先要熟悉USB协议规范。USB主页上有它的帮助。一些比较典型的驱动可以在上面发现,同时还介绍了USB urbs的概念,而这个是usb驱动程序中最基本的。
Linux USB 驱动程序需要做的第一件事情就是在Linux USB 子系统里注册,并提供一些相关信息,例如这个驱动程序支持那种设备,当被支持的设备从系统插入或拔出时,会有哪些动作。所有这些信息都传送到USB 子系统中,在usb骨架驱动程序中是这样来表示的:
static struct usb_driver skel_driver = {
name: "skeleton",
probe: skel_probe,
disconnect: skel_disconnect,
fops: &skel_fops,
minor: USB_SKEL_MINOR_BASE,
id_table: skel_table,
};
变量name是一个字符串,它对驱动程序进行描述。probe 和disconnect 是函数指针,当设备与在id_table 中变量信息匹配时,此函数被调用。
fops和minor变量是可选的。大多usb驱动程序钩住另外一个驱动系统,例如SCSI,网络或者tty子系统。这些驱动程序在其他驱动系统中注册,同时任何用户空间的交互操作通过那些接口提供,比如我们把SCSI设备驱动作为我们USB驱动所钩住的另外一个驱动系统,那么我们此USB设备的 read、write等操作,就相应按SCSI设备的read、write函数进行访问。但是对于扫描仪等驱动程序来说,并没有一个匹配的驱动系统可以使用,那我们就要自己处理与用户空间的read、write等交互函数。Usb子系统提供一种方法去注册一个次设备号和file_operations函数指针,这样就可以与用户空间实现方便地交互。

‘叁’ 求教怎么学习linux内核驱动

1.首先要了解为什么要学习内核?下图已表明,如果要从事驱动开发或系统研究,就要学习内核。

2.内核的知识就像下面的绳结一样,一环扣一环,我们要解开它们,就必须要先找到线头也就是内核中的函数接口。初学阶段,我们一般不深入的研究内核代码,会使用内核的接口函数就不错了。

3.下面提供了如何学习这些内核函数的方法,就像解绳子一样

4.学习内核的四步法则,思维导图的设计尤为重要,这也是能否学习好内核的关键

5.语言基础也需要扎实,所以需要把C语言巩固巩固

‘肆’ Linux学习笔记_3_Linux常用命令_4_帮助命令

1、man[manual]:
/usr/bin/man
获得命令或配置文件的帮助文档,优先查看命令的帮助
man[命令或配置文件]//会调用more
e.g.
manls查看ls命令的帮助信息
manservices查看配置文件services的帮助信息
附:在linux系统中帮助文件分为九种
如:
man5
passwd
//查看配置文件的帮助
默认:
man1
passwd
2、info[information]:/usr/bin/info
说明:与man没有太大的区别,只不过是信息的呈现方式不太一样,并且在UNIX系统中并没有这个命令。
3、获取相关文件简短的信息:
/usr/bin/whatisapropos
/usr/sbin/makewhatis
获得索引的简短说明信息,找到这个命令最基本的用途
whatis[任何关键字]
附:
[命令]-
-
help
主要用于获取命令的选项信息
apropos[文件]
用于获取文件的配置信息,类似与:man-k
[文件]
makewhatis
建立whatis和apropos搜索使用的数据库,当使用这两个命令发生错误时,就是
whatisdatabase没有建立
4、help
查看Shell内置命令的文件帮助
如:
mancd与helpcd的不同
另:关于Shell更详细的讲解,请参考另外几篇博客
《四天精通Shell编程》系列:
http://blog.csdn.net/zjf280441589/article/details/17455515
http://blog.csdn.net/zjf280441589/article/details/17467069
http://blog.csdn.net/zjf280441589/article/details/17487351
http://blog.csdn.net/zjf280441589/article/details/17503985

‘伍’ 想学习Linux 驱动,需要什么知识

首先,接触linux操作系统,在你的电脑上装一个linxu操作系统(建议ubuntu,比
较友好),熟悉经常要用的命令,熟悉环境(建议看“鸟哥的linux私房菜”)。
其次,阅读经典书籍是不可少的,建议先看ldd前四章,大概了解linux驱动的框架
,驱动是做什么的,该如何写驱动,那本书上有一些例子,可以在你的电脑上编译
,执行看看。后面的章节在结合自己的情况而定。
第三,建议阅读ulk(understanding the linux kernel)所有的内容,了解linux
内核的一些基本知识,在心中建立一个框架,不必完全懂,深入了解就好,以后经
常翻翻,受益无穷!
第四,别着急,这才是你真的进入linux驱动的第一步,花点钱买个开发板吧,然
后了解代码的编译,下载,看看板子的datasheet,针对自己感兴趣的深入研究。
建议学习流程,led灯控制---tp---i2c总线-----lcd-----camera----flash----
wifi/bt等。因为这个里面牵涉了甚多内核的子系统(input,v4l2,fb等
),所以可能要多话时间看代码,了解代码的框架,设计的思想等,只要一步一个
脚印,一定会有所成。
第五,因为现在的移动设备大多数都是android的了,所以你就要看看linux
kernel在android的作用,然后往上看看,看看hal层的代码,这些在调试中都是需
要的,如果有兴趣,更加可以看看framework的代码了,学习android一些工作机制
,类似于surfaceflinger,audioflinger等等。。
《linux就该这么学》免费提供最新Linux技术教程书籍,为开源技术爱好者努力做
得更多更好

‘陆’ 《Linux下部分常用指令笔记》

一、创建linux维护用户

登录root用户

创建新用户

useradd 新用户名

设置用户密码

passwd 新用户密码

二、安装jdk和配置环境变量

建议在root用户下直接安装jdk,并直接配置环境变量,同时给非root用户设置读和执行权限

解压

tar xvf jdk包名.tar

配置全局变量

编辑/etc/profile文件

vi /etc/profile

按I键,切换成编辑模式。

在文件未加入一下配置

export java_HOME=jdk的解压文件目录

export JRE_HOME=jdk的解压文件目录/jre

export CLASSPATH=.:${JAVA_HOME}/lib:${ JRE_HOME}/lib:$CLASSPATH

export JAVA_PATH=${JAVA_HOME}/bin:${ JRE_HOME}/bin

export PATH=$PATH:${JAVA_PATH}

保存并退出

Esc   

:wq

重载配置文件使其生效

source /etc/profile

检查是否安装成功

Javac

Java version

 

权限修改

读4写2执行1,顺序所有者、组成员、其他用户

Chomd  755  jdk的解压文件目录

三、安装tomcat

安装tomcat和放入war包使用非root的维护用户

如果使用root安装的话记得设置权限。( chomd -r 外层文件目录 )

su - 用户名

1、解压包

tar  xvf  tomcat包名.tar

2、将war包放入tomcat/webapps目录下

3、Tomcat启动服务和停止服务

查看进程

ps -ef | grep java

启动应用

Tomcat bin目录下.startup.sh

停止应用

建议使用

Kill -9 进程号

注:解压出应用文件后,注意配置信息的修改

四、IBM MQ部署 (7.5之后的版本)

(以下是使用9.0版本的正确部署命令)

一、 卸载旧版本IBM MQ (可选)

<因为部署环境没有安装过mq,卸载这部分命令我没有亲自测试过>

设置环境

以用户身份登录到组mqm,找到mq的安装位置 /opt/mqm

source ./setmqenv -s

 

查看队列管理器的状态

dspmq -o installation

停止与要卸载的安装关联的所有正在运行的队列管理器

endmqm SXRECV

 

停止与队列管理器关联的所有侦听器。

endmqlsr -m SXRECV

 

查看系统上当前安装的软件包(组件)

sudo rpm -qa | grep MQSeries

 

 

列出软件包并一次性卸载

 sudo rpm -qa | grep MQSeries | xargs rpm -ev

 

再将对应的用户及安装目录给删除

rm -rf /opt/mqm

userdel -r mqm

 

 

检查MQ license

license文件在安装目录中 /opt/mqm/lib 可以找到

 

amqtcert.lic - is a trial license

amqbcert.lic - is a beta license

amqpcert.lic - is the proction license

——————————————————————————————————————

二、安装新版本ibm mq

解压,解压文件都在MQServer中

tar –xzvf IBM_MQ_9.1.5_LINUX_X86-64.tar.gz

 

进入MQServer文件夹中:

cd MQServer/

 

运行MQ许可证程序

./mqlicense.sh

 

安装WebSphere MQ for Linux服务器(Runtime、SDK 和 Server 软件包):

 rpm -U MQSeriesRuntime-9.1.5-0.x86_64.rpm

 rpm -U MQSeriesSDK-9.1.5-0.x86_64.rpm

 rpm -U MQSeriesServer-9.1.5-0.x86_64.rpm

 

 

安装WebSphere MQ for Linux客户机:

rpm -U MQSeriesClient-9.0.0-0.x86_64.rpm

 

安装WebSphere MQ样本程序:

rpm -U MQSeriesSamples-9.0.0-0.x86_64.rpm

 

创建组和用户

安装过程创建了一个名为mqm的用户和一个同样名为 mqm 的组。设置一个密码来解锁。

passwd mqm

 

——————————————————————————————————————

三、 配置

(这部分队列管理器、通道、队列等根据实际情况自行配置)

切换用户:

su mqm

 

创建队列管理器

使用crtmqm命令来创建一个名为 SXRECV

的队列管理器。我们把它作为缺省队列,并且将不在创建时指定死信队列。然后使用strmqm命令启动队列管理器。

crtmqm -q  SXRECV

strmqm  SXRECV

 

——————

如果执行crtmqm命令时提示

-bash-3.2$ crtmqm

-bash: crtmqm: command not found

find / -name crtmqm

则需要配置mqm用户的环境变量,编辑如下文件,并添加下面的内容,如下:

第一种方法:相对第二种较安全仅对mqm用户有效

 

方法一:

(1) -bash-3.2$ vi /var/mqm/.bash_profile --有可能会在文件夹下看不到这个文件,通过编辑即可看到

PATH=$PATH:/opt/mqm/samp/bin:/opt/mqm/bin:bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin

(2)执行“.”命令,使这个文件生效

-bash-3.2$ source  .bash_profile

(3)再次尝试实行crtmqm或是dspmqm命令,即可发现已经生效。

 

方法二:

( 1)

su  root

[if !supportLists](2)[endif]

vim /etc/profile

[if !supportLists](3)[endif] 在最后面加上:

PATH=$PATH:/opt/mqm/samp/bin:/opt/mqm/bin:bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/bin

( 4)关闭远程终端重新打开,无需重启服务器

——————

 

运行队列管理器

runmqsc SXRECV

 

创建通道和队列

DEFINE QLOCAL (XYDATA) REPLACE USAGE (NORMAL) DEFPSIST (YES) MAXDEPTH (300000) DESCR('兴业银行')

DEFINE QLOCAL (XYTRANS) REPLACE USAGE (XMITQ) DEFPSIST (YES) MAXDEPTH (300000) DESCR('兴业银行')

DEFINE QREMOTE (XYACK) REPLACE DEFPSIST (YES) RQMNAME (SXSEND)  RNAME (XYACK) XMITQ (XYTRANS) DESCR('XXXX')

DEFINE CHANNEL (XYDATA) CHLTYPE (RCVR) TRPTYPE (TCP) REPLACE DESCR('XXXX')

DEFINE CHANNEL (XYACK) CHLTYPE (SDR) CONNAME ('166.1.1.8(2214)') XMITQ (XYTRANS) TRPTYPE (TCP) DISCINT (0) CONVERT (NO) SHORTRTY (30) SHORTTMR (10) LONGRTY (999999999) LONGTMR (20) REPLACE DESCR('XXXX')

DEFINE CHANNEL (SVRCONN) CHLTYPE (SVRCONN) MCAUSER('mqm')

 

创建监听

DEFINE LISTENER (RECLISTENER) TRPTYPE (TCP) CONTROL(QMGR) PORT (2214)

启动监听

start LISTENER(RECLISTENER)

 

启动通道

start channel(SVRCONN)

start channel(XYDATA)

start channel(XYACK)

 

———————————————————————————————————————————————————

 

四、2035错误码 说明

如果程序连接mq报错2035,则需要对权限认证做设置,则进行以此操作

1、

ALTER QMGR CHLAUTH(DISABLED)

2、

ALTER CHL(通道名) CHLTYPE(SVRCONN) MCAUSER('mqm')

3、

ALTER AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKCLNT(OPTIONAL)

或者直接将连接认证选项置为空,将其完全关闭,指令如下:

ALTER QMGR CONNAUTH('')

 

在执行完上述两条命令中的任一条后,都需要刷新连接认证的缓存,指令如下:

REFRESH SECURITY TYPE(CONNAUTH)

五、mq操作命令

一、MQ的启动与停止

1、MQ的启动

strmqm QMgrName

如果启动默认队列管理器,strmqm后可以忽略队列管理器名称。

2、MQ的关闭

endmqm -i QMgrName

停止mq

二、MQ运行状态查看与常用操作

1、 查看队列管理器运行状态

su mqm

执行如下命令检查队列管理器运行状态:dspmq显示结果中QMNAME表示MQ队列管理器的名称,STATUS表示当前运行状态。运行状态有如下几种:Starting正在启动Running正在运行Ending正在停止Ended normally已经正常终止Ended immediately已经立即终止Ended preemtively已经强制终止Ended unexpectively异常终止

注意:停止MQ后必须使用dspmq命令进行状态检查

2、查看通道运行状态与启停通道

runmqsc

dis chl(*);查看所有通道定义

dis chs(*);查看所有通道状态,如果没有查询到通道状态,或报错AMQ8420: Channel Status not found,请启动通道

dis chs(ChannelName); 查看通道ChannelName的状态

通道状态有如下几种:

STARTING正在启动BINDING正在绑定INITIALIZING正在初始化RUNNING正常STOPPING 正在停止RETRYING重试PAUSED等待STOPPED已停止REQUESTING请求

start chl(ChannelName);启动通道

stop chl(ChannelName);停止通道

* 重置通道

reset channel(ChannelName); 重置通道序号。当本地与其他MQ队列管理器的通道无法正常启动的情况,检查日志发现是通道序号不一致,此时就需要先停止发送方通道,清空队列深度并在发送方和接收方进行通道计数的重置,重置后启动通道即可恢复通讯。

注意:重置成功mq序列号一般相同或相差1

3、查看通道监听状态与启停监听

runmqsc

dis listner(*);查看通道监听定义

dis lsstatu(listnerName);查看监听状态

start lstr(listnerName); 启动监听

stop lstr(listnerName); 停止监听 

4、查看队列深度

runmqsc

dis q(*);查看所有各类队列的属性

dis qlocal(QName);查看所有本地队列的属性

队列深度属性为:CURDEPTH

查看队列深度display ql('队列名')  curdepth

*清空队列深度

清空队列深度

clear ql(‘队列名’)

三、MQ发送和接收消息

su mqm

发送消息

amqsput  队列名  队列管理器

获取消息

amqsget  队列名  队列管理器

可通过配合查看队列深度命令,完成mq的联调

六、其他维护中常用linux命令

1、测试端口连接

telnet ip port

2、查看已启动的端口

netstat -an | grep 端口号

3、查看应用进程

ps -ef |grep java

4、修改权限

chomd  XXX(对应的权限)  文件目录

5、修改文件或目录下所有文件所有者和组

Chomd -R 用户名:组名  文件目录

6、查看目录内容

ls 或者ls -l (简写ll)

7、查看文件输出

cat 目录/文件名

或者

Vi 目录/文件名 按i可进入编辑

按 G 到文档末尾

按 gg 到文件首行

不保存退出

Esc   :q!

保存退出

Esc   :wq

vi 进入文档文档后查找关键字

Esc 进入命令行

/关键字

按n向下继续查找

按N向上继续查找

8、杀进程

Kill -9 进程号

9、复制

cp -r 源目录  目标目录

10、移动

mv  -i 源文件或目录 目标文件或目录

11、删除

 rm -R 文件目录

12、 切换工作目录

cd  相对路径或绝对路径

~也表示为 home 目录 的意思, . 则是表示目前所在的目录, .. 则表示目前目录位置的上一层目录。

‘柒’ Linux命令笔记

运维管理命令
netstat -nap 查看系统正在开放的端口
netstat -tnlp | grep 80 查看哪个服务占用了80端口(-t表示只列出tcp协议的连接)
netstat -anptu | grep tcp 查看当前开放的所有tcp端口
rm -r 文件名 删除文件 (-r 递归) (-f 强制)
rm -rf ./* 删除当前目录里的所有文件
mv 文件路径 目标路径 移动文件到指定目录
mv 文件名a 文件名b 将文件名a重命名为文件名b
mv ./* ../ROOT/ 把当前目录下的所有文件移动到上级目录的ROOT文件夹里面
cp 起始路径 目标路径 将一个文件从一个地址复制到另一个地址
cp 文件1 文件2 将文件1复制一份命名为文件2
ssh 远程主机的用户名@远程主机ip 远程登录服务器(如果无法登陆,删除本地.ssh文件里的known_hosts文件里的内容)
scp -r 本地路径 user@ip:服务器路径 将本地文件传到服务器
scp user@ip:服务器路径 本地路径 将服务器文件传到本地
chmod -R 777 文件路径 赋予指定文件所有权限
chmod -R 777 . 以递归的方式修改当前目录下所有文件和子目录的权限
rpm -qa | grep httpd 查询是否安装httpd服务,并列出安装文件
rpm -e 软件名 查询某个软件是否被安装 (只有通过yum安装的才能查询到)
ps -ef | grep java 显示当前进程及参数,并过滤出java程序的进程 { PID表示这个程序的ID,PPID表示这个程序的父程序的ID }
kill PID 立即终止这个进程
crontab -e 编写计划任务(语法格式:分 时 日 月 周 需要执行的命令)
mkdir a 创建一个名称为a的文件夹
touch 文件名.文件格式 创建一个带后缀的文件
-sh 文件路径 查看指定路径的文件的大小
grep "关键词" 文件名 查找文件中带这个关键词的文件

系统维护命令
service 服务名 start/stop/restart 在deb包管理的系统中开关服务的命令
systemctl start/stop/restart 服务名 在rpm包管理的系统中开关服务的命令
man 命令 解释这个命令
history 数字 显示最近使用的命令
apt-get install 命令符号 安装命令程序
apt-get purge 命令符号 卸载命令程序
which 程序名 搜索某个程序路径
whereis 软件名 搜索某个软件路径
echo $PATH; 查看标准路径目录
dmesg -T 显示系统接入设备日志
sudo nautilus 文件路径 以管理员身份打开文件夹进行删改
df -h 查看磁盘使用情况
fdisk -l 查看分区具体情况
route 检查自己的路由表
traceroute url 检查本机到url的完整路径
git clone github地址 从github下载文件到本地

常用路径的作用
cd /bin 进入根目录下的bin目录
cd bin 进入当前目录下的bin目录
/etc/init.d 系统的启动文件目录,可以使用start启动着里面的文件 如:./bluetooth start 启动蓝牙
/usr/share / 从源安装的软件的文件默认存放地址

windows系
快捷键
Alt + Esc 切换活动窗口
Alt + F4 关闭当前程序
win + D 显示和隐藏桌面
win + I 打开设置
win + M 最小化所有窗口
win + Tab 打开任务视图
Ctrl + win + D 添加虚拟桌面
Ctrl + win + 切换虚拟桌面
Ctrl + win + F4 关闭你正在使用的虚拟桌面

打开服务配置
gpedit.msc 打开组策略
services.msc 打开服务控制
sysdm.cpl 打开系统属性(配置环境变量等操作)
chcp 65001 设置cmd为utf8字符集
c: MenuPrograms windows启动程序路径
在cmd中光标只有在当前行才能 ctrl + v 进行粘贴

windows下的ssh的使用
C:ProgramDatassh sshd_config配置文件所在目录,修改这个文件可以更改ssh连接到win后所在的目录 #ChrootDirectory none 改成 ChrootDirectory C: 然后重启ssh server服务,这样用linux连接到win后就会到 C: 目录下
将linux上的 a.txt文件 复制到windows的 c盘的a文件夹中
scp user@ip:/home/username1/视频/a.txt /c:/a ( -r 递归传送 )
将windows的 c盘的a文件夹中的c.txt文件 复制到linux的中
scp /c:/a/c.txt user@ip:/home/username1/视频/a ( -r 递归传送)
只能在windows系统上操作上面的两条命令,win中的user是用户文件夹里的文件夹名字。

在Mysql安装的目录中找到bin目录,复制此路径到系统属性的‘高级’中的环境变量path里,这样就可以在cmd中运行 mysql -u root -p

Dos命令

‘捌’ linux如何安装驱动

在Intel网站直接下载的Linux驱动是e1000-5.2.52.tar.gz(版本可能会有改变),这个压缩包里面没有编译好的.o的文件,需要在Linux系统下编译之后才能使用,
因为网卡需要编译,所以要先确认将内核源文件安装好,下面是关于内核源文件的安装
● Linux下添加内核源文件
1. 用rpm –qa|grep kernel-source查看是否安装了这个包;
如果返回结果中有kernel-source-xxx(其中xxx为当前redhat的内核版本,如rhel3为2.4.21-4EL), 即已经 安装。如无返回结果则需要安装kernel-source包。到安装光盘中找到kernel-source-xxx.i386.rpm,用下面命令安装此rpm包:
2.如果安装了用rpm -V kernel-source校验是否有文件丢失,如果没有输出,表示文件完整;
3.如果有丢失用rpm -ivh --force kernel-source-xxxx...把包重新安装一下;
这个kernel-source包,在您的RH安装光盘中,在Redhat/RPMS中,如果以前没有安装过这个包,那么用rpm -ivh kernel-source-xxxx...来安装,如果安装过,需要覆盖安装,使用rpm -ivh --force kernel-source-xxxx...这个命令强制安装。
注:AS 4 开始,没有kernel-source这个包了,取而代之的是kernel-dev这个包,检查这个包有没有安装的方法同上
● 驱动安装步骤:
1. 把这个tar文件拷贝到用户自己定义的目录中,例如:
/home/username/e1000 or /usr/local/src/e1000
2. 用tar命令解这个压缩包:
tar zxf e1000-5.2.52.tar.gz
3. 切换到驱动的src目录下:
cd e1000-5.2.52/src/
4. 编译这个驱动模块:
make
然后安装这个模块
make install
这个二进制元将被安装到如下位置:
/lib/moles//kernel/drivers/net/e1000.o
以上的路径是默认的安装位置,在某些linux版本中可能是其他位置,具体信息可以查看在驱动的 tar压缩包中的ldistrib.txt文件.
5. 安装模块:
insmod e1000 (2.6以上的版本最好使用全路径安装 P insmod /lib/moles//kernel/drivers/net/e1000/e1000.ko)
6. 设定网卡IP地址:
ifconfig ethx <IP_address> x是网卡接口的号
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
若多个网卡的芯片相同可以cp ifcfg-eth0 ifcfg-eth1~~~~~~
修改下里面的drive名称就OK
!!!!!!!!!!!!!!!!!!!
在网卡的编译中很可能不能进行下去~这个原因除了kernel的开发包没有安装外还可能是由于开发环境不完全所引起的!
这时就需要你讲开发环境安装完成,最简单的办法就是通过 sysconfig-config-packet 安装gcc
安装完成后继续执行 make ;make install

了解更多开源相关,去LUPA社区看看吧

‘玖’ ZYNQ+linux网口调试笔记(3)PL-ETH

在ZYNQ上使用gigE Vision协议的网络接口相机。

第一步:调通PS侧网口GEM0(Xilinx BSP默认配好)。

第二步:调通PS侧网口GEM1(见前一篇文档:开发笔记(1))。

第三步:调通PL侧网口(本文阐述)。

第四步:在PL侧网口上验证Jumbo Frame特性,并在应用层适配gigE Vision协议。

根据《xapp1082》可知,PL侧的PHY支持1000Base-X和SGMII两种配置,这两种配置对应两种不同的PHY引脚接口(连接到MAC)。而我们的hdf文件使用的是1000Base-X的配置。

关于网口的Linux驱动,我们在官网找到一份资料: Xilinx Wiki - Zynq PL Ethernet 。资料很长,我们只看与我们相关的2.4.1 PL Ethernet BSP installation for 1000Base-X”这一章节就可以了。

首先导入FPGA设计同事提供的hdf文件:

在弹出的图形界面里,进入Subsystem AUTO Hardware Settings——Ethernet Settings——Primary Ethernet,确认可以看到PL侧网络设备axi_ethernet_0,说明hdf文件里已包含了必要的网口硬件信息:

上图中被选中的网口将成为Linux上的设备eth0。这里我们默认选择ps7_ethernet_0,即使用GEM0作为首选网口。

启用Xilinx AXI Ethernet驱动

进入Device Drivers -- Network device support – 选中Xilinx AXI Ethernet(以及Xilinx Ethernet GEM,这是PS侧网口的驱动)

进入Networking support – 选中 Random ethaddr if unset

进入Device Drivers -- Network device support -- PHY Device support and infrastructure – 启用Drivers for xilinx PHYs

进入~~~~Device Drivers -- DMA Engine Support -– 禁用~~~~Xilinx AXI DMAS Engine~~~ (对应的配置项名为 ~~ CONFIG_XILINX_DMA ~~~)

注意: Xilinx Wiki里对设备树节点的引用有误(&axi_ethernet),导致编译报错,应改为&axi_ethernet_0。

注:PL-ETH驱动所在路径:<project>/build/tmp/work-shared/plnx_arm/kernel-source/drivers/net/ethernet/xilinx/xilinx_axienet_main.c和xilinx_axienet_mdio.c。对应的内核配置项为CONFIG_NET_VENDOR_XILINX和CONFIG_XILINX_AXI_EMAC。

启用ethtool和tcpmp(调试用,非必须):

然后将生成的BOOT.BIN和image.ub拷贝到SD卡根目录下,将SD卡插入板子上,上电运行。

上电后,使用ifconfig eth1查看网口信息,观察MAC地址与设置的一致,且ifconfig eth1 192.168.1.11 up没有报错。

测试网络通路:ping PC是通的。说明网口工作正常。

Linux下eth1(即PL-ETH)的MAC地址有误

问题描述:

开机打印:

注意:

MAC地址是错的,驱动里解析出的是GEM0的MAC地址。

试验发现,即使在system-user.dtsi里不写local-mac-address,也照样解析出的是GEM0的MAC。

而将system-user.dtsi里的local-mac-address改名为pl-mac-address,并将驱动里解析的字符串也对应更改为pl-mac-address,则可以正确解析出来:

Passing MAC address to kernel via Device Tree Blob and U-Boot:

http://zedboard.org/content/passing-mac-address-kernel-device-tree-blob

通过更改u-boot环境变量和设备树,为每个板子设置一个独特的MAC地址:

https://www.xilinx.com/support/answers/53476.html

U-Boot里的环境变量ethaddr会覆盖掉设备树里pl-eth的local-mac-addr字段,从而影响Linux启动后的网卡MAC地址;

但U-Boot里的环境变量ipaddr不会对Linux启动后的配置产生任何影响。因为设备树里根本就没有关于IP地址的配置。

phy-mode怎么会是sgmii?查了下官方的提供的BSP里,也是“sgmii”。说明这个没问题。具体原因不清楚。

@TODO: 设备树里的中断号的顺序如何影响功能?

为何读出来的IRQ号不对呢?这是因为这里读到的不是硬件的中断号,而是经过系统映射之后的软件IRQ number。两者不具有线性关系。

关于中断号的疑问:

Linux上的网口eth0、eth1的顺序,似乎是按照phy地址从小到大来排布的。

Xilinx xapp1082-zynq-eth.pdf (v5.0) July 16, 2018

https://www.xilinx.com/support/documentation/application_notes/xapp1082-zynq-eth.pdf

Xilinx Wiki - Zynq PL Ethernet:

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841633/Zynq+PL+Ethernet

Xilinx Wiki - Linux Drivers:

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841873/Linux+Drivers

Xilinx Wiki - Linux Drivers - Macb Driver:

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841740/Macb+Driver

Xilinx Wiki - Zynq Ethernet Performance:

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841743/Zynq+Ethernet+Performance

查到关于Jumbo frame MTU的定义,当前值为9000,可否改大一些?

驱动源码里关于jumbo frame的说明:

设置MTU为9000,发现ping包最大长度只能设为ping 192.168.1.10 -s 1472

https://lore.kernel.org/patchwork/patch/939535/

【完】

‘拾’ 求《Linux学习笔记》全文免费下载百度网盘资源,谢谢~

《Linux学习笔记》网络网盘pdf最新全集下载:
链接:https://pan..com/s/14_AW0VF1GI49o30HmBdnzA

?pwd=6yf8 提取码:6yf8
简介:Linux就是一个操作系统,它可以管理整个计算机硬件,并且可以接收我们的指令,来指挥硬件完成相应的任务,并把结果反馈给我们,小编今天给大家带来的是Linux学习笔记完整版的内容,想要学习linux的朋友们千万不要错过啦

热点内容
内置存储卡可以拆吗 发布:2025-05-18 04:16:35 浏览:335
编译原理课时设置 发布:2025-05-18 04:13:28 浏览:378
linux中进入ip地址服务器 发布:2025-05-18 04:11:21 浏览:612
java用什么软件写 发布:2025-05-18 03:56:19 浏览:32
linux配置vim编译c 发布:2025-05-18 03:55:07 浏览:107
砸百鬼脚本 发布:2025-05-18 03:53:34 浏览:943
安卓手机如何拍视频和苹果一样 发布:2025-05-18 03:40:47 浏览:739
为什么安卓手机连不上苹果7热点 发布:2025-05-18 03:40:13 浏览:803
网卡访问 发布:2025-05-18 03:35:04 浏览:511
接收和发送服务器地址 发布:2025-05-18 03:33:48 浏览:371