當前位置:首頁 » 編程軟體 » linux編譯畫圓

linux編譯畫圓

發布時間: 2024-01-31 11:36:33

1. 求linux下漢諾塔程序詳細解釋~~

不要把簡單問題復雜化,漢諾塔其實很簡單,通過它你關鍵在理解遞歸原理就行,何必糾結於這些讓人費解的上面的垃圾代碼!
漢諾塔程序如下:
#include <iostream>
#include <string>
using namespace std;
int sum=0;
/*
* 為了移動A上面的圓盤到C上面,僅能藉助B:
* 首先由A將n-1個較小的圓盤移至B,
* 然後將A上剩下的上最大的圓盤移至C,
* 最後再將B上n-1個較小的圓盤移至C
*/
void Hanoi(int n,string A,string B,string C)
{
if(n==1)
cout<<"move "<<A<<" to "<<C<<endl;
else
{
Hanoi(n-1,A,C,B);
cout<<"move "<<A<<" to "<<C<<endl;
Hanoi(n-1,B,A,C);
}
++sum;
}
int main()
{
Hanoi(3,"A","B","C");
cout<<"The sum step is "<<sum<<endl;
return 0;
}

2. linux編譯內核步驟

一、准備工作
a) 首先,你要有一台PC(這不廢話么^_^),裝好了Linux。
b) 安裝好GCC(這個指的是host gcc,用於編譯生成運行於pc機程序的)、make、ncurses等工具。
c) 下載一份純凈的Linux內核源碼包,並解壓好。

注意,如果你是為當前PC機編譯內核,最好使用相應的Linux發行版的源碼包。

不過這應該也不是必須的,因為我在我的Fedora 13上(其自帶的內核版本是2.6.33.3),就下載了一個標準的內核linux-2.6.32.65.tar.xz,並且順利的編譯安裝成功了,上電重啟都OK的。不過,我使用的.config配置文件,是Fedora 13自帶內核的配置文件,即/lib/moles/`uname -r`/build/.config

d) 如果你是移植Linux到嵌入式系統,則還要再下載安裝交叉編譯工具鏈。

例如,你的目標單板CPU可能是arm或mips等cpu,則安裝相應的交叉編譯工具鏈。安裝後,需要將工具鏈路徑添加到PATH環境變數中。例如,你安裝的是arm工具鏈,那麼你在shell中執行類似如下的命令,假如有類似的輸出,就說明安裝好了。
[root@localhost linux-2.6.33.i686]# arm-linux-gcc --version
arm-linux-gcc (Buildroot 2010.11) 4.3.5
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for ing conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
註:arm的工具鏈,可以從這里下載:回復「ARM」即可查看。

二、設置編譯目標

在配置或編譯內核之前,首先要確定目標CPU架構,以及編譯時採用什麼工具鏈。這是最最基礎的信息,首先要確定的。
如果你是為當前使用的PC機編譯內核,則無須設置。
否則的話,就要明確設置。
這里以arm為例,來說明。
有兩種設置方法():

a) 修改Makefile
打開內核源碼根目錄下的Makefile,修改如下兩個Makefile變數並保存。
ARCH := arm
CROSS_COMPILE := arm-linux-

注意,這里cross_compile的設置,是假定所用的交叉工具鏈的gcc程序名稱為arm-linux-gcc。如果實際使用的gcc名稱是some-thing-else-gcc,則這里照葫蘆畫瓢填some-thing-else-即可。總之,要省去名稱中最後的gcc那3個字母。

b) 每次執行make命令時,都通過命令行參數傳入這些信息。
這其實是通過make工具的命令行參數指定變數的值。
例如
配置內核時時,使用
make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
編譯內核時使用
make ARCH=arm CROSS_COMPILE=arm-linux-

注意,實際上,對於編譯PC機內核的情況,雖然用戶沒有明確設置,但並不是這兩項沒有配置。因為如果用戶沒有設置這兩項,內核源碼頂層Makefile(位於源碼根目錄下)會通過如下方式生成這兩個變數的值。
SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
-e s/arm.*/arm/ -e s/sa110/arm/ \
-e s/s390x/s390/ -e s/parisc64/parisc/ \
-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
-e s/sh[234].*/sh/ )
ARCH?= $(SUBARCH)
CROSS_COMPILE ?=

經過上面的代碼,ARCH變成了PC編譯機的arch,即SUBARCH。因此,如果PC機上uname -m輸出的是ix86,則ARCH的值就成了i386。

而CROSS_COMPILE的值,如果沒配置,則為空字元串。這樣一來所使用的工具鏈程序的名稱,就不再有類似arm-linux-這樣的前綴,就相當於使用了PC機上的gcc。

最後再多說兩句,ARCH的值還需要再進一步做泛化。因為內核源碼的arch目錄下,不存在i386這個目錄,也沒有sparc64這樣的目錄。

因此頂層makefile中又構造了一個SRCARCH變數,通過如下代碼,生成他的值。這樣一來,SRCARCH變數,才最終匹配到內核源碼arch目錄中的某一個架構名。

SRCARCH := $(ARCH)

ifeq ($(ARCH),i386)
SRCARCH := x86
endif

ifeq ($(ARCH),x86_64)
SRCARCH := x86
endif

ifeq ($(ARCH),sparc64)
SRCARCH := sparc
endif

ifeq ($(ARCH),sh64)
SRCARCH := sh
endif

三、配置內核

內核的功能那麼多,我們需要哪些部分,每個部分編譯成什麼形式(編進內核還是編成模塊),每個部分的工作參數如何,這些都是可以配置的。因此,在開始編譯之前,我們需要構建出一份配置清單,放到內核源碼根目錄下,命名為.config文件,然後根據此.config文件,編譯出我們需要的內核。

但是,內核的配置項太多了,一個一個配,太麻煩了。而且,不同的CPU架構,所能配置的配置項集合,是不一樣的。例如,某種CPU的某個功能特性要不要支持的配置項,就是與CPU架構有關的配置項。所以,內核提供了一種簡單的配置方法。

以arm為例,具體做法如下。

a) 根據我們的目標CPU架構,從內核源碼arch/arm/configs目錄下,找一個與目標系統最接近的配置文件(例如s3c2410_defconfig),拷貝到內核源碼根目錄下,命名為.config。

注意,如果你是為當前PC機編譯內核,最好拷貝如下文件到內核源碼根目錄下,做為初始配置文件。這個文件,是PC機當前運行的內核編譯時使用的配置文件。
/lib/moles/`uname -r`/build/.config
這里順便多說兩句,PC機內核的配置文件,選擇的功能真是多。不編不知道,一編才知道。Linux發行方這樣做的目的,可能是想讓所發行的Linux能夠滿足用戶的各種需求吧。

b) 執行make menuconfig對此配置做一些需要的修改,退出時選擇保存,就將新的配置更新到.config文件中了。

3. 請問linux系統中inode和block的關系

1. inode和block
---------------------------------

提到inode,我們不得不先介紹硬碟的整體結構。硬碟中包含多個硬碟碟片,硬碟碟片為圓形,每個硬碟碟片都有一個可以讀寫的磁頭(Head),將這個磁
頭固定,使硬碟碟片旋轉一周,所走軌跡就是磁軌(Track)。硬碟內所有碟片的相同磁軌號的集合成為磁柱(Cylinder)。每一磁軌被劃分成許多區
域,每個區域叫一個扇區(Sector)。扇區是硬碟的最小存儲物理量,一個扇區的存儲容量大約是512位元組(約0.5K)。

知道了硬碟的大體結構之後,再來談談怎麼進行硬碟分區。進行硬碟分割的最小單位是磁柱,分割完之後自然就是格式化(format)。在Linux中進行格式化必須考慮Block與inode,Block還好理解,它是磁碟可以記錄的最小單位,是由數個扇區組成,所以大小通常為n*512Bytes,例如4K。

那麼inode是什麼呢Block是記錄文件內容的區域,inode則是記錄該文件的屬性及其放置在哪個Block之內的信息。所
以,每個文件都會佔用一個inode。當Linux系統要查找某個文件時,它會先搜索雀咐inode
table找到這個文件的屬性及數據存放地點,然後再查找數據存放的Block進而將數據取出。inode數量在一開始已被設定好,其設定方式通常是"硬
盤大小/一個容量",這個容頃嘩純量比Block大一些較佳,例如剛才將Block設為4K,那麼這個容量可以設為8K左右。所以,一塊1GB的硬碟如果以8K
大小劃分它的inode數,則會有131072個inode。一個inode的大小為128Byte,這樣,我們就可以清楚地知道,一個分區被格式化為一個文件系統之後,基本上它一定會有inode table與數據區域兩大塊,一個用來記錄文件的屬性信息與該文件存放的Block塊,一個用來記錄文件的內容。

2. 硬鏈接
---------------------------------
剛才說過,當系統要讀取某個文件時,它會先讀inode
table,然後根據inode的信息到數據區域將數據取出備用。硬鏈接就是再建立一個inode鏈接到文件放置的Block塊。也就是說,進行硬鏈接
時,實際上您的文件內容不會改變,只是原來的inode與後來添加的inode均可指定到該文件存放的地點,因此,讀取兩個inode的結果都是讀取同一
個文件的內容。不過,這樣一來就有個問題,因為inode會鏈接到Block塊,而"目錄"本身僅消耗inode,這樣,硬鏈接就不能鏈接目錄。所以,硬蘆純
鏈接有兩個最大的限制:
(1) 不能跨文件系統,因為不同的文件系統有不同的inode table;
(2) 不能鏈接目錄。

3. 軟鏈接(符號鏈接)
---------------------------------
相對於硬鏈接,符號鏈接比較好理解,基本上,它是再建立一個獨立文件,而這個文件會讓數據讀取操作指向它鏈接的那個文件。由於只是利用文件作為指向的動作,所以,當源文件被刪除,符號鏈接的文件就打不開了,屏幕會顯式"無法開啟某文件"。
因此,硬鏈接比較安全,因為即某一個inode被刪除,只要還有一個inode,該文件就能被找到。

4. 分區和文件系統
---------------------------------
磁碟分割的重點了: 也就是記錄每一個分割區(Partition)的起始與結束磁柱。好了,那麼這個分割區的起始與結束磁柱的信息放在哪裡呢? 存放在Master Boot Recorder(MBR)

告知系統分割區所在的起始與結束磁柱之後,接著需要將分割區格式化為操作系統認識的文件系統(Filesystem)。因為每個操作系統認識的文件系統並不相同,所以要針對操作系統來格式化分割區 。

一個分割區就是一個文件系統。硬碟的最小儲存單位是扇區(Sector),不過數據儲存的最小單位並不是扇區,因為用
扇區來存儲數據效率低下。因為一個扇區只有512Bytes,而磁頭是一個扇區一個扇區地讀取數據,如果文件有10MBytes,那麼為了讀這個文件,磁
頭必須要進行20480次讀取(I/O)操作。

為了克服這個效率上的困擾,引入了邏輯區塊(Block)。邏輯區塊是在對分割區進行格式化時,所指定的數據最小儲存單位,這個最小儲存單位是建立在扇區
的大小之上的(因為扇區是硬碟的最小物理儲存單位),所以,邏輯區塊的大小為扇區
的2的次方倍數。此時,磁頭一次可以讀取一個邏輯區塊(若干個連續的扇區),如果在格式化時,指定邏輯區塊為4KBytes(亦8個連續的扇區構成一個邏
輯區塊),那麼同樣一個10MBytes的文件,磁頭要讀取的次數則為2560次,可以大幅提高文件的讀取效率。

不過,邏輯區塊單位的規劃並不是越大越好。因為一個邏輯區塊最多僅能容納一個文件。假如邏輯區塊規劃為4KBytes,而一個文件大小為
0.1KBytes,這個小文件將佔用一個邏輯區塊的空間,該邏輯區塊雖然可以容納4Kbytes的容量,然而由於文件只佔用了0.1Kbytes,所
以,實際上剩下的3.9KBytes是不能再被使用了。在考慮邏輯區塊的規劃時,需要同時考慮到:
* 文件讀取的效率
* 文件大小可能造成的硬碟空間浪費

因此,在規劃磁碟時,需要根據主機的用途來進行規劃較佳。例如BBS主機由於文章較短, 邏輯區塊小一點的好;而如果主機主要用在儲存大容量的文件,那麼考慮到效率,邏輯區塊規劃的大一點會比較妥當。

熱點內容
createsqlview 發布:2024-11-16 11:59:22 瀏覽:120
如何用js在伺服器端運算 發布:2024-11-16 11:52:49 瀏覽:640
vbtxt文件加密 發布:2024-11-16 11:47:27 瀏覽:629
mountlinux共享文件夾 發布:2024-11-16 11:42:22 瀏覽:686
杭州防潮存儲櫃 發布:2024-11-16 11:40:17 瀏覽:962
phpimplode 發布:2024-11-16 11:27:20 瀏覽:562
端游網易版我的世界決戰斗羅伺服器 發布:2024-11-16 11:14:37 瀏覽:21
byte類型c語言 發布:2024-11-16 11:07:28 瀏覽:578
androidview設置高度 發布:2024-11-16 10:52:26 瀏覽:489
cryptopythondes 發布:2024-11-16 10:52:15 瀏覽:878