最近試了Windows 7覺得還不錯用,不過安裝Windows 7時毫無意外的把我的grub毀了…
第一次重裝grub,把一些東西記下來
1. 用Live CD開機
2. 把原先的檔案系統mount在temp的目錄下
3. mount上現有的dev到temp裡的dev
mount --bind /dev /temp/dev
4. chroot到/temp裡
5. update-grub
6. grub-install /dev/sda
這樣就可以恢復grub了
不過我這樣做並沒有找到Windows 7,我進了我的ubuntu 9.10後又update-grub一次/etc/default/grub.cfg才有windows 7出現,至於為什麼我也懶的看了…
現在電腦裡有兩個loader,grub --> windows 7,要進windows 7或windows XP要按兩次,不知grub可不可以載Windows,讓我不要按兩次少掉Windows 7的loader?
星期二, 11月 10, 2009
星期四, 9月 17, 2009
inline 和 macro 的不同
macro 大家應該都很明白就是同樣的Code在前置處理時將其代換成#define中的東西
那inline不也是代換嗎?這兩個差在哪裡?
就我所知,macro是由cpp做的,而inline是一種最佳化,所以它是由compiler做掉
所以inline並不止是代碼替換,而inline並不是在所有地方都會inline
若有個function宣告為 static inline,在其編譯單元會inline,而在其它的編譯單元會用function call,如果沒有其它程式使用到,則不會有function table
若有個function宣告為 extern inline,其都會如同macro展開程式碼,所以不會有function table
這是我google來的,不知道對不對
那inline不也是代換嗎?這兩個差在哪裡?
就我所知,macro是由cpp做的,而inline是一種最佳化,所以它是由compiler做掉
所以inline並不止是代碼替換,而inline並不是在所有地方都會inline
若有個function宣告為 static inline,在其編譯單元會inline,而在其它的編譯單元會用function call,如果沒有其它程式使用到,則不會有function table
若有個function宣告為 extern inline,其都會如同macro展開程式碼,所以不會有function table
這是我google來的,不知道對不對
BOOTSEG = 0x07c0
最近看linux的書,從基本的boot開始看起
但是看到一堆組合語言跟register都看的霧剎剎
尤其是BOOTSEG = 0x07c0跟0x7c00的關係
BIOS會從MBR把OS的開機程式Copy到0x7c00的位址,然後從此開始執行
但在boot.s中只看的到BOOTSEG = 0x07c0卻看不到0x7c00的東西
目前大概知道是因為CS跟IP的關係,但還不是很了解
先把知道的寫在下面,之後看懂了再來補完
CS:Code Segment,指程式從何處開始
IP:Instruction Pointer,指令的位置
程式目前跑到的位置為CS + IP
DS:Data Segment,指資料從記憶體的哪個位址開始
如果在組語中用到[BX]來定址([]為Indirect Addressing),所定的位址為DS + BX
由於指令實際位址都由CPU的程式計數器(PC)來決定,因此80×86CPU的PC = CS × 16 + IP。
所以0x7c00為指令執行的位址,BOOTSEG = 0x07c0代表CS為0x07c0,而IP為零,則指到的位址就是0x7c00
如果不懂可以看看這裡
http://finalfrank.pixnet.net/blog/post/22992166
http://www.ltivs.ilc.edu.tw/kocp/mpu/m3/m3-1-2.htm
但是看到一堆組合語言跟register都看的霧剎剎
尤其是BOOTSEG = 0x07c0跟0x7c00的關係
BIOS會從MBR把OS的開機程式Copy到0x7c00的位址,然後從此開始執行
但在boot.s中只看的到BOOTSEG = 0x07c0卻看不到0x7c00的東西
目前大概知道是因為CS跟IP的關係,但還不是很了解
先把知道的寫在下面,之後看懂了再來補完
CS:Code Segment,指程式從何處開始
IP:Instruction Pointer,指令的位置
程式目前跑到的位置為CS + IP
DS:Data Segment,指資料從記憶體的哪個位址開始
如果在組語中用到[BX]來定址([]為Indirect Addressing),所定的位址為DS + BX
由於指令實際位址都由CPU的程式計數器(PC)來決定,因此80×86CPU的PC = CS × 16 + IP。
所以0x7c00為指令執行的位址,BOOTSEG = 0x07c0代表CS為0x07c0,而IP為零,則指到的位址就是0x7c00
如果不懂可以看看這裡
http://finalfrank.pixnet.net/blog/post/22992166
http://www.ltivs.ilc.edu.tw/kocp/mpu/m3/m3-1-2.htm
訂閱:
文章 (Atom)