This commit is contained in:
gferg 2001-01-21 20:35:02 +00:00
parent 6051f21296
commit 5797fbacd3
2 changed files with 345 additions and 58 deletions

View File

@ -1,6 +1,6 @@
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!ENTITY version "0.6a">
<!ENTITY version "0.6b">
<!ENTITY s-intro "<link linkend=s-intro>Introduction</link>">
<!ENTITY s-doyou "<link linkend=s-doyou>Do you need assembly?</link>">
@ -52,7 +52,7 @@
</authorgroup>
<copyright>
<year>1999-2000</year><holder>Konstantin Boldyshev</holder>
<year>1999-2001</year><holder>Konstantin Boldyshev</holder>
</copyright>
<copyright>
<year>1996-1999</year><holder>Francois-Rene Rideau</holder>
@ -70,7 +70,7 @@ with no Invariant Sections, with no Front-Cover Texts, and no Back-Cover texts.
<abstract>
<para>
This is the Linux Assembly HOWTO.
This is the Linux Assembly HOWTO, version &version;.
This document describes how to program in assembly language
using <emphasis>free</emphasis> programming tools,
focusing on development for or from the Linux Operating System,
@ -1938,7 +1938,7 @@ only 5 parameters in registers.
<para>
<ulink url="http://www.linuxdoc.org/LDP/lki/">Linux Kernel Internals</ulink>,
and especially
<ulink url="http://www.linuxdoc.org/LDP/lki/Linux-Kernel-Internals-2.html#ss2.11">
<ulink url="http://www.linuxdoc.org/LDP/lki/lki-2.html#ss2.11">
How System Calls Are Implemented on i386 Architecture?</ulink>
chapter will give you more robust overview.
</para>
@ -2574,7 +2574,9 @@ It is already functional and should be the right choice, check it out!
You can also try <command>gdb</command> ;).
Although it is source-level debugger, it can be used to debug
pure assembly code, and with some trickery you can make
<command>gdb</command> to do what you need.
<command>gdb</command> to do what you need
(unfortunately, nasm '-g' switch does not generate
proper debug info for gdb; this is nasm bug, I think).
Here's an answer from <ulink url="mailto:dl@gazeta.ru">Dmitry Bakhvalov</ulink>:
</para>
@ -2738,6 +2740,114 @@ Now you can play with it using <command>insmod/rmmod/lsmod</command>
</answer></qandaentry>
<qandaentry>
<question><para>
How do I allocate memory dynamically?
</para></question>
<answer>
<para>
An answer from <ulink url="mailto:phpr@snafu.de">H-Peter Recktenwald</ulink>:
</para>
<para><programlisting>
ebx := 0 (in fact, any value below .bss seems to do)
sys_brk
eax := current top (of .bss section)
ebx := [ current top < ebx < (esp - 16K) ]
sys_brk
eax := new top of .bss
</programlisting></para>
</answer></qandaentry>
<qandaentry>
<question><para>
I can't understand how to use <function>select</function> system call!
</para></question>
<answer>
<para>
An answer from <ulink url="mailto:mochel@transmeta.com">Patrick Mochel</ulink>:
</para>
<para><programlisting>
When you call sys_open, you get back a file descriptor, which is simply an
index into a table of all the open file descriptors that your process has.
stdin, stdout, and stderr are always 0, 1, and 2, respectively, because
that is the order in which they are always open for your process from there.
Also, notice that the first file descriptor that you open yourself (w/o first
closing any of those magic three descriptors) is always 3, and they increment
from there.
Understanding the index scheme will explain what select does. When you
call select, you are saying that you are waiting certain file descriptors
to read from, certain ones to write from, and certain ones to watch from
exceptions from. Your process can have up to 1024 file descriptors open,
so an fd_set is just a bit mask describing which file descriptors are valid
for each operation. Make sense?
Since each fd that you have open is just an index, and it only needs to be
on or off for each fd_set, you need only 1024 bits for an fd_set structure.
1024 / 32 = 32 longs needed to represent the structure.
Now, for the loose example.
Suppose you want to read from a file descriptor (w/o timeout).
- Allocate the equivalent to an fd_set.
.data
my_fds: times 32 dd 0
- open the file descriptor that you want to read from.
- set that bit in the fd_set structure.
First, you need to figure out which of the 32 dwords the bit is in.
Then, use bts to set the bit in that dword. bts will do a modulo 32
when setting the bit. That's why you need to first figure out which
dword to start with.
mov edx, 0
mov ebx, 32
div ebx
lea ebx, my_fds
bts ebx[eax * 4], edx
- repeat the last step for any file descriptors you want to read from.
- repeat the entire exercise for either of the other two fd_sets if you want action from them.
That leaves two other parts of the equation - the n paramter and the timeout
parameter. I'll leave the timeout parameter as an exercise for the reader
(yes, I'm lazy), but I'll briefly talk about the n parameter.
It is the value of the largest file descriptor you are selecting from (from
any of the fd_sets), plus one. Why plus one? Well, because it's easy to
determine a mask from that value. Suppose that there is data available on
x file descriptors, but the highest one you care about is (n - 1). Since
an fd_set is just a bitmask, the kernel needs some efficient way for
determining whether to return or not from select. So, it masks off the bits
that you care about, checks if anything is available from the bits that are
still set, and returns if there is (pause as I rummage through kernel source).
Well, it's not as easy as I fantasized it would be. To see how the kernel
determines that mask, look in fs/select.c in the kernel source tree.
Anyway, you need to know that number, and the easiest way to do it is to save
the value of the last file descriptor open somewhere so you don't lose it.
Ok, that's what I know. A warning about the code above (as always) is that
it is not tested. I think it should work, but if it doesn't let me know.
But, if it starts a global nuclear meltdown, don't call me. ;-)
</programlisting></para>
</answer></qandaentry>
</qandaset>
<para>
@ -2761,6 +2871,13 @@ that need not to be repeatedly mentioned every time.
<para><revhistory>
<revision>
<revnumber>0.6b</revnumber><date>21 Jan 2001</date><authorinitials>konst</authorinitials>
<revremark>
new questions in FAQ, corrected few URLs
</revremark>
</revision>
<revision>
<revnumber>0.6a</revnumber><date>10 Dec 2000</date><authorinitials>konst</authorinitials>
<revremark>

View File

@ -6,7 +6,7 @@
<title>The Linux Kernel HOWTO
<author>Brian Ward, <tt>bri@cs.uchicago.edu</tt>
<date>v3.0, 16 Jan 2001
<date>v2.1, 21 Jan 2001
<abstract>
This is a detailed guide to kernel configuration, compilation, upgrades,
@ -94,98 +94,119 @@ This section is written by
name="Al Dev">
The latest version of this section is at <url url="http://www.aldev.8m.com"> and click on
"Quick Steps to recompile linux kernel". Mirror site is at <url url="http://aldev.webjump.com">.
"Quick Steps to recompile linux kernel". Mirror sites are at -
<url url="http://aldev.webjump.com">,
<url name="angelfire" url="http://www.angelfire.com/nv/aldev">,
<url name="geocities" url="http://www.geocities.com/alavoor/index.html">,
<url name="virtualave" url="http://aldev.virtualave.net">,
<url name="bizland" url="http://aldev.bizland.com">,
<url name="theglobe" url="http://members.theglobe.com/aldev/index.html">,
<url name="spree" url="http://members.spree.com/technology/aldev">,
<url name="infoseek" url="http://homepages.infoseek.com/~aldev1/index.html">,
<url name="bcity" url="http://www3.bcity.com/aldev">,
<url name="50megs" url="http://aldev.50megs.com">.
These sites have <bf>lots of linux goodies</bf> and tips.
A copy of the above web-site is reproduced here -
Kernel re-compile is required in order to make the kernel very lean
and which will result in FASTER operating system . It is also
required to support any new devices.
<bf>Note: </bf> Below 'bash#' denotes the bash prompt, you should type
the commands that appear after the 'bash#' prompt.
<enum>
<item> Login in as 'root' throughout all these steps. Mount Redhat linux cdrom and install the linux kernel source rpm
<code>
cd /mnt/cdrom/RedHat/RPMS
rpm -i kernel-headers*.rpm
rpm -i kernel-sources*.rpm
rpm -i bin86*.rpm
bash$ su - root
bash# cd /mnt/cdrom/RedHat/RPMS
bash# rpm -i kernel-headers*.rpm
bash# rpm -i kernel-sources*.rpm
bash# rpm -i dev86*.rpm
bash# rpm -i bin86*.rpm
</code>
(The bin86*.rpm is required only for OLDER Linux systems like redhat 5.x.
Install the Intel assembler 'as86' command. Get from
<url url="http://rpmfind.net/linux/RPM/mandrake/7.1/Mandrake/RPMS/bin86-0.4-12mdk.i586.html">)
or at <url url="http://rpmfind.net/linux/RPM/kondara/jirai/i586/bin86-0.4-8k.i586.html">
(The bin86*.rpm and 'as86' is required only for <bf>OLDER Linux</bf> systems like redhat 5.x.
Get Intel assembler 'as86' command from
dev86*.rpm on cdrom or from
<url url="http://rpmfind.net/linux/RPM/mandrake/7.1/Mandrake/RPMS/bin86-0.4-12mdk.i586.html">
, <url url="http://rpmfind.net/linux/RPM/kondara/jirai/i586/bin86-0.4-8k.i586.html">
).
<p>
<item> Start X-windows with 'startx'.
<code>
cd /usr/src/linux
make xconfig
bash# man startx
bash# startx
bash# cd /usr/src/linux
bash# make xconfig
</code>
The <bf>"make xconfig"</bf> brings up a user friendly GUI interface! DO NOT
The <bf>"make xconfig"</bf> brings up a user friendly GUI interface! <bf>DO NOT</bf>
use 'make config' which is a command-line option (
use this only if you CANNOT bring up X-window). You load
use this only if you <bf>CANNOT</bf> bring up X-window). You load
the configuration file from <it>/usr/src/linux/arch/i386/config.in </it>
<p>
<item> Enable the Loadable kernel modules support! See these man pages
<code>
man lsmod
man insmod
man rmmod
man depmod
</code>
<item> Enable the Loadable kernel modules support!
With this option you can load/unload the device drivers
dynamically on running linux system on the fly.
See these man pages
<code>
bash# man lsmod
bash# man insmod
bash# man rmmod
bash# man depmod
</code>
<p>
<item> Save and Exit "make xconfig". And now, do -
<code>
make dep
make clean
bash# make dep
bash# make clean
</code>
<p>
<item> Read the following file (to gain some knowledge about kernel building...) -
<code>
man less
less /usr/src/linux/arch/i386/config.in
</code>
bash# man less
bash# less /usr/src/linux/arch/i386/config.in
Type 'h' for help and to navigate press i, j, k, l, h or arrow, page up/down keys.
</code>
<p>
<item> Now, give the make command -
<code>
cd /usr/src/linux
man nohup
nohup make bzImage &
tail nohup.out (.... to monitor the progress)
bash# cd /usr/src/linux
bash# man nohup
bash# nohup make bzImage &
bash# tail nohup.out (.... to monitor the progress)
This will put the kernel in /usr/src/linux/arch/i386/boot/bzImage
man tail
bash# man tail
</code>
<p>
<item> After bzImage is successful, copy the kernel image to /boot directory -
<item> After bzImage is successful, copy the kernel image to /boot directory.
You must copy the new kernel image to /boot directory, otherwise the
new kernel <bf>may not</bf> boot.
And then read the manual page on lilo
(see also <url url="http://www.linuxdoc.org/HOWTO/LILO-crash-rescue-HOWTO.html">) -
<code>
cp /usr/src/linux/arch/i386/boot/bzImage /boot/bzImage.myker
</code>
You must copy the new kernel image to /boot directory, otherwise the new kernel may not boot. And then read the manual page on lilo -
<code>
man lilo
man lilo.conf
bash# cp /usr/src/linux/arch/i386/boot/bzImage /boot/bzImage.myker
bash# man lilo
bash# man lilo.conf
And edit /etc/lilo.conf file and put these lines -
image=/boot/bzImage.myker
label=myker
root=/dev/hda1
read-only
You can check device name for 'root=' with the command -
df /boot
bash# df /boot
</code>
<p>
<item> Now give
<code>
lilo ;
lilo -q ;
bash# lilo
bash# lilo -q
</code>
You must re-run lilo even if entry 'myker' exists, everytime you create a new bzImage.
<p>
@ -193,32 +214,36 @@ You must re-run lilo even if entry 'myker' exists, everytime you create a new bz
<item> Reboot the machine and at lilo press tab key and
type 'myker' If it boots then you did a good job! Otherwise at lilo
select your old kernel, boot and re-try all over again. Your old kernel
is still intact at say <it>/boot/vmlinuz-2.0.34-0.6</it>
<bf>is still INTACT and SAFE</bf> at say <it>/boot/vmlinuz-2.0.34-0.6</it>
<p>
<item> Loadable Modules: Boot new kernel and install the loadable modules from RedHat Linux cdrom
<code>
rpm -i /mnt/cdrom/contrib/kernel-modules*.rpm ....(For old linux systems which do not have
insmod pre-installed)
man insmod
insmod
bash# rpm -i /mnt/cdrom/contrib/kernel-modules*.rpm
....(For old linux systems which do not have insmod pre-installed)
bash# man insmod
bash# insmod
</code>
<p>
<item> If your linux is already had loadable module enabled, then check
for files in /lib/modules. The step given below may not be
for files in /lib/modules. The step given below <bf>may not</bf> be
needed. Build modules by installing kernel-source*.rpm and kernel-headers*.rpm.
<code>
cd /usr/src/linux
make modules
make install_modules
bash# cd /usr/src/linux
bash# make modules
bash# make install_modules
</code>
<p>
<item> Since the new kernel 'myker' boots, you can create the boot disk. Insert a blank floppy into floppy drive and -
<item> If your new kernel 'myker' boots and works properly, you can create the
boot disk. Insert a blank floppy into floppy drive and -
<code>
cd /usr/src/linux
make bzdisk
bash# cd /usr/src/linux
bash# make bzdisk
See also mkbootdisk -
bash# rpm -i mkbootdisk*.rpm
bash# man mkbootdisk
</code>
</enum>
<!--
@ -1426,5 +1451,150 @@ redistribution, in the interest of keeping things up-to-date (you could
send me a copy of the thing you're making while you're at it). Translators
are also advised to contact the author before translating. The printed
version looks nicer. Recycle.<p>
<!--
*******************************************
************ End of Section ***************
*******************************************
<chapt change> Other Formats of this Document
-->
<sect> Other Formats of this Document
<p>
This section is written by
<htmlurl url="mailto:alavoor@yahoo.com"
name="Al Dev">
(at site <url url="http://www.aldev.8m.com">
mirrors at
<url url="http://aldev.webjump.com">,
<url name="angelfire" url="http://www.angelfire.com/nv/aldev">,
<url name="geocities" url="http://www.geocities.com/alavoor/index.html">,
<url name="virtualave" url="http://aldev.virtualave.net">,
<url name="bizland" url="http://aldev.bizland.com">,
<url name="theglobe" url="http://members.theglobe.com/aldev/index.html">,
<url name="spree" url="http://members.spree.com/technology/aldev">,
<url name="infoseek" url="http://homepages.infoseek.com/~aldev1/index.html">,
<url name="bcity" url="http://www3.bcity.com/aldev">,
<url name="50megs" url="http://aldev.50megs.com">)
This document is published in 12 different formats namely - DVI, Postscript,
Latex, Adobe Acrobat PDF,
LyX, GNU-info, HTML, RTF(Rich Text Format), Plain-text, Unix man pages,
single HTML file and SGML.
<itemize>
<item>
You can get this HOWTO document as a single file tar ball in HTML, DVI,
Postscript or SGML formats from -
<url url="ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/other-formats/">
and <url url="http://www.linuxdoc.org/docs.html#howto">
<item>Plain text format is in:
<url url="ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO">
and <url url="http://www.linuxdoc.org/docs.html#howto">
<item>Single HTML file format is in:
<url url="http://www.linuxdoc.org/docs.html#howto">
<item>Translations to other languages like French, German, Spanish,
Chinese, Japanese are in
<url url="ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO">
and <url url="http://www.linuxdoc.org/docs.html#howto">
Any help from you to translate to other languages is welcome.
</itemize>
The document is written using a tool called "SGML-Tools" which can be got from -
<url url="http://www.sgmltools.org">
Compiling the source you will get the following commands like
<itemize>
<item>sgml2html Kernel-HOWTO.sgml (to generate html file)
<item>sgml2rtf Kernel-HOWTO.sgml (to generate RTF file)
<item>sgml2latex Kernel-HOWTO.sgml (to generate latex file)
</itemize>
LaTeX documents may be converted into PDF files simply by
producing a Postscript output using <bf>sgml2latex</bf> ( and dvips) and running the
output through the Acrobat <bf>distill</bf> (<url url="http://www.adobe.com">) command as follows:
<code>
bash$ man sgml2latex
bash$ sgml2latex filename.sgml
bash$ man dvips
bash$ dvips -o filename.ps filename.dvi
bash$ distill filename.ps
bash$ man ghostscript
bash$ man ps2pdf
bash$ ps2pdf input.ps output.pdf
bash$ acroread output.pdf &
</code>
Or you can use Ghostscript command <bf>ps2pdf</bf>.
ps2pdf is a work-alike for nearly all the functionality of
Adobe's Acrobat Distiller product: it
converts PostScript files to Portable Document Format (PDF) files.
<bf>ps2pdf</bf> is implemented as a very small command script (batch file) that invokes Ghostscript, selecting a special "output device"
called <bf>pdfwrite</bf>. In order to use ps2pdf, the pdfwrite device must be included in the makefile when Ghostscript was compiled;
see the documentation on building Ghostscript for details.
This howto document is located at -
<itemize>
<item> <url url="http://sunsite.unc.edu/LDP/HOWTO/Kernel-HOWTO.html">
</itemize>
Also you can find this document at the following mirrors sites -
<itemize>
<item> <url url="http://www.caldera.com/LDP/HOWTO/Kernel-HOWTO.html">
<item> <url url="http://www.WGS.com/LDP/HOWTO/Kernel-HOWTO.html">
<item> <url url="http://www.cc.gatech.edu/linux/LDP/HOWTO/Kernel-HOWTO.html">
<item> <url url="http://www.redhat.com/linux-info/ldp/HOWTO/Kernel-HOWTO.html">
<item> Other mirror sites near you (network-address-wise) can be found at
<url url="http://sunsite.unc.edu/LDP/hmirrors.html">
select a site and go to directory /LDP/HOWTO/Kernel-HOWTO.html
</itemize>
In order to view the document in dvi format, use the xdvi program. The xdvi
program is located in tetex-xdvi*.rpm package in Redhat Linux which can be
located through ControlPanel | Applications | Publishing | TeX menu buttons.
To read dvi document give the command -
<tscreen><verb>
xdvi -geometry 80x90 howto.dvi
man xdvi
</verb></tscreen>
And resize the window with mouse.
To navigate use Arrow keys, Page Up, Page Down keys, also
you can use 'f', 'd', 'u', 'c', 'l', 'r', 'p', 'n' letter
keys to move up, down, center, next page, previous page etc.
To turn off expert menu press 'x'.
You can read postscript file using the program 'gv' (ghostview) or
'ghostscript'.
The ghostscript program is in ghostscript*.rpm package and gv
program is in gv*.rpm package in Redhat Linux
which can be located through ControlPanel | Applications | Graphics menu
buttons. The gv program is much more user friendly than ghostscript.
Also ghostscript and gv are available on other platforms like OS/2,
Windows 95 and NT, you view this document even on those platforms.
<itemize>
<item>Get ghostscript for Windows 95, OS/2, and for all OSes from <url url="http://www.cs.wisc.edu/~ghost">
</itemize>
To read postscript document give the command -
<tscreen><verb>
gv howto.ps
ghostscript howto.ps
</verb></tscreen>
You can read HTML format document using Netscape Navigator, Microsoft Internet
explorer, Redhat Baron Web browser or any of the 10 other web browsers.
You can read the latex, LyX output using LyX a X-Windows front end to latex.
<!--
*******************************************
************ End of Section ***************
*******************************************
-->
</article>