Difference between revisions of "Porting the kernel"
(kernel internals) |
Botinki Kira (talk | contribs) m (Robot: Automated text replacement (-VE0 +CT0)) |
||
Line 9: | Line 9: | ||
* <code>task->pid</code> should be changed with <code>virt_pid(task)</code> in some places. The rule is simple: user should see only virtual pids, while kernel operate on global pids. e.g. in signals, virtual pid should be delivered to app. | * <code>task->pid</code> should be changed with <code>virt_pid(task)</code> in some places. The rule is simple: user should see only virtual pids, while kernel operate on global pids. e.g. in signals, virtual pid should be delivered to app. | ||
− | * In interrupt handlers one need to set global host ([[ | + | * In interrupt handlers one need to set global host ([[CT0]]) context. i.e. <code>set_exec_env()</code>, <code>set_exec_ub()</code>. i.e. interrupt handlers are running in CT0 context. |
* In <code>kernel_thread()</code> one needs to prohibit kernel threads in VE. Mostly security related... | * In <code>kernel_thread()</code> one needs to prohibit kernel threads in VE. Mostly security related... |
Revision as of 11:44, 11 March 2008
OpenVZ kernel supports x86, x86_64, IA64, power64, and sparc architectures as of now. Below are the quick and dirty information about how to port the kernel to yet another architecture.
- UBC: need to account any platform specific VMAs created by hand in arch specific code. i.e. if there are calls of
insert_vm_struct()
this should be accounted withub_memory_charge()
. Didn't find such thing on sparc64.
- If there are user triggerable
printk()
's (related to the user, not the system as a whole) better replace them withve_printk()
. Otherwise user can flood (DoS). minor actually.
- Call to functions
find_task_by_pid()
,for_each_process()
anddo_each_thread()
/while_each_thread()
should be replaced with it's counterparts -find_task_by_pid_XXX()
,for_each_process_XXX()
anddo_each_thread_XXX()
/while_each_thread_XXX()
, whereXXX
is eitherall
orve
. Hereall
means that all system processes in the system will be scanned, whileve
means that only the VE accessible from this task (current context -get_exec_env()
) will be visible. So you need to decide whether the code in question is about system or user context.
task->pid
should be changed withvirt_pid(task)
in some places. The rule is simple: user should see only virtual pids, while kernel operate on global pids. e.g. in signals, virtual pid should be delivered to app.
- In interrupt handlers one need to set global host (CT0) context. i.e.
set_exec_env()
,set_exec_ub()
. i.e. interrupt handlers are running in CT0 context.
- In
kernel_thread()
one needs to prohibit kernel threads in VE. Mostly security related...
- Extend
show_registers()
(orshow_regs()
) to show current VE.
utsname
should be virtualized. This mostly means thatsystem_utsnames
should be replaced withve_utsname
. See any arch code for this.
- Some exports will be required. e.g.
show_mem()
and probablycpu_khz
. Easy.
- Everything else are bugfixes.
All these are straightforward and really simple, so it should take a few hours to do.