学習を促進する-毎日のメモ1日目

[1]コースの概要
1. Linuxカーネルモジュール
2.キャラクターデバイスドライバー
3.同時実行性と競合状態のソリューション
4. IOモデル
5. Linuxカーネル割り込み
6.プラットフォームバスドライバー
7. i2cバスドライバー
8. spiバスドライバー
9。ブロックデバイスドライバー
10.ネットワークカードデバイスドライバー

[2]
職場でのLinuxデバイスドライバー開発、
Androidデバイスドライバー開発

[3]ドライバーとは何ですか?アームベアメタルドライバーとLinuxデバイスドライバーの違いは何ですか?
ドライブ:ハードウェアを駆動して、ソフトウェアコード
を共通に動作させる:
ハードウェアの動作を駆動できる
さまざまなポイント:
ARMベアメタルドライブ:実行の順序に従ってのみ
実行できるコード、このコードは単独で実行でき、依存しないその
彼のコード。

	Linux设备驱动:它是基于Linux内核才能够操作硬件,
	如果没有Linux内核,驱动不能单独执行,也不能自动
	执行(必须通过应用层控制才能执行)。可以同时安装
	多个Linux设备驱动

[4] Linuxシステムレベルの
アプリケーションレイヤー:[0-3G]
APP glibc
---------------(system call swi)-------------- ----------------
カーネル層:5つの主要な機能[3-4G]
ファイル管理:ファイルシステムext2 ext3 ext4 yaffs jiffeなどを介してファイルを整理および
管理します
メモリ管理:メモリを介して(スラブ)メモリの割り当てと解放を行う管理ユニット。
プロセス管理:プロセスの作成、破棄、プロセススケジューリング、その他の機能を
管理します。ネットワーク管理:ネットワークデータは、ネットワークプロトコルスタックを介して送受信されます。
デバイス管理:デバイスドライバー管理。
キャラクターデバイスドライバー:バイトストリームに従って、順番にアクセスします。訪問した。
ブロックデバイスドライバー:ブロック(512バイト)によるアクセス、シーケンシャル
または順不同でアクセス可能
ネットワークカードデバイスドライバー:ネットワークカードデバイスドライバーにデバイスファイルがありません。
(このデバイスを介したネットワークデータ送信)

ハードウェアレイヤー:LEDカメラLCDタッチスクリーン
サウンドカードグラフィックカードビープUSBマウスUディスクハードディスク
フラッシュスイッチルーター猫ネットワークカードなど

[5] Linuxデバイスドライバーは
demo.c <====キャラクターデバイスドライバーを使用します

Kconfig :生成选项菜单的文件
	 /home/linux/kernel/kernel-3.4.39/drivers/char
	 
	config FARSIGHT_DEMO (选项名)
	tristate "test test test ..." (选项菜单名)
	help
		this is a driver demo 

.config  :保存选配号的选项
	CONFIG_FARSIGHT_DEMO=y
	CONFIG_FARSIGHT_DEMO=m 
	#CONFIG_FARSIGHT_DEMO is not set
	
Makefile :用来编译驱动模块的
	obj-$(CONFIG_FARSIGHT_DEMO) += demo.o

	obj-y +=demo.o
	obj-m +=demo.o


编译:
	y:
	make uImage  ===>将驱动编译到uImage中
	
	m:
	make modules ===>将驱动编译生成xxx.ko文件

[6] Linuxカーネルモジュール

模块三要素:内核模块不能单独执行,也不能自动自行

入口
	static int __init demo_init(void)
	{
		return 0;
	}
	module_init(demo_init);
出口
	static void __exit demo_exit(void)
	{
		
	}
	module_exit(demo_exit);
许可证
	MODULE_LICENSE("GPL");


内部编译:在内核源码树中编译
外部编译:在内核源码树外进行编译

Makefile:
	KERNELDIR:= /lib/modules/$(shell uname -r)/build/
	//这是Makefile中的一个变量,记录ubuntu内核的路径的
	//$(shell 命令) 在Makefile中起一个终端,执行命令,将
	//将命令执行的结果作为返回值
	PWD:=$(shell pwd)
	//PWD它是记录驱动所在目录的一个变量。

	all:
		//all是make执行的时候的默认的标签,
		//这个all的名字也可以随意指定(如modules)
		make -C $(KERNELDIR) M=$(PWD) modules
		//make -C dir  进入到dir目录下执行它里面的Makefile文件
		//M  它是记录程序当前路径的一个变量
		//make modules 编译模块,只编译M指定的目录下的模块
		
	clean:
		make -C $(KERNELDIR) M=$(PWD) clean
		//make -C dir  进入到dir目录下执行它里面的Makefile文件
		//M= 它是记录程序当前路径的一个变量
		//make clean 清除编译,只清除M指定的目录下的模块文件
	
	obj-m:=demo.o  
	//指定的要编译的模块的名字

Makefile中四种赋值的区别?
	=  
		查找Makefile中变量最后一次被赋值
		的结果,然后将它赋值给新的变量
		var1=abc
		var2=$(var1)
		var1=def

																									
		all:
			@echo $(var1)   #def
			@echo $(var2)   #def

	:=  立即赋值
		var1=abc
		var2:=$(var1)
		var1=def
																									
		all:
			@echo $(var1)  #def
			@echo $(var2)  #abc
	               
	+=  附加赋值
		var1=abc                                                                                    
		var2=def
		var2+=$(var1)

		all:
			@echo $(var1) #abc
			@echo $(var2) #def abc
	                 
	?= 询问赋值:询问变量之前是否被赋值过,
		如果变量之前没有被赋值过本次赋值成立,
		否则本次赋值不成立
		var1?=def

		all:
			@echo $(var1)   #def
	
		var1=abc
		var1?=def

		all:
			@echo $(var1)   #abc

[7]ドライバーのインストールとアンインストール用のコマンド
sudo insmod xxx.koドライバーのインストール
lsmodモジュールがインストールされているかどうかの確認
sudo rmmod xxxアンインストールドライバー
modinfo xxx.koモジュールのさまざまな情報を確認するコマンド
dmesg printk
sudo dmesg- によって出力されたメッセージを確認しますc最初にそれを端末に表示し、次にメッセージを消去します
sudo dmesg -C直接メッセージを消去します

[8]カーネル印刷関数
printk(印刷レベル "制御形式"、変数);
printk( "制御形式"、変数); //デフォルトの
カーネルの8つの印刷レベル次のように使用され、数値が小さいほど優先順位が高くなります。
#define KERN_EMERG“ <0>”
/ *システムは使用できません/
#define KERN_ALERT“ <1>”
/
すぐに対処する必要があります/
#define KERN_CRIT“ <2>”
/
クリティカル条件/
#define KERN_ERR“ <3>”
/
エラー条件/
#define KERN_WARNING“ <4>”
/
警告条件/
#define KERN_NOTICE“ <5>”
/
正常だが重要な条件/
#define KERN_INFO“ <6>”
/
情報/
#define KERN_DEBUG“ <7>”
/
デバッグレベルのメッセージ* /

打印级别问题:
proc/sys/kernel$ ls printk
cat /proc/sys/kernel/printk
4	          4             	1	           7
终端的级别    消息的默认级别   终端的最大级别  终端的最小级别


只有当消息的级别大于终端的级别的
时候,消息才会显示。

由于ubuntu的终端已经被开发者修改过了,所以
即使消息的级别大于控制台的级别,消息依然不会
显示,使用虚拟控制台才执行代码

ctrl +alt +[F1-F6]  进入虚拟终端
ctrl +alt + F7      退出虚拟终端

修改默认级别的办法:
su root
echo 4 3 1 7 > /proc/sys/kernel/printk

[9]カーネルモジュールのパラメーター転送の問題。
職場での開発時に画面ハードウェアを購入すると、
画面ドライバー(xxx.ko)が提供されます。たとえば、コマンドラインパラメーター転送を使用し
て画面のデフォルトの最大サイズを変更できます。輝度。

Standard types are:
	byte, short, ushort, int, uint, long, ulong 注意:没有char类型!!
	charp: a character pointer
	bool: a bool, values 0/1, y/n, Y/N.
	invbool: the above, only sense-reversed (N = true).  

module_param(name, type, perm)  
功能:接收命令行传的参数
参数:
	@name:变量名
	@type: 变量的类型
	@perm: 权限 0664 0775
	
MODULE_PARM_DESC(_parm, desc)
功能:对命令行传递的参数进行描述
参数:
	@_parm:变量
	@desc:描述的字符串

安装驱动的时候传参:
	sudo insmod demo.ko light=80
	
在运行的使用传参
	/sys/module/驱动命名的目录/parameters/
	以变量命名的文件
	
	su root
	echo 70 > light

おすすめ

転載: blog.csdn.net/weixin_48430195/article/details/108671730