Compare commits
19 Commits
c3cfdefc0d
...
master
Author | SHA1 | Date | |
---|---|---|---|
facc5e260d
|
|||
73593ab097
|
|||
80e3970821 | |||
bf030d3bbc | |||
ff813fa852 | |||
42e3d86d85 | |||
073ed74509 | |||
05c0522be5
|
|||
ea06199191
|
|||
3ca41b5ccd
|
|||
67421082a4
|
|||
7288b76533
|
|||
a14dd79336
|
|||
4d16bc39ad
|
|||
d66796a3ef
|
|||
ee5685589f
|
|||
6fdb8a56f7
|
|||
a2abd41d12
|
|||
27e0151fa1
|
39
.github/workflows/main.yml
vendored
39
.github/workflows/main.yml
vendored
@ -1,39 +0,0 @@
|
||||
# This is a basic workflow to help you get started with Actions
|
||||
|
||||
name: cv-build
|
||||
|
||||
# Controls when the workflow will run
|
||||
on:
|
||||
# Triggers the workflow on push or pull request events but only for the "master" branch
|
||||
push:
|
||||
branches: [ "master" ]
|
||||
paths:
|
||||
- cv/**
|
||||
|
||||
# Allows you to run this workflow manually from the Actions tab
|
||||
workflow_dispatch:
|
||||
|
||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||
jobs:
|
||||
# This workflow contains a single job called "build"
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Set up Git repository
|
||||
uses: actions/checkout@v2
|
||||
- name: Compile LaTeX document
|
||||
uses: xu-cheng/latex-action@v2
|
||||
with:
|
||||
working_directory: cv
|
||||
root_file: main.tex
|
||||
- name: Move built .pdf
|
||||
run: |
|
||||
mv cv/main.pdf ./static/cv.pdf
|
||||
- name: Commit built .pdf
|
||||
uses: EndBug/add-and-commit@v9
|
||||
with:
|
||||
add: 'cv.pdf'
|
||||
author_name: 'Jack Bond-Preston'
|
||||
author_email: 'jackbondpreston@outlook.com'
|
||||
message: '[github action] update cv.pdf'
|
||||
|
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)
|
||||
|
||||
未来将要发生什么?我还不知道,但是我希望我可以继续进步。明年三月我打算和我的对象一起去中国旅游。其实我十分期待这个旅行,因为我不但没去过中国,甚至连亚洲也没去过!既然中国菜非常好吃,我应该学习怎么流利地点菜。我也希望在中国我可以够有信心尝试和中国人聊聊天儿。
|
20
cv/main.tex
20
cv/main.tex
@ -13,6 +13,7 @@
|
||||
% Example photograph taken from Wikimedia Commons
|
||||
% https://commons.wikimedia.org/wiki/File:Kiara_Krit_passport.jpg
|
||||
|
||||
|
||||
\usepackage{simplecv}
|
||||
|
||||
\boldname{Bond-Preston}{Jack}{Mr.}
|
||||
@ -26,28 +27,19 @@
|
||||
Website: \website{jackbondpreston.me} \\
|
||||
Email: \email{jackbondpreston@outlook.com} \\
|
||||
LinkedIn: \linkedin{jack-bond-preston-922706150} \\
|
||||
GitHub: \github{jackbondpreston}
|
||||
}
|
||||
|
||||
% \headingphoto{Name Surname}{
|
||||
% Website: \website{example.com} \\
|
||||
% Email: \email{example@example.edu} \\
|
||||
% LinkedIn: \linkedin{name-surname} \\
|
||||
% GitHub: \github{example}
|
||||
% }{photo.jpg}
|
||||
|
||||
% Page One
|
||||
\import{sections/}{education.tex}
|
||||
\import{sections/}{experience.tex}
|
||||
%\import{sections/}{publications.tex}
|
||||
\import{sections/}{skills.tex}
|
||||
|
||||
%\pagebreak
|
||||
\pagebreak
|
||||
|
||||
% Page Two
|
||||
%\import{sections/}{teaching.tex}
|
||||
% \sidebyside
|
||||
\import{sections/}{skills.tex}
|
||||
% {\import{sections/}{languages.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}
|
||||
|
@ -6,9 +6,4 @@
|
||||
\entrybig
|
||||
{\textbf{University of Bristol}}{Bristol, UK}
|
||||
{BSc in Computer Science (1st Class Hons)}{2017\textendash 2020}
|
||||
\vspace{-0.75em}
|
||||
\innerlist{
|
||||
\entry{Awarded prize for best second-year group software development project.}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -4,33 +4,47 @@
|
||||
\outerlist{
|
||||
|
||||
\entrybig
|
||||
{\textbf{AMD, Inc. (formerly Xilinx)}}{Cambridge, UK}
|
||||
{Software Engineer in Adaptive and Embedded Computing Group}{2022\textendash Current}
|
||||
{\textbf{Arm Ltd.}}{Cambridge, UK (Hybrid)}
|
||||
{Software Engineer in Infrastructure Application Solutions group}{2023\textendash Current}
|
||||
\innerlist{
|
||||
\entry{Developing AMDs Onload userspace network stack.}
|
||||
\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{Arm Ltd.}}{Cambridge, UK}
|
||||
{\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 in C and AArch64 assembly as part of a project porting the open-source C standard library implementation musl to a new prototype 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.}
|
||||
\entryextra{Provided code review including feedback and improvements for patches developed by others for the musl project.}
|
||||
}
|
||||
|
||||
\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{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
|
||||
|
@ -2,6 +2,7 @@
|
||||
\section{Languages}
|
||||
|
||||
\denseouterlist{
|
||||
\entry{\textbf{English:} Native speaker}
|
||||
\entry{\textbf{German:} CEFR A2/B1 (Elementary/Low Intermediate)}
|
||||
\entry{\textbf{English:} Native}
|
||||
\entry{\textbf{Mandarin Chinese:} HSK 3 (2024)}
|
||||
\entry{\textbf{German:} CEFR A2 (2020)}
|
||||
}
|
||||
|
@ -1,9 +1,13 @@
|
||||
|
||||
\nocite{*}
|
||||
\printbibliography[title=Publications]
|
||||
\section{Presentations}
|
||||
|
||||
% Can instead manually enter publications as shown:
|
||||
% \section{Publications}
|
||||
% \orderedouterlist{
|
||||
% \entry{S. Petridis, J. Shen, \textbf{D. Cetin} and M. Pantic, "Visual-Only Recognition of Normal, Whispered And Silent Speech", \textit{IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP), April 2018}}
|
||||
% }
|
||||
\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.}
|
||||
}
|
||||
}
|
||||
|
@ -2,10 +2,10 @@
|
||||
\section{Skills}
|
||||
|
||||
\denseouterlist{
|
||||
\entry{\textbf{Low-Level Software \& Architecture:} C, C++ (inc. 11/17/20 standards), Armv7/8/9 (assembly \& architecture), RISC-V, CHERI, GNU Make, CMake.}
|
||||
\entry{\textbf{Software Engineering:} Git, Gerrit, Linux, Bash \& Zsh, Python, Java, Haskell, Agile, Jira.}
|
||||
\entry{\textbf{Web Development:} HTML5, Modern CSS, ECMAScript 2015+ \& Typescript, Vue.js, Spring Boot, SQL.}
|
||||
\entry{\textbf{Teaching:} Giving lectures \& seminars, interviewing, marking coursework, giving knowledge sharing presentations.}
|
||||
\entry{\textbf{Design:} 3D modelling, vector graphics, Photoshop.}
|
||||
\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}
|
||||
|
||||
}
|
||||
|
@ -10,10 +10,19 @@
|
||||
\usepackage{enumitem} % List customization
|
||||
\usepackage{lastpage} % Page numbering
|
||||
\usepackage{fancyhdr} % Footers
|
||||
\usepackage[russian,english]{babel} % Language styles
|
||||
\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}
|
||||
|
@ -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