forked from apple/darwin-xnu
-
Notifications
You must be signed in to change notification settings - Fork 0
/
README
271 lines (190 loc) · 10.1 KB
/
README
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
Table of contents:
A. How to build XNU
B. How to install a new header file from XNU
=============================================
A. How to build XNU:
1) Type: "make"
This builds all the components for kernel, architecture, and machine
configurations defined in TARGET_CONFIGS. Additionally, we also support
architectures defined in ARCH_CONFIGS and kernel configurations defined in
KERNEL_CONFIGS. Note that TARGET_CONFIGS overrides any configurations defined
in ARCH_CONFIGS and KERNEL_CONFIGS.
By default, architecture defaults to the build machine
architecture, and the kernel configuration is set to build for DEVELOPMENT.
The machine configuration defaults to MX31ADS for arm and nothing for i386 and ppc.
This will also create a bootable image, mach_kernel, and a kernel binary
with symbols, mach_kernel.sys.
Here are the valid arm machine configs:
LN2410SBC MX31ADS INTEGRATORCP S5I3000SMDK S5L8900XFPGA S5L8900XRB
OLOCREEK
Examples:
/* make a debug kernel for MX31 arm board */
make TARGET_CONFIGS="debug arm MX31ADS"
$(OBJROOT)/DEBUG_ARM_MX31ADS/osfmk/DEBUG/osfmk.o: pre-linked object for osfmk component
$(OBJROOT)/DEBUG_ARM_MX31ADS/mach_kernel: bootable image
/* make debug and development kernels for MX31 arm board */
make TARGET_CONFIGS="debug arm MX31ADS development arm MX31ADS"
$(OBJROOT)/DEBUG_ARM_MX31ADS/osfmk/DEBUG/osfmk.o: pre-linked object for osfmk component
$(OBJROOT)/DEBUG_ARM_MX31ADS/mach_kernel: bootable image
$(OBJROOT)/DEVELOPMENT_ARM/osfmk/DEVELOPMENT/osfmk.o: pre-linked object for osfmk component
$(OBJROOT)/DEVELOPMENT_ARM/mach_kernel: bootable image
/* this is all you need to do to build MX31ADS arm with DEVELOPMENT kernel configuration */
make TARGET_CONFIGS="default arm default"
or the following is equivalent
make ARCH_CONFIGS=ARM
2) Building a Component
Go to the top directory in your XNU project.
If you are using a sh-style shell, run the following command:
$ . SETUP/setup.sh
If you are using a csh-style shell, run the following command:
% source SETUP/setup.csh
This will define the following environmental variables:
SRCROOT, OBJROOT, DSTROOT, SYMROOT
From a component top directory:
$ make all
This builds a component for all architectures, kernel configurations, and
machine configurations defined in TARGET_CONFIGS (or alternately ARCH_CONFIGS
and KERNEL_CONFIGS).
Example:
$(OBJROOT)/RELEASE_PPC/osfmk/RELEASE/osfmk.o: pre-linked object for osfmk component
From the component top directory:
$ make mach_kernel
This includes your component in the bootable image, mach_kernel, and
in the kernel binary with symbols, mach_kernel.sys.
WARNING: If a component header file has been modified, you will have to do
the above procedure 1.
3) Building DEBUG
Define kernel configuration to DEBUG in your environment or when running a
make command. Then, apply procedures 4, 5
$ make TARGET_CONFIGS="DEBUG PPC DEFAULT" all
or
$ make KERNEL_CONFIGS=DEBUG all
or
$ export TARGET_CONFIGS="DEBUG ARM MX31ADS"
$ make all
Example:
$(OBJROOT)/DEBUG_PPC/osfmk/DEBUG/osfmk.o: pre-linked object for osfmk component
$(OBJROOT)/DEBUG_PPC/mach_kernel: bootable image
4) Building fat
Define architectures in your environment or when running a make command.
Apply procedures 3, 4, 5
$ make TARGET_CONFIGS="RELEASE PPC default RELEASE I386 default" exporthdrs all
or
$ make ARCH_CONFIGS="PPC I386" exporthdrs all
or
$ export ARCH_CONFIGS="PPC I386"
$ make exporthdrs all
5) Verbose make
To display complete tool invocations rather than an abbreviated version,
$ make VERBOSE=YES
6) Debug information formats
By default, a DWARF debug information repository is created during the install phase; this is a "bundle" named mach_kernel.dSYM
To select the older STABS debug information format (where debug information is embedded in the mach_kernel.sys image), set the BUILD_STABS environment variable.
$ export BUILD_STABS=1
$ make
7) Build check before integration
From the top directory, run:
$ ~rc/bin/buildit . -arch ppc -arch i386 -noinstallsrc -nosum
or for multiple arm builds
$ ~rc/bin/buildit . -noinstallsrc -nosum -- TARGET_CONFIGS="release arm MX31ADS release arm LN2410SBC"
or for default arm build (kernel config DEVELOPMENT and machine config MX31ADS)
$ ~rc/bin/buildit . -arch arm -noinstallsrc -nosum -- TARGET_CONFIGS="release arm MX31ADS release arm LN2410SBC"
8) Creating tags and cscope
Set up your build environment as per instructions in 2a
From the top directory, run:
$ make tags # this will build ctags and etags on a case-sensitive
# volume, only ctags on case-insensitive
$ make TAGS # this will build etags
$ make cscope # this will build cscope database
=============================================
B. How to install a new header file from XNU
[Note: This does not covers installing header file in IOKit framework]
1) XNU installs header files at the following locations -
a. $(DSTROOT)/System/Library/Frameworks/Kernel.framework/Headers
b. $(DSTROOT)/System/Library/Frameworks/Kernel.framework/PrivateHeaders
c. $(DSTROOT)/System/Library/Frameworks/System.framework/Headers
d. $(DSTROOT)/System/Library/Frameworks/System.framework/PrivateHeaders
e. $(DSTROOT)/usr/include/
Kernel.framework is used by kernel extensions. System.framework
and /usr/include are used by user level applications. The header
files in framework's "PrivateHeaders" are only available for Apple
Internal development.
2) The directory containing the header file should have a Makefile that
creates the list of files that should be installed at different locations.
If you are adding first header file in a directory, you will need to
create Makefile similar to xnu/bsd/sys/Makefile.
Add your header file to the correct file list depending on where you want
to install it. The default locations where the header files are installed
from each file list are -
a. DATAFILES : To make header file available in user level -
$(DSTROOT)/System/Library/Frameworks/System.framework/Headers
$(DSTROOT)/System/Library/Frameworks/System.framework/PrivateHeaders
$(DSTROOT)/usr/include/
b. PRIVATE_DATAFILES : To make header file available to Apple internal in
user level -
$(DSTROOT)/System/Library/Frameworks/System.framework/PrivateHeaders
c. KERNELFILES : To make header file available in kernel level -
$(DSTROOT)/System/Library/Frameworks/Kernel.framework/Headers
$(DSTROOT)/System/Library/Frameworks/Kernel.framework/PrivateHeaders
d. PRIVATE_KERNELFILES : To make header file available to Apple internal
for kernel extensions -
$(DSTROOT)/System/Library/Frameworks/Kernel.framework/PrivateHeaders
3) The Makefile combines the file lists mentioned above into different
install lists which are used by build system to install the header files.
If the install list that you are interested does not exists, create it
by adding the appropriate file lists. The default install lists, its
member file lists and their default location are described below -
a. INSTALL_MI_LIST : Installs header file to location that is available to
everyone in user level.
Locations -
$(DSTROOT)/System/Library/Frameworks/System.framework/Headers
$(DSTROOT)/usr/include/
Definition -
INSTALL_MI_LIST = ${DATAFILES}
b. INSTALL_MI_LCL_LIST : Installs header file to location that is available
for Apple internal in user level.
Locations -
$(DSTROOT)/System/Library/Frameworks/System.framework/PrivateHeaders
Definition -
INSTALL_MI_LCL_LIST = ${DATAFILES} ${PRIVATE_DATAFILES}
c. INSTALL_KF_MI_LIST : Installs header file to location that is available
to everyone for kernel extensions.
Locations -
$(DSTROOT)/System/Library/Frameworks/Kernel.framework/Headers
Definition -
INSTALL_KF_MI_LIST = ${KERNELFILES}
d. INSTALL_KF_MI_LCL_LIST : Installs header file to location that is
available for Apple internal for kernel extensions.
Locations -
$(DSTROOT)/System/Library/Frameworks/Kernel.framework/PrivateHeaders
Definition -
INSTALL_KF_MI_LCL_LIST = ${KERNELFILES} ${PRIVATE_KERNELFILES}
4) If you want to install the header file in a sub-directory of the paths
described in (1), specify the directory name using two variable
INSTALL_MI_DIR and EXPORT_MI_DIR as follows -
INSTALL_MI_DIR = dirname
EXPORT_MI_DIR = dirname
5) A single header file can exist at different locations using the steps
mentioned above. However it might not be desirable to make all the code
in the header file available at all the locations. For example, you
want to export a function only to kernel level but not user level.
You can use C language's pre-processor directive (#ifdef, #endif, #ifndef)
to control the text generated before a header file is installed. The kernel
only includes the code if the conditional macro is TRUE and strips out
code for FALSE conditions from the header file.
Some pre-defined macros and their descriptions are -
a. PRIVATE : If true, code is available to all of the xnu kernel and is
not available in kernel extensions and user level header files. The
header files installed in all the paths described above in (1) will not
have code enclosed within this macro.
b. KERNEL_PRIVATE : Same as PRIVATE
c. BSD_KERNEL_PRIVATE : If true, code is available to the xnu/bsd part of
the kernel and is not available to rest of the kernel, kernel extensions
and user level header files. The header files installed in all the
paths described above in (1) will not have code enclosed within this
macro.
d. KERNEL : If true, code is available only in kernel and kernel
extensions and is not available in user level header files. Only the
header files installed in following paths will have the code -
$(DSTROOT)/System/Library/Frameworks/Kernel.framework/Headers
$(DSTROOT)/System/Library/Frameworks/Kernel.framework/PrivateHeaders