2004年03月03日

xitech
ColdFire
linux/uClinux!
wxWindows_2.4.0

x ^= y;
y ^= x;
x ^= y;

2004年03月02日

編譯器編譯聯結後代碼的地址都是以地址0開始的絕對偏移地址,重定位後把各個模塊組合起來,然後映射為虛擬地址
由於在linux下面是基於分段的分頁模式,這時候的上面的虛擬地址是按甚麼原則來分配的呢
 


進程A在地址0×400000映射了可執行文件,進程B同樣也在地址0×400000映射了可執行文件,如果A地址讀0X400000的內容執行的是A的內容,B讀讀0X400000的內容執行的是B的內容,這個比較容易理解
我不理解的是:
當我先把A進程讀入內存運行後,然後退出a讀B進程內容,而此時A還有相同地址的部分內容未退出,由於段描述符裡面有個 p標誌來確定該內容是否已經存在內存中,要是判斷為已存在了,那麼B進程豈不是進不去了


其實解決的方法應該很簡單:
那個P位只對本進程有效判斷
新的進程被裝入後一切又重新開始,
這是由於CPU每次只能處理一個進程,多進程的時候是通過輪循來的
 


內核加載部分最開始必須被寫到固定地址,也就是一個重定位的過程.


在linux中,elf格式的可執行代碼中,ld總是從0×800000開始安排程序的”代碼段”,對每個程序且都是這樣的.


可以利用 objcopy -S -O file file1 得到一個裸的二進制文件,就是開始地址從0×000000開始.