锘??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鎵撲竴浜涜ˉ涓侊細
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鍘繪帀錛岄噷闈㈡湁涓浜涙枃浠跺悕涓鏍鳳紙澶у皬鍐欎笉涓鏍鳳級錛宨pv6涔熷幓鎺夛紝緙栬瘧鐨別lf鏂囦歡姝e父銆?br>
涓婃搗婕曟渤娉?br>2009.01.06
]]>
]]>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <string.h>
5
6 typedef void (*func_type)(void * obj, int num);
7 class test_t
8 {
9 public:
10 void test_func(int num)
11 {
12 printf("num is %d\n", num);
13 }
14
15 int a;
16 int b;
17
18 };
19
20
21 int main(int argc, char* argv[])
22 {
23 test_t obj;
24 func_type p = &test_t::test_func;
25 for(int i = 100; i < 104; i++)
26 p(&obj, i);
27
28 return 0;
29 }
30
紼嬪簭姣旇緝綆鍗曪紝娉ㄦ剰瀹冪殑緙栬瘧鍙傛暟錛?br>g++ -Wno-pmf-conversions -O hello.cpp && ./a.out
鍚﹀垯緙栬瘧涓嶈兘閫氳繃銆?br>
]]>
閾炬帴鍣ㄦ妸鏋勯犲嚱鏁版斁鍦╯tart_ctors鍜宔nd_ctors涔嬮棿錛屾墍浠ユ垜浠彲浠ヨ繖鏍峰仛錛?br> for (i = &start_ctors; i < &end_ctors; i++) {
foo = (CONSTRUCTOR_FUNC)*i;
foo(); /* 鏋勯犲嚱鏁頒笉鑳界敤 cout瀵硅薄錛岃繖涓椂鍊欐帶鍒跺彴榪樻病鏈夊垵濮嬪寲 */
}
寮曞嚭涓涓壒孌婇渶姹傦紝鍏ㄥ眬瀵硅薄鎸夐『搴忔瀯閫狅紝鎴戜滑鏄劇劧鏃犳硶棰勭煡start_ctors琛ㄩ『搴忋?br>涓涓彲琛岀殑鏂規硶浣跨敤閲嶈澆new錛屽茍鐢ㄦā鏉垮嚱鏁板皝瑁呭叾鎵ц錛?br>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct test_t
{
public:
test_t()
{
printf("construct of test_t()\n");
}
int a;
int b;
};
void * operator new (size_t size, void * place)
{
return place;
}
/* call the default constructor */
template <class object_t> void construct(object_t * ptr)
{
new (ptr) object_t();
}
test_t t;
int main(int argc, char* argv[])
{
construct(&t);
return 0;
}
]]>
涓嬭澆涓嬫潵涓鐪嬶紝鍙槸浠巔ro鐗堝垏鎹㈠埌lite鐗堬紝鍙嶆鎴戞槸娌★級
鍙戜釜鍥劇湅鐪嬪惂錛屽懙鍛碉細
瑕佹槸鏈夋洿濂界敤鐨刾im/gtd杞歡錛屾榪庡ぇ瀹舵彁鍑?br>
]]>
]]>
]]>
澶ц嚧浠嬬粛涓涓嬶細linux鐜錛実cc緙栬瘧鍣紝c++璇█錛屾販鍚堝紡鍐呮牳錛堢幇鍦ㄨ繕鍙槸鍗曞唴鏍革級錛岀洰鍓嶇洰鏍囧鉤鍙癷386/arm銆傚垰鍒氬畬鎴愪簡MM閮ㄥ垎錛岄兘鏄Щ鐨刲inux綆楁硶錛坆uddy錛宻lab絳夛級錛屾暣涓狹M灝變竴涓被錛屽交搴曡崵鑿滐紝鍛靛懙銆傚鏋滄壘浜涗漢璁ㄨ璁ㄨc++鍊掓槸濂戒簨錛堝綋鐒朵笉鏄偅縐嶆棤閲屽ご鐨勶紝寰楀厛鐪嬩功錛夛紝浣嗘槸鎴慶++瓚呰彍楦燂紝鍙堜笉鍠勭粍緇囷紝甯屾湜鍐ュ啣涓緱閬囧ぇ鑰佹寚鐐逛竴浜屻?br>
涓嶇煡閬搒f澶у璁塊棶鏈夋病鏈夐棶棰橈紝璐翠竴浜涗富瑕佸唴瀹癸細
鐗堟湰鍘嗗彶錛?br>
3.1.1鐗堬細浠e彿錛?/font>
鎬諱綋鐩爣/鍔熻兘錛歺x
3.0.0鐗堬細浠e彿錛?/font>
鎬諱綋鐩爣/鍔熻兘錛氾紙鍙戝竷紼沖畾緋葷粺錛?/font>
2.1.1鐗堬細浠e彿錛?/font>
鎬諱綋鐩爣/鍔熻兘錛氬崟鍏冩祴璇曪紝bug淇
2.0.0鐗堬細浠e彿錛?/font>
鎬諱綋鐩爣/鍔熻兘錛氾紙瀹屾垚緋葷粺鏍稿績錛屽皝閿佺増鏈級
1.7.1鐗堬細浠e彿錛?/font>
鎬諱綋鐩爣/鍔熻兘錛氬畬鎴愯鍒掔殑絎?绔犺妭
1.6.1鐗堬細浠e彿錛歺x錛?/font>2008-02-05 ~ 2008-05-05錛?/font>
鎬諱綋鐩爣/鍔熻兘錛氬畬鎴愯鍒掔殑絎?绔犺妭錛坱cp/ip錛?/font>
1.5.1鐗堬細浠e彿錛歺x錛?/font>2008-01-01 ~ 2008-02-04錛?/font>
鎬諱綋鐩爣/鍔熻兘錛氬畬鎴愯鍒掔殑絎?绔犺妭錛堟枃浠剁郴緇燂級
1.4.1鐗堬細浠e彿錛歺x錛?/font>2007-10-25 ~ 2007-12-24錛?/font>
鎬諱綋鐩爣/鍔熻兘錛氬畬鎴愯鍒掔殑絎?绔犺妭錛堣澶囬┍鍔級
1.3.1鐗堬細浠e彿錛歺x錛?/font>2007-10-10 ~ 2007-10-24錛?/font>
鎬諱綋鐩爣/鍔熻兘錛氬崟鍏冩祴璇曪紝bug淇
1.2.1鐗堬細浠e彿錛氫竴甯樺咖姊︼紙2007-07-01 ~ 2007-09-24姝e湪榪涜涓級
鎬諱綋鐩爣/鍔熻兘錛氬畬鎴愯鍒掔殑絎?錛?錛?錛?绔犺妭
(4).jinix-1.2.1.2007-07-19_09.18.22.tar.bz2
瀹屾垚slab綆楁硶璋冪爺鍙婄紪鍐?br>
鍐呮牳鍒濆鍖栨祦紼嬪畬鍠勶紝鍙婄浉鍏抽儴鍒嗘帴鍙?妗嗘灦
(3).jinix-1.2.1.2007-07-15_16.36.41.tar
textio綾婚噸杞?lt;<榪愮畻絎︿互鏀寔cout << __func__;
鍐呭瓨綆$悊鍒濆鍖栧強buddy綆楁硶瀹屾垚, 鍐呮牳瀵硅薄瀹屽杽錛堝惎鍔ㄦ祦紼嬶級
(2).jinix-1.2.1.2007-07-12_18.49.44.tar.bz2
鍐呮牳瀵硅薄緙栧啓錛宐oot.S->head.S錛屽垵濮嬪寲姹囩紪鏂囦歡涓叏灞鍙橀噺縐誨叆bootdata.cpp涓?br>
鍐呭瓨綆$悊綾繪帴鍙g紪鍐欙紝浠ュ強浣跨敤鍒扮殑鐩稿叧鏁版嵁緇撴瀯浠巐inux涓Щ妞?br>
(1).jinix-1.2.1.2007-07-03_21.07.57.tar.bz2
鏌愪簺鍒濆鍖栬繃鐨勫叏灞鍙橀噺琚紪璇戝埌bss鑺傚幓浜嗭紝琚玝oot.S鏂囦歡娓呯┖錛?br>
璋冩暣鍒版柊Makefile, 鍜寀nixlite鐩鎬技
浣跨敤__attribute__((section(...寮哄埗閾炬帴鍒?data
(0).jinix-1.2.1.2007-06-30_17.50.21.tar.bz2
鎺у埗鍙版樉紺洪儴鍒嗚皟璇曞畬鎴? textio鍜宱stream璋冭瘯瀹屾垚
1.緋葷粺鍒濆鍖?/td>
鍐呮牳鍚姩
瀹屾垚
i86紜歡鍒濆鍖栵紙鍒嗛〉錛?/td>
瀹屾垚
鏃墮挓鍒濆鍖?/td>
瀹屾垚
涓柇鍙婂紓甯稿垵濮嬪寲
瀹屾垚
reboot/halt/poweroff
瀹屾垚
acpi/apm
鏈畬鎴?/em>
fpu/mmx/sse/sse2
鏈畬鎴?/em>
2.鏀拺鍨嬫暟鎹粨鏋勫拰綆楁硶
hash
瀹屾垚
闃熷垪
瀹屾垚
閾捐〃
瀹屾垚
fifo/lifo
瀹屾垚
3.鍐呭瓨綆$悊瀛愮郴緇?/td>
buddy綆楁硶
瀹屾垚
slab鍒嗛厤鍣?/td>
瀹屾垚
欏靛紓甯稿鐞?/td>
瀹屾垚
cow錛坈opy on write錛?/td>
鏈畬鎴?/em>
demand paging
鏈畬鎴?/em>
瀹堟姢綰跨▼錛坰wap錛岄〉闈㈠啿媧楋級
鏈畬鎴?/em>
4.榪涚▼鍙婁換鍔¤皟搴?/td>
浠誨姟鍒囨崲
鏈畬鎴?/em>
fork()
鏈畬鎴?/em>
璋冨害綆楁硶
鏈畬鎴?/em>
鍐呮牳綰跨▼
鏈畬鎴?/em>
idle綰跨▼
鏈畬鎴?/em>
鐢ㄦ埛綰跨▼
鏈畬鎴?/em>
鍚屾鏈哄埗錛氬唴鏍擱攣鍜屽師瀛愭搷浣?/td>
鏈畬鎴?/em>
5.璁懼椹卞姩
涓柇鏈哄埗
鏈畬鎴?/em>
椹卞姩妗嗘灦鍙婂澶栨帴鍙h冭檻
鏈畬鎴?/em>
瀛楃璁懼椹卞姩妗嗘灦
鏈畬鎴?/em>
鍧楄澶囬┍鍔ㄦ鏋?/td>
鏈畬鎴?/em>
緗戠粶璁懼椹卞姩妗嗘灦
鏈畬鎴?/em>
鎺у埗鍙伴┍鍔紙鏄懼崱錛岄敭鐩橈紝榧犳爣錛?/td>
鏈畬鎴?/em>
dma椹卞姩
鏈畬鎴?/em>
pci椹卞姩
鏈畬鎴?/em>
8029/8139, ne2000緗戝崱椹卞姩
鏈畬鎴?/em>
usb椹卞姩
鏈畬鎴?/em>
6.鏂囦歡緋葷粺
proc
鏈畬鎴?/em>
ramdisk
鏈畬鎴?/em>
ext2
鏈畬鎴?/em>
ext3
鏈畬鎴?/em>
vfat
鏈畬鎴?/em>
鍙墽琛屾枃浠秂lf鍔犺澆
鏈畬鎴?/em>
鍔ㄦ侀摼鎺ュ簱鍜屽唴鏍告ā鍧?/td>
鏈畬鎴?/em>
7.TCP/IP緗戠粶妯″潡
鏁版嵁閾捐礬灞傦紙Layer 2錛?/td>
鏈畬鎴?/em>
IP灞傦紙Layer 3錛?/td>
鏈畬鎴?/em>
icmp, arp, ip, 璺敱鍗忚
鏈畬鎴?/em>
tcp, udp
鏈畬鎴?/em>
socket鎺ュ彛
鏈畬鎴?/em>
8.榪涚▼闂撮氫俊IPC
鍏變韓鍐呭瓨
鏈畬鎴?/em>
淇″彿閲?/td>
鏈畬鎴?/em>
娑堟伅闃熷垪
鏈畬鎴?/em>
9.posix鏀寔鍙婂叾浠?/td>
susv3璋冪爺
鏈畬鎴?/em>
lsb璋冪爺
鏈畬鎴?/em>
posix鍏煎鍙婃祴璇?/td>
鏈畬鎴?/em>
linux-abi鍏煎
鏈畬鎴?/em>
shell鍙婂父鐢╝pplication
鏈畬鎴?/em>
arm浣撶郴鏋舵瀯璋冪爺
鏈畬鎴?/em>
10.淇濈暀
]]>
鍙互鍦?/span>http://www.gnome.org/projects/dia涓婃壘鍒板畠鐨勪笅杞藉拰screenshot銆?span lang="EN-US">
榪欎釜杞歡鍩烘湰涓婁笉闇瑕佸涔狅紝浣跨敤鐣岄潰闈炲父綆鍗曘?span lang="EN-US">
涓嬮潰鏄ず渚嬪浘錛?/span>
Dia瀵瑰悇綾誨浘褰㈢殑鏀寔鏄彃浠跺艦寮忔彁渚涳紝寰堝鏄撴墿灞曘傚鏋滄敮鎸佸浘褰㈤棿瓚呯駭閾炬帴灝辨洿濂戒簡銆備笉榪囩▼搴忓彂鐢熷紓甯哥殑鎯呭喌杈冨錛屾渶涓ラ噸鐨勬槸鏈夋椂鍊欏紓甯鎬簡鍘熸潵鐨勫浘褰㈡枃浠舵墦涓嶅紑銆傜瓑鍒?/span>1.x鐗堟湰鍑烘潵鐨勬椂鍊欏彲鑳戒細濂戒簺鍚с?/span>

絎?span lang=EN-US>9璇撅細緋葷粺璋冪敤鍜屽彲鎵ц紼嬪簭 涓嬭澆婧愪唬鐮?/font>
澹版槑錛氳漿杞借淇濈暀錛?span lang=EN-US>
璇戣咃細http://www.shnenglu.com/jinglexy
鍘熶綔鑰咃細xiaoming.mo at skelix dot org
MSN & Email: jinglexy at yahoo dot com dot cn
鐩爣
榪欎竴鑺備腑錛屾垜浠潵瀹炵幇浠庣鐩樺姞杞藉簲鐢ㄧ▼搴忓茍鎵ц瀹冿紝浠ュ強緇欒繖涓簲鐢ㄧ▼搴忕郴緇熻皟鐢ㄧ殑鑳藉姏銆?span lang=EN-US>
緋葷粺璋冪敤
緇忚繃鍓嶉潰涓緋誨垪鐨勮紼嬶紝鎴戜滑鍩烘湰涓婂緩绔嬩簡涓涓?span lang=EN-US>OS鐨勫悇涓畝鍗曠粍浠訛紝紜疄闈炲父綆鍗曪紝娌℃湁浠涔堝鏉傜殑綆楁硶鍜屾灦鏋勩傜幇鍦ㄥ啀鏉ュ疄鐜頒竴涓畝鍗曠殑shell鎺у埗錛屼竴鑸殑shell澶勭悊嫻佺▼鏄細getty()鎵撳嵃鐧誨綍鎻愮ず絎︼紝絳夊緟鐢ㄦ埛login錛岀劧鍚庢墽琛?span lang=EN-US>bash銆傝繖閲岋紝鎴戝綋鐒朵笉鎯沖疄鐜頒竴涓?span lang=EN-US>shell錛屼篃涓嶆兂鍐欎粈涔?span lang=EN-US>getty銆傝繖涓鑺備腑錛?span lang=EN-US>skelix灝嗕粠紓佺洏鍔犺澆涓涓彲鎵ц紼嬪簭騫舵墽琛屽畠錛屽氨鍍忓父鐢ㄧ殑*nix OS涓鏍楓?span lang=EN-US>
鐢變簬slelix鐨勮櫄鎷熷唴瀛樼鐞嗛儴鍒嗚繕娌℃湁鍋氬ソ錛屾墍鏈夌殑浠誨姟鍏變韓鍚屼竴涓湴鍧絀洪棿銆傛垜浠噰鍙栦竴涓畝鍗曠殑鏂規硶錛岀▼搴忎粠紓佺洏涓姞杞藉埌鍦板潃0x100000錛屾斁鍒?span lang=EN-US>"/"鏍圭洰褰曚笅闈€?span lang=EN-US>
瑕佹敞鎰忕殑鏄紝鐢ㄦ埛浠誨姟涓嶈兘璁塊棶鍐呮牳鍦板潃絀洪棿錛屾墍浠ヤ竴浜涘嚱鏁板kprintf, print_c絳変篃涓嶈兘鍐嶄嬌鐢ㄤ簡錛堝疄闄呬笂鏄彲浠ョ殑錛屽洜涓烘垜浠病鏈夊疄鐜拌櫄鎷熷唴瀛樼鐞嗭紝榪欓噷鍏堝亣瀹氫笉鑳戒嬌鐢ㄥ畠浠級銆傚ぇ澶氭暟鐨勬搷浣滅郴緇熼兘鎻愪緵浜嗕竴浜?span lang=EN-US>API鎴栫郴緇熻皟鐢ㄦ潵鎵ц榪欎簺鍑芥暟銆傜幇鍦ㄥ厛娣誨姞涓涓郴緇熻皟鐢細
09/isr.s
sys_print:
pushl %esi # 鑳屾櫙棰滆壊
pushl %edi # 鍓嶆櫙棰滆壊
pushl %ebx # 瑕佹墦鍗扮殑瀛楃
cli # 涓柇闂ㄤ細瀛楄妭鍏蟲帀EFLAGS 鐨?span lang=EN-US>IF浣嶏紝緋葷粺璋冪敤鍗翠笉琛?span lang=EN-US>
call print_c
sti
addl $12, %esp
ret
鎭ㄧ畝鍗曪紝涓嶆槸鍚楋紵涓婇潰緋葷粺璋冪敤鏈変笁涓弬鏁幫紝esi鏄儗鏅鑹詫紝edi鏄墠鏅鑹詫紝ebx鏄鎵撳嵃鐨勫瓧絎︺傝繖涓郴緇熻皟鐢ㄥ彧鎵撳嵃涓涓瓧絎︼紝璧峰灝辨槸鐢ㄦ埛紼嬪簭瀵瑰唴鏍?span lang=EN-US>print_c鍑芥暟鐨勪竴涓?span lang=EN-US>wrapper銆?span lang=EN-US>
鐞嗚涓婅錛岀敤鎴蜂換鍔′笉鑳界洿鎺ヤ嬌鐢?span lang=EN-US>print_c鍑芥暟錛屼篃涓嶅簲褰撶煡閬撴湁榪欎釜鍑芥暟瀛樺湪銆傚敮涓鐨勬柟娉曞氨鏄嬌鐢ㄧ郴緇熻皟鐢紝浠ユ鎻愪緵緇欑敤鎴蜂竴涓彲鐢ㄧ殑鎺ュ彛銆?span lang=EN-US>DOS 鎿嶄綔緋葷粺鎻愪緵浜?span lang=EN-US>int 0x21浣滀負緋葷粺鏈嶅姟錛?span lang=EN-US>linux 鎻愪緵int 0x80緋葷粺璋冪敤錛屾湰鑺備腑妯′豢linux鍦?span lang=EN-US>IDT 涓坊鍔犱竴涓彿鐮?span lang=EN-US>0x80 鐨勭郴緇熻皟鐢ㄣ?span lang=EN-US>
鐜板湪鎴戜滑鍙敤鍒頒簡IDT 涓柇鐨?span lang=EN-US>34欏癸紝鎵浠ュ叾浣欑殑欏歸兘鍙互鎷挎潵浣跨敤錛屼絾鏄垜浠彧闇瑕?span lang=EN-US>0x80宸茶凍澶熴傚湪IDT涓緩绔嬩竴涓?span lang=EN-US>386 鐨勯櫡闃遍棬灝辮浜嗭紝闄烽槺闂ㄥ拰涓柇闂ㄩ潪甯哥被浼鹼紝鍙槸E 浣嶇殑綾誨瀷鐢?span lang=EN-US>8鏇夸唬錛屽茍涓?span lang=EN-US>DPL 鐗規潈綰ц緗負3銆?span lang=EN-US>
09/init.c
static void
sys_call_install(void) {
unsigned long long sys_call_entry = 0x0000ef0000080000ULL
| ((unsigned long long)CODE_SEL<<16);
sys_call_entry |= ((unsigned long long)sys_call<<32)
& 0xffff000000000000ULL;
sys_call_entry |= ((unsigned long long)sys_call) & 0xffff;
idt[SYS_CALL] = sys_call_entry;
}
瀹?span lang=EN-US>SYS_CALL 鍊間負0x80銆?span lang=EN-US>
鐜板湪鎴戜滑鏉ョ湅涓?span lang=EN-US>0x80鐨勯櫡闃遍棬澶勭悊渚嬬▼錛?span lang=EN-US>
09/isr.s
sys_call:
cmpl $1, %eax
jb
iret
1:
pushal
call *sys_call_table(, %eax, 4)
popal
iret
鎴戝敖閲忓仛鍒扮畝鍗曪紝铏界劧寰堝涓滆タ娌℃湁鑰冭檻鍛ㄥ叏錛岃繖鏍峰仛鍙互闄嶄綆瀛︿範鎴愭湰銆傝渚嬬▼鍒ゆ柇緋葷粺璋冪敤鍙鳳紝鍗沖瓨鍌ㄥ湪eax涓殑鍊鹼紝鐒跺悗鏌ユ壘鍑芥暟琛細sys_call_table銆?span lang=EN-US>
鍑芥暟琛ㄥ畾涔夊涓嬶細
09/syscall.c
void (*sys_call_table[VALID_SYSCALL])(void) = {sys_print};
VALID_SYSCALL 瀹忓畾涔変負1, of course
緋葷粺璋冪敤嫻嬭瘯鍑芥暟
鐜板湪鎴戜滑鏉ュ仛涓涓敤鎴蜂換鍔$殑緋葷粺璋冪敤嫻嬭瘯鍑芥暟錛?span lang=EN-US>
09/color.c
void
color(void) {
int i, j;
for (i=0; i<16; ++i)
for (j=0; j<16; ++j)
__asm__ ("int $0x80"::"S"(i),"D"(j),"b"('X'),"a"(0));
for (;;)
;
}
鎸変緥錛屾渶綆鍗曞疄鐜般傝繖涓嚱鏁版墦鍗頒竴浜?span lang=EN-US>“X”瀛楃錛屼互涓嶅悓鐨勫墠鏅拰鑳屾櫙棰滆壊銆傝繕鏈変竴涓棶棰橈紝鎬庢牱鎶婂畠瀛樺偍鍦ㄧ鐩樹笂鍛紝鍦ㄦ病鏈?span lang=EN-US>shell鐨勬儏鍐典笅錛堝惁鍒欏彲浠ョ敤cp鏉ユ嫹璐濅簡錛夈傝В鍐崇殑鏂規硶鏄彟澶栧啓涓涓▼搴忔妸紼嬪簭鐩存帴鍐欏埌紓佺洏涓婏細瀹炵幇涓涓?span lang=EN-US>ghex.c紼嬪簭鏉ユ妸color鍙墽琛岀▼搴忕殑鍐呭鎵撳嵃鍑烘潵錛屽湪鍐呮牳閲岄潰鍐嶆妸鍙墽琛屾枃浠跺啓鍒扮鐩樹笂銆?span lang=EN-US>
Makefile涔熷緱淇敼涓涓嬶細
09/Makefile
all: final.img color
color: color.o
${LD} --oformat binary -N -e color -Ttext 0x100000 -o color $<
涓婇潰鐨勫懡浠ゆ妸color.o鏂囦歡鐢熸垚涓涓簩榪涘埗鍙墽琛屾枃浠訛紝鍏ュ彛鐐瑰湪color鍑芥暟錛屼唬鐮佹閫昏緫鍦板潃浠?span lang=EN-US>0x100000寮濮嬨?span lang=EN-US>
錛?span lang=EN-US>color.c鐢變富鏈轟笂鐨?span lang=EN-US>gcc緙栬瘧鍣ㄧ紪璇戯紝ld閾炬帴錛?span lang=EN-US>
鐜板湪鎶婅繖浜涗簩榪涘埗鏁版嵁錛堟樉紺哄懡浠ゆ槸錛?span lang=EN-US>./ghex ../color錛夊啓鍒扮鐩樹笂錛?span lang=EN-US>
09/fs.c
void
install_color(void) {
struct SUPER_BLOCK sb;
char sect[512] = {0};
struct DIR_ENTRY *de = NULL;
int inode = -1;
struct INODE clnode;
unsigned int blk = 0;
unsigned char color[] =
{0x57,0x56,0x53,0x83,0xec,0x08,0xc7,0x44,0x24,0x04,0x00,0x00,
0x00,0x00,0x83,0x
0x00,0x00,0x00,0x00,0x83,0x
0x24,0x04,0x8b,0x
0x00,0x00,0x00,0xcd,0x80,0x89,0xe0,0xff,0x00,0xeb,0xe1,0x8d,
0x44,0x24,0x04,0xff,0x00,0xeb,0xcb,0xeb,0xfe};
sb.sb_start = *(unsigned int *)(HD0_ADDR);
hd_rw(ABS_SUPER_BLK(sb), HD_READ, 1, sect);
memcpy(&sb, sect, sizeof(struct SUPER_BLOCK));
inode = alloc_inode(&sb);
assert(inode > 0);
blk = alloc_blk(&sb);
assert(blk != 0);
clnode.i_block[0] = blk;
hd_rw(blk, HD_WRITE, 1, color);
clnode.i_mode = FT_NML;
clnode.i_size = sizeof color;
iput(&sb, &clnode, inode);
// 涓?span lang=EN-US>color紼嬪簭鍒嗛厤鏂扮殑inode鑺傜偣鍜屽潡
hd_rw(iroot.i_block[0], HD_READ, 1, sect);
de = &((struct DIR_ENTRY *)sect)[2];
strcpy(de->de_name, "color");
de->de_inode = inode;
hd_rw(iroot.i_block[0], HD_WRITE, 1, sect);
// 鎶?span lang=EN-US>color紼嬪簭鏀懼埌鏍圭洰褰?span lang=EN-US>"/"涓嬮潰
iget(&sb, &iroot, 0);
iroot.i_size = 3*sizeof(struct DIR_ENTRY);
iput(&sb, &iroot, 0);
// 鎼炲畾
}
// color紼嬪簭宸茬粡鍐欏埌紓佺洏涓婁簡錛屽啀鎶婂畠鍔犺澆鍒板唴瀛樺湴鍧0x100000
09/fs.c
void
load_color(void) {
struct INODE inode;
struct SUPER_BLOCK sb;
char sect[512] = {0};
sb.sb_start = *(unsigned int *)(HD0_ADDR);
hd_rw(ABS_SUPER_BLK(sb), HD_READ, 1, sect);
memcpy(&sb, sect, sizeof(struct SUPER_BLOCK));
iget(&sb, &inode, 1);
/* 鍙槸綆鍗曠殑鎶?span lang=EN-US>color鍔犺澆鍒拌櫄鎷熷湴鍧0x100000錛堜篃鏄墿鐞嗗湴鍧0x100000錛?span lang=EN-US> */
hd_rw(inode.i_block[0], HD_READ, 1, (void *)0x100000);
}
榪樿寰椾互鍓嶈繍琛岀殑task1_run 鍜?span lang=EN-US>task2_run榪欎袱涓換鍔″悧錛屽畠浠彧鏄仛涓浜涜疆嫻佸湪灞忓箷涓婃墦鍗板瓧絎︾殑鏃犺亰宸ヤ綔銆傛垜浠妸task1鎹㈡垚鎵ц紓佺洏涓殑color紼嬪簭錛?span lang=EN-US>
09/init.c
void
do_task1(void) {
__asm__ ("incb 0xb8000+160*24+2");
load_color();
__asm__ ("jmp 0x100000");
}
鏈鍚庡湪check_root()鍑芥暟涓坊鍔犱竴浜涘畨瑁呭嚱鏁幫細
09/fs.c
if (! testb(sect, 0)) {
kprintf(KPL_DUMP, "/ has not been created, creating....\t\t\t\t\t ");
if (alloc_inode(&sb) != 0) {
kprintf(KPL_PANIC, "\n/ must be inode 0!!!\n");
halt();
}
iroot.i_block[0] = alloc_blk(&sb);
iput(&sb, &iroot, 0);
hd_rw(iroot.i_block[0], HD_READ, 1, sect);
de = (struct DIR_ENTRY *)sect;
strcpy(de->de_name, ".");
de->de_inode = 0;
++de;
strcpy(de->de_name, "..");
de->de_inode = -1;
hd_rw(iroot.i_block[0], HD_WRITE, 1, sect);
kprintf(KPL_DUMP, "[DONE]");
if (iroot.i_size == 2*sizeof(struct DIR_ENTRY))
install_color();
}
緙栬瘧錛岃繍琛屼竴涓嬨傚鏋滀竴璧鋒甯哥殑璇濓紝搴旇鏄?span lang=EN-US>color浠誨姟鎵撳嵃涓緋誨垪鐨勫僵鑹插瓧絎︺傚緢鏈夋垚灝辨劅鍚э細錛?span lang=EN-US>
鍒版涓烘錛岃繖涓緋誨垪鐨勮紼嬪氨緇撴潫浜嗭紝澶у鍙互緇х畫娣卞叆涓嬪幓錛?span lang=EN-US>linux鍐呮牳鏄竴涓煎緱瀛︿範鐨勫ソkernel錛?span lang=EN-US>
鑰屼笖涔熸湁涓浜涜緝濂界殑涔︾睄錛屽鎯呮櫙鍒嗘瀽錛?span lang=EN-US>ULK2錛?span lang=EN-US>In A Nut Shell絳夈?span lang=EN-US>
瀛︿範鏄竴浠舵剦蹇殑浜嬫儏錛屽綋鐒朵篃灝戜笉浜嗘尗鎶樺拰鐓庣啲銆傛佸害鎵嶆槸絎竴浣嶏紝紲濆ぇ瀹惰繘姝ワ細錛?span lang=EN-US>
涓佷亥騫村洓鏈堝豢鍥?span lang=EN-US> 浜庝笂嫻蜂綋鑲查
http://www.shnenglu.com/jinglexy
澶╄。鏈夌紳
絎?span lang="EN-US">8璇撅細鍐呭瓨綆$悊 涓嬭澆婧愪唬鐮?/span>
澹版槑錛氳漿杞借淇濈暀錛?span lang="EN-US">
璇戣咃細http://www.shnenglu.com/jinglexy
鍘熶綔鑰咃細xiaoming.mo at skelix dot org
MSN & Email: jinglexy at yahoo dot com dot cn
鐩爣
鎶辨瓑錛屽叾瀹炶繕娌℃湁瀹炵幇銆傚湪浠誨姟鍒嗛厤鐙珛鐨?span lang="EN-US">4G鍦板潃絀洪棿涓婅皟璇曞け璐ヤ簡錛岀幇鍦ㄥ彧浣胯兘浜嗗垎欏墊満鍒訛紝欏靛紓甯搞傚ぇ閲忕殑宸ヤ綔鏈疄鐜幫紝鏈夊叴瓚g殑鍚屽鍙互鎼滅儲buddy鍜?span lang="EN-US">slab鐨勭浉鍏寵祫鏂欙紝緇忓吀鐨勫唴瀛樼鐞嗙畻娉曘?span lang="EN-US">
鍒嗛〉
386澶勭悊鍣ㄧ殑鍐呭瓨綆$悊鍗曞厓鍙互瀹炵幇浠誨姟鐙珛鍦板潃絀洪棿錛屼換鍔¢棿鍐呭瓨淇濇姢銆傛瘡涓換鍔″彲浠ユ嫢鏈夌嫭绔嬬殑4G铏氭嫙鍦板潃絀洪棿銆傚唴瀛樻槧灝勬槸鍐呭瓨綆$悊寰堥噸瑕佺殑涓姝ワ紝鍙互鍒嗕負涓ら儴鍒嗭細鍒嗘鍜屽垎欏點傚墠闈㈢殑璇劇▼涓凡緇忚璁鴻繃鍒嗘鏈哄埗浜嗭紝閫氳繃鍒嗘鍙互闅斿紑涓嶅悓鐨勪唬鐮侊紝鏁版嵁錛屽爢鏍堢瓑錛涘垎欏靛崟鍏冩妸铏氭嫙鍦板潃鏄犲皠鎴愮墿鐞嗗湴鍧錛岃繕鍙互鐢ㄦ潵瀹炵幇铏氭嫙鍐呭瓨錛堝拰紜洏鍒嗗尯榪涜浜ゆ崲錛夛紝鐜板湪鎴戜滑鏉ヤ簡瑙d竴涓嬪畠銆?span lang="EN-US">
瀵逛簬姣忎釜浠誨姟錛屾垜浠棤娉曞垎閰?span lang="EN-US">4G鐨勭墿鐞嗗唴瀛橈紝鎵浠ヤ嬌鐢ㄤ簡涓浜涙満鍒舵潵綆$悊鍐呭瓨錛氬強铏氭嫙鍐呭瓨鏈哄埗銆傝鏈哄埗鏈夊鐞嗗櫒鐨勫垎欏甸儴鍒嗘潵瀹炵幇錛岄鍏堟垜浠皢鍐呭瓨鍒嗘垚涓浜涘潡錛屾瘡涓潡澶у皬涓?span lang="EN-US">4k錛岄氬父鎴戜滑縐頒箣涓轟竴涓〉甯с傛搷浣滅郴緇熼氳繃欏電洰褰曞拰欏佃〃鏉ョ鐞嗚繖浜涢〉甯с傞〉鐩綍鏄浉褰撲簬絎竴綰ч〉琛紝鍏朵腑鐨勬瘡涓欏瑰啀綆$悊涓涓笅綰ч〉琛ㄣ傦紙鏇磋緇嗚繃紼嬭鍙傝?span lang="EN-US">intel鐨?span lang="EN-US">IA 32/64鎵嬪唽錛?span lang="EN-US">
褰撳垎欏墊満鍒跺紑鍚椂錛屽鐞嗗櫒鎶婁換鍔′腑鐨勮櫄鎷熷湴鍧杞崲鎴愮墿鐞嗗湴鍧錛屾楠ゅ涓嬶細
1.鏌ユ壘孌甸夋嫨瀛愬湪GDT 鎴?span lang="EN-US"> LDT 涓殑鎻忚堪絎︼紝鍋氫竴浜涙潈闄愭鏌ワ紝鐪嬬湅鑳藉惁璁塊棶
2.浠ユ弿榪扮涓殑鍩哄潃鐩稿姞欏電洰褰曞熀鍧寰楀埌涓涓嚎鎬у湴鍧
3.鍦ㄩ〉琛ㄤ腑绱㈠紩铏氭嫙鍦板潃鎵瀵瑰簲鐨勯〉琛ㄩ」錛屽緱鍒伴〉鍦板潃
4.鏌ユ壘鍋忕Щ寰楀埌瀹為檯鐗╃悊鍦板潃銆?span lang="EN-US">
濡傛灉瀹為檯鐗╃悊欏典笉瀛樺湪錛堝彲鑳戒氦鎹㈠埌紜洏涓幓浜嗭級錛屽垯寮曞彂寮傚父錛屽彲浠ュ湪榪欎釜寮傚父閲岄潰鍋氭兂瑕佸仛鐨勪簨鎯咃紙鍔犺澆紜洏涓殑浜ゆ崲欏碉紝鎴栬?span lang="EN-US">kill榪欎釜紼嬪簭錛?span lang="EN-US">Segment Fault錛岀瓑絳夛級
澶勭悊鍣ㄤ嬌鐢ㄧ殑欏電洰褰曟垨鑰呴〉琛紝閮芥槸鐢?span lang="EN-US">32 浣嶇殑欏圭粍鎴愶細
欏電洰褰曢」錛?/span>
31 12
11 9 876 5
43 2 1 0
鈹忊攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲敁
鈹?nbsp; 鎸囧悜欏佃〃鐨勭墿鐞嗗湴鍧 鈹?鐢ㄦ埛瀹氫箟 鈹?nbsp; X 鈹?nbsp;A鈹? X 鈹?U/S鈹?R/W鈹?P 鈹?o:p>
鈹椻攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲敍
欏佃〃欏癸細
31 12
11 9 87 6 5
43 2 1 0
鈹忊攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲敁
鈹?nbsp; 鎸囧悜欏靛撫鐨勭墿鐞嗗湴鍧 鈹?鐢ㄦ埛瀹氫箟 鈹?nbsp;X鈹僁鈹?nbsp;A鈹?X 鈹? U/S鈹?R/W鈹?P 鈹?o:p>
鈹椻攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲敍
浠庝笂闈㈠彲浠ョ煡閬擄紝欏電洰褰曢」鍜岄〉琛ㄩ」鐨勭粨鏋勫緢綾諱技錛屼笅闈㈤愪釜璇存槑涓涓嬪叾涓殑鍩燂細
|
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 |
琛ㄧず欏佃〃鎴栭〉甯х殑鏉冮檺錛屽綋鐗規潈綰т負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"> |
欏電洰褰曠殑姣忎竴欏癸細鍗抽〉琛ㄧ殑鐗╃悊鍦板潃錛屽畠鐨勯珮20 浣嶅湴鍧琛ㄧず鏈変釜欏靛撫鐨勮搗濮嬪湴鍧錛屾濂藉拰4k瀵歸綈銆?span lang="EN-US">2^20鍙互琛ㄧず1M鑼冨洿錛屾瘡涓〉甯уぇ灝忔槸4k錛屾墍浠ュ彲浠ョ儲寮?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 |
欏電洰褰曢」鐨勭儲寮曚笅鏍囷紝鐢卞畠鍙互寰楀埌欏佃〃鐨勭墿鐞嗗湴鍧 |
|
Bits 21-12 |
欏佃〃欏圭殑绱㈠紩涓嬫爣錛岀敱瀹冨彲浠ュ緱鍒伴〉甯х殑鐗╃悊鍦板潃 |
|
Bits 11-0 |
鐩稿欏靛撫璧峰鍦板潃鐨勫亸縐?span lang="EN-US"> |
涓句緥鏉ヨ錛屾垜浠湁涓涓昏緫鍦板潃錛?span lang="EN-US">0x3E837B0A銆傚墠鎻愭潯浠訛細CR3瀵勫瓨鍣ㄦ寚鍚戠殑欏電洰褰曞湴鍧鏄?span lang="EN-US"> 0x0005C000錛岃繖涓瘎瀛樺櫒瀛樺偍浜嗗綋鍓嶉〉鐩綍鎵浣跨敤鐨勯〉甯х殑鐗╃悊鍦板潃錛岄氬父涔熷彨鍋?span lang="EN-US">
PDBR銆?span lang="EN-US">
鍏堝彇瀹冪殑楂?span lang="EN-US">10浣嶏紝 灝辨槸0x0FA錛岀敱瀹冨彲浠ョ儲寮曞埌欏電洰褰曠殑絎?span lang="EN-US">0x0FA欏癸紝鎴戜滑鍙栧緱榪欎竴欏圭殑鍊鹼紝鍋囪寰楀埌鐨勫湴鍧鍊兼槸0x0003F000銆傜劧鍚庢垜浠彇铏氭嫙鍦板潃鐨勪腑闂?span lang="EN-US">10浣嶏紝灝辨槸0x037錛屽啀鍙栧嚭0x0003F000鎸囧悜欏靛撫鐨勭0x037欏圭殑鍊鹼紝鍋囪鏄?span lang="EN-US">0x0001B000銆傝繖涓湴鍧灝辨槸鎴戜滑瑕佹壘鐨勮櫄鎷熷湴鍧瀵瑰簲鐨勭墿鐞嗗湴鍧鐨勯〉甯х殑璧峰鍦板潃錛屾渶鍚庡姞涓婂亸縐誨鹼紙浣?span lang="EN-US">12浣嶏級錛屽嵆0xB0A錛屽緱鍒板疄闄呯殑鐗╃悊鍦板潃鏄細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 鎸囦護鎴栬呭湪浠誨姟鍒囨崲鏃朵嬌鐢?span lang="EN-US">TSS涓殑CR3鍩熺殑鍊箋傚綋澶勭悊鍣ㄨ闂笉瀛樺湪鐨勯〉甯ф椂錛屽彂鐢熶竴涓紓甯革紝CR2 瀵勫瓨鍣ㄥ瓨寮曞彂寮傚父鐨勯昏緫鍦板潃錛屽悓鏃墮敊璇爜涔熶細鍘嬪叆鍒板爢鏍堜腑錛岄敊璇爜鏍煎紡濡備笅錛?span lang="EN-US">
31
3 2 1 0
鈹忊攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲敁
鈹?nbsp; 鏈嬌鐢?span lang="EN-US"> 鈹?U/S鈹?R/W鈹?P 鈹?o:p>
鈹椻攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲攣鈹佲敍
寮傚父澶勭悊渚嬬▼閫氬父閲囧彇濡備笅鐨勬楠わ細
鏌ユ壘涓涓┖闂茬殑欏靛撫鎴栦粠紜洏涓皢欏靛撫浜ゆ崲鍑烘潵錛岄噸鏂拌緗紜殑欏電洰褰曢」鎴栭〉琛ㄩ」鐨勫鹼紝鍒鋒柊TLB銆傚鐞嗗櫒閫氬父淇濆瓨鏈榪戞渶澶氳闂殑欏電洰褰曟垨欏佃〃欏瑰埌涓涓?span lang="EN-US">cache涓紝浠ラ伩鍏嶆瘡嬈¢兘榪涜铏氭嫙鍦板潃鍒扮墿鐞嗗湴鍧鐨勮漿鎹紝榪欎釜cache灝卞彨鍋?span lang="EN-US">TLB銆傚彧鏈夋垜浠敼鍔ㄤ簡欏電洰褰曟垨欏佃〃欏癸紝灝卞簲褰撳埛鏂?span lang="EN-US">TLB銆傛柟娉曞緢綆鍗曪紝灝辨槸閲嶆柊鍔犺澆CR3 瀵勫瓨鍣ㄣ?span lang="EN-US">
鐜板湪鎴戜滑鏉ョ湅鐪嬩唬鐮佹錛屽唴瀛樼鐞嗛氬父灝戜笉浜嗗ぇ閲忕殑瀹忓畾涔夛細
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) {
/* 欏佃〃欏瑰睘鎬ц緗負: kernel, r/w, present */
page_table[i] = address|7;
address += PAGE_SIZE;
};
// 涓婇潰寰幆鍒濆鍖栦簡0~4M瀵瑰簲鐨勬墍鏈夐〉琛ㄩ」
page_dir[0] = (PAGE_TABLE|7);
// 欏電洰褰曢」鍙渶瑕佺涓涓氨鍙互浜嗭紝鍥犱負鍙湁4M鍐呭瓨
for (i=1; i<1024; ++i)
page_dir[i] = 6;
// 鍏朵粬鐨?span lang="EN-US">1023涓〉鐩綍欏硅緗負絀猴紝濡傛灉榪?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;
// 鍥犱負鍐呮牳鍙敤鍒頒簡浣庝簬1M鐨勫唴瀛橈紝鎵浠ヤ繚鐣欏畠浠紝榪欐牱灝變笉浼氳浜ゆ崲鍑哄幓浜?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浣嶅浘錛屾垜浠彲浠ユ竻妤氱殑鐭ラ亾鍐呭瓨鐨勪嬌鐢ㄦ儏鍐碉紝榪欐牱灝卞彲浠ュ垎閰嶇┖闂查〉甯т簡錛屽涓嬶細
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">
鐜板湪鎴戜滑鏉ュ姩鎬佺殑鍒嗛厤涓浜涘唴瀛橈紝鎴戜滑淇敼涓涓嬩換鍔″嚱鏁幫細
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;
}
鑷繁鍒嗛厤鐨勪換鍔℃暟鎹粨鏋勫拰浠誨姟鍫嗘爤錛屾槸涓嶆槸寰堟湁鎴愬氨鎰燂細錛?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 鍐呮牳鍙婂簲鐢ㄧ▼搴忔簮紼嬪簭錛?/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
涓冦佸祵鍏ュ紡鍙奜S寮鍙戣祫鏂欙紙鑻辨枃錛?/span>
鍏?/span>Testing and debugging KOS錛堣嫳鏂囷級
http://kos.enix.org/~d2/snapshots/kos_current/doc/testingen-html
涔濄?/span>the Single UNIX Specification Version 3錛堟帹鑽愶細鍙綔涓?/span>posix鐨勬浛浠e弬鑰冭祫鏂欙級
http://www.unix.org/single_unix_specification
鍗併?/span>OS璁捐鍙傝冿紙鑻辨枃錛?/span>
http://www.nondot.org/~sabre/os/articles
澹版槑錛氳漿杞借淇濈暀錛?/span>
璇戣?/span>錛?/span>http://www.shnenglu.com/jinglexy
鍘熶綔鑰咃細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鍏鋒湁楂樺害鍙幾緙╂э紝涔熷緢瀹規槗鐞嗚В錛岀浉姣斾箣涓?span lang="EN-US">C錛嬶紜涓殑IO榪愮畻絎﹀氨姣旇緝闅句簡銆備負浜嗗湪灞忓箷涓婃樉紺哄瓧絎︿覆鎴栨暟鎹紝鎴戜滑鐜板湪闇瑕佸疄鐜扮被浼?span lang="EN-US">C
榪欓噷鏈変竴縐嶆柟娉曟潵瀹炵幇錛屾垜浠洿鍒拌薄func(int arg1, int arg2, int arg3)榪欐牱涓涓嚱鏁拌璋冪敤鏃訛紝瀹冩眹緙栧悗鐨勬寚浠ゅ簲璇ュ涓嬶紙鎵鏈変粠宸﹀悜鍙沖叆鏍堢殑緙栬瘧鍣ㄥ簲璇ヤ粠鍦扮悆涓婂交搴曟秷澶憋級錛?span lang="EN-US">
pushl arg3
pushl arg2
pushl arg1
call func
鎴戜滑鐪嬪埌錛屽弬鏁頒粠鍙沖悜宸︿竴涓釜鍏ユ爤錛屽弬鏁拌秺澶氾紝鍏ユ爤瓚婃繁銆傚鏋滄槸鍙彉鍙傛暟閭f垜浠庝箞鐭ラ亾鏈夊灝戜釜鍙傛暟鍛紵絳旀鏄?span lang="EN-US">printf鏍煎紡鍖栧瓧絎︿覆涓弬鏁板垽鏂細鏈夊灝戜釜%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瀽鏍堬紝濡傛灉浣犵啛鎮?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))
// 榪欎釜瀹忓洓鑸嶄簲鍏ュ弬鏁板ぇ灝忎負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) //
鍒扮幇鍦ㄤ負姝紝浠涔堜篃涓嶅仛
#define args_next(ap, type) (((type *)(ap+=_arg_stack_size(type)))[-1])
//
鍙?span lang="EN-US">‘褰撳墠’鍙傛暟鍦板潃錛岀劧鍚庤緗寚閽堜負涓嬩竴涓弬鏁板湴鍧錛屾毀鏄х殑鍑芥暟鍚嶏紒
03/kprintf.c
static char buf[1024] =
{-1}; // 娉ㄦ剰娌℃湁閿佷繚鎶わ紝寮曠敤璇ュ彉閲忕殑鍑芥暟涓嶅彲閲嶅叆錛?span lang="EN-US">
static int ptr = -1;
涓嬮潰涓や釜鍑芥暟瑙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榪欎釜鍑芥暟錛屽畠鏀寔鐨勬牸寮忥細%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,
鍚庨潰浼氫粙緇嶅埌.
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() 鏄笅灞傜殑鏄劇ず鍑芥暟錛屾湰鏂囧悗闈細鏈夎瑙?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錛岀紪璇戝櫒浠嶇劧浼氫駭鐢?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鍑芥暟
鐩存帴鎿嶄綔鏄懼瓨鍖哄煙涓鐐逛篃涓嶆柟渚匡紝鎵浠ユ垜浠渶瑕佷竴涓樉紺烘ā鍧椼傝繖涓氨鏄垜浠殑‘鏄懼崱椹卞姩’浜嗭紝鏄笉鏄笉鏁㈢浉淇¢┍鍔ㄦ槸榪欎箞綆鍗曠殑浜嬫儏錛熸垜浠厛鏉ョ湅涓涓嬩竴浜涘父閲忓畾涔夛細
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
// 蹇呴』鏄細2^n
#define VIDEO_RAM
0xb8000 // 鏄懼瓨鍦板潃
鎴戜滑鏇劇畝瑕佹彁鍒拌繃榪欎釜鍦板潃錛屽湪瀛楃妯″紡涓嬶紝閫傞厤鍣ㄤ嬌鐢?span lang="EN-US">0xB8000-0xBF000浣滀負瑙嗛鍐呭瓨銆傞氬父鎴戜滑澶勪簬80x25澶у皬灞忓箷錛屾湁16縐嶉鑹層傜敱浜庝竴涓睆騫曞彧闇瑕?span lang="EN-US">80x25x2涓瓧鑺傦紝鍗?span lang="EN-US">4k錛屾墍浠ヨ瑙嗛鍐呭瓨鍙互鍒嗕負澶氫釜欏點傛垜浠嬌鐢ㄦ墍鏈夌殑欏碉紝浣嗘槸褰撳墠鍙兘鏈変竴涓〉闈㈠彲瑙併備負浜嗘樉紺轟竴涓瓧絎︼紝灝嗙敤鍒?span lang="EN-US">2涓瓧鑺傦紝涓涓瓧鑺傛槸瀛楃鍊鹼紝鍙︿竴涓瓧鑺傛槸瀛楃灞炴э紙鍗抽鑹詫級銆傚睘鎬у瓧鑺傚畾涔夊涓嬶細
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;
鍧愭爣緋誨涓嬶細
___________________\
| 錛?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寰幆鏈夐棶棰橈紝瑙夊緱搴旇鏀規垚涓嬮潰榪欐牱錛?span lang="EN-US">
// for (i = i * lines;
i>=0; --i)
*p-- =
(short)((BLANK_ATTR<<4)|BLANK_CHAR);
}
涓嬮潰鍑芥暟璁劇疆鍏夋爣鍙兘浼氬紩鍙戠珵鎬佹潯浠訛紝浣嗘槸print_c鍙噯澶囧湪鍐呮牳涓嬌鐢紝鎵浠ユ病鏈夊叧涓柇銆傚畠鍙兘浼氬紩璧蜂竴浜?span lang="EN-US">bug錛屼絾鏄垜娌℃湁鎵懼埌銆傝瘧娉細鍏ㄥ眬鍙橀噺娌℃湁閿佷繚鎶ゅ湪璁捐涓婂氨鏄竴縐嶉敊璇傝繖閲岀殑浠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://www.shnenglu.com/jinglexy
鍘熶綔鑰咃細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">
孌靛浜庢垜浠潵璇村啀鐔熸倝涓嶈繃浜嗭紝鍏堝洖欏句竴涓?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, 鍥犱負鍦?span lang="EN-US">80386涓嬌鐢ㄤ簡20浣嶅湴鍧綰匡紝鎵浠ュ彲浠ラ澶栧璁塊棶65519涓瓧鑺傝櫄鎷熷湴鍧錛屼緥濡傚湴鍧0x100010琚槧灝勫埌鍦板潃0x10錛岃闂繖涓や釜鍦板潃鏄瓑浠風殑銆?span lang="EN-US">
琛ㄧず鍚屼竴涓墿鐞嗗湴鍧鏈夊縐嶆柟寮忥紝渚嬪
鍙︿竴涓蹇墊槸綰挎у湴鍧錛岃繖涓槸32浣嶅湴鍧錛屽彧鏈夊綋鍒嗛〉鏈哄埗寮鍚椂鎵嶆湁鏁堬紝鏂囩珷鍚庨潰浼氭彁鍒板畠銆?span lang="EN-US">
寮曞榪囩▼
褰撶郴緇熶笂鐢墊垨RESET鏃訛紝澶勭悊鍣ㄥ皢鎵ц涓浜涘垪鐨勫垵濮嬪寲錛屽瘎瀛樺櫒琚緗垚闈為鐭ョ姸鎬侊紝騫朵笖cpu澶勪簬瀹炴ā寮忋備篃璁鎬綘鎯崇煡閬?span lang="EN-US">cpu鏄庢牱璁劇疆segment:offset涓虹墿鐞嗗湴鍧FFFF0鐨勶紙0xf000:0xfff0灝辨槸bios鍏ュ彛鍦板潃錛夛紝榪欐槸鍥犱負cs瀵勫瓨鍣ㄦ湁涓涓潪鍙閮ㄥ垎錛屽畠淇濆瓨浜?span lang="EN-US">ffff:0000鍦板潃錛屽茍涓?span lang="EN-US">cs鍦ㄥ垵濮嬪寲鏃朵細琚鍏?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鎸囦護鐨勬満鍣ㄧ爜
.word 0xaa55
璁茶В錛?span lang="EN-US">.org鎸囦護鎸囩ず涓嬩竴涓暟鎹湴鍧錛屼負浜嗙紪璇戣繖涓▼搴忥紝鎴戜滑鍐欎簡涓涓?span lang="EN-US">Makefile錛屾諱笉鑳借佹槸鏁插懡浠ゅ惂錛屽懙鍛點?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鍙互琚厤緗負鏀寔澶氫簬涓縐嶇殑鐩爣鏂囦歡. binary琛ㄧず娌℃湁紼嬪簭澶村拰鍏朵粬淇℃伅錛屼粎浠呮槸涓浜涜8鏁版嵁銆傚鏋滄病鏈夎繖涓夐」錛屽皢琚粯璁ら摼鎺ヤ負elf鏍煎紡銆?span lang="EN-US">-N鎶?span lang="EN-US">text鍜?span lang="EN-US">data鑺傝緗負鍙鍐欍?span lang="EN-US">-Ttext灝?span lang="EN-US">text鑺傝搗濮嬪湴鍧璁劇疆涓?span lang="EN-US">0x
鐜板湪鎴戜滑榪愯make鎸囦護緙栬瘧涓涓嬶細
[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‘鐨勶紝鍥犱負鎴戜滑浠涔堜篃娌℃湁鍋氥?span lang="EN-US">
紼嬪簭涓錛氭樉紺?Hello World!
濂戒簡錛屼笂闈㈢殑榛戝睆紼嬪簭騫朵笉鏄お濂界帺錛岀幇鍦ㄦ垜浠皾璇曞湪涓婇潰鎵撳嵃"Hello World!"
01/hello.world/bootsect.s
.text
.globl start
.code16
start:
jmp code
msg:
浣跨敤jmp鎸囦護璺寵繃璇ュ彉閲忥紝榪欐槸鎴戜滑涓轟粈涔堝湪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鍊艱緗負0x07鍙互灝嗚繖涓?span lang="EN-US">byte棰滆壊璁劇疆涓洪粦搴曠櫧瀛椼?span lang="EN-US">
xorw
%ax, %ax
movw
%ax, %ds
movw $msg,
%si 涓?span lang="EN-US">movsb鎸囦護璁劇疆姝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://www.shnenglu.com/jinglexy
鍘熶綔鑰咃細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鐜銆備笉榪囨垜娌℃湁灝濊瘯浣跨敤瀹冿紝鍥犱負鎴戠殑鐢佃剳涓婃病鏈夊畨瑁?span lang="EN-US">windows鎿嶄綔緋葷粺銆備篃鍙互鍦ㄤ綘鐨?span lang="EN-US">windows緋葷粺涓婂畨瑁呬竴涓櫄鎷熸満涓婄殑linux錛屽鏋滀綘鐨勭數鑴戣凍澶熷揩鐨勮瘽銆?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紼嬪簭鍛樺繀欏繪帉鎻$殑涓欏瑰熀鏈煡璇嗐傚彟澶栵紝濡傛灉浣犵啛鎮夊唴瀛樺湴鍧鏄犲皠錛屼腑鏂紝寮傚父錛?/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
璇昏呭榪欎簺涓滆タ涓嶅繀绱у紶錛屾垜鍦ㄦ暀紼嬩腑浼氳В閲婄浉鍏崇殑鐭ヨ瘑銆?span lang="EN-US">c璇█鍜屾眹緙栨槸鏈鍩烘湰鐨勮姹傦紝鑳藉寰堟竻妤氱殑浜嗚В浠涔堟槸鍫嗗拰鏍堛傚叧浜?span lang="EN-US">c璇█鐨勬暟鎹垚鍗冧笂涓囷紝浣嗘槸淇濇姢妯″紡鏂歸潰鐨勪功綾嶆瘮鍝堥浄鎱ф槦榪樺皯錛屾嵁璇存瘡76騫村彲浠ヤ拱鍒頒竴鏈紝濡傛灉浣犺凍澶熷垢榪愮殑璇濓細錛?a name="Color_Pattern">
椋庢牸綰﹀畾
鍘熸枃涓殑鏍煎紡琚搮鑷幓鎺変簡錛岀炕璇戝悗鐨勯鏍煎簲璇ュ彲浠ヤ竴鐪嬪氨鎳傘?/span>
which: 鍙湪PATH鐜鍙橀噺涓鎵炬枃浠?span lang="EN-US">
whereis: 鍦ㄧ郴緇熷畾涔夌殑鐩綍涓鎵?span lang="EN-US">
2.鏍規嵁鍏抽敭瀛楁煡鎵?span lang="EN-US">man欏?span lang="EN-US">
涓句緥錛?span lang="EN-US">apropos split 鎴栬?span lang="EN-US"> man -k split
3.sed紺轟緥錛?span lang="EN-US">
sed -e s/root/toor/g /etc/passwd >
~/test.out 鏇挎崲 /etc/passwd涓殑root涓?span lang="EN-US">toor杈撳嚭鍒?span lang="EN-US">~/test.out
sed -e 's/root/toor/g; s/ftp/ptf/g'
/etc/passwd 浣跨敤 -e 鎸囧畾澶氫釜鍛戒護
sed -e 's/root/toor/g' -e ' s/ftp/ptf/g'
/etc/passwd 鍚屼笂
浣跨敤鍛戒護鏂囦歡錛?span lang="EN-US">
/* test.sed 寮濮嬶紝涓嶅寘鍚湰琛?span lang="EN-US"> */
s/root/toor/g
s/ftp/ptf/g
/* test.sed 緇撴潫錛屼笉鍖呭惈鏈 */
鎸囦護錛?span lang="EN-US">sed -f
test.sed /etc/passwd
4.awk紺轟緥錛?span lang="EN-US">
awk '{print $0}'
/etc/passwd $0琛ㄧず瀹屾暣鐨勮緭鍏ヨ褰?span lang="EN-US">
awk -F":" '{print $1}'
/etc/passwd 鎵撳嵃絎竴鍒楋紝浠ワ細涓哄垎闅旂
awk -F":" '{print "username:
"$1 "\t\t\t user id: "$3}'
/etc/passwd 鏍煎紡鍖栧茍鎵撳嵃
浣跨敤鍛戒護鏂囦歡錛?span lang="EN-US">
/* test.awk 寮濮嬶紝涓嶅寘鍚湰琛?span lang="EN-US"> */
BEGIN{
FS=":"
}
{printf "username: "$1 "\t\t\t user id:
"$3"\n"}
END{
printf "all done processing
/etc/passwd\n"
}
/* test.awk 緇撴潫錛屼笉鍖呭惈鏈 */
鎸囦護錛?span lang="EN-US">awk -f
test.awk /etc/passwd
5.shell鑴氭湰
1)鐗規畩鍙橀噺錛?span lang="EN-US">
?鍓嶄竴涓懡浠よ緭鍑虹姸鎬?span lang="EN-US">
0褰撳墠鑴氭湰鍚?span lang="EN-US">
1~9鍙傛暟
2)鑼冧緥1錛屼嬌鐢?span lang="EN-US">if璇彞
#!/bin/bash
echo "guest
the select color"
read COLOR
if [ $COLOR =
"yellow" ]
then
echo
"you are correct"
elif [ $COLOR = "blue" ]
then
echo
"you are correct also"
fi
3)鑼冧緥2錛屼嬌鐢?span lang="EN-US">case璇彞
#!/bin/bash
case "$1"
in
start)
echo "start......"
;;
stop)
echo "stop......"
;;
status)
echo "status......"
;;
*)
echo "usage: $0 {start | stop | status}"
;;
esac
4)鑼冧緥3錛屼嬌鐢ㄨ凱浠f祦紼?span lang="EN-US">
#!/bin/bash
echo "guest
color: red, blue or orange\n"
read COLOR
while [ $COLOR !=
"orange" ]
do
echo
"incorrect, try again"
read
COLOR
done
echo
"correct"
5)浣跨敤鍙屽紩鍙瘋繘琛屽懡浠ゆ浛鎹?span lang="EN-US">
lines="$(wc -l 3.sh)"
echo $lines
6)嫻嬭瘯鏂囦歡
-d
file 鐩綍
-e
file 瀛樺湪
-r
file 鍙
-w
file 鍙啓
-x
file 鍙墽琛?