tar -cpvf /home/backup/etc.tar /etc /usr/local/etc
也可以使用:
tar -czpvf /home/backup/etc.tgz /etc
狐狸的窩
2011年8月22日 星期一
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);
}
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
For Linux
功能描述:
改變當前I/O埠的權能級別,可存取所有 65536個I/O埠。但因為使用較高的I/O權限,將
會使中斷禁能,這可能導致系統的crash,不推薦那樣做。一般I/O權限設定為0。
用法:
#include <sys/io.h>
int iopl(int level);
參數:
level:新的I/O訪問級,範圍是[0~3]。(3->最大權限)
返回說明:
成功執行時,返回0。失敗返回-1,errno被設為以下的某個值
EINVAL:參數無效,level大於3
ENOSYS:平臺不支援這個系統調用
EPERM:調用進程沒有許可權使用iopl,要求CAP_SYS_RAWIO權能
成功執行時,返回0。失敗返回-1,errno被設為以下的某個值
EINVAL:參數無效,level大於3
ENOSYS:平臺不支援這個系統調用
EPERM:調用進程沒有許可權使用iopl,要求CAP_SYS_RAWIO權能
Example:
main()
{
iopl(3);
outb(0xcfc);
inb(0xcfc);
iopl(0);
}
2011年7月4日 星期一
Q/A : insmod: error inserting 'hello.ko': -1 Invalid module format
Issue : insmod: error inserting 'hello.ko': -1 Invalid module format
可以使用下面的命令 modinfo module.ko 確定module的info
# 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
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
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
...
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/
這樣整個工作就算完成了
訂閱:
文章 (Atom)