2016年5月19日 星期四

Linux_Driver入門-寫一個HelloWorld module

因為是driver的初學者,所以先練習寫一支HelloWorld的module,這個module的行為是當insmod這個module的時候,會印出"Hello World!"的字眼,而在rmmod的時候會印出"Goodbye, hello world"

首先描述一下整個編譯環境,以及要掛這個module的平台:
首先說明要掛這個module的平台
- arm64平台(DB410C),系統是linux

編譯平台
- PC,系統是ubuntu,DB410C的kernel與toolchain都準備好了

這邊先說明一下,當你要作交叉編譯時,一定要有Target Board(DB410C)的toolchain,以這邊的例子為例,我在PC上面編譯,我利用toolchain把程式編譯成Target Board可讀的檔案

另外要注意的是,要編譯driver,必須要拿到與Target Board相同的Kernel Source Code(版本要相同),Source code必須整包放在要進行編譯的PC端,編譯時必須參考到裡面的一些header檔

接著就來看我們的HelloWorld.c

///////////////////////////////////////////  HelloWorld.c  ///////////////////////////////////////////
#include <linux/module.h>
#include <linux/init.h>

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
    printk("Hello world!\n");
    return 0;
}

static void hello_exit(void)
{
    printk("Goodbye, hello world\n");
}

module_init(hello_init);
module_exit(hello_exit);
///////////////////////////////////////////////////////////////////////////////////////////////////////////

這程式很單純,在module被insert的時候就會執行hello_init的function
在module被remove時會執行hello_exit的function



接著是Makefile的部分

obj-m += hello.o

KERNEL=/home/danny/DB410C/kernel/kernel

all:
make -C $(KERNEL) M=$(shell pwd) modules ARCH=arm64

clean:
make -C $(KERNEL) M=$(shell pwd) clean


編譯之前這邊要注意兩個部分,首先是必須給系統CROSS_COMPILE環境變數,必須給他toolchain的完整路徑,請使用export指令:
export CROSS_COMPILE=/home/Danny/DB410C/toolchain/gcc-linaro-4.9-2014.11-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
(請依照你的toolchain給定CROSS_COMPILE的值)

另外一部分是Makefile中KERNEL這個參數,必須要指定到PC上,Target Board(DB410C)的Kernel Source Code,這樣編譯時才不會出錯!


接著只需下make,hello.ko就會被產生出來,接著把hello.ko複製到Target Board上,接著執行
sudo insmod hello.ko

sudo rmmod hello.ko

輸入dmesg就可以看到driver印出的訊息囉!






Linux中設定root的密碼

當要使用su指令切換成root的時候 ,會請求你輸入root的密碼,但是都沒有設定過root密碼要怎麼處裡呢?

請直接輸入下面的指令:
sudo passwd root

他會要求你設定密碼,設定完成後就可以順利使用su切換root了!

2016年5月13日 星期五

Linux中設定環境變數的方法

當你需要作cross-compiler時,須要先安裝Toolchain在你的工作電腦上(Ubuntu, Fedora, Debiab etc.), 與其說安裝其實就是把Toolchain包解壓縮到某個路徑。接著要作交叉編譯時,需要指定編譯工具的路徑,此時為了不用每次都輸入一整串的路徑來指定編譯工具,就會去設定PATH。例如:我的編譯器arm-linux-gnueabihf-gcc路徑是在 "home/danny/workspace/DB410C/Toolchain/gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf/bin",此時有三個方法來設定環境變數:

1.用export指令
export PATH=$PATH:/home/danny/workspace/DB410C/Toolchain/gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf/bin
輸入之後可以使用export指令來查看環境變數是否有輸入進去。

*此修改重開機後,就必須再作一次

2.修改profile
profile的路徑是在 "/etc/profile"
直接修改profile這個檔案在裡面加入
export PATH=$PATH:/home/danny/workspace/DB410C/Toolchain/gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf/bin

*此修改必須在重開機之後,才會有作用


3.修改.bashrc
.bashrc的路徑是在"/home/danny/.bashrc"
在檔案最後面加入
export PATH=$PATH:/home/danny/workspace/DB410C/Toolchain/gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf/bin

*此修改只需關掉Terminal在開啟後,就都會被設定



***
另外發現也可以直接去修改 /etc/enviroment  這檔案裡面包含原本PATH變數的資料, 要增加請在最後面用:加上你要加入的路徑即可, 例如:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/danny/workspace/DB410C/Toolchain/gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf/bin"









2016年5月11日 星期三

網路概論,OSI七層,以及各層封包的英文名稱

下圖是OSI七層的架構圖,TCP/IP則將七層簡化為五層,另外圖片最右邊則是各層相對應的應用


















其中每一階層都會對封包有個別的名稱,其對應稱謂如下所示
 - 應用層(Application Layer)        Message
 - 傳送層(Transport Layer)           Segment
 - 網路層(Network Layer)             Datagram
 - 鏈結層(Data Link Layer)           Frame

了解以上稱謂,我們就可以清楚的知道是在講哪一層的封包處理




Router實作了OSI底下三層,如下圖










而Switch實作OSI底下兩層,如下圖