<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://wiki.foofun.cn//index.php?action=history&amp;feed=atom&amp;title=Bran%27s_Kernel_Development_Tutorial_Known_Bugs</id>
	<title>Bran's Kernel Development Tutorial Known Bugs - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.foofun.cn//index.php?action=history&amp;feed=atom&amp;title=Bran%27s_Kernel_Development_Tutorial_Known_Bugs"/>
	<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=Bran%27s_Kernel_Development_Tutorial_Known_Bugs&amp;action=history"/>
	<updated>2026-04-04T20:25:29Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>http://wiki.foofun.cn//index.php?title=Bran%27s_Kernel_Development_Tutorial_Known_Bugs&amp;diff=831&amp;oldid=prev</id>
		<title>Zhang3：创建页面，内容为“从好几个地方-包括这个Wiki-都指向 [http://osdever.net/bkerndev/Docs/basickernel.htm Bran的内核开发教程] 作为起点。 但该教程存在一些问题，通常会让人们出现在论坛上，再次提出相同的问题。 这篇文章旨在先发制人地回答这些问题，就像是“Bran的常见问题”，希望对你有用。  注意: 包含Bran教程的网站osdever.net最近关闭了很长时间。 你可以在网上这里找到它…”</title>
		<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=Bran%27s_Kernel_Development_Tutorial_Known_Bugs&amp;diff=831&amp;oldid=prev"/>
		<updated>2022-03-12T05:51:50Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“从好几个地方-包括这个Wiki-都指向 [http://osdever.net/bkerndev/Docs/basickernel.htm Bran的内核开发教程] 作为起点。 但该教程存在一些问题，通常会让人们出现在论坛上，再次提出相同的问题。 这篇文章旨在先发制人地回答这些问题，就像是“Bran的常见问题”，希望对你有用。  注意: 包含Bran教程的网站osdever.net最近关闭了很长时间。 你可以在网上这里找到它…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;从好几个地方-包括这个Wiki-都指向 [http://osdever.net/bkerndev/Docs/basickernel.htm Bran的内核开发教程] 作为起点。 但该教程存在一些问题，通常会让人们出现在论坛上，再次提出相同的问题。 这篇文章旨在先发制人地回答这些问题，就像是“Bran的常见问题”，希望对你有用。&lt;br /&gt;
&lt;br /&gt;
注意: 包含Bran教程的网站osdever.net最近关闭了很长时间。 你可以在网上这里找到它的[http://web.archive.org/web/20190306175430/http://osdever.net/bkerndev/Docs/basickernel.htm 互联网档案]。&lt;br /&gt;
&lt;br /&gt;
===我一添加字符串，事情就出错了。===&lt;br /&gt;
&lt;br /&gt;
Bran教程中的链接器脚本不会将 &amp;lt;tt&amp;gt;rodata&amp;lt;/tt&amp;gt; 节（Section）添加到二进制文件中，这是编译器放置静态字符串的地方。 用这个代替：&lt;br /&gt;
&lt;br /&gt;
 OUTPUT_FORMAT(&amp;quot;binary&amp;quot;)&lt;br /&gt;
 ENTRY(start)&lt;br /&gt;
 phys = 0x00100000;&lt;br /&gt;
 SECTIONS&lt;br /&gt;
 {&lt;br /&gt;
   .text phys : AT(phys) {&lt;br /&gt;
     code = .;&lt;br /&gt;
     *(.text)&lt;br /&gt;
     '''*(.rodata*)'''&lt;br /&gt;
     . = ALIGN(4096);&lt;br /&gt;
   }&lt;br /&gt;
   .data : AT(phys + (data - code))&lt;br /&gt;
   {&lt;br /&gt;
     data = .;&lt;br /&gt;
     *(.data)&lt;br /&gt;
     . = ALIGN(4096);&lt;br /&gt;
   }&lt;br /&gt;
   .bss : AT(phys + (bss - code))&lt;br /&gt;
   {&lt;br /&gt;
     bss = .;&lt;br /&gt;
     *(.bss)&lt;br /&gt;
     . = ALIGN(4096);&lt;br /&gt;
   }&lt;br /&gt;
   end = .;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
如果仍然有问题，您可能需要在build.bat中更改NASM命令的输出格式，以生成[[ELF]]文件，而不是[[a.out]]。&lt;br /&gt;
&lt;br /&gt;
=== timer_wait永远不会返回 ===&lt;br /&gt;
由于&amp;lt;code&amp;gt;timer_ticks&amp;lt;/code&amp;gt;变量未定义为volatile，因此所提供的等待计时器tick的方法永远不会返回。 将其定义更改为&amp;lt;code&amp;gt;volatile unsigned int timer_ticks = 0;&amp;lt;/code&amp;gt;将使&amp;lt;code&amp;gt;timer_wait()&amp;lt;/code&amp;gt;函数工作。&lt;br /&gt;
&lt;br /&gt;
此外，处理器可以进入睡眠状态，而不是忙于等待（busy waiting），以节省电量。 可以这样做：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void timer_wait(int ticks)&lt;br /&gt;
{&lt;br /&gt;
    unsigned int eticks;&lt;br /&gt;
&lt;br /&gt;
    eticks = timer_ticks + ticks;&lt;br /&gt;
    while(timer_ticks &amp;lt; eticks) &lt;br /&gt;
    {&lt;br /&gt;
        __asm__ __volatile__ (&amp;quot;sti//hlt//cli&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===未正确设置PIT===&lt;br /&gt;
该教程说，提供的PIT设置代码片段是 “可选的”，而实际上不是。 别像我一样被这个BUG绊倒。&lt;br /&gt;
&lt;br /&gt;
===不使用交叉编译器===&lt;br /&gt;
Bran的内核教程在windows上使用DJGPP和NASM (标准安装)。&amp;lt;br /&amp;gt;&lt;br /&gt;
要允许代码在交叉编译器上链接，必须首先从全局和外部ASM标签中删除所有前导下划线。&lt;br /&gt;
&lt;br /&gt;
===除零中断不会触发===&lt;br /&gt;
在实现IDT和ISRs之后，本教程解释了除以零将引发异常 “divide by zero”，从而执行故障处理程序。 本教程提供了以下C代码：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int i = 10 / 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
此异常的故障处理程序，并不会引发任何事情。 编译器通常会优化并插入一些额外的代码 (因此实际上没有除以零)。 保证引发此异常的唯一方法是编写一些内联程序集，如下所示：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
__asm__  (&amp;quot;div %0&amp;quot; :: &amp;quot;r&amp;quot;(0));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 编译器错误: unknown type name ‘size_t' ===&lt;br /&gt;
GCC生成以下错误：''unknown type name 'X'''。 教程源代码不包括“size_t”或“uint32_t”等类型的任何标准定义。 在每个源文件中包括以下头:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdbool.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stddef.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===参考资料===&lt;br /&gt;
* http://forum.osdev.org/viewtopic.php?f=8&amp;amp;t=18302&lt;br /&gt;
&lt;br /&gt;
[[Category:OS Development]]&lt;br /&gt;
[[Category:Troubleshooting]]&lt;br /&gt;
[[Category:FAQ]]&lt;/div&gt;</summary>
		<author><name>Zhang3</name></author>
	</entry>
</feed>