锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
(1)cygwin 2009錛氶泦鎴恎cc-4.3.2錛宺xvt錛岄潪甯擱傚悎涓鑸殑緙栫▼寮鍙戯紝闆嗘垚iso浠?8M
(2)i686-elf鐨刢ygwin toolchain錛屽伐鍏烽摼鐗堟湰錛歡cc-4.3.2, binutils-2.19, glibc-2.7錛屾祴璇曟甯稿伐浣?br>浠ユ宸ュ叿閾劇紪璇戞渶鏂扮殑linux鍐呮牳2.6.28宸ヤ綔姝e父錛宬ernel鎵撲竴浜涜ˉ涓侊細(xì)
cd linux-2.6.28
sed -i 's/R_386_32/1/' ./scripts/mod/modpost.c
sed -i 's/R_386_PC32/2/' ./scripts/mod/modpost.c
sed -i 's/R_ARM_ABS32/2/' ./scripts/mod/modpost.c
sed -i 's/R_ARM_PC24/1/' ./scripts/mod/modpost.c
sed -i 's/R_MIPS_HI16/5/' ./scripts/mod/modpost.c
sed -i 's/R_MIPS_LO16/6/' ./scripts/mod/modpost.c
sed -i 's/R_MIPS_26/4/' ./scripts/mod/modpost.c
sed -i 's/R_MIPS_32/2/' ./scripts/mod/modpost.c
sed -i 's/STT_COMMON/5/g' ./arch/x86/boot/compressed/relocs.c
sed -i 's/STV_DEFAULT/0/g' ./arch/x86/boot/compressed/relocs.c
sed -i 's/STV_INTERNAL/1/g' ./arch/x86/boot/compressed/relocs.c
sed -i 's/STV_HIDDEN/2/g' ./arch/x86/boot/compressed/relocs.c
sed -i 's/STV_PROTECTED/3/g' ./arch/x86/boot/compressed/relocs.c
sed -i 's/R_386_NONE/0/g' ./arch/x86/boot/compressed/relocs.c
sed -i 's/R_386_32/1/g' ./arch/x86/boot/compressed/relocs.c
sed -i 's/R_386_PC32/2/g' ./arch/x86/boot/compressed/relocs.c
sed -i 's/R_386_GOT32/3/g' ./arch/x86/boot/compressed/relocs.c
sed -i 's/R_386_PLT32/4/g' ./arch/x86/boot/compressed/relocs.c
sed -i 's/R_386_COPY/5/g' ./arch/x86/boot/compressed/relocs.c
sed -i 's/R_386_GLOB_DAT/6/g' ./arch/x86/boot/compressed/relocs.c
sed -i 's/R_386_JMP_SLOT/7/g' ./arch/x86/boot/compressed/relocs.c
sed -i 's/R_386_RELATIVE/8/g' ./arch/x86/boot/compressed/relocs.c
sed -i 's/R_386_GOTOFF/9/g' ./arch/x86/boot/compressed/relocs.c
sed -i 's/R_386_GOTPC/10/g' ./arch/x86/boot/compressed/relocs.c
sed -i 's/R_386_NUM/11/g' ./arch/x86/boot/compressed/relocs.c
sed -i 's/ELF32_ST_VISIBILITY(sym->st_other)/sym->st_other \& 0x03/g' ./arch/x86/boot/compressed/relocs.c
sed -i 's/else rm -f $(@D)\/.tmp_$(@F); exit 1;/else mv -f $(@D)\/.tmp_$(@F) $@;/' ./arch/x86/vdso/Makefile
menuconfig涓妸netfilter鍘繪帀錛岄噷闈㈡湁涓浜涙枃浠跺悕涓鏍鳳紙澶у皬鍐欎笉涓鏍鳳級(jí)錛宨pv6涔熷幓鎺夛紝緙栬瘧鐨別lf鏂囦歡姝e父銆?br>
涓婃搗婕曟渤娉?br>2009.01.06
]]>
]]>
]]>
濡傛灉緋葷粺澶勪簬浠跨湡鐨勫垵鏈熻妭鐐癸紝渚嬪鎿嶄綔緋葷粺鐨勫垵濮嬪寲錛岃皟璇曡繕鏄緢鏈夊繀瑕佺殑銆傝繖閲屾槸鎴戝湪linux鐜璋冭瘯鎿嶄綔緋葷粺鐨勭浉鍏沖伐鍏鳳紝os寮鍙戣呭彲鍙傝冿紝嬈㈣繋鎸囨錛氾級(jí)
錛?錛夊伐鍏峰畨瑁咃細(xì)
linux瀹夎錛歜ochs-2.3錛宨nsight-6.6錛実cc-3.4錛堜嬌鐢╣++鍜宎s錛坆inutils鍖呬腑錛夛級(jí)
windows瀹夎錛歑manager Enterprise2.1
鍥犱負(fù)緗戠娌℃湁lotus鍜宑learcase鍦╨inux緋葷粺涓嬬殑鏀寔錛屾墍浠ュ彧濂界敤涓や釜鎿嶄綔緋葷粺浜嗐傝繖鏍蜂篃姣旇緝濂斤紝涓涓敤浜巔rogram錛屼竴涓敤浜庤皟璇曪紝姣曠珶bochs鎸鴻梒pu鐨勶紝灝辮濂瑰共媧誨ソ浜嗐?br>bochs瀹夎錛?/configure --with-all-libs --enable-vbe --enable-gdb-stub && make && make install
insight-6.6瀹夎錛氬寘鍚簡tck/tk錛実db-6.6錛宐fd絳夊伐鍏鳳紝浣跨敤insight鏃舵渶濂借繖鏍瘋緗幆澧冨彉閲忥細(xì)
export LC_ALL=en_US
鍚﹀垯榪愯鏃跺彲鑳戒細(xì)鎶ラ敊錛?br>Tcl_Init failed: can't read "env(TCL_LIBRARY)": no such variable
閰嶇疆xserver鐢ㄤ簬榪滅▼璁塊棶Linux鍥懼艦鐣岄潰錛岃繖鏍峰彲浠ュ湪windows涓婇氳繃ssh鎵цlinux鐨勫浘褰㈢晫闈㈢▼搴忋?br>
錛?錛夌浉鍏蟲枃浠訛細(xì)
bochs閰嶇疆鏂囦歡娣誨姞濡備笅鑺傦細(xì)
gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0
gdb璋冭瘯鑴氭湰錛?br>gdb鐨勫懡浠ら泦鍙互鍐欏叆鍒頒竴涓枃浠朵腑鍘伙紝榪欐牱閬垮厤浜嗗湪鍚姩鏃惰緭鍏ヤ竴澶у爢鍛戒護(hù)錛?00%榧犳爣鎿嶄綔錛焒aint
淇濆瓨鎵鏈夊懡浠ゅ埌涓涓枃浠訛紝姣忚涓涓懡浠わ紝濡備笅錛?br>file ./vmjinix
target remote 127.0.0.1:1234
dir ./arch/i386
dir ./init
dir ./kernel
dir ./drivers
dir ./drivers/video
dir ./drivers/video/console
show dir
break start_kernel
continue
list 0
gdb鍜実db鍓嶇鎵ц濡備笅錛?br>gdb -q -x gdb.command
insight -q -x gdb.command
鍏朵粬鑴氭湰錛堢鐩樿嚜鍔ㄥ垱寤哄垎鍖猴紝鑷姩瀹夎grub錛屾嫹璐濆唴鏍革紝鍙?qiáng)Makefile鑴氭湰錛夛紝榪欎簺璐村嚭鏉ュお闀匡紝鑺變簡濂藉嚑涓皬鏃跺啓濂界殑錛岄渶瑕佸彲浠ュ拰鎴戣仈緋伙紙MSN & Email錛歫inglexy at yahoo dot com dot cn錛?br>
錛?錛夎皟璇曟柟娉?br>灝嗗唴鏍革紙jinix-1.2.1鏄垜姝e湪緙栧啓鐨勪竴涓狢++ 寮婧怬S錛屾榪庡弬涓庯級(jí)鎷瘋礉鍒發(fā)inux涓繪満錛岄厤緗畇amba鍏變韓錛岃繖鏍峰彲浠ュ湪windows涓婂紑鍙戯紙鎺ㄨ崘浣跨敤slickedit 2007錛屽摢浣嶆湁linux涓婄殑2007鐗堟湰鍙惁鍙戜竴涓粰鎴戯級(jí)銆?br>浣跨敤xshell錛坰sh鏂瑰紡錛夌櫥褰曞埌l(fā)inux涓繪満涓婏紝緙栬瘧鍜岃皟璇曢兘鍦ㄨ繖閲屼簡銆?br>鍦╯sh涓婃墽琛宐ochs -f bochsrc.txt.linux錛?br>鍦╯sh涓婃墽琛宨nsight -q -x gdb.command
鎴浘濡備笅錛?br>
姹囩紪璇█鑺傜偣涔熷彲鐢ㄤ嬌鐢╞ochs錛媑db璋冭瘯錛屽湪gdb鏂偣鏃跺欐墽琛岋細(xì)
disassemble $pc $pc+100錛堜粠褰撳墠鏂偣澶勫弽姹囩紪100瀛楄妭錛?br>闇瑕佹敞鎰忕殑鏄紝鍦╫s鐨勬眹緙栧垵濮嬪寲鐨勫墠鏈熼樁孌碉紝鍒嗛〉鏈哄埗寰寰鏈紑鍚紝絎﹀彿鍜屽湴鍧涓嶈兘涓涓瀵瑰簲錛?br>榪欎釜鏃跺欎笉鑳借繘琛屾簮鐮佺駭姹囩紪璋冭瘯錛屽彧鑳界敤鏈鍗充究鐨勫弽姹囩紪璋冭瘯浜嗐?br>bochs-2.3涓ソ鍍忔湁涓猙ug娌℃湁瑙e喅錛宯exti鎵ц鍜宻tepi鍦╟all鐨勬椂鍊欏眳鐒朵竴鏍鳳紝濡傛灉瑕佹柇鐐瑰埌鎸囧畾琛岋紝鍙互浣跨敤鐗╃悊鍦板潃鏂偣銆?br>
錛?錛夋枃绔犱細(xì)涓嶆柇鏇存柊錛屽鏈変粈涔堝ソ鐨勬兂娉曞彲浠ュ湪鍘熷崥瀹㈣璁猴細(xì)
http://m.shnenglu.com/jinglexy
錛?錛夋暣鐞嗙殑涓浠藉父鐢╣db鎸囦護(hù)
x /4wx ds:0x1234 x鏄嚎鎬у湴鍧絀洪棿
xp /4wx 0x1234 xp鏄墿鐞嗗湴鍧絀洪棿
backtrace
print variable 鎵撳嵃鍙橀噺鍊?br>print variable@10 鎵撳嵃鍙橀噺鍚庨潰鐨?0涓暣鏁板?br>set variable=2 璧嬪?br>whatis variable 鏄劇ず鍙橀噺綾誨瀷
ptype variable 鏄劇ず鏁版嵁緇撴瀯錛堝彉閲忕被鍨嬪姞寮虹増錛?br>
鏂偣綾誨瀷錛?br>break init_kernel.cpp:start_kernel 鏂偣鍦ㄦ枃浠剁殑鍑芥暟
break init_kernel.cpp:101 鏂偣鍦ㄦ枃浠剁殑101琛?br>break init_kernel.cpp:101 if var==100 鏉′歡鏂偣
break *0xc0102030
info break 鏌ョ湅鎵鏈夋柇鐐?br>delete breakpoint 3
delete breakpoint 鍒犻櫎鎵鏈夋柇鐐?br>isable breakpoint 2
enable breakpoint 2
search string1 鎼滅儲(chǔ)瀛楃涓詫紝浠巐ist緇撴潫琛屽紑濮?br>reverse-search string1 鏂瑰悜鎼滅儲(chǔ)
set history expansion on 浣跨敤鍘嗗彶鍛戒護(hù)
clear 鍒犻櫎鍒氭墠鍋滄澶勭殑鏂偣
continue 浠庢柇鐐瑰紑濮嬬戶緇墽琛?br>info break 鏄劇ず褰撳墠鏂偣娓呭崟錛屽寘鎷埌杈炬柇鐐瑰鐨勬鏁扮瓑
info files 鏄劇ず琚皟璇曟枃浠剁殑璇︾粏淇℃伅
info func 鏄劇ず鎵鏈夌殑鍑芥暟鍚嶇О
info local 鏄劇ず褰撳嚱鏁頒腑鐨勫眬閮ㄥ彉閲忎俊鎭?br>info prog 鏄劇ず琚皟璇曠▼搴忕殑鎵ц鐘舵?br>info var 鏄劇ず鎵鏈夌殑鍏ㄥ眬鍜岄潤鎬佸彉閲忓悕縐?br>info all
run
continue
step, next, stepi, nexti i鍚庣紑琛ㄧず鎵ц涓鏉℃眹緙栨寚浠?br>
/*********************************************************************************
鏍煎紡璇存槑 /
/*********************************************************************************
x /nuf addr媯(gè)鏌ヤ綅浜庣嚎鎬у湴鍧addr澶勭殑鍐呭瓨鍐呭錛岃嫢addr涓嶆寚瀹氾紝鍒欓粯璁や負(fù)涓嬩竴涓崟鍏冨湴鍧銆?br>xp /nuf addr媯(gè)鏌ヤ綅浜庣墿鐞嗗湴鍧addr澶勭殑鍐呭瓨鍐呭銆?br>鍏朵腑鐨勫彲閫夊弬鏁皀銆乽鍜宖鐨勫垎鍒彲涓猴細(xì)
n嬈叉樉紺哄唴瀛樺崟鍏冪殑璁℃暟鍊鹼紝榛樿鍊間負(fù)1銆?br>u琛ㄧず鍗曞厓澶у皬錛岄粯璁ら夋嫨涓?w'錛?br>b 錛圔ytes錛?瀛楄妭錛?br>h 錛圚alfwords錛?瀛楄妭錛?br>w 錛圵ords錛?瀛楄妭錛?br>g 錛圙iantwords錛?瀛楄妭銆?br>娉ㄦ剰錛氳繖浜涚緝鐣ョ涓嶪ntel鐨勪笉鍚岋紝涓昏鏄負(fù)浜嗕笌GDB璋冭瘯鍣ㄧ殑琛ㄧず娉曚竴鑷淬?br>f鏄劇ず鏍煎紡錛岄粯璁ら夋嫨涓?x'錛?br>x 錛坔ex錛夋樉紺轟負(fù)鍗佸叚榪涘埗鏁幫紙榛樿閫夋嫨錛夛紱
d 錛坉ecimal錛夋樉紺轟負(fù)鍗佽繘鍒舵暟錛?br>u 錛坲nsigned錛夋樉紺烘垚鏃犵鍙峰崄榪涘埗鏁幫紱
o 錛坥ctal錛夋樉紺烘垚鍏繘鍒舵暟錛?br>t 錛坆inary錛夋樉紺烘垚浜岃繘鍒舵暟銆?br>c 錛坈har錛夋樉紺哄瓧鑺備唬鐮佸搴旂殑瀛楃銆傝嫢涓嶆槸鍙樉紺哄瓧絎︿唬鐮侊紝灝辯洿鎺ユ樉紺轟唬鐮併?br>*********************************************************************************/
璇存槑涓涓嬶細(xì)bochs 鍜?insight鏈韓鍗曚釜鎵ц灝遍潪甯告參錛岃屼笖insight鏄氳繃ssh鏂瑰紡閾炬帴榪滅▼xserver鎵ц錛屾墍浠ラ熷害宸ㄦ參錛屾湰鏂囨墍榪板畬鍏ㄥ彲浠ュ叏閮ㄥ湪linux涓婃搷浣滐紝涓嶉檺浜庡鉤鍙般?br>
]]>
1)g++閫夐」-nostartfiles錛氱敤鎴風(fēng)幆澧冪殑鍦╩ain涔嬪墠璋冪敤鐨勪唬鐮侊紝褰撶劧涓嶈兘浣跨敤浜?br>2)鍏ㄥ眬瀵硅薄錛氭瘡縐嶇被鍨嬮兘鏈夎嚜宸辯殑鏋勯犲嚱鏁幫紝濡傛灉涓嶈嚜宸辯紪鍐欎唬鐮佽皟鐢紝瀹冧滑涓嶄細(xì)鎵ц銆?br>榪欏寘鎷墍鏈夊叏灞瀵硅薄鍜屽眬閮╯tatic瀵硅薄錛屽緩璁殑鍋氭硶鏄湪鍐呮牳鏍堝緩绔嬪悗錛宑++榪愯浠g爜鎵ц涔嬪墠
璋冪敤鏋勯犲嚱鏁幫紝濡傛灉鏋勯犲嚱鏁版病鏈夎繍琛岋紙鍋囪閲岄潰鏈夊垎閰嶅唴瀛樹箣綾葷殑鎿嶄綔錛夛紝鍚庢灉寰堜弗閲嶏細(xì)錛?br>鎴戜滑鍙互榪欐牱鍋氾細(xì)
鍏堜慨鏀筭nu-ld閾炬帴鑴氭湰
.data : {
start_ctors = .;
*(.ctor*)
end_ctors = .;
start_dtors = .;
*(.dtor*)
end_dtors = .;
*(.data)
}
榪欐牱鏋勯犲嚱鏁扮殑鎸囬拡灝遍兘淇濆瓨鍦╯tart_ctors 鍜宔nd_ctors涔嬮棿鐨勫唴瀛樹腑浜嗭紝鏋勯犲嚱鏁板叾瀹炲氨鏄痸oid foo(void);褰㈠紡鐨勫嚱鏁幫紝緙栧啓涓涓猣or寰幆
璋冪敤瀹冨嵆鍙紱鏋愭瀯鍑芥暟涔熸槸涓鏍風(fēng)殑銆傚綋姣忎釜鏋勯犲嚱鏁拌皟鐢ㄥ畬鍚庯紝gcc浼?xì)鑷姩璋冪敤涓涓嚱鏁幫細(xì)
int __cxa_atexit(void (* f)(void *), void *p, void *d);
褰撳唴鏍擱鍑烘椂錛屼細(xì)鎵ц涓涓嚱鏁幫細(xì)
void __cxa_finalize(void *d);
榪欎袱涓嚱鏁板繀欏繪寜涓婇潰鏍煎紡瀹氫箟錛実++鏄繖鏍瘋瀹氱殑銆傜湅鐪嬩笅闈㈢殑浠g爜灝辨槑鐧戒簡錛?br>extern "C"
{
int __cxa_atexit(void (*f)(void *), void *p, void *d);
void __cxa_finalize(void *d);
};
void *__dso_handle; /*only the address of this symbol is taken by gcc*/
struct object
{
void (*f)(void*);
void *p;
void *d;
} object[32] = {0};
unsigned int iObject = 0;
int __cxa_atexit(void (*f)(void *), void *p, void *d)
{
if (iObject >= 32) return -1;
object[iObject].f = f;
object[iObject].p = p;
object[iObject].d = d;
++iObject;
return 0;
}
/* This currently destroys all objects */
void __cxa_finalize(void *d)
{
unsigned int i = iObject;
for (; i > 0; --i)
{
--iObject;
object[iObject].f(object[iObject].p);
}
}
3)new鍜宒elete錛氬湪瀹屾垚鍐呭瓨綆$悊鍚庯紝閲嶈澆綾葷殑new鍜宒elete鍑芥暟
4)-nostdlib錛氭妸鏍囧噯搴撶鐢ㄦ帀錛屾渶榪戞湁浜嗙Щ妞峴tl鍒板唴鏍哥殑鎯蟲硶
5)RTTI錛氭渶濂芥槸紱佹瀹冿紝榪欐牱涓嶈兘鐢╰ypeid 鍜?dynamic_cast浜?br>6)紱佺敤寮傚父錛?fno-exceptions錛岃繖涓拰鎿嶄綔緋葷粺澶揣瀵嗕簡
7)綰櫄鍑芥暟錛屽鏋滃瓙綾繪病鏈夊疄鐜扮埗綾諱腑鐨勭函铏氬嚱鏁幫紝閾炬帴鍒頒笅闈㈤粯璁や緥紼嬶細(xì)
extern "C" void __cxa_pure_virtual()
{
// print error message
}
铏界劧涓嶆槸涓轟簡瀹氫箟綰櫄綾葷殑瀵硅薄錛屼絾鏄摼鎺ユ椂緙栬瘧鍣ㄤ細(xì)鎶辨紝鎵浠ュ畾涔変笂闈㈠嚱鏁頒嬌緙栬瘧閫氳繃銆?br>8)濡傛灉涓瀹氳浣跨敤寮傚父錛宺tti錛宯ew/delete錛実cc涓彁渚涗簡闈欐佸簱錛歭ibgcc/libsupc++錛?br>榪樺緱鍐欒繖涓簱鐨勪竴浜涘熀紜鍑芥暟錛岃寰楀畠搴旇鏄湪涓婂眰鎶借薄鍑烘帴鍙o紝灝嗗簳灞傚疄鐜扮┖鍑烘潵緇欑敤鎴峰疄鐜般?br>鑰屼笖浠g爜鏈韓闈炲父澶嶆潅錛岀綉緇滀笂涔熸病鏈変換浣曚腑鏂囪祫鏂欍?br>鎸囦護(hù)錛?br>readelf -a `gcc -print-libgcc-file-name`
閲岄潰瀹氫箟浜嗗緢澶氱殑鍑芥暟銆?br>
]]>
鐩綍錛?br>
鑷繁鍔ㄦ墜鍐欏唴鏍革紙搴忥級(jí)......................... 3
絎? 璇撅細(xì)鐜闇姹?............................ 4
絎? 璇撅細(xì)寮曞紼嬪簭............................. 5
絎? 璇撅細(xì)淇濇姢妯″紡............................. 8
絎? 璇撅細(xì)杈呭姪鍑芥暟............................. 17
絎? 璇撅細(xì)涓柇鍜屽紓甯?.......................... 25
絎? 璇撅細(xì)涓柇鍜屽紓甯?.......................... 39
絎? 璇撅細(xì)澶氫換鍔?.............................. 45
絎? 璇撅細(xì)鏂囦歡緋葷粺............................. 56
絎? 璇撅細(xì)鍐呭瓨綆$悊............................. 70
絎? 璇撅細(xì)緋葷粺璋冪敤鍜屽彲鎵ц紼嬪簭................. 76
涓浠藉厤璐e0鏄?................................ 81
]]>
絎?span lang="EN-US">8璇撅細(xì)鍐呭瓨綆$悊 涓嬭澆婧愪唬鐮?/span>
澹版槑錛氳漿杞借淇濈暀錛?span lang="EN-US">
璇戣咃細(xì)http://m.shnenglu.com/jinglexy
鍘熶綔鑰咃細(xì)xiaoming.mo at skelix dot org
MSN & Email: jinglexy at yahoo dot com dot cn
鐩爣
鎶辨瓑錛屽叾瀹炶繕娌℃湁瀹炵幇銆傚湪浠誨姟鍒嗛厤鐙珛鐨?span lang="EN-US">4G鍦板潃絀洪棿涓婅皟璇曞け璐ヤ簡錛岀幇鍦ㄥ彧浣胯兘浜嗗垎欏墊満鍒訛紝欏靛紓甯搞傚ぇ閲忕殑宸ヤ綔鏈疄鐜幫紝鏈夊叴瓚g殑鍚屽鍙互鎼滅儲(chǔ)buddy鍜?span lang="EN-US">slab鐨勭浉鍏寵祫鏂欙紝緇忓吀鐨勫唴瀛樼鐞嗙畻娉曘?span lang="EN-US">
鍒嗛〉
386澶勭悊鍣ㄧ殑鍐呭瓨綆$悊鍗曞厓鍙互瀹炵幇浠誨姟鐙珛鍦板潃絀洪棿錛屼換鍔¢棿鍐呭瓨淇濇姢銆傛瘡涓換鍔″彲浠ユ嫢鏈夌嫭绔嬬殑4G铏氭嫙鍦板潃絀洪棿銆傚唴瀛樻槧灝勬槸鍐呭瓨綆$悊寰堥噸瑕佺殑涓姝ワ紝鍙互鍒嗕負(fù)涓ら儴鍒嗭細(xì)鍒嗘鍜屽垎欏點(diǎn)傚墠闈㈢殑璇劇▼涓凡緇忚璁鴻繃鍒嗘鏈哄埗浜嗭紝閫氳繃鍒嗘鍙互闅斿紑涓嶅悓鐨勪唬鐮侊紝鏁版嵁錛屽爢鏍堢瓑錛涘垎欏靛崟鍏冩妸铏氭嫙鍦板潃鏄犲皠鎴愮墿鐞嗗湴鍧錛岃繕鍙互鐢ㄦ潵瀹炵幇铏氭嫙鍐呭瓨錛堝拰紜洏鍒嗗尯榪涜浜ゆ崲錛夛紝鐜板湪鎴戜滑鏉ヤ簡瑙d竴涓嬪畠銆?span lang="EN-US">
瀵逛簬姣忎釜浠誨姟錛屾垜浠棤娉曞垎閰?span lang="EN-US">4G鐨勭墿鐞嗗唴瀛橈紝鎵浠ヤ嬌鐢ㄤ簡涓浜涙満鍒舵潵綆$悊鍐呭瓨錛氬強(qiáng)铏氭嫙鍐呭瓨鏈哄埗銆傝鏈哄埗鏈夊鐞嗗櫒鐨勫垎欏甸儴鍒嗘潵瀹炵幇錛岄鍏堟垜浠皢鍐呭瓨鍒嗘垚涓浜涘潡錛屾瘡涓潡澶у皬涓?span lang="EN-US">4k錛岄氬父鎴戜滑縐頒箣涓轟竴涓〉甯с傛搷浣滅郴緇熼氳繃欏電洰褰曞拰欏佃〃鏉ョ鐞嗚繖浜涢〉甯с傞〉鐩綍鏄浉褰撲簬絎竴綰ч〉琛紝鍏朵腑鐨勬瘡涓欏瑰啀綆$悊涓涓笅綰ч〉琛ㄣ傦紙鏇磋緇嗚繃紼嬭鍙傝?span lang="EN-US">intel鐨?span lang="EN-US">IA 32/64鎵嬪唽錛?span lang="EN-US">
褰撳垎欏墊満鍒跺紑鍚椂錛屽鐞嗗櫒鎶婁換鍔′腑鐨勮櫄鎷熷湴鍧杞崲鎴愮墿鐞嗗湴鍧錛屾楠ゅ涓嬶細(xì)
1.鏌ユ壘孌甸夋嫨瀛愬湪GDT 鎴?span lang="EN-US"> LDT 涓殑鎻忚堪絎︼紝鍋氫竴浜涙潈闄愭鏌ワ紝鐪嬬湅鑳藉惁璁塊棶
2.浠ユ弿榪扮涓殑鍩哄潃鐩稿姞欏電洰褰曞熀鍧寰楀埌涓涓嚎鎬у湴鍧
3.鍦ㄩ〉琛ㄤ腑绱㈠紩铏氭嫙鍦板潃鎵瀵瑰簲鐨勯〉琛ㄩ」錛屽緱鍒伴〉鍦板潃
4.鏌ユ壘鍋忕Щ寰楀埌瀹為檯鐗╃悊鍦板潃銆?span lang="EN-US">
濡傛灉瀹為檯鐗╃悊欏典笉瀛樺湪錛堝彲鑳戒氦鎹㈠埌紜洏涓幓浜嗭級(jí)錛屽垯寮曞彂寮傚父錛屽彲浠ュ湪榪欎釜寮傚父閲岄潰鍋氭兂瑕佸仛鐨勪簨鎯咃紙鍔犺澆紜洏涓殑浜ゆ崲欏碉紝鎴栬?span lang="EN-US">kill榪欎釜紼嬪簭錛?span lang="EN-US">Segment Fault錛岀瓑絳夛級(jí)
澶勭悊鍣ㄤ嬌鐢ㄧ殑欏電洰褰曟垨鑰呴〉琛紝閮芥槸鐢?span lang="EN-US">32 浣嶇殑欏圭粍鎴愶細(xì)
欏電洰褰曢」錛?/span>
31 12
11 9 876 5
43 2 1 0
鈹忊攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲敁
鈹?nbsp; 鎸囧悜欏佃〃鐨勭墿鐞嗗湴鍧 鈹?鐢ㄦ埛瀹氫箟 鈹?nbsp; X 鈹?nbsp;A鈹? X 鈹?U/S鈹?R/W鈹?P 鈹?o:p>
鈹椻攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲敍
欏佃〃欏癸細(xì)
31 12
11 9 87 6 5
43 2 1 0
鈹忊攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲敁
鈹?nbsp; 鎸囧悜欏靛撫鐨勭墿鐞嗗湴鍧 鈹?鐢ㄦ埛瀹氫箟 鈹?nbsp;X鈹僁鈹?nbsp;A鈹?X 鈹? U/S鈹?R/W鈹?P 鈹?o:p>
鈹椻攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲敍
浠庝笂闈㈠彲浠ョ煡閬擄紝欏電洰褰曢」鍜岄〉琛ㄩ」鐨勭粨鏋勫緢綾諱技錛屼笅闈㈤愪釜璇存槑涓涓嬪叾涓殑鍩燂細(xì)
|
Bit 0 |
P |
瀛樺湪浣嶏紙present錛夛紝涓?span lang="EN-US">0 琛ㄧず璇ラ〉甯ф垨欏佃〃涓嶅湪鍐呭瓨涓傚鏋滆闂欏瑰皢鍙戠敓寮傚父銆?span lang="EN-US"> |
|
Bit 1 |
R/W |
琛ㄧず欏佃〃鎴栭〉甯ф寚鍚戠殑鍐呭瓨鍙錛堬紳0錛夛紝鎴栧彲鍐欙紙錛?span lang="EN-US">1錛?span lang="EN-US"> |
|
Bit 2 |
U/S |
琛ㄧず欏佃〃鎴栭〉甯х殑鏉冮檺錛屽綋鐗規(guī)潈綰т負(fù)0鏃訛紝鍙湁ring0鍒?span lang="EN-US">2鐨勭壒鏉冪駭鍙互璁塊棶瀹冿紝鍚﹀垯鎵鏈夌殑ring3浠誨姟閮藉彲浠ヨ闂傝繖涓煙闈炲父閲嶈銆?span lang="EN-US"> |
|
Bits 3, 4, (6), 7, 8 |
X |
Intel 淇濈暀浣嶏紝璁劇疆涓?span lang="EN-US">0灝辮浜?span lang="EN-US"> |
|
Bit 5 |
A |
璇ラ〉鏄惁宸茶闂?span lang="EN-US"> |
|
Bits 9-11 |
鐢ㄦ埛瀹氫箟 |
鎴戜滑浣跨敤絎?span lang="EN-US">11浣嶏紝琛ㄧず璇ラ〉甯ф槸鍚﹁浜や簰鍒扮‖鐩樹笂浜?span lang="EN-US"> |
欏電洰褰曠殑姣忎竴欏癸細(xì)鍗抽〉琛ㄧ殑鐗╃悊鍦板潃錛屽畠鐨勯珮20 浣嶅湴鍧琛ㄧず鏈変釜欏靛撫鐨勮搗濮嬪湴鍧錛屾濂藉拰4k瀵歸綈銆?span lang="EN-US">2^20鍙互琛ㄧず1M鑼冨洿錛屾瘡涓〉甯уぇ灝忔槸4k錛屾墍浠ュ彲浠ョ儲(chǔ)寮?span lang="EN-US">1M * 4K鍦板潃絀洪棿銆傞〉鐩綍欏逛腑榪樻湁涓涓?span lang="EN-US">D 浣嶏紝瀹冪敤鏉ヨ〃紺轟竴涓〉甯ф槸鍚﹀凡淇敼錛?span lang="EN-US">linux鐢ㄥ畠鏉ヨ〃紺轟竴涓〉闈㈤噴鏀炬槸鑴忛〉闈紝榪欎釜浣嶉潪甯告湁鐢紝褰撲竴涓〉甯т氦鎹㈠埌紜洏涓婂悗錛屽鏋滆欏靛撫榪樻病鏈夎淇敼錛岃屼笖鏄凡緇忎粠紜洏浜ゆ崲鍑烘潵鐨勶紝鍒欑畝鍗曞彇娑堜互鍚庣殑浜ゆ崲銆?span lang="EN-US">
涓轟簡灝嗛昏緫鍦板潃杞崲鎴愮墿鐞嗗湴鍧錛岄昏緫鍦板潃琚垎鎴?span lang="EN-US">3 閮ㄥ垎錛?span lang="EN-US">
|
Bits 31-22 |
欏電洰褰曢」鐨勭儲(chǔ)寮曚笅鏍囷紝鐢卞畠鍙互寰楀埌欏佃〃鐨勭墿鐞嗗湴鍧 |
|
Bits 21-12 |
欏佃〃欏圭殑绱㈠紩涓嬫爣錛岀敱瀹冨彲浠ュ緱鍒伴〉甯х殑鐗╃悊鍦板潃 |
|
Bits 11-0 |
鐩稿欏靛撫璧峰鍦板潃鐨勫亸縐?span lang="EN-US"> |
涓句緥鏉ヨ錛屾垜浠湁涓涓昏緫鍦板潃錛?span lang="EN-US">0x3E837B0A銆傚墠鎻愭潯浠訛細(xì)CR3瀵勫瓨鍣ㄦ寚鍚戠殑欏電洰褰曞湴鍧鏄?span lang="EN-US"> 0x0005C000錛岃繖涓瘎瀛樺櫒瀛樺偍浜嗗綋鍓嶉〉鐩綍鎵浣跨敤鐨勯〉甯х殑鐗╃悊鍦板潃錛岄氬父涔熷彨鍋?span lang="EN-US">
PDBR銆?span lang="EN-US">
鍏堝彇瀹冪殑楂?span lang="EN-US">10浣嶏紝 灝辨槸0x0FA錛岀敱瀹冨彲浠ョ儲(chǔ)寮曞埌欏電洰褰曠殑絎?span lang="EN-US">0x0FA欏癸紝鎴戜滑鍙栧緱榪欎竴欏圭殑鍊鹼紝鍋囪寰楀埌鐨勫湴鍧鍊兼槸0x0003F000銆傜劧鍚庢垜浠彇铏氭嫙鍦板潃鐨勪腑闂?span lang="EN-US">10浣嶏紝灝辨槸0x037錛屽啀鍙栧嚭0x0003F000鎸囧悜欏靛撫鐨勭0x037欏圭殑鍊鹼紝鍋囪鏄?span lang="EN-US">0x0001B000銆傝繖涓湴鍧灝辨槸鎴戜滑瑕佹壘鐨勮櫄鎷熷湴鍧瀵瑰簲鐨勭墿鐞嗗湴鍧鐨勯〉甯х殑璧峰鍦板潃錛屾渶鍚庡姞涓婂亸縐誨鹼紙浣?span lang="EN-US">12浣嶏級(jí)錛屽嵆0xB0A錛屽緱鍒板疄闄呯殑鐗╃悊鍦板潃鏄細(xì)0x0001BB0A銆?span lang="EN-US">
鐩稿叧鐨勭煡璇嗗彲浠ュ弬鑰?span lang="EN-US"> Intel 鐨?span lang="EN-US">IA 32/64鎵嬪唽銆?span lang="EN-US">
CR3瀵勫瓨鍣ㄥ繀欏誨湪鍒嗛〉鏈哄埗寮鍚墠灝辮杞藉ソ錛屽彲浠ヤ嬌鐢?span lang="EN-US">MOV 鎸囦護(hù)鎴栬呭湪浠誨姟鍒囨崲鏃朵嬌鐢?span lang="EN-US">TSS涓殑CR3鍩熺殑鍊箋傚綋澶勭悊鍣ㄨ闂笉瀛樺湪鐨勯〉甯ф椂錛屽彂鐢熶竴涓紓甯革紝CR2 瀵勫瓨鍣ㄥ瓨寮曞彂寮傚父鐨勯昏緫鍦板潃錛屽悓鏃墮敊璇爜涔熶細(xì)鍘嬪叆鍒板爢鏍堜腑錛岄敊璇爜鏍煎紡濡備笅錛?span lang="EN-US">
31
3 2 1 0
鈹忊攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲敁
鈹?nbsp; 鏈嬌鐢?span lang="EN-US"> 鈹?U/S鈹?R/W鈹?P 鈹?o:p>
鈹椻攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲敍
寮傚父澶勭悊渚嬬▼閫氬父閲囧彇濡備笅鐨勬楠わ細(xì)
鏌ユ壘涓涓┖闂茬殑欏靛撫鎴栦粠紜洏涓皢欏靛撫浜ゆ崲鍑烘潵錛岄噸鏂拌緗紜殑欏電洰褰曢」鎴栭〉琛ㄩ」鐨勫鹼紝鍒鋒柊TLB銆傚鐞嗗櫒閫氬父淇濆瓨鏈榪戞渶澶氳闂殑欏電洰褰曟垨欏佃〃欏瑰埌涓涓?span lang="EN-US">cache涓紝浠ラ伩鍏嶆瘡嬈¢兘榪涜铏氭嫙鍦板潃鍒扮墿鐞嗗湴鍧鐨勮漿鎹紝榪欎釜cache灝卞彨鍋?span lang="EN-US">TLB銆傚彧鏈夋垜浠敼鍔ㄤ簡欏電洰褰曟垨欏佃〃欏癸紝灝卞簲褰撳埛鏂?span lang="EN-US">TLB銆傛柟娉曞緢綆鍗曪紝灝辨槸閲嶆柊鍔犺澆CR3 瀵勫瓨鍣ㄣ?span lang="EN-US">
鐜板湪鎴戜滑鏉ョ湅鐪嬩唬鐮佹錛屽唴瀛樼鐞嗛氬父灝戜笉浜嗗ぇ閲忕殑瀹忓畾涔夛細(xì)
08/include/kernel.h
#define PAGE_DIR
((HD0_ADDR+HD0_SIZE+(4*1024)-1) & 0xfffff000)
鐗╃悊鍐呭瓨瀹夋帓錛?span lang="EN-US">IDT錛堝湪0x40000錛夛紝鎺ヤ笅鏉ユ槸GDT錛屾帴涓嬫潵鏄?span lang="EN-US">HD0浣跨敤錛岀劧鍚庢墠鏄〉鐩綍錛?span lang="EN-US">
鎵浠ヨ繖涓畯鐪嬭搗鏉ユ湁鐐歸暱銆?span lang="EN-US">
08/include/mm.h
#define PAGE_SIZE
(4*1024) /*
欏靛撫綺掑害 */
#define PAGE_TABLE (PAGE_DIR+PAGE_SIZE) /*
欏佃〃鐗╃悊鍦板潃 */
#define MEMORY_RANGE (4*1024)
/* skelix鍙鐞?span lang="EN-US">4M 鍐呭瓨鏆傛椂 */
08/mm.c
/* 鐗╃悊鍐呭瓨浣跨敤鎯呭喌鐨勪綅鍥捐〃 */
static char mmap[MEMORY_RANGE/PAGE_SIZE] = {PG_REVERSED,
};
void
mm_install(void) {
unsigned int *page_dir = ((unsigned int *)PAGE_DIR);
unsigned int *page_table = ((unsigned int *)PAGE_TABLE);
unsigned int address = 0;
int i;
for(i=0; i<MEMORY_RANGE/PAGE_SIZE; ++i) {
/* 欏佃〃欏瑰睘鎬ц緗負(fù): kernel, r/w, present */
page_table[i] = address|7;
address += PAGE_SIZE;
};
// 涓婇潰寰幆鍒濆鍖栦簡0~4M瀵瑰簲鐨勬墍鏈夐〉琛ㄩ」
page_dir[0] = (PAGE_TABLE|7);
// 欏電洰褰曢」鍙渶瑕佺涓涓氨鍙互浜嗭紝鍥犱負(fù)鍙湁4M鍐呭瓨
for (i=1; i<1024; ++i)
page_dir[i] = 6;
// 鍏朵粬鐨?span lang="EN-US">1023涓〉鐩綍欏硅緗負(fù)絀猴紝濡傛灉榪?span lang="EN-US">1024欏歸兘璁劇疆錛屽彲璁塊棶4G鍐呭瓨絀洪棿
// 璁劇疆0锝?span lang="EN-US">1M鍐呭瓨涓哄凡浣跨敤銆?span lang="EN-US">
for (i=(1*1024*1024)/PAGE_SIZE-1; i>=0; --i)
mmap[i] = PG_REVERSED;
// 鍥犱負(fù)鍐呮牳鍙敤鍒頒簡浣庝簬1M鐨勫唴瀛橈紝鎵浠ヤ繚鐣欏畠浠紝榪欐牱灝變笉浼?xì)琚氦鎹㈠嚭鍘讳?span lang="EN-US">
__asm__ (
"movl
%%eax,
%%cr3\n\t" // 鍔犺澆欏電洰褰曞熀鍧鍒板瘎瀛樺櫒
"movl
%%cr0, %%eax\n\t"
"orl $0x80000000,
%%eax\n\t"
"movl
%%eax,
%%cr0"::"a"(PAGE_DIR)); // 寮鍚垎欏墊満鍒訛紝CR0鐨勬渶楂樹綅
}
閫氳繃mmap浣嶅浘錛屾垜浠彲浠ユ竻妤氱殑鐭ラ亾鍐呭瓨鐨勪嬌鐢ㄦ儏鍐碉紝榪欐牱灝卞彲浠ュ垎閰嶇┖闂查〉甯т簡錛屽涓嬶細(xì)
08/mm.c
unsigned int
alloc_page(int type) {
int i;
for (i=(sizeof mmap)-1; i>=0 && mmap[i]; --i)
;
if (i < 0) {
kprintf(KPL_PANIC, "NO MEMORY
LEFT");
halt();
}
mmap[i] = type;
return
i; // 榪斿洖欏靛撫鍙?span lang="EN-US">
}
void *
page2mem(unsigned int nr)
{ // 杞崲涓鴻櫄鎷熷湴鍧
return (void *)(nr * PAGE_SIZE);
}
void
do_page_fault(enum KP_LEVEL kl,
unsigned int
ret_ip, unsigned int ss, unsigned int gs,
unsigned int
fs, unsigned int es, unsigned int ds,
unsigned int
edi, unsigned int esi, unsigned int ebp,
unsigned int
esp, unsigned int ebx, unsigned int edx,
unsigned int
ecx, unsigned int eax, unsigned int isr_nr,
unsigned int
err, unsigned int eip, unsigned int cs,
unsigned int
eflags,unsigned int old_esp, unsigned int old_ss) {
unsigned int cr2, cr3;
(void)ret_ip; (void)ss; (void)gs; (void)fs; (void)es;
(void)ds; (void)edi; (void)esi; (void)ebp; (void)esp;
(void) ebx; (void)edx; (void)ecx; (void)eax;
(void)isr_nr; (void)eip; (void)cs; (void)eflags;
(void)old_esp; (void)old_ss; (void)kl;
__asm__ ("movl %%cr2, %%eax":"=a"(cr2));
__asm__ ("movl %%cr3, %%eax":"=a"(cr3));
kprintf(KPL_PANIC, "\n The fault at %x cr3:%x was
caused by a %s. "
"The accessing
cause of the fault was a %s, when the "
"processor was
executing in %s mode, page %x is free\n",
cr2, cr3,
(err&0x1)?"page-level protection voilation":"not-present
page",
(err&0x2)?"write":"read",
(err&0x4)?"user":"supervisor",
alloc_page(PG_NORMAL));
}
欏靛紓甯稿嚱鏁幫紝瀹冧粈涔堜篃娌℃湁鍋氾紝鐭ヨ瘑鏄劇ず涓浜涢敊璇俊鎭?span lang="EN-US">
鐜板湪鎴戜滑鏉ュ姩鎬佺殑鍒嗛厤涓浜涘唴瀛橈紝鎴戜滑淇敼涓涓嬩換鍔″嚱鏁幫細(xì)
08/init.c
static void
new_task(unsigned int eip) {
struct TASK_STRUCT *task = page2mem(alloc_page(PG_TASK));
memcpy(&(task->tss), &(TASK0.tss), sizeof(struct
TSS_STRUCT));
task->tss.esp0 = (unsigned int)task + PAGE_SIZE;
task->tss.eip = eip;
task->tss.eflags = 0x3202;
task->tss.esp = (unsigned int)page2mem(alloc_page(PG_TASK))+PAGE_SIZE;
task->tss.cr3 = PAGE_DIR;
task->priority = INITIAL_PRIO;
task->ldt[0] = DEFAULT_LDT_CODE;
task->ldt[1] = DEFAULT_LDT_DATA;
task->next = current->next;
current->next = task;
task->state = TS_RUNABLE;
}
鑷繁鍒嗛厤鐨勪換鍔℃暟鎹粨鏋勫拰浠誨姟鍫嗘爤錛屾槸涓嶆槸寰堟湁鎴愬氨鎰燂細(xì)錛?span lang="EN-US">
鏈鍚庡湪init.c涓坊鍔犲垵濮嬪寲浠g爜錛?span lang="EN-US">
08/init.c
void
init(void) {
char wheel[] = {'\\', '|', '/', '-'};
int i = 0;
idt_install();
pic_install();
mm_install(); /* 鍒濆鍖栧嚱鏁拌皟鐢?span lang="EN-US"> */
kb_install();
timer_install(100);
set_tss((unsigned long long)&TASK0.tss);
set_ldt((unsigned long long)&TASK0.ldt);
__asm__ ("ltrw
%%ax\n\t"::"a"(TSS_SEL));
__asm__ ("lldt
%%ax\n\t"::"a"(LDT_SEL));
kprintf(KPL_DUMP, "Verifing disk partition
table....\n");
verify_DPT();
kprintf(KPL_DUMP, "Verifing file systes....\n");
verify_fs();
kprintf(KPL_DUMP, "Checking / directory....\n");
verify_dir();
sti();
new_task((unsigned int)task1_run);
new_task((unsigned int)task2_run);
__asm__ ("movl %%esp,%%eax\n\t" \
"pushl %%ecx\n\t"
\
"pushl
%%eax\n\t" \
"pushfl\n\t" \
"pushl
%%ebx\n\t" \
"pushl
$1f\n\t" \
"iret\n" \
"1:\tmovw
%%cx,%%ds\n\t" \
"movw
%%cx,%%es\n\t" \
"movw %%cx,%%fs\n\t"
\
"movw
%%cx,%%gs" \
::"b"(USER_CODE_SEL),"c"(USER_DATA_SEL));
__asm__ ("incb 0xeeffeeff");
/* 嫻嬭瘯錛?/span>瑙﹀彂涓涓紓甯?span lang="EN-US"> */
for (;;) {
__asm__ ("movb
%%al, 0xb8000+160*24"::"a"(wheel[i]));
if (i == sizeof wheel)
i = 0;
else
++i;
}
}
寮傚父澶勭悊渚嬬▼涓粈涔堜篃娌″仛錛岃闂唴瀛樺嚭閿欏垯姝繪満錛?span lang="EN-US">
08/exceptions.c
void
page_fault(void) {
__asm__ ("pushl
%%eax;call do_page_fault"::"a"(KPL_PANIC));
halt();
}
鏈鍚庢妸mm.o 娣誨姞鍒?span lang="EN-US"> Makefile 鐨?span lang="EN-US">KERNEL_OBJS 涓幓錛?span lang="EN-US">
08/Makefile
KERNEL_OBJS= load.o init.o isr.o timer.o libcc.o scr.o
kb.o task.o kprintf.o hd.o exceptions.o fs.o mm.o
涓銆?/span>solaris 鍐呮牳鍙?qiáng)搴旂敤绋嬪簭婧惤E嬪簭錛?/span>
http://src.opensolaris.org/source 涓婚〉
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/ls/ls.c 鑼冧緥錛?/span>ls婧愮▼搴?/span>
浜屻佹瘮杈冨鐨?/span>gcc璧勬枡
涓夈?/span>linux鍐呮牳浜ゅ弶寮曠敤錛屼粠0.1鍒?.0錛?.0錛?.2錛?.4錛?/span>
http://www.oldlinux.org/lxr/http/source/
鍥涖?/span>C 璇█甯歌闂闆?/span>(涓嫳鏂?/span>)
http://c-faq-chn.sourceforge.net/
浜斻佹搷浣滅郴緇熺浉鍏崇殑涓浜涜祫鏂欙紝鍖呮嫭linux婧愮▼搴忓垎鏋?/span>
鍏?/span>linus鑷紶
http://www.bookcool.com/online/zhuanji/happyking-gb/0/content.htm
涓冦佸祵鍏ュ紡鍙?qiáng)OS寮鍙戣祫鏂欙紙鑻辨枃錛?/span>
鍏?/span>Testing and debugging KOS錛堣嫳鏂囷級(jí)
http://kos.enix.org/~d2/snapshots/kos_current/doc/testingen-html
涔?jié)銆?/span>the Single UNIX Specification Version 3錛堟帹鑽愶細(xì)鍙綔涓?/span>posix鐨勬浛浠e弬鑰冭祫鏂欙級(jí)
http://www.unix.org/single_unix_specification
鍗併?/span>OS璁捐鍙傝冿紙鑻辨枃錛?/span>
http://www.nondot.org/~sabre/os/articles
澹版槑錛氳漿杞借淇濈暀錛?/span>
璇戣?/span>錛?/span>http://m.shnenglu.com/jinglexy
鍘熶綔鑰咃細(xì)xiaoming.mo at skelix dot org
MSN & Email: jinglexy at yahoo dot com dot cn鐩爣 涓嬭澆婧愮▼搴?/span>
榪欒妭璇炬垜浠榪扮殑鍐呭涓庢搷浣滅郴緇熸殏鏃犲お澶у叧緋伙紝浣嗘槸榪欎簺鍩虹鍑芥暟闈炲父閲嶈錛屽茍涓斿湪鍚庨潰鐨勮紼嬩腑緇忓父鐢ㄥ埌銆傝繖灝辨槸鎴戜滑緇忓父鍚埌鐨勫唴鏍稿簱銆傚鏋滀綘瀵硅繖浜涗笉鏄緢鎰熷叴瓚o紝鐭ラ亾kprintf璞?span lang="EN-US">c璇█閲岄潰鐨?span lang="EN-US">print涓鏍峰伐浣滃氨琛屼簡銆傜畝鍗曟帬榪囧嵆鍙?span lang="EN-US">
C鐢ㄦ埛搴撻噷闈㈢殑printf鍏鋒湁楂樺害鍙幾緙╂э紝涔熷緢瀹規(guī)槗鐞嗚В錛岀浉姣斾箣涓?span lang="EN-US">C錛嬶紜涓殑IO榪愮畻絎﹀氨姣旇緝闅句簡銆備負(fù)浜嗗湪灞忓箷涓婃樉紺哄瓧絎︿覆鎴栨暟鎹紝鎴戜滑鐜板湪闇瑕佸疄鐜扮被浼?span lang="EN-US">C
榪欓噷鏈変竴縐嶆柟娉曟潵瀹炵幇錛屾垜浠洿鍒拌薄func(int arg1, int arg2, int arg3)榪欐牱涓涓嚱鏁拌璋冪敤鏃訛紝瀹冩眹緙栧悗鐨勬寚浠ゅ簲璇ュ涓嬶紙鎵鏈変粠宸﹀悜鍙沖叆鏍堢殑緙栬瘧鍣ㄥ簲璇ヤ粠鍦扮悆涓婂交搴曟秷澶憋級(jí)錛?span lang="EN-US">
pushl arg3
pushl arg2
pushl arg1
call func
鎴戜滑鐪嬪埌錛屽弬鏁頒粠鍙沖悜宸︿竴涓釜鍏ユ爤錛屽弬鏁拌秺澶氾紝鍏ユ爤瓚婃繁銆傚鏋滄槸鍙彉鍙傛暟閭f垜浠庝箞鐭ラ亾鏈夊灝戜釜鍙傛暟鍛紵絳旀鏄?span lang="EN-US">printf鏍煎紡鍖栧瓧絎︿覆涓弬鏁板垽鏂細(xì)鏈夊灝戜釜%X錛屽氨鏈夊灝戜釜鍙傛暟瑕佽В鏋愩傚湪32浣嶆ā寮忎笅錛屾墍鏈夊皬浜?span lang="EN-US">4瀛楄妭鐨勫弬鏁伴兘琚綋浣?span lang="EN-US">4瀛楄妭澶勭悊銆備緥濡備竴涓?span lang="EN-US">char鍨嬪弬鏁幫紝鍏ユ爤鏃跺氨鏄?span lang="EN-US">int鍨嬩簡錛屾墍浠ュ湪瑙f瀽鍙傛暟鏃跺姟蹇呬繚璇佹紜?span lang="EN-US">
鎴戜滑榪欐牱璁捐kprintf鍙傛暟錛?span lang="EN-US">kprintf(color,
format string, arguments...)
絎竴涓弬鏁板畾涔夎緭鍑虹殑鍓嶆櫙/鑳屾櫙棰滆壊銆傛垜浠畾涔変簡寰堝瀹忔潵瑙f瀽鏍堬紝濡傛灉浣犵啛鎮(zhèn)?span lang="EN-US">C璇█搴旇寰堝鏄撶悊瑙e畠浠?span lang="EN-US">
03/kprintf.c
#define args_list char
* // 榪欎釜瀹忕敤渚嬭漿鎹㈡爤絀洪棿涓哄瓧絎︿覆鎸囬拡
#define _arg_stack_size(type)
(((sizeof(type)-1)/sizeof(int)+1)*sizeof(int))
// 榪欎釜瀹忓洓鑸嶄簲鍏ュ弬鏁板ぇ灝忎負(fù)4瀛楄妭鐨勫嶆暟
#define args_start(ap, fmt) do { \
ap = (char *)((unsigned int)&fmt + _arg_stack_size(&fmt));
\
} while (0)
//
鍙傛暟灝嗕粠鏍煎紡鍖栧瓧絎︿覆鍚庨潰寮濮嬭В鏋愶紝鍗?span lang="EN-US">fmt灝辨槸鏍堥《錛屼笂闈㈣繖涓畯灝辨槸鍙栧弬鏁扮殑棣栧湴鍧
#define args_end(ap) //
鍒扮幇鍦ㄤ負(fù)姝紝浠涔堜篃涓嶅仛
#define args_next(ap, type) (((type *)(ap+=_arg_stack_size(type)))[-1])
//
鍙?span lang="EN-US">‘褰撳墠’鍙傛暟鍦板潃錛岀劧鍚庤緗寚閽堜負(fù)涓嬩竴涓弬鏁板湴鍧錛屾毀鏄х殑鍑芥暟鍚嶏紒
03/kprintf.c
static char buf[1024] =
{-1}; // 娉ㄦ剰娌℃湁閿佷繚鎶わ紝寮曠敤璇ュ彉閲忕殑鍑芥暟涓嶅彲閲嶅叆錛?span lang="EN-US">
static int ptr = -1;
涓嬮潰涓や釜鍑芥暟瑙f瀽鍊間負(fù)鎸囧畾鐨勮繘鍒舵暟錛?span lang="EN-US">
static void
parse_num(unsigned int value, unsigned int base)
{ // 鍙互鎵撳嵃灝忎簬絳変簬10榪涘埗鐨勬暟
unsigned int n = value / base;
int r = value % base;
if (r < 0) {
r += base;
--n;
}
if (value >= base)
parse_num(n, base);
buf[ptr++] = (r+'0');
}
static
void //
鎵撳嵃16榪涘埗鏁?span lang="EN-US">
parse_hex(unsigned int value) {
int i = 8;
while (i-- > 0) {
buf[ptr++] =
"0123456789abcdef"[(value>>(i*4))&0xf];
}
}
鐜板湪鎴戜滑鏉ョ湅涓涓?span lang="EN-US"> kprintf榪欎釜鍑芥暟錛屽畠鏀寔鐨勬牸寮忥細(xì)%s,
%c, %x, %d, %%
void
kprintf(enum KP_LEVEL kl, const char *fmt, ...) {
int i = 0;
char *s;
/* must be the same size as enum KP_LEVEL */
struct KPC_STRUCT {
COLOUR fg;
COLOUR bg;
} KPL[] = {
{BRIGHT_WHITE, BLACK},
{YELLOW, RED},
};
enum KP_LEVEL {KPL_DUMP, KPL_PANIC} 瀹氫箟鍦?span lang="EN-US"> include/kprintf.h, 瀹冭〃紺轟袱縐嶈緭鍑烘柟妗?span lang="EN-US">, KPL_DUMP 浣跨敤榛戣壊鑳屾櫙鐧借壊鍓嶆櫙鏄劇ず瀛楃錛?span lang="EN-US">KPL_PANIC 浣跨敤榛勮壊鍓嶆櫙鍜岀孩鑹茶儗鏅傞鑹插父閲忓畾涔夊湪 include/scr.h,
鍚庨潰浼?xì)浠嬀l嶅埌.
args_list args;
args_start(args, fmt);
ptr = 0;
for (; fmt[i]; ++i) {
if ((fmt[i]!='%') &&
(fmt[i]!='\\')) {
buf[ptr++] = fmt[i];
continue;
} else if (fmt[i] == '\\') {
/* \a \b \t \n \v \f
\r \\ */
switch (fmt[++i]) {
case 'a': buf[ptr++] =
'\a'; break;
case 'b': buf[ptr++] =
'\b'; break;
case 't': buf[ptr++] =
'\t'; break;
case 'n': buf[ptr++] =
'\n'; break;
case 'r': buf[ptr++] =
'\r'; break;
case '\\':buf[ptr++] =
'\\'; break;
}
continue;
}
/* 涓嬮潰鏄敮鎸佺殑鎵撳嵃鏍煎紡 */
switch (fmt[++i]) {
case 's':
s = (char
*)args_next(args, char *);
while (*s)
buf[ptr++] = *s++;
break;
case 'c':
buf[ptr++] =
(char)args_next(args, int);
break;
case 'x':
parse_hex((unsigned
long)args_next(args, unsigned long));
break;
case 'd':
parse_num((unsigned
long)args_next(args, unsigned long), 10);
break;
case '%':
buf[ptr++] = '%';
break;
default:
buf[ptr++] = fmt[i];
break;
}
}
buf[ptr] = '\0';
args_end(args);
for (i=0; i<ptr; ++i)
print_c(buf[i],
KPL[kl].fg,
KPL[kl].bg); /*
print_c() 鏄笅灞傜殑鏄劇ず鍑芥暟錛屾湰鏂囧悗闈細(xì)鏈夎瑙?span lang="EN-US"> */
}
鐢變簬鏄唴鏍哥▼搴忥紝鎴戜滑鏃犳硶浣跨敤C鐢ㄦ埛搴撱傛墍浠ヤ竴涓?span lang="EN-US">memcpy錛?span lang="EN-US">memset錛?span lang="EN-US">memcpy鍑芥暟闇瑕佽嚜宸卞疄鐜幫紝浣嗘槸闇瑕佹敞鎰忕殑鏄湪BSD緋葷粺涓紝鍗充究浣跨敤浜?span lang="EN-US">-nostdlib錛岀紪璇戝櫒浠嶇劧浼?xì)漶旂?span lang="EN-US">System V涓浉鍏崇殑memcpy絳変唬鐮侊紝鍏蜂綋鎯呭喌鎴戜篃涓嶆槸寰堟竻闄ゃ傝繖浜涘嚱鏁扮殑鏁堢巼褰撶劧鏃犳硶鍜?span lang="EN-US">linux鍐呮牳涓殑鍐呭祵姹囩紪鐩告瘮錛佹垜浠殏鏃惰繖鏍峰疄鐜板畠浠惂銆?span lang="EN-US">
03/libcc.c
/* 涓嬮潰鍑芥暟瀵歸噸鍙犲尯鍩熶篃榪涜浜嗗鐞?span lang="EN-US">
*/
void
bcopy(const void *src, void *dest, unsigned int n) {
const char *s = (const char *)src;
char *d = (char *)dest;
if (s <= d)
for (; n>0; --n)
d[n-1] = s[n-1];
else
for (; n>0; --n)
*d++ = *s++;
}
void
bzero(void *dest, unsigned int n) {
memset(dest, 0, n);
}
void *
memcpy(void *dest, const void *src, unsigned int n) {
bcopy(src, dest, n);
return dest;
}
void *
memset(void *dest, int c, unsigned int n) {
char *d = (char *)dest;
for (; n>0; --n)
*d++ = (char)c;
return dest;
}
int
memcmp(const void *s1, const void *s2, unsigned int n) {
const char *s3 = (const char *)s1;
const char *s4 = (const char *)s2;
for (; n>0; --n) {
if (*s3 > *s4)
return 1;
else if (*s3 < *s4)
return -1;
++s3;
++s4;
}
return 0;
}
int
strcmp(const char *s1, const char *s2) {
while (*s1 && *s2) {
int r = *s1++ - *s2++;
if (r)
return r;
}
if (*s1 == *s2)
return 0
else
return (*s1)?1:-1;
}
char *
strcpy(char *dest, const char *src) {
char *p = dest;
while ( (*dest++ = *src++))
;
*dest = 0;
return p;
}
unsigned int
strlen(const char *s) {
unsigned int n = 0;
while (*s++)
++n;
return n;
}
print_c鍑芥暟
鐩存帴鎿嶄綔鏄懼瓨鍖哄煙涓鐐逛篃涓嶆柟渚匡紝鎵浠ユ垜浠渶瑕佷竴涓樉紺烘ā鍧椼傝繖涓氨鏄垜浠殑‘鏄懼崱椹卞姩’浜嗭紝鏄笉鏄笉鏁㈢浉淇¢┍鍔ㄦ槸榪欎箞綆鍗曠殑浜嬫儏錛熸垜浠厛鏉ョ湅涓涓嬩竴浜涘父閲忓畾涔夛細(xì)
03/include/scr.h
#define MAX_LINES
25 //
bios榛樿璁劇疆灞忓箷涓?span lang="EN-US"> 80x25澶у皬錛屽僵鑹插瓧絎︽ā寮?span lang="EN-US">
#define MAX_COLUMNS 80
#define TAB_WIDTH
8
// 蹇呴』鏄細(xì)2^n
#define VIDEO_RAM
0xb8000 // 鏄懼瓨鍦板潃
鎴戜滑鏇劇畝瑕佹彁鍒拌繃榪欎釜鍦板潃錛屽湪瀛楃妯″紡涓嬶紝閫傞厤鍣ㄤ嬌鐢?span lang="EN-US">0xB8000-0xBF000浣滀負(fù)瑙嗛鍐呭瓨銆傞氬父鎴戜滑澶勪簬80x25澶у皬灞忓箷錛屾湁16縐嶉鑹層傜敱浜庝竴涓睆騫曞彧闇瑕?span lang="EN-US">80x25x2涓瓧鑺傦紝鍗?span lang="EN-US">4k錛屾墍浠ヨ瑙嗛鍐呭瓨鍙互鍒嗕負(fù)澶氫釜欏點(diǎn)傛垜浠嬌鐢ㄦ墍鏈夌殑欏碉紝浣嗘槸褰撳墠鍙兘鏈変竴涓〉闈㈠彲瑙併備負(fù)浜嗘樉紺轟竴涓瓧絎︼紝灝嗙敤鍒?span lang="EN-US">2涓瓧鑺傦紝涓涓瓧鑺傛槸瀛楃鍊鹼紝鍙︿竴涓瓧鑺傛槸瀛楃灞炴э紙鍗抽鑹詫級(jí)銆傚睘鎬у瓧鑺傚畾涔夊涓嬶細(xì)
To display a single character, two bytes are being used
which called the character byte and the attribute byte. The character byte
contains the value of the character. The attribute byte is defined like this:
|
Bit 7 |
闂儊 |
|
Bits 6-4 |
鑳屾櫙鑹?span lang="EN-US"> |
|
Bit 3 |
鏄庝寒妯″紡 |
|
Bit3 2-0 |
鍓嶆櫙鑹?span lang="EN-US"> |
#define LINE_RAM (MAX_COLUMNS*2)
#define PAGE_RAM (MAX_LINE*MAX_COLUMNS)
#define BLANK_CHAR (' ')
#define BLANK_ATTR (0x70)
/* 鐧借壊鍓嶆櫙錛岄粦鑹茶儗鏅?span lang="EN-US"> */
#define CHAR_OFF(x,y)
(LINE_RAM*(y)+2*(x)) /* 璁$畻緇欏畾鍧愭爣x錛?span lang="EN-US">y鐨勫亸縐誨湴鍧錛堢浉瀵?span lang="EN-US">0xB8000錛?span lang="EN-US"> */
Calculates the offset of a given ordinary x, y from 0xB8000
typedef enum COLOUR_TAG
{ /*
棰滆壊琛?span lang="EN-US"> */
BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, WHITE,
GRAY, LIGHT_BLUE, LIGHT_GREEN, LIGHT_CYAN,
LIGHT_RED, LIGHT_MAGENTA, YELLOW, BRIGHT_WHITE
} COLOUR;
鍧愭爣緋誨涓嬶細(xì)
___________________\
| 錛?span lang="EN-US">0錛?span lang="EN-US">0錛?span lang="EN-US"> /
|
\|/
03/scr.c
static int csr_x = 0;
static int csr_y = 0;
鐢變簬鎴戜滑鍙敤鍒頒簡涓涓棰戦〉錛屾墍浠ヤ笂闈袱涓彉閲忓氨鍙互瀛樺偍鍧愭爣浜嗐傚叧浜庡欏墊樉紺哄彲浠ュ湪緗戠粶涓婃煡鎵劇浉鍏寵祫鏂欍?span lang="EN-US">
static void
scroll(int lines) { 鍚戜笂婊氬姩灞忓箷澶氬皯琛岋紝灝辨槸涓浜涘唴瀛樺鍐欍?span lang="EN-US">
short *p = (short *)(VIDEO_RAM+CHAR_OFF(MAX_COLUMNS-1,
MAX_LINES-1));
int i = MAX_COLUMNS-1;
memcpy((void *)VIDEO_RAM, (void
*)(VIDEO_RAM+LINE_RAM*lines),
LINE_RAM*(MAX_LINES-lines));
for (; i>=0;
--i) // 璇存槑榪欎釜for寰幆鏈夐棶棰橈紝瑙夊緱搴旇鏀規(guī)垚涓嬮潰榪欐牱錛?span lang="EN-US">
// for (i = i * lines;
i>=0; --i)
*p-- =
(short)((BLANK_ATTR<<4)|BLANK_CHAR);
}
涓嬮潰鍑芥暟璁劇疆鍏夋爣鍙兘浼?xì)寮曞彂绔炴佹潯浠訛紝浣嗘槸print_c鍙噯澶囧湪鍐呮牳涓嬌鐢紝鎵浠ユ病鏈夊叧涓柇銆傚畠鍙兘浼?xì)寮曡捣涓浜?span lang="EN-US">bug錛屼絾鏄垜娌℃湁鎵懼埌銆傝瘧娉細(xì)鍏ㄥ眬鍙橀噺娌℃湁閿佷繚鎶ゅ湪璁捐涓婂氨鏄竴縐嶉敊璇傝繖閲岀殑浠g爜淇濇姢紜疄鏄病鏈夊仛錛佽鑰呭簲鐢ㄥ埌鑷繁鐨勫唴鏍告椂瑕佸皬蹇冧簡銆?span lang="EN-US">
void
set_cursor(int x, int y) {
csr_x = x;
csr_y = y;
outb(0x0e,
0x3d4);
璁劇疆鍏夋爣楂?span lang="EN-US">8浣嶇殑鍑嗗宸ヤ綔
outb(((csr_x+csr_y*MAX_COLUMNS)>>8)&0xff,
0x3d5); 璁劇疆鍏夋爣楂?span lang="EN-US">8浣?span lang="EN-US">
outb(0x0f,
0x3d4);
璁劇疆鍏夋爣浣?span lang="EN-US">8浣嶇殑鍑嗗宸ヤ綔
outb(((csr_x+csr_y*MAX_COLUMNS))&0xff,
0x3d5); 璁劇疆鍏夋爣浣?span lang="EN-US">8浣?span lang="EN-US">
}
void
get_cursor(int *x, int *y) {
*x = csr_x;
*y = csr_y;
}
void
print_c(char c, COLOUR fg, COLOUR bg) {
// 鐢ㄨ繖涓嚱鏁版潵鏄劇ず涓涓叿浣撶殑瀛楃鍒板睆騫曪紝鎴戜滑鍙互鎶婂畠鐪嬩綔‘鏄懼崱椹卞姩’
char *p;
char attr;
p = (char *)VIDEO_RAM+CHAR_OFF(csr_x,
csr_y); // 鍙栧厜鏍囦綅緗?span lang="EN-US">
attr =
(char)(bg<<4|fg);
// 灞炴?span lang="EN-US">
switch (c) {
case '\r':
csr_x = 0;
break;
case '\n':
for (; csr_x<MAX_COLUMNS; ++csr_x) {
*p++ = BLANK_CHAR;
*p++ = attr;
}
break;
case '\t':
c =
csr_x+TAB_WIDTH-(csr_x&(TAB_WIDTH-1));
c = c<MAX_COLUMNS?c:MAX_COLUMNS;
for (; csr_x<c; ++csr_x) {
*p++ = BLANK_CHAR;
*p++ = attr;
}
break;
case '\b':
if ((! csr_x) && (! csr_y))
return;
if (! csr_x) {
csr_x = MAX_COLUMNS -
1;
--csr_y;
} else
--csr_x;
((short *)p)[-1] = (short)((BLANK_ATTR<<4)|BLANK_CHAR);
break;
default:
*p++ = c;
*p++ = attr;
++csr_x;
break;
}
if (csr_x >= MAX_COLUMNS) {
csr_x = 0;
if (csr_y < MAX_LINES-1)
++csr_y;
else
scroll(1);
}
set_cursor(csr_x,
csr_y); // 璁劇疆鍏夋爣浣嶇疆
}
鍑芥暟姣旇緝綆鍗曪紝娌℃湁鍒嗘瀽鐨勫繀瑕佷簡錛屽ぇ瀹惰嚜宸辯悽紓ㄥ惂銆?span lang="EN-US">
澹版槑錛氳漿杞借淇濈暀錛?/span>
璇戣?/span>錛?/span>http://m.shnenglu.com/jinglexy
鍘熶綔鑰咃細(xì)xiaoming.mo at skelix dot org
MSN & Email: jinglexy at yahoo dot com dot cn鐩爣錛?/span>浣?span lang="EN-US">"system"浠庤蔣鐩樺惎鍔紝騫舵墦鍗?span lang="EN-US">"Hello World!" 涓嬭澆婧愮▼搴?/span>
鍐呭瓨瀵誨潃
澶勭悊鍣ㄤ互‘瀛楄妭’綆$悊鍜岃闂唴瀛橈紝姣忎釜瀛楄妭閮芥湁鐙珛鐨勫湴鍧錛屽嵆鐗╃悊鍦板潃銆傛湁涓ょ鍦板潃鏄犲皠鏂瑰紡錛氬垎孌靛拰鍒嗛〉錛?span lang="EN-US">skelix鍐呮牳涓兘鐢ㄥ埌浜嗐?a name="Memory_Addressing">
孌靛浜庢垜浠潵璇村啀鐔熸?zhèn)変笉杩囦簡锛屽厛鍥灆寰涓涓?span lang="EN-US">dos鏃舵湡鐨勬鍚с傚畠鏄竴涓?span lang="EN-US">16浣嶇殑瀵勫瓨鍣紝鎵浠ユ渶澶氬彲浠ョ洿鎺ヨ闂?span lang="EN-US">2^16瀛楄妭鐨勫唴瀛橈紝鍗?span lang="EN-US">64K銆傝繖瀵瑰簲鐢ㄧ▼搴忔潵璇村お灝戜簡錛屼簬鏄?span lang="EN-US">Intel浣跨敤Segment:Offset緇撳悎鏂瑰紡鏉ヨ〃紺轟竴涓櫄鎷熷湴鍧銆傛瀵勫瓨鍣ㄥ乏縐?span lang="EN-US">4浣嶅姞涓婂亸縐誨氨寰楀埌瀹為檯鐨勭墿鐞嗗湴鍧浜嗐備緥濡傦紝0x
+ 0189
-------
鐜板湪鎴戜滑鏉ヨ綆楁渶澶у彲浠ヨ闂殑鍦板潃錛?span lang="EN-US">FFFF:FFFF
FFFF0
+ FFFF
-------
10FFEF
榪欎釜鑼冨洿鏄?st1:chmetcnv unitname="m" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1M + 65519 bytes, 鍥犱負(fù)鍦?span lang="EN-US">80386涓嬌鐢ㄤ簡20浣嶅湴鍧綰匡紝鎵浠ュ彲浠ラ澶栧璁塊棶65519涓瓧鑺傝櫄鎷熷湴鍧錛屼緥濡傚湴鍧0x100010琚槧灝勫埌鍦板潃0x10錛岃闂繖涓や釜鍦板潃鏄瓑浠風(fēng)殑銆?span lang="EN-US">
琛ㄧず鍚屼竴涓墿鐞嗗湴鍧鏈夊縐嶆柟寮忥紝渚嬪
鍙︿竴涓蹇墊槸綰挎у湴鍧錛岃繖涓槸32浣嶅湴鍧錛屽彧鏈夊綋鍒嗛〉鏈哄埗寮鍚椂鎵嶆湁鏁堬紝鏂囩珷鍚庨潰浼?xì)鎻愬埌瀹冦?span lang="EN-US">
寮曞榪囩▼
褰撶郴緇熶笂鐢墊垨RESET鏃訛紝澶勭悊鍣ㄥ皢鎵ц涓浜涘垪鐨勫垵濮嬪寲錛屽瘎瀛樺櫒琚緗垚闈為鐭ョ姸鎬侊紝騫朵笖cpu澶勪簬瀹炴ā寮忋備篃璁鎬綘鎯崇煡閬?span lang="EN-US">cpu鏄庢牱璁劇疆segment:offset涓虹墿鐞嗗湴鍧FFFF0鐨勶紙0xf000:0xfff0灝辨槸bios鍏ュ彛鍦板潃錛夛紝榪欐槸鍥犱負(fù)cs瀵勫瓨鍣ㄦ湁涓涓潪鍙閮ㄥ垎錛屽畠淇濆瓨浜?span lang="EN-US">ffff:0000鍦板潃錛屽茍涓?span lang="EN-US">cs鍦ㄥ垵濮嬪寲鏃朵細(xì)琚鍏?span lang="EN-US">f000鍊箋傛鍚庝互姝e父鏂瑰紡浣跨敤瀹冦傚綋bois鍙栧緱鎺у埗鏉冨悗錛屾牴鎹敤鎴烽厤緗紙浠庤蔣椹憋紝紜洏錛屾垨cdrom錛変腑璇誨彇絎竴涓?span lang="EN-US">sector鍒?st1:chmetcnv unitname="C" sourcevalue="7" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">00007C00錛屽茍璺寵漿鍒拌鍦板潃鎵ц錛堝氨鏄紩瀵肩▼搴?span lang="EN-US">bootstrap錛夈傚湪bootstrap涓垜浠彲浠ヤ嬌鐢?span lang="EN-US">bios涓柇錛屼絾鏄繘鍏?span lang="EN-US">kernel鍚庡氨涓嶈兘鍐嶄嬌鐢ㄤ簡銆?span lang="EN-US">
紼嬪簭涓錛氫嬌鐢?span lang="EN-US">as鍜?span lang="EN-US">ld鐨勮寖渚?/span>
浣犲彲浠ュ湪涓嬭澆婧愮▼搴忕殑01/first.cry/bootsect.s
.text .text琛ㄧず浠g爜孌?span lang="EN-US">
.globl start琛ㄧずstart鍙互鐢ㄤ綔澶栭儴絎﹀彿
.code16 GCC榛樿浣跨敤32浣嶅湴鍧鍜屾搷浣滄暟錛岃繖閲屽憡璇夊畠浣跨敤16浣?span lang="EN-US">
start:
jmp
start 姝誨驚鐜?span lang="EN-US">
.org 0x1fe,
0x90 .org NEW-LC,
FILL錛?/span>璇存槑錛氳繖閲屽~鍏?span lang="EN-US">0x90錛屾槸nop鎸囦護(hù)鐨勬満鍣ㄧ爜
.word 0xaa55
璁茶В錛?span lang="EN-US">.org鎸囦護(hù)鎸囩ず涓嬩竴涓暟鎹湴鍧錛屼負(fù)浜嗙紪璇戣繖涓▼搴忥紝鎴戜滑鍐欎簡涓涓?span lang="EN-US">Makefile錛屾諱笉鑳借佹槸鏁插懡浠ゅ惂錛屽懙鍛點(diǎn)?span lang="EN-US">
緗戠粶涓婂彲浠ユ壘鍒板緢澶氬啓Makefile鐨勮祫鏂欙紝緙栬瘧閫夐」鎵嶆槸鎴戜滑鍏蟲敞鐨勭劍鐐廣?span lang="EN-US">
01/first.cry/Makefile
AS=as
gcc姹囩紪宸ュ叿
LD=ld
gcc榪炴帴鍣?span lang="EN-US">
.s.o:
${AS} -a $< -o $*.o >$*.map
all: final.img
final.img: bootsect
mv bootsect final.img
bootsect: bootsect.o
${LD} --oformat binary -N -e start -Ttext 0x
璁茶В錛?span lang="EN-US">ld鍙互琚厤緗負(fù)鏀寔澶氫簬涓縐嶇殑鐩爣鏂囦歡. binary琛ㄧず娌℃湁紼嬪簭澶村拰鍏朵粬淇℃伅錛屼粎浠呮槸涓浜涜8鏁版嵁銆傚鏋滄病鏈夎繖涓夐」錛屽皢琚粯璁ら摼鎺ヤ負(fù)elf鏍煎紡銆?span lang="EN-US">-N鎶?span lang="EN-US">text鍜?span lang="EN-US">data鑺傝緗負(fù)鍙鍐欍?span lang="EN-US">-Ttext灝?span lang="EN-US">text鑺傝搗濮嬪湴鍧璁劇疆涓?span lang="EN-US">0x
鐜板湪鎴戜滑榪愯make鎸囦護(hù)緙栬瘧涓涓嬶細(xì)
[root@root~/source/os/skelix/01/first.cry]$ ls
bootsect.s COPYING Makefile
[root@root~/source/os/skelix/01/first.cry]$ make
as -a bootsect.s -o bootsect.o >bootsect.map
ld --oformat binary -N -e start -Ttext 0x
mv bootsect final.img
[root@root~/source/os/skelix/01/first.cry]$ ls
bootsect.map bootsect.o
bootsect.s COPYING final.img
Makefile
[root@root~/source/os/skelix/01/first.cry]$
鐜板湪錛屾垜浠惎鍔?span lang="EN-US">vmware錛岃繍琛岋紝杞藉叆杞┍鏄犺薄鏂囦歡"final.img"錛屾垜浠緱鍒頒竴涓粦灞忥紝榪欐槸姝g‘鐨勶紝鍥犱負(fù)鎴戜滑浠涔堜篃娌℃湁鍋氥?span lang="EN-US">
紼嬪簭涓錛氭樉紺?Hello World!
濂戒簡錛屼笂闈㈢殑榛戝睆紼嬪簭騫朵笉鏄お濂界帺錛岀幇鍦ㄦ垜浠皾璇曞湪涓婇潰鎵撳嵃"Hello World!"
01/hello.world/bootsect.s
.text
.globl start
.code16
start:
jmp code
msg:
浣跨敤jmp鎸囦護(hù)璺寵繃璇ュ彉閲忥紝榪欐槸鎴戜滑涓轟粈涔堝湪Makefile浣跨敤-N閾炬帴閫夐」浜?span lang="EN-US">
.string "Hello World!\x0"
code:
movw $0xb800,%ax
movw
%ax,
%es es孌佃緗垚B800錛屽鍓嶆墍榪幫紝segment:offset鍦板潃鏄犲皠鏂瑰紡錛屽畠鎸囧悜B8000錛?span lang="EN-US">
榪欐剰鍛崇潃絎竴涓瓧鑺傚湴鍧鏄?span lang="EN-US">0錛堟槧灝勫埌B8000錛夛紝灞炴у瓧鑺傛槸1錛堟槧灝勫埌B8001錛?span lang="EN-US">
B8001鍊艱緗負(fù)0x07鍙互灝嗚繖涓?span lang="EN-US">byte棰滆壊璁劇疆涓洪粦搴曠櫧瀛椼?span lang="EN-US">
xorw
%ax, %ax
movw
%ax, %ds
movw $msg,
%si 涓?span lang="EN-US">movsb鎸囦護(hù)璁劇疆姝g‘鐨?span lang="EN-US">si鍜?span lang="EN-US">di
xorw
%di, %di
cld
movb $0x07,
%al 瀛楃殑棰滆壊
1:
cmp
$0, (%si)
je
movsb
stosb
jmp 1b
1: jmp 1b
.org 0x1fe, 0x90
.word 0xaa55
澹版槑錛氳漿杞借淇濈暀錛?/span>
璇戣?/span>錛?/span>http://m.shnenglu.com/jinglexy
鍘熶綔鑰咃細(xì)xiaoming.mo at skelix dot org
MSN & Email: jinglexy at yahoo dot com dot cn
GCC
Skelix 浣跨敤c璇█緙栧啓錛屽綋鐒朵篃鐢ㄤ簡姹囩紪璇█錛?span lang="EN-US">at&t椋庢牸錛夛紝鍦?span lang="EN-US">linux涓嬩嬌鐢?span lang="EN-US">gcc緙栬瘧銆?span lang="EN-US">
[root@root ~]$ gcc -v
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man
--infodir=/usr/share/info --enable-shared --enable-threads=posix
--disable-checking --with-system-zlib --enable-__cxa_atexit
--disable-libunwind-exceptions --enable-java-awt=gtk --host=i386-redhat-linux
Thread model: posix
gcc version 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)
鍦ㄦ瘡綃囨暀紼嬩腑閮界粰鍑轟簡婧愮▼搴忓拰杞洏鏄犺薄鏂囦歡錛屼綘鍙互鐩存帴浣跨敤瀹冧滑銆傚鏋滀綘闇瑕佺紪璇戣繖浜涙簮紼嬪簭錛岀紪璇戠幆澧冨繀欏繪紜傛垜浠帹鑽愮殑鐜鏄?span lang="EN-US">linux2.6.x鍐呮牳錛?span lang="EN-US">gcc3.x緙栬瘧鍣ㄣ?span lang="EN-US">
鐢變簬鍦ㄦ簮紼嬪簭涓嬌鐢ㄤ簡__asm__, __attribute__, __extention__錛屼互鍙?span lang="EN-US">gcc鍐呭祵姹囩紪錛岃繕鏈?span lang="EN-US">unsigned long long(鐩村埌C99鎵嶅紑濮嬫敮鎸?span lang="EN-US">)錛涘鏋滀綘浣跨敤浜嗗叾浠栫紪璇戝櫒錛岄渶瑕佷慨鏀瑰搴旂殑婧愮▼搴忋備笖緙栬瘧鍣ㄥ繀欏繪槸32浣嶏紝榪欐牱鍋氱殑鐩殑鏄繚鎸佹簮紼嬪簭綆媧佹竻鏅般?span lang="EN-US">
瀵逛簬windows鐢ㄦ埛鍙互浣跨敤 cygwin錛屽畠鎻愪緵浜?span lang="EN-US">windows涓嬬殑linux鐜銆備笉榪囨垜娌℃湁灝濊瘯浣跨敤瀹冿紝鍥犱負(fù)鎴戠殑鐢?shù)鑴戜笂娌℃湁瀹夎?span lang="EN-US">windows鎿嶄綔緋葷粺銆備篃鍙互鍦ㄤ綘鐨?span lang="EN-US">windows緋葷粺涓婂畨瑁呬竴涓櫄鎷熸満涓婄殑linux錛屽鏋滀綘鐨勭數(shù)鑴戣凍澶熷揩鐨勮瘽銆?span lang="EN-US">
VMWARE
涓轟簡榪愯鏁欑▼涓殑鑼冧緥錛屼竴涓櫄鎷熸満蹇呬笉鍙皯錛?span lang="EN-US">virtual pc2007宸茬粡鍙互鍏嶈垂浣跨敤浜嗭紝鍦?span lang="EN-US">M$鐨勫畼鏂圭綉绔欎笂鍙互鎵懼埌涓嬭澆銆傚綋鐒朵篃鍙互浣跨敤qemu鍜?span lang="EN-US">bochs涔嬬被鐨勮櫄鎷熸満銆傛帹鑽愮殑铏氭嫙鏈烘槸VMWARE銆?span lang="EN-US">
Things Are Good To Know
濡傛灉鑳界湅鎳?/span>Makefile鏈濂戒簡錛岃繖鏄?/span>*nix紼嬪簭鍛樺繀欏繪帉鎻$殑涓欏瑰熀鏈煡璇嗐傚彟澶栵紝濡傛灉浣犵啛鎮(zhèn)夊唴瀛樺湴鍧鏄犲皠錛屼腑鏂紝寮傚父錛?/span>GDT錛?/span>LDT錛?/span>IDT錛屽垎欏墊満鍒訛紝鑼冨洿绔彛灝辨洿濂戒簡銆傚綋鐒朵笉鎳備篃娌″叧緋伙紝Intel鐨勪笁鍗鋒墜鍐屾槸妗堝ご蹇呭錛?/span>http://www.intel.com
IA-32 Intel Architecture Software Developer's Manual
Volume1: Basic Architecture
IA-32 Intel Architecture Software Developer's Manual Volume
IA-32 Intel Architecture Software Developer's Manual Volume3B: System
Programming Guide Part2
璇昏呭榪欎簺涓滆タ涓嶅繀绱у紶錛屾垜鍦ㄦ暀紼嬩腑浼?xì)瑙i噴鐩稿叧鐨勭煡璇嗐?span lang="EN-US">c璇█鍜屾眹緙栨槸鏈鍩烘湰鐨勮姹傦紝鑳藉寰堟竻妤氱殑浜嗚В浠涔堟槸鍫嗗拰鏍堛傚叧浜?span lang="EN-US">c璇█鐨勬暟鎹垚鍗冧笂涓囷紝浣嗘槸淇濇姢妯″紡鏂歸潰鐨勪功綾嶆瘮鍝堥浄鎱ф槦榪樺皯錛屾嵁璇存瘡76騫村彲浠ヤ拱鍒頒竴鏈紝濡傛灉浣犺凍澶熷垢榪愮殑璇濓細(xì)錛?a name="Color_Pattern">
椋庢牸綰﹀畾
鍘熸枃涓殑鏍煎紡琚搮鑷幓鎺変簡錛岀炕璇戝悗鐨勯鏍煎簲璇ュ彲浠ヤ竴鐪嬪氨鎳傘?/span>