⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 86.html

📁 linux 0.11中文版 有注释
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<a name='L114'><i><font color='green'>*/</font></i>
<a name='L115'><i><font color='green'>/*</font></i>
<a name='L116'><i><font color='green'>* 下面是我们存放第一个给定大小存储桶描述符指针的地方。</font></i>
<a name='L117'><i><font color='green'>*</font></i>
<a name='L118'><i><font color='green'>* 如果Linux 内核分配了许多指定大小的对象,那么我们就希望将该指定的大小加到</font></i>
<a name='L119'><i><font color='green'>* 该列表(链表)中,因为这样可以使内存的分配更有效。但是,因为一页完整内存页面</font></i>
<a name='L120'><i><font color='green'>* 必须用于列表中指定大小的所有对象,所以需要做总数方面的测试操作。</font></i>
<a name='L121'><i><font color='green'></font></i>
<a name='L122'><i><font color='green'>*/</font></i>
<a name='L123'><i><font color='green'>// 存储桶目录列表(数组)。</font></i>
<a name='L124'><b>struct</b> _bucket_dir bucket_dir[] = <font color='red'>{</font>
<a name='L125'>  <font color='red'>{</font>16, (<b>struct</b> bucket_desc *) 0<font color='red'>}</font>,       <i><font color='green'>// 16 字节长度的内存块。</font></i>
<a name='L126'>  <font color='red'>{</font>32, (<b>struct</b> bucket_desc *) 0<font color='red'>}</font>,       <i><font color='green'>// 32 字节长度的内存块。</font></i>
<a name='L127'>  <font color='red'>{</font>64, (<b>struct</b> bucket_desc *) 0<font color='red'>}</font>,       <i><font color='green'>// 64 字节长度的内存块。</font></i>
<a name='L128'>  <font color='red'>{</font>128, (<b>struct</b> bucket_desc *) 0<font color='red'>}</font>,      <i><font color='green'>// 128 字节长度的内存块。</font></i>
<a name='L129'>  <font color='red'>{</font>256, (<b>struct</b> bucket_desc *) 0<font color='red'>}</font>,      <i><font color='green'>// 256 字节长度的内存块。</font></i>
<a name='L130'>  <font color='red'>{</font>512, (<b>struct</b> bucket_desc *) 0<font color='red'>}</font>,      <i><font color='green'>// 512 字节长度的内存块。</font></i>
<a name='L131'>  <font color='red'>{</font>1024, (<b>struct</b> bucket_desc *) 0<font color='red'>}</font>,     <i><font color='green'>// 1024 字节长度的内存块。</font></i>
<a name='L132'>  <font color='red'>{</font>2048, (<b>struct</b> bucket_desc *) 0<font color='red'>}</font>,     <i><font color='green'>// 2048 字节长度的内存块。</font></i>
<a name='L133'>  <font color='red'>{</font>4096, (<b>struct</b> bucket_desc *) 0<font color='red'>}</font>,     <i><font color='green'>// 4096 字节(1 页)内存。</font></i>
<a name='L134'>  <font color='red'>{</font>0, (<b>struct</b> bucket_desc *) 0<font color='red'>}</font>
<a name='L135'><font color='red'>}</font>;                              <i><font color='green'>/* End of list marker */</font></i>
<a name='L136'>
<a name='L137'><i><font color='green'>/*</font></i>
<a name='L138'><i><font color='green'>* This contains a linked list of free bucket descriptor blocks</font></i>
<a name='L139'><i><font color='green'>*/</font></i>
<a name='L140'><i><font color='green'>/*</font></i>
<a name='L141'><i><font color='green'>* 下面是含有空闲桶描述符内存块的链表。</font></i>
<a name='L142'><i><font color='green'>*/</font></i>
<a name='L143'><b>struct</b> bucket_desc *free_bucket_desc = (<b>struct</b> bucket_desc *) 0;
<a name='L144'>
<a name='L145'><i><font color='green'>/*</font></i>
<a name='L146'><i><font color='green'>* This routine initializes a bucket description page.</font></i>
<a name='L147'><i><font color='green'>*/</font></i>
<a name='L148'><i><font color='green'>/*</font></i>
<a name='L149'><i><font color='green'>* 下面的子程序用于初始化一页桶描述符页面。</font></i>
<a name='L150'><i><font color='green'>*/</font></i>
<a name='L151'><i><font color='green'>//// 初始化桶描述符。</font></i>
<a name='L152'><i><font color='green'>// 建立空闲桶描述符链表,并让free_bucket_desc 指向第一个空闲桶描述符。</font></i>
<a name='L153'><b>static</b> <b>inline</b> <b>void</b>
<a name='L154'><a href='../S/86.html#L240' title='Refered from 240 in lib/malloc.c.'>init_bucket_desc</a> ()
<a name='L155'><font color='red'>{</font>
<a name='L156'>  <b>struct</b> bucket_desc *bdesc, *first;
<a name='L157'>  <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L158'>
<a name='L159'><i><font color='green'>// 申请一页内存,用于存放桶描述符。如果失败,则显示初始化桶描述符时内存不够出错信息,死机。</font></i>
<a name='L160'>  first = bdesc = (<b>struct</b> bucket_desc *) <a href='../S/94.html#L101' title='Defined at 101 in mm/memory.c.'>get_free_page</a> ();
<a name='L161'>  <b>if</b> (!bdesc)
<a name='L162'>    <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("Out of memory in init_bucket_desc()");
<a name='L163'><i><font color='green'>// 首先计算一页内存中可存放的桶描述符数量,然后对其建立单向连接指针。</font></i>
<a name='L164'>  <b>for</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = <a href='../D/324.html' title='Multiple defined in 4 places.'>PAGE_SIZE</a> / <b>sizeof</b> (<b>struct</b> bucket_desc); <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> &gt; 1; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>--)
<a name='L165'>    <font color='red'>{</font>
<a name='L166'>      bdesc-&gt;next = bdesc + 1;
<a name='L167'>      bdesc++;
<a name='L168'>    <font color='red'>}</font>
<a name='L169'><i><font color='green'>/*</font></i>
<a name='L170'><i><font color='green'>* This is done last, to avoid race conditions in case</font></i>
<a name='L171'><i><font color='green'>* get_free_page() sleeps and this routine gets called again....</font></i>
<a name='L172'><i><font color='green'>*/</font></i>
<a name='L173'><i><font color='green'>/*</font></i>
<a name='L174'><i><font color='green'>* 这是在最后处理的,目的是为了避免在get_free_page()睡眠时该子程序又被</font></i>
<a name='L175'><i><font color='green'>* 调用而引起的竞争条件。</font></i>
<a name='L176'><i><font color='green'>*/</font></i>
<a name='L177'><i><font color='green'>// 将空闲桶描述符指针free_bucket_desc 加入链表中。</font></i>
<a name='L178'>
<a name='L179'>  bdesc-&gt;next = free_bucket_desc;
<a name='L180'>  free_bucket_desc = first;
<a name='L181'><font color='red'>}</font>
<a name='L182'>
<a name='L183'><i><font color='green'>//// 分配动态内存函数。</font></i>
<a name='L184'><i><font color='green'>// 参数:len - 请求的内存块长度。</font></i>
<a name='L185'><i><font color='green'>// 返回:指向被分配内存的指针。如果失败则返回NULL。</font></i>
<a name='L186'><b>void</b> *
<a name='L187'><a href='../S/34.html#L18' title='Refered from 18 in include/linux/kernel.h.'>malloc</a> (<b>unsigned</b> <b>int</b> len)
<a name='L188'><font color='red'>{</font>
<a name='L189'>  <b>struct</b> _bucket_dir *bdir;
<a name='L190'>  <b>struct</b> bucket_desc *bdesc;
<a name='L191'>  <b>void</b> *retval;
<a name='L192'>
<a name='L193'><i><font color='green'>/*</font></i>
<a name='L194'><i><font color='green'>* First we search the bucket_dir to find the right bucket change</font></i>
<a name='L195'><i><font color='green'>* for this request.</font></i>
<a name='L196'><i><font color='green'>*/</font></i>
<a name='L197'><i><font color='green'>/*</font></i>
<a name='L198'><i><font color='green'>* 首先我们搜索存储桶目录bucket_dir 来寻找适合请求的桶大小。</font></i>
<a name='L199'><i><font color='green'>*/</font></i>
<a name='L200'><i><font color='green'>// 搜索存储桶目录,寻找适合申请内存块大小的桶描述符链表。如果目录项的桶字节数大于请求的字节</font></i>
<a name='L201'><i><font color='green'>// 数,就找到了对应的桶目录项。</font></i>
<a name='L202'>  <b>for</b> (bdir = bucket_dir; bdir-&gt;size; bdir++)
<a name='L203'>    <b>if</b> (bdir-&gt;size &gt;= len)
<a name='L204'>      <b>break</b>;
<a name='L205'><i><font color='green'>// 如果搜索完整个目录都没有找到合适大小的目录项,则表明所请求的内存块大小太大,超出了该</font></i>
<a name='L206'><i><font color='green'>// 程序的分配限制(最长为1 个页面)。于是显示出错信息,死机。</font></i>
<a name='L207'>  <b>if</b> (!bdir-&gt;size)
<a name='L208'>    <font color='red'>{</font>
<a name='L209'>      <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a> ("malloc called with impossibly large argument (%d)\n", len);
<a name='L210'>      <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("malloc: bad arg");
<a name='L211'>    <font color='red'>}</font>
<a name='L212'><i><font color='green'>/*</font></i>
<a name='L213'><i><font color='green'>* Now we search for a bucket descriptor which has free space</font></i>
<a name='L214'><i><font color='green'>*/</font></i>
<a name='L215'><i><font color='green'>/*</font></i>
<a name='L216'><i><font color='green'>* 现在我们来搜索具有空闲空间的桶描述符。</font></i>
<a name='L217'><i><font color='green'>*/</font></i>
<a name='L218'>  <a href='../S/25.html#L15' title='Defined at 15 in include/asm/system.h.'>cli</a> ();                       <i><font color='green'>/* Avoid race conditions */</font></i><i><font color='green'>/* 为了避免出现竞争条件,首先关中断 */</font></i>
<a name='L219'><i><font color='green'>// 搜索对应桶目录项中描述符链表,查找具有空闲空间的桶描述符。如果桶描述符的空闲内存指针</font></i>
<a name='L220'><i><font color='green'>// freeptr 不为空,则表示找到了相应的桶描述符。</font></i>
<a name='L221'>  <b>for</b> (bdesc = bdir-&gt;chain; bdesc; bdesc = bdesc-&gt;next)
<a name='L222'>    <b>if</b> (bdesc-&gt;freeptr)
<a name='L223'>      <b>break</b>;
<a name='L224'><i><font color='green'>/*</font></i>
<a name='L225'><i><font color='green'>* If we didn't find a bucket with free space, then we'll</font></i>
<a name='L226'><i><font color='green'>* allocate a new one.</font></i>
<a name='L227'><i><font color='green'>*/</font></i>
<a name='L228'><i><font color='green'>/*</font></i>
<a name='L229'><i><font color='green'>* 如果没有找到具有空闲空间的桶描述符,那么我们就要新建立一个该目录项的描述符。</font></i>
<a name='L230'><i><font color='green'>*/</font></i>
<a name='L231'>  <b>if</b> (!bdesc)
<a name='L232'>    <font color='red'>{</font>
<a name='L233'>      <b>char</b> *cp;
<a name='L234'>
<a name='L235'>      <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L236'>
<a name='L237'><i><font color='green'>// 若free_bucket_desc 还为空时,表示第一次调用该程序,则对描述符链表进行初始化。</font></i>
<a name='L238'><i><font color='green'>// free_bucket_desc 指向第一个空闲桶描述符。</font></i>
<a name='L239'>      <b>if</b> (!free_bucket_desc)
<a name='L240'>        <a href='../S/86.html#L154' title='Defined at 154 in lib/malloc.c.'>init_bucket_desc</a> ();
<a name='L241'><i><font color='green'>// 取free_bucket_desc 指向的空闲桶描述符,并让free_bucket_desc 指向下一个空闲桶描述符。</font></i>
<a name='L242'>      bdesc = free_bucket_desc;
<a name='L243'>      free_bucket_desc = bdesc-&gt;next;
<a name='L244'><i><font color='green'>// 初始化该新的桶描述符。令其引用数量等于0;桶的大小等于对应桶目录的大小;申请一内存页面,</font></i>
<a name='L245'><i><font color='green'>// 让描述符的页面指针page 指向该页面;空闲内存指针也指向该页开头,因为此时全为空闲。</font></i>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -