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

📄 73.html

📁 linux 0.11中文版 有注释
💻 HTML
字号:
<html>
<head>
<title>kernel/printk.c</title>
<meta name='robots' content='noindex,nofollow'>
<meta name='generator' content='GLOBAL-5.4.1'>
</head>
<body text='#191970' bgcolor='#f5f5dc' vlink='gray'>
<a name='TOP'><h2><a href='../mains.html'>root</a>/<a href='../files/104.html'>kernel</a>/printk.c</h2>
<i><font color='green'>/* [&lt;][&gt;]<a href='#L30'>[^]</a>[v][top]<a href='#BOTTOM'>[bottom]</a><a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
<hr>
<h2>DEFINITIONS</h2>
This source file includes following definitions.
<ol>
<li><a href='#L30' title='Defined at 30.'>printk</a>
</ol>
<hr>
<pre>
<a name='L1'><i><font color='green'>/*</font></i>
<a name='L2'><i><font color='green'>* linux/kernel/printk.c</font></i>
<a name='L3'><i><font color='green'>*</font></i>
<a name='L4'><i><font color='green'>* (C) 1991 Linus Torvalds</font></i>
<a name='L5'><i><font color='green'>*/</font></i>
<a name='L6'>
<a name='L7'><i><font color='green'>/*</font></i>
<a name='L8'><i><font color='green'>* When in kernel-mode, we cannot use printf, as fs is liable to</font></i>
<a name='L9'><i><font color='green'>* point to 'interesting' things. Make a printf with fs-saving, and</font></i>
<a name='L10'><i><font color='green'>* all is well.</font></i>
<a name='L11'><i><font color='green'>*/</font></i>
<a name='L12'><i><font color='green'>/*</font></i>
<a name='L13'><i><font color='green'>* 当处于内核模式时,我们不能使用printf,因为寄存器fs 指向其它不感兴趣的地方。</font></i>
<a name='L14'><i><font color='green'>* 自己编制一个printf 并在使用前保存fs,一切就解决了。</font></i>
<a name='L15'><i><font color='green'>*/</font></i>
<a name='L16'><font color='darkred'>#include</font> &lt;<a href='40.html'>stdarg.h</a>&gt;             <i><font color='green'>// 标准参数头文件。以宏的形式定义变量参数列表。主要说明了-个</font></i>
<a name='L17'><i><font color='green'>// 类型(va_list)和三个宏(va_start, va_arg 和va_end),用于</font></i>
<a name='L18'><i><font color='green'>// vsprintf、vprintf、vfprintf 函数。</font></i>
<a name='L19'><font color='darkred'>#include</font> &lt;<a href='41.html'>stddef.h</a>&gt;             <i><font color='green'>// 标准定义头文件。定义了NULL, offsetof(TYPE, MEMBER)。</font></i>
<a name='L20'>
<a name='L21'><font color='darkred'>#include</font> &lt;<a href='34.html'>linux/kernel.h</a>&gt;       <i><font color='green'>// 内核头文件。含有一些内核常用函数的原形定义。</font></i>
<a name='L22'>
<a name='L23'><b>static</b> <b>char</b> <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>[1024];
<a name='L24'>
<a name='L25'><i><font color='green'>// 下面该函数vsprintf()在linux/kernel/vsprintf.c 中92 行开始。</font></i>
<a name='L26'><b>extern</b> <b>int</b> <a href='../S/78.html#L137' title='Defined at 137 in kernel/vsprintf.c.'>vsprintf</a> (<b>char</b> *buf, <b>const</b> <b>char</b> *fmt, va_list args);
<a name='L27'>
<a name='L28'><i><font color='green'>// 内核使用的显示函数。</font></i>
<a name='L29'><b>int</b>
<a name='L30'><a href='../R/554.html' title='Multiple refered from 73 places.'>printk</a> (<b>const</b> <b>char</b> *fmt, ...)
<a name='L31'><font color='red'>{</font>
<a name='L32'>  <a href='../S/40.html#L4' title='Defined at 4 in include/stdarg.h.'>va_list</a> args;                 <i><font color='green'>// va_list 实际上是一个字符指针类型。</font></i>
<a name='L33'>  <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L34'>
<a name='L35'>  <a href='../D/1107.html' title='Multiple defined in 2 places.'>va_start</a> (args, fmt);         <i><font color='green'>// 参数处理开始函数。在(include/stdarg.h,13)</font></i>
<a name='L36'>  <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = <a href='../S/78.html#L137' title='Defined at 137 in kernel/vsprintf.c.'>vsprintf</a> (<a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>, fmt, args);        <i><font color='green'>// 使用格式串fmt 将参数列表args 输出到buf 中。</font></i>
<a name='L37'><i><font color='green'>// 返回值i 等于输出字符串的长度。</font></i>
<a name='L38'>  <a href='../S/40.html#L32' title='Defined at 32 in include/stdarg.h.'>va_end</a> (args);                <i><font color='green'>// 参数处理结束函数。</font></i>
<a name='L39'>  <b>__asm__</b> ("push %%fs\n\t"      <i><font color='green'>// 保存fs。</font></i>
<a name='L40'>           "push %%ds\n\t" "pop %%fs\n\t"       <i><font color='green'>// 令fs = ds。</font></i>
<a name='L41'>           "pushl %0\n\t"       <i><font color='green'>// 将字符串长度压入堆栈(这三个入栈是调用参数)。</font></i>
<a name='L42'>           "pushl $_buf\n\t"    <i><font color='green'>// 将buf 的地址压入堆栈。</font></i>
<a name='L43'>           "pushl $0\n\t"       <i><font color='green'>// 将数值0 压入堆栈。是通道号channel。</font></i>
<a name='L44'>           "call _tty_write\n\t"        <i><font color='green'>// 调用tty_write 函数。(kernel/chr_drv/tty_io.c,290)。</font></i>
<a name='L45'>           "addl $8,%%esp\n\t"  <i><font color='green'>// 跳过(丢弃)两个入栈参数(buf,channel)。</font></i>
<a name='L46'>           "popl %0\n\t"        <i><font color='green'>// 弹出字符串长度值,作为返回值。</font></i>
<a name='L47'>           "pop %%fs"           <i><font color='green'>// 恢复原fs 寄存器。</font></i>
<a name='L48'>::"r" (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>):"ax", "cx", "dx");    <i><font color='green'>// 通知编译器,寄存器ax,cx,dx 值可能已经改变。</font></i>
<a name='L49'>  <b>return</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;                     <i><font color='green'>// 返回字符串长度。</font></i>
<a name='L50'><font color='red'>}</font>
</pre>
<hr>
<a name='BOTTOM'>
<i><font color='green'>/* [&lt;][&gt;][^]<a href='#L30'>[v]</a><a href='#TOP'>[top]</a>[bottom]<a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
</body>
</html>

⌨️ 快捷键说明

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