Compare commits

..

19 Commits

Author SHA1 Message Date
facc5e260d update cv 2025-01-03 11:09:13 +00:00
73593ab097 update cv 2024-11-08 15:36:26 +00:00
80e3970821 add dpdk summit article 2024-10-23 13:09:34 +01:00
bf030d3bbc update homepage w/ dpdk commits link 2024-09-27 00:08:10 +01:00
ff813fa852 add syscall article 2024-09-27 00:03:54 +01:00
42e3d86d85 fix some mistakes in 中文 article 2024-09-25 14:06:18 +01:00
073ed74509 add new article 2024-09-23 15:24:43 +01:00
05c0522be5 rever to outlook email 2024-05-12 15:25:48 +01:00
ea06199191 update cv: fix spacing 2024-05-12 14:43:42 +01:00
3ca41b5ccd update cv and upload new cv pdf artifact 2024-05-12 14:36:11 +01:00
67421082a4 update CV: new experience and remove Github 2024-05-12 14:23:16 +01:00
7288b76533 update email footers 2023-05-30 11:49:39 +01:00
a14dd79336 move cv.pdf to static/ 2023-05-29 13:22:22 +01:00
4d16bc39ad fix some things in CHERI article 2023-05-29 13:21:06 +01:00
d66796a3ef add cv artifact 2023-05-29 13:19:10 +01:00
ee5685589f remove gh actions 2023-05-29 13:18:47 +01:00
6fdb8a56f7 update main page 2023-03-22 16:11:41 +00:00
a2abd41d12 fix atom feed link 2023-02-14 01:21:53 +00:00
27e0151fa1 fix article titles 2023-02-14 01:19:07 +00:00
29 changed files with 348 additions and 102 deletions

View File

@ -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
View File

@ -1,2 +1,11 @@
public/
static/processed_images/
static/processed_images/
*.log
cv/*.gz
cv/*.xml
*.aux
*.bbl
*.bcf
*.blg
*.out
cv/*.pdf

View File

@ -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

View File

@ -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>

View File

@ -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>

View 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
View 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") }}

View 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)
未来将要发生什么?我还不知道,但是我希望我可以继续进步。明年三月我打算和我的对象一起去中国旅游。其实我十分期待这个旅行,因为我不但没去过中国,甚至连亚洲也没去过!既然中国菜非常好吃,我应该学习怎么流利地点菜。我也希望在中国我可以够有信心尝试和中国人聊聊天儿。

View File

@ -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}

View File

@ -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.}
}
}

View File

@ -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

View File

@ -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)}
}

View File

@ -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.}
}
}

View File

@ -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}
}

View File

@ -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}

View File

@ -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;
}
}
}

View File

@ -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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

2
static/images/info.svg Normal file
View 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

Binary file not shown.

View File

@ -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 %}

View File

@ -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 %}

View 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>

View 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>

View File

@ -0,0 +1 @@
{% if not nosup %}<sup>{% endif %}<a href="#ref{{ n }}" style="text-decoration: none;">[{{ n }}]</a>{% if not nosup %}</sup>{% endif %}