Download presentation
Presentation is loading. Please wait.
1
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab3
2
目錄 Contents Kernel module 介紹Beaglebone Kernel module 實作 Beaglebone
3
Kernel module 介紹 01 Kernel module 有別於一般在使用者模式下執行的程式 (或稱為 process),也就是會載入到 Linux kernel 之中,在非使用者模式下來執行的程式模組。 02 通常會需要載入 kernel 來執行的程式,大多是驅動程式與硬體相關。 03 目的就是得以減小 Linux kernel,讓 Linux 可以更具有彈性,可以只依據需求載入必要的模組。
4
00 Kernel module 實作 事前準備 uname -r 更新並下載安裝編譯kernel所需的套件檔案。
sudo apt-get update sudo apt-get install linux-headers-$(uname -r) 網路設定 區網的話不用另外設定,網路線插上去即可使用。 如果需要設定固定ip可以參考以下網址。 sudo nano /etc/network/interfaces sudo /etc/init.d/networking restart sudo reboot
5
00 Kernel module 實作 安裝新kernel 版本 搜尋新kernel版本,並選擇所需的版本進行下載及更新。
sudo apt-get update sudo apt-cache search linux-image | grep <branch> sudo apt-get install linux-image-<specific version> sudo reboot cd /opt/scripts/tools/ git pull sudo ./update_kernel.sh
6
01 Kernel module 實作 建立 hello.c
建立並進入一個測試目錄 kernel_test,然後開始編輯 hello.c 檔案。 mkdir kernel_test cd kernel_test vim hello.c
7
02 Kernel module 實作 建立 Makefile 在同測試目錄下建立一個Makefile檔案。 注意:
gcc 前面一定要用TAB ,否則 make 會 fail。 vim Makefile
8
Kernel module 實作 Make 語法簡介 := 語法 指定變數的語法,make 會先把整個檔案展開,找出該變數最後一個被指定的值並且 assign 給他。 Ex. x = foo x := foo y = $(x) y := $(x) x = foobar x := foobar 則第一個y 的結果為 foobar,第二個y的結果為foo。 ?= 語法 指定變數的語法,如果變數已經被指定過,則不會再被指定。
9
Kernel module 實作 Makefile 的內容 PWD := $(shell pwd):取得目前目錄 KVERSION := $(shell uname -r):取得 kernel 版本號 KERNEL_DIR = /usr/src/linux-headers-$(KVERSION)/:因為編譯 kernel 需要 include kernel 目錄,所以這邊也要定義 obj-m:表示需要編繹成模組的目標檔案名集合,編譯的方式為編譯成區塊,這裡要注意的是,他同時也是代表被編譯的檔案名稱, 如果要被編譯的是 Hello.c,那這邊就要填 obj-m := hello.o,此外還有 obj-y,代表編譯進去內核。 編譯指令 make -C $(KERNEL_DIR) M=$(PWD) modules -C::跟 make 講 這次 kernel module include 的目錄在哪 $(KERNEL_DIR):Makefile 中可以使用變數,一般變數大寫,在引用變數時,採用小括弧擴起變數名前加($)符號來用。 M=$(PWD):描述那個目錄要被編譯 (早期的指令是SUBDIRS),M=$(PWD),這是定義在 kernel 的 make file 中,要詳細內容可以去看 kernel 的 make file。
10
03 Kernel module 實作 編譯 module
在 kernel_test 目錄下執行 make,看到以下的訊息就算是完成編譯了。 使用ls看編譯好的檔案 make ls
11
03 Kernel module 實作 載入/移除 module 使用 insmod 指令來載入 hello.ko
接著用 lsmod 指令來確認 module 是否成功載入。 由於系統載入的 module 很多,這邊用 grep 來過濾出我們的 hello module。 最後,把 hello module 移除 使用 rmmod 指令,就可以把 module 移除。 sudo insmod hello.ko sudo lsmod | grep “hello” => hello sudo rmmod hello.ko
12
04 Kernel module 實作 察看系統日誌
執行完載入與移除的動作,回過頭來看看 hello.c 裡頭的 hello_init 和 hello_exit 這裡各呼叫了 printk 這個 function,因此它會在系統日誌上輸出 KERN_INFO 級別的訊息可以呼叫 dmesg 指令來察看系統日誌。 dmesg ...(略) [ ] Hello world ! [ ] Bye !
13
Thanks 作業系統實習 Operating Systems
Similar presentations