顯示具有 Linux 標籤的文章。 顯示所有文章
顯示具有 Linux 標籤的文章。 顯示所有文章

2017年6月28日 星期三

Chapter 1: Hello world kernel module

簡單記錄一下第一支kernel module


#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
#include <linux/init.h>   /* Needed for the marcos */

MODULE_LICENSE("GPL");

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

static void __exit hello_exit(void)
{
    printk(KERN_INFO "Goodbye~~~\n");
}

module_init(hello_init);
module_exit(hello_exit);



 Makefile

obj-m += hello.o

KERNEL=/lib/modules/`uname -r`/build

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

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

module_init()以及module_exit()是kernel module初始化的起點,所以是kernel module不可或缺的要素。module_init()以及module_exit()裡面代的參數分別是起始與結束的函數。從例子可以看到起始函數是hello_init()而結束函數是hello_exit()。
因此當用insmod去載入編譯好的ko檔時,透過dmesg可以看到字串"Hello world",而用rmmod時可以看到字串"Goodbye~~~"。

當要在kernel裡面秀出message時要透過printk()來達成,printk的用法跟printf很像,只是printk要加入message的level(Ex: KERN_INFO, KERN_DEBUG)。

To be continued....

2017年5月30日 星期二

Linux kernel 學習心得


    大約半年前從Non-OS的世界跨到embedded linux世界,
這巨大轉變可以對我來說可以說是非常艱辛阿,
雖然以前在學校有學過linux系統,但早就忘光光啦!

    學Linux kernel一開始翻網路上的資料以及身邊朋友的推薦就先看了傳說中的Linux聖經書"Linux Device Drive, 3e" (作者是 Jonathan Corbet, Alessandro Rubini, and Greg Kroah-Hartman)。在看LDD之前我對linux kernel的認識可以說是零,也就是完全不認識!在這情況下去看LDD可以說是非常痛苦... 雖然書中有提供例子參考,但是我連第一個例子都不知道要怎麼下make去build出kernel的ko檔,硬是死讀了幾章之後發現這樣下去不行,書中的介紹很多(字超級多!! 作者怎麼這麼會啦賽...),但是我一點都看不懂在說什麼,於是找另一本書來看。

    第2本書"Linux Device Driver Programming驅動程式設計" (作者是平田豐) 。這一本才真正開啟我對Linux kernel的大門,為什麼哩?因為書中有明確的例子可以參考!!!Oh my god! 有範例才是王道阿!!而且還是可以執行的範例,不是那種辛苦打了範例程式碼之後,結果make一直過不了,e04! 有了實際例子可以編譯並執行,我才真正可以體會每一段程式碼在幹什麼且會達到怎樣的效果。所以這本非常適合沒有任何底子的初學者來看,非常快就上手! 當初要是早點看這本書的話,工作上就不會被電得不要不要的... (但這又牽扯到新人訓練跟公司環境問題,唉~ 無奈啊~,有實力的人不一定懂得如何教人...)。

    還好只是想了解linux kernel的基礎知識,修改kernel code的機會不大,至少對於kernel code的寫法以及架構有比較清楚的認識了。接下來還有user space的東東要學,感覺這也是一個蠻龐大的東西啊...

2016年9月28日 星期三

vim error E212: Can't open file for writing

以前在Linux環境下用root習慣了,要做任何事情都沒有問題,
現在用一般帳號登入就開始遇到一些之前沒遇到過的問題。
這次在用vim要存檔案時出現錯誤訊息 E212: Can't open file for writing
由辜狗大神發現如果是在vim要存檔時出現E212錯誤訊息是要透過以下的指令存檔
:w !sudo tee %
然後選L,就可以存檔了~~~

最保險的方式就是每次要用vim時在下命令時都要用sudo,如下
sudo vim FILE_NAME


2016年7月21日 星期四

Linux掛載及卸載USB隨身碟

簡單記錄一下如何掛載USB隨身碟


1.先執行fdisk,檢查USB隨身碟是被系統辨識成那個裝置
fdisk -l

sda 基本上都是硬碟,我們可以藉由容量來確認隨身碟的編號
假設為sdb
2.建立USB隨身碟的掛載點:
mkdir /mnt/usb

3.掛載USB隨身碟
mount -v -t auto /dev/sdb /mnt/usb_storage

-v 顯示資訊
-t auto 讓系統自動分辯檔案系統

4.到 /mnt/usb_storage 可看到usb的內容


卸載USB隨身碟
umount /mnt/usb_storage

Ubuntu unknown filesystem type 'exfat'


在mount USB隨身碟時出現"mount: unknown filesystem type 'exfat'"這個錯誤訊息,

解法如下


Ubuntu版本是14.04之後的執行以下的指令去安裝套件

sudo apt-get install exfat-fuse exfat-utils

Linux 檔案顏色意義

這裡簡單紀錄一下 Linux各個檔案顏色所代表的意思

白色:一般檔案
藍色:目錄
綠色:可執行的一般檔案
黃色:設備檔,一般而言在 /dev
淺藍色:連結檔
綠底黑字:public可讀寫的目錄,例如 /tmp
粉紅色:一個socket
金色:一個行程process

2013年11月29日 星期五

Ubuntu 啟動帳號 root


作業系統:Ubuntu 13.04

假設現在登入的帳號是oscar

Step 1: 設定root密碼
# sudo  passwd root
輸入 oscar  的密碼
輸入 root 的新密碼
再一次輸入新密碼

這樣就可以用root登入,可以用以下的指令試看看 root 有沒有設定成功
# su root

Step 2: 在開機時的登入畫面可以用root登入

編輯檔案
# vim /etc/lightdm/lightdm.conf

將下列的指令加入到 lightdm.conf 裡
greeter-show-manual-login=true

然後重新開機就可以在登入畫面用root直接登入。