CINXE.COM
kernel | Linux Journal
<!DOCTYPE html> <html lang="en" dir="ltr" prefix="content: http://purl.org/rss/1.0/modules/content/ dc: http://purl.org/dc/terms/ foaf: http://xmlns.com/foaf/0.1/ og: http://ogp.me/ns# rdfs: http://www.w3.org/2000/01/rdf-schema# schema: http://schema.org/ sioc: http://rdfs.org/sioc/ns# sioct: http://rdfs.org/sioc/types# skos: http://www.w3.org/2004/02/skos/core# xsd: http://www.w3.org/2001/XMLSchema# " class="no-js wf-loading"> <head> <meta charset="utf-8" /> <meta name="Generator" content="Drupal 9 (https://www.drupal.org)" /> <meta name="MobileOptimized" content="width" /> <meta name="HandheldFriendly" content="true" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="icon" href="/themes/linuxjournal/favicon.ico" type="image/vnd.microsoft.icon" /> <link rel="alternate" type="application/rss+xml" title="kernel" href="https://www.linuxjournal.com/taxonomy/term/662/feed" /> <title>kernel | Linux Journal</title> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/align.module.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/fieldgroup.module.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/container-inline.module.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/clearfix.module.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/details.module.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/hidden.module.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/item-list.module.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/js.module.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/nowrap.module.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/position-container.module.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/progress.module.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/reset-appearance.module.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/resize.module.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/sticky-header.module.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/system-status-counter.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/system-status-report-counters.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/system-status-report-general-info.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/tablesort.module.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/system/css/components/tree-child.module.css?snzigw" /> <link rel="stylesheet" media="all" href="/modules/contrib/poll/css/poll.base.css?snzigw" /> <link rel="stylesheet" media="all" href="/modules/contrib/poll/css/poll.theme.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/views/css/views.module.css?snzigw" /> <link rel="stylesheet" media="all" href="/core/modules/filter/css/filter.caption.css?snzigw" /> <link rel="stylesheet" media="all" href="/modules/contrib/webform/modules/webform_bootstrap/css/webform_bootstrap.css?snzigw" /> <link rel="stylesheet" media="all" href="/libraries/shariff/shariff.complete.css?snzigw" /> <link rel="stylesheet" media="all" href="/themes/linuxjournal/css/style.css?snzigw" /> <link rel="stylesheet" media="all" href="/themes/linuxjournal/css/fonts.css?snzigw" /> <!-- <script defer src="https://use.fontawesome.com/releases/v5.0.9/js/all.js" integrity="sha384-8iPTk2s/jMVj81dnzb/iFR2sdA7u06vHJyyLlAd4snFpCl/SnyUjRrbdJsw1pGIl" crossorigin="anonymous"></script>--> <script> // Non-blocking webfonts. (function iife() { 'use strict'; // JS is able to start executing. document.documentElement.classList.remove('no-js'); // Optimization for Repeat Views // Stop early for repeat views that have already cached fonts. if (sessionStorage.fontsLoadedLateef && sessionStorage.fontsLoadedOpensans /* && sessionStorage.fontsLoadedNEWFONT */) { document.documentElement.classList.remove('wf-loading'); document.documentElement.classList.add('wf-opensans'); document.documentElement.classList.add('wf-lateef'); // document.documentElement.classList.add('wf-NEWFONT'); return; } // Inlined Font Face Observer script + Promise polyfill. /*! Font Face Observer v2.0.13 - © Bram Stein. License: BSD-3-Clause */ (function(){'use strict';var f,g=[];function l(a){g.push(a);1==g.length&&f()}function m(){for(;g.length;)g[0](),g.shift()}f=function(){setTimeout(m)};function n(a){this.a=p;this.b=void 0;this.f=[];var b=this;try{a(function(a){q(b,a)},function(a){r(b,a)})}catch(c){r(b,c)}}var p=2;function t(a){return new n(function(b,c){c(a)})}function u(a){return new n(function(b){b(a)})}function q(a,b){if(a.a==p){if(b==a)throw new TypeError;var c=!1;try{var d=b&&b.then;if(null!=b&&"object"==typeof b&&"function"==typeof d){d.call(b,function(b){c||q(a,b);c=!0},function(b){c||r(a,b);c=!0});return}}catch(e){c||r(a,e);return}a.a=0;a.b=b;v(a)}} function r(a,b){if(a.a==p){if(b==a)throw new TypeError;a.a=1;a.b=b;v(a)}}function v(a){l(function(){if(a.a!=p)for(;a.f.length;){var b=a.f.shift(),c=b[0],d=b[1],e=b[2],b=b[3];try{0==a.a?"function"==typeof c?e(c.call(void 0,a.b)):e(a.b):1==a.a&&("function"==typeof d?e(d.call(void 0,a.b)):b(a.b))}catch(h){b(h)}}})}n.prototype.g=function(a){return this.c(void 0,a)};n.prototype.c=function(a,b){var c=this;return new n(function(d,e){c.f.push([a,b,d,e]);v(c)})}; function w(a){return new n(function(b,c){function d(c){return function(d){h[c]=d;e+=1;e==a.length&&b(h)}}var e=0,h=[];0==a.length&&b(h);for(var k=0;k<a.length;k+=1)u(a[k]).c(d(k),c)})}function x(a){return new n(function(b,c){for(var d=0;d<a.length;d+=1)u(a[d]).c(b,c)})};window.Promise||(window.Promise=n,window.Promise.resolve=u,window.Promise.reject=t,window.Promise.race=x,window.Promise.all=w,window.Promise.prototype.then=n.prototype.c,window.Promise.prototype["catch"]=n.prototype.g);}()); (function(){function l(a,b){document.addEventListener?a.addEventListener("scroll",b,!1):a.attachEvent("scroll",b)}function m(a){document.body?a():document.addEventListener?document.addEventListener("DOMContentLoaded",function c(){document.removeEventListener("DOMContentLoaded",c);a()}):document.attachEvent("onreadystatechange",function k(){if("interactive"==document.readyState||"complete"==document.readyState)document.detachEvent("onreadystatechange",k),a()})};function r(a){this.a=document.createElement("div");this.a.setAttribute("aria-hidden","true");this.a.appendChild(document.createTextNode(a));this.b=document.createElement("span");this.c=document.createElement("span");this.h=document.createElement("span");this.f=document.createElement("span");this.g=-1;this.b.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;";this.c.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;"; this.f.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;";this.h.style.cssText="display:inline-block;width:200%;height:200%;font-size:16px;max-width:none;";this.b.appendChild(this.h);this.c.appendChild(this.f);this.a.appendChild(this.b);this.a.appendChild(this.c)} function t(a,b){a.a.style.cssText="max-width:none;min-width:20px;min-height:20px;display:inline-block;overflow:hidden;position:absolute;width:auto;margin:0;padding:0;top:-999px;white-space:nowrap;font-synthesis:none;font:"+b+";"}function y(a){var b=a.a.offsetWidth,c=b+100;a.f.style.width=c+"px";a.c.scrollLeft=c;a.b.scrollLeft=a.b.scrollWidth+100;return a.g!==b?(a.g=b,!0):!1}function z(a,b){function c(){var a=k;y(a)&&a.a.parentNode&&b(a.g)}var k=a;l(a.b,c);l(a.c,c);y(a)};function A(a,b){var c=b||{};this.family=a;this.style=c.style||"normal";this.weight=c.weight||"normal";this.stretch=c.stretch||"normal"}var B=null,C=null,E=null,F=null;function G(){if(null===C)if(J()&&/Apple/.test(window.navigator.vendor)){var a=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))(?:\.([0-9]+))/.exec(window.navigator.userAgent);C=!!a&&603>parseInt(a[1],10)}else C=!1;return C}function J(){null===F&&(F=!!document.fonts);return F} function K(){if(null===E){var a=document.createElement("div");try{a.style.font="condensed 100px sans-serif"}catch(b){}E=""!==a.style.font}return E}function L(a,b){return[a.style,a.weight,K()?a.stretch:"","100px",b].join(" ")} A.prototype.load=function(a,b){var c=this,k=a||"BESbswy",q=0,D=b||3E3,H=(new Date).getTime();return new Promise(function(a,b){if(J()&&!G()){var M=new Promise(function(a,b){function e(){(new Date).getTime()-H>=D?b():document.fonts.load(L(c,'"'+c.family+'"'),k).then(function(c){1<=c.length?a():setTimeout(e,25)},function(){b()})}e()}),N=new Promise(function(a,c){q=setTimeout(c,D)});Promise.race([N,M]).then(function(){clearTimeout(q);a(c)},function(){b(c)})}else m(function(){function u(){var b;if(b=-1!= f&&-1!=g||-1!=f&&-1!=h||-1!=g&&-1!=h)(b=f!=g&&f!=h&&g!=h)||(null===B&&(b=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),B=!!b&&(536>parseInt(b[1],10)||536===parseInt(b[1],10)&&11>=parseInt(b[2],10))),b=B&&(f==v&&g==v&&h==v||f==w&&g==w&&h==w||f==x&&g==x&&h==x)),b=!b;b&&(d.parentNode&&d.parentNode.removeChild(d),clearTimeout(q),a(c))}function I(){if((new Date).getTime()-H>=D)d.parentNode&&d.parentNode.removeChild(d),b(c);else{var a=document.hidden;if(!0===a||void 0===a)f=e.a.offsetWidth, g=n.a.offsetWidth,h=p.a.offsetWidth,u();q=setTimeout(I,50)}}var e=new r(k),n=new r(k),p=new r(k),f=-1,g=-1,h=-1,v=-1,w=-1,x=-1,d=document.createElement("div");d.dir="ltr";t(e,L(c,"sans-serif"));t(n,L(c,"serif"));t(p,L(c,"monospace"));d.appendChild(e.a);d.appendChild(n.a);d.appendChild(p.a);document.body.appendChild(d);v=e.a.offsetWidth;w=n.a.offsetWidth;x=p.a.offsetWidth;I();z(e,function(a){f=a;u()});t(e,L(c,'"'+c.family+'",sans-serif'));z(n,function(a){g=a;u()});t(n,L(c,'"'+c.family+'",serif')); z(p,function(a){h=a;u()});t(p,L(c,'"'+c.family+'",monospace'))})})};"object"===typeof module?module.exports=A:(window.FontFaceObserver=A,window.FontFaceObserver.prototype.load=A.prototype.load);}()); // Load and observe Lateef var Lateef = new FontFaceObserver('Lateef', {weight: 400}); Promise.all([Lateef.load()]).then(function() { document.documentElement.classList.remove('wf-loading'); document.documentElement.classList.add('wf-lateef'); // Optimization for Repeat Views // Set a flag in localstorage so repeat views can skip processing FFO. sessionStorage.fontsLoadedLateef = true; }); // Load and observe Open Sans var os300 = new FontFaceObserver('Open Sans', {weight: 300}); var os400 = new FontFaceObserver('Open Sans', {weight: 400}); Promise.all([os300.load(), os400.load()]).then(function() { document.documentElement.classList.remove('wf-loading'); document.documentElement.classList.add('wf-opensans'); // Optimization for Repeat Views // Set a flag in localstorage so repeat views can skip processing FFO. sessionStorage.fontsLoadedOpensans = true; }); // Load and observe NEWFONT /* var NEWFONT = new FontFaceObserver('NEWFONT', {weight: 400}); Promise.all([NEWFONT.load()]).then(function() { document.documentElement.classList.remove('wf-loading'); document.documentElement.classList.add('wf-NEWFONT'); // Optimization for Repeat Views // Set a flag in localstorage so repeat views can skip processing FFO. sessionStorage.fontsLoadedNEWFONT = true; }); */ })(); </script> <script src="https://www.google.com/recaptcha/api.js" async defer></script> <script src=https://slashdot.org/country.js></script> <script src="/themes/linuxjournal/js/ada.js"></script> <script src="/themes/linuxjournal/js/accessibility.js"></script> <script>window.addEventListener('load', function() { new Accessibility(); });</script> <script src="//a.fsdn.com/con/js/sftheme/cmp2.js"></script> <link rel="stylesheet" href="//a.fsdn.com/con/css/sftheme/sandiego/cmp.css" type="text/css"> <link rel="stylesheet" href="/themes/linuxjournal/css/ccpa.css" type="text/css"> <script>window.bizx.cmp.init({ geo: window });</script> <script> function bm_trace() { (function (w,d,t) { _ml = w._ml || {}; _ml.eid = '771'; var s, cd, tag; s = d.getElementsByTagName(t)[0]; cd = new Date(); tag = d.createElement(t); tag.async = 1; tag.src = 'https://ml314.com/tag.aspx?' + cd.getDate() + cd.getMonth(); s.parentNode.insertBefore(tag, s); })(window,document,'script'); } bizx.cmp.ifConsent('', ['all', 'bombora'],bm_trace); </script> </head> <body class="path-taxonomy has-glyphicons"> <a href="#main-content" class="visually-hidden focusable skip-link"> Skip to main content </a> <div class="dialog-off-canvas-main-canvas" data-off-canvas-main-canvas> <div id="wrap"> <div class="leader-wrapper" id="leader-wrapper"> </div> <div class="brand-wrapper" id="brand-wrapper"> <div class="brand container"> <div class="region region-brand"> <a class="logo navbar-btn" href="/" title="Home" rel="home"> <h1><img src="/themes/linuxjournal/images/ljlogo.png" alt="Linux Journal" /></h1> </a> <section id="block-topbannernearlogo" class="block block-block-content block-block-contenta8e75a3d-967c-416d-8944-4015d1f90a84 clearfix"> </section> </div> </div> <div class="header-wrapper"> <header class="navbar navbar-default container" id="navbar" role="banner"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-collapse"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <div id="navbar-collapse" class="navbar-collapse collapse"> <div class="region region-navigation-collapsible"> <section id="block-linuxjournal-main-menu" class="block block-system block-system-menu-blockmain clearfix navbar__menu col-xs-12 col-sm-8"> <ul class="menu menu--main nav navbar-nav"> <li class="expanded dropdown active active-trail first"> <a href="/" class="dropdown-toggle active-trail" data-toggle="dropdown" data-drupal-link-system-path="<front>">Topics+ <span class="caret"></span></a> <ul class="dropdown-menu"> <li class="first"> <a href="/tag/cloud">Cloud</a> </li> <li> <a href="/tag/containers" data-drupal-link-system-path="taxonomy/term/978">Containers</a> </li> <li> <a href="/tag/desktop">Desktop</a> </li> <li class="active active-trail"> <a href="/tag/kernel" class="active-trail is-active" data-drupal-link-system-path="taxonomy/term/662">Kernel</a> </li> <li> <a href="/tag/mobile">Mobile</a> </li> <li> <a href="/tag/networking">Networking</a> </li> <li> <a href="/tag/privacy">Privacy</a> </li> <li> <a href="/tag/programming">Programming</a> </li> <li> <a href="/tag/security" data-drupal-link-system-path="taxonomy/term/31">Security</a> </li> <li> <a href="/tag/servers">Servers</a> </li> <li class="last"> <a href="/tag/sysadmin" data-drupal-link-system-path="taxonomy/term/21">SysAdmin</a> </li> </ul> </li> <li> <a href="/news" data-drupal-link-system-path="news">News</a> </li> <li class="last"> <a href="/books" data-drupal-link-system-path="books">eBooks</a> </li> </ul> </section> <section class="search-block-form block block-search block-search-form-block clearfix navbar__search col-xs-12 col-sm-4 col-md-4 col-md-offset-0" data-drupal-selector="search-block-form" id="block-linuxjournal-search" role="search"> <h2 class="block-title sr-only">Search</h2> <form action="/search/node" method="get" id="search-block-form" accept-charset="UTF-8"> <div class="form-item js-form-item form-type-search js-form-type-search form-item-keys js-form-item-keys form-no-label form-group"> <label for="edit-keys" class="control-label sr-only">Search</label> <div class="input-group"><input title="Enter the terms you wish to search for." data-drupal-selector="edit-keys" class="form-search form-control" placeholder="Search" type="search" id="edit-keys" name="keys" value="" size="15" maxlength="128" /><span class="input-group-btn"><button type="submit" value="Search" class="button js-form-submit form-submit btn-primary btn icon-only" name=""><span class="sr-only">Search</span><span class="icon glyphicon glyphicon-search" aria-hidden="true"></span></button></span></div> <div id="edit-keys--description" class="description help-block"> Enter the terms you wish to search for. </div> </div> <div class="form-actions form-group js-form-wrapper form-wrapper" data-drupal-selector="edit-actions" id="edit-actions"></div> </form> </section> </div> </div> <div class="navbar-header"> <div class="region region-navigation"> <section id="block-mobilenavigation" class="block block-system block-system-menu-blockmenu-mobile-navbar clearfix col-xs-12 col-md-8 col-md-offset-2 col-lg-8 col-lg-offset-0 navbar__menu navbar__mobilenavigation"> <ul class="menu menu--menu-mobile-navbar nav"> <li class="first"> <a href="/news" data-drupal-link-system-path="news">News</a> </li> <li> <a href="/popular" data-drupal-link-system-path="popular">Popular</a> </li> <li class="last"> <a href="/recent" data-drupal-link-system-path="recent">Recent</a> </li> </ul> </section> </div> </div> </header> </div> </div> <div role="main" class="main-container container js-quickedit-main-content" id="main"> <div class="row"> <section class="col-sm-12"> <div class="highlighted"> <div class="region region-highlighted"> <div data-drupal-messages-fallback class="hidden"></div> </div> </div> <a id="main-content"></a> <div class="region region-content"> <h1 class="page-header">kernel</h1> <div class="views-element-container form-group"><div class="view view-taxonomy-term view-id-taxonomy_term view-display-id-page_1 js-view-dom-id-60a1f9948d4bfe8dd114969afcc3c8ad38d761e3e1962d27e39a0016945951e8"> <div class="view-header"> <div about="/tag/kernel" typeof="schema:Thing"> <span property="schema:name" content="kernel" class="hidden"></span> </div> </div> <div class="view-content"> <div class="views-row"><article data-history-node-id="1340883" role="article" about="/content/primer-container-security" class="story is-promoted teaser clearfix"> <div class="teaser-image"> <div class="field field--name-field-node-image field--type-image field--label-hidden field--item"> <a href="/content/primer-container-security"> <picture> <source srcset="/sites/default/files/styles/200x200_square/public/nodeimage/story/primer-to-container-security.jpg?itok=9MP_PELy 1x" media="all and (min-width: 768px)" type="image/jpeg"/> <source srcset="/sites/default/files/styles/thumbnail/public/nodeimage/story/primer-to-container-security.jpg?itok=H4UPAdHD 1x" media="all and (max-width: 767px)" type="image/jpeg"/> <img src="/sites/default/files/styles/thumbnail/public/nodeimage/story/primer-to-container-security.jpg?itok=H4UPAdHD" alt="Primer to Container Security" typeof="foaf:Image" class="img-responsive" /> </picture> </a> </div> </div> <div class="teaser-text"> <h2> <a href="/content/primer-container-security" rel="bookmark"> <span>Primer to Container Security</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/ankur-kothiwall" lang="" about="/users/ankur-kothiwall" typeof="schema:Person" property="schema:name" datatype="">Ankur Kothiwal</a></span> - May 5, 2022 </div> </footer> <div class="content-body"> Containers are considered to be a standard way of deploying these microservices to the cloud. Containers are better than virtual machines in almost all ways except security, which may be the main barrier to their widespread adoption. This article will provide a better understanding of container security and available techniques to secure them. A Linux container can be defined as a process or a set of processes running in the userspace that is/are isolated from the rest of the system by different kernel tools. </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340581" role="article" about="/content/oops-debugging-kernel-panics-0" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/oops-debugging-kernel-panics-0" rel="bookmark"> <span>Oops! Debugging Kernel Panics</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/petros-koutoupis" lang="" about="/users/petros-koutoupis" typeof="schema:Person" property="schema:name" datatype="">Petros Koutoupis</a></span> - August 7, 2019 </div> </footer> <div class="content-body"> A look into what causes kernel panics and some utilities to help gain more information. Working in a Linux environment, how often have you seen a kernel panic? When it happens, your system is left in a crippled state until you reboot it completely. And, even after you get your system back into a functional state, you're still left with the question: why? You may have no idea what happened or why it happened. Those questions can be answered though, and the following guide will help you root out the cause of some of the conditions that led to the original crash. </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340753" role="article" about="/content/documenting-proper-git-usage" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/documenting-proper-git-usage" rel="bookmark"> <span>Documenting Proper Git Usage</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/zack-brown" lang="" about="/users/zack-brown" typeof="schema:Person" property="schema:name" datatype="">Zack Brown</a></span> - August 7, 2019 </div> </footer> <div class="content-body"> Jonathan Corbet wrote a document for inclusion in the kernel tree, describing best practices for merging and rebasing git-based kernel repositories. As he put it, it represented workflows that were actually in current use, and it was a living document that hopefully would be added to and corrected over time. The inspiration for the document came from noticing how frequently Linus Torvalds was unhappy with how other people—typically subsystem maintainers—handled their git trees. </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340754" role="article" about="/content/another-episode-seems-perfectly-feasible-and-then-dies-script-simplify-process-changing" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/another-episode-seems-perfectly-feasible-and-then-dies-script-simplify-process-changing" rel="bookmark"> <span>Another Episode of "Seems Perfectly Feasible and Then Dies"--Script to Simplify the Process of Changing System Call Tables</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/zack-brown" lang="" about="/users/zack-brown" typeof="schema:Person" property="schema:name" datatype="">Zack Brown</a></span> - August 7, 2019 </div> </footer> <div class="content-body"> David Howells put in quite a bit of work on a script, ./scripts/syscall-manage.pl, to simplify the entire process of changing the system call tables. With this script, it was a simple matter to add, remove, rename or renumber any system call you liked. The script also would resolve git conflicts, in the event that two repositories renumbered the system calls in conflicting ways. </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340683" role="article" about="/content/simplifying-function-tracing-modern-gcc" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/simplifying-function-tracing-modern-gcc" rel="bookmark"> <span>Simplifying Function Tracing for the Modern GCC</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/zack-brown" lang="" about="/users/zack-brown" typeof="schema:Person" property="schema:name" datatype="">Zack Brown</a></span> - July 26, 2019 </div> </footer> <div class="content-body"> Steven Rostedt wanted to do a little housekeeping, specifically with the function tracing code used in debugging the kernel. Up until then, the kernel could enable function tracing using either GCC's -pg flag or a combination of -pg and -mfentry. In each case, GCC would create a special routine that would execute at the start of each function, so the kernel could track calls to all functions. </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340763" role="article" about="/content/extending-kernel-built-kernel-headers" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/extending-kernel-built-kernel-headers" rel="bookmark"> <span>Extending the Kernel with Built-in Kernel Headers</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/joel-fernandes" lang="" about="/users/joel-fernandes" typeof="schema:Person" property="schema:name" datatype="">Joel Fernandes</a></span> - July 24, 2019 </div> </footer> <div class="content-body"> Note: this article is a followup to Zack Brown's "Android Low Memory Killer—In or Out?" </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340576" role="article" about="/content/what-does-it-take-make-kernel-0" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/what-does-it-take-make-kernel-0" rel="bookmark"> <span>What Does It Take to Make a Kernel?</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/petros-koutoupis" lang="" about="/users/petros-koutoupis" typeof="schema:Person" property="schema:name" datatype="">Petros Koutoupis</a></span> - July 23, 2019 </div> </footer> <div class="content-body"> The kernel this. The kernel that. People often refer to one operating system's kernel or another without truly knowing what it does or how it works or what it takes to make one. What does it take to write a custom (and non-Linux) kernel? </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340684" role="article" about="/content/shrinking-linux-attack-surfaces" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/shrinking-linux-attack-surfaces" rel="bookmark"> <span>Shrinking Linux Attack Surfaces</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/zack-brown" lang="" about="/users/zack-brown" typeof="schema:Person" property="schema:name" datatype="">Zack Brown</a></span> - July 18, 2019 </div> </footer> <div class="content-body"> Often, a kernel developer will try to reduce the size of an attack surface against Linux, even if it can't be closed entirely. It's generally a toss-up whether such a patch makes it into the kernel. Linus Torvalds always prefers security patches that really close a hole, rather than just give attackers a slightly harder time of it. </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340685" role="article" about="/content/address-space-isolation-and-linux-kernel" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/address-space-isolation-and-linux-kernel" rel="bookmark"> <span>Address Space Isolation and the Linux Kernel</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/zack-brown" lang="" about="/users/zack-brown" typeof="schema:Person" property="schema:name" datatype="">Zack Brown</a></span> - July 10, 2019 </div> </footer> <div class="content-body"> Mike Rapoport from IBM launched a bid to implement address space isolation in the Linux kernel. Address space isolation emanates from the idea of virtual memory—where the system maps all its hardware devices' memory addresses into a clean virtual space so that they all appear to be one smooth range of available RAM. A system that implements virtual memory also can create isolated address spaces that are available only to part of the system or to certain processes. </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340618" role="article" about="/content/deprecating-aout-binaries" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/deprecating-aout-binaries" rel="bookmark"> <span>Deprecating a.out Binaries</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/zack-brown" lang="" about="/users/zack-brown" typeof="schema:Person" property="schema:name" datatype="">Zack Brown</a></span> - June 25, 2019 </div> </footer> <div class="content-body"> Remember a.out binaries? They were the file format of the Linux kernel till around 1995 when ELF took over. ELF is better. It allows you to load shared libraries anywhere in memory, while a.out binaries need you to register shared library locations. That's fine at small scales, but it gets to be more and more of a headache as you have more and more shared libraries to deal with. But a.out is still supported in the Linux source tree, 25 years after ELF became the standard default format. </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340615" role="article" about="/content/android-low-memory-killer-or-out" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/android-low-memory-killer-or-out" rel="bookmark"> <span>Android Low-Memory Killer--In or Out?</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/zack-brown" lang="" about="/users/zack-brown" typeof="schema:Person" property="schema:name" datatype="">Zack Brown</a></span> - June 18, 2019 </div> </footer> <div class="content-body"> One of the jobs of the Linux kernel—and all operating system kernels—is to manage the resources available to the system. When those resources get used up, what should it do? If the resource is RAM, there's not much choice. It's not feasible to take over the behavior of any piece of user software, understand what that software does, and make it more memory-efficient. Instead, the kernel has very little choice but to try to identify the software that is most responsible for using up the system's RAM and kill that process. </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340616" role="article" about="/content/securing-kernel-stack" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/securing-kernel-stack" rel="bookmark"> <span>Securing the Kernel Stack</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/zack-brown" lang="" about="/users/zack-brown" typeof="schema:Person" property="schema:name" datatype="">Zack Brown</a></span> - June 11, 2019 </div> </footer> <div class="content-body"> The Linux kernel stack is a tempting target for attack. This is because the kernel needs to keep track of where it is. If a function gets called, which then calls another, which then calls another, the kernel needs to remember the order they were all called, so that each function can return to the function that called it. To do that, the kernel keeps a "stack" of values representing the history of its current context. </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340617" role="article" about="/content/line-length-limits" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/line-length-limits" rel="bookmark"> <span>Line Length Limits in the Kernel</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/zack-brown" lang="" about="/users/zack-brown" typeof="schema:Person" property="schema:name" datatype="">Zack Brown</a></span> - June 5, 2019 </div> </footer> <div class="content-body"> Periodically, the kernel developers debate something everyone generally takes for granted, such as the length of a line of text. Personally, I like lines of text to reach both sides of my screen—it's just a question of not wasting space. Alastair D'Silva recently agreed with me. He felt that monitor sizes and screen resolution had gotten so big in recent years, that the kernel should start allowing more data onto a single line of text. It was simple pragmatism—more visible text means more opportunity to spot the bug in a data dump. </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340593" role="article" about="/content/kunit-and-assertions" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/kunit-and-assertions" rel="bookmark"> <span>KUnit and Assertions</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/zack-brown" lang="" about="/users/zack-brown" typeof="schema:Person" property="schema:name" datatype="">Zack Brown</a></span> - May 30, 2019 </div> </footer> <div class="content-body"> KUnit has been seeing a lot of use and development recently. It's the kernel's new unit test system, introduced late last year by Brendan Higgins. Its goal is to enable maintainers and other developers to test discrete portions of kernel code in a reliable and reproducible way. This is distinct from various forms of testing that rely on the behavior of the system as a whole and, thus, do not necessarily always produce identical results. </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340594" role="article" about="/content/crazy-compiler-optimizations" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/crazy-compiler-optimizations" rel="bookmark"> <span>Crazy Compiler Optimizations</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/zack-brown" lang="" about="/users/zack-brown" typeof="schema:Person" property="schema:name" datatype="">Zack Brown</a></span> - May 23, 2019 </div> </footer> <div class="content-body"> Kernel development is always strange. Andrea Parri recently posted a patch to change the order of memory reads during multithreaded operation, such that if one read depended upon the next, the second could not actually occur before the first. The problem with this was that the bug never could actually occur, and the fix made the kernel's behavior less intuitive for developers. Peter Zijlstra, in particular, voted nay to this patch, saying it was impossible to construct a physical system capable of triggering the bug in question. </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340595" role="article" about="/content/cgroup-interactions" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/cgroup-interactions" rel="bookmark"> <span>CGroup Interactions</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/zack-brown" lang="" about="/users/zack-brown" typeof="schema:Person" property="schema:name" datatype="">Zack Brown</a></span> - May 14, 2019 </div> </footer> <div class="content-body"> CGroups are under constant development, partly because they form the core of many commercial services these days. An amazing thing about this is that they remain an unfinished project. Isolating and apportioning system elements is an ongoing effort, with many pieces still to do. And because of security concerns, it never may be possible to present a virtual system as a fully independent system. There always may be compromises that have to be made. </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340492" role="article" about="/content/rewriting-printk" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/rewriting-printk" rel="bookmark"> <span>Rewriting printk()</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/zack-brown" lang="" about="/users/zack-brown" typeof="schema:Person" property="schema:name" datatype="">Zack Brown</a></span> - May 7, 2019 </div> </footer> <div class="content-body"> The printk() function is a subject of much ongoing consternation among kernel developers. Ostensibly, it's just an output routine for sending text to the console. But unlike a regular print routine, printk() has to be able to work even under extreme conditions, like when something horrible is going on and the system needs to utter a few last clues as it breathes its final breath. </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340592" role="article" about="/content/kernel-issue" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/kernel-issue" rel="bookmark"> <span>The Kernel Issue</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/bryan-lunduke" lang="" about="/users/bryan-lunduke" typeof="schema:Person" property="schema:name" datatype="">Bryan Lunduke</a></span> - May 1, 2019 </div> </footer> <div class="content-body"> How much do you know about your kernel? Like really know? Considering how critically important the Linux kernel is to the world—and, perhaps just as important, to our own personal computers and gadgets—it's rather amazing how little most people actually know about it. </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340569" role="article" about="/content/conversation-kernel-developers-intel-red-hat-and-suse" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/conversation-kernel-developers-intel-red-hat-and-suse" rel="bookmark"> <span>A Conversation with Kernel Developers from Intel, Red Hat and SUSE</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/bryan-lunduke" lang="" about="/users/bryan-lunduke" typeof="schema:Person" property="schema:name" datatype="">Bryan Lunduke</a></span> - April 30, 2019 </div> </footer> <div class="content-body"> Three kernel developers describe what it's really like to work on the kernel, how they interact with developers from other companies, some pet peeves and how to get started. Like most Linux users, I rarely touch the actual code for the Linux kernel. Sure, I've looked at it. I've even compiled the kernel myself on a handful of occasions—sometimes to try out something new or simply to say I could do it ("Linux From Scratch" is a bit of a right of passage). </div> </div> </article> </div> <div class="views-row"><article data-history-node-id="1340494" role="article" about="/content/exporting-kernel-headers" class="story is-promoted teaser clearfix"> <div class="teaser-image"> </div> <div class="teaser-text"> <h2> <a href="/content/exporting-kernel-headers" rel="bookmark"> <span>Exporting Kernel Headers</span> </a> </h2> <footer> <div class="author"> <span><a title="View user profile." href="/users/zack-brown" lang="" about="/users/zack-brown" typeof="schema:Person" property="schema:name" datatype="">Zack Brown</a></span> - April 24, 2019 </div> </footer> <div class="content-body"> Joel Fernandes submitted a module to export kernel headers through the /proc directory to make it easier for users to extend the kernel without necessarily having the source tree available. He said: </div> </div> </article> </div> </div> <nav class="pager-nav text-center" role="navigation" aria-labelledby="pagination-heading"> <h4 id="pagination-heading" class="visually-hidden">Pagination</h4> <ul class="pagination js-pager__items"> <li class="pager__item is-active active"> <a href="?page=0" title="Current page"> <span class="visually-hidden"> Current page </span>1</a> </li> <li class="pager__item"> <a href="?page=1" title="Go to page 2"> <span class="visually-hidden"> Page </span>2</a> </li> <li class="pager__item"> <a href="?page=2" title="Go to page 3"> <span class="visually-hidden"> Page </span>3</a> </li> <li class="pager__item"> <a href="?page=3" title="Go to page 4"> <span class="visually-hidden"> Page </span>4</a> </li> <li class="pager__item"> <a href="?page=4" title="Go to page 5"> <span class="visually-hidden"> Page </span>5</a> </li> <li class="pager__item"> <a href="?page=5" title="Go to page 6"> <span class="visually-hidden"> Page </span>6</a> </li> <li class="pager__item pager__item--next"> <a href="?page=1" title="Go to next page" rel="next"> <span class="visually-hidden">Next page</span> <span aria-hidden="true">››</span> </a> </li> <li class="pager__item pager__item--last"> <a href="?page=5" title="Go to last page" rel="last"> <span class="visually-hidden">Last page</span> <span aria-hidden="true">Last »</span> </a> </li> </ul> </nav> <div class="feed-icons"> <a href="https://www.linuxjournal.com/taxonomy/term/662/feed" class="feed-icon"> Subscribe to kernel </a> </div> </div> </div> </div> </section> </div> </div> <footer class="footer container" role="contentinfo"> <div class="region region-footer"> <section class="views-element-container block block-views block-views-blocknewsletter-promo-block-block-1 clearfix" id="block-views-block-newsletter-promo-block-block-1"> <div class="form-group"><div class="view view-newsletter-promo-block view-id-newsletter_promo_block view-display-id-block_1 js-view-dom-id-b181ea625855b8682d47209c1eba2ea7c9ead1a9d7ebe06812ec6398d8f54481"> <div class="view-content"> <div class="views-row"> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><div class="newsletter-bottom"> <div class="col-md-9 col-sm-12 signup-form"> <!--<h3>Linux Journal Week in Review</h3> <p>Sign up to get all the good stuff delivered to your inbox every week.</p> <form id="subForm" class="js-cm-form" action="https://www.createsend.com/t/subscribeerror?description=" method="post" data-id="A61C50BEC994754B1D79C5819EC1255CDBC34DDF3E170B13E2BAC2D68C42BF424F853383C84F5BAE38EAB4CFA5C73907CAC074FF8192503AF80F3699F7FE5CE1"> <div class="flexform">--> <!--<label for="fieldEmail">Email</label> <br />--> <!--<input id="fieldEmail" name="cm-gjjtdh-gjjtdh" type="email" class="js-cm-email-input" placeholder="Enter your email. Get the newsletter." required /> <button class="js-cm-submit-button" type="submit">Sign Up</button> </div> <div> <input id="cm-privacy-consent" name="cm-privacy-consent" required type="checkbox" /> <label for="cm-privacy-consent">I give my consent to be emailed</label> <input id="cm-privacy-consent-hidden" name="cm-privacy-consent-hidden" type="hidden" value="true" /> </div> </form> <script type="text/javascript" src="https://js.createsend1.com/javascript/copypastesubscribeformlogic.js"></script> </div>--> <!--<div class="col-md-3 col-sm-12 subs-callout"> <img src="/sites/default/files/styles/large/public/2019-01/LJ294-Jan2019-Cover_0.jpg" width="100px" /> <h3>The Value of Open Source Journalism</h3> <p> Subscribe and support our coverage for technology's biggest thinkers – with up to 52% savings. </p> <strong><a href="https://www.linuxjournal.com/subscribe">Subscribe <i class="fa fa-angle-double-right" aria-hidden="true"></i></a> </strong> </div>--> </div> </div> </div> </div> </div> </div> </section> </div> <div class="footer-blocks col-sm-12"> <div class="col-md-6 col-sm-12 footer-left"> <div class="region region-footer-left"> <section id="block-connectwithusfooter" class="block block-block-content block-block-content5e722bd4-5e08-454b-8507-956089bfa661 clearfix"> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><div class="footer-heading">Connect With Us <span class="social-media sm-a-no-underline"><a href="https://youtube.com/linuxjournalonline" alt="Linux Journal on YouTube" aria-label="YouTube"><i class="fa fa-youtube fa-2x"></i></a><a href="https://www.facebook.com/linuxjournal/" alt="Linux Journal on Facebook" aria-label="Facebook"><i class="fa fa-facebook-f fa-2x"></i><a href="https://twitter.com/linuxjournal" alt="Linux Journal on Twitter" aria-label="Twitter"><i class="fa fa-twitter fa-2x"></i></a></span></div> <p>Linux Journal, representing 25+ years of publication, is the original magazine of the global Open Source community.</p></div> </section> <section id="block-linuxjournal-block-9" class="block block-block-content block-block-content8669793b-e217-4426-a79e-eb3c21ede127 clearfix"> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><div id="copyright">© 2025 Slashdot Media, LLC. All rights reserved.</div> </div> </section> <section id="block-privacyterms" class="block block-block-content block-block-contenta203b8bd-80ef-4982-bf6e-784dd7b44120 clearfix"> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><ul class="menu menu--footer-submenu nav" id="terms-nav"> <li><a href="https://slashdotmedia.com/privacy-statement/" rel="nofollow" target="_blank">PRIVACY POLICY</a></li> <li><a href="https://slashdotmedia.com/terms-of-use/" rel="nofollow" target="_blank">TERMS OF SERVICE</a></li> <li><a href="/sponsors">ADVERTISE</a></li> </ul></div> </section> </div> </div> <div class="col-md-4 col-sm-8 footer-middle"> <div class="region region-footer-middle"> <nav role="navigation" aria-labelledby="block-footermenucolumn2-menu" id="block-footermenucolumn2"> <h2 class="visually-hidden" id="block-footermenucolumn2-menu">Footer Menu Column 2</h2> <ul class="menu menu--footer-menu-column-2 nav"> <li class="first"> <a href="/content/masthead" data-drupal-link-system-path="node/1007727">Masthead</a> </li> <li> <a href="/author" data-drupal-link-system-path="node/1009249">Authors</a> </li> <li class="last"> <a href="/form/contact" data-drupal-link-system-path="webform/contact">Contact Us</a> </li> </ul> </nav> <nav role="navigation" aria-labelledby="block-footermenucolumn3-menu" id="block-footermenucolumn3"> <h2 class="visually-hidden" id="block-footermenucolumn3-menu">Footer Menu Column 3</h2> <ul class="menu menu--footer-menu-column-3 nav"> <li class="first"> <a href="/rss_feeds" data-drupal-link-system-path="node/1000457">RSS Feeds</a> </li> <li class="last"> <a href="/aboutus" data-drupal-link-system-path="node/1000267">About Us</a> </li> </ul> </nav> </div> </div> </div> </footer> </div> </div> <script type="application/json" data-drupal-selector="drupal-settings-json">{"path":{"baseUrl":"\/","scriptPath":null,"pathPrefix":"","currentPath":"taxonomy\/term\/662","currentPathIsAdmin":false,"isFront":false,"currentLanguage":"en"},"pluralDelimiter":"\u0003","suppressDeprecationErrors":true,"bootstrap":{"forms_has_error_value_toggle":1,"popover_enabled":1,"popover_animation":1,"popover_auto_close":1,"popover_container":"body","popover_content":"","popover_delay":"0","popover_html":0,"popover_placement":"right","popover_selector":"","popover_title":"","popover_trigger":"click"},"linuxjournal":{"disqus":{"origin":"https:\/\/www.linuxjournal.com","prettyUrl":"\/tag\/kernel","fullUrl":"https:\/\/www.linuxjournal.com\/tag\/kernel","embedUrl":"https:\/\/linuxjournal.disqus.com\/embed.js","shortname":"linuxjournal"}},"ajaxTrustedUrl":{"\/search\/node":true},"user":{"uid":0,"permissionsHash":"a7b3a803411eb9cbd5d7d374ffb326721ee8274ab5a665df8f38311e3aad858c"}}</script> <script src="/core/assets/vendor/jquery/jquery.min.js?v=3.6.3"></script> <script src="/core/assets/vendor/underscore/underscore-min.js?v=1.13.6"></script> <script src="/core/misc/polyfills/element.matches.js?v=9.5.9"></script> <script src="/core/misc/polyfills/object.assign.js?v=9.5.9"></script> <script src="/core/assets/vendor/once/once.min.js?v=1.0.1"></script> <script src="/core/assets/vendor/jquery-once/jquery.once.min.js?v=9.5.9"></script> <script src="/core/misc/drupalSettingsLoader.js?v=9.5.9"></script> <script src="/core/misc/drupal.js?v=9.5.9"></script> <script src="/core/misc/drupal.init.js?v=9.5.9"></script> <script src="/core/assets/vendor/picturefill/picturefill.min.js?v=3.0.3"></script> <script src="/themes/contrib/bootstrap/js/drupal.bootstrap.js?snzigw"></script> <script src="/themes/contrib/bootstrap/js/attributes.js?snzigw"></script> <script src="/themes/contrib/bootstrap/js/theme.js?snzigw"></script> <script src="/themes/linuxjournal/bootstrap/assets/javascripts/bootstrap/affix.js?snzigw"></script> <script src="/themes/linuxjournal/bootstrap/assets/javascripts/bootstrap/alert.js?snzigw"></script> <script src="/themes/linuxjournal/bootstrap/assets/javascripts/bootstrap/button.js?snzigw"></script> <script src="/themes/linuxjournal/bootstrap/assets/javascripts/bootstrap/carousel.js?snzigw"></script> <script src="/themes/linuxjournal/bootstrap/assets/javascripts/bootstrap/collapse.js?snzigw"></script> <script src="/themes/linuxjournal/bootstrap/assets/javascripts/bootstrap/dropdown.js?snzigw"></script> <script src="/themes/linuxjournal/bootstrap/assets/javascripts/bootstrap/modal.js?snzigw"></script> <script src="/themes/linuxjournal/bootstrap/assets/javascripts/bootstrap/tooltip.js?snzigw"></script> <script src="/themes/linuxjournal/bootstrap/assets/javascripts/bootstrap/popover.js?snzigw"></script> <script src="/themes/linuxjournal/bootstrap/assets/javascripts/bootstrap/scrollspy.js?snzigw"></script> <script src="/themes/linuxjournal/bootstrap/assets/javascripts/bootstrap/tab.js?snzigw"></script> <script src="/themes/linuxjournal/bootstrap/assets/javascripts/bootstrap/transition.js?snzigw"></script> <script src="/themes/linuxjournal/js/lj-consentmanager.js?snzigw"></script> <script src="/modules/contrib/webform/js/webform.behaviors.js?v=9.5.9"></script> <script src="/core/misc/jquery.once.bc.js?v=9.5.9"></script> <script src="/core/misc/states.js?v=9.5.9"></script> <script src="/themes/contrib/bootstrap/js/misc/states.js?snzigw"></script> <script src="/modules/contrib/webform/js/webform.states.js?v=9.5.9"></script> <script src="/modules/contrib/webform/modules/webform_bootstrap/js/webform_bootstrap.states.js?v=9.5.9"></script> <script src="/themes/contrib/bootstrap/js/popover.js?snzigw"></script> <!-- START EMBED --> <noscript><img src="https://api.b2c.com/api/noscript-448i7exgpyqpr9c144q.gif"></noscript> <!-- END EMBED --> <!-- Matomo --> <script type="text/javascript"> var _paq = _paq || []; function initPiwik() { _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="https://analytics.linuxjournal.com/"; _paq.push(['setTrackerUrl', u+'piwik.php']); _paq.push(['setSiteId', '50']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s); })(); } </script> <noscript><p><img src="https://analytics.linuxjournal.com/piwik.php?idsite=50&rec=1" style="border:0;" alt="" /></p></noscript> <!-- End Matomo Code --> <div class="modal-custom overlay-custom" id="ccpa-modal" style="margin-left: 0; display: none; max-width: 100%; width: 100%"> <div id="modal-content" class="modal-content"> <div class="modal-header" id="ccpa-modal-content-destination"></div> <span class="close" id="modal-close">×</span> </div> </div> </body> </html>