### ARM驅(qū)動(dòng)
程序的分種
1.直接運(yùn)行在硬件上:裸機(jī)程序
2.只能運(yùn)行在對(duì)應(yīng)的操作系統(tǒng)上:應(yīng)用程序
操作系統(tǒng)
操作系統(tǒng)的定義
- 給應(yīng)用程序提供運(yùn)行環(huán)境的裸機(jī)程序
- 操作系統(tǒng)最底下是linux ,android是中間件,最上層是應(yīng)用
操作系統(tǒng)的分類(lèi)
1.任務(wù)管理(多任務(wù)支持)(最核心的模塊)
2.內(nèi)存管理(mm)
3.網(wǎng)絡(luò)管理(net)
4.文件管理(fs)
5.設(shè)備驅(qū)動(dòng)管理(drivers)
6.塊設(shè)備(block)
7.對(duì)CPU體系的支持(arch)
8.啟動(dòng)管理(init)
操作系統(tǒng)的分時(shí)
1.分時(shí):
2.實(shí)時(shí):響應(yīng)速度
- 單內(nèi)核:linux(某個(gè)代碼出現(xiàn)問(wèn)題,則操作系統(tǒng)程序就沒(méi)法操作)
- 微內(nèi)核:windows(某個(gè)代碼出現(xiàn)問(wèn)題,并不會(huì)影響操作系統(tǒng))
UNIX
UNIX家族OS的共同特點(diǎn)
1.很簡(jiǎn)潔,僅幾百個(gè)系統(tǒng)調(diào)用
2.所有東西都被當(dāng)做文件對(duì)待
3.C語(yǔ)言編寫(xiě)內(nèi)核好喝系統(tǒng)軟件工具,強(qiáng)大的移植力
4.高效地創(chuàng)建進(jìn)程,獨(dú)特的fork()
5.提供一套非常簡(jiǎn)單又很穩(wěn)定的進(jìn)程間通信元語(yǔ)
6.以文本形式存儲(chǔ)配置數(shù)據(jù)
內(nèi)核編程特點(diǎn)
1.無(wú)lib,無(wú)任何第三方庫(kù),不能包含任何第三方頭文件
2.GNU C而非ANSI C
3.沒(méi)有內(nèi)存保護(hù)機(jī)制
4.不要輕易在內(nèi)核中使福浮點(diǎn)數(shù)
5.容積小而固定的棧
6.同步和并發(fā)
7.可移植性的重要性
- 注意點(diǎn):異常服務(wù)程序不屬于任何一個(gè)任務(wù),不是任務(wù)所以沒(méi)有任何一個(gè)狀態(tài).
算法的特征
1.可行性
2.有窮性
設(shè)備操作過(guò)程
1.設(shè)備管理(代碼)
2.任務(wù)管理
3.文件管理
4.內(nèi)存管理
進(jìn)程與線程
睡眠(任務(wù)進(jìn)行睡眠是為了等待資源的就緒)
- 深度睡眠:只有任務(wù)就位才能喚醒
- 淺度睡眠:當(dāng)信號(hào)到來(lái)就能喚醒
僵尸進(jìn)程
- 一個(gè)進(jìn)程fork了一個(gè)子進(jìn)程,父進(jìn)程結(jié)束了,就剩下了子進(jìn)程,這樣的子進(jìn)程就是僵尸進(jìn)程
- 解決僵尸進(jìn)程:一個(gè)進(jìn)程fork一個(gè)子進(jìn)程,子進(jìn)程再fork一個(gè)孫子進(jìn)程,將子進(jìn)程結(jié)束,則孫子進(jìn)程脫離父進(jìn)程,成獨(dú)立的進(jìn)程.最后,孫子進(jìn)程也稱(chēng)為孤兒進(jìn)程,會(huì)被祖宗進(jìn)程清理掉
內(nèi)核線程
- pid=0的進(jìn)程相當(dāng)于內(nèi)核,pid=1的進(jìn)程為祖宗進(jìn)程
內(nèi)核空間
1.內(nèi)核獨(dú)立于普通應(yīng)用程序,它處于系統(tǒng)態(tài)
2.擁有受保護(hù)的內(nèi)存空間和訪問(wèn)硬件設(shè)備的所有權(quán)限
3.這種處于系統(tǒng)態(tài)被保護(hù)起來(lái)的內(nèi)存空間,統(tǒng)稱(chēng)為內(nèi)核空間
4.如果想要使用,則必須要用接口將內(nèi)存空間映射到用戶(hù)空間下,才能使用,不能直接運(yùn)用
處理器在任何指定時(shí)間點(diǎn)上的活動(dòng)概況為如下:
1.運(yùn)用于用戶(hù)空間,執(zhí)行用戶(hù)進(jìn)程(可睡眠)
2.運(yùn)行于內(nèi)核空間,處于用戶(hù)進(jìn)程上下文,代表每個(gè)特定的進(jìn)程執(zhí)行(可睡眠)
3.運(yùn)行于內(nèi)核空間,
Linux內(nèi)核編碼風(fēng)格
1.接近K&RC風(fēng)格(K和R這兩個(gè)人創(chuàng)建了C語(yǔ)言)
2.縮進(jìn)
3.switch與case同列
4.空格
(1)空格放在關(guān)鍵字周?chē)?br> (2)函數(shù)名和圓括號(hào)之間無(wú)空格
(3)函數(shù)參數(shù)前后無(wú)空格
(4)char p,p1;//表示p與p1是char類(lèi)型的
(5)char* p,p1;//表示p與p1都是char*類(lèi)型的
5.花括號(hào)
(1)函數(shù)體采用同列
(2)右花括號(hào)可以不單獨(dú)占一行,與后續(xù)關(guān)鍵字同行
6.命名規(guī)范
(1)不允許駝峰命名法
7.函數(shù)
(1)函數(shù)代碼長(zhǎng)度不應(yīng)該超過(guò)兩屏
(2)局部變量不應(yīng)該超過(guò)10個(gè)
(3)允許使用inline
8.注釋
(1)應(yīng)該描述代碼要做什么和為什么要做
(2)注釋不應(yīng)該包含誰(shuí)寫(xiě)了哪個(gè)函數(shù),
9.Typedef(給已有的數(shù)據(jù)類(lèi)型起別名)
(1)內(nèi)核開(kāi)發(fā)者們強(qiáng)烈反對(duì)使用typedef
10.盡量多使用現(xiàn)成的東西,例如:鏈表
11.在源碼中減少代碼量
12.結(jié)構(gòu)體初始化
(1)C99風(fēng)格初始化
(2)
struct foo my_foo={ .a = INITIAL_A, .b =INITIAL_B
塊設(shè)備
1.塊設(shè)備:讀數(shù)據(jù)是按照一塊一塊的讀,一塊是520k
字符設(shè)備的編寫(xiě)
1.進(jìn)入linux-2.6.32.2/drivers/char
2.mini2440_hello_module.c復(fù)制成myhello.c
3.修改Kconfig文件,復(fù)制上一段程序,然后組修改

4.修改Makefile文件,復(fù)制mini2440_hello_module那一行之后,進(jìn)行修改

5.然后保存退出
6.編譯:make zImage
7.進(jìn)入config界面:make menuconfig
- 選擇Device Drivers --->

- 選擇Character devices

- 選擇My module sample,按空格鍵將M改為*號(hào)

內(nèi)核設(shè)備的編寫(xiě)
1.在用戶(hù)自己創(chuàng)建的目錄下:創(chuàng)建一個(gè)hello.c與Makefile的文件
2.在hello.c中
#include <linux/kernel.h>
#include <linux/module.h>
static int __init mini2440_hello_module_init(void)
{
printk("Hello,Min2440 module is installed !\n");
return 0;
}
static void __exit mini2440_hello_module_cleanup(void)
{
printk("Good_bye,mini2440 module was removed!\n");
}
module_init(mini2440_hello_module_init);
module_exit(mini2440_hello_module_cleanup);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jiang xiu bi");
MODULE_DESCRIPTION("This is example module!!");
MODULE_VERSION("V1.0.0");
- 在Makefile中
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /home/jxb/1612/1/sq1612/linux-2.6.32.2
PWD :=$(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers *.order
.PHONLY:modules modules_install clean
else
obj-m :=hello.o
#obj-m :=hello2.o
endif
- 運(yùn)行結(jié)果

3.代碼升級(jí),在hello.c中
#include <linux/kernel.h>
#include <linux/module.h>
//#define __init
//#define __exit
static int howmany=1;
static char * name="Jiang xiu bi";
static int __init mini2440_hello_module_init(void)
{
printk("Hello,Min2440 module is installed !\n");
printk("I am %s!\n",name);
printk("I have %d mini2440 board!\n",howmany);
return 0;
}
static void __exit mini2440_hello_module_cleanup(void)
{
printk("Good_bye,mini2440 module was removed!\n");
}
module_init(mini2440_hello_module_init);
module_exit(mini2440_hello_module_cleanup);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jiang xiu bi");
MODULE_DESCRIPTION("This is example module!!");
MODULE_VERSION("V1.0.0");
module_param(howmany,int,S_IRUGO);
module_param(name,charp,S_IRUGO);
EXPORT_SYMBOL(howmany);
EXPORT_SYMBOL(name);
- 在Makefile中
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /home/jxb/1612/1/sq1612/linux-2.6.32.2
PWD :=$(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers *.order
.PHONLY:modules modules_install clean
else
obj-m :=hello.o
#obj-m :=hello2.o
endif
- 運(yùn)行結(jié)果


- 再升級(jí)版,兩個(gè)模塊的,在hello.c中
#include <linux/kernel.h>
#include <linux/module.h>
//#define __init
//#define __exit
static int howmany=1;
static char * name="Jiang xiu bi";
static int __init mini2440_hello_module_init(void)
{
printk("Hello,Min2440 module is installed !\n");
printk("I am %s!\n",name);
printk("I have %d mini2440 board!\n",howmany);
return 0;
}
static void __exit mini2440_hello_module_cleanup(void)
{
printk("Good_bye,mini2440 module was removed!\n");
}
module_init(mini2440_hello_module_init);
module_exit(mini2440_hello_module_cleanup);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jiang xiu bi");
MODULE_DESCRIPTION("This is example module!!");
MODULE_VERSION("V1.0.0");
module_param(howmany,int,S_IRUGO);
module_param(name,charp,S_IRUGO);
EXPORT_SYMBOL(howmany);
EXPORT_SYMBOL(name);
- 在hello2.c中
#include <linux/kernel.h>
#include <linux/module.h>
//#define __init
//#define __
extern int howmany;
extern char * name;
static int __init mini2440_hello_module_init(void)
{
printk("Hello,Min2440 module is installed !\n");
printk("I am %s!\n",name);
printk("I have %d mini2440 board!\n",howmany);
return 0;
}
static void __exit mini2440_hello_module_cleanup(void)
{
printk("Good_bye,mini2440 module was removed!\n");
}
module_init(mini2440_hello_module_init);
module_exit(mini2440_hello_module_cleanup);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jiang xiu bi");
MODULE_DESCRIPTION("This is example module!!");
MODULE_VERSION("V1.0.0");
- 在Makefile中
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /home/jxb/1612/1/sq1612/linux-2.6.32.2
PWD :=$(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers *.order
.PHONLY:modules modules_install clean
else
obj-m :=hello.o
obj-m :=hello2.o
endif
- 運(yùn)行結(jié)果
1.先運(yùn)行模塊1

2.再運(yùn)行模塊2
Paste_Image.png
