ex: 建立1GB的檔案
dd if=/dev/zero of=1g.img bs=1M count=1000
2017年7月31日 星期一
2017年7月20日 星期四
[工作] command line寫入16進位binary到檔案
$ echo -e "\x10\x11\x12" > test
$ cat test | xxd
$ 0000000: 1011 120a
後面的0x0a為換行符號
$ printf '\xde\xad\xbe\xef' > file
$ cat file | xxd
$ 0000000: dead beef
$ cat test | xxd
$ 0000000: 1011 120a
後面的0x0a為換行符號
$ printf '\xde\xad\xbe\xef' > file
$ cat file | xxd
$ 0000000: dead beef
[工作] 在sysfs下加入GPIO debug
在那根GPIO還沒有被request的狀態下:
echo [GPIO number] > /sys/class/gpio/export
就會產生/sys/class/gpio/gpio[GPIO number]
ex.
echo 4 > /sys/class/gpio/export
cd /sys/class/gpio/gpio4
裡面會有幾個節點可以操作
active_low
device
edge
power
uevent
value
如果那根GPIO已經被driver request,
則上面的方式會無效,
需要從code裡面來作:
呼叫gpiolib裡提供的方式
gpiod_export(GPIO_NUM);
就會產生類似上面的節點.
echo [GPIO number] > /sys/class/gpio/export
就會產生/sys/class/gpio/gpio[GPIO number]
ex.
echo 4 > /sys/class/gpio/export
cd /sys/class/gpio/gpio4
裡面會有幾個節點可以操作
active_low
device
edge
power
uevent
value
如果那根GPIO已經被driver request,
則上面的方式會無效,
需要從code裡面來作:
呼叫gpiolib裡提供的方式
gpiod_export(GPIO_NUM);
就會產生類似上面的節點.
2017年7月5日 星期三
[工作] 在Android上如何能在USB拔除後繼續抓log
一般來說子程序在父程序結束後也會被kill掉,
Android上有個nohup指令能防止子程序被kill,
並把父程序轉給init(pid = 1)
使用範例:
adb shell "nohup cat /proc/kmsg > /sdcard/test"
之後就算你USB拔除, 他還是會繼續抓log
Android上有個nohup指令能防止子程序被kill,
並把父程序轉給init(pid = 1)
使用範例:
adb shell "nohup cat /proc/kmsg > /sdcard/test"
之後就算你USB拔除, 他還是會繼續抓log
2017年7月3日 星期一
[工作] Kernel driver讀寫文件的方式
Header檔:
#include <linux/fs.h>
#include <linux/file.h>
#include <asm/uaccess.h>
程式碼:
char *path = "/abc/test"
struct file *fp = NULL;
mm_segment_t old_fs;
u8 buf[256];
fp = filp_open(path, O_RDONLY, 0);
if (fp == NULL) {
return -1;
}
old_fs = get_fs();
set_fs(KERNEL_DS);
fp->f_op->read(fp, buf, sizeof(buf), &fp->f_pos);
set_fs(old_fs);
filp_close(fp, NULL);
主要重點是紅字的部份
簡單來說是要防止User space破壞到Kernel space的內容
傳遞給->read / ->write的參數因為是kernel的位址
會被認為不合法, user被禁止存取,
所以要先把ds改成kernel, 才不會被誤認成user
大概是個root的概念
不過操作完記得設回來
#include <linux/fs.h>
#include <linux/file.h>
#include <asm/uaccess.h>
程式碼:
char *path = "/abc/test"
struct file *fp = NULL;
mm_segment_t old_fs;
u8 buf[256];
fp = filp_open(path, O_RDONLY, 0);
if (fp == NULL) {
return -1;
}
old_fs = get_fs();
set_fs(KERNEL_DS);
fp->f_op->read(fp, buf, sizeof(buf), &fp->f_pos);
set_fs(old_fs);
filp_close(fp, NULL);
主要重點是紅字的部份
簡單來說是要防止User space破壞到Kernel space的內容
傳遞給->read / ->write的參數因為是kernel的位址
會被認為不合法, user被禁止存取,
所以要先把ds改成kernel, 才不會被誤認成user
大概是個root的概念
不過操作完記得設回來
2017年6月27日 星期二
[工作] Get dir name and file name of a path
在Linux下如何使用command取得一串path的dirname跟filename
其實很簡單, 有兩個command, dirname, basename
ex: pathname = /abc/def/test.c
$ dirname $pathname
$ /abc/def
$ basename $pathname
$ test.c
其實很簡單, 有兩個command, dirname, basename
ex: pathname = /abc/def/test.c
$ dirname $pathname
$ /abc/def
$ basename $pathname
$ test.c
2017年6月24日 星期六
[Game] 鐵血聯盟2 GOG版本在Macbook上執行的方式
之前被介紹文推坑,等到前陣子終於GOG特價,
我租屋處只有MacBook Pro,不過我看他有支援Mac OS就放心入手了。
不過興高采烈的下載下來安裝之後發現無法進入遊戲,
一執行後都是看到藍畫面後閃退,
看一下GOG上最後更新大概是四年前了,
之間Mac OS有些更新後可能無法相容,
四處搜尋之後總算解決,解法如下
1. 下載最新的Wineskin Winery
http://wineskin.urgesoftware.com/tiki-index.php?page=Downloads
下載之後執行,按畫面上的 "+" 新增新的Engine
我是下載最新的版本 (WS9Wine2.6)
載好之後就可以先關掉
2. 更新GOG版鐵血聯盟2的Winery engine
GOG版本的鐵血聯盟2預設就是包著Winery來執行
不過版本比較舊,不相容於現在的Mac OS
開啟Finder -> 左邊喜好項目點選應用程式 -> 找到鐵血聯盟2的目錄 ->
右鍵(或是雙指點擊觸控板) 點選顯示套件內容 -> Contents -> Resources -> Game ->
右鍵點選Jagges Alliance 2 -> 顯示套件內容 -> 執行Wineskin
然後在Advanced -> Tools -> Update wrapper
選擇你下載的最新的wrapper就ok了
我租屋處只有MacBook Pro,不過我看他有支援Mac OS就放心入手了。
不過興高采烈的下載下來安裝之後發現無法進入遊戲,
一執行後都是看到藍畫面後閃退,
看一下GOG上最後更新大概是四年前了,
之間Mac OS有些更新後可能無法相容,
四處搜尋之後總算解決,解法如下
1. 下載最新的Wineskin Winery
http://wineskin.urgesoftware.com/tiki-index.php?page=Downloads
下載之後執行,按畫面上的 "+" 新增新的Engine
我是下載最新的版本 (WS9Wine2.6)
載好之後就可以先關掉
2. 更新GOG版鐵血聯盟2的Winery engine
GOG版本的鐵血聯盟2預設就是包著Winery來執行
不過版本比較舊,不相容於現在的Mac OS
開啟Finder -> 左邊喜好項目點選應用程式 -> 找到鐵血聯盟2的目錄 ->
右鍵(或是雙指點擊觸控板) 點選顯示套件內容 -> Contents -> Resources -> Game ->
右鍵點選Jagges Alliance 2 -> 顯示套件內容 -> 執行Wineskin
然後在Advanced -> Tools -> Update wrapper
選擇你下載的最新的wrapper就ok了
訂閱:
文章 (Atom)