2011年8月22日 星期一

FreeBSD 打包指令

tar -cpvf /home/backup/etc.tar /etc /usr/local/etc
也可以使用:
tar -czpvf /home/backup/etc.tgz /etc

FreeBSD user space下直接存取I/O的方法

因為FreeBSD雖沒有io.h的inb/outb 可用, 但可利用此法存取I/O

static __inline u_int
inl(u_int port)
{
u_int data;
__asm __volatile("inl %%dx,%0" : "=a" (data) : "d" (port));
return (data);
}

static __inline void
outl(u_int port, u_int data)
{
__asm __volatile("outl %0,%%dx" : : "a" (data), "d" (port));


example:
main()
{
  int iofl;
  iofl = open("/dev/io",000);
  inl();
  outl();

  close(iofl);


}






Linux user space下直接存取I/O的方法


iopl使用方式】
For Linux

功能描述:
改變當前I/O埠的權能級別,可存取所有 65536I/O埠。但因為使用較高的I/O權限,將
會使中斷禁能,這可能導致系統的crash,不推薦那樣做。一般I/O權限設定為0

用法:
#include <sys/io.h>
int iopl(int level);

參數:
level:新的I/O訪問級,範圍是[0~3](3->最大權限)
返回說明:
成功執行時,返回0。失敗返回-1errno被設為以下的某個值
EINVAL:參數無效,level大於3
ENOSYS:平臺不支援這個系統調用
EPERM:調用進程沒有許可權使用iopl,要求CAP_SYS_RAWIO權能

Example:
main()
{
  iopl(3);
  outb(0xcfc);
  inb(0xcfc);
 iopl(0);
}

FreeBSD mount USB disk

mount_msdosfs /dev/da0s1 /mnt/usb

2011年7月4日 星期一

fight together

Q/A : insmod: error inserting 'hello.ko': -1 Invalid module format


Issue : insmod: error inserting 'hello.ko': -1 Invalid module format
            
可以使用下面的命令 modinfo module.ko 確定moduleinfo
# modinfo hello-4.ko
license:        GPL
author:         Daniel Chen
descr
īption:    A sample driver
vermagic:       2.6.35.6-45.fc14.i686 SMP mod_unload 686
   
接著# uname –r
確定kernel vermagic.
檢查/usr/src/linux/Makefile,確保下面這些特定的版本資訊與使用的內核完全一致:
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 35
EXTRAVERSION = .6-45.fc14.i686
最後
不必完全編譯一遍內核,只得到需要的檔即可:
# make
CHK     include/linux/version.h
UPD     include/linux/version.h
SYMLINK include/asm -> include/asm-i386
SPLIT   include/linux/autoconf.h -> include/config/*
HOSTCC  scrīpts/basic/fixdep
HOSTCC  scrīpts/basic/split-include
HOSTCC  scrīpts/basic/docproc
HOSTCC  scrīpts/conmakehash
HOSTCC  scrīpts/kallsyms
CC      scrīpts/empty.o
...
     
# insmod XXX.ko 就不會出現該錯誤

how to configure Kconfig and Makefile


假設我們要在kernel source下的drivers目錄下如下用於 test driver 的樹型目錄:
/driver/test/
/driver/test/Kconfig
/driver/test/Makefile
/driver/test/ *.c

除了在新driver的目錄下新增 Kconfig Makefile 檔外,新增目錄的父目錄中的 Kconfig Makefile 檔也需要修改,以使新增的 Kconfig Makefile 檔能被引用.
Kconfig 範例:

menu "Test Driver "                                           // menu上顯示的名稱
comment "Test Driver"                                     // 進入menu後的注解
config TEST                                                      // fun1
bool "TEST suport"                                          // fun1 只有yes 跟no可選
config TEST_USER                                        // fun2
tristate "TEST user-space interface"             // fun2 有yes, no , module三種可選 
depends on TEST                                           // fun2 相依於fun1
endmenu

為了使這個 Kconfig 檔能起作用,需要修改 drivers/Kconfig ,增加以下內容:
source "drivers/test/Kconfig"


在新增的 test 目錄下,另外包含 Makefile :
#drivers/test/Makefile
#
#Makefile for the TEST
#
obj-$(CONFIG_TEST) += test.o
obj-$(CONFIG_TEST_USER) += test_ioctl.o
obj-$(CONFIG_PROC_FS) += test_proc.o
obj-$(CONFIG_TEST_CPU) += cpu/
 
由於 test 目錄中包含一個子目錄 cpu ,CONFIG_TEST_CPU=y ,需要將 cpu 目錄加入列表.
test 目錄中的 cpu 目錄也需包含如下的 Makefile :
# drivers/test/cpu/Makefile
#
# Makefile for the TEST cpu
#
obj-$(CONFIG_TEST_CPU) += cpu.o
為了使得整個 test 目錄能夠被編譯命令作用到, test 目錄父目錄中的 Makefile 檔也需新增如下腳本:
obj-$(CONFIG_TEST) += test/

這樣整個工作就算完成了