2007年7月17日 星期二

好文章備份 -- Minix開機程序

引用自http://blog.csdn.net/TinyJoy/archive/2006/02/22/606299.aspx

Minix引导过程分析

由于Minix引导过程不属于操作系统,《操作系统设计与实现》一书中没有对其进行详细的分析和说明。
Andrew Swartzbaugh 和 Brent Johnson 的网站对引导过程所涉及的六个代码文件进行了详细的分析。
我觉得有必要对其进行一些翻译,以利于进一步的学习。正如网站上说的,通过阅读6个文件的代码,
不仅可以了解Minix的引导过程,而且对于理解操作系统中的汇编语言也很有帮助。
本文的代码来自Minix当前的最新版本2.0.4。其中一些部分与2.0.0版有所不同。

当系统启动时,硬件将软盘或硬盘的第一个扇区载入到内存的LOADOFF位置,
这实际上是ROM BIOS的工作,与操作系统无关。
对于Minix,第一次载入的程序可能是 masterboot.s 或者 bootblock.s。

对于有分区的硬盘,它的第一个扇区是MBR(master boot record),其中包含有代码和分区表。
如果分区里有子分区,则在分区的第一个扇区也有MBR。MBR也可以被拷贝到软盘的第一个扇区。
masterboot.s 就存放在MBR中。
如果 masterboot.s 被载入,它的任务就是找到引导分区(或软盘),
从而加载该分区(或软盘)的第一个扇区并跳转至该处运行。

在引导分区或软盘的第一个扇区存放有Minix的初级引导程序,即 bootblock.s。
它同样是被加载到LOADOFF位置,它的任务是将boot monitor(Minix的次级引导程序)加载到内存,
并将控制转给boot monitor。

boot monitor由(boothead.s,boot.c,bootimage.c,rawfs.c)四个文件组成。
boot monitor的主要任务是加载Minix或其他操作系统。

boothead.s是boot monitor的入口,并提供一些底层支持(主要是调用BIOS中断)。
当bootblock.s跳转到boot monitor,boothead的代码就开始执行。
这些代码确定内存布局,处理器类型(286,386,486等),当前显示模式以及被加载的设备,
并最终调用函数 boot() (在boot.c中)。
boothead.s还提供了退出monior,确定设备参数,在盘中读写数据,从键盘和屏幕读写字符的函数。
跳转到Minix的代码(包括从实模式转到保护模式)也在boothead.s中。

boot.c提供monitor中的高层函数。
其中最高层的是 boot()。boot() 调用函数 initialize() (同样在boot.c中)。
initialize()转移boot monitor并将它从传递给内核的内存表中删去(以防内核覆盖boot monitor)。
boot()接下来调用下列函数:

1) get_parameters()(在boot.c中)设置一些环境变量和函数并
从bootparams扇区(引导分区的第二个扇区)中读取一些参数的值。

2) r_super()(在rawfs.c中)证实系统是minix文件系统并确定文件系统的参数。

在这两个函数返回后系统将执行用户输入的命令,其中最重要的命令是boot。

bootimage.c的主要函数是 bootminix(),当用户输入boot命令时将调用此函数。
bootminix()调用下列函数:

1) select_image()在盘中找到所需的内核镜像。

2) exec_image()将内核镜像加载到内存,
然后调用minix()(在boothead.s)转到保护模式(如果内核在保护模式中编译)并跳至内核。

当操作系统返回boot monitor时(如用户使用shutdown命令),bootminix()返回。

以上的文件都存放在/usr/src/boot文件夹中。该文件夹中还有一些提供辅助功能的函数:

如果内核镜像所在的硬盘存在minix文件系统,在引导过程中必定要涉及文件系统的相关操作。
在操作系统的文件系统模块还无法使用的情况下,引导程序必须提供一系列函数以实现对文件系统的操作。
这些函数被集中放在 rawfs.c 中。

installboot.c 不属于引导程序。
它的功能是将引导程序和内核写入磁盘并使其可引导。

2007年5月28日 星期一

[讀書小心得] 好文章備份--uClinux 2.6

一樣,備份一下嘍

文章出處:http://www.linuxuser.com.tw/power/list2.php?id=2157
不過他似乎也是從別的地方轉過去的

------------------------------------------------------------------
BACK>>
獲取常見的uClinux/ARM 2.6
獲取常見的uClinux/ARM 2.6
原文出自:http://adam.kaist.ac.kr/~hschoe/Get...inuxARM2_6.html

作者:Hyok S.Choi

翻譯:renbagshoes
轉載請注明www.linuxsir.org,謝謝!

一、使用uClinux/ARM 2.6的原因?
為什麼你要使用uClinux?有很多的理由使uClinux做為你的嵌入式作業系統。其中大部分認為uClinux有以下好處:

輕便
你可以編譯linux2.6的內核得到一個300k以下的內核鏡像,它包括終端和一些基本的設備驅動以及唯讀檔案系統。並且flat格式的二進位zImage和應用程式要比linux傳統使用的ELF二進位小30%--50%,由於使用了較少的標準的C和C++庫。

XIP(execution in place)
你能通過XIP來在一個較小的RAM時執行你的內核鏡像,甚至是應用程式。它能幫助你快速的啟動,儘管flash的存取時間或是rom啟動鏡像足夠快以及有足夠的緩存大小。(如果我們想找到它們最優化的平衡點,可以交換兩者之間這些變數。)

便宜
MMU(記憶體管理單元)核心大小大約占典型的ARM SoC(System-on-Chip單片機)wafer(晶體)的30%。在典型的網路和嵌入式系統裏有一半以上的應用程式不需要MMU。甚至如果只有 一個CPU的許多RTOS(即時操作系統)在默認情況下也不使用MMU。

完全的Linux應用程式介面
除少數情況外,你可以在uClinux平臺上完全使用Linux應用程式介面。你能在uClibc裏使用多線程以及使用標準的系統調用。在用戶盤裏的uClinux發佈包裏有大量的應用程式
被移植到了uClinux系統上。

Easiar to adapt
在uClinux性能裏有一個有趣的特性,是應用程式可以訪問整個系統,包括設備裏的寄存器,with a bit of wrapper ,我們能 製作固件代碼做為無格式的 應用程式運 行在 uClinux上!當然,你能加一些設備驅動和系統調用來調用以及使用許多打開的Ips在混和的舊的固件代碼裏。如果你計畫移動你的固件代碼到 linux,但你沒有熟悉的linux系統程式,uClinux是一個很好的出發點;-)

完全的linux2.6內核的特性
儘管uClinux很小,但它支持linux2.6內核約定的全部的特性,包括內核優先順序特性以及許多的檔系統,設備驅動。為linux約定設備驅動埠是容易實現的。幾乎所有的代碼不需要改變就可以編譯,除了從虛擬位址到物理的記憶體鏡像外。

注:上面的部分由於涉及的概念太多,翻譯的不大好,請大家指正,謝謝。

二、初次編譯uClinux/ARM2.6指南
如果你決定使用uClinux做為開發環境,那麼下面的部分將會讓uClinux運行在你的linux PC機上:

1、獲得uClinux發佈包
一個最容易得到uClinux的發佈包的方法是直接訪問uClinux.org站點:
http://www.uclinux.org/pub/uClinux/dist/

注意這裏發佈的內核版本可能不是最新的,但你能找到一個最新的補丁以及從kernel.org站點上找一個對應的linux內核版本來製作一個最新的 uClinux內核。此時(2004年05月25日)可從“http://www.uclinux.org/pub/uClinux/dist”獲得最新 的發佈包的版本是uClinux-dist.20040408.tar.gz。如果你對編譯軟體不是很熟悉,那麼根據這個指南你將會很容易的使用這個分佈 包來製作你的uClinux內核或是升級它到最新的版本。

2、獲得最新的內核及補丁
你能到這裏找到最新的uClinux/ARM內核補丁:

http://adam.kaist.ac.kr/~hschoe/

在下載的部分,你將會找到“linux-2.6.x-hscx.patch.gz”最新的鏈結,以及原始的內核包:

http://adam.kaist.ac.kr/~hschoe/dow...5-hsc2.patch.gz

http://www.kernel.org/pub/linux/ker...x-2.6.5.tar.bz2

3、ARM-ELF工具鏈
從linux2.6內核代碼使用了一些更新的binutils新特性以來,你需要一個比uclinux.org站點上更新的ARM-ELF工具鏈來編譯內核。你能夠從上面的與下載內核和補丁相同的download部分找到最新的工具鏈,就在當前的鏈結下:

http://adam.kaist.ac.kr/~hschoe/dow...ols-20040427.sh

4、硬體平臺或是一個ARMulator(ARM仿真)
當然你需要一個平臺來運行uClinux內核,請首先看一下注意事項裏有那些平臺被支持。即使你不能找到適用於你的平臺,或是你沒有任何的硬體平臺,那你 也能在你的linux PC機上運行這個內核:使用ARMulator(ARM仿真)。ARMulator是一個以GDB調試器為基礎的仿 真,這個仿真完全支持Atmel AT91x和arm7tdmi EB01。ARMulator的主頁在這:

http://www.uclinux.org/pub/uClinux/utilities/armulator/

你也能直接從這裏下載:

http://www.uclinux.org/pub/uClinux/...gdb-5.0.tar.bz2(原始gdb-5.0包)
http://www.uclinux.org/pub/uClinux/...021127.patch.gz(gdb-5.0所依賴的補丁)

如果你想在ARMulator上運行內核的ramdisk(虛擬磁片),那麼你就需要從這下載另外一個套裝軟體:

http://adam.kaist.ac.kr/~hschoe/dow...040412.patch.gz


5、如果你是初次編譯這些發佈包的話,OK!從這我們將會一步一步的進行
(現在把上面所下載的套裝軟體都發在/root/incoming目錄裏)
(On this guide, the downloaded files are gathered on ~/incoming and the ARMulator is used for platform to run on.)

6、安裝工具鏈
以root用戶來執行arm-elf-tools-20040427.sh,像這樣:

[root@hyoklinux /]#/bin/sh ~/incoming/arm-elf-tools-20040427.sh

注:~是你的root用戶目錄,當然也可以選擇別的目錄,但這取決於你的第5步所設置的目錄。

你將看到被安裝檔的列表,這個工具鏈的可執行的二進位檔被安裝到了/usr/local/bin目錄裏,所以你的環境變數的搜索路徑應包括這個目錄,通常使用的發行版像redhat等已經將這個路徑包括在$PATH變數裏,可以用下面的命令查看一下:

[root@hyoklinux /]#echo $PATH

7、釋放uClinux發佈包
在一個有2GB空間的目錄裏來釋放uclinux發佈包

[root@hyoklinux /]# tar -zxvf ~/incoming/uClinux-dist-20040408.tar.gz

讓我們看看uClinux-dist目錄裏有什麼檔

[root@hyoklinux /]# cd uClinux-dist/
[root@hyoklinux uClinux-dist]# ls -al
total 104
drwxr-xr-x 15 1000 users 4096 Apr 8 09:27 .
drwxr-xr-x 28 root root 4096 Apr 27 20:32 ..
-rw-r--r-- 1 1000 users 18007 Apr 8 09:13 COPYING
drwxr-xr-x 3 1000 users 4096 Apr 8 09:13 Documentation
-rw-r--r-- 1 1000 users 9305 Apr 8 09:13 Makefile
-rw-r--r-- 1 1000 users 4934 Apr 8 09:13 README
-rw-r--r-- 1 1000 users 1743 Apr 8 09:13 SOURCE
drwxr-xr-x 2 1000 users 4096 Apr 15 15:19 bin
drwxr-xr-x 3 1000 users 4096 Apr 8 09:27 config <-- 為本地用戶提供的配置檔以及其他的
drwxr-xr-x 11 1000 users 4096 Apr 8 09:27 freeswan <-- IPsec的實現
drwxr-xr-x 68 1000 users 4096 Apr 8 09:23 glibc <-- GNU C庫
drwxr-xr-x 18 1000 users 4096 Apr 8 09:28 lib <-- 許多移植到uClinux的庫,包括uC-libc.
drwxr-xr-x 15 1000 users 4096 Apr 8 09:27 linux-2.0.x <-- uClinux 2.0.x kernel
drwxr-xr-x 16 1000 users 4096 Apr 8 09:27 linux-2.4.x <-- uClinux 2.4.x kernel
drwxr-xr-x 18 1000 users 4096 Apr 8 09:27 linux-2.6.x <-- uClinux 2.6.x kernel
drwxr-xr-x 3 1000 users 4096 Apr 8 09:26 tools <-- 安裝romfs提供的程式以及其他的
drwxr-xr-x 17 1000 users 4096 Apr 8 09:27 uClibc <-- uClibc可從uclibc.org找到,與uC-libc不同.
drwxr-xr-x 174 1000 users 4096 Apr 8 09:27 user <-- the“userland”被移植的應用程式
drwxr-xr-x 44 1000 users 4096 Apr 8 09:27 vendors <-- 每一個vendor/models的配置檔

注:vendor(電腦銷售商)
models(模型)

8、用這些檔製作出一個新的linux-2.6.x內核

在20040408發佈包目錄裏的linux-2.6.x是由內核“linux-2.6.2”和補丁“linux-2.6.2-uc0”生成的。而 uClinux/ARM2.6需要更新的內核版本(如linux-2.6.5 + linux-2.6.5-hsc2.patch)。

[root@hyoklinux uClinux-dist]# tar -jxvf ~/incoming/linux-2.6.5.tar.bz2

現在我們得到了整個的linux-2.6.5源代碼,以及所需的內核補丁。

[root@hyoklinux uClinux-dist]# gzip -dc ~/incoming/linux-2.6.5-hsc2.patch.gz | patch -p0

運行上面的命令後,你將會看到一些補丁目錄裏包含有“armnommu”的字串的代碼。你可以在你的uClinux 2.6內核裏使用“linux-2.6.5”的目錄名,這不是必需的。然而,我覺得使用“linux-2.6.x”這個名字會更方便些。

因此你現在不需要原來uClinux目錄裏的linux-2.6.x(即那個linux-2.6.2-uc0),執行:

[root@hyoklinux uClinux-dist]# rm -rf linux-2.6.x/

然後我們將重命名更新補丁的內核目錄名為“linux-2.6.x”,執行:

[root@hyoklinux uClinux-dist]# mv linux-2.6.5 linux-2.6.x

9、確定配置檔

當前的uClinux發佈包不包含有關於uClinux/ARM2.6完整的配置檔。我們需要簡單的修改一下,ARMulator默認的配置檔在vendors/GDB/ARMulator目錄下面。我們能像下面這樣來修改它:

[root@hyoklinux uClinux-dist]# cp linux-2.6.x/arch/armnommu/configs/GDB_ARMulator_defconfig \ vendors/GDB/ARMulator/config.linux-2.6.x

為了rootfs能使用ramdisk,我們需要修改一下配置目錄裏的“rc”這個檔,這樣就可以使用1號的ramdisk設備了。
(原文:Since we'll use a ramdisk for the rootfs, we need to fix the “rc” in the configuration directory to use ramdisk device number 1)

像下面這樣編輯vendors/GDB/ARMulator/rc這個檔:
[root@hyoklinux uClinux-dist]# vim vendors/GDB/ARMulator/rc

hostname GDB-ARMulator
/bin/expand /etc/ramfs.img /dev/ram1
mount -t proc proc /proc
mount -t ext2 /dev/ram1 /var
mkdir /var/tmp
mkdir /var/log
mkdir /var/run
mkdir /var/lock
mkdir /var/empty
cat /etc/motd


10、配置內核和安裝用戶應用程式

[root@hyoklinux uClinux-dist]# make menuconfig

首先在“Main Menu”找到“Vendor/Product”所在行,選擇“GDB/ARMulator”,像這樣:

--- Select the Vendor you wish to target
(GDB) Vendor
--- Select the Product you wish to target
(ARMulator) GDB Products

你可以按'esc'鍵或是“Exit”按鈕返回主功能表。

在主功能表選擇“Kernel/Library/Defaults選項”。
選擇內核版本為“linux-2.6.x”,以及選擇使用的庫為“uClibc”。
切換到下麵的菜單:

(linux-2.6.x) Kernel Version
(uClibc) Libc Version
[*] Default all settings (lose changes) (NEW)
[*] Customize Kernel Settings (NEW)
[*] Customize Vendor/User Settings (NEW)
[*] Update Default Vendor Settings (NEW)

你可以按'esc'鍵或是“Exit”按鈕返回主功能表。


第一個“default all settings”選項是vendors目錄裏默認的配置檔。第二個“Customize kernel settings”選項能讓我們編輯內核配置。第三個“Customize Vendor/User settings”選項是為了生成romfs.img所需要配置應用程式和庫。最後一“Update Default Vendor settings”項,你對內核的改變以及你所配置的應用程式將保存在vendors/product的目錄裏。

你可以按'esc'鍵或是“Exit”按鈕返回主功能表,然後保存並退出!

11、配置內核
如果你確認了上面的配置過程,那麼你可以得到一個配置檔。然而我們需要改變初始的ramdis的大小。因為romfs.img檔的大小在默認情況下大約是 771KB。在“一般設置(General setup)”菜單裏,有“Default kernel command string”這一項,這樣改變它:

root=/dev/ram0 initrd=0x01300000,800K keepinitrd

你可以按'esc'鍵或是“Exit”按鈕返回主功能表,然後保存並退出!

程式/庫的配置

在這個功能表上,我們不需要修改任何的設置,看一下配置按“exit”保存並退出!


現在我們運行下面的這步來進行整個的編譯過程:

[root@hyoklinux uClinux-dist]# make

注:如果是編譯linux-2.4.x或是以下的版本的內核,你在“make”之前還需要“make dep”這一步,但是在編譯linux-2.6.x的內核時就不需要了。

這一步將編譯整個內核和uclibc(uClinux的系統庫),用戶程式,以及製作romfs.img文件。


下面是結果,你可以像下面這樣查看image目錄裏的檔:

[root@hyoklinux uClinux-dist]# ls -al images
total 3036
drwxr-xr-x 2 root root 4096 Apr 27 22:13 .
drwxr-xr-x 17 1000 users 4096 Apr 27 22:13 ..
-rw-r--r-- 1 root root 1540272 Apr 27 22:13 image.bin
-rwxr-xr-x 1 root root 45912 Apr 27 22:13 linux.data
-rwxr-xr-x 1 root root 704856 Apr 27 22:13 linux.text
-rw-r--r-- 1 root root 789504 Apr 27 22:13 romfs.img

[root@hyoklinux uClinux-dist]# ls -al linux-2.6.x/linux
-rwxr-xr-x 2 root root 15499433 Apr 27 22:11 linux-2.6.x/linux

如果你得到了相同的檔,那麼你就有了整個內核和rootfs鏡像。


12、讓我們來使用ARMulator!

安裝ARMulator,我們需要另外一個目錄來編譯GDB/ARMulator。然而這時我們將在uClinux-dist的臨時使用的目錄裏安裝它。

[root@hyoklinux uClinux-dist]# tar -jxvf ~/incoming/gdb-5.0.tar.bz2

打上補丁:

[root@hyoklinux uClinux-dist]# gzip -dc ~/incoming/gdb-5.0-uclinux-armulator-20021127.patch.gz | patch -p0

執行另外的一步:

[root@hyoklinux uClinux-dist]# gzip -dc ~/incoming/gdb-5.0-uclinux-armulator-ramdisk-20040412.patch.gz | patch -p0

好,現在所要編譯的代碼已經準備好了,讓我們執行它:

[root@hyoklinux uClinux-dist]# cd gdb-5.0/
[root@hyoklinux gdb-5.0]# ./configure --target=arm-elf
[root@hyoklinux gdb-5.0]# make
[root@hyoklinux gdb-5.0]# make install

現在可以運行ARMulator了!

在運行ARMulator之前,我們需要一個能鏈結到鏡像檔“romfs.img”的標誌。

[root@hyoklinux gdb-5.0]# cd ..
[root@hyoklinux uClinux-dist]# ln -s images/romfs.img boot.rom

以及製作一個初始化GDB的腳本:

[root@hyoklinux uClinux-dist]# cat > .gdbinit
target sim
load
^D


通過下面的命令,就可以運行我們的內核了。

[root@hyoklinux uClinux-dist]# arm-elf-gdb linux-2.6.x/linux

GNU gdb 5.0
Copyright 2000 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-elf"...
Loaded ROM boot.rom to 0x01300000
Loaded ROM boot.rom to 0x01400000
Loaded ROM boot.rom to 0x04000000
Loaded ROM boot.rom to 0x01300000
Loaded ROM boot.rom to 0x01400000
Loaded ROM boot.rom to 0x04000000
Connected to the simulator.
Loading section .init, size 0xb000 vma 0x1000000
Loading section .text, size 0xa0b98 vma 0x100b000
Loading section __ex_table, size 0x5b8 vma 0x10abba0
Loading section .data, size 0x8ef8 vma 0x10ae000
Start address 0x1000000
Transfer rate: 5931584 bits in <1 sec.

(gdb) run

Starting program: /uClinux-dist/linux-2.6.x/linux
Linux version 2.6.5-hsc1 (root@hyoklinux) (gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from http://www.snapgear.com/)) #9 Mon May 3 11:00:29 KST 2004
CPU: Atmel-AT91M40xxx [14000040] revision 0 (ARMvundefined/unknown)
Machine: ATMEL EB01
On node 0 totalpages: 1024
DMA zone: 0 pages, LIFO batch:1
Normal zone: 1024 pages, LIFO batch:1
HighMem zone: 0 pages, LIFO batch:1
Built 1 zonelists
Kernel command line: root=/dev/ram0 initrd=0x01300000,800K keepinitrd
PID hash table entries: 32 (order 5: 256 bytes)
Memory: 4MB = 4MB total
Memory: 2448KB available (642K code, 92K data, 44K init)
Calibrating delay loop... 15.87 BogoMIPS
Dentry cache hash table entries: 1024 (order: 0, 4096 bytes)
Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)
Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
checking if image is initramfs...it isn't (ungzip failed); looks like an initrd
POSIX conformance testing by UNIFIX
Linux NoNET1.0 for Linux 2.6
Atmel USART driver version 0.99
ttyS0 at 0xfffd0000 (irq = 2) is a builtin Atmel APB USART
ttyS1 at 0xfffcc000 (irq = 3) is a builtin Atmel APB USART
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
loop: loaded (max 8 devices)
RAMDISK: romfs filesystem found at block 0
RAMDISK: Loading 771 blocks [1 disk] into ram disk... done.
VFS: Mounted root (romfs filesystem) readonly.
Freeing init memory: 44K
Shell invoked to run file: /etc/rc
Command: hostname GDB-ARMulator
Command: /bin/expand /etc/ramfs.img /dev/ram1
Command: mount -t proc proc /proc
Command: mount -t ext2 /dev/ram1 /var
Command: mkdir /var/tmp
Command: mkdir /var/log
Command: mkdir /var/run
Command: mkdir /var/lock
Command: mkdir /var/empty
Command: cat /etc/motd
Welcome to
____ _ _
/ __| ||_|
_ _| | | | _ ____ _ _ _ _
| | | | | | || | _ \| | | |\ \/ /
| |_| | |__| || | | | | |_| |/ \
| ___\____|_||_|_| |_|\____|\_/\_/
| |
|_|


GDB/ARMulator support by
For further information check:
http://www.uclinux.org/


Execution Finished, Exiting


Sash command shell (version 1.1.1)
/> ps
PID PORT STAT SIZE SHARED %CPU COMMAND
1 S 163K 0K 48.0 /sbin/init
2 S 0K 0K 0.0 ksoftirqd/0
3 S 0K 0K 1.0 events/0
4 S 0K 0K 0.0 kblockd/0
5 S 0K 0K 0.0 pdflush
6 S 0K 0K 0.0 pdflush
7 S 0K 0K 0.0 kswapd0
8 S 0K 0K 0.0 aio/0
11 S0 R 165K 0K 0.0 /bin/sh
/> cd bin
/bin> ls -al
drwxr-xr-x 1 0 0 32 Jan 1 00:00 .
drwxr-xr-x 1 0 0 32 Jan 1 00:00 ..
-rwxr-xr-x 1 0 0 105980 Jan 1 00:00 boa
-rwxr-xr-x 1 0 0 91104 Jan 1 00:00 dhcpcd
-rwxr-xr-x 1 0 0 29624 Jan 1 00:00 expand
-rwxr-xr-x 1 0 0 40504 Jan 1 00:00 gdbserver
-rwxr-xr-x 1 0 0 73748 Jan 1 00:00 ifconfig
-rwxr-xr-x 1 0 0 41144 Jan 1 00:00 inetd
-rwxr-xr-x 1 0 0 31176 Jan 1 00:00 init
-rwxr-xr-x 1 0 0 56380 Jan 1 00:00 login
-rwxr-xr-x 1 0 0 64656 Jan 1 00:00 ping
-rwxr-xr-x 1 0 0 34280 Jan 1 00:00 reboot
-rwxr-xr-x 1 0 0 73860 Jan 1 00:00 route
-rwxr-xr-x 1 0 0 79852 Jan 1 00:00 sh
-rwxr-xr-x 1 0 0 51216 Jan 1 00:00 telnetd
/bin> cat /proc/meminfo
MemTotal: 2516 kB
MemFree: 560 kB
Buffers: 900 kB
Cached: 188 kB
SwapCached: 0 kB
Active: 984 kB
Inactive: 44 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 2516 kB
LowFree: 560 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
Mapped: 0 kB
Slab: 752 kB
Committed_AS: 0 kB
PageTables: 0 kB
VmallocTotal: 4194303 kB
VmallocUsed: 0 kB
VmallocChunk: 4194303 kB
/bin>


不錯的文章,值得讀一下,翻譯時來來回回讀了好幾遍,每次都有不同的收穫,感覺不錯;-)
由於時間倉促,未能測試,請大家和我關注這個貼子,使它能更準確、更完善!
__________________
PIII550/384M/60G+40G/TNT2/8139/Fedora1.0
LFS5.0+BLFS1.0ing……

http://timity.nease.net

學習快樂!
最後由 renbagshoes 在 05-25-2004 21:22 編輯



[讀書小心得] 好文章備份--uClinux簡介

從google搜尋到這篇文章,覺得不錯,做個備份免得以後文章不見了
文章出處:
http://www.linuxuser.com.tw/power/list2.php?id=2158

--------------------------------------------------------
BACK>>
自己動手打造嵌入式Linux軟硬體開發環境
轉 自己動手打造嵌入式Linux軟硬體開發環境
自己動手打造嵌入式Linux軟硬體開發環境

Linux和uClinux
1991年8月,芬蘭的一個學生在comp.os.minix新聞組貼上了以下這段話:

你好所有使用minix的人-我正在為386(486)AT做一個免費的作業系統(只是為了愛好,不會象gnu那樣很大很專業.

這名學生就是Linus Torvalds, 而他所說的'愛好'就變成我們今天知道的Linux。

由於Linux的源代碼公佈在互聯網上,可以免費得到,因此從一開始就吸引了世界各地的UNIX 行家為Linux
編寫了大量的驅動程式和應用軟體,在短短幾年時間裏,Linux
就發展成為一個相當完善的作業系統,而且Linux支援的硬體平臺是所有作業系統中最多的,目前Linux支援硬體平臺:Intel的IA64、
Compaq的Alpha、Sun的Sparc/Sparc64、SGI的Mips、IBM的S396、ARM、PowerPC等。Linux更大的影響在於它正逐漸地應
用於嵌入式設備,uClinux正是在這種氛圍下產生的。uClinux就是Micro-Control-Linux,它也是一個開放源碼的項目,uClinux的源代碼
和開發工具可以免費從http://www.uclinux.org上下載得到。uClinux是專為那些沒有MMU(記憶體管理單元)的嵌入式處理器開發的,和主流的Li
nux相比,uClinux有以下的特點:
1.簡化了內核載入方式,uClinux
的內核可以在Flash上直接運行:就是把uClinux的內核的可執行映象燒寫到flash上,系統啟動時從Flash的某個位址開始逐句執行;也可以載入到記憶體中運行
:把內核的壓縮檔存放在Flash上,系統啟動時讀取壓縮檔在記憶體裏解壓,然後開始執行。
2.採用了romfs檔系統作為root檔系統:這種檔系統相對於一般的ext2檔系統要求更少的空間,首先內核支援romfs檔系統比支援
ext2檔系統需要更少的代碼,其次romfs檔系統相對簡單,建立檔系統superblock需要更少的存儲空間。Romfs檔系統不支援動態擦寫,對於系統需
要動態保存的資料採用RAM盤的方法處理,RAM盤採用ext2檔系統。
3.使用了Flat可執行檔格式:elf格式有很大的檔頭,flat檔對檔頭和一些段資訊做了簡化。
4.重寫了應用程式庫:
uClibc對libc做了精簡,uClinux對用戶程式採用靜態連接的形式。uClinux的開發環境
www.uclinux.org為uClinux提供了GNU的交叉編譯器,包括以下元件:Gcc交叉編譯器,即在宿主機上開發編譯目標上可運行的二進位檔;Binut
ils輔助工具,包括objdump、as、ld等;Gdb調試器。以在ARM7上開發uClinux為例:
1.獲得uClinux-dist的源碼包,www.uclinux.org上定期為新推出的Linux內核推出相應的源碼包,最新的版本為Kernel-2.4.21,
可以從http: //www.uclinux.org/pub/uClinux/dist/
上免費下載得到。這個源碼包裏包含了uCLinux-2.4.21、uClibc和已經移植到uClinux下的用戶應用程式。下載完後,會得到一個
uClinux-dist-20030522.tar.gz的檔,把它保存到/home目錄下,然後執行:tar zxvf
uClinux-dist-20030522.tar.gz,當tar程式運行完畢後,在/home目錄下會有一個/home/uClinux-dist
的新目錄,這個目錄就是uClinux的源碼根目錄,裏面有進行uClinux開發的所有的源代碼。
2.獲得ARM開發工具,www.uclinux.org提供uClinux源碼的同時還提供相應的交叉編譯工具。要在開發主機上為ARM7目標系統編譯uClinux,
還需要從http: //www.uclinux.org/pub/uClinux/arm-elf-tools/
上下載ARM交叉編譯器:arm-elf-tools-20030314.sh。得到這個檔以後,執行以下命令:sh
arm-elf-tools-20030314.sh,這個命令會在開發主機上自動建立一個uClinux-ARM的交叉編譯環境。鍵入arm-elf- gcc,
如果能看到下面的輸出資訊:Reading specs from /usr/local/lib/gcc-lib/arm-elf/2.95.3/specsgcc
version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from
http://fiddes.net/coldfire/)(uClinux XIP and shared lib patchesfrom
http://www.snapgear.com/)表示uClinux-ARM的交叉編譯環境已經建立起來了。
現在開發主機裏已經有了uClinux的源代碼和編譯這些源代碼的工具,也可以用make menuconfig,
make等命令來編譯uClinux和用戶程式,為ARM目標板編譯了一個內核映射檔,接下來要做得是需要一塊ARM7的開發板來運行這個映射檔(關於如何編譯uCl
inux和用戶程式請參考www.uClinux.org 上得相關文檔)。構建ARM7-uClinux開發板
uClinux只需要極少的硬體資源就可運行起來,以ARM7TDMI為例,只需要以下硬體: 1.CPU ? Samsung S3C4510B
2.SDRAM 8M以上 3.一個簡易的串口 4.2M Flash 5.一個乙太網介面(可選)
目前各嵌入式微處理器的廠商在推出每款處理器的同時都會提供一個Demo板,供用戶來測試微處理器的性能。Samsung公司對S3C4510B處理器提供了一款SNDS
100的Demo板。Demo板的原理圖可以從Samsung公司的網站上免費下載,對這個原理圖作一些修改,只保留上面列出的5個部分,去掉其他多餘的部分。修改以後的
原理圖就是一個能夠運行uClinux的ARM7目標板原理圖,然後根據這個原理圖去加工幾張PCB板,焊上相應的元件,一塊能運行uClinux的ARM7開發板就做成
了(這款開發板相應得原理圖、PCB圖可以從http://www.dailzh.net上免費下載得到)。
慢著,雖然這塊開發板已經焊接完成,但目前它只是一堆電子零件的簡單組合,要在它上面跑uClinux,還需要相應的軟體來管理這些硬體。
前面提到uClinux可以從Flash中直接運行,就是說可以將uClinux的映射檔直接燒寫到Flash中,然後上電,uClinux會從
Flash中啟動嗎?是的,確實如此。現在要做的就是如何將uClinux的內核映射燒寫到Flash中。用寫入器將uClinux內核映射寫入到
Flash中,然後將Flash焊接到pcb板上或插到開發板的flash的插座上可以嗎?當然可以,如果你有寫入器的話。不過,很少有人手裏能有這種寫入器。我們需要的
是一個廉價的Flash寫入方案。用JTAG,S3C4510B上集成了一個JTAG,通過JTAG我們可以控制S3C4510B上所有管腳,這樣可以通過向JTAG介面
輸入相應的指令和資料,用軟體的方法在S3C4510B的資料、位址和控制匯流排上產生出Flash器件的讀寫操作時序,將uClinux的內核映射檔燒寫到Flash中
(關於S3C4510B的JTAG介面電纜的製作和下載燒寫uClinux映射檔到Flash中的程式可執行檔和源代碼請參閱http://www.dailzh.net
上相關內容)。
終於將uClinux的映射檔燒寫到Flash中了,用一根串口電纜將ARM7開發板和開發主機的Com1口連接起來,從網上下載一個tip程式,執行這個命令:tip
?l /dev/ttyS0 ?s 19200等螢幕上顯示
connected.以後,將ARM7開發板的電源接通。如果夠幸運的話,你應該看到下面的資訊:>>Linux version 2.4.20-uc0
(root@dailzh) (gcc version 2.95.3>>20010315 (release)(ColdFire patches -
20010318 from http://fiddes.net/coldfire/)>>(uClinux XIP and shared lib patches
from http://www.snapgear.com/)) 一 5月19 23:44:11 CST 2003>>Processor: Samsung
S3C4510B revision 6>>Architecture: SNDS100>>On node 0 totalpages: 4096>>zone(0):
0 pages.>>zone(1): 4096 pages.>>zone(2): 0 pages.>>Kernel command line:
root=/dev/rom0>>Calibrating delay loop... 49.76 BogoMIPS…>>Command: cat
/etc/motd>>Welcome to uClinux.org>>For further information check:
http://www.uclinux.org/>>\>uClinux在ARM7目標板上已經運行起來了,鍵入熟悉的ls命令,看有什麼輸出。
通過JTAG介面燒寫uClinux映射檔到Flash中速度太慢,調試uClinux內核非常不方便,有沒有其他的方法?有,uClinux除了可以從Flash中直
接運行外,還可以載入到記憶體中運行。我們來為ARM7開發板寫一個Bootloader,Bootloader的作用是初始化ARM7開發板,然後通過乙太網介面將uCl
inux映射下載到記憶體中,然後從記憶體中運行uClinux。這種方法下載uClinux內核映射只需要10幾秒,適合於開發階段經常修改uClinux內核時使用(Bo
otloader for ARM7的源代碼可以從http://www.dailzh.net
上下載得到)。調試完uClinux的內核以後,可以再通過JTAG介面燒寫uClinux映射檔到Flash中,這樣又可以直接從Flash中運行調試好的uClin
ux了。uClinux下用戶程式的開發和調試
現在ARM7開發板可以運行uClinux了,如何開發uClinux下的應用程式呢?和在普通電腦上開發Linux程式一樣,首先編寫應用程式的源代碼,只不過編譯的
時候不能用gcc編譯,需要用arm-elf-gcc編譯。編譯以後的可執行檔必須下載到ARM7開發板上才能運行,下載程式到目標板上可以通過在uClinux中啟用
tftpd程式,在開發主機端用tftpcmd
程式來下載,然後在uClinux的控制臺視窗鍵入可執行檔案名的方法來運行。如果想要應用程式在uClinux啟動時自動運行,可以修改uClinux
系統中/etc/rc檔的內容來來實現。如果要用gdb來調試用戶程式,可以參考www.uclinux.org上的相關文檔。關於作者dai lizhou ,
愛好嵌入式系統和Linux開發, 如果你對嵌入式Linux開發有興趣請訪問我們的網站http://www.dailzh.net, 誠邀你的加盟。
__________________
sunheart
┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳
┻┳┻┳我要去撞牆清醒一下┳┻┳┻
┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳
┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻┳┻
最後由 renbagshoes 在 05-09-2004 21:27 編輯

2007年5月24日 星期四

[讀書小心得] 複習name binding

name binding是programming language課程裡面的東西
我已經忘光了 Orz

查了一下, wiki寫的不賴
http://en.wikipedia.org/wiki/Name_binding
裡面有提到

"name binding refers to the association of values with identifiers"

"value"應該指的是給電腦看的physical/virtual address, "identifiers"自然就是給人看的字了

Name binding還分為兩種; 第一種是static binding (or early binding), 第二種是dynamic binding (or late binding). 差別在於static binding是在compile time決定identifier的值, 而dynamic binding是在run time決定的.

現在的語言使用大量的dynamic binding, 在上述的文章中提到, 廣義的來說只要是有用到memory裡面的值來做為變數/function name的部分, 都算是dynamic binding. 因為值必須再程式執行時才真正可以知道.

這又牽扯到MMU的使用, 目前正在survey中 ...

2007年5月7日 星期一

<工作日誌> 2007.05.08 WSN Gateway程式--block.c的問題

進度:

找到block.c裡面D參數的一些bug,目前正在修正中

目前情況:

block.c是一支用來處理serial port資訊的程式,用在gateway 與 coordinator溝通。
之前發現以下兩個bug
1. block -D 會無緣無故停下來
2. block -D 會無緣無故從系統裡面消失

後來利用printf大法找到問題,分別是

1. 之所以會停下來是因為block裡面使用message queue,message queue會因為資源不夠而無法傳送,於是便停下來。message queue本身沒問題,程式也沒問題,只是要看怎麼修正。

2. process會從系統裡面被移除是因為開了太多次file,導致OS認為該process有問題而停下來。屬於程式本身的bug。


未來方向:

第二點容易修正,只要在開檔前確認檔案有關掉就好。但是第一點要修正必須要花時間,看看message queue怎麼運作並且加以改進。

2007年4月27日 星期五

<工作日誌> 2007.04.27 Asus WL-500GP ... 韌體更新嘗試中

進度:

昨天正緯給我一台Asus WL-500GP,應該是gateway的東西,目前正在摸索中。

目前情況:

嘗試更新原來機器裡面的OS以及filesystem。但是資料不知道要去哪邊看,有分非官方版本的OS跟官方版本的。感覺還蠻多人在用這台。

link: Home Gateway Asus WL 500gp

未來方向:
先找到更新的方式,然後想要各種版本都跑看看,看差異在哪裡。

<工作日誌> 2007.04.27 VIA VX700,vbetool works

進度:

利用vbetool之後,S1, S3以及S5都正常運作了。

目前情況:

在參閱Documentation/power/video.txt之後可以知道,有些系統只能靠vbetool來調整,原因不明。
該文件也提供了一連串的command讓使用者可以參考。利用這串command,S3便可以正常的在VIA VX700執行了。

未來方向:

沒有試過在X模式下面關掉系統,不知道會發生什麼事。有機會再試了。