{"id":4714,"date":"2021-07-24T00:46:40","date_gmt":"2021-07-23T15:46:40","guid":{"rendered":"https:\/\/now0930.pe.kr\/wordpress\/?p=4714"},"modified":"2021-07-24T00:54:36","modified_gmt":"2021-07-23T15:54:36","slug":"spinlock-mutex-%ec%8b%a4%ec%8a%b5","status":"publish","type":"post","link":"https:\/\/now0930.pe.kr\/wordpress\/spinlock-mutex-%ec%8b%a4%ec%8a%b5\/","title":{"rendered":"spinlock, mutex \uc2e4\uc2b5"},"content":{"rendered":"\n<p>\ubaa8\ub4c8\uc744 \ub85c\ub529\ud558\uba74 kernel thread\ubd80\ud130 \ub9cc\ub4e4\uc5b4\uc57c \ud55c\ub2e4. \uac19\uc740 \ucc45 \ucd08\ubc18\uc5d0 \ub098\uc654\ub294\ub370, \ub2e4\uc2dc \ubcf4\ub2c8 \uae30\uc5b5\ud560 \uc218 \uc5c6\ub2e4. \uc2a4\ub808\ub4dc\ub97c \ub9cc\ub4e0 \ud6c4 \ud568\uc218\uc640 \ub370\uc774\ud130\ub97c \ub118\uaca8\uc57c \ud558\ub294\ub370, \ub370\uc774\ud130\uac00 void \ud3ec\uc778\ud130\ub2e4. struct\ub85c \uce90\uc2a4\ud305 \ud558\uace0 \uc2f6\uc740\ub370, \uc5d0\ub7ec\uac00 \ub0ac\ub2e4. kernel \ucf54\ub4dc\ub97c \ubcf4\uace0 \uad04\ud638\ub97c \uba87 \ubc88 \ubd99\uc600\ub2e4. \uc544! \u3145\u3142. \uad6c\uae00 \ucc3e\uc544\ubcf4\uae30\ubcf4\ub2e4 \uc2dc(\uac04)\uc131\ube44\uac00 \ub354 \uc88b\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">pi@raspberrypi:~\/linux $ grep -wn \"kthread_create\" -r .\/drivers\n.\/drivers\/usb\/usbip\/usbip_common.h:285:\t\t= kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \\\n.\/drivers\/usb\/atm\/ueagle-atm.c:2228:\tsc->kthread = kthread_create(uea_kthread, sc, \"ueagle-atm\");\n.\/drivers\/usb\/atm\/usbatm.c:977:\tt = kthread_create(usbatm_do_heavy_init, instance, \"%s\",\n.\/drivers\/usb\/gadget\/file_storage.c:3527:\tfsg->thread_task = kthread_create(fsg_main_thread, fsg,\n.\/drivers\/usb\/gadget\/function\/u_serial.c:1059:\tinfo->console_thread = kthread_create(gs_console_thread,\n.\/drivers\/usb\/gadget\/function\/f_mass_storage.c:2924:\t\t\tkthread_create(fsg_main_thread, common, \"file-storage\");\n.\/drivers\/usb\/host\/dwc_common_port\/dwc_common_fbsd.c:981:\tretval = kthread_create((void (*)(void *))func, data, &amp;thread->proc,\n.\/drivers\/iio\/adc\/ina2xx-adc.c:840:\ttask = kthread_create(ina2xx_capture_thread, (void *)indio_dev,\n\npi@raspberrypi:~\/linux $ vi .\/drivers\/usb\/host\/dwc_common_port\/dwc_common_fbsd.c<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">dwc_thread_t *DWC_THREAD_RUN(dwc_thread_function_t func, char *name, void *data)\n{\n        int retval;\n        dwc_thread_t *thread = DWC_ALLOC(sizeof(*thread));\n\n        if (!thread) {\n                return NULL;\n        }\n\n        thread->abort = 0; \n        retval = kthread_create((void (*)(void *))func, data, &amp;thread->proc,\n                                RFPROC | RFNOWAIT, 0, \"%s\", name);\n        if (retval) {\n                DWC_FREE(thread);\n                return NULL;\n        }\n\n        return thread;\n}<\/pre>\n\n\n\n<p>spinlock\uc744 \ub9cc\ub4e0 \ud6c4 \ucd08\uae30\ud654 \ud558\uc9c0 \uc54a\uc73c\uba74, \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub2e4. kernel\uc5d0 \uba54\ubaa8\ub9ac\ub97c \ud560\ub2f9 \ubc1b\uc73c\uba74 \ucd08\uae30\ud654\ub294 \uaf2d \ud574\uc918\uc57c \ud558\ub294 \ub290\ub08c\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;linux\/module.h>\n#include &lt;linux\/kernel.h>\n#include &lt;linux\/init.h>\n#include &lt;linux\/irq.h>\n#include &lt;linux\/interrupt.h>\n#include &lt;linux\/gpio.h>     \/\/GPIO\n\n\n#include &lt;linux\/cdev.h>\n#include &lt;linux\/device.h>\n#include &lt;linux\/uaccess.h>\n#include &lt;linux\/fcntl.h>\n\n\n#define GPIO_10_OUT (10)\n#define DEVICE_DATA_MAX 256\n\n#include &lt;linux\/kthread.h>\n#include &lt;linux\/delay.h>\n#include &lt;linux\/spinlock.h>\n\n\nunsigned int GPIO_irqNumber;\n\n\/*\uc0ac\uc6a9\uc790 \ub370\uc774\ud130 \ubd80\ubd84*\/\nstruct my_device_data{\n\tstruct cdev cdev;\n\tint index;\n\tchar my_string[DEVICE_DATA_MAX];\n\tstruct timer_list simple_timer;\n\tspinlock_t lock;\n\tstruct task_struct *kthread1;\n\tstruct task_struct *kthread2;\n} ;\n\nint run_this_thread1(void* data);\nint run_this_thread2(void* data);\n\nint run_this_thread1(void* data)\n{\n\t\/\/while(1)\ub85c \ud558\uba74 kthread_stop\uc744 \ud560 \uc218 \uc5c6\uc74c.\n\t\/\/\ub8e8\ud504\uac00 \uc5c6\uc73c\uba74 kthread_stop\uc744 \ubd88\ub800\uc744 \uacbd\uc6b0, segment error.\n\t\/\/thread\uac00 \uc5c6\ub2e4\uba74, \uc885\ub8cc\ub97c \ud560 \uc218 \uc5c6\uc5b4 \ubcf4\uc784..\n\twhile(!kthread_should_stop())\n\t{\n\t\/\/data is my_device_data\n\tstruct my_device_data *ptr_main_data;\n\t\/\/ptr_main_data = data;\n\tptr_main_data = (struct my_device_data(*))data;\n\n\t\/\/\uacf5\ud1b5\uc774 \uad6c\uc870\uccb4 \uc811\uadfc.\n\tspin_lock(&amp;ptr_main_data->lock);\n\tptr_main_data->index++;\n\t\/\/pr_info(\"spin lock is %0x\\n\",ptr_main_data->lock);\n\tpr_info(\"==============\\n\");\n\tpr_info(\"[+]index is %d\\n\", ptr_main_data->index);\n\tpr_info(\"==============\\n\");\n\tspin_unlock(&amp;ptr_main_data->lock);\n\t\/\/pr_info(\"spin lock is %0x\\n\",ptr_main_data->lock);\n\n\tmsleep(500);\n\t}\n\treturn 0;\n\n}\n\nint run_this_thread2(void* data)\n{\n\twhile(!kthread_should_stop())\n\t{\n\t\/\/data is my_device_data\n\tstruct my_device_data *ptr_main_data;\n\tptr_main_data = (struct my_device_data(*))data;\n\t\/\/\n\t\/\/\uacf5\ud1b5\uc774 \uad6c\uc870\uccb4 \uc811\uadfc.\n\tspin_lock(&amp;ptr_main_data->lock);\n\tptr_main_data->index++;\n\tpr_info(\"==============\\n\");\n\tpr_info(\"[+]index is %d\\n\", ptr_main_data->index);\n\tpr_info(\"==============\\n\");\n\tspin_unlock(&amp;ptr_main_data->lock);\n\tmsleep(500);\n\t}\n\n\treturn 0;\n\n}\n\nstatic irqreturn_t gpio_irq_handler(int irq, void *dev_id)\n{\n\t\/*Scheduling work queue*\/\n\treturn IRQ_HANDLED;\n\n}\n\n\n\/\/device driver \uc791\uc131 \ubd80\ubd84.\n\/*************\ub4dc\ub77c\uc774\ubc84 \ud568\uc218 ******************\/\nstatic int mydriver_open(struct inode *inode, struct file *file);\nstatic int mydriver_release(struct inode *inode, struct file *file);\nstatic ssize_t mydriver_read(struct file *flip,\n\t\tchar *buf, size_t len, loff_t *off);\nstatic ssize_t mydriver_write(struct file *flip,\n\t\tconst char *buf, size_t len, loff_t *off);\n\/********************************************\/\n\n\n\n\/\/file operation structure\n\nstatic struct file_operations fops = \n{\n\t.owner = THIS_MODULE,\n\t.read = mydriver_read,\n\t.write = mydriver_write,\n\t.open = mydriver_open,\n\t.release = mydriver_release,\n};\n\nstatic int mydriver_open(struct inode *inode, struct file *file)\n{\n\tpr_info(\"Deviced file was opend.\\n\");\n\treturn 0;\n\n}\n\nstatic int mydriver_release(struct inode *inode, struct file *file)\n{\n\tpr_info(\"Deviced file was closed.\\n\");\n\treturn 0;\n}\n\n\nstatic int mydriver_read(struct file *file,\n\t\tchar *buf, size_t len, loff_t *off)\n{\n\tpr_info(\"read\\n\");\n\treturn 0;\n}\n\n\nstatic int mydriver_write(struct file *flip,\n\t\tconst char *buf, size_t len, loff_t *off)\n{\n\treturn 0;\n\n}\n\ndev_t dev = 0;\nstatic struct cdev my_cdev;\nstatic struct class *dev_class;\nstruct my_device_data *main_data;\nstatic int __init init_hw(void)\n{\n\t\/\/\ub514\ubc14\uc774\uc2a4 \ub4f1\ub85d\n\tif(( alloc_chrdev_region(&amp;dev, 0, 1, \"test_device\") &lt; 0))\n\t{\n\t\tpr_err(\"[!]character device was not allocated\\n\");\n\t\tgoto r_unreg;\n\n\t}\n\tpr_info(\"[=]%d-%d, was allocated\\n\", MAJOR(dev), MINOR(dev));\n\n\n\t\/\/\ucd08\uae30\ud654\n\tcdev_init(&amp;my_cdev, &amp;fops);\n\tpr_info(\"[=]driver was initialized\\n\");\n\n\n\t\/\/\uc2dc\uc2a4\ud15c\uc5d0 \ucd94\uac00\n\tif((cdev_add(&amp;my_cdev, dev, 1)) &lt; 0)\n\t{\n\t\tpr_err(\"[!]cannot add device to kernel\\n\");\n\t\tgoto r_del;\n\n\t}\n\n\n\t\/\/class \ub9cc\ub4e6.\n\tif((dev_class=class_create(THIS_MODULE, \"my_class\")) == NULL)\n\t{\n\t\tpr_err(\"[!]cannot add class\\n\");\n\t\tgoto r_class;\n\t}\n\n\n\tif((device_create(dev_class, NULL, dev, NULL, \"my_device\")) == NULL)\n\t{\n\n\t\tpr_err(\"[!]cannot create device\\n\");\n\t\tgoto r_device;\n\t}\n\n\n\t\/\/gpio 10\ubc88\uc744 \uc0ac\uc6a9.\n\t\/\/export\ud558\uc5ec \uac04\ub2e8\ud788 \uc0ac\uc6a9.\n\t\/\/\uc785\ub825\uc740 \uac12\uc744 \uc368 \ub123\uc744 \uc218 \uc5c6\uc74c. \ucd9c\ub825\uc73c\ub85c \uc124\uc815.\n\tGPIO_irqNumber = gpio_to_irq(GPIO_10_OUT);\n\tpr_info(\"[=]irq %d was assinged\\n\",GPIO_irqNumber);\n\n\t\/\/interrupt \ub4f1\ub85d \ud544\uc694\n\tif (request_irq(GPIO_irqNumber,\n\t\t\t\t(void*)gpio_irq_handler,\n\t\t\t\tIRQF_TRIGGER_RISING,\n\t\t\t\t\"my_device\",\n\t\t\t\tNULL))\n\t{\n\t\tpr_err(\"[!]my_device: cannot register IRQ\\n\");\n\t\tgoto r_gpio;\n\t}\n\tpr_info(\"[=]module was installed\\n\");\n\n\n\t\/\/\uba54\ubaa8\ub9ac \uacf5\uac04 \ud560\ub2f9.\n\tmain_data = kmalloc(sizeof(struct my_device_data), GFP_KERNEL);\n\n\n\t\/\/spin lock init\n\tspin_lock_init(&amp;main_data->lock);\n\tmain_data->index=0;\n\tif(!main_data)\n\t{\n\t\tpr_err(\"[!]cannot alloc memory\\n\");\n\t\tgoto r_memory;\n\t}\n\tpr_info(\"[=]got memory\\n\");\n\n\t\/\/thread create.\n\tmain_data->kthread1 = kthread_create(run_this_thread1, main_data, \"my_thread1\");\n\tmain_data->kthread2 = kthread_create(run_this_thread2, main_data, \"my_thread2\");\n\n\tif(main_data->kthread1)\n\t{\n\t\twake_up_process(main_data->kthread1);\n\t\tpr_info(\"wake up thread1 at %p\\n\", main_data->kthread1);\n\t}\n\tif(main_data->kthread2)\n\t{\n\t\twake_up_process(main_data->kthread2);\n\t\tpr_info(\"wake up thread2 at %p\\n\", main_data->kthread2);\n\t}\n\n\treturn 0;\nr_gpio:\n\tgpio_free(GPIO_10_OUT);\nr_device:\n\tdevice_destroy(dev_class,dev);\n\nr_class:\n\tclass_destroy(dev_class);\nr_del:\n\tcdev_del(&amp;my_cdev);\n\nr_unreg:\n\tunregister_chrdev_region(dev,1);\nr_memory:\n\t;\n\n\treturn -1;\n}\n\nstatic void __exit exit_hw(void) {\n\tfree_irq(GPIO_irqNumber, NULL);\n\tgpio_free(GPIO_10_OUT);\n\t\/\/flush_work(struct work_struct *work);\n\tdevice_destroy(dev_class,dev);\n\t\/\/class_unregister(dev_class);\n\tclass_destroy(dev_class);\n\tcdev_del(&amp;my_cdev);\n\tunregister_chrdev_region(dev,1);\n\tif(main_data->kthread1)\n\t\tkthread_stop(main_data->kthread1);\n\tif(main_data->kthread2)\n\t\tkthread_stop(main_data->kthread2);\n\tpr_info(\"kthread was stopped\\n\");\n\tpr_info(\"wake up thread1 at %p\\n\", main_data->kthread1);\n\tpr_info(\"wake up thread2 at %p\\n\", main_data->kthread2);\n\n\n\tkfree(main_data);\n\tprintk(KERN_INFO \"module was removed\\n\");\n}\n\n\nmodule_init(init_hw);\nmodule_exit(exit_hw);\nMODULE_LICENSE(\"GPL\");\nMODULE_AUTHOR(\"noname\");\nMODULE_DESCRIPTION(\"Hello, world!\");\n<\/pre>\n\n\n\n<p>spin lock\uc744 \uc801\uc6a9\ud558\uc9c0 \uc54a\uc744 \uacbd\uc6b0, \uacb9\uccd0\uc4f4\ub2e4. \uc801\uc6a9\ud558\uba74 \uc21c\uc11c\ub300\ub85c \uc2e4\ud589\ub41c\ub2e4 \ubbff\ub294\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[ 1749.848372] ==============\n[ 1749.848376] [+]index is 108\n[ 1749.848380] ==============\n[ 1750.378381] ==============\n[ 1750.378392] [+]index is 109\n[ 1750.378399] ==============\n[ 1750.378414] ==============\n[ 1750.378421] [+]index is 110\n[ 1750.378428] ==============\n[ 1750.898416] ==============\n[ 1750.898431] [+]index is 111\n[ 1750.898439] ==============\n[ 1750.898461] ==============\n[ 1750.898470] [+]index is 112\n[ 1750.898478] ==============\n[ 1751.418404] ==============\n[ 1751.418417] [+]index is 113\n[ 1751.418426] ==============\n[ 1751.418446] ==============\n[ 1751.418455] [+]index is 114\n[ 1751.418463] ==============\n[ 1751.938485] ==============\n[ 1751.938501] [+]index is 115\n[ 1751.938512] ==============\n[ 1751.938537] ==============\n[ 1751.938547] [+]index is 116\n[ 1751.938556] ==============\n[ 1752.458509] ==============\n[ 1752.458529] [+]index is 117\n[ 1752.458538] ==============\n[ 1752.458560] ==============\n[ 1752.458570] [+]index is 118\n[ 1752.458578] ==============\n[ 1752.978388] ==============\n[ 1752.978394] [+]index is 119\n[ 1752.978398] ==============\n[ 1753.498497] kthread was stopped\n[ 1753.498515] wake up thread1 at 39208d2a\n[ 1753.498524] wake up thread2 at 5bdf5278\n[ 1753.498536] module was removed\n[ 1773.404079] [=]236-0, was allocated\n[ 1773.404089] [=]driver was initialized\n[ 1773.406890] [=]irq 54 was assinged\n[ 1773.406942] [=]module was installed\n[ 1773.406952] [=]got memory\n[ 1773.410837] wake up thread1 at 6acc0d97\n[ 1773.410859] wake up thread2 at 9613521a\n[ 1773.411132] ==============\n[ 1773.411143] [+]index is 1\n[ 1773.411151] ==============\n[ 1773.411794] ==============\n[ 1773.411805] [+]index is 2\n[ 1773.411812] ==============\n[ 1773.528622] ==============\n[ 1773.528626] ==============\n[ 1773.528636] [+]index is 4\n[ 1773.528637] [+]index is 4\n[ 1773.528640] ==============\n[ 1773.528641] ==============\n[ 1773.648584] ==============\n[ 1773.648585] ==============\n[ 1773.648589] [+]index is 6\n[ 1773.648590] [+]index is 6\n[ 1773.648593] ==============\n[ 1773.648594] ==============\n[ 1773.768583] ==============\n[ 1773.768584] ==============\n[ 1773.768588] [+]index is 8\n[ 1773.768589] [+]index is 8\n[ 1773.768591] ==============\n[ 1773.768594] ==============\n[ 1773.888583] ==============\n[ 1773.888587] [+]index is 9\n[ 1773.888589] ==============\n[ 1773.888591] ==============\n[ 1773.888595] [+]index is 10\n[ 1773.888598] ==============\n[ 1774.008583] ==============\n[ 1774.008585] ==============\n[ 1774.008588] [+]index is 12\n[ 1774.008591] [+]index is 12\n[ 1774.008594] ==============\n[ 1774.008596] ==============\n[ 1774.128592] ==============\n[ 1774.128593] ==============\n[ 1774.128597] [+]index is 14\n[ 1774.128599] [+]index is 14\n[ 1774.128601] ==============\n[ 1774.128604] ==============\n[ 1774.248635] ==============\n[ 1774.248638] ==============\n[ 1774.248648] [+]index is 16\n[ 1774.248652] [+]index is 16\n[ 1774.248657] ==============\n[ 1774.248663] ==============\n[ 1774.368631] ==============\n[ 1774.368642] [+]index is 17\n[ 1774.368649] ==============\n[ 1774.378613] ==============\n[ 1774.378622] [+]index is 18<\/pre>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-embetronicx wp-block-embed-embetronicx\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/embetronicx.com\/tutorials\/linux\/device-drivers\/linux-device-drivers-tutorial-kernel-thread\/\n<\/div><\/figure>\n\n\n\n<p><a href=\"https:\/\/embetronicx.com\/tutorials\/linux\/device-drivers\/spinlock-in-linux-kernel-1\/\">https:\/\/embetronicx.com\/tutorials\/linux\/device-drivers\/spinlock-in-linux-kernel-1\/<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/embetronicx.com\/tutorials\/linux\/device-drivers\/linux-device-driver-tutorial-mutex-in-linux-kernel\/\">https:\/\/embetronicx.com\/tutorials\/linux\/device-drivers\/linux-device-driver-tutorial-mutex-in-linux-kernel\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ubaa8\ub4c8\uc744 \ub85c\ub529\ud558\uba74 kernel thread\ubd80\ud130 \ub9cc\ub4e4\uc5b4\uc57c \ud55c\ub2e4. \uac19\uc740 \ucc45 \ucd08\ubc18\uc5d0 \ub098\uc654\ub294\ub370, \ub2e4\uc2dc \ubcf4\ub2c8 \uae30\uc5b5\ud560 \uc218 \uc5c6\ub2e4. \uc2a4\ub808\ub4dc\ub97c \ub9cc\ub4e0 \ud6c4 \ud568\uc218\uc640 \ub370\uc774\ud130\ub97c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[12],"tags":[53,785,798,936,912],"class_list":["post-4714","post","type-post","status-publish","format-standard","hentry","category-12","tag-linux","tag-mutex","tag-raspberry","tag-spinlock","tag-912"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts\/4714","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/comments?post=4714"}],"version-history":[{"count":8,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts\/4714\/revisions"}],"predecessor-version":[{"id":4723,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/posts\/4714\/revisions\/4723"}],"wp:attachment":[{"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/media?parent=4714"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/categories?post=4714"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/now0930.pe.kr\/wordpress\/wp-json\/wp\/v2\/tags?post=4714"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}