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

📄 读核日记(一).htm

📁 这是我做linux系统初始化过程分析时在网上收集到的资料
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0049)http://www.heblinux.org/view.php?skin=art&ID=1593 -->
<HTML><HEAD><TITLE>linuxbyte</TITLE>
<META http-equiv=Content-Language content=zh-cn>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>A:link {
	COLOR: #000000; TEXT-DECORATION: none
}
A:visited {
	COLOR: #000000; TEXT-DECORATION: none
}
A:hover {
	TEXT-DECORATION: underline
}
BODY {
	FONT-SIZE: 12px; SCROLLBAR-ARROW-COLOR: #395d81; BACKGROUND-COLOR: #ffffff
}
TABLE {
	BORDER-RIGHT: #889093 1px solid; BORDER-TOP: #889093 1px solid; FONT-SIZE: 9pt; BORDER-LEFT: #889093 1px solid; COLOR: #000000; BORDER-BOTTOM: #889093 1px solid
}
TEXTAREA {
	BORDER-RIGHT: #666666 1px solid; BORDER-TOP: #666666 1px solid; FONT-WEIGHT: normal; FONT-SIZE: 12px; BORDER-LEFT: #666666 1px solid; COLOR: #000000; BORDER-BOTTOM: #666666 1px solid; FONT-FAMILY: Verdana, Tahoma, Arial; BACKGROUND-COLOR: #f8f8f8
}
INPUT {
	BORDER-RIGHT: #666666 1px solid; BORDER-TOP: #666666 1px solid; FONT-WEIGHT: normal; FONT-SIZE: 12px; BORDER-LEFT: #666666 1px solid; COLOR: #000000; BORDER-BOTTOM: #666666 1px solid; FONT-FAMILY: Verdana, Tahoma, Arial; BACKGROUND-COLOR: #f8f8f8
}
SELECT {
	FONT-WEIGHT: normal; FONT-SIZE: 12px; COLOR: #000000; FONT-FAMILY: Tahoma, Verdana; BACKGROUND-COLOR: #f8f8f8
}
.nav {
	FONT-WEIGHT: bold; FONT-SIZE: 12px; FONT-FAMILY: Tahoma, Verdana
}
.header {
	FONT-WEIGHT: bold; FONT-SIZE: 11px; COLOR: #ffffff; FONT-FAMILY: Tahoma, Verdana; BACKGROUND-COLOR: #698cc3
}
.category {
	FONT-SIZE: 11px; COLOR: #000000; FONT-FAMILY: Tahoma, Verdana; BACKGROUND-COLOR: #efefef
}
.multi {
	FONT-SIZE: 11px; COLOR: #003366; FONT-FAMILY: Tahoma, Verdana
}
.smalltxt {
	FONT-SIZE: 11px; FONT-FAMILY: Tahoma, Verdana
}
.mediumtxt {
	FONT-SIZE: 12px; COLOR: #000000; FONT-FAMILY: Tahoma, Verdana
}
.bold {
	FONT-WEIGHT: bold
}
</STYLE>
</STYLE>
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY leftMargin=0 background=读核日记(一).files/bg.gif topMargin=0 rightMargin=0>
<TABLE 
style="BORDER-RIGHT: #656b6d 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #656b6d 1px solid; BORDER-LEFT: #656b6d 1px solid; BORDER-BOTTOM: #656b6d 1px solid; WORD-WRAP: break-word" 
cellSpacing=0 cellPadding=0 width="98%" align=center bgColor=#ffffff border=0>
  <TBODY>
  <TR height=0>
    <TD width="25%"></TD>
    <TD width="65%"></TD>
    <TD width="10%"></TD></TR>
  <TR height=26>
    <TD vAlign=center align=right width="100%" 
    background=读核日记(一).files/topbg.jpg colSpan=3>
      <FORM action=search.php method=post><SELECT name=radiobutton> <OPTION 
        value=news selected>-- 新闻搜索 --</OPTION> <OPTION value=articles>-- 文章搜索 
        --</OPTION> <OPTION value=software>-- 软件搜索 --</OPTION></SELECT><INPUT 
      size=15 name=Search> <INPUT type=image src="读核日记(一).files/go.gif" 
      border=0>&nbsp;&nbsp; </FORM></TD></TR>
  <TR>
    <TD align=left width="20%"><IMG src="读核日记(一).files/logo.jpg" border=0></TD>
    <TD align=middle width="60%"><IMG src="读核日记(一).files/logo2.jpg" 
    border=1></TD>
    <TD align=middle width="20%">::<A 
      href="http://www.heblinux.org/news.php">网站新闻</A>::<BR>::<A 
      href="http://www.heblinux.org/articles.php">技术文献</A>::<BR>::<A 
      href="http://www.heblinux.org/softs.php">软件中心</A>::<BR>::<A 
      href="http://www.heblinux.org/bbs/index.php" target=_blank>讨论区</A>:: 
</TD></TR>
  <TR>
    <TD background=读核日记(一).files/tabledi.jpg colSpan=3 height=6></TD></TR>
  <TR>
    <TD background=读核日记(一).files/titlebg.jpg colSpan=3 height=22>
      <CENTER>&nbsp;<B><A href="http://www.heblinux.org/index.php">首页</A></B> || 
      <B><A href="http://www.heblinux.org/bbs/index.php" target=new>讨论区</A></B> 
      || <B><A href="http://www.heblinux.org/news.php">新闻中心</A></B> || <B><A 
      href="http://www.heblinux.org/articles.php">技术文献</A></B> || <B><A 
      href="http://www.heblinux.org/softs.php">软件中心</A></B> || <B><A 
      href="http://www.heblinux.org/about.php">关于本站</A></B> || <B><A 
      href="mailto:oneteam@mail.linuxbyte.net">联系本站</A></B>||</CENTER></TD></TR></TBODY></TABLE>
<TABLE 
style="TABLE-LAYOUT: fixed; BORDER-COLLAPSE: collapse; WORD-WRAP: break-word" 
cellSpacing=0 cellPadding=0 width="98%" align=center bgColor=#ffffff border=1>
  <TBODY>
  <TR><!--第二列-->
    <TD vAlign=top align=left width="75%"><BR>&nbsp;<A 
      href="http://www.heblinux.org/index.php">首页</A>&lt;&lt;&nbsp;<A 
      href="http://www.heblinux.org/articles.php">技术文献</A>&lt;&lt;&nbsp;<B>读核日记(一)</B><BR><BR>
      <UL>&nbsp;&nbsp;&nbsp;&nbsp; <BR><BR><BR>作者:sunmoon 
        <BR><BR><BR>今天开始我的读核罹难记.第一次读内核,整整上学时的考试前.胡里胡涂的就过去了,没甚收获.这次我发誓要彻底读一次. 
        <BR>面对近50 m 的源码,困惑是难免的所以我决定先从大面上把握,再在某一些具体的点上切入.这样一来linux 
        的启动过程便十分重要,因此我先用dmesg命令察看一下linux启动时打出的消息.(我想源文件应在/usr/src/linux/init/main.c中) 
        <BR>内核的启动最后是到 start_kernel ( in /init/main.c )也就是说启动的过程是从 head.S ( 
        arch/i386/boot/ ) 一直运行到 main.c(start_kernel) 
        .它的作用是完成开机后的设置与内核的初始化,然后,系统究竟入一个无限的循环中等待用户的输入,调用fork来产生子进程.从而达到交互式操作系统的设计要求. 
        <BR>第一部分 : 内核初始化以及启动. 
        <BR>.启动系统.当PC机加电开始启动时,80X86的处理器(CPU)在实模式下自检,开始执行物理地址0xFFFF0即ROM-BIOS的起始地址处的代码。PC机的BIOS进行系统自检,初始化中断向量表到物理地址0x0。然后把引导设备的第一个扇区加载到地址0x7C00,执行此处的指令。到这里与linux无关,x86系列的硬件设置如此. 
        <BR>linux的内核本身是不能自举的,所以lilo和loadlin的作用就是加载系统内核.有关lilo的原理可以参考lilo的readme.从加电到内核加载的过程是:加电-&gt;执行BIOS-&gt;加载第一扇区-&gt;lilo-&gt;加载内核 
        <BR>Linux内核的最初部分代码是用汇编语言写的(文件是boot/bootsect.s)。(我的汇编水平有限,暂且不看),它首先把自身这部分代码移到绝对地址0x90000,把下面的2K代码从引导设备加载到地址0x90200上,内核的其余部分加载到地址0x10000处。在加载系统时显示“loading...”. 
        然后,程序控制权交给另一个实模式汇编程序(boot/Setup.S)。接下来,此程序把整个系统从地址0x10000移到地址0x1000,进入保护模式。程序控制转给系统的其余部分即地址0x1000。 
        <BR>下一个步骤是系统内核的解压过程,这部分代码在地址0x1000(文件/Boot/head.S),该段程序初始化寄存器,然后执行decompress_kernel(),这个函数源于zBoot/inflate.c、zBoot/unzip.c和zBoot/misc.c三个文件 
        <BR>Loading ....[ bootsect.S ] <BR>uncompress .....[ decompress_kernel() 
        ] <BR>main.c ---&gt; start_kernel() 开始. <BR>开始 printk(banner); <BR>Linux 
        version 2.2.6 (root@lance) (gcc version 2.7.2.3) (检查一下GCC 的版本号, 
        在/init/main.c 中如果gcc 的版本号不够,时不允许编译内核的) <BR>#40 Sun Apr 18 17:44:20 CST 
        1999 <BR>调用init_time()打印出以下内容: <BR>Detected 199908264 Hz processor. 
        <BR>然后运行 console_init() --&gt; drivers/char/tty_io.c */ <BR>Console: 
        colour VGA+ 80x25 <BR>运行一个循环,测量一下 MIPS – 据说是要用一个确定的机器指令周期来实现实时的延迟. 
        <BR>Calibrating delay loop... 199.48 BogoMIPS <BR>初始化内存/* init_mem */ 
        <BR>Memory: 63396k/65536k available (848k kernel code, 408k reserved, 
        856k data <BR>, 28k <BR>/** dquote_init() **/ <BR>VFS: Diskquotas 
        version dquot_6.4.0 initialized <BR>察看cpu 的类型(在2.2.14 以后听说增加了对多种cpu 的支持, 
        以后我可得用心看看,if I can find a bug of intel then ……) <BR>CPU: Intel Pentium 
        Pro stepping 09 <BR>初始或处理器与协处理器,对于比较老的处理器, linux 会用软件模拟协处理器? 
        <BR>Checking 386/387 coupling... OK, FPU using exception 16 error 
        reporting. <BR>检查治理的合法性 <BR>Checking \hlt\ instruction... OK. <BR>POSIX 
        conformance testing by UNIFIX <BR>此后调用 linux_thread(init 
        ,..,..,)(arch/i386/kernel/process.c) <BR>创建一个运行 init 的进程. 
        <BR>进入了第二阶段用户模式 ( user_mode )End of start_kerne最后进入cpu_idle ( 
        arch/i386/kernel/process.c ) <BR>第二部分 设备的初始化 <BR>对设备的初始化调用. 
        init()---&gt;do_basic_init()--+ <BR>pci_init() 对pci 设备的初始化( 
        在main.c文件中有这样一段 ifdef PCI …..需要看一下)下面打印出结果: <BR>PCI: PCI BIOS revision 
        2.10 entry at 0xfd8d1 <BR>PCI: Using configuration type 1 <BR>PCI: 
        Probing PCI hardware <BR>对Socket的初始化,socket_init() (这里也许就是linux 
        的网络秘密所在吧,以后我的注意) -Linux NET4.0 for Linux 2.2 <BR>Based upon Swansea 
        University Computer Society NET3.039 <BR>NET4: Unix domain sockets 1.0 
        for Linux NET4.0. <BR>NET4: Linux TCP/IP 1.0 for NET4.0 <BR>IP 
        Protocols: ICMP, UDP, TCP <BR>Starting kswapd v 1.5 kswapd_setup() 
        <BR>调用 device_setup() <BR>Detected PS/2 Mouse Port. <BR>初始化 声卡 <BR>Sound 
        initialization started <BR>Sound initialization complete <BR>初始化 软驱 
        <BR>Floppy drive(s): fd0 is 1.44M <BR>FDC 0 is a National Semiconductor 
        PC87306 <BR>SCSI 设备的初始化 <BR>(scsi0) <ADAPTEC adapter host SCSI Ultra 
        AIC-7880>found at PCI 13/0 <BR>(scsi0) Wide Channel, SCSI ID=7, 16/255 
        SCBs <BR>(scsi0) Downloading sequencer code... 419 instructions 
        downloaded <BR>scsi0 : Adaptec AHA274x/284x/294x (EISA/VLB/PCI-Fast 
        SCSI) 5.1.10/3.2.4 <BR><ADAPTEC adapter host SCSI Ultra 
        AIC-7880><BR>scsi : 1 host. <BR>Vendor: SEAGATE Model: ST32155W Rev: 
        0596 <BR>ype: Direct-Access ANSI SCSI revision: 02 <BR>Detected scsi 
        disk sda at scsi0, channel 0, id 0, lun 0 <BR>Vendor: SEAGATE Model: 
        ST32155W Rev: 0596 <BR>Type: Direct-Access ANSI SCSI revision: 02 
        <BR>Detected scsi disk sdb at scsi0, channel 0, id 1, lun 0 <BR>scsi : 
        detected 2 SCSI disks total. <BR>(scsi0:0:0:0) Synchronous at 40.0 
        Mbyte/sec, offset 8. <BR>SCSI device sda: hdwr sector= 512 bytes. 
        Sectors= 4197405 [2049 MB] [2.0 GB ](scsi0:0:1:0) Synchronous at 40.0 
        Mbyte/sec, offset 8. <BR>SCSI device sdb: hdwr sector= 512 bytes. 
        Sectors= 4197405 [2049 MB] [2.0 GB]Partition check: sda: sda1 | <BR>sdb: 
        sdb1 sdb2 &lt; sdb5 sdb6 &gt; | <BR>安装 文件系统 filesystem_setup() 
        <BR>安装设备驱动程序 mount_root() <BR>VFS: Mounted root (ext2 filesystem) 
        readonly. <BR>Freeing unused kernel memory: 28k freed <BR>Adding Swap: 
        66540k swap-space (priority -1) <BR>Soundblaster audio driver Copyright 
        (C) by Hannu Savolainen 1993-1996 <BR>SB 3.01 detected OK (220) <BR><ESS 
        (3.01) 11) (rev AudioDrive ES1688>at 0x220 irq 5 dma 1 <BR>YM3812 and 
        OPL-3 driver Copyright (C) by Hannu Savolainen, Rob Hooft 1993-1 
        <BR>996<YAMAHA OPL3> at 0x388 <BR>NET4: AppleTalk 0.18 for Linux NET4.0 
        <BR>eth0: Intel EtherExpress Pro 10/100 at 0xf800, 00:A0:C9:49:2F:FF, 
        IRQ 9. <BR>Board assembly 645520-034, Physical connectors present: RJ45 
        <BR>Primary interface chip DP83840 PHY #1. <BR>DP83840 specific setup, 
        setting register 23 to 8462. <BR>General self-test: passed. <BR>Serial 
        sub-system self-test: passed. <BR>Internal registers self-test: passed. 
        <BR>ROM checksum self-test: passed (0x49caa8d6). <BR>Receiver lock-up 
        workaround activated. <BR>NET4: AppleTalk 0.18 for Linux NET4.0 <BR>结束 
        do_basic_setup() <BR>open(\"/dev/console\", O_RDWR, 0) <BR>开始执行 
        /sbin/init ( execv(...) ) <BR>内核就此启动完毕... 
        <BR>这样一来系统在启动时需要的文件一目了然了.要读启动这方面的源码,大概也就可以这样行动即: <BR>Boot/head.S 
        <BR>decompress_kernel(),然后按照个功能块来读取相应的函数. <BR>其实对于整个kernel 
        来说,还应该解读一下makefile ,说实话在编程来讲我是很爱写 makefile ,然而解读内核,她就是工作十分难以进行.好在有了souce 
        insight 可以让我们轻松的找到,函数和常量的定义, 方便不少. <BR>打开main.c (其实我是将2.2.14解到了windows 
        下).发现有n 个函数与2n 个常量的定义,只有几个 init 函数在.对于其他的外部函数也定义了不少.这里却没有主函数—我现在怀疑linux 
        程序是否和vc 一样不知道从哪里开始进行:__).不过马上明白了, 整个内核事变在一块的. 还包括.存储管理, 处理机管理, 
        内存管理等许多模块, 她该不会启动以后就没有时刻干了吧 <BR>好了, 
        一口吃不成胖子.我还是先从启动读起.不过我开始对是否要加中文祝时产生怀疑, 写那些代码的本身都是高手, 他们应知道怎样是最好的注释. 
        难道读代码的人连这点e 文也看不了? <BR><BR><BR><BR></UL></TR></TBODY></TABLE></BODY></HTML>

⌨️ 快捷键说明

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