uClinux内核移植相關代碼分析
本文通過整理之前研發的一個項目(ARM7TDMI + uCLinux),分析内核啓動過程及需要修改的文件,以供内核移植者參考。整理過程中也同時參考了衆多網友的帖子,在此謝過。由于整理過程匆忙,難免錯誤及講解的不够清楚之處,請各位網友指正,這裏提前謝過。本文分以下部分進行介紹:
Bootloader及内核解壓
内核啓動方式介紹
内核啓動地址的確定
arch/armnommu/kernel/head-armv.S分析
start_kernel()函數分析
1. Bootloader及内核解壓
Bootloader將内核加載到内存中,設定一些寄存器,然後將控制權交由内核,該過程中,關閉MMU功能。通常,内核都是以壓縮的方式存放,如zImage,這裏有兩種解壓方法:
使用内核自解壓程序。
arch/arm/boot/compressed/head.S或arch/arm/boot/compressed/head-xxxxx.S
arch/arm/boot/compressed/misc.c
在Bootloader中增加解壓功能。
使用該方法時内核不需要帶有自解壓功能,而使用Bootloader中的解壓程序代替内核自解壓程序。其工作過程與内核自解壓過程相似:Bootloader把壓縮方式的内核解壓到内存中,然後跳轉到内核入口處開始執行。
2. 幾種内核啓動方式介紹
XIP (EXECUTE IN PLACE) 是指直接從存放代碼的位置上啓動運行。
2.1 非壓縮,非XIP
非XIP方式是指在運行之前需對代碼進行重定位。該類型的内核以非壓縮方式存放在Flash中,啓動時由Bootloader加載到内存後運行。
2.2 非壓縮,XIP
該類型的内核以非壓縮格式存放在ROM/Flash中,不需要加載到内存就能運行,Bootloader直接跳轉到其存放地址執行。Data段復制和BSS 段清零的工作由内核自己完成。這種啓動方式常用于内存空間有限的系統中,另外,程序在ROM/Flash中運行的速度相對較慢。
2.3 RAM自解壓
壓縮格式的内核由開頭一段自解壓代碼和壓縮内核數據組成,由于以壓縮格式存放,内核只能以非XIP方式運行。RAM自解壓過程如下:壓縮内核存放于 ROM/Flash中,Bootloader啓動後加載到内存中的臨時空間,然後跳轉到壓縮内核入口地址執行自解壓代碼,内核被解壓到最終的目的地址然後運行。壓縮内核所占據的臨時空間隨後被Linux回收利用。這種方式的内核在嵌入式産品中較為常見。
2.4 ROM自解壓
解壓縮代碼也能够以XIP的方式在ROM/Flash中運行。ROM自解壓過程如下:壓縮内核存放在ROM/Flash中,不需要加載到内存就能運行, Bootloader直接跳轉到其存放地址執行其自解壓代碼,將壓縮内核解壓到最終的目的地址并運行。ROM自解壓方式存放的内核解壓縮速度慢,而且也不能節省内存空間。
3. 内核啓動地址的確定
内核自解壓方式
Head.S/head-XXX.S獲得内核解壓後首地址ZREALADDR,然後解壓内核,并把解壓後的内核放在ZREALADDR的位置上,最後跳轉到ZREALADDR地址上,開始真正的内核啓動。
arch/armnommu/boot/Makefile,定義ZRELADDR和 ZTEXTADDR。ZTEXTADDR是自解壓代碼的起始地址,如果從内存啓動内核,設置為0即可,如果從Rom/Flash啓動,則設置 ZTEXTADDR為相應的值。ZRELADDR是内核解壓縮後的執行地址。
arch/armnommu/boot/compressed/vmlinux.ld,引用LOAD_ADDR和TEXT_START。
arch/armnommu/boot/compressed/Makefile, 通過如下一行:
SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/LOAD_ADDR/$(ZRELADDR)/;
使得TEXT_START = ZTEXTADDR,LOAD_ADDR = ZRELADDR。
説明:
執行完decompress_kernel函數後,代碼跳回head.S/head-XXX.S中,檢查解壓縮之後的kernel起始地址是否緊挨着 kernel image。如果是,beq call_kernel,執行解壓後的kernel。如果解壓縮之後的kernel起始地址不是緊挨着kernel image,則執行relocate,將其拷貝到緊接着kernel image的地方,然後跳轉,執行解壓後的kernel。
Bootloader解壓方式
Bootloader把解壓後的内核放在内存的TEXTADDR位置上,然後跳轉到TEXTADDR位置上,開始内核啓動。
arch/armnommu/Makefile,一般設置TEXTADDR為PAGE_OFF+0x8000,如定義為0x00008000, 0xC0008000等。
arch/armnommu/vmlinux.lds,引用TEXTADDR
4. arch/armnommu/kernel/head-armv.S
該文件是内核最先執行的一個文件,包括内核入口ENTRY(stext)到start_kernel間的初始化代碼,主要作用是檢查CPU ID,Architecture Type,初始化BSS等操作,并跳到start_kernel函數。在執行前,處理器應滿足以下狀態:
r0 - should be 0
r1 - unique architecture number
MMU - off
I-cache - on or off
D-cache – off
/* 部分源代碼分析 */
/* 内核入口點 */
ENTRY(stext)
/* 程序狀態,禁止FIQ、IRQ,設定SVC模式 */
mov r0, #F_BIT | I_BIT | MODE_SVC@ make sure svc mode
/* 置當前程序狀態寄存器 */
msr cpsr_c, r0 @ and all irqs disabled
/* 判斷CPU類型,查找運行的CPU ID值與Linux編譯支持的ID值是否支持 */
bl __lookup_processor_type
/* 跳到__error */
teq r10, #0 @ invalid processor?
moveq r0, #p @ yes, error p
beq __error
/* 判斷體系類型,查看R1寄存器的Architecture Type值是否支持 */
bl __lookup_architecture_type
/* 不支持,跳到出錯 */
teq r7, #0 @ invalid architecture?
moveq r0, #a @ yes, error a
beq __error
/* 創建核心頁表 */
bl __create_page_tables
adr lr, __ret @ return address
add pc, r10, #12 @ initialise processor
/* 跳轉到start_kernel函數 */
b start_kernel
__lookup_processor_type 這個函數根據芯片的ID從proc.info獲取proc_info_list結構,proc_info_list結構定義在include/asm- armnommu/proginfo.h中,該結構的數據定義在arch/armnommu/mm/proc-arm*.S文件中,ARM7TDMI系列芯片的proc_info_list數據定義在arch/armnommu/mm/proc-arm6,7.S文件中。函數 __lookup_architecture_type從arch.info獲取machine_desc結構,machine_desc結構定義在 include/asm-armnommu/mach/arch.h中,針對不同arch的數據定義在arch/armnommu/mach- */arch.c文件中。
在這裏如果知道processor_type和architecture_type,可以直接對相應寄存器進行賦值。
5. start_kernel()函數分析
下面對start_kernel()函數及其相關函數進行分析。
5.1 lock_kernel()
/* Getting the big kernel lock.
* This cannot happen asynchronously,
* so we only need to worry about other
* CPUs.
*/
extern __inline__ void lock_kernel(void)
{
if (!++current->lock_depth)
spin_lock(&kernel_flag);
}
kernel_flag 是一個内核大自旋鎖,所有進程都通過這個大鎖來實現向内核態的遷移。只有獲得這個大自旋鎖的處理器可以進入内核,如中斷處理程序等。在任何一對 lock_kernel/unlock_kernel函數裏至多可以有一個程序占用CPU。進程的lock_depth成員初始化為-1,在kerenl/fork.c文件中設置。在它小于0時(恒為 -1),進程不擁有内核鎖;當大于或等于0時,進程得到内核鎖。
5.2 setup_arch()
setup_arch()函數做體系相關的初始化工作,函數的定義在arch/armnommu/kernel/setup.c文件中,主要涉及下列主要函數及代碼。
5.2.1 setup_processor()
該函數主要通過
for (list = &__proc_info_begin; list < &__proc_info_end ; list++)
if ((processor_id & list->cpu_mask) == list->cpu_val)
break;
這様一個循環來在.proc.info段中尋找匹配的processor_id,processor_id在head_armv.S文件
中設置。
5.2.2 setup_architecture(machine_arch_type)
該函數獲得體系結構的信息,返回mach-xxx/arch.c 文件中定義的machine結構體的指針,包含以下内容:
MACHINE_START (xxx, “xxx”)
MAINTAINER ("xxx")
BOOT_MEM (xxx, xxx, xxx)
FIXUP (xxx)
MAPIO (xxx)
INITIRQ (xxx)
MACHINE_END
5.2.3内存設置代碼
if (meminfo.nr_banks == 0)
{
meminfo.nr_banks = 1;
meminfo.bank[0].start = PHYS_OFFSET;
meminfo.bank[0].size = MEM_SIZE;
}
meminfo 結構表明内存情况,是對物理内存結構meminfo的默認初始化。 nr_banks指定内存塊的數量,bank指定每塊内存的範圍,PHYS _OFFSET指定某塊内存塊的開始地址,MEM_SIZE指定某塊内存塊長度。PHYS _OFFSET和MEM_SIZE都定義在include/asm-armnommu/arch-XXX/memory.h文件中,其中PHYS _OFFSET是内存的開始地址,MEM_SIZE就是内存的結束地址。這個結構在接下來内存的初始化代碼中起重要作用。
5.2.4 内核内存空間管理
init_mm.start_code = (unsigned long) &_text; 内核代碼段開始
init_mm.end_code = (unsigned long) &_etext; 内核代碼段結束
init_mm.end_data = (unsigned long) &_edata; 内核數據段開始
init_mm.brk = (unsigned long) &_end; 内核數據段結束
每一個任務都有一個mm_struct結構管理其内存空間,init_mm 是内核的mm_struct。其中設置成員變量* mmap指向自己, 意味着内核只有一個内存管理結構,設置 pgd=swapper_pg_dir,
swapper_pg_dir是内核的頁目録,ARM體系結構的内核頁目録大小定義為16k。init_mm定義了整個内核的内存空間,内核綫程屬于内核代碼,同様使用内核空間,其訪問内存空間的權限與内核一様。
5.2.5 内存結構初始化
bootmem_init (&meminfo)函數根據meminfo進行内存結構初始化。bootmem_init(&meminfo)函數中調用 reserve_node_zero(bootmap_pfn, bootmap_pages) 函數,這個函數的作用是保留一部分内存使之不能被動態分配。這些内存塊包括:
reserve_bootmem_node(pgdat, __pa(&_stext), &_end - &_stext); /*内核所占用地址空間*/
reserve_bootmem_node(pgdat, bootmap_pfn << PAGE_SHIFT, bootmap_pages << PAGE_SHIFT)
/*bootmem結構所占用地址空間*/
5.2.6 paging_init(&meminfo, mdesc)
創建内核頁表,映射所有物理内存和IO空間,對于不同的處理器,該函數差彆比較大。下面簡單描述一下ARM體系結構的存儲系統及MMU相關的概念。
在ARM 存儲系統中,使用内存管理單元(MMU)實現虚擬地址到實際物理地址的映射。利用MMU,可把SDRAM的地址完全映射到0x0起始的一片連續地址空間,而把原來占據這片空間的FLASH或者ROM映射到其他不相衝突的存儲空間位置。例如,FLASH的地址從0x0000 0000~0x00FFFFFF,而SDRAM的地址範圍是0x3000 0000~0x3lFFFFFF,則可把SDRAM地址映射為0x0000 0000~0xlFFFFFF,而FLASH的地址可以映射到0x9000 0000~0x90FFFFFF(此處地址空間為空閑,未被占用)。映射完成後,如果處理器發生异常,假設依然為IRQ中斷,PC指針指向0xl8處的地址,而這個時候PC實際上是從位于物理地址的0x3000 0018處讀取指令。通過MMU的映射,則可實現程序完全運行在SDRAM之中。在實際的應用中.可能會把兩片不連續的物理地址空間分配給SDRAM。而在操作系統中,習慣于把SDRAM的空間連續起來,方便内存管理,且應用程序申請大塊的内存時,操作系統内核也可方便地分配。通過MMU可實現不連續的物理地址空間映射為連續的虚擬地址空間。操作系統内核或者一些比較關鍵的代碼,一般是不希望被用户應用程序訪問。通過MMU可以控制地址空間的訪問權限,從而保護這些代碼不被破壞。
MMU的實現過程,實際上就是一個查表映射的過程。建立頁表是實現MMU功能不可缺少的一步。頁表位于系統的内存中,頁表的每一項對應于一個虚擬地址到物理地址的映射。每一項的長度即是一個字的長度(在ARM中,一個字的長度被定義為4Bytes)。頁表項除完成虚擬地址到物理地址的映射功能之外,還定義了訪問權限和緩衝特性等。
MMU的映射分為兩種,一級頁表的變换和二級頁表變换。兩者的不同之處就是實現的變换地址空間大小不同。一級頁表變换支持1 M大小的存儲空間的映射,而二級可以支持64 kB,4 kB和1 kB大小地址空間的映射。
動態表(頁表)的大小=表項數*每個表項所需的位數,即為整個内存空間建立索引表時,需要多大空間存放索引表本身。
表項數=虚擬地址空間/每頁大小
每個表項所需的位數=Log(實際頁表數)+適當控制位數
實際頁表數 =物理地址空間/每頁大小
下面分析paging_init()函數的代碼。
在paging_init中分配起始頁(即第0頁)地址:
zero_page = 0xCXXXXXXX
memtable_init(mi); 如果當前微處理器帶有MMU,則為系統内存創建頁表;如果當前微處理器不支持MMU,比如ARM7TDMI上移植uCLinux操作系統時,則不需要此類步驟。可以通過如下一個宏定義實現靈活控制,對于帶有MMU的微處理器而言,memtable_init(mi)是paging_init()中最重要的函數。
#ifndef CONFIG_UCLINUX
/* initialise the page tables. */
memtable_init(mi);
……(此處省略若乾代碼)
free_area_init_node(node, pgdat, 0, zone_size,
bdata->node_boot_start, zhole_size);
}
#else /* 針對不帶MMU微處理器 */
{
/*****************************************************/
定義物理内存區域管理
/*****************************************************/
unsigned long zone_size[MAX_NR_ZONES] = {0,0,0};
zone_size[ZONE_DMA] = 0;
zone_size[ZONE_NORMAL] = (END_MEM - PAGE_OFFSET) >> PAGE_SHIFT;
free_area_init_node(0, NULL, NULL, zone_size, PAGE_OFFSET, NULL);
}
#endif
uCLinux與其它嵌入式Linux最大的區彆就是MMU管理這一塊,從上面代碼就明顯可以看到這點區彆。下面繼續討論針對帶MMU的微處理器的内存管理。
void __init memtable_init(struct meminfo *mi)
{
struct map_desc *init_maps, *p, *q;
unsigned long address = 0;
int i;
init_maps = p = alloc_bootmem_low_pages(PAGE_SIZE);
/*******************************************************/
其中map_desc定義為:
struct map_desc {
unsigned long virtual;
unsigned long physical;
unsigned long length;
int domain:4, // 頁表的domain
prot_read:1, // 讀保護標志
prot_write:1, // 寫保護標志
cacheable:1, // 是否使用cache
bufferable:1, // 是否使用write buffer
last:1; //空
};init_maps /* map_desc是區段及其屬性的定義 */
下面代碼對meminfo的區段進行遍歷,在嵌入式系統中列舉所有可映射的内存,例如32M SDRAM, 4M FLASH等,用meminfo記録這些内存區段。同時填寫init_maps 中的各項内容。meminfo結構如下:
struct meminfo {
int nr_banks;
unsigned long end;
struct {
unsigned long start;
unsigned long size;
int node;
} bank[NR_BANKS];
};
/********************************************************/
for (i = 0; i < mi->nr_banks; i++)
{
if (mi->bank.size == 0)
continue;
p->physical = mi->bank.start;
p->virtual = __phys_to_virt(p->physical);
p->length = mi->bank.size;
p->domain = DOMAIN_KERNEL;
p->prot_read = 0;
p->prot_write = 1;
p->cacheable = 1; //使用Cache
p->bufferable = 1; //使用write buffer
p ++; //下一個區段
}
/* 如果系統存在FLASH,執行以下代碼 */
#ifdef FLUSH_BASE
p->physical = FLUSH_BASE_PHYS;
p->virtual = FLUSH_BASE;
p->length = PGDIR_SIZE;
p->domain = DOMAIN_KERNEL;
p->prot_read = 1;
p->prot_write = 0;
p->cacheable = 1;
p->bufferable = 1;
p ++;
#endif
/***********************************************************/
接下來的代碼是逐個區段建立頁表
/***********************************************************/
q = init_maps;
do {
if (address < q->virtual || q == p) {
/*******************************************************************************/
由于内核空間是從某個地址開始,如0xC0000000,所以0xC000 0000 以前的頁表項全部清空
clear_mapping在mm-armv.c中定義,其中clear_mapping()是個宏,根據處理器的不同,可以被展開為如下代碼
cpu_XXX_set_pmd(((pmd_t *)(((&init_mm )->pgd+ (( virt) >> 20 )))),((pmd_t){( 0 )}));
其中init_mm為内核的mm_struct,pgd指向 swapper_pg_dir,在arch/arm/kernel/init_task.c中定義。cpu_XXX_set_pmd定義在 proc_armXXX.S文件中,參見ENTRY(cpu_XXX_set_pmd) 處代碼。
/*********************************************************************************/
clear_mapping(address);
/* 每個表項增加1M */
address += PGDIR_SIZE;
} else {
/* 構建内存頁表 */
create_mapping(q);
address = q->virtual + q->length;
address = (address + PGDIR_SIZE - 1) & PGDIR_MASK;
q ++;
}
} while (address != 0);
/ * create_mapping函數也在mm-armv.c中定義 */
static void __init create_mapping(struct map_desc *md)
{
unsigned long virt, length;
int prot_sect, prot_pte;
long off;
/*******************************************************************************/
大部分應用中均采用1級section模式的地址映射,一個section的大小為1M,也就是説從邏輯地址到物理地址的轉變是這様的一個過程:
一個32位的地址,高12位决定了該地址在頁表中的index,這個index的内容决定了該邏輯section對應的物理section;低20位决定了該地址在section中的偏移(index)。例如:從0x0~0xFFFFFFFF的地址空間總共可以分成0x1000(4K)個 section(每個section大小為1M),頁表中每項的大小為32個bit,因此頁表的大小為0x4000(16K)。
每個頁表項的内容如下:
bit: 31 20 19 12 11 10 9 8 5 4 3 2 1 0
content: Section對應的物理地址 NULL AP 0 Domain 1 C B 1 0
最低兩位(10)是section分頁的標識。
AP:Access Permission,區分只讀、讀寫、SVC&其它模式。
Domain:每個section都屬于某個Domain,每個Domain的屬性由寄存器控制。一般都只要包含兩個Domain,一個可訪問地址空間; 另一個不可訪問地址空間。
C、B:這兩位决定了該section的cache&write buffer屬性,這與該段的用途(RO or RW)有密切關系。不同的用途要做不同的設置。
C B 具體含義
0 0 無cache,無寫緩衝,任何對memory的讀寫都反映到總綫上。對 memory 的操作過程中CPU需要等待。
0 1 無cache,有寫緩衝,讀操作直接反映到總綫上。寫操作CPU將數據寫入到寫緩衝後繼續運行,由寫緩衝進行寫回操作。
1 0 有cache,寫通模式,讀操作首先考慮cache hit;寫操作時直接將數據寫入寫緩衝,如果同時出現cache hit,那麽也更新cache。
1 1 有cache,寫回模式,讀操作首先考慮cache hit;寫操作也首先考慮cache hit。
由于ARM中section表項的權限位和page表項的位置不同, 以下代碼根據struct map_desc 中的保護標志,分彆計算頁表項中的AP, Domain和CB標志位。
/*******************************************************************************/
prot_pte = L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY |
(md->prot_read ? L_PTE_USER : 0) |
(md->prot_write ? L_PTE_WRITE : 0) |
(md->cacheable ? L_PTE_CACHEABLE : 0) |
(md->bufferable ? L_PTE_BUFFERABLE : 0);
prot_sect = PMD_TYPE_SECT | PMD_DOMAIN(md->domain) |
(md->prot_read ? PMD_SECT_AP_READ : 0) |
(md->prot_write ? PMD_SECT_AP_WRITE : 0) |
(md->cacheable ? PMD_SECT_CACHEABLE : 0) |
(md->bufferable ? PMD_SECT_BUFFERABLE : 0);
/********************************************************************/
設置虚擬地址,偏移地址和内存length
/********************************************************************/
virt = md->virtual;
off = md->physical - virt;
length = md->length;
/********************************************************************/
建立虚擬地址到物理地址的映射
/********************************************************************/
while ((virt & 0xfffff || (virt + off) & 0xfffff) && length >= PAGE_SIZE) {
alloc_init_page(virt, virt + off, md->domain, prot_pte);
virt += PAGE_SIZE;
length -= PAGE_SIZE;
}
while (length >= PGDIR_SIZE) {
alloc_init_section(virt, virt + off, prot_sect);
virt += PGDIR_SIZE;
length -= PGDIR_SIZE;
}
while (length >= PAGE_SIZE) {
alloc_init_page(virt, virt + off, md->domain, prot_pte);
virt += PAGE_SIZE;
length -= PAGE_SIZE;
}
/*************************************************************************/
create_mapping的作用是設置虚地址virt 到物理地址virt + off_set的映射頁目録和頁表。
/*************************************************************************/
/* 映射中斷向量表區域 */
init_maps->physical = virt_to_phys(init_maps);
init_maps->virtual = vectors_base();
init_maps->length = PAGE_SIZE;
init_maps->domain = DOMAIN_USER;
init_maps->prot_read = 0;
init_maps->prot_write = 0;
init_maps->cacheable = 1;
init_maps->bufferable = 0;
create_mapping(init_maps);
中斷向量表的虚地址init_maps,是用alloc_bootmem_low_pages分配的,通常是在PAGE_OFF+0x8000前面的某一頁, vectors_base()是個宏,ARM規定中斷向量表的地址只能是0或0xFFFF0000,所以上述代碼映射一頁到0或0xFFFF0000,中斷處理程序中的部分代碼也被拷貝到這一頁中。
5.3 parse_options()
分析由内核引導程序發送給内核的啓動選項,在初始化過程中按照某些選項運行,并將剩餘部分傳送給init進程。這些選項可能已經存儲在配置文件中,也可能是由用户在系統啓動時敲入的。但内核并不關心這些,這些細節都是内核引導程序關注的内容,嵌入式系統更是如此。
5.4 trap_init()
這個函數用來做體系相關的中斷處理的初始化,在該函數中調用__trap_init((void *)vectors_base())函數將exception vector設置到vectors_base開始的地址上。__trap_init函數位于entry-armv.S文件中,對于ARM處理器,共有復位、未定義指令、SWI、預取終止、數據終止、IRQ和FIQ幾種方式。SWI主要用來實現系統調用,而産生了IRQ之後,通過exception vector進入中斷處理過程,執行do_IRQ函數。
armnommu的trap_init()函數在 arch/armnommu/kernel/traps.c文件中。vectors_base是寫中斷向量的開始地址,在include/asm- armnommu/proc-armv/system.h文件中設置,地址為0或0XFFFF0000。
ENTRY(__trap_init)
stmfd sp!, {r4 - r6, lr}
mrs r1, cpsr @ code from 2.0.38
bic r1, r1, #MODE_MASK @ clear mode bits /* 設置svc模式,disable IRQ,FIQ */
orr r1, r1, #I_BIT|F_BIT|MODE_SVC @ set SVC mode, disable IRQ,FIQ
msr cpsr, r1
adr r1, .LCvectors @ set up the vectors
ldmia r1, {r1, r2, r3, r4, r5, r6, ip, lr}
stmia r0, {r1, r2, r3, r4, r5, r6, ip, lr} /* 拷貝异常向量 */
add r2, r0, #0x200
adr r0, __stubs_start @ copy stubs to 0x200
adr r1, __stubs_end
1: ldr r3, [r0], #4
str r3, [r2], #4
cmp r0, r1
blt 1b
LOADREGS(fd, sp!, {r4 - r6, pc})
__stubs_start到__stubs_end的地址中包含了异常處理的代碼,因此拷貝到vectors_base+0x200的位置上。
5.5 init_IRQ()
void __init init_IRQ(void)
{
extern void init_dma(void);
int irq;
for (irq = 0; irq < NR_IRQS; irq++) {
irq_desc[irq].probe_ok = 0;
irq_desc[irq].valid = 0;
irq_desc[irq].noautoenable = 0;
irq_desc[irq].mask_ack = dummy_mask_unmask_irq;
irq_desc[irq].mask = dummy_mask_unmask_irq;
irq_desc[irq].unmask = dummy_mask_unmask_irq;
}
CSR_WRITE(AIC_MDCR, 0x7FFFE); /* disable all interrupts */
CSR_WRITE(CAHCNF,0x0);/*Close Cache*/
CSR_WRITE(CAHCON,0x87);/*Flush Cache*/
while(CSR_READ(CAHCON)!=0);
CSR_WRITE(CAHCNF,0x7);/*Open Cache*/
init_arch_irq();
init_dma();
}
這個函數用來做體系相關的irq處理的初始化,irq_desc數組是用來描述IRQ的請求隊列,每一個中斷號分配一個irq_desc結構,組成了一個數組。NR_IRQS代表中斷數目,這裏只是對中斷結構irq_desc進行了初始化。在默認的初始化完成後調用初始化函數init_arch_irq,先執行arch/armnommu/kernel/irq-arch.c文件中的函數genarch_init_irq(),然後就執行 include/asm-armnommu/arch-xxxx/irq.h中的inline函數irq_init_irq,在這裏對irq_desc進行了實質的初始化。其中mask用阻塞中斷;unmask用來取消阻塞;mask_ack的作用是阻塞中斷,同時還回應ack給硬件表示這個中斷已經被處理了,否則硬件將再次發生同一個中斷。這裏,不是所有硬件需要這個ack回應,所以很多時候mask_ack與mask用的是同一個函數。
接下來執行init_dma()函數,如果不支持DMA,可以設置include/asm-armnommu/arch-xxxx/dma.h中的 MAX_DMA_CHANNELS為0,這様在arch/armnommu/kernel/dma.c文件中會根據這個定義使用不同的函數。
5.6 sched_init()
初始化系統調度進程,主要對定時器機制和時鐘中斷的Bottom Half的初始化函數進行設置。與時間相關的初始化過程主要有兩步:(1)調用init_timervecs()函數初始化内核定時器機制;(2)調用 init_bh()函數將BH向量TIMER_BH、TQUEUE_BH和IMMEDIATE_BH所對應的BH函數分彆設置成timer_bh()、 tqueue_bh()和immediate_bh()函數
5.7 softirq_init()
内核的軟中斷機制初始化函數。調用tasklet_init初始化tasklet_struct結構,軟中斷的個數為32個。用于bh的tasklet_struct結構調用 tasklet_init()以後,它們的函數指針func全都指向bh_action()。bh_action就是tasklet實現bh機制的代碼,但此時具體的bh函數還没有指定。
HI_SOFTIRQ用于實現bottom half,TASKLET_SOFTIRQ用于公共的tasklet。
open_softirq(TASKLET_SOFTIRQ, tasklet_action, NULL); /* 初始化公共的tasklet_struct要用到的軟中斷 */
open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL); /* 初始化tasklet_struct實現的bottom half調用 */
這裏順便講一下軟中斷的執行函數do_softirq()。
軟中斷服務不允許在一個硬中斷服務程序内部執行,也不允許在一個軟中斷服務程序内部執行,所以通過in_interrupt()加以檢查。h-> action 就是串行化執行軟中斷,當bh 的tasklet_struct 鏈入的時候,就能在這裏執行,在bh裏重新鎖定了所有CPU,導致一個時間只有一個CPU可以執行bh 函數,但是do_softirq()是可以在多CPU 上同時執行的。而每個tasklet_struct在一個時間上是不會出現在兩個CPU上的。另外,只有當Linux初始化完成開啓中斷後,中斷系統才可以開始工作。
5.8 time_init()
這個函數用來做體系相關的timer的初始化,armnommu的在 arch/armnommu/kernel/time.c。這裏調用了在include/asm-armnommu/arch-xxxx/time.h中的inline函數setup_timer,setup_timer()函數的設計與硬件設計緊密相關,主要是根據硬件設計情况設置時鐘中斷號和時鐘頻率等。
void __inline__ setup_timer (void)
{
/*----- disable timer -----*/
CSR_WRITE(TCR0, xxx);
CSR_WRITE (AIC_SCR7, xxx); /* setting priority level to high */
/* timer 0: 100 ticks/sec */
CSR_WRITE(TICR0, xxx);
timer_irq.handler = xxxxxx_timer_interrupt;
setup_arm_irq(IRQ_TIMER, &timer_irq); /* IRQ_TIMER is the interrupt number */
INT_ENABLE(IRQ_TIMER);
/* Clear interrupt flag */
CSR_WRITE(TISR, xxx);
/* enable timer */
CSR_WRITE(TCR0, xxx);
}
5.9 console_init()
控制台初始化。控制台也是一種驅動程序,由于其特殊性,提前到該處完成初始化,主要是為了提前看到輸出信息,據此判斷内核運行情况。很多嵌入式Linux操作系統由于没有在/dev目録下正確配置console設備,造成啓動時發生諸如unable to open an initial console的錯誤。
/*******************************************************************************/
init_modules()函數到smp_init()函數之間的代碼一般不需要作修改,
如果平台具有特殊性,也只需對相關函數進行必要修改。
這裏簡單注明了一下各個函數的功能,以便了解。
/*******************************************************************************/
5.10 init_modules()
模塊初始化。如果編譯内核時使能該選項,則内核支持模塊化加載/卸載功能
5.11 kmem_cache_init()
内核Cache初始化。
5.12 sti()
使能中斷,這裏開始,中斷系統開始正常工作。
5.13 calibrate_delay()
近似計算BogoMIPS數字的内核函數。作為第一次估算,calibrate_delay計算出在每一秒内執行多少次__delay循環,也就是每個定時器滴答(timer tick)―百分之一秒内延時循環可以執行多少次。這種計算只是一種估算,結果并不能精確到納秒,但這個數字供内核使用已經足够精確了。
BogoMIPS的數字由内核計算并在系統初始化的時候打印。它近似的給出了每秒鐘CPU可以執行一個短延遲循環的次數。在内核中,這個結果主要用于需要等待非常短周期的設備驅動程序――例如,等待幾微秒并查看設備的某些信息是否已經可用。
計算一個定時器滴答内可以執行多少次循環需要在滴答開始時就開始計數,或者應該盡可能與它接近。全局變量jiffies中存儲了從内核開始保持跟踪時間開始到現在已經經過的定時器滴答數, jiffies保持异步更新,在一個中斷内——每秒一百次,内核暫時挂起正在處理的内容,更新變量,然後繼續剛才的工作。
5.14 mem_init()
内存初始化。本函數通過内存碎片的重組等方法標記當前剩餘内存, 設置内存上下界和頁表項初始值。
5.15 kmem_cache_sizes_init()
内核内存管理器的初始化,也就是初始化cache和SLAB分配機制。
5.16 pgtable_cache_init()
頁表cache初始化。
5.17 fork_init()
這裏根據硬件的内存情况,如果計算出的max_threads數量太大,可以自行定義。
5.18 proc_caches_init();
為proc文件系統創建高速緩衝
5.19 vfs_caches_init(num_physpages);
為VFS創建SLAB高速緩衝
5.20 buffer_init(num_physpages);
初始化buffer
5.21 page_cache_init(num_physpages);
頁緩衝初始化
5.22 signals_init();
創建信號隊列高速緩衝
5.23 proc_root_init();
在内存中創建包括根結點在内的所有節點
5.24 check_bugs();
檢查與處理器相關的bug
5.25 smp_init();
5.26 rest_init();
此函數調用kernel_thread(init, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL)函數。
5.26.1 kernel_thread()函數分析
這裏調用了arch/armnommu/kernel/process.c中的函數kernel_thread,kernel_thread函數中通過 __syscall(clone) 創建新綫程。__syscall(clone)函數參見armnommu/kernel目録下的entry-common.S文件。
5.26.2 init()完成下列功能:
Init()函數通過kernel_thread(init, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL)的回調函數執行,完成下列功能。
do_basic_setup()
在該函數裏,sock_init()函數進行網絡相關的初始化,占用相當多的内存,如果所開發系統不支持網絡功能,可以把該函數的執行注釋掉。
do_initcalls()實現驅動的初始化, 這裏需要與vmlinux.lds聯系起來看才能明白其中奥妙。
static void __init do_initcalls(void)
{
initcall_t *call;
call = &__initcall_start;
do {
(*call)();
call++;
} while (call < &__initcall_end);
/* Make sure there is no pending stuff from the initcall sequence */
flush_scheduled_tasks();
}
查看 /arch/i386/vmlinux.lds,其中有一段代碼
__initcall_start = .;
.initcall.init : { *(.initcall.init) }
__initcall_end = .;
其含義是__initcall_start指向代碼節.initcall.init的節首,而__initcall_end指向.initcall.init的節尾。
do_initcalls所作的是系統中有關驅動部分的初始化工作,那麽這些函數指針數據是怎様放到了.initcall.init節呢?在include/linux/init.h文件中有如下3個定義:
1. #define __init_call __attribute__ ((unused,__section__ (".initcall.init")))
__attribute__的含義就是構建一個在.initcall.init節的指向初始函數的指針。
2. #define __initcall(fn) static initcall_t __initcall_##fn __init_call = fn
##意思就是在可變參數使用宏定義的時候構建一個變量名稱為所指向的函數的名稱,并且在前面加上__initcall_
3. #define module_init(x) __initcall(x);
很多驅動中都有類似module_init(usb_init)的代碼,通過該宏定義逐層解釋存放到.initcall.int節中。
blkmem相關的修改(do_initcalls()初始化驅動時執行此代碼)
在blkmem_init ()函數中,調用了blk_init_queue()函數,blk_init_queue()函數調用了blk_init_free_list()函數, blk_init_free_list()函數又調用了blk_grow_request_list()函數,在這個函數中會 kmem_cache_alloc出nr_requests個request結構體。
這裏如果nr_requests的值太大,則將占用過多的内存,將造成硬件内存不够,因此可以根據實際情况將其替换成了較小的值,比如32、16等。
free_initmem
這個函數在arch/armnommu/mm/init.c文件中,其作用就是對init節的釋放,也可以通過修改代碼指定為不釋放。
5.26.3 init執行過程
在内核引導結束并啓動init之後,系統就轉入用户態的運行,在這之後創建的一切進程,都是在用户態進行。這裏先要清楚一個概念:就是init進程雖然是從内核開始的,即在前面所講的init/main.c中的init()函數在啓動後就已經是一個核心綫程,但在轉到執行init程序(如 /sbin/init)之後,内核中的init()就變成了/sbin/init程序,狀態也轉變成了用户態,也就是説核心綫程變成了一個普通的進程。這様一來,内核中的init函數實際上只是用户態init進程的入口,它在執行execve("/sbin/init",argv_init, envp_init)時改變成為一個普通的用户進程。這也就是exec函數的乾坤大挪移法,在exec函數調用其他程序時,當前進程被其他進程“靈魂附體”。
除此之外,它們的代碼來源也有差彆,内核中的init()函數的源代碼在/init/main.c中,是内核的一部分。而/sbin/init程序的源代碼是應用程序。
init程序啓動之後,要完成以下任務:檢查文件系統,啓動各種後台服務進程,最後為每個終端和虚擬控制台啓動一個getty進程供用户登録。由于所有其它用户進程都是由init派生的,因此它又是其它一切用户進程的父進程。
init進程啓動後,按照/etc/inittab的内容進程系統設置。很多嵌入式系統用的是BusyBox的init,它與一般所使用的init不一様,會先執行/etc/init.d/rcS而非/etc/rc.d/rc.sysinit。
小結:
本想多整理一些相關資料,無奈又要開始新項目的奔波,start_kernel()函數也剛好差不多講完了,分析的不是很深入,希望對嵌入式Linux移植的網友們有一些幫助。最後列舉下面幾處未整理的知識點,有興趣的網友可作進一步探討。
text.init和data.init説明
__init 標示符在gcc編譯器中指定將該函數置于内核的特定區域。在内核完成自身初始化之後,就試圖釋放這個特定區域。實際上,内核中存在兩個這様的區域,. text.init和.data.init――第一個是代碼初始化使用的,另外一個是數據初始化使用的。另外也可以看到__initfunc和 __initdata標志,前者和__init類似,標志初始化專用代碼,後者則標志初始化專用數據。
System.map内核符號表
irq的處理過程
Linux内核調度過程
2008年5月13日 星期二
致富之道
這則巴比倫最有錢人的故事, 看似簡單平常, 但在八千年前巴比倫人已經懂得理財致富之道, 這些原則到現在還是一樣可以適用。
根據巴比倫出土的陶磚土記載, 巴比倫最有錢的人叫做阿卡德, 很多人羨慕他的富有, 因此向他請教致富之道。
阿卡德原來是在擔任雕刻陶磚的工作, 有一天, 有一位有錢人歐格尼斯來向他訂購一塊刻有法律條文的陶磚, 阿卡德說, 他願意漏夜雕刻, 到天亮時就可以完成,但是唯一的條件是歐格尼斯要告訴他致富的秘訣。
歐格尼斯同意這個條件, 因此到天亮時, 阿卡德完成了陶磚的雕刻工作, 歐格尼斯實踐了他的諾言, 他告訴阿卡德 :
「 致富的秘訣是 : 你賺的錢中有一部份要存下來。」
「財富就像樹一樣, 從一粒微小的種耔開始成長, 第一筆你存下來的錢就是你財富成長的種籽, 不管你賺的多麼少, 你一定要存下十分之一。」
一年後, 當歐格尼斯再來的時候, 他問阿卡德是否有照他的話去做, 把賺來的錢省下十分之一。
阿卡德很驕傲的回答, 他確實照他的方法作了, 歐格尼斯就問 :
「那存下來的錢, 你如何使用呢?」
阿卡德說:「我把它給了磚匠阿盧瑪, 因為他要旅行到遠地買回菲利人稀有的珠寶, 當他回來的時候,我們將把這些珠寶賣很高的價格,然後平分這些錢。」
歐格尼斯責罵說: 「只有傻子才會這麼做, 為什麼買珠寶要信任磚匠的話呢? 你的存款已經泡湯了! 年輕人, 你把財富的樹連根都拔掉了, 下次你買珠寶應該去請教珠寶商, 買羊毛去請教羊毛商, 別和外行人做生意! 」
就如同歐格尼斯所說, 磚匠阿魯瑪被菲利人騙了, 買回來的是不值錢的玻璃,看起來像珠寶.
阿卡德再次下定決心存下所賺的錢的十分之一, 當第二年, 歐格尼斯再來的時候, 他又詢問阿卡德錢存的如何?
阿卡德回答 :「我把存下來的錢借給了鐵匠去買青銅原料, 然後他每四個月付我一次租金。」
歐格尼斯說 : 「很好, 那麼你如何使用賺來的租金呢? 」
阿卡德說 : 「 我把賺來的租金拿來吃一頓豐富大餐, 並買一件漂亮的衣服, 我還計劃買一頭驢子來騎。」
歐格尼斯笑了, 他說 : 「 你把存下的錢所衍生的子息吃掉了, 你如何期望他們以及他們的子孫能再為你工作, 賺更多的錢? 當你賺到足夠的財富時, 你才能盡情享用而無後顧之憂。」
又過了二年, 歐格尼斯問阿卡德 : 「 你是否達到夢想中的財富? 」
阿卡德說: 「還沒有, 但是我已存下了一些錢, 然後錢滾錢, 錢又滾錢。」
阿格尼斯又問 : 「那你是否還向磚匠請教事情? 」
阿卡德說 : 「有關造磚的工作請教他們能得到很好的建議。」
歐格尼斯說 :
「 你已學會了致富的秘訣。首先你學會了從賺來的錢省下錢, 其次你學會了向內行的人請教意見, 最後你學會了如何讓錢為你工作, 使錢賺錢。你已學會如何獲得財富, 保持財富, 運用財富。」
早在八千年前的巴比倫人就指出 : 成功的人都是善於管理、 維護、 運用創造財富。致富之道在於聽取專業的意見, 並且終生奉行不渝。
這則古老的智慧當中, 蘊含著金錢的五大金科定律。
金錢的第一定律 : 金錢是慢慢流向那些願意儲蓄的人。
每月至少存入十分之一的錢, 久而久之可以累積成一筆可觀的資產。
金錢的第二定律 : 金錢願意為懂得運用它的人工作。
那些願意打開心胸, 聽取專業的意見, 將金錢放在穩當的生利投資上, 讓錢滾錢, 利滾利, 將會源源不斷創造財富。
金錢的第三定律 : 金錢會留在懂得保護它的的人身邊。
重視時間報酬的意義, 耐心謹慎的維護它的財富, 讓它持續增值, 而不貪圖暴利。
金錢的第四定律 : 金錢會從那些不懂得管理的人身邊溜走。
對於擁有金錢而不善經營的人, 一眼望去, 四處都有投資獲利的機會, 事實上卻處處 隱藏陷阱, 由於錯誤的判斷, 它們常會損失金錢。
金錢的第五定律 : 金錢會從那些渴望獲得暴利的人身邊溜走。
金錢的投資報酬有一定的回收, 渴望投資獲得暴利的人常被愚弄, 因而失去金錢。
缺乏經驗或外行, 是造成投資損失的最主要原因。
摘自:「是的,我要成功」 / 陳偉航 / 麥田出版
根據巴比倫出土的陶磚土記載, 巴比倫最有錢的人叫做阿卡德, 很多人羨慕他的富有, 因此向他請教致富之道。
阿卡德原來是在擔任雕刻陶磚的工作, 有一天, 有一位有錢人歐格尼斯來向他訂購一塊刻有法律條文的陶磚, 阿卡德說, 他願意漏夜雕刻, 到天亮時就可以完成,但是唯一的條件是歐格尼斯要告訴他致富的秘訣。
歐格尼斯同意這個條件, 因此到天亮時, 阿卡德完成了陶磚的雕刻工作, 歐格尼斯實踐了他的諾言, 他告訴阿卡德 :
「 致富的秘訣是 : 你賺的錢中有一部份要存下來。」
「財富就像樹一樣, 從一粒微小的種耔開始成長, 第一筆你存下來的錢就是你財富成長的種籽, 不管你賺的多麼少, 你一定要存下十分之一。」
一年後, 當歐格尼斯再來的時候, 他問阿卡德是否有照他的話去做, 把賺來的錢省下十分之一。
阿卡德很驕傲的回答, 他確實照他的方法作了, 歐格尼斯就問 :
「那存下來的錢, 你如何使用呢?」
阿卡德說:「我把它給了磚匠阿盧瑪, 因為他要旅行到遠地買回菲利人稀有的珠寶, 當他回來的時候,我們將把這些珠寶賣很高的價格,然後平分這些錢。」
歐格尼斯責罵說: 「只有傻子才會這麼做, 為什麼買珠寶要信任磚匠的話呢? 你的存款已經泡湯了! 年輕人, 你把財富的樹連根都拔掉了, 下次你買珠寶應該去請教珠寶商, 買羊毛去請教羊毛商, 別和外行人做生意! 」
就如同歐格尼斯所說, 磚匠阿魯瑪被菲利人騙了, 買回來的是不值錢的玻璃,看起來像珠寶.
阿卡德再次下定決心存下所賺的錢的十分之一, 當第二年, 歐格尼斯再來的時候, 他又詢問阿卡德錢存的如何?
阿卡德回答 :「我把存下來的錢借給了鐵匠去買青銅原料, 然後他每四個月付我一次租金。」
歐格尼斯說 : 「很好, 那麼你如何使用賺來的租金呢? 」
阿卡德說 : 「 我把賺來的租金拿來吃一頓豐富大餐, 並買一件漂亮的衣服, 我還計劃買一頭驢子來騎。」
歐格尼斯笑了, 他說 : 「 你把存下的錢所衍生的子息吃掉了, 你如何期望他們以及他們的子孫能再為你工作, 賺更多的錢? 當你賺到足夠的財富時, 你才能盡情享用而無後顧之憂。」
又過了二年, 歐格尼斯問阿卡德 : 「 你是否達到夢想中的財富? 」
阿卡德說: 「還沒有, 但是我已存下了一些錢, 然後錢滾錢, 錢又滾錢。」
阿格尼斯又問 : 「那你是否還向磚匠請教事情? 」
阿卡德說 : 「有關造磚的工作請教他們能得到很好的建議。」
歐格尼斯說 :
「 你已學會了致富的秘訣。首先你學會了從賺來的錢省下錢, 其次你學會了向內行的人請教意見, 最後你學會了如何讓錢為你工作, 使錢賺錢。你已學會如何獲得財富, 保持財富, 運用財富。」
早在八千年前的巴比倫人就指出 : 成功的人都是善於管理、 維護、 運用創造財富。致富之道在於聽取專業的意見, 並且終生奉行不渝。
這則古老的智慧當中, 蘊含著金錢的五大金科定律。
金錢的第一定律 : 金錢是慢慢流向那些願意儲蓄的人。
每月至少存入十分之一的錢, 久而久之可以累積成一筆可觀的資產。
金錢的第二定律 : 金錢願意為懂得運用它的人工作。
那些願意打開心胸, 聽取專業的意見, 將金錢放在穩當的生利投資上, 讓錢滾錢, 利滾利, 將會源源不斷創造財富。
金錢的第三定律 : 金錢會留在懂得保護它的的人身邊。
重視時間報酬的意義, 耐心謹慎的維護它的財富, 讓它持續增值, 而不貪圖暴利。
金錢的第四定律 : 金錢會從那些不懂得管理的人身邊溜走。
對於擁有金錢而不善經營的人, 一眼望去, 四處都有投資獲利的機會, 事實上卻處處 隱藏陷阱, 由於錯誤的判斷, 它們常會損失金錢。
金錢的第五定律 : 金錢會從那些渴望獲得暴利的人身邊溜走。
金錢的投資報酬有一定的回收, 渴望投資獲得暴利的人常被愚弄, 因而失去金錢。
缺乏經驗或外行, 是造成投資損失的最主要原因。
摘自:「是的,我要成功」 / 陳偉航 / 麥田出版
2008年5月1日 星期四
GForge Advance Server
Unlimited users can register and participate in your projects, including posting to your project forums, trackers, and docs. Up to 15 of your total registered users can become full project members.
GForge Advanced Server is available as a free, binary download. Choose either a completely-installed vmware image or an installer that will run easily on Fedora, Red Hat Enterprise Linux 4-5, Debian Etch, Ubuntu 6, or CentOS 4-5
Gforge 為開放源代碼軟體開發者提供全方面的免費服務,包括CVS檔案庫、通信論壇、BUG追蹤、線上討論區、任務管理、網站空間、專案存儲及完整的備份,並且完全是透過WEB方式來管理的。
http://gforgegroup.com/
簡體版的安裝教學
這套感覺蠻不錯的,很多功能都很實用,但....真的是很難裝@@
參考網站:
http://blackfin.uclinux.org/gf/project/uclinux-dist/
GForge Advanced Server is available as a free, binary download. Choose either a completely-installed vmware image or an installer that will run easily on Fedora, Red Hat Enterprise Linux 4-5, Debian Etch, Ubuntu 6, or CentOS 4-5
Gforge 為開放源代碼軟體開發者提供全方面的免費服務,包括CVS檔案庫、通信論壇、BUG追蹤、線上討論區、任務管理、網站空間、專案存儲及完整的備份,並且完全是透過WEB方式來管理的。
http://gforgegroup.com/
簡體版的安裝教學
這套感覺蠻不錯的,很多功能都很實用,但....真的是很難裝@@
參考網站:
http://blackfin.uclinux.org/gf/project/uclinux-dist/
2008年4月8日 星期二
3種外幣存款工具,讓你資產不縮水
【實戰篇】3種外幣存款工具,讓你資產不縮水
• 選對強勢貨幣,利率匯率兩頭賺
文╱徐麗虹
不過短短一個月的時間,台幣匯率貶值幅度已達5%,資產無形中縮水不少。建議你,在理財國際化的時代裡,最好擁有部分外幣資產,其中外幣定存、保本型定存與境外存款,都是可以考慮的外幣理財工具,兼具分散風險與獲取更高收益的好處。
在5月中旬以前,美元兌新台幣匯率還在1比32.9,但才短短一個星期,新台幣便貶值到34.5元兌1美元,每兌換1萬美元,5月上旬與現在就產生了1萬6000元左右的匯兌損失。
利率與匯率的走低,讓許多台灣人的財產不知不覺間縮水,如果依然希望財產保值,不妨將部分的台幣資產轉為以外幣形式持有,一方面可以讓理財更加國際化以分散風險,另一方面也可以獲取較佳收益。此外,對於經常出國、有小孩在國外念書的父母,或者具雙重國籍者,擁有一個外幣資產帳戶,可以免除匯兌的風險與麻煩。
• 應以保本為主要考量
將手中資產轉為外幣的方法很多,例如買海外基金就是很多人採取的方式,但對於理財性格較保守的投資人來說,外幣定存、保本型定存與境外存款可能是更合適的外幣資產理財工具。
• 工具1.外幣定存:美元仍是現階段最佳選擇
雖然現在的外幣存款利率並不高,但由於它除了可以賺利息,選對強勢貨幣,還可以賺到匯差,收益比台幣定存來得高。當然外幣存款也並非絕對賺錢,當台幣強勢升值時,也會產生匯差損失。因此,富邦銀行個人金融部襄理郭慧�建議,外幣存款應選擇相對強勢的貨幣,並事先評估投資報酬率再決定。以美元存款為例,現在美元與台幣定存一年期利率差異約1%,所以只要美元升值1%以上,就能賺到比台幣定存更高的收益。
目前可以選擇的外幣中,還是以美元最佳,因為美元屬於世界性的貨幣,市場流通性高,而且資訊取得容易,近期內對台幣而言又屬強勢貨幣。此外,歐元、日圓與港幣也是多數人選擇的國外貨幣,不過,歐元至今仍未有實體貨幣出現,建議等情勢明朗再介入;至於日圓與台幣連動性高,升貶與台幣正相關,不易賺到匯差,存款利率也低,是較少考慮的幣別。
【外幣存款投資報酬率如何計算?】
王太太有500萬元台幣存款,如果將其中350萬元轉換成美元一年期定存,如何得知投資報酬率,比台幣定存好或差?假設台幣定存利率4.1%,美元定存利率3.15%,另存款時匯率為1美元兌34元台幣,解約時為34.5元。
公式:
1. 利率差價:
外幣利率-台幣利率=利差
3%-4%=-1%
2. 匯率差價:
(解約時外幣兌台幣匯率-存款時外幣兌台幣匯率)÷存款時外幣兌台幣匯率×100%=匯差
(34.45-34)÷34×100%=1.32%
3. 投資報酬率:
利差+匯差=投資報酬率
-1%+1.32%=0.32%
4. 投資報酬率為「+」:存外幣定存較划算
投資報酬率為「-」:存台幣定存較划算
0.32%為「+」,則存外幣定存較划算
5. 不過,若存款時匯率是34.45元,解約時是34元,則將產生匯差損失1.31%,加上利差損失1%,等於每存100萬元,存外幣比台幣少賺2萬3100元。
值得一提的是,外幣存款有最低金額限制,活存通常是100美元或等值外幣,定存則是1000∼5000美元不等。此外,外幣存款戶並不像台幣有100萬元存款保障,所以應選擇財務穩健的銀行。
至於其他規定則與台幣存款差不多,只要年滿20歲,帶著身份證件與印章,到各銀行國外部櫃台辦理即可。帳戶類別是活存、定存、綜合存款三種,原則上是一種外幣開一個戶頭,但也有外商銀行提供多種外幣存一個戶頭的綜合存款戶。至於外幣存款帳戶孳生的利息收益,同樣要申報綜所稅,並享有27萬元以內免稅的優惠。
【提領外幣現鈔不如改為旅行支票】
要用到外幣存款戶頭的錢時,如果是提領外幣現鈔,銀行會收取手續費;但若以旅行支票方式領出,則不需支付手續費,且流通性與現鈔一樣。所以,建議提領外幣目的,是為了出國資金需求者,不妨改以旅行支票方式領出,可省下手續費。
各銀行一般小額外幣定期存款利率(單位:%)
銀行╱美元定期存款╱歐元定期存款╱日圓定期存款╱港幣定期存款
花旗╱2.21(6個月);2.39(12個月)╱2.14(6個月);2.69(12個月)╱0.01(6個月);0.01(12個月)╱2.6(6個月);2.6(12個月)
荷蘭╱2.70(6個月);2.80(12個月)╱2.90(6個月);2.80(12個月)╱-(6個月);-(12個月)╱1.75(6個月);-(12個月)
匯豐╱2.80(6個月);2.80(12個月)╱3.10(6個月);2.90(12個月)╱0(6個月);0(12個月)╱2.60(6個月);2.60(12個月)
中國商銀╱2.85(6個月);3.00(12個月)╱3.30(6個月);3.30(12個月)╱0.02(6個月);0.02(12個月)╱2.55(6個月);2.70(12個月)
世華╱2.90(6個月);3.05(12個月)╱3.25(6個月);3.25(12個月)╱0.02(6個月);0.02(12個月)╱2.65(6個月);2.75(12個月)
資料來源:各銀行
製表╱徐麗虹
製表日期:6/17
• 工具2.外幣保本型定存:保本且潛在收益可能比定存高
如果覺得固定利息收益不夠看的定存族,也可以考慮選擇比定存積極一點的保本型定存,又稱為投資型定存。這類定存是將定存孳生的利息參與投資,在存款時即約定於一段期間內,由專家將利息拿去投資債券、基金等。由於投資可能產生利得,存戶就有機會享受高於定存的利息,即使不幸投資失敗,最多也只損失全部的利息,本金不受影響,因此具有保本的好處。
不過,選擇保本型定存,最少要有相當於新台幣二、三百萬元的外幣存款才行,是屬於資產雄厚的大戶才可參與的,因為本金雄厚,才有足夠利息可投資。另外,目前推出此一商品的銀行並不多,台新銀行、花旗銀行與遠東銀行,曾推出相關商品,但保本型定存與封閉型基金一樣,有一定的募集期間,募集期一過就不能投資,因此,有興趣者應洽詢各銀行,才能在銀行推出時適時參與。
• 工具3.境外存款:既分散風險又能節稅
外幣存款畢竟戶頭還是在國內,為了避險考量,有些人喜歡直接到海外開戶,至於境外利息所得是否課稅,則視當地的稅負而定,但不必列入台灣的綜合所得稅中。
國外開戶的辦法依各國而不同,以熱門國美加來說,開戶手續簡便、無匯出匯入管制,還具有變現性高的好處。如果是非公民或居民的外國人,需持護照到社會安全管理局申請「社會安全號碼」(Security Number),再憑護照與社會安全號碼到銀行開戶。通常只要填寫個人資料、勾選存款帳戶的內容並簽名、存錢即可。值得一提的是,美國存款的利息收入要申報所得稅,如果存款金額較高,記得報稅,否則留下不良紀錄,將來申請綠卡較為不利。
至於很多有錢人會選擇瑞士或歐洲其他國家開戶,其優點是隱密性高,因為歐洲銀行十分重視客戶的隱私權。歐洲存款開戶規定依各國不同,原則上外國人憑護照到銀行櫃台辦理,但填寫的書表有可能是英文、法文、義大利文或其他語言。需注意的是,大部分的歐洲國家有外匯管制,並規定錢只能存在銀行,不能用來進行投資,而且有些銀行對外國人是不支付利息的。
此外,也可選擇到新加坡或香港開戶,具有距離近、講國語也通的好處。香港是國際金融中心,沒有外匯管制、利息免稅、政局也穩定,最重要的是,香港對於私人資料的保護也相當好。至於新加坡也差不多,對外國人亦不課稅,唯一不同的是新加坡的存款在匯出國境時,需課徵約千分之三的離境稅。
【國外開戶應備文件】
1. 個人身分證明文件正本及影本,通常是護照。
2. 國內經常往來銀行月結單,或是水費單、電費單等,以證明無虛報地址。
3. 經常往來銀行的英文推薦書,主要證明無不良信用紀錄。
• 選對強勢貨幣,利率匯率兩頭賺
文╱徐麗虹
不過短短一個月的時間,台幣匯率貶值幅度已達5%,資產無形中縮水不少。建議你,在理財國際化的時代裡,最好擁有部分外幣資產,其中外幣定存、保本型定存與境外存款,都是可以考慮的外幣理財工具,兼具分散風險與獲取更高收益的好處。
在5月中旬以前,美元兌新台幣匯率還在1比32.9,但才短短一個星期,新台幣便貶值到34.5元兌1美元,每兌換1萬美元,5月上旬與現在就產生了1萬6000元左右的匯兌損失。
利率與匯率的走低,讓許多台灣人的財產不知不覺間縮水,如果依然希望財產保值,不妨將部分的台幣資產轉為以外幣形式持有,一方面可以讓理財更加國際化以分散風險,另一方面也可以獲取較佳收益。此外,對於經常出國、有小孩在國外念書的父母,或者具雙重國籍者,擁有一個外幣資產帳戶,可以免除匯兌的風險與麻煩。
• 應以保本為主要考量
將手中資產轉為外幣的方法很多,例如買海外基金就是很多人採取的方式,但對於理財性格較保守的投資人來說,外幣定存、保本型定存與境外存款可能是更合適的外幣資產理財工具。
• 工具1.外幣定存:美元仍是現階段最佳選擇
雖然現在的外幣存款利率並不高,但由於它除了可以賺利息,選對強勢貨幣,還可以賺到匯差,收益比台幣定存來得高。當然外幣存款也並非絕對賺錢,當台幣強勢升值時,也會產生匯差損失。因此,富邦銀行個人金融部襄理郭慧�建議,外幣存款應選擇相對強勢的貨幣,並事先評估投資報酬率再決定。以美元存款為例,現在美元與台幣定存一年期利率差異約1%,所以只要美元升值1%以上,就能賺到比台幣定存更高的收益。
目前可以選擇的外幣中,還是以美元最佳,因為美元屬於世界性的貨幣,市場流通性高,而且資訊取得容易,近期內對台幣而言又屬強勢貨幣。此外,歐元、日圓與港幣也是多數人選擇的國外貨幣,不過,歐元至今仍未有實體貨幣出現,建議等情勢明朗再介入;至於日圓與台幣連動性高,升貶與台幣正相關,不易賺到匯差,存款利率也低,是較少考慮的幣別。
【外幣存款投資報酬率如何計算?】
王太太有500萬元台幣存款,如果將其中350萬元轉換成美元一年期定存,如何得知投資報酬率,比台幣定存好或差?假設台幣定存利率4.1%,美元定存利率3.15%,另存款時匯率為1美元兌34元台幣,解約時為34.5元。
公式:
1. 利率差價:
外幣利率-台幣利率=利差
3%-4%=-1%
2. 匯率差價:
(解約時外幣兌台幣匯率-存款時外幣兌台幣匯率)÷存款時外幣兌台幣匯率×100%=匯差
(34.45-34)÷34×100%=1.32%
3. 投資報酬率:
利差+匯差=投資報酬率
-1%+1.32%=0.32%
4. 投資報酬率為「+」:存外幣定存較划算
投資報酬率為「-」:存台幣定存較划算
0.32%為「+」,則存外幣定存較划算
5. 不過,若存款時匯率是34.45元,解約時是34元,則將產生匯差損失1.31%,加上利差損失1%,等於每存100萬元,存外幣比台幣少賺2萬3100元。
值得一提的是,外幣存款有最低金額限制,活存通常是100美元或等值外幣,定存則是1000∼5000美元不等。此外,外幣存款戶並不像台幣有100萬元存款保障,所以應選擇財務穩健的銀行。
至於其他規定則與台幣存款差不多,只要年滿20歲,帶著身份證件與印章,到各銀行國外部櫃台辦理即可。帳戶類別是活存、定存、綜合存款三種,原則上是一種外幣開一個戶頭,但也有外商銀行提供多種外幣存一個戶頭的綜合存款戶。至於外幣存款帳戶孳生的利息收益,同樣要申報綜所稅,並享有27萬元以內免稅的優惠。
【提領外幣現鈔不如改為旅行支票】
要用到外幣存款戶頭的錢時,如果是提領外幣現鈔,銀行會收取手續費;但若以旅行支票方式領出,則不需支付手續費,且流通性與現鈔一樣。所以,建議提領外幣目的,是為了出國資金需求者,不妨改以旅行支票方式領出,可省下手續費。
各銀行一般小額外幣定期存款利率(單位:%)
銀行╱美元定期存款╱歐元定期存款╱日圓定期存款╱港幣定期存款
花旗╱2.21(6個月);2.39(12個月)╱2.14(6個月);2.69(12個月)╱0.01(6個月);0.01(12個月)╱2.6(6個月);2.6(12個月)
荷蘭╱2.70(6個月);2.80(12個月)╱2.90(6個月);2.80(12個月)╱-(6個月);-(12個月)╱1.75(6個月);-(12個月)
匯豐╱2.80(6個月);2.80(12個月)╱3.10(6個月);2.90(12個月)╱0(6個月);0(12個月)╱2.60(6個月);2.60(12個月)
中國商銀╱2.85(6個月);3.00(12個月)╱3.30(6個月);3.30(12個月)╱0.02(6個月);0.02(12個月)╱2.55(6個月);2.70(12個月)
世華╱2.90(6個月);3.05(12個月)╱3.25(6個月);3.25(12個月)╱0.02(6個月);0.02(12個月)╱2.65(6個月);2.75(12個月)
資料來源:各銀行
製表╱徐麗虹
製表日期:6/17
• 工具2.外幣保本型定存:保本且潛在收益可能比定存高
如果覺得固定利息收益不夠看的定存族,也可以考慮選擇比定存積極一點的保本型定存,又稱為投資型定存。這類定存是將定存孳生的利息參與投資,在存款時即約定於一段期間內,由專家將利息拿去投資債券、基金等。由於投資可能產生利得,存戶就有機會享受高於定存的利息,即使不幸投資失敗,最多也只損失全部的利息,本金不受影響,因此具有保本的好處。
不過,選擇保本型定存,最少要有相當於新台幣二、三百萬元的外幣存款才行,是屬於資產雄厚的大戶才可參與的,因為本金雄厚,才有足夠利息可投資。另外,目前推出此一商品的銀行並不多,台新銀行、花旗銀行與遠東銀行,曾推出相關商品,但保本型定存與封閉型基金一樣,有一定的募集期間,募集期一過就不能投資,因此,有興趣者應洽詢各銀行,才能在銀行推出時適時參與。
• 工具3.境外存款:既分散風險又能節稅
外幣存款畢竟戶頭還是在國內,為了避險考量,有些人喜歡直接到海外開戶,至於境外利息所得是否課稅,則視當地的稅負而定,但不必列入台灣的綜合所得稅中。
國外開戶的辦法依各國而不同,以熱門國美加來說,開戶手續簡便、無匯出匯入管制,還具有變現性高的好處。如果是非公民或居民的外國人,需持護照到社會安全管理局申請「社會安全號碼」(Security Number),再憑護照與社會安全號碼到銀行開戶。通常只要填寫個人資料、勾選存款帳戶的內容並簽名、存錢即可。值得一提的是,美國存款的利息收入要申報所得稅,如果存款金額較高,記得報稅,否則留下不良紀錄,將來申請綠卡較為不利。
至於很多有錢人會選擇瑞士或歐洲其他國家開戶,其優點是隱密性高,因為歐洲銀行十分重視客戶的隱私權。歐洲存款開戶規定依各國不同,原則上外國人憑護照到銀行櫃台辦理,但填寫的書表有可能是英文、法文、義大利文或其他語言。需注意的是,大部分的歐洲國家有外匯管制,並規定錢只能存在銀行,不能用來進行投資,而且有些銀行對外國人是不支付利息的。
此外,也可選擇到新加坡或香港開戶,具有距離近、講國語也通的好處。香港是國際金融中心,沒有外匯管制、利息免稅、政局也穩定,最重要的是,香港對於私人資料的保護也相當好。至於新加坡也差不多,對外國人亦不課稅,唯一不同的是新加坡的存款在匯出國境時,需課徵約千分之三的離境稅。
【國外開戶應備文件】
1. 個人身分證明文件正本及影本,通常是護照。
2. 國內經常往來銀行月結單,或是水費單、電費單等,以證明無虛報地址。
3. 經常往來銀行的英文推薦書,主要證明無不良信用紀錄。
6種資產組合讓定存不縮水
【應用篇】6種資產組合讓定存不縮水
• 小動作調整資產配置,幫你把錢變大了
文╱徐麗虹
當利率一點一滴往下掉時,保守的定存族,不能眼睜睜看著自己的利息縮水。利用保住利率、節省稅賦成本、增加匯率收益等方法,稍加調整資產組合配置,一樣可以保住過去的收益水準。別擔心自己不懂理財,以下六種方法是任何理財新手都可以做到的。
以定存為主要理財方式的人,是受利率下跌影響最大的族群,例如靠退休金利息過日子的銀髮族、高額存款者等,一年利息一下子縮水數萬元,每月生活水準也跟著緊縮。定存族若想要保有過去的收益水準,就應該在利率下跌之際重新檢視資產配置,靈活運用各項投資工具,進行資產組合調整。
• 6項資產調整方法,重新分配定存比例
而由於定存族的理財性格較為保守,或是沒有太多投資經驗或時間理財者,因此建議還是從安全穩健、投資簡易,以及可交由專家操作的投資工具著手,選擇定存中一至六成的比例,轉投資其他標的。
• 資產調整1:找利率較高的銀行存款
雖然市場利率同步走低,但各家銀行的利率水準仍然有一至四碼的差異。可考慮將存款轉至利率較高的銀行,新存款戶可選擇固定利率,維持較佳的利率水準。不過,這個方法只適用定存即將到期或已到期的存款戶,否則中途解約,利息損失可能比賺到的利差更大。此外,選擇銀行時應還需考量銀行財務體質是否健全,才能保障自己的財產安全。
• 資產調整2:善用郵匯局每年100萬元免稅存款
每人每年存在郵局的存款在100萬元以內,只要憑郵局開立的免扣證,利息即可免稅。郵局的存款利率與市場利率水準差不多,又有免稅的好處,所以不妨把部分存款轉到郵局,免稅又安全。
• 資產調整3:儲蓄型保險,避免利率走低兼節稅
目前市場上的保單預訂利率還有高達6%以上的儲蓄型保險,現在投保,可在往後數年至數十年,維持此利率水準的固定收益。宏利人壽總經理何達定認為,當利率趨勢往下走時,儲蓄險很適合希望長期收益固定兼保本功能的理財族。另一方面,每年的保險費可扣抵稅額2萬4000元,屆時領到的保險給付金也免稅,可達節稅的功能。
• 資產調整4:將20%台幣定存,轉為外幣定存
富邦銀行個人金融部襄理郭慧�建議,除了台幣資產之外,至少應持有20%的外幣資產。第一次擁有外幣資產者,可從外幣定存開始,除了利息收益之外,選擇強勢貨幣還可賺到匯差收益。
• 資產調整5:用外幣定存利息投資,增加收益
積極型的定存族,還可將外幣採保本型定存,不動用本金,只將定存利息拿去投資。以銀行過去操作保本型定存的投資報酬率來看,大約可獲7%以上的投資報酬率,等於相當於用3%至4%機會成本,換取7%以上收益(以美元定存來看)。
• 資產調整6:海外基金或國內政府公債基金收益穩健
其實定存族也可試著將部分資產交由專家來操作,以獲取更高收益。以海外債券型基金或政府公債基金來說,收益比定存高,又有免稅的好處,是值得考慮的穩健投資工具。
【不同族群應選擇不同投資工具】
花旗銀行消費金融部副總裁陳達定認為,會將全部或大部分資金用定存方式理財的人,可分成三個族群,而各族群的特性並不完全相同,所以進行個人資產調整時,也需視自己需要,選擇不同的資產組合配置。
1. 青年消費族:40歲以下
年紀輕輕就擁有不少資產者,還得學習開源兼理財,以保有穩定的收益水準,為將來退休生活做準備,因此,不妨趁年輕時讓資產組合調整得積極些。建議採40%定存、10%外幣定存、30%海外基金、20%儲蓄險或債券的配置方式。
2. 中壯多金族:40至60歲
工作了大半輩子,到了40歲以上,有了一些閒置資金。為了避免資產縮水,應將過去以定存為主的理財方式,調整為50%定存、10%外幣定存、20%海外基金、20%儲蓄險或債券的配置方式。
3. 退休銀髮族:60歲以上
靠退休金生活的退休人士,並不適合風險較高的投資,宜以保本、提高收益為主。建議採用60%台幣定存、20%外幣定存、20%債券的配置方式。
• 調整資產3撇步,讓儲蓄高手連惠卿2年圓購屋夢
27歲連惠卿是上班族,每月收入3萬5000多元,每月收入扣掉房租、基本生活開銷和給父母的家用後,還有2萬元的結餘。她還跟了兩個會,每月會錢4萬元,透支2萬元,不過,跟會也算是她儲蓄的方式之一。
連惠卿大部分用定存與跟會來存錢,工作短短數年,已有約200萬元的定存與25萬元的活存,另外,有兩個活會,已繳會款為20萬元。此外,她還有兩支股票正被套牢,目前現值約28萬元,是當初購進成本的一半。
將存款、會款與股票現值加起來,連惠卿目前總資產約273萬元。她希望能在兩年內購屋,於是努力存錢讓現有存款變成兩倍,或能支付購屋總價款。她理想的購屋地區是在中和、永和一帶,30坪左右的房子。
專家建議:
1. 大都會人壽商品研發協理、精算師張佑玲
2. 富邦銀行個人金融部副科長宋榮洲
專家認為惠卿目前的財務結構頗佳,並懂得儲蓄、節約消費,又沒有負債,所以只要從三個方向進行理財配置調整,應可在兩年內達成購屋夢想。
• 調整撇步1:及早將會標下減少風險
在低利率時代,尤其又有兩年購屋目標,理財方法應採保守原則。想在兩年內讓資產變兩倍的風險也不小,建議連惠卿應訂定更務實的理財目標。另外,愈是不景氣,跟會風險愈高,最好及早將會標下。
• 調整撇步2:部分定存轉債券型基金增加收益
將部分定存拿出100萬元投資海外債券型基金,剩下的100萬元繼續定存,以基金投資報酬率10%、定存4.15%計算,加上會款88萬元(估計有5%利息收益),兩年後可以存到317萬元餘。
• 調整撇步3:適度利用財務槓桿,選擇低利房貸
以目前中和、永和地區30坪新公寓,每坪平均12萬至16萬元計算,總價約在360至480萬元之間。317萬元購屋資金顯然不足,但因現在首購貸款利率低,建議不足部分可考慮貸款。以貸款100萬元20年,銀行首購貸款7%年利率計算,每月本息攤還7750元,可用連惠卿每月的結餘來支付,若不想揹20年貸款,則可縮短貸款年限,或採用隨借隨環的循環計息方式,有錢時就多還一點。
此外,如果連惠卿申請到政府低利貸款,以目前首購利率水準在3%至4.75%來說,貸款利率甚至會較銀行定存利率低,不如提高貸款金額至200萬元,其餘資金進行收益更高的投資。
• 小動作調整資產配置,幫你把錢變大了
文╱徐麗虹
當利率一點一滴往下掉時,保守的定存族,不能眼睜睜看著自己的利息縮水。利用保住利率、節省稅賦成本、增加匯率收益等方法,稍加調整資產組合配置,一樣可以保住過去的收益水準。別擔心自己不懂理財,以下六種方法是任何理財新手都可以做到的。
以定存為主要理財方式的人,是受利率下跌影響最大的族群,例如靠退休金利息過日子的銀髮族、高額存款者等,一年利息一下子縮水數萬元,每月生活水準也跟著緊縮。定存族若想要保有過去的收益水準,就應該在利率下跌之際重新檢視資產配置,靈活運用各項投資工具,進行資產組合調整。
• 6項資產調整方法,重新分配定存比例
而由於定存族的理財性格較為保守,或是沒有太多投資經驗或時間理財者,因此建議還是從安全穩健、投資簡易,以及可交由專家操作的投資工具著手,選擇定存中一至六成的比例,轉投資其他標的。
• 資產調整1:找利率較高的銀行存款
雖然市場利率同步走低,但各家銀行的利率水準仍然有一至四碼的差異。可考慮將存款轉至利率較高的銀行,新存款戶可選擇固定利率,維持較佳的利率水準。不過,這個方法只適用定存即將到期或已到期的存款戶,否則中途解約,利息損失可能比賺到的利差更大。此外,選擇銀行時應還需考量銀行財務體質是否健全,才能保障自己的財產安全。
• 資產調整2:善用郵匯局每年100萬元免稅存款
每人每年存在郵局的存款在100萬元以內,只要憑郵局開立的免扣證,利息即可免稅。郵局的存款利率與市場利率水準差不多,又有免稅的好處,所以不妨把部分存款轉到郵局,免稅又安全。
• 資產調整3:儲蓄型保險,避免利率走低兼節稅
目前市場上的保單預訂利率還有高達6%以上的儲蓄型保險,現在投保,可在往後數年至數十年,維持此利率水準的固定收益。宏利人壽總經理何達定認為,當利率趨勢往下走時,儲蓄險很適合希望長期收益固定兼保本功能的理財族。另一方面,每年的保險費可扣抵稅額2萬4000元,屆時領到的保險給付金也免稅,可達節稅的功能。
• 資產調整4:將20%台幣定存,轉為外幣定存
富邦銀行個人金融部襄理郭慧�建議,除了台幣資產之外,至少應持有20%的外幣資產。第一次擁有外幣資產者,可從外幣定存開始,除了利息收益之外,選擇強勢貨幣還可賺到匯差收益。
• 資產調整5:用外幣定存利息投資,增加收益
積極型的定存族,還可將外幣採保本型定存,不動用本金,只將定存利息拿去投資。以銀行過去操作保本型定存的投資報酬率來看,大約可獲7%以上的投資報酬率,等於相當於用3%至4%機會成本,換取7%以上收益(以美元定存來看)。
• 資產調整6:海外基金或國內政府公債基金收益穩健
其實定存族也可試著將部分資產交由專家來操作,以獲取更高收益。以海外債券型基金或政府公債基金來說,收益比定存高,又有免稅的好處,是值得考慮的穩健投資工具。
【不同族群應選擇不同投資工具】
花旗銀行消費金融部副總裁陳達定認為,會將全部或大部分資金用定存方式理財的人,可分成三個族群,而各族群的特性並不完全相同,所以進行個人資產調整時,也需視自己需要,選擇不同的資產組合配置。
1. 青年消費族:40歲以下
年紀輕輕就擁有不少資產者,還得學習開源兼理財,以保有穩定的收益水準,為將來退休生活做準備,因此,不妨趁年輕時讓資產組合調整得積極些。建議採40%定存、10%外幣定存、30%海外基金、20%儲蓄險或債券的配置方式。
2. 中壯多金族:40至60歲
工作了大半輩子,到了40歲以上,有了一些閒置資金。為了避免資產縮水,應將過去以定存為主的理財方式,調整為50%定存、10%外幣定存、20%海外基金、20%儲蓄險或債券的配置方式。
3. 退休銀髮族:60歲以上
靠退休金生活的退休人士,並不適合風險較高的投資,宜以保本、提高收益為主。建議採用60%台幣定存、20%外幣定存、20%債券的配置方式。
• 調整資產3撇步,讓儲蓄高手連惠卿2年圓購屋夢
27歲連惠卿是上班族,每月收入3萬5000多元,每月收入扣掉房租、基本生活開銷和給父母的家用後,還有2萬元的結餘。她還跟了兩個會,每月會錢4萬元,透支2萬元,不過,跟會也算是她儲蓄的方式之一。
連惠卿大部分用定存與跟會來存錢,工作短短數年,已有約200萬元的定存與25萬元的活存,另外,有兩個活會,已繳會款為20萬元。此外,她還有兩支股票正被套牢,目前現值約28萬元,是當初購進成本的一半。
將存款、會款與股票現值加起來,連惠卿目前總資產約273萬元。她希望能在兩年內購屋,於是努力存錢讓現有存款變成兩倍,或能支付購屋總價款。她理想的購屋地區是在中和、永和一帶,30坪左右的房子。
專家建議:
1. 大都會人壽商品研發協理、精算師張佑玲
2. 富邦銀行個人金融部副科長宋榮洲
專家認為惠卿目前的財務結構頗佳,並懂得儲蓄、節約消費,又沒有負債,所以只要從三個方向進行理財配置調整,應可在兩年內達成購屋夢想。
• 調整撇步1:及早將會標下減少風險
在低利率時代,尤其又有兩年購屋目標,理財方法應採保守原則。想在兩年內讓資產變兩倍的風險也不小,建議連惠卿應訂定更務實的理財目標。另外,愈是不景氣,跟會風險愈高,最好及早將會標下。
• 調整撇步2:部分定存轉債券型基金增加收益
將部分定存拿出100萬元投資海外債券型基金,剩下的100萬元繼續定存,以基金投資報酬率10%、定存4.15%計算,加上會款88萬元(估計有5%利息收益),兩年後可以存到317萬元餘。
• 調整撇步3:適度利用財務槓桿,選擇低利房貸
以目前中和、永和地區30坪新公寓,每坪平均12萬至16萬元計算,總價約在360至480萬元之間。317萬元購屋資金顯然不足,但因現在首購貸款利率低,建議不足部分可考慮貸款。以貸款100萬元20年,銀行首購貸款7%年利率計算,每月本息攤還7750元,可用連惠卿每月的結餘來支付,若不想揹20年貸款,則可縮短貸款年限,或採用隨借隨環的循環計息方式,有錢時就多還一點。
此外,如果連惠卿申請到政府低利貸款,以目前首購利率水準在3%至4.75%來說,貸款利率甚至會較銀行定存利率低,不如提高貸款金額至200萬元,其餘資金進行收益更高的投資。
2008年3月5日 星期三
LinuxBIOS with X Server Inside
使用linuxBIOS 6秒內開到busybox shell,8秒內開完進入X11(KDrive)
教學網址如下:
http://www.linuxabordo.com.br/wiki/index.php?title=LinuxBIOS_Graphical
教學網址如下:
http://www.linuxabordo.com.br/wiki/index.php?title=LinuxBIOS_Graphical
GRUB(GNU GRand Unified Boot loader)
GRUB(GNU GRand Unified Boot loader)
前言:
GRUB 的載入可以分為三個階段 stage1,stage1.5 和 stage2
1.BIOS 會將硬碟的 MBR( 前512 bytes的開機管理程式)讀進記憶體中.這就是第一階段 (stage1) 他將有能力繼續做stage1.5以及stage2.
2.第一點五階段 (stage1.5) 會去找尋我的系統上 /boot 磁區.並且讀取 /boot 磁區上一些相關資料,所以此時已可以認識filesystem.
3.第二階段 (stage2) 會顯示 GRUB menu 以及 command 環境.GRUB的使用者介面允許使用者選取作業系統核心或將伊些參數傳給核心(kernel).
4.第二階段 (stage2) 會等待使用者選取一個作業系統核心(kernel 和 initrd)並將他讀入記憶體中.接下來就將控制權交由作業系統管理了.
GRUB 設定
#cat /etc/boot/grub/grub.conf
--------------------------------------------------------------------------------------------------
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,1)
# kernel /boot/vmlinuz-version ro root=/dev/hda2
# initrd /boot/initrd-version.img
#boot=/dev/hda
default=0
timeout=10
password --md5 $1$0BqX5/$D/MgNxFsg8oOsPsVz8EAN.
splashimage=(hd0,1)/boot/grub/splash.xpm.gz
#for console system from serial port
#serial = 1,9600n8 (ttyS1, 9600 bd, no parity, 8 bits)
title Red Hat Linux (2.4.18-3)
root (hd0,1)
kernel /boot/vmlinuz-2.4.18-3 ro root=/dev/hda2 #console=ttyS1,9600 #for console system from serial port
initrd /boot/initrd-2.4.18-3.img
title Win2000
rootnoverify (hd0,0)
chainloader +1
--------------------------------------------------------------------------------------
說明:
I.預設開機選項,每個 title 代表一項開機選單 (而這裡 0 代表 RedHat Linux,1 代表 Win2000 )
default=0
II.開機選單等待時間(10表示10秒)
timeout=10
III.GRUB 密碼,詳細設定請看"註"說明
password --md5 $1$0BqX5/$D/MgNxFsg8oOsPsVz8EAN.
IV.選單的背景圖示,詳細設定請看"註"說明
splashimage=(hd0,1)/boot/grub/splash.xpm.gz
V.開機選單
title Red Hat Linux (2.4.18-3)
VI.設定 H.D 的 root paraition 所在位置.
第一個參數是開機 H.D BIOS setting 中的硬碟開機順序,不管是 IDE 或 SCSI H.D 皆是 hdx (x 是依據 BIOS setting 中的硬碟開機順序,0:第一顆,1:第二顆...........依序下去,這裡是設定成第一顆 H.D)
第二個參數就是開機 H.D root 的 partition (0:第一個 partition ,1:第二個 partition ...........依序下去)
root (hd0,1)
這個順序其實是參考了 /boot/grub/device.map 檔案
#cat /boot/grub/device.map
#this device map wasgenerated by anaconda
(fd0) /dev/fd0
(hd0) /dev/hda
VII.kernel,ramdisk 所在位址
kernel /boot/vmlinuz-2.4.18-3 ro root=/dev/hda2
initrd /boot/initrd-2.4.18-3.img
VIII.其他非 Linux 開機選單
title Win2000
不同於 root ,它並不會先驗證檔案系統
rootnoverify (hd0,0)
用來載入 Microsoft 的作業系統(如:DOS,Windows...)
chainloader +1
IVV.將開機以及核心信息轉向至 ComPort 來輸出,詳細設定請看"註"說明
serial = 1,9600n8 (ttyS1, 9600 bd, no parity, 8 bits)
或者
serial --unit=1 --speed=9600 --word=8 --parity=no --stop=1
terminal --timeout=10 serial console
當然核心這邊也要加入參數才能將信息轉向至 ComPort
kernel /boot/vmlinuz-2.4.18-3 ro root=/dev/hda2 console=ttyS1,9600
或
kernel /boot/vmlinuz-2.4.18-3 ro root=/dev/hda2 console=ttyS1,9600n8
註:
1.GRUB 設定檔
GRUB 設定檔是寫入就立即生效,不須像LILO需再回寫至MBR.
除非GRUB本來就不存在MBR,此時就要下指令
#grub-install /dev/hda
回寫至MBR
當我們的 H.D 裝置順序有誤錯時.要先修改 /boot/grub/device.map 檔案中硬碟的順序.
#cat /boot/grub/device.map
#this device map wasgenerated by anaconda
(fd0) /dev/fd0
(hd0) /dev/hda
請確定你要安裝的 GRUB 的 H.D 順序在 hd0
或者在使用 grub-install 加上參數--recheck
#grub-install --recheck /dev/hda
2.安裝系統後設定GRUB的密碼
GRUB的密碼是經過MD5的加密所以無法在grub.conf直接設定
所以有個指令用來幫我們的將密碼以MD5加密的方式呈現
#grub-md5-crypt
將加過密的密碼寫到/boot/grub/grub.conf檔,類似如下
password --md5 $1$0BqX5/$D/MgNxFsg8oOsPsVz8EAN.
設password對於一般boot選項是不會有差異的
如果你要對 boot 選項加參數,如進入signal user mode 時必須鍵入密碼,才能對 boot 選單加參數
就如同 lilio.conf 設定檔加入 restricted 一樣
3.GRUB 如何進入signal mode
在GRUB選單鍵入p打密碼(沒有設定密碼就不需要了),鍵入e 進行編輯,在kernel 選單鍵入e 進行編輯,後面再加 1(signal mode),2,3(level 3for text mode),5(level 5 for Xwindow) 等參數進入不同的runlevel.鍵入b去啟動系統
4.修改GRUB 的背景圖
看過 grub.conf 設定檔的會發現 splashimage=(hd0,1)/boot/grub/splash.xpm.gz 這一段設定,將他解開就是所們所看到的圖示了.所以我們也可以將自己的圖壓縮後覆蓋原先的 /boot/grub/splash.xpm.gz
方法如下:
grub 的背景圖是一張640x480.14色的xpm 檔案.準備好一張640x480 大小的圖,拿到Linux 用Gimp 編輯一下.我們要用gimp 把它存成14色並轉成xpm 檔案格式.首先最有問題的就是怎麼存成14色,我們用Gimp 打開圖片,對著圖片按右鍵「圖像」-->「模式」-->「索引色…」選下去,會跳出一個視窗…在視窗最上面有一個「產生最優它的調色盤」,後面有你目前圖片的顏色數,把你的顏色數改成14,然後按下「確定」. 這樣就完成更改成14色了.改好顏色之後的存檔,對著圖片按右鍵「檔案」-->「另存新檔…」會跳出視窗,視窗下方的「決定檔案類型」請按下選項…選擇「Xpm」.然後「確定」.圖檔即成.
再來改grub.conf 找出splashimage=(hd0,1)/grub/splash.xpm.gz
其中(hd0,1)指的就是你的/boot 目錄,所以預設圖檔位置是/boot/grub/splash.xpm.gz,假設我把圖檔放在/boot/xpm/phoenix.xpm 這個檔,我就把該行改成splashimage=(hd0,1)/xpm/phoenix.xpm 存檔離開,重開就行了.
note: splashimage 的圖檔可壓縮也可不壓縮,預設是一幅壓縮的圖檔,這裡的範例是使用不壓縮比較簡單.如果要壓縮,指令是gzip -9 xxx.xpm,然後就會變成xxx.xpm.gz 的壓縮圖檔了.壓縮後檔案大小大約只有原來的三分之一.
5.開機以及核心信息轉向
1. 安裝完你的作業系統
2.修改你的 BIOS(如果你的有支援 ) BIOS Redirection Port to [Serial 1 or Serial 2]
3. 還又修改你的 /boot/grub/grub.conf
default=0
timeout=10
#splashimage=(hd0,1)/boot/grub/splash.xpm.gz
serial --unit=0 --speed=19200
terminal --timeout=15 serial console
title linux
root (hd0, 0)
kernel /vmlinuz ro root=/dev/hda3 console=ttyS0,19200,vt100 #or ttyS1
initrd /initrd.img
其中黑色粗體字就是要加的設定.
這三行和GRUB輸出有關
#splashimage=(hd0,1)/boot/grub/splash.xpm.gz 因為文字模式下無法顯示任何圖片,所以要將這一行刪除或者註記(#)
serial --unit=1 --speed=19200
--unit 決定你的資料要從哪一個 comport 出去,unit=0(/dev/ttyS0),unit=1(/dev/ttyS1)
--speed 決定了傳輸速度
下面還有其他的參數可使用
--word=8 傳輸字元可以為7或8 bits
--parity =no 需要同位元檢查的就選 yes
--stop=1 需要停止位元就選 1
terminal --timeout=15 serial console
接下來這一行就會將 kernel 的訊息輸出至 comport
kernel /vmlinuz ro root=/dev/hda3 console=ttyS0,19200,vt100
4. 系統預設不能使用 comport 來登入系統 ,所以要修改一下 /etc/inittab, :
# Run gettys in standard runlevels
co:2345:respawn:/sbin/agetty ttyS0 19200 vt100
c1:2345:respawn:/sbin/agetty ttyS1 19200 vt100
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
加入黑色粗體的來允許系統能使用 comport 登入系統
5. 由於 PAM 的限制所以 root 無法使用 comport 登入系統 ,所以還是要修改一下 /etc/securetty:
ttyS0
ttyS1
6. 接下來要將 Null Modem 接在兩方的電腦, Linux 重新開機就可以不需要螢幕.所有的資料都將透過 comport 來傳送.
6.OS無法開機
當安裝完OS重開機時有時只會看到GRUB的提示字元就停住了,這有可能是不小心把grub裝錯硬碟,這時只能使用原光碟機開機來進行修復,如果還能進到 GRUB 本身提供bash like的操作介面,我們可以先手動將OS開起來再修改相關的設定
GRUB開機有4個步驟
I.指定磁碟機及分割區
#root (hd0,0)
II.指定開機核心及root file system
#kernel root=LABEL=/
III.載入initrd
#initrd
IV.執行開機
#boot
開機以後再修改grub相關設定
由於GRUB提供bash like的介面,當你在選擇kernel 及initrd-image檔名時可以試著按下tab鍵就可以自動幫你找出檔名
note:
對GRUB來說,GRUB上的磁碟機為第一顆硬碟為hd0,然後以此類推比如說系統上有hda sda sdb sdc,Grub如果在hda上面,對grub來說hda=hd0 sda=hd1 sdb=hd2 sdc=hd3假如我的系統是在sda上,/boot 在第一個分割區上那指定磁碟機的時候就是#roo (hd1,0)
更多的 GRUB 的使用請參考下面的網站.
http://www.gnu.org/software/grub/manual/
...........
前言:
GRUB 的載入可以分為三個階段 stage1,stage1.5 和 stage2
1.BIOS 會將硬碟的 MBR( 前512 bytes的開機管理程式)讀進記憶體中.這就是第一階段 (stage1) 他將有能力繼續做stage1.5以及stage2.
2.第一點五階段 (stage1.5) 會去找尋我的系統上 /boot 磁區.並且讀取 /boot 磁區上一些相關資料,所以此時已可以認識filesystem.
3.第二階段 (stage2) 會顯示 GRUB menu 以及 command 環境.GRUB的使用者介面允許使用者選取作業系統核心或將伊些參數傳給核心(kernel).
4.第二階段 (stage2) 會等待使用者選取一個作業系統核心(kernel 和 initrd)並將他讀入記憶體中.接下來就將控制權交由作業系統管理了.
GRUB 設定
#cat /etc/boot/grub/grub.conf
--------------------------------------------------------------------------------------------------
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,1)
# kernel /boot/vmlinuz-version ro root=/dev/hda2
# initrd /boot/initrd-version.img
#boot=/dev/hda
default=0
timeout=10
password --md5 $1$0BqX5/$D/MgNxFsg8oOsPsVz8EAN.
splashimage=(hd0,1)/boot/grub/splash.xpm.gz
#for console system from serial port
#serial = 1,9600n8 (ttyS1, 9600 bd, no parity, 8 bits)
title Red Hat Linux (2.4.18-3)
root (hd0,1)
kernel /boot/vmlinuz-2.4.18-3 ro root=/dev/hda2 #console=ttyS1,9600 #for console system from serial port
initrd /boot/initrd-2.4.18-3.img
title Win2000
rootnoverify (hd0,0)
chainloader +1
--------------------------------------------------------------------------------------
說明:
I.預設開機選項,每個 title 代表一項開機選單 (而這裡 0 代表 RedHat Linux,1 代表 Win2000 )
default=0
II.開機選單等待時間(10表示10秒)
timeout=10
III.GRUB 密碼,詳細設定請看"註"說明
password --md5 $1$0BqX5/$D/MgNxFsg8oOsPsVz8EAN.
IV.選單的背景圖示,詳細設定請看"註"說明
splashimage=(hd0,1)/boot/grub/splash.xpm.gz
V.開機選單
title Red Hat Linux (2.4.18-3)
VI.設定 H.D 的 root paraition 所在位置.
第一個參數是開機 H.D BIOS setting 中的硬碟開機順序,不管是 IDE 或 SCSI H.D 皆是 hdx (x 是依據 BIOS setting 中的硬碟開機順序,0:第一顆,1:第二顆...........依序下去,這裡是設定成第一顆 H.D)
第二個參數就是開機 H.D root 的 partition (0:第一個 partition ,1:第二個 partition ...........依序下去)
root (hd0,1)
這個順序其實是參考了 /boot/grub/device.map 檔案
#cat /boot/grub/device.map
#this device map wasgenerated by anaconda
(fd0) /dev/fd0
(hd0) /dev/hda
VII.kernel,ramdisk 所在位址
kernel /boot/vmlinuz-2.4.18-3 ro root=/dev/hda2
initrd /boot/initrd-2.4.18-3.img
VIII.其他非 Linux 開機選單
title Win2000
不同於 root ,它並不會先驗證檔案系統
rootnoverify (hd0,0)
用來載入 Microsoft 的作業系統(如:DOS,Windows...)
chainloader +1
IVV.將開機以及核心信息轉向至 ComPort 來輸出,詳細設定請看"註"說明
serial = 1,9600n8 (ttyS1, 9600 bd, no parity, 8 bits)
或者
serial --unit=1 --speed=9600 --word=8 --parity=no --stop=1
terminal --timeout=10 serial console
當然核心這邊也要加入參數才能將信息轉向至 ComPort
kernel /boot/vmlinuz-2.4.18-3 ro root=/dev/hda2 console=ttyS1,9600
或
kernel /boot/vmlinuz-2.4.18-3 ro root=/dev/hda2 console=ttyS1,9600n8
註:
1.GRUB 設定檔
GRUB 設定檔是寫入就立即生效,不須像LILO需再回寫至MBR.
除非GRUB本來就不存在MBR,此時就要下指令
#grub-install /dev/hda
回寫至MBR
當我們的 H.D 裝置順序有誤錯時.要先修改 /boot/grub/device.map 檔案中硬碟的順序.
#cat /boot/grub/device.map
#this device map wasgenerated by anaconda
(fd0) /dev/fd0
(hd0) /dev/hda
請確定你要安裝的 GRUB 的 H.D 順序在 hd0
或者在使用 grub-install 加上參數--recheck
#grub-install --recheck /dev/hda
2.安裝系統後設定GRUB的密碼
GRUB的密碼是經過MD5的加密所以無法在grub.conf直接設定
所以有個指令用來幫我們的將密碼以MD5加密的方式呈現
#grub-md5-crypt
將加過密的密碼寫到/boot/grub/grub.conf檔,類似如下
password --md5 $1$0BqX5/$D/MgNxFsg8oOsPsVz8EAN.
設password對於一般boot選項是不會有差異的
如果你要對 boot 選項加參數,如進入signal user mode 時必須鍵入密碼,才能對 boot 選單加參數
就如同 lilio.conf 設定檔加入 restricted 一樣
3.GRUB 如何進入signal mode
在GRUB選單鍵入p打密碼(沒有設定密碼就不需要了),鍵入e 進行編輯,在kernel 選單鍵入e 進行編輯,後面再加 1(signal mode),2,3(level 3for text mode),5(level 5 for Xwindow) 等參數進入不同的runlevel.鍵入b去啟動系統
4.修改GRUB 的背景圖
看過 grub.conf 設定檔的會發現 splashimage=(hd0,1)/boot/grub/splash.xpm.gz 這一段設定,將他解開就是所們所看到的圖示了.所以我們也可以將自己的圖壓縮後覆蓋原先的 /boot/grub/splash.xpm.gz
方法如下:
grub 的背景圖是一張640x480.14色的xpm 檔案.準備好一張640x480 大小的圖,拿到Linux 用Gimp 編輯一下.我們要用gimp 把它存成14色並轉成xpm 檔案格式.首先最有問題的就是怎麼存成14色,我們用Gimp 打開圖片,對著圖片按右鍵「圖像」-->「模式」-->「索引色…」選下去,會跳出一個視窗…在視窗最上面有一個「產生最優它的調色盤」,後面有你目前圖片的顏色數,把你的顏色數改成14,然後按下「確定」. 這樣就完成更改成14色了.改好顏色之後的存檔,對著圖片按右鍵「檔案」-->「另存新檔…」會跳出視窗,視窗下方的「決定檔案類型」請按下選項…選擇「Xpm」.然後「確定」.圖檔即成.
再來改grub.conf 找出splashimage=(hd0,1)/grub/splash.xpm.gz
其中(hd0,1)指的就是你的/boot 目錄,所以預設圖檔位置是/boot/grub/splash.xpm.gz,假設我把圖檔放在/boot/xpm/phoenix.xpm 這個檔,我就把該行改成splashimage=(hd0,1)/xpm/phoenix.xpm 存檔離開,重開就行了.
note: splashimage 的圖檔可壓縮也可不壓縮,預設是一幅壓縮的圖檔,這裡的範例是使用不壓縮比較簡單.如果要壓縮,指令是gzip -9 xxx.xpm,然後就會變成xxx.xpm.gz 的壓縮圖檔了.壓縮後檔案大小大約只有原來的三分之一.
5.開機以及核心信息轉向
1. 安裝完你的作業系統
2.修改你的 BIOS(如果你的有支援 ) BIOS Redirection Port to [Serial 1 or Serial 2]
3. 還又修改你的 /boot/grub/grub.conf
default=0
timeout=10
#splashimage=(hd0,1)/boot/grub/splash.xpm.gz
serial --unit=0 --speed=19200
terminal --timeout=15 serial console
title linux
root (hd0, 0)
kernel /vmlinuz ro root=/dev/hda3 console=ttyS0,19200,vt100 #or ttyS1
initrd /initrd.img
其中黑色粗體字就是要加的設定.
這三行和GRUB輸出有關
#splashimage=(hd0,1)/boot/grub/splash.xpm.gz 因為文字模式下無法顯示任何圖片,所以要將這一行刪除或者註記(#)
serial --unit=1 --speed=19200
--unit 決定你的資料要從哪一個 comport 出去,unit=0(/dev/ttyS0),unit=1(/dev/ttyS1)
--speed 決定了傳輸速度
下面還有其他的參數可使用
--word=8 傳輸字元可以為7或8 bits
--parity =no 需要同位元檢查的就選 yes
--stop=1 需要停止位元就選 1
terminal --timeout=15 serial console
接下來這一行就會將 kernel 的訊息輸出至 comport
kernel /vmlinuz ro root=/dev/hda3 console=ttyS0,19200,vt100
4. 系統預設不能使用 comport 來登入系統 ,所以要修改一下 /etc/inittab, :
# Run gettys in standard runlevels
co:2345:respawn:/sbin/agetty ttyS0 19200 vt100
c1:2345:respawn:/sbin/agetty ttyS1 19200 vt100
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
加入黑色粗體的來允許系統能使用 comport 登入系統
5. 由於 PAM 的限制所以 root 無法使用 comport 登入系統 ,所以還是要修改一下 /etc/securetty:
ttyS0
ttyS1
6. 接下來要將 Null Modem 接在兩方的電腦, Linux 重新開機就可以不需要螢幕.所有的資料都將透過 comport 來傳送.
6.OS無法開機
當安裝完OS重開機時有時只會看到GRUB的提示字元就停住了,這有可能是不小心把grub裝錯硬碟,這時只能使用原光碟機開機來進行修復,如果還能進到 GRUB 本身提供bash like的操作介面,我們可以先手動將OS開起來再修改相關的設定
GRUB開機有4個步驟
I.指定磁碟機及分割區
#root (hd0,0)
II.指定開機核心及root file system
#kernel root=LABEL=/
III.載入initrd
#initrd
IV.執行開機
#boot
開機以後再修改grub相關設定
由於GRUB提供bash like的介面,當你在選擇kernel 及initrd-image檔名時可以試著按下tab鍵就可以自動幫你找出檔名
note:
對GRUB來說,GRUB上的磁碟機為第一顆硬碟為hd0,然後以此類推比如說系統上有hda sda sdb sdc,Grub如果在hda上面,對grub來說hda=hd0 sda=hd1 sdb=hd2 sdc=hd3假如我的系統是在sda上,/boot 在第一個分割區上那指定磁碟機的時候就是#roo (hd1,0)
更多的 GRUB 的使用請參考下面的網站.
http://www.gnu.org/software/grub/manual/
...........
訂閱:
文章 (Atom)
-
昨天差點昏倒, 因為Chrome Browser一開啟後居然一片白畫面. 雖然還有IE可以用, 但就是習慣Chrome了啊, 然後開始Google別人如何解決, 不過看起來不少人遇到相同的問題, 但都沒什麼解決方法. 什麼掃毒啦, 重新安裝Chrome啦, 砍掉Default啦....
-
股市之神是川銀藏 從30歲的70日元開始投資,到成為叱吒風雲的日本股神,是川銀藏僅小學畢業,卻憑著在股市的驚人業績設立「是川經濟研究所」,登上大學教壇。他以「只吃八分飽」、「烏龜三原則」與「股票投資五原則」的簡單哲學屢創股市奇蹟。 只吃八分飽 是川認為,投資股票賣出比買進要難得多...
-
I/O mapped I/O(port-mapped I/O或Direct I/O) I/O與memory均擁有自己的記憶體空間 需要特別的指令來處理I/O 好處是完全不用考慮記憶體空間被I/O佔用,缺點需要額外的指令專門處理I/O存取。 Memory Mapped I/O I/...
一個小故事讓我們明白資金流通的意義
“又是炎熱小鎮慵懶的一天。太陽高掛,街道無人,每個人都債台高築,靠信用度日。這時,從外地來了一位有錢的旅客,他進了一家旅館,拿出一張1000 元鈔票放在櫃檯,說想先看看房間,挑一間合適的過夜,就在此人上樓的時候---- 店主抓了這張1000 元鈔,跑到隔壁屠戶那裡支付了他欠的肉錢...