2011年9月28日 星期三

如何製作虛擬Floppy.img的GRUB開機介面

平台 : Ubuntu(Virtualbox)  Windows7

工具 : Bochs

 

1.開啟終端機,創立一個資料夾,並進入該資料夾

 

2.製作Floppy.img (兩者皆可)

# dd if=/dev/zero of=Floppy.img bs=1024 count=1440

# dd if=/dev/zero of=Floppy.img bs=512 count=2880

 

3.格式化Floppy.img

# mkdosfs Floppy.img

 

4.建立一個讓Floppy.img可以掛在的目錄 floppy

# mkdir floppy

 

5.掛載Floppy.img

# mount –o loop Floppy.img floppy

 

6.來這裡抓GRUB原始檔

 

7. 解壓縮(用0.96)

# tar zxvf grub-0.96-i386-pc.tar.gz

 

8.複製GRUB目錄

# sudo cp –r grub-0.96-i386-pc/* floppy

 

9.卸載floppy

# sudo umount floppy

 

10.安裝Grub

# sudo apt-get install grub

 

11.進入GRUB修改

# grub

 

12.輸入下列資訊

grub> device (fd0) floppy.img

grub> root (fd0)

grub> setup (fd0)

Checking if "/boot/grub/stage1" exists... yes

Checking if "/boot/grub/stage2" exists... yes

Checking if "/boot/grub/fat_stage1_5" exists... yes

Running "embed /boot/grub/fat_stage1_5 (fd0)"... failed (this is not fatal)

Running "embed /boot/grub/fat_stage1_5 (fd0)"... failed (this is not fatal)

Running "install /boot/grub/stage1 (fd0) /boot/grub/stage2 p /boot/grub/menu.lst "... succeeded

Done.

grub> quit

 

13.把檔案複製回Window7介面,開啟Bochs載入floppy.img 如圖設定

bochs設定

14.執行畫面

畫面1

畫面2

到此就告一段落

 

(1) 如果已經開發好作業系統者,做完第8個步驟後,加入menu.lst與kernel.elf於指定位址

 

kernel.elf (boot/kernel.elf)

menu.lst ( boot/grub/menu.lst )

title    DclabOS

root    (fd0)

kernel    /boot/kernel.elf

boot

 

(2)然後接著做步驟9之後的動作即可

 

畫面3

畫面4

畫面5

PS : 作業系統只輸出 Test Output to monitor. …

 

搞定收工 !

2011年8月28日 星期日

Ubuntu上使用Dropbox

X86.tar.gz   X64.tar.gz   Deb or Rpm

最近Dropbox非常熱門,用來儲存文件非常方便,將來非常有可能取代隨身碟,而且適用於多種平台,特別是使用在手機上非常方便。

Deb或RPM安裝就不介紹了,點了就可以安裝,以下介紹的是用壓縮檔安裝。

1.開啟終端機 下載壓縮檔

$ wget http://www.dropbox.com/download/?plat=lnx.x86

 

2. 解壓縮同目錄 下載後的 tar.gz

$ tar zxvf dropbox-lnx.x86-1.1.43.tar.gz

 

3.執行同目錄下的 dropboxd

$ ./.dropbox-dist/dropboxd

 

4.出現下列訊息 並登入

Please visit https://www.dropbox.com/cli_link?host_id=f58c94b1bca468309bb218c04dc706ac&cl=en_US to link this machine.

 

5.終端機會出現 代表成功了...

Client successfully linked, Welcome Bohan!

 

註:預設Dropbox在使用者目錄下 ~/Dropbox,進去就可以看到目錄下有你的資料了。

2011年8月3日 星期三

Linux內核啟動過程

 

Linux的啟動過程可分為兩部分:架構/開發版相關的引導過程、後續的通用啟動過程。

引導階段通常使用組合語言撰寫,首先檢查內核是否支持當前架構的處理器,然後檢查是否支持當前的開發版。通過檢查後就跳到下一階段的start_kernel函數做準備了。

主要分成下列兩個步驟

1. 連接內核時使用的虛擬位址,所以需要設置分頁表、關閉所有Cache、MMU。

2. 執行start_kernel裡的工作,包括複製Data Section、清除BSS區段、執行start_kernel函數。

第二階段的關鍵代碼主要使用C語言撰寫。進行了內核初始化的全部工作,像是輸出Linux版本訊息、設置與結構相關的環境、初始化控制台,最後執行rest_init函數啟動init過程,創建系統第一個行程:init行程。

Bootloader的結構

嵌入式Linux系統從軟體的角度通常可分成以下四個層次

1. 引導加載程式,包括固化在Firmware中的Boot代碼與Bootloader兩大部份。有些CPU在運行Bootloader之前先運行一段固化程式,比如X86結構的CPU就是先運行BIOS中的firmware,然後才運行硬碟的第一個分區(MBR)中的Bootloader。在大多數的嵌入式系統中並沒有Firmware,Bootloader是開啟後執行的第一個程式。

2. Linux內核,特定於嵌入式板子的訂製內核予內核的啟動參數。內核的啟動參數可以是內核默認的,或是由Bootloader傳遞給它的。

3. 文件系統,包括跟文件系統與建立於Flash內存設備上的文件系統。裏面包含了Linux系統能夠運行所需的應用程式、程式庫,比如可以給用戶提供操作Linux的控制介面的Shell、動態連接與運行時需要的glibc、uClibc ...等。

4. 用戶應用程式,他储存在文件系統中。有時在用戶應用程式與內核之間可能還會包括圖形介面像是Qtopia、MiniGUI...等。

2011年6月9日 星期四

Python的.py與.pyc

.py檔是Python的原始程式,.pyc檔是當Python執行.py檔案時,會將.py的程式編譯成中間程式碼 (bytecode),再用虛擬機器去執行它。

.pyc檔與JAVA、C#的bytecode有異曲同工之妙,但是Python沒有 JAVA的JIT (just-in-time compilation) 的技術,每當執行到一段 bytecode 時,虛擬機器會先把它翻譯成 native code 執行,而當以後再執行到同一段 bytecode 時,翻譯的動作就可以省去,所以速度才會較Python快。

.pyc檔可以加快下次執行的速度,所以當執行.py檔時,Python會讀取有沒有.pyc,要不然就會讀原始的.py檔。

2011年4月24日 星期日

如何在 Linux 架設 Samba 網路芳鄰分享檔案

Linux : Ubuntu、Ubuntu Server

Windows : Windows 7

 

1.安裝Samba

# sudo apt-get install samba

 

2.備份smb.conf

# cp /etc/samba/smb.conf /etc/samba/smb.conf-bak

 

3.新增使用者(有兩種)

使用舊的版本

# smbpasswd –a user

完成後密碼檔在/etc/samba/smbpasswd

smbpasswd –h 可以查看更多參數

使用新的版本

# pdbedit –a user

完成後可用pdbedit –L 看目前使用者

pdbedit –x 刪除使用者

 

4.編輯smb.conf

# vim /etc/samba/smb.conf

 

1 [global]

2 workgroup = BohanSamba

3 netbios name = BohanPC

4 security = user

5

6 [share]

7 path = /home/download/

8 valid users = download

9 read only = no

10 browseable = yes

11 create mask = 0755
12 directory mask = 0755

 

5.重新啟動samba(有兩種)

使用舊的版本

# /etc/init.d/samba restart

使用新的版本

# sudo service smbd restart

# sudo service nmbd restart

 

6. 輸入IP 帳號 密碼

\\ yourip

windows7samba

7.刪除連線

開啟命令提示字元輸入

net use * /delete

2011年4月4日 星期一

rsync 資料同步 Linux->Linux Linux->Windows Windows->Linux Windows–>Windows

Linux : Ubuntu

Windows : Win7

Linux->Linux

1.安裝rsync套件

$ sudo apt-get install rsync

2.Linux來源 (source) –> Linux目的 (destination)

$ rsync -avzHS –delete --stats --ignore-errors --progress download@IP:/home/download/data/ /home/bohan/data/

3.Linux目的 (destination) –> Linux來源 (source)

$ rsync -avzHS –delete --stats --ignore-errors --progress /home/bohan/data/ download@IP:/home/download/data/

4.自定義rsync.sh方便資料同步、備份

rsync.sh內容

1 #!/bin/bash

2 sourcedir=/home/download/data/

3 destinationdir=/home/bohan/data/

4 host=ip

5 id=download

6 rsync -avzHS --delete --stats --ignore-errors --progress ${id}@${host}:${sourcedir} ${destinationdir}

Linux->Windows

1.Linuxrsync套件
$ sudo apt-get install rsync
2.Windowscwrsync
到這個頁面下載cwrsync.exe安裝
3.Linux來源 (source) -> Linux目的 (destination)
打開Windows命令提示字元,貼上下列命令
"C:\Program Files\cwRsync\bin\rsync.exe" -avzHS --delete --ignore-errors --progress --stats --rsh='"C:\Program Files\cwRsync\bin\ssh" -p 22'  download@IP:/home/download/data/ /cygdrive/c/Users/bohan/Desktop/data/
4.Linux目的 (destination) –> Linux來源 (source)
"C:\Program Files\cwRsync\bin\rsync.exe" -avzHS –delete --ignore-errors --progress --stats --rsh='"C:\Program Files\cwRsync\bin\ssh" -p 22' /cygdrive/c/Users/bohan/Desktop/data/ download@IP:/home/download/data/

Windows->Linux

Linux->Windows步驟相反即可

Windows->Windows

1.開啟命令提示字元

"C:\Program Files\cwRsync\bin\rsync.exe" -avzHS --delete --ignore-errors –progress --stats /cygdrive/c/source /cygdrive/d/destination

 

/cygdrive/c/ 代表Windows作業系統的C槽,D槽可用/cygdrive/d/,以此類

--delete 刪除傳送端已經不存在,而目的端存在的檔案,怕檔案被複寫可改成

--ignore-existing 忽略目的端已經存在的檔案(也就是不更新)。

※ 更多參數可以用 man rsync、rsync –h這裡

2011年3月23日 星期三

Ubuntu 使用 NO-IP

1.先去noip網站註冊

http://www.no-ip.com/


 

2.加入Host 對應

Noip


3.安裝noip套件

$ sudo apt-get install noip2

或者是到noip下載解壓縮 之後編譯安裝


 

4.安裝畫面如下


第一次安裝會跳出以下畫面

noipmail

noipassword

noiptime

noipgroup

noipdevice

noipfinish

 

5. 測試有沒有成功

connect

connectpaswd

 

noiptest

6. noip命令

USAGE: noip2 [ -C [ -F][ -Y][ -L hosts_groups][ -U #min]
        [ -u username][ -p password][ -x progname]]
        [ -c file][ -d][ -D pid][ -i addr][ -S][ -M][ -h]
Version Linux-2.1.7
Options: -C                         create configuration data
               -F                          force NAT off
               -Y                          select all hosts/groups
               -L hosts_groups  select supplied hosts/groups
               -U minutes           set update interval
               -u username        use supplied username
               -p password        use supplied password
               -x executable       use supplied executable
               -c config_file        use alternate data path
               -d                           increase debug verbosity
               -D processID       toggle debug flag for PID
               -i IPaddress         use supplied address
               -I interface            use supplied interface
              -S                           show configuration data
              -M                          permit multiple instances
              -K processID        terminate instance PID
              -z                           activate shm dump code
              -h                           help (this text)

 

重新設定的話輸入

$ noip2 –C

 

已經有設定資料的話先刪除 noip porcess

$ noip2 –K processID

 

顯示現在電腦設定

$ noip2 –S

謝謝收看!

2011年1月26日 星期三

Ubuntu 上編譯 RT-Thread 與 Qemu-mini2440模擬執行

平台:Ubuntu 10.04 LTS

RT-Thread : 0.4.0

 

1.到這裡下載Compiler

http://www.codesourcery.com/sgpp/lite/arm/download.html

 

2.安裝SCons

$ sudo apt-get install scons

 

3.安裝 git-core

$ sudo apt-get install git-core

 

4.下載qemu-mini2440

$ git clone git://repo.or.cz/qemu/mini2440.git mini2440-qemu

5.修補qemu-mini2440

$ patch -d mini2440-qemu/ -p1 <mini2440.patch

patching file gdbstub.c
patching file hw/mini2440.c
patching file hw/s3c2410.c
patching file hw/s3c24xx_lcd.c
patching file hw/sd.c

mini2440.patch 如下

-----------------(以下開始)--------------------

diff -Nur mini2440/gdbstub.c mini2440_0308/gdbstub.c
--- mini2440/gdbstub.c    2009-05-20 18:28:02 +0800
+++ mini2440_0308/gdbstub.c    2010-02-07 18:58:36 +0800
@@ -2345,7 +2345,7 @@
         if (strstart(device, "tcp:", NULL)) {
             /* enforce required TCP attributes */
             snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
-                     "%s,nowait,nodelay,server", device);
+                     "%s,nowait,nodelay,server,ipv4", device);
             device = gdbstub_device_name;
         }
#ifndef _WIN32
diff -Nur mini2440/hw/mini2440.c mini2440_0308/hw/mini2440.c
--- mini2440/hw/mini2440.c    2009-05-20 18:28:02 +0800
+++ mini2440_0308/hw/mini2440.c    2010-01-29 00:56:24 +0800
@@ -258,6 +258,9 @@
     struct mini2440_board_s *s = (struct mini2440_board_s *) opaque;
     uint32_t image_size;

+#if 1
+    s->cpu->env->regs[15] = S3C_RAM_BASE;
+#else
     /*
      * Normally we would load 4 KB of nand to SRAM and jump there, but
      * it is not working perfectly as expected, so we cheat and load
@@ -298,6 +301,7 @@
                mini2440_printf("loaded %s (size %x)\n", s->kernel, image_size);
         }
     }
+#endif   
}

/* Typical touchscreen calibration values */
@@ -328,7 +332,7 @@
         mini2440_printf("This platform requires an ARM920T core\n");
         exit(2);
     }
-    s->cpu = s3c24xx_init(S3C_CPU_2440, 12000000 /* 12 mhz */, s->ram, S3C_SRAM_BASE_NANDBOOT, s->mmc);
+    s->cpu = s3c24xx_init(S3C_CPU_2440, 12000000 /* 12 mhz */, s->ram, S3C_SRAM_BASE_NORBOOT, s->mmc);

     /* Setup peripherals */
     mini2440_gpio_setup(s);
@@ -353,6 +357,11 @@
     return s;
}

+static struct arm_boot_info mini2440_binfo = {
+    .loader_start = S3C_RAM_BASE,
+    .ram_size = 0x04000000,
+    .board_id = 0x050,
+};

static void mini2440_init(ram_addr_t ram_size,
         const char *boot_device,
@@ -371,9 +380,16 @@
     mini = mini2440_init_common(ram_size,
                     kernel_filename, cpu_model, sd);

-    mini->nand = nand_init(NAND_MFR_SAMSUNG, 0x76);
+    mini->nand = nand_init(NAND_MFR_SAMSUNG, 0x76);
     mini->cpu->nand->reg(mini->cpu->nand, mini->nand);

+    /* Load the kernel.  */
+    if (kernel_filename) {
+        mini2440_binfo.kernel_filename = kernel_filename;
+        mini2440_binfo.kernel_cmdline = kernel_cmdline;
+        mini2440_binfo.initrd_filename = initrd_filename;
+        arm_load_kernel(mini->cpu->env, &mini2440_binfo);
+    }   
     mini2440_reset(mini);
}

diff -Nur mini2440/hw/s3c2410.c mini2440_0308/hw/s3c2410.c
--- mini2440/hw/s3c2410.c    2009-05-20 18:28:02 +0800
+++ mini2440_0308/hw/s3c2410.c    2010-01-29 23:33:11 +0800
@@ -1603,7 +1603,7 @@
static void s3c_adc_done(void *opaque)
{
     struct s3c_adc_state_s *s = (struct s3c_adc_state_s *) opaque;
-    s->xdata = s->input[s->in_idx] & 0x3ff;
+    //s->xdata = s->input[s->in_idx] & 0x3ff;
     s->control |= 1 << 15;
     qemu_irq_raise(s->irq);
}
@@ -1630,6 +1630,15 @@
         qemu_mod_timer(s->tst, qemu_get_clock(vm_clock) +
                         (ticks_per_sec >> 5));
     }
+    /* add by yi.qiu@2010.01.28 */
+    else
+    {
+        if (((s->ts & 3) == 3) && (s->ts & (1<<8)) && (s->enable))
+            qemu_irq_raise(s->tcirq);
+
+     qemu_mod_timer(s->tst, qemu_get_clock(vm_clock) +
+                        (ticks_per_sec >> 5));   
+    }
}

static void s3c_adc_event(void *opaque,
@@ -1637,8 +1646,9 @@
{
     struct s3c_adc_state_s *s = (struct s3c_adc_state_s *) opaque;
     s->down = !!buttons_state;
-    s->x = x;
-    s->y = y;
+    s->x = 32767 - y;
+    s->y = 32767 - x;
+   
     s3c_adc_tick(s);
}

@@ -1689,7 +1699,7 @@
         break;

     case S3C_ADCTSC:
-        s->ts = value & 0xff;
+        s->ts = value & 0x1ff;
         break;

     case S3C_ADCDLY:
diff -Nur mini2440/hw/s3c24xx_lcd.c mini2440_0308/hw/s3c24xx_lcd.c
--- mini2440/hw/s3c24xx_lcd.c    2009-05-20 18:28:02 +0800
+++ mini2440_0308/hw/s3c24xx_lcd.c    2010-01-28 18:44:50 +0800
@@ -432,7 +432,7 @@
             dirty[1] = cpu_physical_memory_get_dirty(x, VGA_DIRTY_FLAG);
             dirty[0] |= dirty[1];
         }
-        if (dirty[0] || s->invalidate) {
+        // if (dirty[0] || s->invalidate) {
             s->fn(s->palette, dest, src, s->width, s->dest_width);
             maxy = y;
             end = new_addr;
@@ -440,7 +440,7 @@
                 miny = y;
                 start = addr;
             }
-        }
+        // }
         addr = new_addr;
         dirty[0] = dirty[1];
         src += src_width;
@@ -452,7 +452,9 @@
         cpu_physical_memory_reset_dirty(start, end, VGA_DIRTY_FLAG);
     s->srcpnd |= (1 << 1);            /* INT_FrSyn */
     s3c_lcd_update(s);
-    dpy_update(s->ds, 0, miny, s->width, maxy);
+    /* fix qemu/2410 lcd bug */
+    dpy_update(s->ds, 0, 0, 240, 320);
+    // dpy_update(s->ds, 0, miny, s->width, maxy);
}

static void s3c_invalidate_display(void *opaque)
diff -Nur mini2440/hw/sd.c mini2440_0308/hw/sd.c
--- mini2440/hw/sd.c    2009-05-20 18:28:02 +0800
+++ mini2440_0308/hw/sd.c    2010-02-07 13:26:34 +0800
@@ -195,7 +195,7 @@
static void sd_set_ocr(SDState *sd)
{
     /* All voltages OK, card power-up OK, Standard Capacity SD Memory Card */
-    sd->ocr = 0x80ffff00;
+    sd->ocr = 0x80ff8000;
}

static void sd_set_scr(SDState *sd)

-----------------(到此結束)--------------------

 

5.安裝Libary

$ sudo apt-get install zlib1g-dev libsdl-gfx1.2-dev libsdl1.2-dev

 

6.編譯qemu

$ cd mini2440-qemu

$ ./configure --target-list=arm-softmmu

$ make

 

7.安裝subversion

$ sudo apt-get install subversion

 

8.下載RT-Thread source code

$ svn checkout http://rt-thread.googlecode.com/svn/trunk/ RT-Thread

 

9.修改 RT-Thread/bsp/mini2440/rtconfig.py

 

5 # toolchains options

6 ARCH = 'arm'

7 CPU = 's3c24x0'

8 TextBase = '0x30000000'

9

10 CROSS_TOOL = 'gcc'

11

12 if CROSS_TOOL == 'gcc':

13 PLATFORM = 'gcc'

14 EXEC_PATH = 'yourpath/compiler/bin'

15 elif CROSS_TOOL == 'keil':

16 PLATFORM = 'armcc'

17 EXEC_PATH = 'E:/Keil'

 

10.編譯RT-Thread

$ cd RT-Thread/bsp/min2440

$ scons

 

11.解壓縮SDCARD.zip

$ unzip RT-Thread/tools/SDCARD.zip

 

12. 複製qemu-system-arm 至 RT-Thread/tools

$ cp mini2440-qemu/arm-softmmu/qemu-system-arm RT-Thread/tools/

 

13.模擬執行

$ cd RT-Thread/tools/

$ ./qemu-system-arm -M mini2440 -kernel ../bsp/mini2440/rtthread-mini2440.axf -show-cursor -sd SDCARD -serial telnet:127.0.0.1:1200,server -serial file:virtualkbd

 

跟run-mini2440-sdcard.bat 比較 (for windows)

start qemu-system-arm.exe -M mini2440 -kernel ..\bsp\mini2440\rtthread-mini2440.axf -show-cursor -sd SDCARD -serial telnet:127.0.0.1:1200,server -serial file:virtualkbd

telnet 127.0.0.1 1200

 

14.開啟終端機

$ telnet 127.0.0.1 1200

 

rt-thread

 

Reference :

http://www.rt-thread.org/phpbbforum/viewtopic.php?f=2&t=807

2011年1月18日 星期二

Ubuntu上安裝Squid Proxy Server

1.開啟終端機,安裝Squid

 

# sudo apt-get install squid

 

2. 備份Squid設定檔,改失敗了可以回復

 

# cp /etc/squid/squid.conf /etc/squid/squid.conf.bak

 

3.修改squid.conf

 

加入visible_hostname

visible_hostname spyker729-desktop

 

加入webmaster 管理者mail

cache_mgr spyker729@gmail.com

 

將去除下列設定 前面的井號

# cache_mem 8 MB

# cache_swap_low 90

# cache_swap_high 95

# maximum_object_size_in_memory 1024 KB (容量自訂)

# ipcache_size 1024

# ipcache_low 90

# ipcache_high 95

# fqdncache_size 1024

 

4.重新啟動Squid

 

# sudo /etc/init.d/squid restart

到這裡即可在瀏覽器使用 proxy,IP為架設機器的 IP,port為3128 (squid.conf可更改)

 

5.加入htpasswd認證,需要照號密碼才能使用proxy

 

更改squid.conf,加入下列命令存檔

77          auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/passwd

570        acl password proxy_auth REQUIRED

571         http_access allow password

 

6.設定帳號密碼

 

# htpasswd –c /etc/squid/passwd 帳號

 

謝謝收看!

2011年1月17日 星期一

用Webmin管理Linux系統

1.安裝webmin

到這裡下載 rpm,tar,deb http://www.webmin.com/download.html

2.安裝成功 (用deb安裝)
Screenshot-gdebi-gtk

3.進入Webmin

瀏覽器上輸入http://YourIP:10000

點選藍色連結

webmin
憑證不用理會它
webmin2
root的帳號密碼為登入帳密
webmin3
登入畫面與語言介面修改
webmin4
webmin5webmin6webmin7
謝謝收看 !