Showing posts with label Linux. Show all posts
Showing posts with label Linux. Show all posts

Thursday, August 28, 2008

第一個 cross compile 成功的 kernel module - hello

第一個 kernel module - hello

The Linux Kernel Module Programming Guide 文上所說的,編寫第一個kernel module

  • hello.c
    #include  /* Needed by all modules */
    #include /* Needed for KERN_INFO */
    #include /* Needed for the macros */
    #define DRIVER_AUTHOR "Peter Jay Salzman "
    #define DRIVER_DESC "A sample driver"

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

    static void __exit cleanup_hello(void)
    {
    printk(KERN_INFO "Goodbye, world\n");
    }

    module_init(init_hello);
    module_exit(cleanup_hello);

    MODULE_LICENSE("GPL");
    MODULE_AUTHOR(DRIVER_AUTHOR); /* Who wrote this module? */
    MODULE_DESCRIPTION(DRIVER_DESC); /* What does this module do */
    MODULE_SUPPORTED_DEVICE("testdevice");

  • Makefile
    obj-m += hello.o
    all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
    clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

確定是可以在 X86 host 上成功編譯,運作也一切正常。
但問題來了,我該如何改寫 Makefile,使其能 cross compile 呢?
目前還不知道該如何解決,因為對 Makefile 及 cross compile 步驟還在粗淺的認識階段,以前也都是利用套件所提供的 configure 工具來代勞。
所以就想到將新增的 module 加到 kernel source 中,這樣就可以利用 kernel source 所提供 cross compile 的功能來幫我做相關設定了。


利用 kernel source 來 cross compile 新增的 module

  • 環境設定
    • Target Board 是 arm,所以在Makefile 裡: ARCH=arm, CROSS_COMPILE=arm-none-linux-gnueabi-
    • 新增一個 module,在 driver 目錄下新增一個測試目錄 rayn,測試 module 位於 driver/ryan/hello.c。
  • 編輯 configure 的選項
    • 修改 arch/arm/Kconfig (因為我們的target 為 arm,所以必需改在 arch/arm 裡的 Kconfig 才有用)
      • 加入這一行 source "drivers/ryan/Kconfig",將新增的測試目錄加到 configure 選項中
    • 修改 drivers/{Kconfig,Makefile}
      • Kconfig
        • 新增 source "drivers/ryan/Kconfig"
      • Makefile
        • 新增 obj-$(CONFIG_RYAN_TEST) += ryan/
    • 新增目錄,driver/ryan 及所需的檔案
      • Kconfig

        menu "RYAN test devices"

        config RYAN_TEST
        bool "RYAN test"

        config RYAN_TEST_HELLO
        tristate "The first kernel module - hello"
        depends on RYAN_TEST

        endmenu

      • Makefile
        obj-$(CONFIG_RYAN_TEST_HELLO)           += hello.o
      • hello.c
  • make menuconfig,將 hello 編為 module。可以看見新增的選項
    [*] RYAN test            
    The first kernel module - hello
  • make modules。可以看見 hello.ko 已生成。
    Building modules, stage 2.
    MODPOST 4 modules
    CC drivers/ryan/hello.mod.o
    LD [M] drivers/ryan/hello.ko
    CC fs/jffs2/jffs2.mod.o
    LD [M] fs/jffs2/jffs2.ko

  • 在 target 上測試

    bash-3.2# insmod ./hello.ko
    <6>Hello, world
    Hello, world
    bash-3.2# rm
    rm rmdir rmmod
    bash-3.2# rmmod hello
    <6>Goodbye, world
    Goodbye, world

完畢…

Wednesday, August 27, 2008

vi 命令速查

用 vi 時常忘記一些偶爾用到的指令,列出以下二個網址可以快速參考

vi 命令速查

使用 vi

Friday, August 22, 2008

LFS (Linux From Scratch) 初體驗

LFS (Linux From Scratch) 初體驗

  • Version: Linux From Scratch 6.3 Ref
  • 嚐試 LFS 是因為想要了解如何從頭建置一個基本的 Linux 系統,用最精簡的系統來幫助自己對 linux 初始流程的了解。在整個過程中,自己的閱讀方式是不求甚解,就像看本小說似的將它做一次,了解大致上的流程而已。雖然如此,我覺得在對於整個系統的初始流 程的了解(最基本的必要存在)還是很有幫助的。
  • 我嚐試了到了第三次才成功,我猜前二次的失敗應該是因為某次的指令不完整 or something 才會導致到 build packages 就失敗了,所以第三次時我用 LFS 提供的 LiveCD,並在每次都用 cpoy 的方式來執行指令,以降低失誤的機會 (startx 啟動 X-window)。
  • 大部份的時間都花在 build package 上(ch5/ch6),尤其是 GCC/Glibc 上,這部份可以了解幾個重要套件之間的關係、順序、其包含了那些工作。之前失敗在此時,真的不知該如何找出那個環節出錯,所以只好重做了 -_-。
  • 其實在這二個章節裡面,內容不多但很基本,主要在述敘開機的過程,會參考那些設定檔,device 是如何產生並掛載的等等…,對之後需要更進一步了解時應該還蠻俱參考價值的。
    • ch7. Setting Up System Bootscripts
    • ch8. Making the LFS System Bootable

Wednesday, August 20, 2008

Linux 2.6 的 initramfs 機制

Linux 2.6 的 initramfs 機制

References


之前在做 qemu 做測試,在製作 ramdisk 時,就不是很了解為何有時是用

  1. 以 dd 制作一固定大小的 size, formate 為 ext2 格式
  2. 以 cpio 制作,再以 gzip 壓縮

透過這幾篇文章,可以了解何其間的差異, initrd v.s. initramfs

  1. 其使用的技術不同,歷史的演進
  2. 在開機過程中所佔的角色
  3. 如何製作 initramfs 及測試

Wednesday, August 13, 2008

Terminal 無法正確顯示文字

在 terminal,有時會無法正確的顯示字元 (但在X-windowns裡的terminal卻顯示正常),



而我通常是用 ssh 連進 server 工作的
所以對我而言,最簡單的調整及是確認語系是否設定正確
echo $LANG
export LANG=en_US
來調整 terminal 的語系設定,即可正常 work