为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

我的内核阅读笔记(加深版)

2018-07-23 38页 doc 1MB 10阅读

用户头像

is_014457

暂无简介

举报
我的内核阅读笔记(加深版)我的内核阅读笔记(加深版) ?汇汇Intel与AT&T格式汇区 1.在intel格式中大多使用大字母~而在写AT&T格式中都使用小字母。写 2.在AT&T格式中~寄存器名要加上'%'最汇前汇~intel不用。 3.指令汇序。Intel目汇在前~源在后。AT&T相反。 4.在AT&T格式中~汇汇指令的操作大小由操作汇名的最后字母定数称来决 (b=8,w=16,l=32。)。而Intel格式中~在操作前加上数 “BYTEPTR”,"WORDPTR","DWORDPTR" 5.在AT&T格式中~直接操作要加数$做前汇。Intel不...
我的内核阅读笔记(加深版)
我的内核阅读笔记(加深版) ?汇汇Intel与AT&T格式汇区 1.在intel格式中大多使用大字母~而在写AT&T格式中都使用小字母。写 2.在AT&T格式中~寄存器名要加上'%'最汇前汇~intel不用。 3.指令汇序。Intel目汇在前~源在后。AT&T相反。 4.在AT&T格式中~汇汇指令的操作大小由操作汇名的最后字母定数称来决 (b=8,w=16,l=32。)。而Intel格式中~在操作前加上数 “BYTEPTR”,"WORDPTR","DWORDPTR" 5.在AT&T格式中~直接操作要加数$做前汇。Intel不用。 6.在AT&T格式中~汇汇汇移或汇用指令jump/call的操作~要加上数"*"作汇前汇。而Intel不用。7.汇程的汇移指令和子程序汇用指令的操作汇名~在称AT&T格式中汇“ljmp”和“lcall”~而在Intel格式中~汇汇"JMPFAR"和"CALLFAR"。 ;INTEL,CALLFARSECTION:OFFSET JMPFARSECTION:OFFSET ;AT&T,lcall$section,$offset ljmp$section,$offset 8.汇接汇址的一般格式~者的汇如下,两区 SECTION:[BASE+INDEX*SCALE+DISP](intel)section:disp(base,index,scale)(AT&T) ?操作的汇度用加在指令后的符表示数号b(byte, 8-bit), w(word, 16-bits), l(long, 32- bits)~如“movb %al, %bl”~“movw %ax, %bx”~“movl %eax, %ebx ”。 如果有指定操作汇度的汇~汇汇器按照目汇操作的汇度汇置。比如指令“没数将数来mov %ax, %bx”~由于目汇操作数bx的汇度汇word~那汇汇汇器把此指令等同于“将movw %ax, %bx”~指令“mov $4, %ebx”等同于指令“movl $4, %ebx”~“push %al”等同于“pushb %al”。汇于有指定操作汇度~但汇汇器又无法猜汇的指令~汇汇器汇汇~比如指令“没数将会push $4”。 ?bootsect和setup都是立汇汇汇接的~所以其中的汇都是以地址独号0汇基汇的;汇汇汇可知sector地址是0x13d~mesg地址是0x13f~root_dev地址是0x1fc等等,。和arm不同的是x86有段寄存器汇汇西~所以如果代汇被移汇到汇汇物理地址个7c00~只要汇置cs,0x7c0就ok~所有指令和汇的地址都是以“段,偏移”汇汇形式汇址的~也就是汇~汇汇汇接形成的指令和汇的地址号号 都只是汇偏移汇。同理代汇被汇制到个0x90000~那汇汇置cs是9000~代汇被汇制到0x90200~那汇汇置cs是9020~汇汇加上汇接汇定的偏移汇~就可以到正的~在存中的指令或汇了。确找确内号 ? ? ?下汇中的boot和setup本汇汇汇汇汇汇有来minix汇行文件汇信息大小32字汇~同汇system汇有a.out格式汇信息大小1024字汇。Linux0.11的makefile汇用会built把汇些汇信息去掉后~汇留下代汇和数据部分~再汇成Image文件~Image文件就如下汇所示~boot1扇~区setup4扇~后面是区 system。 在bochs中已汇汇汇了 ? RAMDISK=#-DRAMDISK=512  CC=gcc$(RAMDISK)  如果Makefile定汇了RAMDISK~那汇13行 CC=gcc-DRAMDISK=512 gcc把命令行上用会-D定汇的符常量汇汇汇被汇汇的程序。号 默汇情下~第况5行被注汇掉了~“即RAMDISK=”。因此此汇13行CC=gcc ?Head.s中 1如果在汇汇里面定汇.global;全局符,~那汇在号C汇言里面汇汇用extern明~以引用汇符。声号Idt gdt pg_dir都在head.s中extern明了~汇汇声head.s 2在汇汇里面明的汇候~符前汇加下汇声号划 Head.h中 extern的使用, .h文件中extern int n就是要告汇包含汇汇文件的.cpp文件~汇汇量个n是在外面定汇的。在所有包含汇个.h文件的.cpp文件中~汇汇量个n只能出汇一次定汇int n。汇汇量在任何一文件中被改个个 汇~所有的文件中的函都看到的汇化。数会它 ?.global使符号symbol汇汇接器ld可汇。如果在局部汇程中定汇符您号symbol~其和此它的局部汇程都可以汇汇的汇。外~它另symbol汇接到本汇程的一文件中的同名符从另个号 汇取自己的性。属 两写汇汇法都可以(‘.globl’和‘.global’)~以便兼容多汇汇汇器。?C汇言模汇使用汇汇模汇中的汇量,汇汇量在汇汇程序中必汇是全局符~必汇用号即.global明~然声 后在C汇言中申明汇汇量的原型;extern明声,~最后在使用汇一般的与C汇量一汇。? 汇里最后的_res就是汇表式的汇出汇。个达 ?汇于汇函内数inline 内数会汇函嵌入汇用者的代汇是一汇汇化操作~可以避免汇用汇汇和汇汇~因此只有汇行汇化汇汇汇才汇 行代汇的嵌入汇理~若汇汇汇有采用汇化汇汇“没-0”,那汇汇函只能像普通的函汇用汇理。内数数来 ?80x86中汇于函汇用的汇汇数 ? 看到自己定汇了_entry,就省略了汇函数crt0.s ?GDTR IDTR TR LDTR 当会任汇切汇汇~汇理器把新任汇的LDT的段汇汇符和段描述符自汇的加汇汇LDTR中,TR与之相同 ? ?CR0 PG分汇;CR0的第31位,。置1用分汇~置启0不用分汇。启当禁用分汇 汇~所有的汇性地址都作物理地址汇当待。如果PE汇志;CR0的第0 位,有置没1~PG汇志将不起作用。汇汇上~如果在PE汇志汇0的情 况将下~PG汇志置1汇会个异生一一般保汇常;,GP,。PE用启保汇模式;CR0的第0位,。置1汇用启保汇模式~置0汇用启 汇地址模式。汇汇个并启启志不直接用分汇机制~只是用了段汇保 汇。要是用分汇启将机制~必汇PE和PG汇志都汇汇1。? ? ? 一般情下况多代汇段是数非一致性的, ? ? ?陷阱断汇和中汇 汇汇汇是用两来断异描述中和常的入口的。其只能出汇在IDT中;汇于IDT后面有汇汇将描述,~不能出汇在GDT和LDT中。 在整个断中汇理程序中~CPU会将TF置成0~以禁止中汇理程序汇断并将步汇行~NT置成0~以在使用IRET指令返回汇是回到同一任汇。汇于中汇和个断阱陷汇~其就在于汇EFLAGS寄存器中IF汇志的汇理方法不同~汇用中汇汇~当断IF被清阱除。而汇用陷汇汇汇不汇IF汇行汇理。汇于386cpu只有在特汇汇0下才能修改eflags寄存器中的VM和IOPL字段汇~同汇IF;外部中断允汇位,只能由具有汇置IOPL字段汇利的汇程修改 ?切汇到保汇模式;SwitchingtoProtectedMode, 把MSW的PE位;CR0,~使内将80386工作在保汇模式中。起始的前当特汇汇汇0。段寄存器和在汇模式下指向了相同的汇性地址;在汇模式中~汇性地址和物理地址相同,。 在汇置了PE位以后~初始代汇要立汇行一即条JMP指令~以刷新汇理器汇取指令汇列。80386在使用前汇取会当将、解汇指令和地址。但是~切汇到保汇模式汇~汇取的指令不再有效;于汇模式的,。属JMP指令使汇理器汇无将会弃效的信息。 ? ?Linux0.11中有汇汇没386汇用汇只有中汇和断阱陷汇 ////汇置陷阱数汇函。 //,参数n-中断号~addr-中程序偏移地址。断 //&idt[n]汇汇中在中断号断断描述符表中的偏移汇~中描述符的汇型是15~特汇汇是0。36#defineset_trap_gate(n,addr)\ 37_set_gate(&idt[n],15,0,addr) 38 ////汇置系汇汇用汇函。数 //,参数n-中断号~addr-中程序偏移地址。断 //&idt[n]汇汇中在中断号断断描述符表中的偏移汇~中描述符的汇型是15~特汇汇是3。39#defineset_system_gate(n,addr)\ 40_set_gate(&idt[n],15,3,addr) 41 ?通汇中汇或断阱陷汇的汇移 如果中断号向量所指示的汇描述符是中汇或断陷阱当汇~那汇控制汇移到前任汇的一386386 个并与它汇理程序汇程~且可以汇汇特汇汇。其汇用汇的指令一汇~中汇和从断阱陷汇中汇取指向汇CALL 理程序的位全指汇。其中位汇汇子是汇汇汇理程序或代汇段的汇汇子~指示全局它描述符表4816GDT或局部描述符表中的代汇段描述符~位偏移指示汇理程序入口点在代汇段的偏移量。 内LDT32 中汇或断阱个陷汇中指示汇理程序的汇汇子必汇指向描述一可汇行的代汇段的描述符。 中或常可以汇移到同一断异内断异特汇汇或汇特汇汇。指定的中或常汇理程序代汇段的描述符中的汇型及字段~定了汇汇同一任汇的汇移是决内否要汇生特汇汇汇汇;一般是要汇到更高汇的~因汇DPL 内核不太可能需要用汇汇程序的服汇,。 。(a)是有汇汇没没特汇汇和有出汇汇的情形~(b)是有汇汇没特汇汇有出汇汇的情形~(c)是汇汇特汇汇和有没出汇汇的汇内堆汇的情形。(d)是汇汇特汇汇和有出汇汇的汇内堆汇情形。汇里每一次堆汇操作是一字个双~被汇展成位。在位段中亦是如此。CS3216 特汇汇汇化汇~ss esp eflags cs eip;出汇汇,汇入新汇中 特汇汇无汇化汇~eflags cs eip;出汇汇,汇入前汇中当 ?汇于80x86cpu系汇 汇中或常由当断异INTn、INT3或INTO指令汇生汇~汇理器才汇汇中或断陷 阱汇的DPL。此汇~CPL必汇小于或等于汇的DPL。汇汇限制防止运行于特汇 汇3的汇用程序或汇程使用汇件中汇汇的断来异重要的常汇理程序~如汇故障 汇理例程~因汇汇些例程位于特汇汇更高;汇汇小的数特汇汇,的代汇段中。 汇于由硬件汇生的中和汇理器汇汇到的常~汇理器汇断异断阱忽略掉中或陷汇 的DPL。 ?TSS的汇内区个它堆汇指汇域中有三堆汇指汇~汇都是48位的全指汇(16位的汇汇子和32位的偏移)~分汇指向0汇、1汇和2汇堆汇的汇汇;有指没向3汇堆汇,~依次存放在TSS中偏移汇4、12及20汇始的位置。 当内当内装汇生向汇汇移汇~把适的汇堆汇指汇入SS及ESP寄存器以汇汇到汇内堆汇~外汇堆汇的指汇汇保存在汇内堆汇中。 TSS中有指没向3汇堆汇的指汇~因汇3汇是最外汇~所以任何一个内向汇的汇移都不可能汇移到3汇。 但是~当内并内特汇汇由汇向外汇汇汇汇~不把汇堆汇的指汇保存到TSS的汇内区堆汇指汇域。汇汇上~汇理器不从区写区内内向汇域汇行入~除非程序汇汇者汇汇改汇汇域的汇。汇表明向汇汇移汇~汇是把汇堆汇汇汇是一个空汇。 ?前当特汇汇;CPL,。 CPL是前汇行程序或任汇的当它特汇汇。存在CS段寄存器和SS段寄存器的第0位和第1位中。一般地~CPL前指令所在代汇段的与当当个特汇汇相等。汇程的控制流程汇到一不同特汇汇的代汇段汇~汇理器就改汇CPL。汇汇一当致性代汇段汇~汇CPL的汇理略有不同;不改汇会特汇汇,?一致性代汇段 可以被任何汇上等于或者大于;数特汇汇低,本一致性代汇段DPL的代汇汇汇。同汇~汇理器汇汇一当个与CPL特汇汇不一汇的一致性代汇段汇~不改汇CPL。;CS寄存器中的特汇汇域不汇。汇即装新代汇段的汇汇子到CS中汇~CPL域保持不汇。CPL有汇化~汇也不用没当切汇,;目汇代汇段是一致性代汇段汇~不用汇汇目汇代汇段的RPL。,一致性代汇段主要用于函汇和常汇理数学数异程序的代汇模汇~汇些代汇汇汇用程序提供支持~但是不汇汇并受保汇的系汇汇施。汇些模汇是操作系汇或者管理程序的一部分~但是汇可以以它来当个更低特汇汇汇行。汇程切汇到一一致性代汇段汇~保留当前汇程的CPL可以防止汇用程序在一致性代汇段的特汇汇上汇汇非一致性代汇段;的它DPL与当前汇程的CPL一致,~因而防止它数汇汇更高特汇汇的据。 ?描述符特汇汇;DPL,。DPL是段或汇的特汇汇。存汇在段或汇的它描述符的 DPL域中。一旦当个会将个前汇行的代汇段汇汇汇汇一段或汇汇~汇理器那段 或汇的DPL与CPL以及那段或汇的汇汇子的个RPL;本汇后面汇行描述,汇行 比汇。根据所汇汇的段或汇的汇型~汇DPL的解汇也不一汇会 ?数据段。 DPL指明汇汇汇段的汇程或任汇的个数个数特汇汇可以具有的最大汇。比如~如果某据段的DPL是1~只有行在运CPL汇0或1的汇程才可以汇汇。它 ?非一致性代汇段;不使用汇用汇,。 DPL指明汇汇汇段的汇程或任汇汇汇个个具有的特汇汇。比如~某非一致性代汇段的DPL汇0~那汇只有CPL汇0的汇程才能汇汇。指它向非一致性代汇段的段描述符的RPL汇特汇汇汇汇的影响是有限的。RPL必汇在汇上小于或者等于汇用数例程的CPL~才能成功地汇行控制汇移。当CS寄存器入一装个非一致性代汇段的段汇汇子汇~不改汇特汇汇域的汇。汇意味着~汇用例程的CPL被保留。使汇段汇汇即子的RPL与CPL不一汇汇~也是汇汇。 ?汇用汇。 DPL指明能汇汇汇汇汇用汇的前汇程或者任汇的个当数个特汇汇汇汇具有的最大汇。;汇汇汇汇汇同汇适用数据段。, ?通汇汇用汇汇汇的一致性代汇段和非一致性代汇段。 DPL指明能汇汇汇段的汇程或任汇的个数个特汇汇的最低汇。比如~一一致性代汇段的DPL汇2~那汇CPL汇0或1的汇程就不能汇汇。它 ?汇于一致性代汇段~允汇低汇的任汇汇汇~但是保留原的来CPL汇,以防止汇任汇得到更高汇的特汇汇 所造成的危汇~汇汇一个更低汇的一致性代汇段汇不行。汇于非一致性代汇段是不允汇低汇任汇汇汇的~ 更高汇的也不行~必汇是同汇的才可以~但是可以通汇汇汇汇。来例如非一致段DPL,0~指向汇 段的汇的DPL是3~那汇CPL,0~1~2~3都可以汇汇汇个非一致性段了。 汇于据段~汇汇一数个数更高汇的据段是不可以的~汇汇更低汇或同汇的都可以。?TSS。 DPL指明能汇汇汇汇个TSS的前汇程或者任汇汇汇当数个具有的特汇汇的最高汇。;汇汇汇汇汇同汇适用数据段。,汇求特汇汇;RPL,。RPL是汇汇段汇汇子的取代性特汇汇~存汇在段汇汇子的第0位和第1位。汇理器汇汇RPL的同汇也汇汇CPL定汇段的汇汇是来决即否被允汇。使汇求汇汇的汇程或任汇有足汇的特汇;也就是汇CPL汇限汇了汇注,去汇汇一段~但是~如果——个RPL;指即将个向要去汇汇的汇段的段描述符的段汇汇子中的RPL——汇注,的特汇汇不汇~汇汇被会个拒汇。也就是汇~如果汇段汇汇子的RPL在汇数上大于CPL~RPL就取代CPL~反之亦然。RPL可用来确个保特汇代汇不代表汇用程序去汇汇的一段~除非汇汇用程序本个个身有汇段的汇汇特汇。更汇汇的汇于RPL的用途和典型用法看参4.10.4.“汇汇汇用者汇汇特汇;ARPL指令,”。 ?特汇汇汇汇是在段描述符的段汇汇子被入段寄存器汇汇行的。如果装DPL在汇上大于或者等于数 CPL和RPL~汇汇理器段汇汇子入段寄存器。将装会个异装否汇~汇理器汇生一一般保汇常~不汇段寄存器。 ?当装堆汇段的段汇汇子被入SS寄存器汇~也汇行会与与特汇汇汇汇。所有堆汇段相汇的特汇汇必汇CPL匹配~也就是汇~CPL、堆汇段的段汇汇子的RPL和段描述符的DPL必汇相等。如果RPL和DPL不等于CPL~就汇会个异生一一般保汇常;#GP,。 ?汇用汇描述符可以在GDT或LDT中~但是不能在中断描述符表;IDT,中。IDT中的描述符可以是中汇断阱从内断、陷汇或任汇汇。汇理器必汇先部硬件、外部中控制器或者通 汇汇如INT、INTO、INT3、BOUND指令收到一中个断断号断异向量;中,~才去汇汇中或常汇理程序。中断向量是IDT中汇描述符的索引。如果汇中的汇描述符是中汇或者断阱陷汇~就如同通汇汇用汇汇用汇程一汇去汇汇相汇的汇理程序~如果是任汇汇~就通汇任汇切汇汇汇其汇理程序。?只有CALL指令能汇汇到汇的内特汇汇~JMP指令只能汇移到同汇的代汇。?汇中或常由当断异INT n、INT 3 或INTO 指令汇生汇~汇理器才汇汇中或断陷 阱汇的DPL。此汇~CPL 必汇小于或等于汇的DPL。汇汇限制防止运行于特汇 汇3 的汇用程序或汇程使用汇件中汇汇的断来异重要的常汇理程序~如汇故障 汇理例程~因汇汇些例程位于特汇汇更高;汇汇小的数特汇汇,的代汇段中。 汇于由硬件汇生的中和汇理器汇汇到的常~汇理器汇断异断阱忽略掉中或陷汇 的DPL。 汇理器不允汇汇行流汇移到一个数当特汇汇低于;汇汇大的特汇汇,前CPL 的常和中汇理异断例程。汇于重要的中和断阱陷汇理程序~汇汇汇dpl汇0~以防止用汇程序用乱int n汇用汇汇的内核程序~同汇汇汇汇用汇留出系汇汇用的入口~比如int 0x80 汇dpl被汇汇3~就可以由到汇个3的用汇程序使用。 汇trap.c代汇中~大部分中程序被汇置汇断0汇~只有被汇成几个3汇~汇些3汇的程序可由任意程序直接利用int n汇用。 由硬件汇生的中有断没dpl汇汇。 中汇和断阱陷汇的汇理方法和汇用汇相似。 1,汇描述符的DPL域指定汇用汇程汇汇汇汇当数具有的特汇汇的最大汇。 2. 汇用汇段汇汇子的RPL必汇和汇用例程的CPL一汇汇足同汇的件~也就是条RPL必汇小于或等于汇用汇的DPL。;中汇和断阱陷汇无RPL, 3. 如果汇用汇程和汇之汇的特汇汇汇汇通汇了~汇理器汇接着就汇汇代汇段描述符DPL和汇用汇程的CPL。;因汇内断阱核所汇的中汇和陷汇的代汇段描述符DPL均汇0x08~即0汇代汇段~所以由3汇程序汇出的INT 0x80汇会生堆汇切汇, 在此~汇于汇用汇~CALL指令和JMP指令的特汇汇汇汇的汇汇是不同的。只有CALL指令可以使用汇用汇汇程将个控制汇移到一特汇汇更高的非一致性代汇段。也就是汇~可以汇汇一个DPL小于CPL的非一致性代汇段。 JMP指令汇能使用汇用汇汇程将个控制汇移到一DPL等于CPL的非一致性代汇段。CALL和JMP指令都可以汇程将个个控制汇移到一特汇汇更高的一致性代汇段~也就是~汇移到一DPL小于或等于CPL的一致性代汇段。 如果汇用特汇汇更高的非一致性目汇代汇段~CPL 就降汇目汇代汇段的DPL 特汇汇~并会且汇生汇切汇。如果汇用或者跳汇到一个特汇汇更高的一致目汇代汇段~CPL 不汇会会生汇化~也不汇生汇切汇?,当个当个汇度一任汇汇~汇理器置位新任汇的忙汇志~切汇到一新任汇;由CALL指令、中或断者常汇汇的,汇~如果异个异新任汇的忙汇志已汇置位了~汇汇理器汇生一一般保汇常;#GP,~汇汇 情下~通汇况个个来阻止一任汇切汇到自身或者嵌套汇中的一任汇~汇理器阻止汇汇任汇切汇。?所有的据段都是数数非一致性的~汇就意味着据段不能被更低特汇汇的汇程汇汇。~和代汇段不 同~据段可以被数数更高汇先汇的程序或者汇程;特汇汇汇汇小的汇行代汇,汇汇~不需要使用特汇的汇汇汇。 ?无汇目汇段是否汇一致性代汇段~汇程都不能因汇call或jump而汇入一个特汇汇汇低;特汇汇汇大,的代汇段汇行。汇汇汇行汇汇的汇行汇汇汇将个异致一一般保汇常;#GP,。 ?段当描述符的S汇志;描述符汇型,汇0~汇描述符汇系汇描述符。汇理器可以汇汇以下汇型的系汇描述符, ;系汇段描述符, 1局部描述符表;LDT,段描述符。 2任汇汇段;状TSS,描述符。 ;汇描述符, 3汇用汇描述符。 4中汇断描述符。 5陷阱汇描述。 6任汇汇描述符。 ?汇型汇汇 当装把段汇汇子入段寄存器汇。特定的段寄存器只能容汇特定汇型的描述符。比如,——CS寄存器只能入代汇段的汇汇子。装 ——数不可汇的代汇段或者系汇段的汇汇子不能汇入据段寄存器;DS、ES、FS和GS,。 ——写数装只有可的据段的汇汇子才能入SS寄存器。 当装段汇汇子入LDTR或任汇寄存器汇。 ——LDTR只能入装LDT的汇汇子。 ——装任汇寄存器只能入TSS的段汇汇子。 ?任汇切汇 下列四汇方式中的任何一汇都汇会另个致汇理器汇移汇行到外一任汇,?当个前汇程、任汇或者例程汇行一JMP或者CALL指令到GDT中的一个TSS描述符。 ?当个前汇程、任汇或者例程汇行一JMP或者CALL指令到GDT或者前当LDT中的一任汇汇个描述符。 ?一中或者常个断异它向量~指向IDT中的一任汇汇个描述符。 ?当个前任汇汇行了一IRET~此汇EFLAGS寄存器中的NT汇志是置位的。? ? ? 汇于硬汇 与区内代汇汇系汇汇密的是主引汇汇汇的分表~核中partition汇构区完全汇汇了分表的字段。 Boot Sector 也就是硬汇的第一扇个区, 由 它MBR (MasterBoot Record),DPT (Disk Partition Table) 和 Boot Record ID 三部分汇成. MBR 又作称主引汇汇汇占用 Boot Sector 的前 446 字汇个( 0 to 0x1BD ),存放系汇主引汇程序 (汇汇它从区装并运活汇分中汇汇汇行系汇引汇程序). DPT 即区主分表占用 64 字汇 个(0x1BE to 0x1FD),汇汇了磁汇的基本分信息区.主分区表分汇四个区分汇, 每汇 16 字汇,分汇汇汇了每主个区分的信息(因此最多可以有四主个区分). Boot Record ID 引汇汇汇即区两个占用字汇 (0x1FE and0x1FF), 汇于合法引汇区,等于它 0xAA55, 汇是判汇引汇是区否合法的汇志. 分表由区个区构四分汇汇成, 每一汇的汇如下构: BYTE State : 分汇区状, 0 =未激活, 0x80 = 激活 (注意此汇) BYTE StartHead : 分区号起始磁汇 WORD StartSC : 分区区号起始扇和柱面,底字汇的低6位汇扇区号, 高2位汇柱面的第 号9,10 位, 高字汇汇柱面的号低 8 位 BYTE Type : 分汇型区, 如0x0B = FAT32, 0x83 = Linux 等,00 表示此汇未用,07 = NTFS BYTE EndHead : 分汇区号束磁汇 WORD EndSC :分汇区区号束扇和柱面, 定汇同前 DWORD Relative :在汇性汇址方式下的分相汇扇地址区区(汇于基本分汇汇汇地址区即)DWORD Sectors : 分大小 区(汇扇区数) 由此可汇~分表只是汇汇分的区区与区区起始汇束的扇、磁汇、柱面的汇~至于汇分被格式化汇哪汇文件系汇汇不汇心。因此上汇中的 引汇扇汇汇是不存在的~比如区minix文件系汇也有boot但是却是1k。也就是汇fdisk汇不汇分汇会区辟区数区所汇的引汇扇~都是据~所有空汇由mkfs汇的文件系汇初始化操作汇行分配。? 系汇汇汇程启几主要由一下步汇成(以硬汇汇汇启例): 1. 汇机 2. BIOS 加汇自汇 ( Power On Self Test -- POST )~存地址汇 内0ffff:00003. 将个区硬汇第一扇 (0汇0道1扇区, 也就是BootSector)汇入存地址 内0000:7c00 汇.4. 汇汇 (WORD) 0000:7dfe 是否等于 0xaa55,若不等于~汇汇去汇汇其他启汇介汇,如果有其没他启汇介汇汇汇示"No ROM BASIC" 然后死机. 5. 跳汇到 0000:7c00 汇汇行 MBR 中的程序. 6. MBR 首先将自己汇制到 0000:0600 汇,然后汇汇汇行. 7. 在主分表中区区搜索汇志汇活汇的分.如果汇汇有没区个区活汇分或有不止一活汇分, 汇汇停止.8. 将区个区内活汇分的第一扇汇入存地址 0000:7c00 汇. 9. 汇汇 (WORD) 0000:7dfe 是否等于 0xaa55,若不等于汇汇示 "Missing Operating System" 然 后停止,或汇汇汇汇汇启. 10. 跳汇到 0000:7c00汇汇汇汇行特定系汇的汇程序启. 11. 汇启系汇 ... PS:以上步汇中 2,3,4,5 步是由 BIOS 的引汇程序完成.6,7,8,9,10步由MBR 中的引汇程序完成.一般多系汇引汇程序 (如 SmartFDISK, BootStar, PQBoot等)都是汇将准主引汇汇汇替汇成自己的引汇程序, 在行运启启区系汇汇程序之前汇用汇汇汇要汇的分.而某些系汇自汇的多系汇引汇程序 (如 lilo, NT Loader等)汇可以自己的引汇程序将区个区放在系汇所汇分的第一扇中, 在 Linux中汇即 SuperBlock (其汇 SuperBlock 是扇两个区). Linux0.11中的minix1.0文件系汇中~引汇扇是引汇汇相于区当lilo或NT loader 1k然后是SuperBlock 1k ?硬汇汇位基本上是汇零的含汇.例如把磁汇移汇到0,寄存器的容内清零等. 硬汇重新校正就如重新汇量,重新汇定.例如磁汇移汇到20磁道,但汇据出汇数,于是汇着把磁汇移汇到0磁道,然后在重新移汇到20磁道. ? 汇于b_uptodate和b_dirt ;初始化汇都是0, b_uptodate是汇汇着数数据的有效性,如果汇汇程序在汇汇的汇候~汇生失汇~那汇据是无效的, 数据的流向是 buf <----- disk; b_dirt表示据是数与写数否被更改;汇~不磁汇上的一致,~如果汇了需要汇~据的流向是buf ------> disk; ? 增加一个系汇汇用的方法: 1. 在 linux/include/Unistd.h 中增加一句 #define __NR_myfunc 722. 到 找linux/include/linux/Sys.h增加 extern int sys_myfunc(); 在 sys_call_table 中增加 sys_myfunc (注:在汇的最后加数,不要汇汇序搞) 3. 在 linux/kernel/Sys.c 中int sys_myfunc() { printk ("this is my func!!\n "); return 1; } 4. 在 system_call.s 中第 61 行nr_system_calls = 72 改汇 nr_system_calls = 73OK 汇在成你个功的增加了一系汇汇用,所要做的就是把你内核重新汇汇一下cd linux make clean make 好了,新的内核生成了,用新的内启核汇就可以了 汇要把新image入汇汇汇~但是写启make disk 似乎不管用~用dd bs=1024 if=Image of=/dev/fd0 就可以~奇怪, 看了makefile汇汇 disk: Image dd bs=8192 if=Image of=/dev/PS0 原的不汇~源代汇默汇汇汇是来写1.2M的, 下面是汇汇程序,就是用汇一下自己的来你系汇汇用,按下面的步汇1. 注意,汇在要用改汇的 你你Unistd.h ,汇了避免汇汇汇 include 路径的麻汇,就把用下面的方式好 了,把汇文件 个copy 汇去,直接汇汇就行~~~~~ // 文件 test.c int errno; #define __NR_myfunc71 #define _syscall0(type,name) \type name(void) \ { \ long __res; \ __asm__ volatile ("int $0x80" \: "=a" (__res) \ : "0" (__NR_##name)); \ if (__res >= 0) \ return (type) __res; \ errno = -__res; \ return -1; \ } // OK ,now define our function _syscall0(int,myfunc) // 汇里后面汇汇是有分的没号,定汇好了我汇自己的函数 main() { myfunc(); } 在redhat 7.2下汇汇通汇了,可是不知道汇什汇版主的那汇 个gcc 的 linux 0.11 中的 gcc 1.4 老是汇汇要出汇 汇一汇方式好了,直接用汇汇,下面的test2.c int main(int argc, char *argv[]) { __asm__ ("mov $72, %%ax\n" "int $0x80 \n" :: ); return 0; } linux 0.11 中用 gcc 1.4 汇汇通汇了~~~gcc test2.c 汇汇生成了一 个a.out 文件用汇才我汇的新核内启汇系汇,然后行运./a.out 程序正汇示了 确this is my func!!汇果正常,表明正的确个增加了一系汇汇用~~~~? 汇于execve()函的相汇汇明。数 ?汇于用汇id uid suid等等的解汇 ?利用redhat linux汇汇文件来内系汇映像文件的容 ?由as86/ld86生成的文件具有minix a.out汇行汇汇 构linux使用的a.out与之相似 由于as86/ld86于minix文件系汇的密切汇系所以汇汇汇接的汇果符合minux汇行汇格式而由gas/gld生成的文件具有gnu a.out汇行汇汇 构gas/gld就是gnu工具当然汇足gnu a.out汇行汇汇构 linux系汇使用自己定汇的魔数 0x107 oldmagic 目汇文件或不汇的可汇行文件;.o文件,~0x10b Zmagic 可汇行文件 oldmagic 文件的汇汇是构32字汇的后面汇跟code~date~bss Zmagic 文件的汇汇也是构32字汇但要空出1024字汇的汇度;填充0,~1024字汇后才是code~date~bss 内个会断数核加汇一可汇行文件汇~首先判魔是否是Zmagic 附汇,内构核常用汇汇表 ?中汇断描述符 ?linux0.11系汇汇汇号 ?文件系汇和超汇汇 ?i_mode字段 ?i汇点 ?字符汇汇汇汇程汇写 ?linux0.11汇汇汇笔 断点;lb, 1~0x7c00 跳汇到bootsect汇始汇行 bootsect文件是汇汇汇汇接的~因此其中的汇汇汇是相汇于地址独号当0x0的偏移;head.s也是汇汇,。所以程序被bios拷汇到0x7c00的一汇始cs寄存器是0~eip是0x7c00程序汇始汇行~汇之前的指令都是地址无汇指令~而且不涉及汇。直到“号jmpi go INITSEG”后cs,0x9000~eip, 0x18~汇汇汇知~go汇汇号句的地址汇就是0x18~汇汇~汇汇汇接后的汇只是一偏移汇;相汇于地址号个 0,~由于cd已汇汇置~所以汇可以正常使用了。号 在汇汇性的linux0.00中把boot和head都拷汇到0x0汇~如果不作修改head无法行~必汇把运head中的汇相汇操作号,512各字汇;boot的大小,~因汇汇当号会句涉及到汇汇按照汇接汇地址汇汇找。 汇汇汇知call~jnc~jc~je等都是地址无汇指令。{目汇地址,pc前汇当,;PC前汇当号,汇汇,}2~0x90200 跳汇到setup汇始汇行 3~0x9029d setup中 lidt idt_48 可汇察idt的汇汇化;其汇汇化~因汇段基汇和没限汇都汇汇0,4~0x902a2 setup中 lgdt gdt_48 可汇察gdt的汇汇化 5, 汇入32位保汇模式前 0x902fe mov ax #0x01 Lmsw ax jmpi 0,8 汇察cs汇汇汇汇汇符汇 8 ip,0 此汇pc汇汇0x0~汇入head.s6~(vb) 0x08,0x0d lss _start_stack %esp , 汇汇汇知 lss ds:0x182a4 7~;vb, 0x08: 0x19 call setup_gdt 可汇察段限汇的汇化 8~;vb, 0x08: 54a7 ret head.s中“返回”到main 9~ main在 0x08: 664c(664c之前的.h包含文件占据了一定空汇~所以汇汇汇汇汇jdt表尾地址并不是664b) main函汇数会始有push ebp~mov ebp~esp ~push edi等操作
/
本文档为【我的内核阅读笔记(加深版)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索