2013年8月30日 星期五

[轉] 更改Ubuntu的source list

在Ubuntu上下載套件常常會遇上下載過慢的情形
常常跑完都一天過去了,或者是看著他一動也不動得卡在那裡
後來經學長丟了個網址 

[Ubuntu] 更改 Ubuntu 10.04 的 sources.list

下載速度過慢的問題終於解決了
我就來講講我的作法吧,雖然跟生蛋大ㄧ模一樣
一樣先進到終端機畫面,先登入root管理者模式
sudo su


輸入所設定的密碼即可
sourceslist1.JPG
接著複製sources.list的內容,以防萬一
cp -a /etc/apt/sources.list /etc/apt/sources.list.bak
刪除目前的sources.list
rm -rf /etc/apt/sources.list
接著編輯sources.list,由於我的Ubuntu沒有vim的功能
目前也迷樣的裝不起來,之後再研究
所以我選擇用gedit來編輯我的sources.list
gedit /etc/apt/sources.list
打開空白sources.list,將生蛋大給的code全貼上去
#deb cdrom:[Ubuntu 10.04 LTS _Lucid Lynx_ - Release i386 (20100429)]/ lucid main restricted
# See http://help.ubuntu.com/community/UpgradeNotesfor how to upgrade to
# newer versions of the distribution.
deb http://ubuntu.stu.edu.tw/ubuntu/ lucid main restricted
deb-src http://ubuntu.stu.edu.tw/ubuntu/ lucid main restricted
## Major bug fix updates produced after the final release of the
## distribution.
deb http://ubuntu.stu.edu.tw/ubuntu/ lucid-updates main restricted
deb-src http://ubuntu.stu.edu.tw/ubuntu/ lucid-updates main restricted
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://ubuntu.stu.edu.tw/ubuntu/ lucid universe
deb-src http://ubuntu.stu.edu.tw/ubuntu/ lucid universe
deb http://ubuntu.stu.edu.tw/ubuntu/ lucid-updates universe
deb-src http://ubuntu.stu.edu.tw/ubuntu/ lucid-updates universe
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://ubuntu.stu.edu.tw/ubuntu/ lucid multiverse
deb-src http://ubuntu.stu.edu.tw/ubuntu/ lucid multiverse
deb http://ubuntu.stu.edu.tw/ubuntu/ lucid-updates multiverse
deb-src http://ubuntu.stu.edu.tw/ubuntu/ lucid-updates multiverse
## Uncomment the following two lines to add software from the ‘backports’
## repository.
## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
# deb http://tw.archive.ubuntu.com/ubuntu/ lucid-backports main restricted universe multiverse
# deb-src http://tw.archive.ubuntu.com/ubuntu/ lucid-backports main restricted universe multiverse
## Uncomment the following two lines to add software from Canonical’s
## ‘partner’ repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu lucid partner
# deb-src http://archive.canonical.com/ubuntu lucid partner
deb http://ubuntu.stu.edu.tw/ubuntu/ lucid-security main restricted
deb-src http://ubuntu.stu.edu.tw/ubuntu/ lucid-security main restricted
deb http://ubuntu.stu.edu.tw/ubuntu/ lucid-security universe
deb-src http://ubuntu.stu.edu.tw/ubuntu/ lucid-security universe
deb http://ubuntu.stu.edu.tw/ubuntu/ lucid-security multiverse
deb-src http://ubuntu.stu.edu.tw/ubuntu/ lucid-security multiverse

大概像這樣子
sourceslist3.JPG
儲存後關閉
這麼一來下載的速度就會很快了。

2013年8月27日 星期二

Regular Expression

http://rocksaying.tw/archives/2670695.html

http://blog.roodo.com/rocksaying/archives/2670695.html

PHP教學

http://www.twhappy.com/index.php?action=blog&category=6

[server] 十分鐘架好ubuntu的apache+php+mysql

http://flzen.wordpress.com/2011/05/07/lamp-on-ubuntu/


裝phpmyadmin~那個選網頁伺服器時一定要按空白鍵~
讓apache2前面出現*號才會正常~

如果忘記空白鍵的話先移除在安裝
sudo apt-get autoremove –purge phpmyadmin
sudo apt-get install phpmyadmin

Install LAMP under Ubuntu 10.10

http://nelsonchunglife.blogspot.tw/2011/02/install-lamp-under-ubuntu-1010.html

Git 情境劇

http://gogojimmy.net/2012/02/29/git-scenario/

2013年8月14日 星期三

[轉] likely() and unlikely() macro in Linux kernel

Linux核心原始碼,經常出現兩個巨集:likely() and unlikely(),如下所示:

#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)


重點就是__builtin_expect這個函式的意義。此函式用來告訴編譯器,哪些程式區段可做預測。
底下為__builtin_expect的原型:
long __builtin_expect(long EXP, long C)
此函式__builtin_expect有兩大重點:
  1. __builtin_expect的回傳值即EXP這個判斷式。
  2. __builtin_expect語意上,是期待(EXP == C)。
例子一:
if (__builtin_expect(x, 1))
    do_something();

此敘述告知編譯器,x變數期待是1 (上述重點2), 且由於x=1, 所以__builtin_expect回傳值便是1(上述重點1),因此編譯器可以大膽預測do_something()一定會被執行到。因此便能將處理器的管線(Pipe Line)功能發揮的淋漓盡致。

例子二:
if (__builtin_expect(x, 0))
    do_something1();
else
    do_something2();

此敘述告知編譯器,x變數期待是0 (上述重點2), 且由於x=0, 所以__builtin_expect回傳值便是0(上述重點1),因此編譯器可以大膽預測do_something2()一定會被執行到,而不是預測執行do_something1()。


總結likely()與unlikely()巨集:

if(likely(x)) {
    預測想要執行的原始碼
} else {
}

if(unlikely(x)) {
} else {
    預測想要執行的原始碼
}

2013年8月13日 星期二

How to undo the last Git commit?


http://git-scm.com/docs/git-reset

Undo a commit and redo

$ git commit ...                              (1)
$ git reset --soft HEAD^               (2)
$ edit                                             (3)
$ git add ....                                   (4)
$ git commit -c ORIG_HEAD      (5)
This is what you want to undo

This is most often done when you remembered what you just committed is incomplete, or you misspelled your commit message, or both. Leaves working tree as it was before "reset".

Make corrections to working tree files.

Stage changes for commit.

"reset" copies the old head to .git/ORIG_HEAD; redo the commit by starting with its log message. If you do not need to edit the message further, you can give -C option instead.

2013年8月12日 星期一

[轉] linux 筆記 關於struct file 結構下 private_data 數據結構的思考

    struct file是字符設備驅動相關重要結構。struct file代表一個打開的文件描述符,它不是專門給驅動程序使用的,系統中每一個打開的文件在內核中都有一個關聯的 struct file。 它由內核在 open時創建,並傳遞給在文件上操
作的任何函數,知道最後關閉。當文件的所有實例都關閉之後,內核釋放這個數據結構。
   在 struct filed有個成員void *private_data;文檔上說明該成員是系統調用時保存狀態信息非常有用的資源。起初一直不明白這個private_data在驅動 open函數中的作用,後來發現private_data 這個成員在open函數被調用的時候 linux 系統就已經將其幅值為NULL,之後可供用戶使用,或者比較悲劇的被用戶忽略改域。
   在詳細的閱讀源代碼後,發現 這個private_data 其實是用來保存自定義設備結構體的地址的。自定義結構體的地址被保存在private_data後,可以在read ,write 等驅動函數中被傳遞和調用自定義設備結構體中的成員。
   例如 可以在open函數中這麼做 
struct scull_dev *dev;
dev = container_of(inode->i_cdev,struct scull_dev,cdev);
filp->private_data = dev; /*for other methods*/
(container_of這個宏返回的是地址,即結構體的地址)
  也可以使用C語言中的一些技巧實現地址的賦值
 struct s3c2440_camif *dev =&camif;
 file->private_data = dev;  

2013年8月9日 星期五

[轉] android pmem 和ashmem 介紹及實例分析

1Ashmem(匿名共享內存驅動:Anonymous Shared Memory)

它基於mmap系統調用,不同進程可以將同一段物理內存映射到各自的虛擬地址控制,從而實現共享

A(mmap:是一種共享內存的系統。假如:A進程的內存空間範圍0X00000XFFFFB進程的內存空間範圍0X0000~0XFFFF,他們兩個進程想共同共享一個文件或一段空間時,可以使用mmap(比如都想讀取硬盤上的c.txttxt內容為"123"),首先另外開闢第三個內存空間(3個字節),將硬盤上的c.txt映射到這個內存空間中,使此內存空間有了這個c.txt,再將AB進程分別映射至這個內存空間,則現在A進程的內核空間範圍為0X00000XFFFF+4B進程的內核空間範圍為0X00000XFFFF+4。那麼此時AB進程都擁有了共同的內存空間,即可以互相共享共同內存空間裡的內容了;當然,如果創建mmap時也可以指定是可讀還是可寫,如果AB改變了共同內存空間的值,將c.txt內容改為了"234"的話,硬盤上的c.txt內容仍然為123,若想改變,則得調用msync實現硬盤和共享內存區的同步),而Ashmemmmap稍有不同的是,Ashmemcache shrinker關聯起來,可以在適當時機去回收這些共享內存,這點比較智能,而mmap是做不到的

BAshmem實現

Ashmem類位於/android2.1/kernel/mm/ashmem.c,通過註冊cache shrinker來實現回收內存,通過註冊misc提供mmap接口等。Ashmem用兩個結構體ashmem_areaashmem_range來維護,ashmem_area代表共享內存的區域,ashmem_range則將這段區域以頁為單位分為多個rangeashmem_area有個unpinned_list成員,掛在這個list上的range可以被回收。ashmem_range有一個LRU鏈表,在cache shrink回收一個ashmem_area的某段內存時候,是根據LRU的原則來選擇哪些頁面優先被回收的

CAshmem流程

ashmem_init(創建struct ashmem_areastruct ashmem_range、註冊ashmem driver(misc_register)、註冊cache shrinker)----->在註冊misc構造方法時,引進了ashmem_fops----->在註冊fops時,創建了ashmem_openashmem_releaseashmem_mmap

ashmem_shrinkashmem_ioctl---->創建ashmem_open時,調用了kmem_cache_zalloc去分配了一個ashmem_area並初始化了成員變量、創建ashmem_release,調用了了kmem_cache_free,此靜態方法與zalloc相反,是去釋放ashmem_area、創建ashmem_mmap調用shmem_file_setup來從tmpfs系統(基於內存的文件系統)中創建一個文件(內存)ashmem_area用,這個內存就是共享內存、創建ashmem_shrink來實現內存回收,這個函數從LRU鏈表上回收指定數目的unpinned ashmem_range、創建ashmem_ioctl,設置一些ashmem_areasize啊,然後查看被pinrange有多少啊,然後pin or unpin range(pin range代表此rangeunpinned_list中取下來,而unpin range代表此range掛在unpinned_list上,以便被回收,由此可見只有被unpinrange才會被回收)

D、用戶接口

進程A可通過open打開該文件,用ioctl命令ASHMEM_SET_NAMEASHMEM_SET_SIZE設置共享內存塊的名字和大小,並將得到的handle傳給mmap,來獲得共享的內存區域,進程B通過將相同的handle傳給mmap,獲得同一塊內存,handle在進程間的傳遞可通過Binder來實現。


2Android PMEM
pmemashmem都通過mmap實現共享,區別是Pmem的共享區域是一段連續的物理內存,而Ashmem的共享區域在虛擬空間是連續的,物理內存卻不一定連續
APMEM的實現
Pmem的源代碼在drivers/misc/pmem.c中,Pmem驅動依賴於linuxmisc deviceplatform driver框架,一個系統可以有多個Pmem,默認的是最多10個。Pmem暴露4組操作,分別是platform driverproberemove操作; misc devicefops接口和vm_ops操作。模塊初始化時會註冊一個platform driver,在之後probe時,創建misc設備文件,分配內存,完成初始化工作。
Pmem通過pmem_infopmem_datapmem_region三個結構體維護分配的共享內存,其中pmem_info代表一個Pmem設備分配的內存塊,pmem_data代表該內存塊的一個子塊,pmem_region則把每個子塊分成多個區域。 pmem_data是分配的基本單位,即每次應用層要分配一塊Pmem內存,就會有一個pmem_data來表示這個被分配的內存塊,實際上在open的時候,並不是open一個pmem_info表示的整個Pmem內存塊,而是創建一個pmem_data以備使用。一個應用可以通過ioctl來分配pmem_data中的一個區域,並可以把它map到進程空間;並不一定每次都要分配和map整個pmem_data內存塊
B、用戶接口
一個進程首先打開Pmem設備,通過ioctl(PMEM_ALLOCATE)分配內存,它mmap這段內存到自己的進程空間後,該進程成為master進程。其他進程可以重新打開這個pmem
備,通過調用ioctl(PMEM_CONNECT)將自己的pmem_datamaster進程的pmem_data建立連接關係,這個進程就成為client進程。Client進程可以通過mmapmaster Pmem中的一段或全部重新映射到自己的進程空間,這樣就實現了共享Pmem內存。如果是GPUDSP則可以通過ioctl(PMEM_GET_PHYS)獲取物理地址進行操作。


3. 在應用程序中的使用: 
1) Pmem 例子:

sp<MemoryHeapBase> master_workspace = new 
MemoryHeapBase(pmem_adsp, Coda_WorkSpace_Size); 
//new 
一個base 
memeoryHeapBase 
,構造函數中做了2件事情一個是open 「/dev/pmem_adsp」 設備, 第二是調用mapfd (內部即mmap)來得到共享內存區域 

if (master_workspace->heapID() < 0) {
 

LOGD("Error creating workspace heap");
 

Status = UNKNOWN_ERROR;
 

}
 

master_workspace->setDevice(pmem); // 
如果pmem_adsp device出錯, 就是用pmem device 

mHeapPmem_workspace = new MemoryHeapPmem(master_workspace, 0); 

// new 一個Pmem , MemoryHeapPmem , (構造函數中調用init ,設定了Base,device ,size 等) 

mHeapPmem_workspace->slap();
 

master_workspace.clear();
 


if (ioctl(mHeapPmem_workspace->heapID(), PMEM_GET_PHYS, &region) >= 0)//
得到物理地址 

{
 


pys_address = (unsigned int)region.offset;
 


WORK_SPACE_PMEM_PHY_ADDRESS = pys_address;
 


WORK_SPACE_PMEM_VIR_ADDRESS = mHeapPmem_workspace->base(); //
得到虛擬地址 

}
 

else
 

{
 


pys_address = 0xFFFFFFFF;
 


LOGE("Error: WORKSPACE PMEM_GET_PHYS FAILED");
 


return UNKNOWN_ERROR; 


}
 

2) Ashmem 例子: 

sp<MemoryHeapBase> heap = new MemoryHeapBase(frameSize * kBufferCount);
 

if (heap->heapID() < 0) {
 

LOGE("Error creating frame buffer heap");
 

return false;
 
} 
//沒有指定device  就是用的ashmem . 構造函數中做了2件事情一個是ashmem_create_region 第二是調用mapfd (內部即mmap)來得到共享內存區域 

第一步通過調用ashmem_create_region函數,這個函數完成這幾件事: 

1
fd = open("/dev/ashmem", O_RDWR); 
2
ioctl(fd, ASHMEM_SET_NAME, region_name); // 這一步可選 
3
ioctl(fd, ASHMEM_SET_SIZE, region_size); 第二步,應用程序一般會調用mmap來把ashmem分配的空間映射到進程空間: 

mapAddr = mmap(NULL, pHdr->mapLength, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);


4. 如何將PMEM編入內核 
Android PMEM驅動研究(1——如何將PMEM編入內核
PMEM並不像Ashmembinder那樣,選中就可以被Android系統使用,他是一個platform設備,需要註冊才可以使用。
下面以S3C6410為例,描述使用流程:
1)選中內核選項 
Device Drivers ---> 

  • Misc devices ---> 
  •    Android pmem allocator
    2)修改你的dev.c註冊文件,添加如下內容:
    #ifdef CONFIG_ANDROID_PMEM 
    static struct android_pmem_platform_data android_pmem_pdata = { 
           .name = "pmem", 
           .start = PMEM_BASE, 
           .size = PMEM_BASE_SIZE, 
           .no_allocator = 1, 
           .cached = 1, 
    };
    static struct android_pmem_platform_data android_pmem_adsp_pdata = { 
           .name = "pmem_adsp", 
           .start = PMEM_ADSP_BASE, 
           .size = PMEM_ADSP_BASE_SIZE, 
           .no_allocator = 0, 
           .cached = 0, 
    };
    struct platform_device android_pmem_device = { 
           .name = "android_pmem", 
           .id = 0, 
           .dev = { .platform_data = &android_pmem_pdata }, 
    };
    struct platform_device android_pmem_adsp_device = { 
           .name = "android_pmem", 
           .id = 1, 
           .dev = { .platform_data = &android_pmem_adsp_pdata }, 
    }; 
    #endif
    3)在驅動註冊列表中添加如下內容
    static struct platform_device *smdk6410_devices[] __initdata = { 
    #ifdef CONFIG_ANDROID_PMEM 
           &android_pmem_device, 
           &android_pmem_adsp_device, 
    #endif 
    };
    4)分配物理地址我用了128MB的最後8MB 
    #define PMEM_BASE 0x57900000 
    #define PMEM_BASE_SIZE SZ_1M*4 
    #define PMEM_ADSP_BASE 0x57c00000 
    #define PMEM_ADSP_BASE_SIZE SZ_1M*4
    5)重新編譯內核
    6)修改bootargs 減少Linux可管理的MEM 
    MEM=120MB
    7)重新啟動系統
    啟動信息: 
    pmem: 1 init 
    pmem_adsp: 0 init
    8)查看dev目錄,多了pmempmem_adsp