ARM-第七次

### ARM驅動

程序的分種

1.直接運行在硬件上:裸機程序
2.只能運行在對應的操作系統上:應用程序

操作系統

操作系統的定義

  • 給應用程序提供運行環境的裸機程序
  • 操作系統最底下是linux ,android是中間件,最上層是應用

操作系統的分類

1.任務管理(多任務支持)(最核心的模塊)
2.內存管理(mm)
3.網絡管理(net)
4.文件管理(fs)
5.設備驅動管理(drivers)
6.塊設備(block)
7.對CPU體系的支持(arch)
8.啟動管理(init)

操作系統的分時

1.分時:
2.實時:響應速度

  • 單內核:linux(某個代碼出現問題,則操作系統程序就沒法操作)
  • 微內核:windows(某個代碼出現問題,并不會影響操作系統)

UNIX

UNIX家族OS的共同特點

1.很簡潔,僅幾百個系統調用
2.所有東西都被當做文件對待
3.C語言編寫內核好喝系統軟件工具,強大的移植力
4.高效地創建進程,獨特的fork()
5.提供一套非常簡單又很穩定的進程間通信元語
6.以文本形式存儲配置數據

內核編程特點

1.無lib,無任何第三方庫,不能包含任何第三方頭文件
2.GNU C而非ANSI C
3.沒有內存保護機制
4.不要輕易在內核中使福浮點數
5.容積小而固定的棧
6.同步和并發
7.可移植性的重要性

  • 注意點:異常服務程序不屬于任何一個任務,不是任務所以沒有任何一個狀態.

算法的特征

1.可行性
2.有窮性

設備操作過程

1.設備管理(代碼)
2.任務管理
3.文件管理
4.內存管理

進程與線程

睡眠(任務進行睡眠是為了等待資源的就緒)

  • 深度睡眠:只有任務就位才能喚醒
  • 淺度睡眠:當信號到來就能喚醒

僵尸進程

  • 一個進程fork了一個子進程,父進程結束了,就剩下了子進程,這樣的子進程就是僵尸進程
  • 解決僵尸進程:一個進程fork一個子進程,子進程再fork一個孫子進程,將子進程結束,則孫子進程脫離父進程,成獨立的進程.最后,孫子進程也稱為孤兒進程,會被祖宗進程清理掉

內核線程

  • pid=0的進程相當于內核,pid=1的進程為祖宗進程

內核空間

1.內核獨立于普通應用程序,它處于系統態
2.擁有受保護的內存空間和訪問硬件設備的所有權限
3.這種處于系統態被保護起來的內存空間,統稱為內核空間
4.如果想要使用,則必須要用接口將內存空間映射到用戶空間下,才能使用,不能直接運用

處理器在任何指定時間點上的活動概況為如下:

1.運用于用戶空間,執行用戶進程(可睡眠)
2.運行于內核空間,處于用戶進程上下文,代表每個特定的進程執行(可睡眠)
3.運行于內核空間,

Linux內核編碼風格

1.接近K&RC風格(K和R這兩個人創建了C語言)
2.縮進
3.switch與case同列
4.空格
(1)空格放在關鍵字周圍
(2)函數名和圓括號之間無空格
(3)函數參數前后無空格
(4)char p,p1;//表示p與p1是char類型的
(5)char* p,p1;//表示p與p1都是char*類型的
5.花括號
(1)函數體采用同列
(2)右花括號可以不單獨占一行,與后續關鍵字同行
6.命名規范

        (1)不允許駝峰命名法

7.函數
(1)函數代碼長度不應該超過兩屏
(2)局部變量不應該超過10個
(3)允許使用inline
8.注釋
(1)應該描述代碼要做什么和為什么要做

        (2)注釋不應該包含誰寫了哪個函數,

9.Typedef(給已有的數據類型起別名)
(1)內核開發者們強烈反對使用typedef
10.盡量多使用現成的東西,例如:鏈表
11.在源碼中減少代碼量
12.結構體初始化
(1)C99風格初始化
(2)
struct foo my_foo={ .a = INITIAL_A, .b =INITIAL_B

塊設備

1.塊設備:讀數據是按照一塊一塊的讀,一塊是520k

字符設備的編寫

1.進入linux-2.6.32.2/drivers/char
2.mini2440_hello_module.c復制成myhello.c
3.修改Kconfig文件,復制上一段程序,然后組修改

Paste_Image.png

4.修改Makefile文件,復制mini2440_hello_module那一行之后,進行修改

Paste_Image.png

5.然后保存退出
6.編譯:make zImage
7.進入config界面:make menuconfig

  • 選擇Device Drivers --->
Paste_Image.png
  • 選擇Character devices
Paste_Image.png
  • 選擇My module sample,按空格鍵將M改為*號
Paste_Image.png

內核設備的編寫

1.在用戶自己創建的目錄下:創建一個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

  • 運行結果

3.代碼升級,在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

  • 運行結果
Paste_Image.png
Paste_Image.png
  1. 再升級版,兩個模塊的,在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

  • 運行結果
    1.先運行模塊1
Paste_Image.png

2.再運行模塊2


Paste_Image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容