рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдВ: рднрд╛рдЧ 2



рд╣рдорд╛рд░реЗ рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ , рд╣рдордиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдХрд┐ рдЖрдк рдПрдХ рд╕рд░рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдмрд┐рдирд╛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдЦ рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рдореИрдВ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХреЛрдб рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдЗрд╕реЗ GDB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреАрдмрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рд╢реЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреАрд╕реАрдЖрдИ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдЫрдкреАред

! рдорд╣рддреНрд╡рдкреВрд░реНрдг! : рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рднреА 6 рдЪрд░рдгреЛрдВ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд╕рднреА рдЖрдЧреЗ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░реА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ)ред


рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдЦрдирд╛



рдореБрдЦреНрдп рд▓реЗрдЦ : GDB рдбреАрдмрдЧрд░ рдХрд╛ рдЕрдзрд┐рдХрддрдо рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдХрд░реНрдиреЗрд▓.рдмрд┐рди рдХреЛрдб рдХреЛ рдбреАрдмрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдХрд░реНрдиреЗрд▓.рдмрд┐рди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдбреАрдмрдЧрд░ рдЪрд▓рд╛рдПрдБ:

1. рдореЗрдХрдлрд╛рдЗрд▓ рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕рд┐рдВрдмрд▓ рдЬреЗрдирд░реЗрдЯ рдХрд░реЗ:
CFLAGS = -Wall -fno-builtin -nostdinc -nostdlib -ggdb3 


2. рдЕрд╕реЗрдВрдмрд▓реА рд╕реНрдЯреЗрдЬ рдкрд░ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ рдХрд░реНрдиреЗрд▓.рдмрд┐рдирд╛ рд╡рд░реНрдгреЛрдВ рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд▓рд┐рдЦреЗ (рдРрд╕реА рдлрд╛рдЗрд▓ рдХреЛ рд╕реНрдЯреНрд░рд┐рдк рдпреВрдЯрд┐рд▓рд┐рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ)ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрдХрд╛рдЗрд▓ рдореЗрдВ рдХрд░реНрдиреЗрд▓.рдмрд┐рди рд▓рдХреНрд╖реНрдп рдХреЛ рдареАрдХ рдХрд░реЗрдВ:
 kernel.bin: $(OBJFILES) $(LD) -T linker.ld -o $@ $^ cp $@ $@.dbg strip $@ 

рддреЛ:
kernel.bin - рдореЗрдВ рд╡рд░реНрдг рдирд╣реАрдВ рд╣реИрдВ - рдЗрд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
kernel.bin.dbg - рдореЗрдВ рд╡рд░реНрдг рдФрд░ рдХреЛрдб рджреЛрдиреЛрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ - рдЗрд╕реЗ рдбреАрдмрдЧрд░ рдХреЛ рдЦрд┐рд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

3. рдбрд┐рдмрдЧрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
 sudo apt-get install cgdb 


4. рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдВрдЧрдард┐рдд рдХрд░реЗрдВ:
 make clean make all sudo make image 


5. рдбрд┐рдмрдЧрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде qemu рдЪрд▓рд╛рдПрдБ:
 sudo qemu-system-i386 -s -S -hda hdd.img & 


6. рдбрд┐рдмрдЧрд░ рдХреЛ рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реБрдП рдЪрд▓рд╛рдПрдБ:
 cgdb kernel.bin.dbg 


7. рдбрд┐рдмрдЧрд░ рдореЗрдВ, qemu рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреЛ рд╕реАрдзреЗ рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ:
 (gdb) target remote localhost:1234 (gdb) break main 




8. рд╣рдо рдЗрд╕реЗ рдореБрдЦреНрдп рдФрд░ рдбреАрдмрдЧ рдХрд░рддреЗ рд╣реИрдВ:
 (gdb) c (gdb) n (gdb) n 




рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдбрд┐рдмрдЧрд┐рдВрдЧ рдЯреВрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ QEMU рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧреА, рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕реАрдзреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдбрд┐рдмрдЧрд░ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рд╕реЗ рд╕рдВрдХрд▓рди



рдореБрдЦреНрдп рд▓реЗрдЦ : рд▓рд┐рдирдХреНрд╕ рдкрд░ gcc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Visual Studio 2010 рд╢реЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ? рд▓реЗрдЦ рдореЗрдВ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рдж, рд╣рдо рд▓рд┐рдирдХреНрд╕ рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдП рдмрд┐рдирд╛ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред

1. ssh рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
 sudo apt-get install ssh 


2. рд╣рдо рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рд▓рд┐рдП рд╕рд╛рдЭрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ kern.bin рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрд░реЛрдд рд░рдЦрддреЗ рд╣реИрдВред

3. рдЙрдкрдХрд░рдг рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкрд▓рдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред

4. рд╣рдо рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреЗрдбрд╝ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

\ proj \ рдХрд░реНрдиреЗрд▓
\ proj \ loader.s
\ proj \ рдЖрдо \ printf.c
\ proj \ рдЖрдо \ screen.c
\ proj \ \ printf.h рд╢рд╛рдорд┐рд▓ рд╣реИрдВ
\ proj \ \ stdarg.h рд╢рд╛рдорд┐рд▓ рд╣реИрдВ
\ proj \ рд╢рд╛рдорд┐рд▓ \ рд╕реНрдХреНрд░реАрди
\ proj \ рд╢рд╛рдорд┐рд▓ \ type.h
\ proj \ makefile
\ proj \ linker.ld
\ proj \ tools \ plink.exe
\ proj \ рдХрд░реНрдиреЗрд▓ \ рдХрд░реНрдиреЗрд▓ред sln
\ proj \ рдХрд░реНрдиреЗрд▓ \ рдХрд░реНрдиреЗрд▓редрд╕реВ
\ proj \ рдХрд░реНрдиреЗрд▓ \ рдХрд░реНрдиреЗрд▓ .sdf
\ proj \ рдХрд░реНрдиреЗрд▓ \ vs \ k рдЧрд┐рд░реА редvcxproj
\ proj \ рдХрд░реНрдиреЗрд▓ \ vs \ k рдЧрд┐рд░реА редvcxproj.filters
\ proj \ рдХрд░реНрдиреЗрд▓ \ vs \ make_vs.props

5. рд╣рдо рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлрд╝рд╛рдЗрд▓ "\ proj \ k рдЧрд┐рд░реА" рдмрдирд╛рдо \ make_vs.props рдмрдирд╛рддреЗ рд╣реИрдВ:

 <?xml version="1.0" encoding="utf-8"?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup Label="RemoteBuildLocals"> <RblFolder>proj</RblFolder> <RblIncludePath>$(SolutionDir)\include\</RblIncludePath> <RblExecute>sudo make image; sudo qemu-system-i386 -hda hdd.img</RblExecute> </PropertyGroup> <PropertyGroup Label="RemoteBuildSettings"> <RbHost>192.168.1.8</RbHost> <RbUser>user</RbUser> <RbPassword>123456</RbPassword> <RbRoot> ~/Desktop/_habr</RbRoot> </PropertyGroup> <PropertyGroup Label="RemoteBuild"> <RbToolArgs> -pw $(RbPassword) $(RbUser)%40$(RbHost) cd $(RbRoot); cd $(RblFolder);</RbToolArgs> <RbToolExe>$(SolutionDir)tools\plink -batch $(RbToolArgs)</RbToolExe> <RbBuildCmd>$(RbToolExe) make all</RbBuildCmd> <RbRebuildAllCmd>$(RbToolExe) make rebuild</RbRebuildAllCmd> <RbCleanCmd>$(RbToolExe) make cleanall</RbCleanCmd> <RbExecuteCmd>$(RbToolArgs) $(RblExecute)</RbExecuteCmd> <RbIncludePath>$(RblIncludePath)</RbIncludePath> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <NMakeBuildCommandLine>$(RbBuildCmd)</NMakeBuildCommandLine> <NMakeReBuildCommandLine>$(RbRebuildAllCmd)</NMakeReBuildCommandLine> <NMakeCleanCommandLine>$(RbCleanCmd)</NMakeCleanCommandLine> <IncludePath>$(RbIncludePath)</IncludePath> <LocalDebuggerCommand>$(SolutionDir) tools\plink</LocalDebuggerCommand> <LocalDebuggerCommandArguments>$(RbExecuteCmd)</LocalDebuggerCommandArguments> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <NMakeBuildCommandLine>$(RbBuildCmd)</NMakeBuildCommandLine> <NMakeReBuildCommandLine>$(RbRebuildAllCmd)</NMakeReBuildCommandLine> <NMakeCleanCommandLine>$(RbCleanCmd)</NMakeCleanCommandLine> <IncludePath>$(RbIncludePath)</IncludePath> <LocalDebuggerCommand>$(SolutionDir)tools\plink</LocalDebuggerCommand> <LocalDebuggerCommandArguments>$(RbExecuteCmd)</LocalDebuggerCommandArguments> </PropertyGroup> </Project> 


6. рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлрд╝рд╛рдЗрд▓ "\ proj \ k рдЧрд┐рд░реА" рдмрдирд╛рдо \ рдХрд░реНрдиреЗрд▓ .vcxproj рдмрджрд▓реЗрдВ:
 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(SolutionDir)\vs\make_vs.props" /> <ImportGroup Label="ExtensionSettings"> 

7. рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:



8. рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:



рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЖрдЧреЗ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рд╢реЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдЬреАрд╕реАрд╕реА рд╕рдВрдХрд▓рдХред

рдкреАрд╕реАрдЖрдИрдШрдбрд╝реА рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рд╕реНрдХреИрди рдХрд░реЗрдВ



рдореБрдЦреНрдп рд▓реЗрдЦ : рдПрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛ рдкреАрд╕реАрдЖрдИ рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдХреИрд╕реЗ рдЦреЛрдЬреЗрдВ

рдЕрдм рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреАрд╕реАрдЖрдИ рдкреНрд░рдгрд╛рд▓реА рдмрд╕ рдХреЛ рдХреИрд╕реЗ рд╕реНрдХреИрди рдХрд░реЗрдВ? рд▓реЗрдЦ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рддреЗ рд╣реИрдВ (рдмреВрдЯ рдЫрд╡рд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреИрдпрд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрд╕ рдкреАрд╕реАрдЖрдИ рд╕реНрдХреИрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ):

1. рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ \ type.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
 typedef unsigned long u32; typedef unsigned short u16; typedef unsigned char u8; 


2. рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ \ io.h , рдЬреЛ рдХрд┐ рдмрд┐рдирд╛ рдмрджрд▓рд╛рд╡ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдмрд┐рдЯрд╡рд┐рд╕рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬрд┐рд╕рдореЗрдВ \ io.h рд╢рд╛рдорд┐рд▓ рд╣реИрдВ)ред

3. рд╢рд╛рдорд┐рд▓ \ pci.h рдлрд╝рд╛рдЗрд▓, рдЬрд┐рд╕рдореЗрдВ рдкреАрд╕реАрдЖрдИ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕рдХреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░рд┐рдпрд╛рдВ рд╣реИрдВ:
 #ifndef _PCI_H #define _PCI_H #include "types.h" #define PCI_CONFIG_PORT 0x0CF8 #define PCI_DATA_PORT 0x0CFC #define PCI_MAX_BUSES 255 #define PCI_MAX_DEVICES 32 #define PCI_MAX_FUNCTIONS 8 #define PCI_HEADERTYPE_NORMAL 0 #define PCI_HEADERTYPE_BRIDGE 1 #define PCI_HEADERTYPE_CARDBUS 2 #define PCI_HEADERTYPE_MULTIFUNC 0x80 typedef union { struct { u16 vendorID; u16 deviceID; u16 commandReg; u16 statusReg; u8 revisionID; u8 progIF; u8 subClassCode; u8 classCode; u8 cachelineSize; u8 latency; u8 headerType; u8 BIST; } __attribute__((packed)) option; u32 header[4]; } __attribute__((packed)) PCIDevHeader; void ReadConfig32(u32 bus, u32 dev, u32 func, u32 reg, u32 *data); char *GetPCIDevClassName(u32 class_code); void PCIScan(); #endif 


4. рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдореВрд▓ рдореЗрдВ pci.c рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ, рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде (рд╣рдордиреЗ рдореБрдЦреНрдп рд▓реЗрдЦ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рджрд┐рдпрд╛ рд╣реИ:

 #include "types.h" #include "printf.h" #include "io.h" #include "pci.h" typedef struct { u32 class_code; char name[32]; } PCIClassName; static PCIClassName g_PCIClassNames[] = { { 0x00, "before PCI 2.0"}, { 0x01, "disk controller"}, { 0x02, "network interface"}, { 0x03, "graphics adapter"}, { 0x04, "multimedia controller"}, { 0x05, "memory controller"}, { 0x06, "bridge device"}, { 0x07, "communication controller"}, { 0x08, "system device"}, { 0x09, "input device"}, { 0x0a, "docking station"}, { 0x0b, "CPU"}, { 0x0c, "serial bus"}, { 0x0d, "wireless controller"}, { 0x0e, "intelligent I/O controller"}, { 0x0f, "satellite controller"}, { 0x10, "encryption controller"}, { 0x11, "signal processing controller"}, { 0xFF, "proprietary device"} }; typedef union { struct { u32 zero : 2; u32 reg_num : 6; u32 func_num : 3; u32 dev_num : 5; u32 bus_num : 8; u32 reserved : 7; u32 enable_bit : 1; }; u32 val; } PCIConfigAddres; void ReadConfig32(u32 bus, u32 dev, u32 func, u32 reg, u32 *data) { PCIConfigAddres addr; addr.val = 0; addr.enable_bit = 1; addr.reg_num = reg; addr.func_num = func; addr.dev_num = dev; addr.bus_num = bus; out32(PCI_CONFIG_PORT, addr.val); in32(PCI_DATA_PORT, data); return; } char *GetPCIDevClassName(u32 class_code) { int i; for (i = 0; i < sizeof(g_PCIClassNames)/sizeof(g_PCIClassNames[0]); i++) { if (g_PCIClassNames[i].class_code == class_code) return g_PCIClassNames[i].name; } return NULL; } int ReadPCIDevHeader(u32 bus, u32 dev, u32 func, PCIDevHeader *p_pciDevice) { int i; if (p_pciDevice == 0) return 1; for (i = 0; i < sizeof(p_pciDevice->header)/sizeof(p_pciDevice->header[0]); i++) ReadConfig32(bus, dev, func, i, &p_pciDevice->header[i]); if (p_pciDevice->option.vendorID == 0x0000 || p_pciDevice->option.vendorID == 0xffff || p_pciDevice->option.deviceID == 0xffff) return 1; return 0; } void PrintPCIDevHeader(u32 bus, u32 dev, u32 func, PCIDevHeader *p_pciDevice) { char *class_name; printf("bus=0x%x dev=0x%x func=0x%x venID=0x%x devID=0x%x", bus, dev, func, p_pciDevice->option.vendorID, p_pciDevice->option.deviceID); class_name = GetPCIDevClassName(p_pciDevice->option.classCode); if (class_name) printf(" class_name=%s", class_name); printf("\n"); } void PCIScan(void) { int bus; int dev; for (bus = 0; bus < PCI_MAX_BUSES; bus++) for (dev = 0; dev < PCI_MAX_DEVICES; dev++) { u32 func = 0; PCIDevHeader pci_device; if (ReadPCIDevHeader(bus, dev, func, &pci_device)) continue; PrintPCIDevHeader(bus, dev, func, &pci_device); if (pci_device.option.headerType & PCI_HEADERTYPE_MULTIFUNC) { for (func = 1; func < PCI_MAX_FUNCTIONS; func++) { if (ReadPCIDevHeader(bus, dev, func, &pci_device)) continue; PrintPCIDevHeader(bus, dev, func, &pci_device); } } } } 


5. рдХрд░реНрдиреЗрд▓ рдореЗрдВ PCI рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рдЬреЛрдбрд╝реЗрдВ:

 #include "printf.h" #include "screen.h" #include "types.h" #include "pci.h" void main() { clear_screen(); printf("\n>>> Hello World!\n"); PCIScan(); } 


6. рдореЗрдХрдлрд╛рдЗрд▓ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВ:
 OBJFILES = \ loader.o \ common/printf.o \ common/screen.o \ pci.o \ kernel.o 


7. рдЕрдм рдЖрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 make rebuild sudo make image 


8. рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪрд▓рд╛рдПрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
 sudo qemu-system-i386 -hda hdd.img 




рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдкреАрд╕реАрдЖрдИ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓реАред рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдПрдХ рдпреВрдПрд╕рдмреА рдлреНрд▓реИрд╢ рдбреНрд░рд╛рдЗрд╡ рд╕реЗ рдмреВрдЯ рд╣реЛрдЧрд╛ред

рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рднреА рдЪрд░рдгреЛрдВ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рдм рдХреБрдЫ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбреАрдмрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдХреЗ рд▓рд┐рдВрдХ:
" рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдВ: рднрд╛рдЧ 3: рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ "
" рдХреИрд╕реЗ рдПрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП: рднрд╛рдЧ 4. рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ "
" рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдВ: рднрд╛рдЧ 5. рдУрдПрд╕ рд╕реЗ BIOS рддрдХ рдкрд╣реБрдВрдЪрдирд╛
" рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд┐рдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдВ: рднрд╛рдЧ 6. FAT рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдбрд┐рд╕реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди "

Source: https://habr.com/ru/post/In174157/


All Articles