📄 ramdisk.c
字号:
<a name=L54 href="source/kernel/blk_drv/ramdisk.c#L54">54</a> int i; <a name=L55 href="source/kernel/blk_drv/ramdisk.c#L55">55</a> char *cp; <a name=L56 href="source/kernel/blk_drv/ramdisk.c#L56">56</a> <a name=L57 href="source/kernel/blk_drv/ramdisk.c#L57">57</a> <a href="ident?i=blk_dev">blk_dev</a>[<a href="ident?i=MAJOR_NR">MAJOR_NR</a>].request_fn = <a href="ident?i=DEVICE_REQUEST">DEVICE_REQUEST</a>; <a name=L58 href="source/kernel/blk_drv/ramdisk.c#L58">58</a> <a href="ident?i=rd_start">rd_start</a> = (char *) mem_start; <a name=L59 href="source/kernel/blk_drv/ramdisk.c#L59">59</a> <a href="ident?i=rd_length">rd_length</a> = length; <a name=L60 href="source/kernel/blk_drv/ramdisk.c#L60">60</a> cp = <a href="ident?i=rd_start">rd_start</a>; <a name=L61 href="source/kernel/blk_drv/ramdisk.c#L61">61</a> for (i=0; i < length; i++) <a name=L62 href="source/kernel/blk_drv/ramdisk.c#L62">62</a> *cp++ = <i>'\0'</i>; <a name=L63 href="source/kernel/blk_drv/ramdisk.c#L63">63</a> return(length); <a name=L64 href="source/kernel/blk_drv/ramdisk.c#L64">64</a> } <a name=L65 href="source/kernel/blk_drv/ramdisk.c#L65">65</a> <a name=L66 href="source/kernel/blk_drv/ramdisk.c#L66">66</a> <b><i>/*</i></b> <a name=L67 href="source/kernel/blk_drv/ramdisk.c#L67">67</a> <b><i> * If the root device is the ram disk, try to load it.</i></b> <a name=L68 href="source/kernel/blk_drv/ramdisk.c#L68">68</a> <b><i> * In order to do this, the root device is originally set to the</i></b> <a name=L69 href="source/kernel/blk_drv/ramdisk.c#L69">69</a> <b><i> * floppy, and we later change it to be ram disk.</i></b> <a name=L70 href="source/kernel/blk_drv/ramdisk.c#L70">70</a> <b><i> */</i></b> <a name=L71 href="source/kernel/blk_drv/ramdisk.c#L71">71</a> void <a href="ident?i=rd_load">rd_load</a>(void) <a name=L72 href="source/kernel/blk_drv/ramdisk.c#L72">72</a> { <a name=L73 href="source/kernel/blk_drv/ramdisk.c#L73">73</a> struct <a href="ident?i=buffer_head">buffer_head</a> *bh; <a name=L74 href="source/kernel/blk_drv/ramdisk.c#L74">74</a> struct <a href="ident?i=super_block">super_block</a> s; <a name=L75 href="source/kernel/blk_drv/ramdisk.c#L75">75</a> int block = 256; <b><i>/* Start at block 256 */</i></b> <a name=L76 href="source/kernel/blk_drv/ramdisk.c#L76">76</a> int i = 1; <a name=L77 href="source/kernel/blk_drv/ramdisk.c#L77">77</a> int nblocks; <a name=L78 href="source/kernel/blk_drv/ramdisk.c#L78">78</a> char *cp; <b><i>/* Move pointer */</i></b> <a name=L79 href="source/kernel/blk_drv/ramdisk.c#L79">79</a> <a name=L80 href="source/kernel/blk_drv/ramdisk.c#L80">80</a> if (!<a href="ident?i=rd_length">rd_length</a>) <a name=L81 href="source/kernel/blk_drv/ramdisk.c#L81">81</a> return; <a name=L82 href="source/kernel/blk_drv/ramdisk.c#L82">82</a> <a href="ident?i=printk">printk</a>(<i>"Ram disk: %d bytes, starting at 0x%x\n"</i>, <a href="ident?i=rd_length">rd_length</a>, <a name=L83 href="source/kernel/blk_drv/ramdisk.c#L83">83</a> (int) <a href="ident?i=rd_start">rd_start</a>); <a name=L84 href="source/kernel/blk_drv/ramdisk.c#L84">84</a> if (<a href="ident?i=MAJOR">MAJOR</a>(<a href="ident?i=ROOT_DEV">ROOT_DEV</a>) != 2) <a name=L85 href="source/kernel/blk_drv/ramdisk.c#L85">85</a> return; <a name=L86 href="source/kernel/blk_drv/ramdisk.c#L86">86</a> bh = <a href="ident?i=breada">breada</a>(<a href="ident?i=ROOT_DEV">ROOT_DEV</a>,block+1,block,block+2,-1); <a name=L87 href="source/kernel/blk_drv/ramdisk.c#L87">87</a> if (!bh) { <a name=L88 href="source/kernel/blk_drv/ramdisk.c#L88">88</a> <a href="ident?i=printk">printk</a>(<i>"Disk error while looking for ramdisk!\n"</i>); <a name=L89 href="source/kernel/blk_drv/ramdisk.c#L89">89</a> return; <a name=L90 href="source/kernel/blk_drv/ramdisk.c#L90">90</a> } <a name=L91 href="source/kernel/blk_drv/ramdisk.c#L91">91</a> *((struct <a href="ident?i=d_super_block">d_super_block</a> *) &s) = *((struct <a href="ident?i=d_super_block">d_super_block</a> *) bh->b_data); <a name=L92 href="source/kernel/blk_drv/ramdisk.c#L92">92</a> <a href="ident?i=brelse">brelse</a>(bh); <a name=L93 href="source/kernel/blk_drv/ramdisk.c#L93">93</a> if (s.s_magic != <a href="ident?i=SUPER_MAGIC">SUPER_MAGIC</a>) <a name=L94 href="source/kernel/blk_drv/ramdisk.c#L94">94</a> <b><i>/* No ram disk image present, assume normal floppy boot */</i></b> <a name=L95 href="source/kernel/blk_drv/ramdisk.c#L95">95</a> return; <a name=L96 href="source/kernel/blk_drv/ramdisk.c#L96">96</a> nblocks = s.s_nzones << s.s_log_zone_size; <a name=L97 href="source/kernel/blk_drv/ramdisk.c#L97">97</a> if (nblocks > (<a href="ident?i=rd_length">rd_length</a> >> <a href="ident?i=BLOCK_SIZE_BITS">BLOCK_SIZE_BITS</a>)) { <a name=L98 href="source/kernel/blk_drv/ramdisk.c#L98">98</a> <a href="ident?i=printk">printk</a>(<i>"Ram disk image too big! (%d blocks, %d avail)\n"</i>, <a name=L99 href="source/kernel/blk_drv/ramdisk.c#L99">99</a> nblocks, <a href="ident?i=rd_length">rd_length</a> >> <a href="ident?i=BLOCK_SIZE_BITS">BLOCK_SIZE_BITS</a>);<a name=L100 href="source/kernel/blk_drv/ramdisk.c#L100">100</a> return;<a name=L101 href="source/kernel/blk_drv/ramdisk.c#L101">101</a> }<a name=L102 href="source/kernel/blk_drv/ramdisk.c#L102">102</a> <a href="ident?i=printk">printk</a>(<i>"Loading %d bytes into ram disk... 0000k"</i>, <a name=L103 href="source/kernel/blk_drv/ramdisk.c#L103">103</a> nblocks << <a href="ident?i=BLOCK_SIZE_BITS">BLOCK_SIZE_BITS</a>);<a name=L104 href="source/kernel/blk_drv/ramdisk.c#L104">104</a> cp = <a href="ident?i=rd_start">rd_start</a>;<a name=L105 href="source/kernel/blk_drv/ramdisk.c#L105">105</a> while (nblocks) {<a name=L106 href="source/kernel/blk_drv/ramdisk.c#L106">106</a> if (nblocks > 2) <a name=L107 href="source/kernel/blk_drv/ramdisk.c#L107">107</a> bh = <a href="ident?i=breada">breada</a>(<a href="ident?i=ROOT_DEV">ROOT_DEV</a>, block, block+1, block+2, -1);<a name=L108 href="source/kernel/blk_drv/ramdisk.c#L108">108</a> else<a name=L109 href="source/kernel/blk_drv/ramdisk.c#L109">109</a> bh = <a href="ident?i=bread">bread</a>(<a href="ident?i=ROOT_DEV">ROOT_DEV</a>, block);<a name=L110 href="source/kernel/blk_drv/ramdisk.c#L110">110</a> if (!bh) {<a name=L111 href="source/kernel/blk_drv/ramdisk.c#L111">111</a> <a href="ident?i=printk">printk</a>(<i>"I/O error on block %d, aborting load\n"</i>, <a name=L112 href="source/kernel/blk_drv/ramdisk.c#L112">112</a> block);<a name=L113 href="source/kernel/blk_drv/ramdisk.c#L113">113</a> return;<a name=L114 href="source/kernel/blk_drv/ramdisk.c#L114">114</a> }<a name=L115 href="source/kernel/blk_drv/ramdisk.c#L115">115</a> (void) <a href="ident?i=memcpy">memcpy</a>(cp, bh->b_data, <a href="ident?i=BLOCK_SIZE">BLOCK_SIZE</a>);<a name=L116 href="source/kernel/blk_drv/ramdisk.c#L116">116</a> <a href="ident?i=brelse">brelse</a>(bh);<a name=L117 href="source/kernel/blk_drv/ramdisk.c#L117">117</a> <a href="ident?i=printk">printk</a>(<i>"\010\010\010\010\010%4dk"</i>,i);<a name=L118 href="source/kernel/blk_drv/ramdisk.c#L118">118</a> cp += <a href="ident?i=BLOCK_SIZE">BLOCK_SIZE</a>;<a name=L119 href="source/kernel/blk_drv/ramdisk.c#L119">119</a> block++;<a name=L120 href="source/kernel/blk_drv/ramdisk.c#L120">120</a> nblocks--;<a name=L121 href="source/kernel/blk_drv/ramdisk.c#L121">121</a> i++;<a name=L122 href="source/kernel/blk_drv/ramdisk.c#L122">122</a> }<a name=L123 href="source/kernel/blk_drv/ramdisk.c#L123">123</a> <a href="ident?i=printk">printk</a>(<i>"\010\010\010\010\010done \n"</i>);<a name=L124 href="source/kernel/blk_drv/ramdisk.c#L124">124</a> <a href="ident?i=ROOT_DEV">ROOT_DEV</a>=0x0101;<a name=L125 href="source/kernel/blk_drv/ramdisk.c#L125">125</a> }<a name=L126 href="source/kernel/blk_drv/ramdisk.c#L126">126</a> </pre><hr><div align=center> [<b><i>源代码浏览</i></b>] [<a href="diff/kernel/blk_drv/ramdisk.c">区别标定</a>] [<a href="ident">标识符搜索</a>] [<a href="search">文本搜索</a>] [<a href="find">文件搜索</a>] </div><hr>本网页由 <a href="http:blurb.html">LXR引擎</a> 自动生成.<br></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -