aboutsummaryrefslogtreecommitdiff
path: root/zh_CN.UTF-8/books/handbook/linuxemu/chapter.xml
blob: 55a1ea6b1372cce75cac20c7258c1622955e6b18 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
<?xml version="1.0" encoding="utf-8"?>
<!--
     The FreeBSD Documentation Project

     Original Revision: 7cfcff7e6a (r44899)
     $FreeBSD$
-->
<chapter xmlns="http://docbook.org/ns/docbook"
         xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
         xml:id="linuxemu">
  <info>
    <title>&linux; 二进制兼容模式</title>

    <authorgroup>
      <author>
        <personname>
          <firstname>Jim</firstname>
          <surname>Mock</surname>
        </personname>
        <contrib>Restructured and parts updated by </contrib>
      </author>
      <!-- 22 Mar 2000 -->
    </authorgroup>

    <authorgroup>
      <author>
        <personname>
          <firstname>Brian N.</firstname>
          <surname>Handy</surname>
        </personname>
        <contrib>Originally contributed by </contrib>
      </author>

      <author>
        <personname>
          <firstname>Rich</firstname>
          <surname>Murphey</surname>
        </personname>
      </author>
    </authorgroup>
  </info>

  <sect1 xml:id="linuxemu-synopsis">
    <title>概述</title>
  
    <indexterm>
      <primary>Linux 二进制兼容模式</primary>
    </indexterm>
    <indexterm>
      <primary>二进制兼容模式</primary>
      <secondary>Linux</secondary>
    </indexterm>

    <para>&os; 提供了与 &linux; 32-bit 二进制兼容,
      允许用户在 &os; 系统上安装和运行大多数的 32-bit &linux;
      二进制程序而无需做任何修改。 据说在某些情况下, &os; 上运行的
      32-bit &linux; 二进制程序能有更好的表现。</para>

    <para>然而, 仍然有一些 &linux; 操作系统特有的功能在 &os;
      上并不被支持。 例如, 要是 &linux; 
      程序过度地使用了诸如启用虚拟 8086 模式 &i386; 特有的调用,
      则无法在 &os; 上运行。 另外, 目前还不支持 64-bit 的 &linux;
      二进制程序。</para>

    <para>读完这章,您将了解到:</para>

    <itemizedlist>
      <listitem>
         <para>如何在 &os; 系统中启用 &linux; 二进制兼容模式。</para>
      </listitem>

      <listitem>
	    <para>如何安装额外的 &linux; 共享库。</para>
	  </listitem>

      <listitem>
        <para>如何在 &os; 上安装 &linux; 应用程序。</para>
      </listitem>

      <listitem>
	    <para>&os;&linux; 兼容模式的实现细节。</para>
      </listitem>
    </itemizedlist>

    <para>在阅读这章之前,您应该知道:</para>

    <itemizedlist>
      <listitem>
	    <para>知道如何安装 <link linkend="ports">
          额外的第三方软件</link></para>
      </listitem>
    </itemizedlist>

  </sect1>

  <sect1 xml:id="linuxemu-lbc-install">
    <title>配置 &linux; 二进制兼容模式</title>

    <indexterm><primary>Ports Collection</primary></indexterm>

    <para>默认情况下, &linux; 库并没有被安装而且 &linux;
      二进制兼容模式也没有被启动。  &linux; 
      库可以通过手动安装或者使用 &os; 的 Ports Collection。</para>

    <para>安装 <package>emulators/linux-base-f10</package> 包或者
      port 是最容易在 &os; 系统上获得一套基本的 &linux; 库的方法。
      使用如下方法安装 port:</para>

    <screen>&prompt.root; <userinput>cd /usr/ports/emulators/linux_base-f10</userinput>
&prompt.root; <userinput>make install distclean</userinput></screen>

    <para>安装完成以后, 加载 <literal>linux</literal>
      模块启用 &linux; 二进制兼容模式:</para>

    <screen>&prompt.root; <userinput>kldload linux</userinput>userinput></screen>

    <para>查看模块是否已经被加载:</para>

    <screen>&prompt.user; <userinput>kldstat</userinput>
Id Refs Address    Size     Name
 1    2 0xc0100000 16bdb8   kernel
 7    1 0xc24db000 d000     linux.ko</screen>

    <para><filename>/etc/rc.conf</filename> 中加入以下这行后
      &linux; 兼容模式便会在系统启动时自动开启:</para>

    <programlisting>linux_enable="YES"</programlisting>

    <indexterm>
      <primary>kernel options</primary>
      <secondary>COMPAT_LINUX</secondary>
    </indexterm>

    <para>想要在自制内核中静态链接 &linux; 
      二进制兼容支持的用户可以在自定义的内核配置文件中加入
      <literal>options COMPAT_LINUX</literal>literal>。
      然后按照 <xref linkend="kernelconfig"/>
      中所描述的方法编译并安装新内核。</para>

    <sect2 xml:id="linuxemu-libs-manually">
      <title>手动安装额外的库</title>

      <indexterm>
        <primary>shared libraries</primary>
      </indexterm>

      <para>在配置了 &linux; 兼容模式之后,
        如果某个 &linux; 应用程序依然提示找不到共享库,
        需先找出此 &linux; 二进制程序需要的共享库再手动安装。</para>

      <para>&linux; 系统上使用 <command>ldd</command>
        找出应用程序所需的共享库文件。 比如,
        在安装有 <application>Doom</application>&linux;
        系统上运行如下的命令列出 <command>linuxdoom</command>
        所需用到的共享库文件:</para>

      <screen>&prompt.user; <userinput>ldd linuxdoom</userinput>
libXt.so.3 (DLL Jump 3.1) =&gt; /usr/X11/lib/libXt.so.3.1.0
libX11.so.3 (DLL Jump 3.1) =&gt; /usr/X11/lib/libX11.so.3.1.0
libc.so.4 (DLL Jump 4.5pl26) =&gt; /lib/libc.so.4.6.29</screen>

      <indexterm>
        <primary>symbolic links</primary>
      </indexterm>

      <para>然后把上面输出中最后一列中的所有文件从 &linux; 
        系统复制到 &os; 上的 <filename>/compat/linux</filename>。
        复制完成之后, 建立指向第一栏中文件名的符号链接。
        这样在 &os; 系统上将会有如下的文件:</para>

      <screen>/compat/linux/usr/X11/lib/libXt.so.3.1.0
/compat/linux/usr/X11/lib/libXt.so.3 -&gt; libXt.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3 -&gt; libX11.so.3.1.0
/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.29</screen>

      <para>如果已经有了一个与 <command>ldd</command> 
        输出中第一列的主修订号相同的 &linux; 共享库文件,
	    则不再需要复制最后那列文件, 现有的共享库应该可以正常使用。
        如果是更新版本的共享库通常建议复制。 
        只要有符号链接指向新的版本, 那么就可以删除旧版的了。</para>

      <para>比如, &os; 系统中现有这些共享库文件:</para>

	  <screen>/compat/linux/lib/libc.so.4.6.27
/compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.27</screen>

      <para>并且 <command>ldd</command> 指出某个二进制程序需要之后版本:</para>

	  <screen>libc.so.4 (DLL Jump 4.5pl26) -&gt; libc.so.4.6.29</screen>

      <para>既然现有文件最后的版本号只相差一到两个版本,
        程序应该可以正常使用稍旧些的版本。 不管怎样,
        使用新版本替换现有 <filename>libc.so</filename> 都是安全的。</para>

	  <screen>/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.29</screen>

      <para>通常最初几次在 &os; 上安装 &linux; 程序时需要寻找 &linux;
        二进制程序所依赖的共享库文件。 在此之后, 系统里便会有足够多的 &linux;
        共享库文件来运行新安装的 &linux; 二进制程序而无需额外操作。</para>
    </sect2>

    <sect2>
      <title>安装 &linux; <acronym>ELF</acronym>
        二进制程序</title>

      <indexterm>
	    <primary>Linux</primary>
	    <secondary>ELF binaries</secondary>
      </indexterm>

      <para><acronym>ELF</acronym> 二进制程序有时需要额外的步骤。
        当未被标记的 <acronym>ELF</acronym> 二进制程序被执行的时候,
        会生成如下的错误信息:</para>

      <screen>&prompt.user; <userinput>./my-linux-elf-binary</userinput>
ELF binary type not known
Abort</screen>

      <para>为了帮助 &os; 内核分辨 &os; <acronym>ELF</acronym>
	    二进制程序和 &linux; 二进制程序, 请使用 &man.brandelf.1;:</para>

      <screen>&prompt.user; <userinput>brandelf -t Linux my-linux-elf-binary</userinput></screen>

      <indexterm>
        <primary>GNU toolchain</primary>
      </indexterm>

      <para>由于现在的 GNU 工具链能自动把适当的标记信息写入 <acronym>ELF</acronym>
        二进制程序中,这个步骤通常不是必须做的。</para>
    </sect2>

    <sect2>
      <title>安装基于 &linux; <acronym>RPM</acronym> 的应用程序</title>

      <para>安装基于 &linux; <acronym>RPM</acronym> 的应用程序,
        首先需要安装 <package>archivers/rpm</package> 包或者 port。
        安装好之后 <systemitem class="username">root</systemitem>
        用户就能使用此命令安装 <filename>.rpm</filename> 了:</para>

      <screen>&prompt.root; <userinput>cd /compat/linux</userinput>
&prompt.root; <userinput>rpm2cpio &lt; /path/to/linux.archive.rpm | cpio -id</userinput></screen>

      <para>如有必要的话使用 <command>brandelf</command> 标记安装好的
        <acronym>ELF</acronym> 二进制程序。 注意此项安装将无法干净卸载。</para>
    </sect2>

    <sect2>
      <title>配置主机名解析器</title>

      <para>如果 <acronym>DNS</acronym> 不能正常工作或是出现以下的错误信息:</para>

      <screen>resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keyword</screen>

      <para>请参照此方法配置 <filename>/compat/linux/etc/host.conf</filename></para>

      <programlisting>order hosts, bind
multi on</programlisting>

      <para>这里指定了先查询 <filename>/etc/hosts</filename>
        再查询 <acronym>DNS</acronym>。 如果
        <filename>/compat/linux/etc/host.conf</filename> 不存在的话,
        &linux; 程序便会读取 	<filename>/etc/host.conf</filename>
        并提示与 &os; 的语法不兼容。 如果没有在
        <filename>/etc/resolv.conf</filename> 文件中配置域名服务器,
        可以删除 <literal>bind</literal></para>
    </sect2>
  </sect1>

  <?ignore

  While the installer works, the binaries do not.  As of Oct 2013,
  Linux emulation is 32-bit but the trial version of Mathematica is
  only available as 64-bit.  This section should be revisited if Linux
  emulation gets 64-bit binary support.

  <sect1 xml:id="linuxemu-mathematica">
    <info><title>安装&mathematica;</title>
      <authorgroup>
	<author><personname><firstname>Boris</firstname><surname>Hollas</surname></personname><contrib>Updated for Mathematica 5.X by </contrib></author>
      </authorgroup>
    </info>
    

    <indexterm>
      <primary>applications</primary>
      <secondary><application>Mathematica</application></secondary>
    </indexterm>

    <para>这份文档介绍了如何在 FreeBSD 系统中安装 Linux
      版本的 <application>&mathematica; 5.X</application></para>

    <para>Linux 版本的 <application>&mathematica;</application><application>&mathematica; for Students</application>
      可以直接从 Wolfram 的
      <uri xlink:href="http://www.wolfram.com/">http://www.wolfram.com/</uri> 订购。</para>

    <sect2>
      <title>运行 &mathematica; 安装程序</title>

      <para>首先您应告诉 &os;
	<application>&mathematica;</application> 的 Linux
	可执行文件需要使用 Linux ABI。 达到这一目的最简单的办法,
	是将未加标志的可执行文件的默认 ELF 标记为 Linux,
	输入下面的命令:</para>

      <screen>&prompt.root; <userinput>sysctl kern.fallback_elf_brand=3</userinput></screen>

      <para>这会让 &os; 假定所有未加标志的 ELF 可执行文件,
	都应使用 Linux ABI, 这样就可以直接从 CDROM 执行安装程序了。</para>

      <para>接下来, 需要将 <filename>MathInstaller</filename>
	复制到硬盘上:</para>

      <screen>&prompt.root; <userinput>mount /cdrom</userinput>
&prompt.root; <userinput>cp /cdrom/Unix/Installers/Linux/MathInstaller /localdir/</userinput></screen>

      <para>在这个文件的第一行中, 将 <literal>/bin/sh</literal>
	改为 <literal>/compat/linux/bin/sh</literal>。
	这样就能确保安装程序是使用 Linux
	版本的 &man.sh.1; 来运行的。 接下来, 使用文本编辑器或下面的脚本, 把所有的
	<literal>Linux)</literal> 替换为 <literal>FreeBSD)</literal>。
	由于 <application>&mathematica;</application>
	安装程序会调用 <command>uname -s</command> 来检测操作系统,
	这样做能够让它视 &os; 为一种 类-Linux 操作系统。
	现在执行 <command>MathInstaller</command>
	就能安装 <application>&mathematica;</application> 了。</para>
    </sect2>

    <sect2>
      <title>修改 &mathematica; 执行文件</title>

      <para>在安装
	<application>&mathematica;</application> 的过程中所创建的脚本,
	必须首先进行适当的修改才能使用。
	如果您选择将 <filename>/usr/local/bin</filename>
	作为
	<application>&mathematica;</application> 可执行文件的安装路径,
	则可以在这个目录中找到一些到名为
	<filename>math</filename><filename>mathematica</filename><filename>Mathematica</filename>, 以及
	<filename>MathKernel</filename> 的文件的符号连接。 您可以使用文本编辑器,
	或者下面的 shell 脚本来将这些文件中的
	<literal>Linux)</literal> 改为 <literal>FreeBSD)</literal></para>

      <programlisting>#!/bin/sh
cd /usr/local/bin
for i in math mathematica Mathematica MathKernel
  do sed 's/Linux)/FreeBSD)/g' $i &gt; $i.tmp
  sed 's/\/bin\/sh/\/compat\/linux\/bin\/sh/g' $i.tmp &gt; $i
  rm $i.tmp
  chmod a+x $i
done</programlisting>
    </sect2>

    <sect2>
      <title>获得您的&mathematica; 密码</title>

      <indexterm>
	<primary>以太网</primary>
	<secondary>MAC地址</secondary>
      </indexterm>

      <para>在首次启动 <application>&mathematica;</application>
	时, 您将被问及一个密码。 如果您还未从 Wolfram 获得密码, 则安装目录中的
	<command>mathinfo</command> 可以帮助您获得 <quote>machine ID</quote> (计算机 ID)。
	这个计算机 ID 取决于您第一块以太网卡的 MAC 地址,
	以确保您不在多台机器上运行
	<application>&mathematica;</application></para>

      <para>在通过电子邮件、 电话或传真向 Wolfram 注册时,
	您需要向他们提供 <quote>machine ID</quote>,
	探后它们会给您一个与之对应的由一组数字组成的密码。</para>
    </sect2>

    <sect2>
      <title>通过网络来运行&mathematica;</title>

      <para><application>&mathematica;</application> 使用一些特殊的字体来显示字符,
      与现在使用的标准字体不一样(integrals, sums, Greek letters,等等)。 X协议要求将这些字体安装在
      <emphasis>本地</emphasis>。
      这意味着您需要从<application>&mathematica;</application>的CDROM里面复制这些字体并安装到本地。
	这些字体一般在CDROM的<filename>/cdrom/Unix/Files/SystemFiles/Fonts</filename>里面,
	或本地硬盘的<filename>/usr/local/mathematica/SystemFiles/Fonts</filename>。
	实际的字体在<filename>Type1</filename><filename>X</filename>子目录。有很多种方法来使用它们。
	</para>

      <para>第一种方法是把字体复制到一个已存在的目录<filename>/usr/X11R6/lib/X11/fonts</filename>。
      这需要编辑<filename>fonts.dir</filename>文件。添加字体名字进去,并改变第一行的字体数目。
      另外,您也需要在复制字体的目录下执行&man.mkfontdir.1;。
      </para>

      <para>第二种方法是复制到 <filename>/usr/X11R6/lib/X11/fonts</filename> 目录:</para>

      <screen>&prompt.root; <userinput>cd /usr/X11R6/lib/X11/fonts</userinput>
&prompt.root; <userinput>mkdir X</userinput>
&prompt.root; <userinput>mkdir MathType1</userinput>
&prompt.root; <userinput>cd /cdrom/Unix/Files/SystemFiles/Fonts</userinput>
&prompt.root; <userinput>cp X/* /usr/X11R6/lib/X11/fonts/X</userinput>
&prompt.root; <userinput>cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1</userinput>
&prompt.root; <userinput>cd /usr/X11R6/lib/X11/fonts/X</userinput>
&prompt.root; <userinput>mkfontdir</userinput>
&prompt.root; <userinput>cd ../MathType1</userinput>
&prompt.root; <userinput>mkfontdir</userinput></screen>

      <para>现在,添加新的字体目录到您的字体目录:</para>

      <screen>&prompt.root; <userinput>xset fp+ /usr/X11R6/lib/X11/fonts/X</userinput>
&prompt.root; <userinput>xset fp+ /usr/X11R6/lib/X11/fonts/MathType1</userinput>
&prompt.root; <userinput>xset fp rehash</userinput></screen>

      <para>如果您正使用 <application>&xorg;</application> 服务器, 则可以通过修改
	<filename>xorg.conf</filename> 文件来自动加载它们。</para>

      <indexterm><primary>fonts</primary></indexterm>

      <para>如果您<emphasis>没有</emphasis>一个叫<filename>/usr/X11R6/lib/X11/fonts/Type1</filename>的目录,
      您可以把<filename>MathType1</filename>改成<filename>Type1</filename></para>
    </sect2>
  </sect1>
  -->

  <!--
  As of October 2013, the trial version is only available in the
  Professional and Academic editions (not the Student or Personal
  editions) and requires a contact with a product specialist before
  the evaluation download link is made available.
  <sect1 xml:id="linuxemu-maple">
    <info><title>安装&maple;</title>
      <authorgroup>
	<author><personname><firstname>Aaron</firstname><surname>Kaplan</surname></personname><contrib>Contributed by </contrib></author>
      </authorgroup>
      <authorgroup>
	<author><personname><firstname>Robert</firstname><surname>Getschmann</surname></personname><contrib>Thanks to </contrib></author>
      </authorgroup>
    </info>
    

    <indexterm>
      <primary>应用程序</primary>
      <secondary><application>Maple</application></secondary>
    </indexterm>

    <para><application>&maple;</application>是一个类似于<application>&mathematica;</application>的商业数学软件。
    您可以从<uri xlink:href="http://www.maplesoft.com/">http://www.maplesoft.com/</uri>买到这个软件并注册得到一个使用许可。
     要在FreeBSD上安装这个软件,请按照下面的步骤:</para>

      <procedure>
	<step><para>从软件的发行包执行<filename>INSTALL</filename> shell脚本。当进入安装程序的提示符时,
	选择<quote>RedHat</quote> 选项。典型的安装目录是<filename>/usr/local/maple</filename>。</para></step>

        <step><para>如果您不这样做,可以从Maple Waterloo Software (<uri xlink:href="http://register.maplesoft.com/">http://register.maplesoft.com/</uri>)
	为 <application>&maple;</application> 订购一个授权许可。
	然后把它复制到 <filename>/usr/local/maple/license/license.dat</filename>。</para></step>

        <step><para>通过运行<application>&maple;</application>中的<filename>INSTALL_LIC</filename>安装shell脚本来
	  安装<application>FLEXlm</application>许可管理器。  指定许可服务器为您的机器名。</para></step>

        <step><para>像下面这样Patch您的<filename>/usr/local/maple/bin/maple.system.type</filename>
          文件:</para>
<programlisting>   ----- snip ------------------
*** maple.system.type.orig      Sun Jul  8 16:35:33 2001
--- maple.system.type   Sun Jul  8 16:35:51 2001
***************
*** 72,77 ****
--- 72,78 ----
          # the IBM RS/6000 AIX case
          MAPLE_BIN="bin.IBM_RISC_UNIX"
          ;;
+     "FreeBSD"|\
      "Linux")
          # the Linux/x86 case
        # We have two Linux implementations, one for Red Hat and
   ----- snip end of patch -----</programlisting>

	<para>请注意<literal>"FreeBSD"|\</literal>后面没有空格。</para>

	<para>这个补丁指示<application>&maple;</application>把<quote>FreeBSD</quote>识别为一种Linux系统。
	 <filename>bin/maple</filename> shell脚本调用<filename>bin/maple.system.type</filename>
	 脚本执行<command>uname -a</command>来查找操作系统名,根据操作系统名,就知道该使用哪个程序。
	 </para></step>

      <step><para>启动许可服务器。</para>

	<para>下面的脚本,安装成<filename>/usr/local/etc/rc.d/lmgrd.sh</filename>,
	是很方便的启动<command>lmgrd</command>的方法:</para>

	<programlisting>   ----- snip ------------

#! /bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin
PATH=${PATH}:/usr/local/maple/bin:/usr/local/maple/FLEXlm/UNIX/LINUX
export PATH

LICENSE_FILE=/usr/local/maple/license/license.dat
LOG=/var/log/lmgrd.log

case "$1" in
start)
	lmgrd -c ${LICENSE_FILE} 2&gt;&gt; ${LOG} 1&gt;&amp;2
	echo -n " lmgrd"
	;;
stop)
	lmgrd -c ${LICENSE_FILE} -x lmdown 2&gt;&gt; ${LOG} 1&gt;&amp;2
	;;
*)
	echo "Usage: `basename $0` {start|stop}" 1&gt;&amp;2
	exit 64
	;;
esac

exit 0
   ----- snip ------------</programlisting></step>


      <step><para>开始测试<application>&maple;</application>:</para>
	<screen>&prompt.user; <userinput>cd /usr/local/maple/bin</userinput>
&prompt.user; <userinput>./xmaple</userinput></screen>

<para>您应该成功启动起来了。记得写信告诉Maplesoft您想要一个本地FreeBSD版本!</para></step>
    </procedure>

    <sect2>
      <title>一些缺陷</title>

      <itemizedlist>
	<listitem><para><application>FLEXlm</application>许可管理器可能是一个使用比较困难的工具。
	关于它的额外的文档可以在<uri xlink:href="http://www.globetrotter.com/">http://www.globetrotter.com/</uri>找到。</para></listitem>

	<listitem><para><command>lmgrd</command>对许可文件非常挑剔,有一点问题就会core dump。
	正确的许可文件看起来像下面这样:
	</para>

<programlisting># =======================================================
# License File for UNIX Installations ("Pointer File")
# =======================================================
SERVER chillig ANY
#USE_SERVER
VENDOR maplelmg

FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \
         PLATFORMS=i86_r ISSUER="Waterloo Maple Inc." \
         ISSUED=11-may-2000 NOTICE=" Technische Universitat Wien" \
         SN=XXXXXXXXX</programlisting>

	  <note><para>序列号被'X'代替了。 <systemitem>chillig</systemitem>是主机名。</para></note>

  	  <para>只要不修改<quote>FEATURE</quote>行,编辑后一般都能工作。</para></listitem>
      </itemizedlist>
    </sect2>
  </sect1>
  -->

  <!--
  As of October, 2013, the Linux version of Matlab is only available
  for 64-bit.

  <sect1 xml:id="linuxemu-matlab">
    <info><title>安装&matlab;</title>
      <authorgroup>
	<author><personname><firstname>Dan</firstname><surname>Pelleg</surname></personname><contrib>Contributed by </contrib></author>
	<!-- daniel+handbook@pelleg.org -->
      </authorgroup>
    </info>
    

    <indexterm>
      <primary>应用程序</primary>
      <secondary><application>MATLAB</application></secondary>
    </indexterm>

    <para>这一节描述在一个 &os; 上安装Linux版本的<application>&matlab; version 6.5</application>。
    它工作的很好,除了<application>&java.virtual.machine;</application>例外(参考
      <xref linkend="matlab-jre"/>)。</para>

    <para>Linux版本的<application>&matlab;</application>可以从MathWorks<uri xlink:href="http://www.mathworks.com">http://www.mathworks.com</uri>订购。请确定您也得到了许可文件或安装说明。
      等您成功后,让他们知道您想要一个本地&os;版本。</para>

    <sect2>
      <title>安装&matlab;</title>

      <para>请按照下面的步骤安装<application>&matlab;</application></para>

      <procedure>
	<step>
	  <para><systemitem class="username">root</systemitem>身份插入安装CD并挂载上。
	  推荐使用安装脚本,为了启动安装脚本,键入:</para>

	  <screen>&prompt.root; <userinput>/compat/linux/bin/sh /cdrom/install</userinput></screen>

	  <tip>
	    <para>安装程序是图形的。如果您得到不能打开显示的错误,可以键入
	      <command>setenv HOME ~USER</command><replaceable>USER</replaceable>是您&man.su.1;成的用户。</para>
	  </tip>
	</step>

	<step>
	  <para>
	    当问<application>&matlab;</application>的根目录时,键入:
	    <userinput>/compat/linux/usr/local/matlab</userinput></para>

	  <tip>
	    <para>为了下面的安装过程更方便,在shell提示符下键入
	    <command>set MATLAB=/compat/linux/usr/local/matlab</command></para>
	  </tip>
	</step>

	<step>
	  <para>根据获得<application>&matlab;</application>许可时的指示来编辑许可文件。</para>

	  <tip>
	    <para>您可以用您喜欢的编辑器提前准备这个文件,
	    并在安装程序要您编辑它之前复制到
	    <filename>$MATLAB/license.dat</filename>
	    </para>
	  </tip>
	</step>

	<step>
	  <para>完成安装过程</para>
	</step>
      </procedure>

      <para>到这里,您的<application>&matlab;</application>安装已经完成了。
      接下来的步骤是让它和您的&os; 系统<quote>胶合</quote>在一起。</para>
    </sect2>

    <sect2>
      <title>许可管理器的启动</title>
      <procedure>
	<step>
	  <para>为许可管理器建立符号链接的脚本:</para>

	  <screen>&prompt.root; <userinput>ln -s $MATLAB/etc/lmboot /usr/local/etc/lmboot_TMW</userinput>
&prompt.root; <userinput>ln -s $MATLAB/etc/lmdown /usr/local/etc/lmdown_TMW</userinput></screen>
	</step>

	<step>
	  <para>建立启动文件<filename>/usr/local/etc/rc.d/flexlm.sh</filename>。
	  下面的例子是一个<filename>$MATLAB/etc/rc.lm.glnx86</filename>的修改版本。
	  变化的是文件的位置,和模拟Linux下许可管理器的启动。 </para>

	  <programlisting>#!/bin/sh
case "$1" in
  start)
        if [ -f /usr/local/etc/lmboot_TMW ]; then
              /compat/linux/bin/sh /usr/local/etc/lmboot_TMW -u <replaceable>username</replaceable> &amp;&amp; echo 'MATLAB_lmgrd'
        fi
        ;;
  stop)
	if [ -f /usr/local/etc/lmdown_TMW ]; then
            /compat/linux/bin/sh /usr/local/etc/lmdown_TMW  &gt; /dev/null 2&gt;&amp;1
	fi
        ;;
  *)
	echo "Usage: $0 {start|stop}"
	exit 1
	;;
esac

exit 0</programlisting>

	  <important>
	    <para>必须使脚本文件可执行:</para>

	    <screen>&prompt.root; <userinput>chmod +x /usr/local/etc/rc.d/flexlm.sh</userinput></screen>

	    <para>您也必须替换<replaceable>username</replaceable>为机器上的一个用户(不要是<systemitem class="username">root</systemitem>)。
	    </para>
	  </important>
	</step>

	<step>
	  <para>用命令启动许可管理器:</para>

	  <screen>&prompt.root; <userinput>/usr/local/etc/rc.d/flexlm.sh start</userinput></screen>
	</step>
      </procedure>
    </sect2>

    <sect2 xml:id="matlab-jre">
      <title>链接&java;运行时环境</title>

      <para>改变<application>&java;</application>运行时环境(JRE),链接到一个可以工作的版本:
      </para>

      <screen>&prompt.root; <userinput>cd $MATLAB/sys/java/jre/glnx86/</userinput>
&prompt.root; <userinput>unlink jre; ln -s ./jre1.1.8 ./jre</userinput></screen>
    </sect2>

    <sect2>
      <title>创建&matlab;启动脚本</title>

      <procedure>
	<step>
	  <para>把下面的启动脚本放到<filename>/usr/local/bin/matlab</filename></para>

	  <programlisting>#!/bin/sh
/compat/linux/bin/sh /compat/linux/usr/local/matlab/bin/matlab "$@"</programlisting>
	</step>

	<step>
	  <para>然后输入命令<command>chmod +x /usr/local/bin/matlab</command></para>
	</step>
      </procedure>

      <tip>
	<para>依赖于您的<package>emulators/linux_base</package>版本,
	您在运行这个脚本时可能会出错,为了避免错误,编辑<filename>/compat/linux/usr/local/matlab/bin/matlab</filename>,
	把这行:</para>

	<programlisting>if [ `expr "$lscmd" : '.*-&gt;.*'` -ne 0 ]; then</programlisting>

	<para>(在13.0.1版本是在第410行)改成:</para>

	<programlisting>if test -L $newbase; then</programlisting>
      </tip>
    </sect2>

    <sect2>
      <title>Creating a &matlab; Shutdown Script</title>

      <para>The following is needed to solve a problem with &matlab;
	not exiting correctly.</para>

      <procedure>
	<step>
	  <para>Create a file
	    <filename>$MATLAB/toolbox/local/finish.m</filename>, and
	    in it put the single line:</para>

	  <programlisting>! $MATLAB/bin/finish.sh</programlisting>

	  <note><para>The <literal>$MATLAB</literal> is
	    literal.</para></note>

	  <tip>
	    <para>In the same directory, you will find the files
	      <filename>finishsav.m</filename> and
	      <filename>finishdlg.m</filename>, which let you save
	      your workspace before quitting.  If you use either of
	      them, insert the line above immediately after the
	      <literal>save</literal> command.</para></tip>
	</step>

	<step>
	  <para>Create a file
	    <filename>$MATLAB/bin/finish.sh</filename>, which will
	    contain the following:</para>

	  <programlisting>#!/usr/compat/linux/bin/sh
(sleep 5; killall -1 matlab_helper) &amp;
exit 0</programlisting>
	</step>

	<step>
	  <para>Make the file executable:</para>

	  <screen>&prompt.root; <userinput>chmod +x $MATLAB/bin/finish.sh</userinput></screen>
	</step>
      </procedure>
    </sect2>

    <sect2 xml:id="matlab-using">
      <title>使用&matlab;</title>

      <para>现在您已经可以键入
	<command>matlab</command> 并开始使用它了。</para>
    </sect2>
  </sect1>

  <sect1 xml:id="linuxemu-oracle">
    <info><title>安装&oracle;</title>
      <authorgroup>
	<author><personname><firstname>Marcel</firstname><surname>Moolenaar</surname></personname><contrib>Contributed by </contrib></author>
	<!-- marcel@cup.hp.com -->
      </authorgroup>
    </info>
    

    <indexterm>
      <primary>应用程序</primary>
      <secondary><application>Oracle</application></secondary>
    </indexterm>

    <sect2>
      <title>前言</title>
      <para>这节描述在FreeBSD上安装Linux版的<application>&oracle; 8.0.5</application><application>&oracle; 8.0.5.1 Enterprise Edition</application></para>
    </sect2>

    <sect2>
      <title>安装Linux环境</title>

      <para>确信您已经从 Ports Collection 安装了 <package>emulators/linux_base</package><package>devel/linux_devtools</package>。 如果在使用这些 port
	时遇到困难, 您可能就不得不从 package, 或使用较早版本的 Ports Collection
	来安装。</para>

      <para>如果要运行智能代理, 您还需要安装 Red Hat Tcl 软件包:
	<filename>tcl-8.0.3-20.i386.rpm</filename>。
	用于安装官方的 <application>RPM</application>
	(<package>archivers/rpm</package>) 软件包的命令是:</para>

      <screen>&prompt.root; <userinput>rpm -i --ignoreos --root /compat/linux --dbpath /var/lib/rpm package</userinput></screen>

      <para><replaceable></replaceable>的安装通常不会出错。 </para>
    </sect2>

    <sect2>
      <title>创建&oracle;环境</title>

      <para>安装<application>&oracle;</application>之前,您需要设置正确的环境。
      这节只描述了在FreeBSD下安装Linux版本<application>&oracle;</application>需要<emphasis>特别</emphasis>注意的地方。
      不像在<application>&oracle;</application>安装指南中所描述的那样。
   </para>

      <sect3 xml:id="linuxemu-kernel-tuning">
        <title>调整内核</title>
	<indexterm><primary>调整内核</primary></indexterm>

	<para>正如<application>&oracle;</application>安装指南描述的那样,您需要设置共享内存的最大值。
	不要在FreeBSD下使用<literal>SHMMAX</literal><literal>SHMMAX</literal>
	 只是用来计算<literal>SHMMAXPGS</literal><literal>PGSIZE</literal>的。
	 因此要使用<literal>SHMMAXPGS</literal>。所有其他要使用的选项可以参考指南,例如:</para>

	<programlisting>options SHMMAXPGS=10000
options SHMMNI=100
options SHMSEG=10
options SEMMNS=200
options SEMMNI=70
options SEMMSL=61</programlisting>

	<para>设置这些选项来适应 <application>&oracle;</application>的使用。</para>

	<para>当然,确信您的内核配置文件中有下面这些选项:</para>

<programlisting>options SYSVSHM #SysV shared memory
options SYSVSEM #SysV semaphores
options SYSVMSG #SysV interprocess communication</programlisting>
      </sect3>

      <sect3 xml:id="linuxemu-oracle-account">

        <title>&oracle;帐号</title>

	<para>创建一个<systemitem class="username">oracle</systemitem>帐号,正如您创建其他帐号一样。
	<systemitem class="username">oracle</systemitem> 帐号特殊的地方是您需要给它一个Linux shell。
	添加<literal>/compat/linux/bin/bash</literal><filename>/etc/shells</filename>,
	然后设置<systemitem class="username">oracle</systemitem>帐号的shell为<filename>/compat/linux/bin/bash</filename></para>
      </sect3>

      <sect3 xml:id="linuxemu-environment">
        <title>环境</title>

	<para>除了普通的<application>&oracle;</application>变量外,
	比如<envar>ORACLE_HOME</envar><envar>ORACLE_SID</envar>,您还必须设置下面的环境变量:</para>

	<informaltable frame="none" pgwide="1">
	  <tgroup cols="2">
          <colspec colwidth="1*"/>
          <colspec colwidth="2*"/>
	    <thead>
	      <row>
		<entry>变量</entry>

		<entry></entry>
	      </row>
	    </thead>
	    <tbody>
	      <row>
		<entry><envar>LD_LIBRARY_PATH</envar></entry>

		<entry><literal>$ORACLE_HOME/lib</literal></entry>
	      </row>

	      <row>
		<entry><envar>CLASSPATH</envar></entry>

		<entry><literal>$ORACLE_HOME/jdbc/lib/classes111.zip</literal></entry>
	      </row>

	      <row>
		<entry><envar>PATH</envar></entry>

		<entry><literal>/compat/linux/bin
/compat/linux/sbin
/compat/linux/usr/bin
/compat/linux/usr/sbin
/bin
/sbin
/usr/bin
/usr/sbin
/usr/local/bin
$ORACLE_HOME/bin</literal></entry>
	      </row>
	    </tbody>
	  </tgroup>
	</informaltable>

        <para>建议在<filename>.profile</filename>里面设置所有的环境变量。一个完整的例子是:
	</para>

<programlisting>ORACLE_BASE=/oracle; export ORACLE_BASE
ORACLE_HOME=/oracle; export ORACLE_HOME
LD_LIBRARY_PATH=$ORACLE_HOME/lib
export LD_LIBRARY_PATH
ORACLE_SID=ORCL; export ORACLE_SID
ORACLE_TERM=386x; export ORACLE_TERM
CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip
export CLASSPATH
PATH=/compat/linux/bin:/compat/linux/sbin:/compat/linux/usr/bin
PATH=$PATH:/compat/linux/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin
PATH=$PATH:/usr/local/bin:$ORACLE_HOME/bin
export PATH</programlisting>
      </sect3>
    </sect2>

    <sect2>
      <title>安装&oracle;</title>

      <para>由于 Linux 模拟器的一处小小的差异, 您必须在 <filename>/var/tmp</filename>
	中创建一个名为 <filename>.oracle</filename> 的目录才能够启动安装程序。
	需要把它设置为属于 <systemitem class="username">oracle</systemitem> 用户。 接下来,
	您就可以毫无问题地安装 <application>&oracle;</application> 了。
	如果您遇到问题, 请首先检查 <application>&oracle;</application>
	软件包和/或配置文件!安装完 <application>&oracle;</application>
	之后, 使用下面两节中所说的补丁。</para>

      <para>一个比较常见的问题是 TCP 协议适配器安装不正确。
	其结果是将无法进行任何的 TCP 侦听。 下面的操作将帮助解决此问题:</para>

      <screen>&prompt.root; <userinput>cd $ORACLE_HOME/network/lib</userinput>
&prompt.root; <userinput>make -f ins_network.mk ntcontab.o</userinput>
&prompt.root; <userinput>cd $ORACLE_HOME/lib</userinput>
&prompt.root; <userinput>ar r libnetwork.a ntcontab.o</userinput>
&prompt.root; <userinput>cd $ORACLE_HOME/network/lib</userinput>
&prompt.root; <userinput>make -f ins_network.mk install</userinput></screen>

      <para>不要忘记了再运行一下<filename>root.sh</filename></para>

    <sect3 xml:id="linuxemu-patch-root">
      <title>修补root.sh</title>

	<para>从CD安装<application>&oracle;</application>时,一些工作需要在<systemitem class="username">root</systemitem>下执行,
	这些工作都被记录在一个叫<filename>root.sh</filename>的脚本里面。这个脚本被写在<filename>orainst</filename>目录。
	为了使用<filename>root.sh</filename>来正确定位<command>chown</command>或在Linux本地shell下执行脚本,
	应该对它进行修补。</para>

	<programlisting>*** orainst/root.sh.orig Tue Oct 6 21:57:33 1998
--- orainst/root.sh Mon Dec 28 15:58:53 1998
***************
*** 31,37 ****
# This is the default value for CHOWN
# It will redefined later in this script for those ports
# which have it conditionally defined in ss_install.h
! CHOWN=/bin/chown
#
# Define variables to be used in this script
--- 31,37 ----
# This is the default value for CHOWN
# It will redefined later in this script for those ports
# which have it conditionally defined in ss_install.h
! CHOWN=/usr/sbin/chown
#
# Define variables to be used in this script</programlisting>

	<para>当您不从CD安装<application>&oracle;</application>时,
	您可以从源代码来修补<filename>root.sh</filename>。
	它叫做<filename>rthd.sh</filename>,定位在源代码树的<filename>orainst</filename>目录。
	</para>
      </sect3>

      <sect3 xml:id="linuxemu-patch-tcl">
	<title>修补genclntsh</title>

	<para><command>genclntsh</command>脚本用来创建一个简单的共享客户端库。在建立demos时被使用。
	完成补丁后就注释掉了下面的<envar>PATH</envar>变量:</para>

	<programlisting>*** bin/genclntsh.orig Wed Sep 30 07:37:19 1998
--- bin/genclntsh Tue Dec 22 15:36:49 1998
***************
*** 32,38 ****
#
# Explicit path to ensure that we're using the correct commands
#PATH=/usr/bin:/usr/ccs/bin export PATH
! PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH
#
# each product MUST provide a $PRODUCT/admin/shrept.lst
--- 32,38 ----
#
# Explicit path to ensure that we're using the correct commands
#PATH=/usr/bin:/usr/ccs/bin export PATH
! #PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH
#
# each product MUST provide a $PRODUCT/admin/shrept.lst</programlisting>
      </sect3>
    </sect2>

    <sect2>
      <title>运行&oracle;</title>

      <para>如果您已经按上面的指示去操作,您应该可以像在Linux下运行<application>&oracle;</application>了。 </para>
    </sect2>
  </sect1>
  ?>

  <sect1 xml:id="linuxemu-advanced">
    <title>高级主题</title>

    <para>此章节将讲述是 &linux; 二进制兼容如何工作的,
      内容基于 Terry Lambert <email>tlambert@primenet.com</email> (Message ID:
      <literal>&lt;199906020108.SAA07001@usr09.primenet.com&gt;</literal>)
      发表在 &a.chat; 的邮件。</para>

    <indexterm><primary>execution class loader</primary></indexterm>

    <para>&os; 有一个叫 <quote>execution class loader</quote> 的抽象层。
      它被嵌入进了 &man.execve.2; 系统调用。</para>

    <para>历史上 &unix; 加载器会依靠查看魔数
      (通常是文件的开头 48 个字节)来确认是否是系统已知的的二进制程序,
      如果是的话, 就会调用二进制程序加载器。</para>

    <para>如果它不是二进制类型的程序, &man.execve.2; 调用会返回一个错误,
      shell 则会把它当作 shell 命令执行。
      <quote>不论当前是哪一种 shell</quote> 都会默认做出此种假设。</para>

    <para>随后, &man.sh.1; 会检查开头的两个字符,
      如果它们是 <literal>:\n</literal>, 那么就调用 &man.csh.1;。</para>

    <para>&os; 有一份加载器列表而不是一个单一的加载器, 并能回退到
      <literal>#!</literal> 加载器来运行 shell 解释器或者 shell 脚本。</para>

    <indexterm>
      <primary>ELF</primary>
    </indexterm>

    <indexterm>
      <primary>Solaris</primary>
    </indexterm>

    <para>为了支持 &linux; <acronym>ABI</acronym>&os; 看到了二进制 ELF 程序的魔数。
      ELF 加载器会查找一个专用的 <emphasis>标记</emphasis>,
      那是在 ELF 镜像中的一个注释部分, 
      此区域在 SVR4/&solaris; ELF 二进制中并不存在。</para>

    <para>要运行 &linux; 二进制程序,
      必须先使用 &man.brandelf.1; 命令 <emphasis>标记</emphasis><literal>Linux</literal> 类型:</para>

    <screen>&prompt.root; <userinput>brandelf -t Linux file</userinput></screen>

    <indexterm>
      <primary>ELF</primary>
      <secondary>标记</secondary>
    </indexterm>

    <para>当 ELF 加载器看到了 <literal>Linux</literal>
      标记,便会替换 <literal>proc</literal> 结构中的一个指针。
      所有的系统调用都通过此指针来索引。 除此以外,
      进程被标记以便对 signal trampoline 代码的陷阱向量做特殊处理,
      还有一些其他由 &linux; 内核模块来处理的(细微)修补。</para>

    <para>&linux; 系统调用向量包含一个 <literal>sysent[]</literal>
      记录的列表, 它的地址位于内核模块之中。</para>

    <para>当一个系统调用被 &linux; 二进制程序调用时,
      陷阱代码会把系统调用函数指针从 <literal>proc</literal> 
      解引用至 &linux; 而不是 &os; 的系统调用入口。</para>

    <para>&linux; 模式会动态地 <emphasis>reroots</emphasis> 查找。
      这与 <option>union</option> 文件系统选项是等效的。
      首先会试图在 <filename
    class="directory">/compat/linux/<replaceable>original-path</replaceable></filename>
      目录查找文件。 如果失败了, 就会在 <filename
    class="directory">/<replaceable>original-path</replaceable></filename>
      目录下查找。 这使得需要其它程序的程序得以运行。 例如,&linux;
      工具链都可以在 &linux; <acronym>ABI</acronym> 的支持下运行。
      也就是说 &linux; 二进制程序可以加载并执行 &os; 二进制程序,
      如果当前没有相应的 &linux; 二进制程序,
      可以在 <filename>/compat/linux</filename> 目录树中放置一个
      &man.uname.1; 命令, 使 &linux; 程序不易察觉它们并没有运行在 &linux;
      系统上。</para>

    <para>事实上, 在 &os; 内核中有一个 &linux; 内核。
      所有由内核提供的服务的各种底层功能在 &os; 系统调用表的记录和 &linux;
      系统调用表的记录是一样的: 文件系统操作, 虚拟内存操作,
      信号发送, 和 System V IPC。 唯一的不同是 &os; 会得到 &os;<emphasis>glue</emphasis> 功能, 而 &linux; 程序会得到 &linux;<emphasis>glue</emphasis> 功能。 &os;<emphasis>glue</emphasis>
      功能是静态链接入内核的, 而 &linux;<emphasis>glue</emphasis> 
      功能可以静态链接, 或者通过内核模块访问。</para>

    <para>严格说来其实并没有真正的模拟, 这是一种 <acronym>ABI</acronym>
      的实现。 有时这被称为 <quote>&linux; 模拟</quote> 
      是因为在实现的时候还没有其他适合的词用来描述。
      要说 &os; 运行 &linux; 二进制程序并不确切,
      因为当时代码并还没有被编译进去。</para>
    </sect1>
</chapter>