2011年2月23日 星期三

開機流程與 Boot Loader
http://www.suse.url.tw/sles10/

1. Boot Loader 概要:BIOS 儲存在 CMOS RAM 中的 BIOS 設定
b. 開機自我測試 (Power On Self Test : POST)
c. BIOS 將依照 CMOS 中所設定的開機順序來依序尋找可開機裝置,如果這個裝置是硬碟的話,那就會先去讀取硬碟的第 0 個磁柱的第 0 個磁頭的第一個磁區 (最前面 512 bytes 的磁區),也就是 MBR (Master Boot Record)
2. MBR
a. MBR 內主要是存放著 Boot Partition Loader (BPL : 分割區引導程式) 及 partition table
b. partition table 是包含著四個分割區的紀錄 (以 hda 來說為 hda1 ~ hda4),比如起始、結束磁柱的資訊及哪個 partition 有設定啟動旗標 (Active) 等
c. MBR 上的小程式 (BPL) 就會根據 partition table 裡有設定 Active 旗標的那個 partition,而載入該 partition 的 boot sector,以完成後續的開機作業
3. Boot Loader
a. Win NT 系列也有它們自己的 Boot Manager 叫 ntldr,不過這個 ntldr 是放在 partition 裡而非 MBR
b. Linux 的 Boot Loader 為一兩階段程式,第一階段可以放在 MBR 或 /boot 分割區的 boot sector 裡
c. MBR 一次只能安置一個 Boot Manager,比如之前您是使用 SPFDISK 來做開機管理,現在在安裝 Linux 時又把 Linux Loader 放在 MBR,那當然 MBR 裡的 Boot Manager 就變成是 Linux Loader 了

假設從硬碟開機,且 Linux Loader 是安裝在 MBR。
  1. 按下主機電源後,BIOS 做硬體偵測,並根據 CMOS 中的紀錄來決定開機裝置。
  2. 接著 BIOS 會載入 MBR 磁區,並將 Linux Loader 載入記憶體,接著主控權就交由 Linux Loader 來接管。
  3. 再來會看到一個開機選單畫面,來讓您選擇要開啟哪套作業系統。
  4. 選擇 Linux OS 並按下 Enter 鍵以後,Linux Loader 就把 Linux kernel 及 initramfs (註一) 載入記憶體,準備來進行一些初始化的工作。
  5. 在成功掛載根目錄檔案系統 (rootfs) 後,於 rootfs 中所執行的第一支程式為 init,其 PID 為 1。
  6. init 會載入 /etc/inittab (initial table) 的內容,並執行檔案內相關的 scripts。
  7. 最後就是執行 login 程式,此時會等待您輸入帳號密碼,如果認證無誤的話,就會開啟一個 shell 來讓您使用囉 !



開機過程的簡易流程圖

2011年2月8日 星期二

How to install mplayer in Fedora Core 12

How to install mplayer in Fedora Core 12


Doc source : http://www.redips.net/linux/yum-install-mplayer-fedora12/

1.add RPM Fusion repository with the rpm command
#rpm -Uvh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm
#rpm -Uvh http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm

2. install program
#yum install mplayer-gui

#yum install xine

#yum install vlc

3. fix small issue
mplayer-gui -> Preferences -> Video -> xv

2011年2月1日 星期二

strace命令用法


http://yuanma.org/data/2007/0201/article_2213.htm

strace命令用法

呼叫:
strace [ -dffhiqrtttTvxx ] [ -acolumn ] [ -eexpr ] ...
[ -ofile ] [ -ppid ] ... [ -sstrsize ] [ -uusername ] [ command [ arg ... ] ]

strace -c [ -eexpr ] ... [ -Ooverhead ] [ -Ssortby ] [ command [ arg ... ] ]
功能:
跟踪程式執行時的系統呼叫和所接收的信號.通常的用法是strace執行一直到commande結束.
並且將所呼叫的系統呼叫的名稱、參數和返回值輸出到標準輸出或者輸出到-o指定的文件.
strace
是一個功能強大的除錯,分析診斷工具.你將發現他是一個極好的幫手在你要除錯一個無法看到原始碼或者原始碼無法在編譯的程序.
你將輕鬆的學習到一個軟體是如何通過系統呼叫來實現他的功能的.而且作為一個程序設計師,你可以了解到在用戶態和核心態是如何通過系統呼叫和信號來實現程序的功能的.
strace
的每一行輸出包括系統呼叫名稱,然後是參數和返回值.這個例子:

strace cat /dev/null
他的輸出會有:
open(\"/dev/null\",O_RDONLY) = 3
有錯誤產生時,一般會返回-1.所以會有錯誤標誌和描述:
open(\"/foor/bar\",)_RDONLY) = -1 ENOENT (no such file or directory)
信號將輸出餵信號標誌和信號的描述.跟踪併中斷這個命令\"sleep 600\":
sigsuspend({}
--- SIGINT (Interrupt) ---
+++ killed by SIGINT +++
參數的輸出有些不一致.shell命令中的\">>tmp\",將輸出:
open(\"tmp\",O_WRONLY|O_APPEND|A_CREAT,0666) = 3
對於結構指針,將進行適當的顯示.:\"ls -l /dev/null\":
lstat(\"/dev/null\",{st_mode=S_IFCHR|0666},st_rdev=makdev[1,3],...}) = 0
請注意\"struct stat\" 的聲明和這裡的輸出.lstat的第一個參數是輸入參數,而第二個參數是向外傳值.

當你嘗試\"ls -l\" 一個不存在的文件時,會有:
lstat(/foot/ball\",0xb004) = -1 ENOENT (no such file or directory)
char*
將作為C的字符串類型輸出.沒有字符串輸出時一般是char* 是一個轉義字符,只輸出字符串的長度.
當字符串過長是會使用\"...\"省略.如在\"ls -l\"會有一個gepwuid呼叫讀取password文件:
read(3,\"root::0:0:System Administrator:/\"...,1024) = 422
當參數是結構數組時,將按照簡單的指針和數組輸出如:
getgroups(4,[0,2,4,5]) = 4
關於bit作為參數的情形,也是使用方括號,並且用空格將每一項參數隔開.:
sigprocmask(SIG_BLOCK,[CHLD TTOU],[]) = 0
這裡第二個參數代表兩個信號SIGCHLD SIGTTOU.如果bit型參數全部置位,則有如下的輸出:
sigprocmask(SIG_UNBLOCK,~[],NULL) = 0
這裡第二個參數全部置位.

參數說明:
-c
統計每一系統呼叫的所執行的時間,次數和出錯的次數等.
-d
輸出strace關於標準錯誤的除錯信息.
-f
跟踪由fork呼叫所產生的子進程.
-ff
如果提供-o filename,則所有進程的跟踪結果輸出到相應的filename.pid,pid是各進程的進程號.
-F
嘗試跟踪vfork呼叫.-f,vfork不被跟踪.
-h
輸出簡要的幫助信息.
-i
輸出系統呼叫的入口指針.
-q
禁止輸出關於脫離的消息.
-r
打印出相對時間關於,,每一個系統呼叫.
-t
在輸出中的每一行前加上時間信息.
-tt
在輸出中的每一行前加上時間信息,微秒級.
-ttt
微秒級輸出,以秒了表示時間.
-T
顯示每一呼叫所耗的時間.
-v
輸出所有的系統呼叫.一些呼叫關於環境變量,狀態,輸入輸出等呼叫由於使用頻繁,默認不輸出.
-V
輸出strace的版本信息.
-x
以十六進制形式輸出非標準字符串
-xx
所有字符串以十六進制形式輸出.
-a column
設置返回值的輸出位置.默認為40.
-e expr
指定一個表達式,用來控制如何跟踪.格式如下:
[qualifier=][!]value1[,value2]...
qualifier
只能是trace,abbrev,verbose,raw,signal,read,write其中之一.value是用來限定的符號或數字.默認的qualifiertrace.感嘆號是否定符號.例如:
-eopen
等價於-e trace=open,表示只跟踪open呼叫.-etrace!=open表示跟踪除了open以外的其他呼叫.有兩個特殊的符號all none.
注意有些shell使用!來執行歷史記錄裡的命令,所以要使用\\.
-e trace=set
只跟踪指定的系統呼叫.例如:-e trace=open,close,rean,write表示只跟踪這四個系統呼叫.默認的為set=all.
-e trace=file
只跟踪有關文件操作的系統呼叫.
-e trace=process
只跟踪有關進程控制的系統呼叫.
-e trace=network
跟踪與網絡有關的所有系統呼叫.
-e strace=signal
跟踪所有與系統信號有關的系統呼叫
-e trace=ipc
跟踪所有與進程通訊有關的系統呼叫
-e abbrev=set
設定strace輸出的系統呼叫的結果集.-v 等與abbrev=none.默認為abbrev=all.
-e raw=set
將指定的系統呼叫的參數以十六進制顯示.
-e signal=set
指定跟踪的系統信號.默認為all.signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信號.
-e read=set
輸出從指定文件中讀出的數據.例如:
-e read=3,5
-e write=set
輸出寫入到指定文件中的數據.
-o filename
strace的輸出寫入文件filename
-p pid
跟踪指定的進程pid.
-s strsize
指定輸出的字符串的最大長度.默認為32.文件名一直全部輸出.
-u username
usernameUIDGID執行被跟踪的命令.