Compare commits
22 Commits
d2f61f0375
...
master
Author | SHA1 | Date | |
---|---|---|---|
facc5e260d
|
|||
73593ab097
|
|||
80e3970821 | |||
bf030d3bbc | |||
ff813fa852 | |||
42e3d86d85 | |||
073ed74509 | |||
05c0522be5
|
|||
ea06199191
|
|||
3ca41b5ccd
|
|||
67421082a4
|
|||
7288b76533
|
|||
a14dd79336
|
|||
4d16bc39ad
|
|||
d66796a3ef
|
|||
ee5685589f
|
|||
6fdb8a56f7
|
|||
a2abd41d12
|
|||
27e0151fa1
|
|||
c3cfdefc0d
|
|||
69fe1b31ec | |||
e7d2b6acb4
|
11
.gitignore
vendored
11
.gitignore
vendored
@ -1,2 +1,11 @@
|
||||
public/
|
||||
static/processed_images/
|
||||
static/processed_images/
|
||||
*.log
|
||||
cv/*.gz
|
||||
cv/*.xml
|
||||
*.aux
|
||||
*.bbl
|
||||
*.bcf
|
||||
*.blg
|
||||
*.out
|
||||
cv/*.pdf
|
@ -2,7 +2,7 @@ base_url = "https://jackbondpreston.me"
|
||||
compile_sass = true
|
||||
build_search_index = false
|
||||
|
||||
generate_feed = true
|
||||
generate_feeds = true
|
||||
|
||||
[markdown]
|
||||
highlight_code = true
|
||||
|
@ -11,17 +11,17 @@ insert_anchor_links = "right"
|
||||
## contact
|
||||
you can contact me via [email](mailto:jackbondpreston@outlook.com) or on [linkedin](https://www.linkedin.com/in/jack-bond-preston-922706150/)
|
||||
|
||||
my cv is available for viewing [here](cv.pdf).
|
||||
my cv is available for viewing [here](cv.pdf)
|
||||
|
||||
## open source
|
||||
|
||||
i have personal accounts on [github](https://github.com/jackbondpreston) and [gitlab](https://gitlab.com/jackbondpreston)
|
||||
some of my personal repositories are available [here](https://git.jackbondpreston.me)
|
||||
|
||||
my merged [dpdk](https://www.dpdk.org/) work can be found on [the project's repository](https://git.dpdk.org/dpdk/log/?qt=author&q=jack.bond-preston%40foss.arm.com)
|
||||
|
||||
my public [onload](https://www.xilinx.com/products/boards-and-kits/x2-series/onload.html) commits at amd can be found on [the github repo](https://github.com/Xilinx-CNS/onload)
|
||||
|
||||
some of my work at arm on [morello](https://www.arm.com/architecture/cpu/morello) is available on the [morello musl gitlab](https://git.morello-project.org/morello/musl-libc/-/commits/morello/master?author=Jack%20Bond-Preston)
|
||||
|
||||
|
||||
my [onload](https://www.xilinx.com/products/boards-and-kits/x2-series/onload.html) commits at amd can be found on [the github repo](https://github.com/Xilinx-CNS/onload/commits?author=jbondpre-amd)
|
||||
|
||||
|
||||
<h2>articles<a href="/feed.xml" class="atom-link">[atom feed]</a></h2>
|
||||
<h2>articles<a href="/atom.xml" class="atom-link">[atom feed]</a></h2>
|
@ -117,13 +117,13 @@ $ ./ptrs_as_numbers
|
||||
*(7fff98640c28)=9999
|
||||
```
|
||||
|
||||
yikes! now, when you start messing with pointers like this, you're bound to run into a bunch of undefined behaviour. but C programmers write undefined behaviour all the time (and not always by accident), and my computer executes this program fine without complaining at all. doesn't it feel a bit weird that we can take a pointer to `arr[0]` and modify it to load `secret`? they're not even part of the same array...
|
||||
yikes! now, when you start messing with pointers like this, you're bound to run into a bunch of undefined behaviour. but C programmers write undefined behaviour all the time (and not always by accident), and my computer executes this program fine without complaining at all. doesn't it feel a bit weird that we can take a pointer to `arr[0]` and modify it to load `magic`? they're not even part of the same array...
|
||||
|
||||
|
||||
## introducting capabilities
|
||||
CHERI introduces capabilities, which can be thought of as an extension to pointers. they still store an address of something we care about, but they have extra information too! in a 64-bit system, a pointer would typically be a 64-bit value (as dicussed previously). the corresponding capability in a CHERI platform is 128 bits (or 129 bits if you look at it a certain way, more about that later).
|
||||
|
||||
as you might have guessed, this "extra information" takes up 64 bits of the capability. bits are assigned to three key pieces of metadata: *bounds*, *permissions*, and *object type*. there is also an additional 1-bit _tag_ which is stored out-of-band: it is not a 129-bit value - instead each 128-bit capability can be thought of as being associated with a 1-bit validity tag. the architecture manages this association for us. the diagram below is provided as a rough overview of this. note that it is not to scale.
|
||||
as you might have guessed, this "extra information" takes up extra bits of the capability (how much is actually a little complicated - we will touch on that). bits are assigned to three key pieces of metadata: *bounds*, *permissions*, and *object type*. there is also an additional 1-bit _tag_ which is stored out-of-band: it is not a 129-bit value - instead each 128-bit capability can be thought of as being associated with a 1-bit validity tag. the architecture manages this association for us. the diagram below is provided as a rough overview of this. note that it is not to scale.
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 314"><defs><style>.prefix__c{fill:none;stroke:#fcfcfc;stroke-linecap:square;stroke-miterlimit:10;stroke-width:3px}.prefix__f,.prefix__g{fill:#fcfcfc}.prefix__f{font-family:Source Code Pro;font-size:20px}</style></defs><g id="prefix__a"><path fill="#0c1114" d="M0 0h1920v314H0z"/><text transform="translate(101.86 232.41)" font-family="Source Code Pro" font-weight="700" fill="#fcfcfc" font-size="24"><tspan x="0" y="0">int *x (capability)</tspan></text><text transform="translate(1205.97 232.1)" font-family="Source Code Pro" fill="#fcfcfc" font-size="24"><tspan x="0" y="0">0x0000010000000004</tspan></text><path class="prefix__c" d="M1016 261v18.5M1656 261v18.5M1016 279.5h640"/><text class="prefix__f" transform="translate(1293.78 296.33)"><tspan x="0" y="0">address</tspan></text><path class="prefix__c" d="M700 191.5V173M1020 191.5V173M700 173h320"/><text class="prefix__f" transform="translate(823.78 167.74)"><tspan x="0" y="0">bounds</tspan></text><path class="prefix__c" d="M554 260.34v18.5M704 260.34v18.5M554 278.84h150"/><text class="prefix__f" transform="translate(562.78 295.68)"><tspan x="0" y="0">object type</tspan></text><g><path class="prefix__c" d="M391.89 191.56v-18.5M541.89 191.56v-18.5M391.89 173.06h150"/></g><text class="prefix__f" transform="translate(400.67 167.8)"><tspan x="0" y="0">permissions</tspan></text><text class="prefix__f" transform="translate(304.67 31.07)"><tspan x="0" y="0">tag (out-of-band)</tspan></text><g><path class="prefix__c" d="M391.33 55.92v-18.5M421.33 55.92v-18.5M391.33 37.42h30"/></g></g><g id="prefix__b"><path class="prefix__g" d="M1651.66 205.93v40h-632v-40h632m4-4h-640v48h640v-48z"/><path class="prefix__g" d="M1016 206v40H704v-40h312m4-4H700v48h320v-48z"/><path class="prefix__g" d="M700 206v40H558v-40h142m4-4H554v48h150v-48z"/><path class="prefix__g" d="M554 206v40h-12v-40h12m4-4h-20v48h20v-48z"/><path class="prefix__g" d="M538 206v40H396v-40h142m4-4H392v48h150v-48zM418.5 70v40h-22V70h22m4-4h-30v48h30V66z"/></g></svg>
|
||||
|
||||
|
13
content/dpdk-summit-2024.md
Normal file
13
content/dpdk-summit-2024.md
Normal file
@ -0,0 +1,13 @@
|
||||
+++
|
||||
title = "DPDK Summit 2024: OpenSSL Crypto PMD - Analysis and Optimisations"
|
||||
date = 2024-10-23
|
||||
+++
|
||||
|
||||
# Summary
|
||||
this year I had the opportunity to present my recent work on [DPDK](https://www.dpdk.org/). the work consists of performance analysis and optimisations to the OpenSSL crypto poll mode driver (PMD). I identified several major performance flaws with the implementation, and integration with OpenSSL, and upstreamed changes to address these. the talk goes through the details of the findings, performance impacts of the changes, and discussions around future work.
|
||||
|
||||
# Recording
|
||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/sPhktvMBYhs?si=UInBMrAUxs2R_raf" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
|
||||
|
||||
# Slides
|
||||
[pdf of the slides used for the talk](/pdf/dpdksummit2024.pdf)
|
164
content/syscalls.md
Normal file
164
content/syscalls.md
Normal file
@ -0,0 +1,164 @@
|
||||
+++
|
||||
title = "Linux syscall hooking"
|
||||
date = 2024-09-26
|
||||
+++
|
||||
|
||||
sometimes, you might want to hook Linux syscalls from a binary. it's probably not for a very elegant reason, but I'm not here to judge. in this article we discuss a few options for doing this. these will be focussed on x86 platforms running Linux, but many of these techniques should also be possible on other ISAs, with appropriate changes.
|
||||
|
||||
## binary rewriting
|
||||
one way to approach the problem is simply to rewrite binaries at runtime. one can set executable text pages to be writeable, swap out some instructions, and then set them back to be read-only and executable. how can this look in practice?
|
||||
|
||||
one has to consider the limitations of binary rewriting in this manner. we can only replace syscall instructions with instructions of the same length. thus, we have limited flexibility in how to implement a syscall hooking function. absolute calls to some custom handler address would require further code modification than is possible, in order to prepare a register with the jump address. we can do relative jumps, but we need to find some space within the maximum range to put our handler function.
|
||||
|
||||
### zpoline
|
||||
zpoline{{ref(n=1)}} is one approach to get around these limitations, on x86 platforms. zpoline replaces all `syscall`/`sysenter` instructions with `call *%rax`. this takes advantage of two things:
|
||||
1. `rax` will always contain the target syscall number, thus holding a bounded low number. this allows us to rewrite the virtual memory in the range `[0x00, (SYSCALL_MAX + n)]` to have some custom handler code of length `n`.
|
||||
2. `call *%rax` is the same size as `syscall` (2 bytes){{ref(n=2)}}.
|
||||
this means we can `mmap(0)` at the start of runtime, and create fall-through nops, followed by a jump to a syscall hook function. the performance of this should be pretty good, not much different to adding an extra function call to each syscall, which is all we want to do anyway.
|
||||
|
||||
okay, but is it ok to `mmap()` the zero virtual address? well, not really. for starters, you probably can't do it as a non-privileged user. Linux has a setting `mmap_min_addr`, which disallows any `mmap()`s below a given address{{ref(n=3)}}. secondly, this can cause certain null-pointer bugs to exhibit weird behaviour, instead of throwing segmentation faults.
|
||||
|
||||
thus, this option does work, and may be suitable for certain usecases, but it does have large flaws (like all of the options).
|
||||
|
||||
### custom trampolines
|
||||
an alternative that doesn't involve `mmap()`ing the zero page is used by AMD's Onload{{ref(n=4)}} - try to replace
|
||||
```
|
||||
b8 NN NN NN NN mov eax,0xN ; N = syscall number
|
||||
0f 05 syscall
|
||||
```
|
||||
with
|
||||
```
|
||||
b8 TT TT TT TT mov eax,0xTTTTTTTT ; 0xTTTTTTTT = trampoline func address
|
||||
ff d0 call rax
|
||||
```
|
||||
where `0xTTTTTTTT` is the address of some trampoline function we have crafted. we can get an address to put this function at by using `mmap(..., MMAP_32BIT)`.
|
||||
|
||||
another option here is to try to get some virtual memory within a certain distance from the syscall code, and use relative call instructions.
|
||||
|
||||
note that this method is not as reliable. it relies on being able to find syscall-performing code which can be modified in this way, which is not guaranteed. thus, it could fail in some situations. it does circumvent the requirement for an ugly `mmap(0)`, however.
|
||||
|
||||
## syscall user dispatch (SUD)
|
||||
SUD{{ref(n=5)}} is probably the most "correct" way to go about doing this. this kernel feature was initially created for Wine. SUD allows the userspace program to request the kernel traps all syscalls, raising a `SIGSYS` signal every time. a certain range of program memory can be excluded from this trapping, and a flag can be used to toggle trapping off or on at runtime (although the excluded range will never trap, regardless of this flag).
|
||||
|
||||
this is is enabled via `prctl()`:
|
||||
```c
|
||||
int prctl(PR_SET_SYSCALL_USER_DISPATCH, PR_SYS_DISPATCH_ON, unsigned long off, unsigned long size, int8_t *switch);
|
||||
int prctl(PR_SET_SYSCALL_USER_DISPATCH, PR_SYS_DISPATCH_OFF, 0L, 0L, 0L);
|
||||
```
|
||||
where `off` is the start of the non-trapping memory region, and `size` is it's length. `switch` is a pointer to the aforementioned toggleable flag.
|
||||
|
||||
here is a very basic example of using SUD:
|
||||
```c
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <signal.h>
|
||||
#include <sys/prctl.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
|
||||
bool selector = SYSCALL_DISPATCH_FILTER_ALLOW;
|
||||
|
||||
static volatile void handle_sigsys(int sig, siginfo_t *info, void *ucontext) {
|
||||
char buf[128];
|
||||
int len;
|
||||
int ret;
|
||||
|
||||
len = snprintf(buf, 1024, "Caught syscall with number 0x%x\n", info->si_syscall);
|
||||
selector = SYSCALL_DISPATCH_FILTER_ALLOW;
|
||||
write(1, buf, len);
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
int err;
|
||||
|
||||
/* install SIGSYS signal handler */
|
||||
struct sigaction act;
|
||||
memset(&act, 0, sizeof(act));
|
||||
|
||||
sigset_t mask;
|
||||
sigemptyset(&mask);
|
||||
|
||||
act.sa_sigaction = handle_sigsys;
|
||||
act.sa_flags = SA_SIGINFO;
|
||||
act.sa_mask = mask;
|
||||
|
||||
if (err = sigaction(SIGSYS, &act, NULL)) {
|
||||
printf("sigaction failed: %d\n", err);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
/* enable SUD */
|
||||
if (err = prctl(PR_SET_SYSCALL_USER_DISPATCH, PR_SYS_DISPATCH_ON, 0, 0, &selector)) {
|
||||
printf("prctl failed: %d\n", err);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
selector = SYSCALL_DISPATCH_FILTER_BLOCK;
|
||||
syscall(SYS_write);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
running this will produce the following:
|
||||
```
|
||||
Caught syscall with number 0x38
|
||||
```
|
||||
where syscall number `0x38` is `SYS_write` (on my system).
|
||||
|
||||
{% note(header="note") %}
|
||||
we've had to disable syscall hooking within `handle_sigsys()`, before we perform the `write` syscall. this could also be achieved using the offset exclusion mechanism, with a caveat: SUD also needs to be disabled at signal handler return. this is because, depending on some factors, the signal handler will return to a signal trampoline, which exists somewhere else in memory (VDSO or libc). this trampoline will then perform the `sigreturn` syscall, which - if you had only excluded the handler function memory itself - would cause us to raise a `SIGSYS` inside a `SIGSYS` handler (oops).
|
||||
{% end %}
|
||||
|
||||
SUD should have pretty good performance, although it is still switching from user space to kernel space (on syscall), and back again (on SIGSYS handling) - unlike the binary rewriting methods.
|
||||
|
||||
## rewriting the kernel syscall table
|
||||
Linux kernel modules could also try to patch the kernel's syscall table.
|
||||
|
||||
it used to be the case that if Linux is configured with `CONFIG_KALLSYMS_ALL=y`:
|
||||
```shell
|
||||
$ zgrep CONFIG_KALLSYMS_ALL /proc/config.gz
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
```
|
||||
then we can find the address of the syscall table in `kallsyms`:
|
||||
```shell
|
||||
$ sudo grep sys_call_table /proc/kallsyms
|
||||
ffffffff854017e0 D sys_call_table
|
||||
```
|
||||
and thus programmatically:
|
||||
```c
|
||||
void *sys_call_table = kallsyms_lookup_name("sys_call_table");
|
||||
```
|
||||
once the syscall table address has been obtained, the handlers for specific syscall(s) could then be overwritten, in order to hook them.
|
||||
however, this kind of symbol lookup was generally considered very naughty, and `kallsyms_lookup_name()` was unexported in Linux 5.7{{ref(n=6)}}. there should be some feasible alternatives to do the same thing, but they would be slower, uglier, and more painful.
|
||||
|
||||
## modifying IA32_LSTAR MSR
|
||||
|
||||
another method which has been used successfully{{ref(n=7)}} involves rewriting the x86 MSR `IA32_LSTAR`. this register holds the destination address which the CPU will load into `RIP` when taking a syscall{{ref(n=2)}}. one can write a kernel module which modifies this register to contain a custom syscall handler address. this syscall handler function can hook syscalls before dispatching as normal (or not).
|
||||
|
||||
now that `kallsysms_lookup_name()` is no longer exported, this method also becomes problematic. as the example kernel module in {{ref(n=7,nosup=true)}} demonstrates, we still need to be able to grab some kernel symbol addresses in order to correctly implement the dispatcher.
|
||||
|
||||
however, this does propose another idea for implementing the previous method: using `IA32_LSTAR` to ascertain the address of the Linux syscall handler, instead of kallsyms. indeed, Onload has also exploited this method as a workaround for the unexporting of `kallsyms_lookup_name()`{{ref(n=8)}}.
|
||||
|
||||
|
||||
## citations
|
||||
|
||||
{{ defref(n=1, url="https://www.usenix.org/conference/atc23/presentation/yasukata") }}
|
||||
|
||||
{{ defref(n=2, url="https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html") }}
|
||||
|
||||
{{ defref(n=3, url="https://elixir.bootlin.com/linux/v6.11/source/arch/s390/mm/mmap.c#L137") }}
|
||||
|
||||
{{ defref(n=4, url="https://github.com/Xilinx-CNS/onload/blob/d5984bf52fcfba0cd75df8a1f8828f3363f6e164/src/lib/transport/unix/fdtable.c#L311") }}
|
||||
|
||||
{{ defref(n=5, url="https://docs.kernel.org/admin-guide/syscall-user-dispatch.html") }}
|
||||
|
||||
{{ defref(n=6, url="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0bd476e6c67190b5eb7b6e105c8db8ff61103281") }}
|
||||
|
||||
{{ defref(n=7, url="https://vvdveen.com/data/lstar.txt") }}
|
||||
|
||||
{{ defref(n=8, url="https://github.com/Xilinx-CNS/onload/blob/083e5959ef76632ae3cd3d4356fb079ce0c570d1/src/driver/linux_resource/syscall_x86.c#L347") }}
|
18
content/学中文学了一年了.md
Normal file
18
content/学中文学了一年了.md
Normal file
@ -0,0 +1,18 @@
|
||||
+++
|
||||
title = "学中文学了一年了"
|
||||
date = 2024-09-23
|
||||
+++
|
||||
|
||||
大约一年前,我开始认真地学习中文。因此,我觉得我应该写一下我的经历。
|
||||
|
||||
我刚开始学习时,我只用了一个方法:[Anki](https://apps.ankiweb.net/)卡片。我也认为在语言学习方法上,Anki是最有效的。但是为了提高听力和口语,它不太好。
|
||||
|
||||
这就是为什么去年我也开始在Italki上上课。因为[Italki](https://www.italki.com/)有很多的中文老师,所以你可以选择一个最适合你的学习方式的。对我来说,这是最有效方法提高我的口语。
|
||||
|
||||
因为在今年上半年的时候,我还感觉我的听力水平不好,所以我找了方法来提高。我发现了大部分人建议听博客,然后我找到一些有用的博客。我最喜欢的是这些:
|
||||
|
||||
1. [听故事说中文](https://open.spotify.com/show/04re9FvL1xviHGWvXKoAhZ?si=d7bc25d6f481427b)
|
||||
2. [猫咪中文](https://open.spotify.com/show/7sHdRAysnMygox20EuYlwp?si=6ec8583891484aef)
|
||||
3. [茶歇中文](https://open.spotify.com/show/6mJNegfDGmNaG1mWJtZJed?si=15f5851993d74a48)
|
||||
|
||||
未来将要发生什么?我还不知道,但是我希望我可以继续进步。明年三月我打算和我的对象一起去中国旅游。其实我十分期待这个旅行,因为我不但没去过中国,甚至连亚洲也没去过!既然中国菜非常好吃,我应该学习怎么流利地点菜。我也希望在中国我可以够有信心尝试和中国人聊聊天儿。
|
47
cv/main.tex
Normal file
47
cv/main.tex
Normal file
@ -0,0 +1,47 @@
|
||||
|
||||
\documentclass[letterpaper,11pt]{article}
|
||||
|
||||
% Choose bibliography style for formatting list of publications
|
||||
\usepackage[style=ieee,url=false,doi=false,maxbibnames=99,sorting=ydnt,dashed=false]{biblatex}
|
||||
\bibliography{papers}
|
||||
|
||||
% Choose theme, e.g. black, RedViolet, ForestGreen, MidnightBlue
|
||||
\def\theme{BlueViolet}
|
||||
|
||||
% More predefined colors can be found in
|
||||
% https://en.wikibooks.org/wiki/LaTeX/Colors
|
||||
% Example photograph taken from Wikimedia Commons
|
||||
% https://commons.wikimedia.org/wiki/File:Kiara_Krit_passport.jpg
|
||||
|
||||
|
||||
\usepackage{simplecv}
|
||||
|
||||
\boldname{Bond-Preston}{Jack}{Mr.}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\thispagestyle{empty}
|
||||
|
||||
% Heading
|
||||
\headinginline{Jack Bond-Preston}{
|
||||
Website: \website{jackbondpreston.me} \\
|
||||
Email: \email{jackbondpreston@outlook.com} \\
|
||||
LinkedIn: \linkedin{jack-bond-preston-922706150} \\
|
||||
}
|
||||
|
||||
% Page One
|
||||
\import{sections/}{experience.tex}
|
||||
\import{sections/}{skills.tex}
|
||||
|
||||
\pagebreak
|
||||
|
||||
% Page Two
|
||||
%\import{sections/}{teaching.tex}
|
||||
\import{sections/}{education.tex}
|
||||
\import{sections/}{publications.tex}
|
||||
\import{sections/}{languages.tex}
|
||||
%\import{sections/}{projects.tex}
|
||||
%\import{sections/}{awards.tex}
|
||||
%\import{sections/}{extracurricular.tex}
|
||||
|
||||
\end{document}
|
20
cv/sections/awards.tex
Normal file
20
cv/sections/awards.tex
Normal file
@ -0,0 +1,20 @@
|
||||
|
||||
\section{Scholarships and Awards}
|
||||
|
||||
\denseouterlist{
|
||||
|
||||
\entry{Some Scholarship \hfill 2018\textendash 2020}
|
||||
|
||||
\entry{Some Award \hfill 2018\fillyear{\textendash 2018}}
|
||||
|
||||
\entry{Some Award \hfill 2017\fillyear{\textendash 2017}}
|
||||
|
||||
\entry{Some Award \hfill 2016\fillyear{\textendash 2016}}
|
||||
|
||||
\entry{Some Scholarship \hfill 2013\textendash 2018}
|
||||
|
||||
\entry{Some Scholarship \hfill 2013\textendash 2018}
|
||||
|
||||
\entry{Some Award \hfill 2013\fillyear{\textendash 2013}}
|
||||
|
||||
}
|
9
cv/sections/education.tex
Normal file
9
cv/sections/education.tex
Normal file
@ -0,0 +1,9 @@
|
||||
|
||||
\section{Education}
|
||||
|
||||
\outerlist{
|
||||
|
||||
\entrybig
|
||||
{\textbf{University of Bristol}}{Bristol, UK}
|
||||
{BSc in Computer Science (1st Class Hons)}{2017\textendash 2020}
|
||||
}
|
59
cv/sections/experience.tex
Normal file
59
cv/sections/experience.tex
Normal file
@ -0,0 +1,59 @@
|
||||
|
||||
\section{Experience}
|
||||
|
||||
\outerlist{
|
||||
|
||||
\entrybig
|
||||
{\textbf{Arm Ltd.}}{Cambridge, UK (Hybrid)}
|
||||
{Software Engineer in Infrastructure Application Solutions group}{2023\textendash Current}
|
||||
\innerlist{
|
||||
\entry{Contributing to the open source DPDK (Data Plane Development Kit) project (using C), including making large performance improvements to the OpenSSL PMD (Poll-Mode Driver) - as well as changes to OpenSSL itself (using C and arm64 assembly).}
|
||||
\entry{Research and implementations in the area of HPC/AI infrastructure/networking, especially RDMA and memory management on heterogeneous memory systems - comprising work on projects including PyTorch (using C++ and Python), Gloo (using C++).}
|
||||
\entryextra{Coordinating collaboration between IAS and Secure Libraries teams, helping to ensure enablement of competitive IPSec performance on Arm platforms.}
|
||||
\entryextra{Technical mentorship for graduate engineer.}
|
||||
\entryextra{Code reviews across multiple projects including DPDK [C], PyTorch [C++, Python], OpenSSL [C, arm64 assembly], VPP [C], Snort3 [C++].}
|
||||
\entryextra{Knowledge sharing documents and presentations, especially around OpenSSL performance work and heterogeneous memory management.}
|
||||
}
|
||||
|
||||
\entrybig
|
||||
{\textbf{AMD (formerly Xilinx / Solarflare)}}{Cambridge, UK (Hybrid)}
|
||||
{Software Engineer in Adaptive and Embedded Computing Group}{2022\textendash 2023}
|
||||
\innerlist{
|
||||
\entry{Developing AMDs transparent, ultra-low-latency, kernel-bypass network stack - Onload - using C.}
|
||||
\entryextra{Performance optimisation and benchmarking/profiling work.}
|
||||
\entryextra{Improvements, debugging, and bugfixes for teaming/bonding support.}
|
||||
\entryextra{Extending and modernising internal automated tests}
|
||||
}
|
||||
|
||||
\entrybig
|
||||
{\textbf{Arm Ltd.}}{Cambridge, UK (Hybrid)}
|
||||
{Graduate Software Engineer in Open Source Software Group}{2021\textendash2022}
|
||||
\innerlist{
|
||||
\entry{Porting low-level software to the Morello (CHERI) platform.}
|
||||
\entryextra{Produced patches as part of a project porting the open-source C standard library implementation musl to a new prototype platform (using C and arm64 assembly).}
|
||||
\entryextra{Ported larger components of the C library, including the memory allocator and POSIX threads. Considered security and hardening against memory safety bugs at every stage of design and implementation.}
|
||||
\entryextra{Created a minimal test distribution of Linux for use on an Arm Fixed Virtual Platform, with the ability to run userspace applications in pure-capability mode. This provided the framework for adding FVP-based testing to the CI pipeline (alongside existing emulator-based testing) for further proof of functionality.}
|
||||
\entryextra{Liased with multiple teams to ensure coordination between libc, kernel ABI, compilers and debuggers.}
|
||||
}
|
||||
%
|
||||
%\entrybig
|
||||
% {\textbf{University of Bristol}}{Bristol, UK}
|
||||
% {Teaching Assistant in Department of Computer Science}{2019\textendash 2020}
|
||||
% \innerlist{
|
||||
% \entry{Delivered and created content for several Computer Science courses, including content involving operating systems, concurrency, and a software engineering project.}
|
||||
% \entryextra{Provided guidance and troubleshooting assistance to students in both in-person and online lab sessions, including for a course in which students develop a basic Armv7-A multitasking kernel.}
|
||||
% \entryextra{Interviewed students in viva-style coursework assessments, and assisted with subsequent coursework marking.}
|
||||
% \entryextra{Assisted with the creation and improvement of lab sheets (including skeleton and solution code).}
|
||||
% }
|
||||
|
||||
|
||||
% \entrybig
|
||||
% {\textbf{Evolve East Anglia CIC}}{Norwich, UK}
|
||||
% {Support Worker}{2020\textendash Current}
|
||||
% \innerlist{
|
||||
% \entry{Assisting vulnerable adults with transitioning to a permanent living situation after suffering mental difficulties.}
|
||||
% \entryextra{Handled crises swiftly, independently and effectively.}
|
||||
% \entryextra{Built upon existing communication skills and knowledge about wellbeing and mental health.}
|
||||
% }
|
||||
|
||||
}
|
22
cv/sections/extracurricular.tex
Normal file
22
cv/sections/extracurricular.tex
Normal file
@ -0,0 +1,22 @@
|
||||
|
||||
\section{Extracurricular Activities}
|
||||
|
||||
\denseouterlist{
|
||||
|
||||
\entrymid[\textbullet]
|
||||
{Member at Some Club}{2017\textendash Current}
|
||||
{Detailed explanation of what you do at this club}
|
||||
|
||||
\entrymid[\textbullet]
|
||||
{Member at Some Club}{2016\textendash 2017}
|
||||
{Detailed explanation of what you do at this club}
|
||||
|
||||
\entrymid[\textbullet]
|
||||
{Volunteer at Some Event}{Fall 2019}
|
||||
{Detailed explanation of what you do in this event}
|
||||
|
||||
\entrymid[\textbullet]
|
||||
{Volunteer at Some Event}{Winter 2015}
|
||||
{Detailed explanation of what you do in this event}
|
||||
|
||||
}
|
8
cv/sections/languages.tex
Normal file
8
cv/sections/languages.tex
Normal file
@ -0,0 +1,8 @@
|
||||
|
||||
\section{Languages}
|
||||
|
||||
\denseouterlist{
|
||||
\entry{\textbf{English:} Native}
|
||||
\entry{\textbf{Mandarin Chinese:} HSK 3 (2024)}
|
||||
\entry{\textbf{German:} CEFR A2 (2020)}
|
||||
}
|
28
cv/sections/projects.tex
Normal file
28
cv/sections/projects.tex
Normal file
@ -0,0 +1,28 @@
|
||||
|
||||
\section{Projects}
|
||||
|
||||
See full list of projects on \website{example.com/projects}
|
||||
\vspace{1em}
|
||||
|
||||
\begin{minipage}[t]{0.505\textwidth}
|
||||
|
||||
\outerlist{
|
||||
|
||||
\entrybig[\textbullet]
|
||||
{Project Title (Technology Used, 2019)}{}
|
||||
{Short explanation of the project}{}
|
||||
|
||||
}
|
||||
|
||||
\end{minipage}
|
||||
\begin{minipage}[t]{0.48\textwidth}
|
||||
|
||||
\outerlist{
|
||||
|
||||
\entrybig[\textbullet]
|
||||
{Project Title (Technology Used, 2019)}{}
|
||||
{Short explanation of the project}{}
|
||||
|
||||
}
|
||||
|
||||
\end{minipage}
|
13
cv/sections/publications.tex
Normal file
13
cv/sections/publications.tex
Normal file
@ -0,0 +1,13 @@
|
||||
|
||||
\section{Presentations}
|
||||
|
||||
\outerlist{
|
||||
|
||||
\entrybig
|
||||
{\textbf{DPDK Summit}}{Online Presentation}
|
||||
{\href{https://www.youtube.com/watch?v=sPhktvMBYhs}{OpenSSL Crypto PMD - Analysis and Optimisations}}{October 2024}
|
||||
\innerlist{
|
||||
\entry{Submitted and delivered a talk on my work optimising DPDK's OpenSSL Poll Mode Driver (PMD), along with potential future work and points requiring community coordination.}
|
||||
\entryextra{Fielded and answered numerous questions from community members.}
|
||||
}
|
||||
}
|
11
cv/sections/skills.tex
Normal file
11
cv/sections/skills.tex
Normal file
@ -0,0 +1,11 @@
|
||||
|
||||
\section{Skills}
|
||||
|
||||
\denseouterlist{
|
||||
\entry{\textbf{Programming Languages:} C, C++, Python, Assembly (x86-64 and AArch64)}
|
||||
\entry{\textbf{Debugging and Performance:} Perf, GDB \& LLDB, rr, Flamegraph, Wireshark}
|
||||
\entry{\textbf{Architecture:} Arm Architecture, Arm Standard Interconnects, PCIe, Heterogeneous Systems}
|
||||
\entry{\textbf{Build Systems:} GNU Make, CMake, Meson}
|
||||
\entry{\textbf{Software Engineering:} Python, Git, Gerrit, Linux, Shell Scripting, Agile, Jira}
|
||||
|
||||
}
|
12
cv/sections/teaching.tex
Normal file
12
cv/sections/teaching.tex
Normal file
@ -0,0 +1,12 @@
|
||||
|
||||
\section{Teaching}
|
||||
|
||||
\denseouterlist{
|
||||
|
||||
\entrymid[\textbullet]
|
||||
{\textbf{Head Teaching Assistant} at University Name}{Spring 2019}{Course Name (COURSE CODE)}
|
||||
|
||||
\entrymid[\textbullet]
|
||||
{\textbf{Teaching Assistant} at University Name}{Spring 2017}{Course Name (COURSE CODE)}
|
||||
|
||||
}
|
158
cv/simplecv.sty
Normal file
158
cv/simplecv.sty
Normal file
@ -0,0 +1,158 @@
|
||||
\ProvidesPackage{simplecv}
|
||||
|
||||
% Packages
|
||||
\usepackage[cm]{fullpage} % Margins
|
||||
\usepackage[hidelinks]{hyperref} % Hyperlinks
|
||||
\usepackage{titlesec} % Title formatting
|
||||
\usepackage{subfiles} % File importing
|
||||
\usepackage{multicol} % Multiple columns
|
||||
\usepackage[usenames,dvipsnames]{xcolor} % Coloring
|
||||
\usepackage{enumitem} % List customization
|
||||
\usepackage{lastpage} % Page numbering
|
||||
\usepackage{fancyhdr} % Footers
|
||||
\usepackage[english]{babel} % Language styles
|
||||
\usepackage{graphicx} % Importing graphics
|
||||
\usepackage[export]{adjustbox} % Aligning margins
|
||||
|
||||
\hypersetup{
|
||||
colorlinks=true,
|
||||
linkcolor=blue,
|
||||
filecolor=magenta,
|
||||
urlcolor=blue,
|
||||
pdftitle={Overleaf Example},
|
||||
pdfpagemode=FullScreen,
|
||||
}
|
||||
|
||||
% % Chinese
|
||||
% \usepackage{xeCJK}
|
||||
% \setCJKmainfont{BabelStone Han}
|
||||
|
||||
% % Cyrillic/Russian
|
||||
% \usepackage{hyphenat}
|
||||
% \babelfont{rm}{Droid Sans}
|
||||
|
||||
% Styling
|
||||
\pagestyle{fancy}
|
||||
\fancyhf{}
|
||||
\renewcommand{\headrulewidth}{0pt}
|
||||
\renewcommand{\footrulewidth}{0pt}
|
||||
\urlstyle{same}
|
||||
\raggedbottom
|
||||
\raggedright
|
||||
\setlength{\tabcolsep}{0in}
|
||||
|
||||
% Quotes
|
||||
\usepackage[autostyle,english=american]{csquotes}
|
||||
\MakeOuterQuote{"}
|
||||
|
||||
% Hyperlinks
|
||||
% \newcommand{\link}[2]{\href{#1}{\underline{\smash{#2}}}}
|
||||
\newcommand{\link}[2]{\href{#1}{#2}}
|
||||
|
||||
% Define colors
|
||||
\definecolor{color-text}{gray}{0.10} % light black
|
||||
\definecolor{color-detail}{gray}{0.40} % dark gray
|
||||
\colorlet{color-title}{\theme} % black
|
||||
|
||||
% Set text color
|
||||
\makeatletter
|
||||
\newcommand{\globalcolor}[1]{\color{#1}\global\let\default@color\current@color}
|
||||
\makeatother
|
||||
\AtBeginDocument{\globalcolor{color-text}}
|
||||
|
||||
% Shorthand
|
||||
\newcommand{\github}[1]{\href{https://github.com/#1/}{github.com/#1}}
|
||||
\newcommand{\email}[1]{\href{mailto:#1}{#1}}
|
||||
\newcommand{\website}[1]{\href{https://#1/}{#1}}
|
||||
\newcommand{\linkedin}[1]{\href{https://www.linkedin.com/in/#1/}{#1}}
|
||||
|
||||
% Dummy environment
|
||||
\newenvironment*{dummyenv}{}{}
|
||||
|
||||
% Inline heading
|
||||
\newcommand{\headinginline}[2]{
|
||||
\begin{minipage}[t]{0.50\textwidth}
|
||||
\vspace*{\fill}
|
||||
\Huge \textcolor{color-title}{#1}
|
||||
\end{minipage}
|
||||
\begin{minipage}[t]{0.45\textwidth}
|
||||
\begin{flushright}
|
||||
#2
|
||||
\end{flushright}
|
||||
\end{minipage}
|
||||
}
|
||||
|
||||
% Photo heading
|
||||
\newcommand{\headingphoto}[3]{
|
||||
\begin{minipage}[t]{0.60\textwidth}
|
||||
\begin{dummyenv}
|
||||
\vspace*{\fill}
|
||||
\Huge \textcolor{color-title}{#1}
|
||||
\end{dummyenv}
|
||||
\vspace{5mm}\\
|
||||
#2
|
||||
\end{minipage}
|
||||
\begin{minipage}[t]{0.35\textwidth}
|
||||
\begin{flushright}
|
||||
\includegraphics[width=.5\linewidth,valign=t]{#3}
|
||||
\end{flushright}
|
||||
\end{minipage}
|
||||
}
|
||||
|
||||
% Two-columns
|
||||
\newcommand{\sidebyside}[2]{
|
||||
\begin{multicols}{2}
|
||||
#1 \columnbreak
|
||||
#2 \end{multicols}
|
||||
}
|
||||
|
||||
% Section titles
|
||||
\titleformat{\section}{
|
||||
\scshape\raggedright\Large\color{color-title}}{}{0em}{}[\color{color-title}\titlerule
|
||||
\vspace{-\smallskipamount}]
|
||||
|
||||
% Footer
|
||||
\fancyfoot[R]{Page \thepage \hspace{1pt} of \pageref{LastPage}}
|
||||
|
||||
% Lists
|
||||
\newcommand{\outerlist}[1]{
|
||||
\begin{itemize}[leftmargin=*] #1 \end{itemize}}
|
||||
\newcommand{\denseouterlist}[1]{
|
||||
\begin{itemize}[leftmargin=*,itemsep=0pt] #1 \end{itemize}}
|
||||
\newcommand{\innerlist}[1]{
|
||||
\begin{itemize}[topsep=0pt] #1 \end{itemize}}
|
||||
\newcommand{\orderedouterlist}[1]{
|
||||
\begin{enumerate}[leftmargin=*] #1 \end{enumerate}}
|
||||
|
||||
% List items
|
||||
\newcommand{\entry}[1]{\item\small{#1}}
|
||||
\newcommand{\entryextra}[1]{\textcolor{color-detail}{\entry{#1}}}
|
||||
\newcommand{\entrylabeled}[2][]{\item[#1]\small{#2}}
|
||||
|
||||
\newcommand{\entrymid}[4][]{
|
||||
\item[#1] \small{#2} \hfill \small{#3}
|
||||
\vspace{-\smallskipamount} \item[]\small{\textit{#4}}}
|
||||
|
||||
\newcommand{\entrybig}[5][]{\item[#1]
|
||||
\begin{tabular*}{0.97\textwidth}{l@{\extracolsep{\fill}}r}
|
||||
#2 & #3 \\ {\small#4} & {\small #5} \\ \end{tabular*}}
|
||||
|
||||
% Fill year
|
||||
\newcommand{\fillyear}[1]{\phantom{#1}}
|
||||
|
||||
% Make author name bold: https://tex.stackexchange.com/a/327046
|
||||
\newcommand*{\boldname}[3]{%
|
||||
\def\lastname{#1}%
|
||||
\def\firstname{#2}%
|
||||
\def\firstinit{#3}}
|
||||
\boldname{}{}{}
|
||||
|
||||
\renewcommand{\mkbibnamegiven}[1]{%
|
||||
\ifboolexpr{ ( test {\ifdefequal{\firstname}{\namepartgiven}} or test {\ifdefequal{\firstinit}{\namepartgiven}} ) and test {\ifdefequal{\lastname}{\namepartfamily}} }
|
||||
{\mkbibbold{#1}}{#1}%
|
||||
}
|
||||
|
||||
\renewcommand{\mkbibnamefamily}[1]{%
|
||||
\ifboolexpr{ ( test {\ifdefequal{\firstname}{\namepartgiven}} or test {\ifdefequal{\firstinit}{\namepartgiven}} ) and test {\ifdefequal{\lastname}{\namepartfamily}} }
|
||||
{\mkbibbold{#1}}{#1}%
|
||||
}
|
@ -76,4 +76,28 @@
|
||||
color: $body-color;
|
||||
}
|
||||
}
|
||||
|
||||
.note {
|
||||
line-height: inherit;
|
||||
margin: 1.25em 0;
|
||||
padding: 6px 12px;
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
border-left: 1px solid $heading-color;
|
||||
|
||||
.icon svg {
|
||||
height: 1.3em;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: $heading-color;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
p:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -36,13 +36,31 @@
|
||||
url('/fonts/source-code-pro-v22-latin-ext_latin-700italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Noto Sans CJK';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: local(''),
|
||||
url('/fonts/NotoSansCJKsc-Regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||
url('/fonts/NotoSansCJKsc-Regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Noto Sans CJK';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: local(''),
|
||||
url('/fonts/NotoSansCJKsc-Bold.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */
|
||||
url('/fonts/NotoSansCJKsc-Bold.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: $background-color;
|
||||
color: $body-color;
|
||||
padding-left: 5vw;
|
||||
padding-right: 5vw;
|
||||
padding-top: 5vh;
|
||||
font-family: 'Source Code Pro';
|
||||
font-family: 'Source Code Pro', 'Noto Sans CJK';
|
||||
font-size: 1.5rem;
|
||||
|
||||
@media screen and (max-width: 600px) {
|
||||
|
BIN
static/cv.pdf
Normal file
BIN
static/cv.pdf
Normal file
Binary file not shown.
BIN
static/fonts/NotoSansCJKsc-Bold.woff
Normal file
BIN
static/fonts/NotoSansCJKsc-Bold.woff
Normal file
Binary file not shown.
BIN
static/fonts/NotoSansCJKsc-Bold.woff2
Normal file
BIN
static/fonts/NotoSansCJKsc-Bold.woff2
Normal file
Binary file not shown.
BIN
static/fonts/NotoSansCJKsc-Regular.woff
Normal file
BIN
static/fonts/NotoSansCJKsc-Regular.woff
Normal file
Binary file not shown.
BIN
static/fonts/NotoSansCJKsc-Thin.woff2
Normal file
BIN
static/fonts/NotoSansCJKsc-Thin.woff2
Normal file
Binary file not shown.
2
static/images/info.svg
Normal file
2
static/images/info.svg
Normal file
@ -0,0 +1,2 @@
|
||||
|
||||
<?xml version="1.0" ?><svg height="48" viewBox="0 0 48 48" width="48" xmlns="http://www.w3.org/2000/svg"><path d="M22 34h4v-12h-4v12zm2-30c-11.05 0-20 8.95-20 20s8.95 20 20 20 20-8.95 20-20-8.95-20-20-20zm0 36c-8.82 0-16-7.18-16-16s7.18-16 16-16 16 7.18 16 16-7.18 16-16 16zm-2-22h4v-4h-4v4z" fill="currentColor"/></svg>
|
After Width: | Height: | Size: 321 B |
BIN
static/pdf/dpdksummit2024.pdf
Normal file
BIN
static/pdf/dpdksummit2024.pdf
Normal file
Binary file not shown.
@ -1,5 +1,9 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}
|
||||
{{ page.title }}
|
||||
{% endblock %}
|
||||
|
||||
{% block extra_head %}
|
||||
<link rel="stylesheet" href="/style/article.css">
|
||||
<link rel="stylesheet" href="/style/sensor-watch.css">
|
||||
@ -131,7 +135,7 @@
|
||||
|
||||
<hr>
|
||||
|
||||
<p><a href="mailto:jackbondpreston@outlook.com">email me</a> to have a conversation</p>
|
||||
<p><a href="mailto:jack@jackbondpreston.me">email me</a> to have a conversation</p>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
@ -1,5 +1,9 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}
|
||||
{{ page.title }}
|
||||
{% endblock %}
|
||||
|
||||
{% block extra_head %}
|
||||
<link rel="stylesheet" href="/style/article.css">
|
||||
{% endblock %}
|
||||
@ -12,6 +16,6 @@
|
||||
|
||||
<hr>
|
||||
|
||||
<p><a href="mailto:jackbondpreston@outlook.com">email me</a> to have a conversation</p>
|
||||
<p><a href="mailto:jack@jackbondpreston.me">email me</a> to have a conversation</p>
|
||||
</div>
|
||||
{% endblock content %}
|
1
templates/shortcodes/defref.html
Normal file
1
templates/shortcodes/defref.html
Normal file
@ -0,0 +1 @@
|
||||
<p id="ref{{ n }}">[{{ n }}] <a href="{{ url }}">{{ url }}</a> <a href="javascript:history.back()" style="text-decoration: none;">(↑)</a></p>
|
12
templates/shortcodes/note.html
Normal file
12
templates/shortcodes/note.html
Normal file
@ -0,0 +1,12 @@
|
||||
<blockquote class="note">
|
||||
{% set icon = load_data(path="static/images/info.svg") %}
|
||||
<div class="icon">
|
||||
{{ icon | safe }}
|
||||
</div>
|
||||
<div class="content">
|
||||
{% if header %}
|
||||
<p><strong>{{ header }}</strong></p>
|
||||
{% endif %}
|
||||
{{ body | markdown | safe }}
|
||||
</div>
|
||||
</blockquote>
|
1
templates/shortcodes/ref.html
Normal file
1
templates/shortcodes/ref.html
Normal file
@ -0,0 +1 @@
|
||||
{% if not nosup %}<sup>{% endif %}<a href="#ref{{ n }}" style="text-decoration: none;">[{{ n }}]</a>{% if not nosup %}</sup>{% endif %}
|
Reference in New Issue
Block a user