Posts

Showing posts from March, 2011

[JAVA] ECJ

Eclipse ecj (主要針對3.2 3.3 兩個版本) - eclipse compiler for java 這是一個Eclipse內置的java compiler, 屬於JDT(Java Development tools) Core pure Batch compiler, 可以單獨下載使用. How to use: Version Check gg@debian$  export JAVAC= /path/to/javavm -jar /path/to/ecj.jar gg@debian$ $JAVAC -version Eclipse Java Compiler 0.671, 3.2.0 release, Copyright IBM Corp 2000, 2006. All rights reserved. Compile gg@debian$ $JAVAC HelloWorld.java gg@debian$ $JAVA HelloWorld Hello, World 主要是在編GnuClasspath跟Jamvm時一直遇到的問題, 今天算是特底解決了, GCJ對于兩者真是不親和阿... lol

[C]關於 ioctl 跟 ifreq

ioctl() 是提供對device作input/output control的system call, 根據deivce的不同所實作的參數也不同, 但前兩個是固定的. <code>int ioctl(int d, int request, ...)</code> 主要有3個參數: 1. d: descriptor, 是透過open()某個device而得到的handle(linux稱descriptor而windows稱handle), 主要是描述該deivice的abstract indicator. 2. request: 根據不同的device提供的request也不同 ex. SIOCGIFADDRS - Gets the list of addresses associated with an interface. SIOCGIFADDR  - gets an interface address 取得本機位址  int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);  struct ifreq ifr;  ifr.ifr_addr.sa_family = AF_INET;  strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);  ioctl(sock_fd, SIOCGIFADDRS, &ifr); 另外就是 ifreq 是指用來config network device的結構 struct ifreq {     char    ifr_name[IFNAMSIZ];/* Interface name */     union {             struct sockaddrifr_addr;             struct sockaddrifr_dstaddr;             struct sockaddrifr_broadaddr;             struct sockaddrifr_netmask;             struct sockaddrifr_hwaddr;             short   ifr_flags;             int     i

[OS] stack vs heap

2008年10月7日星期二 Stack 及 Heap 基礎概念 作者: 蕭沖 qs.xiao@gmail.com 來源:http://aftcast.blogspot.com/ 這些天因為看到不少網友提到stack overflow的問題,於是想寫一篇簡單但確重要點的雜記。希望大家多多指教,也期待能對一些朋友有所幫助! 1/ windows的flat 模式: 這題目要講起來可以很深,包含許多的組合語言的東西。但在此我只想說一個結果,就是因為windows是使用這樣的一個記憶體管理位址模式,所以使得每個 process都可以有私有的4G的「定址」能力,但因為windows當初要相容MIPS R4000 architecture,所以高位址的2G部份放的是kernel code,而我們的ap只能用低部份的2G,所以正確的來講,我們的程式能夠使用2G的定址能力。 2/虛擬記憶體: 在80386處理器後,cup support 保護模式,paging 模式。我們都知道windows會使用硬碟來充當ram使用,當ram不足的時候。這就是用paging的cpu功能。有了這個功能,os就可以讓每個 process都可以使用2G的data,即使ram只有幾MB。在標題1我們有提到「定址」的這個詞,這只是說cpu的register(暫存器)有能力讓我們定出那麼大的空間。但是可以定出那麼大麼大的空間並不表示你一定先要有那麼大的ram在電腦上。定址是一回事,配置(allocate)又是另一回事,但二者都很重要。比如在dos 80286前的時代,有所謂的640k的限制(那是指定址能力先天不足),所以你就算是買了4MB的ram插在電腦上,還是浪費。回到主題,因為386以後有paging的能力,加上register是32位元,所以就組合出一種相當完美的記憶體管理方法: 每個process都有虛擬的4G記憶體,且可以真的使用到4G,即使你的ram沒有4G,windows會把你的虛擬記憶體資料放到硬碟上。為何說是「虛擬」?就是指你不一定真的有那麼多的真實的ram。比如說你真實的ram有128MB,而你的程式超大,用到512MB,那麼當程式在跑的時候,只會把正需要的code往128MB的ram上放,而把尚不用的放(paging)在硬碟上。 3/ stack: 何謂stack? 是用來放functi

[C] 一些data type

今天在看一個源碼時對一個 data type "uintptr_t" 不了解, google之後發現原來他是有作用的, 來筆記一下. 從 linux man page 可以知道他的宣告是 typedef unsigned int unit16_t; typedef uint16_t uintptr_t; 源自 主要作用是為了再跨平台時, 程式碼可以保存不受破壞. 以下是在x86 debian下跑的結果 printf("signed char:%d\n", sizeof(signed char)); printf("signed short:%d\n", sizeof(unsigned short)); printf("signed int:%d\n", sizeof(signed int)); printf("size_t:%d\n", sizeof(size_t)); printf("signed long:%d\n", sizeof(signed long)); printf("signed long long int:%d\n", sizeof(signed long long int)); debian:/home/xxx/shares/C# ./test_datatype signed char:1 signed short:2 signed int:4 size_t:4 signed long:4 signed long long int:8 另外是一個很神(或說機車)的寫法... [Symbol.h] extern char *symbol_values[]; #define SYMBOL_NAME_ENUM(name) symbol_##name #define SYMBOL(name) symbol_values[SYMBOL_NAME_ENUM(name)] ... ... #define SYMBOLS_DO(action) \ /* Method and field names, etc. */\ action(f, "f"), \ action(m, "m&quo

Computer graphics 筆記

1. 在螢幕上, 將3D實體成現在2D的螢幕上. 簡言之, 即透過3D繪圖的演算法, 計算出投影( projection ). 2. 對一個實景( scene )作 projection, 需要一些資訊, 並將這些資訊轉為數值作計算:  $ 定義一個頂點( Vertex ), 並與其他vertice組成一個mesh架構, 來描述整個scene.  $ 每個Vertex具有許多屬性( attribute )   * coordinate   * normal   * color   * texture cordinate  $ 由vertice間連結成的mesh, 主要有3種 primitive : point, line, and triangle.  $ 最後將這些primitives(geometric object)轉為RGB(pixels). 3. 3D computer graphics最主要的兩個過程是 modeling 跟 rendering .  $ modeling: 將scene轉為vertex & mesh architecture.  $ rendering, render: 目前覺得最合理的意思是著色. 也就是將vertex轉為pixels.   4. rendering的技術有三:  $ ray-tracing :   定義由投影點(camera/eye)到該pixel的位置的路徑為ray, 並透過光的反射折射等原理,   根據一路上碰到的物體或光源來得知該pixel的顏色.(好抽象...)  $ radiosity :   (略, 太難懂)  $ rasterizing :   光柵化, 是說將 vector graphics 轉為 raster graphics 的過程.   raster graphics是指由pixel組成的圖形, 就是點陣圖.   vector graphics是指由geometric model組成的圖型.   EX. 在一個白色畫面上有一個紅色的圓    Raster grphics: 這是一個由紅色跟白色pixel所排列出的圖形    vector grphics: 以向量的方式表示這個圓(圓心,半徑,顏色) 5. 在硬體加速上, rasterizing 實現度最高, 為實作3D pipeline主

[生活]最初的夢想

Image
嗯,趁著最近很有動力,要一鼓作氣!!! 我知道我想要的是什麼

[C] 關於pointer與型態宣告

複習一下pointer... (1)pointer: 指標, 用來儲存 資料物件 的記憶體位址. ex. int var    = 8; int *ptr   = &var; //儲存var位址的指標變數ptr(或說是指向變數var的指標ptr), 其var 為int type int **pptr = &ptr;   <=> int* (*pptr) = &ptr; //儲存ptr位址的指標變數pptr, 其中ptr為int* type (2)*VARIABLE_NAME 可以取出所指向的位址物件的數值. ex. printf("   *ptr=%d\n", *ptr); // 8 printf(" *pptr=%u\n", *pptr); // memory address of var NOTICE 1: *pptr得到的是所存位址(即ptr的位址)的數值(ptr存的是var的位址) NOTICE 2: 不管宣告時有幾個'*', 指標變數,存的就是資料物件的位址. printf("**pptr=%d\n", **pptr); //8 另外就是宣告的型態: (I)   int arr[8][8];  //int array的 array (II)  int **pptr;    //指向int type pointer的 pointer (III) int *parr[8]; //8個指向 int type pointer的 array (IV) int (*parr)[8]; //指向int array的 pointer (V)  int *parr2[7][8]; //指向int type pointer的7x8 array (VI) int (*parr2)[7][8]; //指向7x8array的 pointer (VII)int (*parr2[7])[8]; //7個指向int type array的 array int *parr[7][8];  表示parr是一個有7個elements的array, 每個element皆有8個指向int的指標陣列; in brief, 一個7x8指向int的指標陣列. 另外就是函數指標: char

[C] numerical operation

最近閒著,來複習一下數值運算... Binary representation: 1 byte = 8 bits 可以表示 0~255 或 -128~127, 至於程式表示負數的方式, 是由硬體決定。 一般表示方式為: a.用最高位的那個bit(the most significant bit, MSB)表示正負數 b.當MSB=0, 表示0~127, 當MSB=1, 則以2's complement看之. ex. 00000011=3 10000001=01111111=-127 (作法: 從LSB開始, 第一個為1的bit不動,其餘的0->1, 1->0) 10000000=10000000=-128 11111111=00000001= -1 Binary Logical Operator: '~': 。補數運算子 。ex. ~(1001101) -> 0110010 '&': 。ex. 10010011 & 00111101->00010001 '|': 。ex. 10010011 | 00111101->10111111 '^': 。位元間作運算,只有當1&0或0&1時結果才為1. 。ex. 10010011 ^ 00111101->10101110 ㄧ個常用的integer2Binary涵式: char* Int2Bin(int n, char *pb){     int len = 8*sizeof(int);     int i;     for(i=1;i<=len;i++, n>>=1)     {           pb[len-i]=(1&n)|'0'      }      pb[len+1]='\0'; }